diff --git a/res/layouts/inventory.xml b/res/layouts/inventory.xml index a4e9189d..00394085 100644 --- a/res/layouts/inventory.xml +++ b/res/layouts/inventory.xml @@ -1,4 +1,4 @@ - + diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 2a29f355..b42450f8 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -420,6 +420,8 @@ void Hud::openInventory(glm::ivec3 block, UiDocument* doc, std::shared_ptrinventories->createVirtual(blockUI->getSlotsCount()); } blockUI->bind(blockinv, frontend, interaction.get()); diff --git a/src/logic/scripting/api/libhud.cpp b/src/logic/scripting/api/libhud.cpp deleted file mode 100644 index 27513de7..00000000 --- a/src/logic/scripting/api/libhud.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "libhud.h" - -#include - -#include "../scripting.h" -#include "../../../frontend/hud.h" - -namespace scripting { - extern Hud* hud; -} - -int l_hud_open_inventory(lua_State* L) { - scripting::hud->openInventory(); - return 0; -} - -int l_hud_close_inventory(lua_State* L) { - scripting::hud->closeInventory(); - return 0; -} \ No newline at end of file diff --git a/src/logic/scripting/LuaState.cpp b/src/logic/scripting/lua/LuaState.cpp similarity index 98% rename from src/logic/scripting/LuaState.cpp rename to src/logic/scripting/lua/LuaState.cpp index e6d0ee38..d3bd3997 100644 --- a/src/logic/scripting/LuaState.cpp +++ b/src/logic/scripting/lua/LuaState.cpp @@ -2,9 +2,9 @@ #include #include "lua_util.h" -#include "api/api_lua.h" -#include "api/libgui.h" -#include "../../util/stringutil.h" +#include "api_lua.h" +#include "libgui.h" +#include "../../../util/stringutil.h" lua::luaerror::luaerror(const std::string& message) : std::runtime_error(message) { } diff --git a/src/logic/scripting/LuaState.h b/src/logic/scripting/lua/LuaState.h similarity index 100% rename from src/logic/scripting/LuaState.h rename to src/logic/scripting/lua/LuaState.h diff --git a/src/logic/scripting/api/api_lua.cpp b/src/logic/scripting/lua/api_lua.cpp similarity index 99% rename from src/logic/scripting/api/api_lua.cpp rename to src/logic/scripting/lua/api_lua.cpp index 9c909bd0..4c374d15 100644 --- a/src/logic/scripting/api/api_lua.cpp +++ b/src/logic/scripting/lua/api_lua.cpp @@ -1,7 +1,7 @@ #include "api_lua.h" #include "../scripting.h" -#include "../lua_util.h" +#include "lua_util.h" #include #include diff --git a/src/logic/scripting/api/api_lua.h b/src/logic/scripting/lua/api_lua.h similarity index 100% rename from src/logic/scripting/api/api_lua.h rename to src/logic/scripting/lua/api_lua.h diff --git a/src/logic/scripting/api/libgui.cpp b/src/logic/scripting/lua/libgui.cpp similarity index 95% rename from src/logic/scripting/api/libgui.cpp rename to src/logic/scripting/lua/libgui.cpp index 515c49d9..083150f7 100644 --- a/src/logic/scripting/api/libgui.cpp +++ b/src/logic/scripting/lua/libgui.cpp @@ -2,7 +2,7 @@ #include #include "../scripting.h" -#include "../lua_util.h" +#include "lua_util.h" #include "../../../engine.h" #include "../../../assets/Assets.h" diff --git a/src/logic/scripting/api/libgui.h b/src/logic/scripting/lua/libgui.h similarity index 100% rename from src/logic/scripting/api/libgui.h rename to src/logic/scripting/lua/libgui.h diff --git a/src/logic/scripting/lua/libhud.cpp b/src/logic/scripting/lua/libhud.cpp new file mode 100644 index 00000000..fc3cae26 --- /dev/null +++ b/src/logic/scripting/lua/libhud.cpp @@ -0,0 +1,65 @@ +#include "libhud.h" +#include "LuaState.h" + +#include +#include + +#include "../scripting.h" +#include "../../../assets/Assets.h" +#include "../../../frontend/hud.h" +#include "../../../world/Level.h" +#include "../../../voxels/Chunks.h" +#include "../../../voxels/voxel.h" +#include "../../../voxels/Block.h" +#include "../../../content/Content.h" +#include "../../../logic/BlocksController.h" +#include "../../../items/Inventories.h" +#include "../../../engine.h" + +namespace scripting { + extern Hud* hud; +} + +int l_hud_open_inventory(lua_State* L) { + scripting::hud->openInventory(); + return 0; +} + +int l_hud_close_inventory(lua_State* L) { + scripting::hud->closeInventory(); + return 0; +} + +int l_hud_open_block(lua_State* L) { + lua::luaint x = lua_tointeger(L, 1); + lua::luaint y = lua_tointeger(L, 2); + lua::luaint z = lua_tointeger(L, 3); + + voxel* vox = scripting::level->chunks->get(x, y, z); + if (vox == nullptr) { + luaL_error(L, "block does not exists at %d %d %d", x, y, z); + } + auto def = scripting::content->getIndices()->getBlockDef(vox->id); + auto assets = scripting::engine->getAssets(); + auto layout = assets->getLayout(def->uiLayout); + if (layout == nullptr) { + luaL_error(L, "block '%s' has no ui layout", def->name.c_str()); + } + + auto id = scripting::blocks->createBlockInventory(x, y, z); + if (id == 0) { + luaL_error(L, + "block '%s' at %d %d %d has no inventory", + def->name.c_str(), + x, y, z + ); + } + + scripting::hud->openInventory( + glm::ivec3(x, y, z), layout, scripting::level->inventories->get(id) + ); + + lua_pushinteger(L, id); + lua_pushstring(L, def->uiLayout.c_str()); + return 2; +} diff --git a/src/logic/scripting/api/libhud.h b/src/logic/scripting/lua/libhud.h similarity index 79% rename from src/logic/scripting/api/libhud.h rename to src/logic/scripting/lua/libhud.h index 2ceddfc5..17c24a2f 100644 --- a/src/logic/scripting/api/libhud.h +++ b/src/logic/scripting/lua/libhud.h @@ -5,10 +5,12 @@ extern int l_hud_open_inventory(lua_State* L); extern int l_hud_close_inventory(lua_State* L); +extern int l_hud_open_block(lua_State* L); static const luaL_Reg hudlib [] = { {"open_inventory", l_hud_open_inventory}, {"close_inventory", l_hud_close_inventory}, + {"open_block", l_hud_open_block}, {NULL, NULL} }; diff --git a/src/logic/scripting/lua_util.h b/src/logic/scripting/lua/lua_util.h similarity index 100% rename from src/logic/scripting/lua_util.h rename to src/logic/scripting/lua/lua_util.h diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 05a48b2b..7208110f 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -14,7 +14,7 @@ #include "../../logic/BlocksController.h" #include "../../frontend/UiDocument.h" #include "../../engine.h" -#include "LuaState.h" +#include "lua/LuaState.h" #include "../../util/stringutil.h" #include "../../util/timeutil.h" diff --git a/src/logic/scripting/scripting_frontend.cpp b/src/logic/scripting/scripting_frontend.cpp index 66da8136..269b8b2c 100644 --- a/src/logic/scripting/scripting_frontend.cpp +++ b/src/logic/scripting/scripting_frontend.cpp @@ -1,8 +1,8 @@ #include "scripting_frontend.h" #include "scripting.h" -#include "api/libhud.h" -#include "LuaState.h" +#include "lua/libhud.h" +#include "lua/LuaState.h" namespace scripting { extern lua::LuaState* state; diff --git a/src/logic/scripting/scripting_functional.cpp b/src/logic/scripting/scripting_functional.cpp index 82bc0731..5fc497b8 100644 --- a/src/logic/scripting/scripting_functional.cpp +++ b/src/logic/scripting/scripting_functional.cpp @@ -2,7 +2,7 @@ #include -#include "LuaState.h" +#include "lua/LuaState.h" #include "../../util/stringutil.h" namespace scripting { diff --git a/src/voxels/Block.h b/src/voxels/Block.h index 4a56a20a..e51fc3b4 100644 --- a/src/voxels/Block.h +++ b/src/voxels/Block.h @@ -97,6 +97,7 @@ public: BlockRotProfile rotations; std::string pickingItem = name+BLOCK_ITEM_SUFFIX; std::string scriptName = name.substr(name.find(':')+1); + std::string uiLayout = name; uint inventorySize = 0; struct { diff --git a/src/voxels/ChunksStorage.cpp b/src/voxels/ChunksStorage.cpp index fe45ae20..ad251555 100644 --- a/src/voxels/ChunksStorage.cpp +++ b/src/voxels/ChunksStorage.cpp @@ -12,6 +12,7 @@ #include "../world/World.h" #include "../maths/voxmaths.h" #include "../lighting/Lightmap.h" +#include "../items/Inventories.h" #include "../typedefs.h" ChunksStorage::ChunksStorage(Level* level) : level(level) { @@ -60,6 +61,9 @@ std::shared_ptr ChunksStorage::create(int x, int z) { auto invs = wfile->fetchInventories(chunk->x, chunk->z); chunk->setBlockInventories(std::move(invs)); chunk->setLoaded(true); + for(auto& entry : chunk->inventories) { + level->inventories->store(entry.second); + } verifyLoadedChunk(level->content->getIndices(), chunk.get()); }