From 3b3bf8e878d5a219f802f59dfdb0dfadb989b45d Mon Sep 17 00:00:00 2001 From: Neveix <87336789+Neveix@users.noreply.github.com> Date: Fri, 14 Aug 2026 23:25:42 +0500 Subject: [PATCH 1/4] Inventory enhancements #897: 2, 5, 9, 11, 12 (#931) * implement a bit * change shift to ctrl * add enhancement #2 * add ctrl-interaction with content access * fix libinventory.move bug (none checking) * fix p.5 * move shareinv logic into inventory_utils * add inventory utils * small refactor * fix iframe.src = "" --------- Co-authored-by: MihailRis --- res/layouts/inventory.xml | 4 +- res/layouts/inventory.xml.lua | 13 +---- res/modules/inventory_utils.lua | 21 +++++++ src/frontend/hud.cpp | 14 ++++- src/graphics/ui/elements/InventoryView.cpp | 55 ++++++++++++------- src/graphics/ui/elements/InventoryView.hpp | 2 + src/items/ItemStack.cpp | 8 +++ src/items/ItemStack.hpp | 1 + src/logic/scripting/lua/libs/libinventory.cpp | 3 +- 9 files changed, 84 insertions(+), 37 deletions(-) create mode 100644 res/modules/inventory_utils.lua diff --git a/res/layouts/inventory.xml b/res/layouts/inventory.xml index 4291ab4d3..7a33b054f 100644 --- a/res/layouts/inventory.xml +++ b/res/layouts/inventory.xml @@ -1,4 +1,4 @@ - - + + diff --git a/res/layouts/inventory.xml.lua b/res/layouts/inventory.xml.lua index 9f836223d..5c79db6ff 100644 --- a/res/layouts/inventory.xml.lua +++ b/res/layouts/inventory.xml.lua @@ -1,12 +1 @@ -function inventory_share_func(invid, slotid) - local blockinv = hud.get_block_inventory() - if blockinv ~= 0 then - inventory.move(invid, slotid, blockinv) - elseif rules.get("allow-content-access") then - inventory.set(invid, slotid, 0, 0) - elseif slotid < 10 then - inventory.move_range(invid, slotid, invid, 10) - else - inventory.move_range(invid, slotid, invid, 0, 9) - end -end +share_func = require("core:inventory_utils").share_default_func diff --git a/res/modules/inventory_utils.lua b/res/modules/inventory_utils.lua new file mode 100644 index 000000000..17089cdab --- /dev/null +++ b/res/modules/inventory_utils.lua @@ -0,0 +1,21 @@ +local M = {} + +function M.share_default_func(invid, slotid) + local blockinv = hud.get_block_inventory() + local playerinv = player.get_inventory(hud.get_player()) + if blockinv ~= 0 then + if invid == blockinv then + inventory.move(blockinv, slotid, playerinv) + else + inventory.move(invid, slotid, blockinv) + end + elseif rules.get("allow-content-access") then + inventory.set(invid, slotid, 0, 0) + elseif slotid < 10 then + inventory.move_range(invid, slotid, invid, 10) + else + inventory.move_range(invid, slotid, invid, 0, 9) + end +end + +return M diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 08a4b8455..6751b885c 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -106,6 +106,7 @@ std::shared_ptr HudElement::getNode() const { std::shared_ptr Hud::createContentAccess() { auto& content = frontend.getLevel().content; auto& indices = *content.getIndices(); + auto& input = this->input; auto inventory = player.getInventory(); size_t itemsCount = indices.items.count(); @@ -115,12 +116,19 @@ std::shared_ptr Hud::createContentAccess() { } SlotLayout slotLayout(-1, glm::vec2(), false, true, nullptr, - [inventory, &indices](uint, ItemStack& item) { + [inventory, &indices, &input](uint, ItemStack& item) { auto copy = ItemStack(item); + if (input.pressed(Keycode::LEFT_CONTROL)) { + copy.maximizeCount(indices); + } inventory->move(copy, indices); }, - [this, inventory](uint, ItemStack& item) { - inventory->getSlot(player.getChosenSlot()).set(item); + [this, inventory, &indices, &input](uint, ItemStack& item) { + auto copy = ItemStack(item); + if (input.pressed(Keycode::LEFT_CONTROL)) { + copy.maximizeCount(indices); + } + inventory->getSlot(player.getChosenSlot()).set(copy); }); InventoryBuilder builder(gui); diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 395c8d34e..614d4c913 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -366,28 +366,12 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { ); return; } - + auto indices = *content->getIndices(); if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { action = InteractionAction::PUT; - stack.move(grabbed, *content->getIndices()); + stack.move(grabbed, indices); } else { - if (layout.itemSource) { - if (grabbed.isEmpty()) { - action = InteractionAction::TAKE; - grabbed.set(stack); - } else { - action = InteractionAction::PUT; - grabbed.clear(); - } - } else if (grabbed.isEmpty()) { - if (layout.taking) { - action = InteractionAction::TAKE; - std::swap(grabbed, stack); - } - } else if (layout.taking && layout.placing) { - action = InteractionAction::PUT; - std::swap(grabbed, stack); - } + actIfCannotPut(stack, grabbed, action); } if (action != InteractionAction::UNDEFINED) { @@ -400,6 +384,39 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { } } +void SlotView::actIfCannotPut(ItemStack& stack, ItemStack& grabbed, InteractionAction& action) { + const auto& input = gui.getInput(); + auto indices = *content->getIndices(); + if (layout.itemSource) { + if (grabbed.isEmpty()) { + action = InteractionAction::TAKE; + grabbed.set(stack); + if (input.pressed(Keycode::LEFT_CONTROL)) { + grabbed.maximizeCount(*content->getIndices()); + } + } else { + if (grabbed.accepts(stack)) { + auto& def = indices.items.require(stack.getItemId()); + if (grabbed.getCount() < def.stackSize) { + action = InteractionAction::TAKE; + grabbed.setCount(grabbed.getCount() + 1); + } + } else { + action = InteractionAction::PUT; + grabbed.clear(); + } + } + } else if (grabbed.isEmpty()) { + if (layout.taking) { + action = InteractionAction::TAKE; + std::swap(grabbed, stack); + } + } else if (layout.taking && layout.placing) { + action = InteractionAction::PUT; + std::swap(grabbed, stack); + } +} + void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { if (layout.rightClick) { layout.rightClick(inventoryId, stack); diff --git a/src/graphics/ui/elements/InventoryView.hpp b/src/graphics/ui/elements/InventoryView.hpp index 243d8b6b5..fbfe3eee9 100644 --- a/src/graphics/ui/elements/InventoryView.hpp +++ b/src/graphics/ui/elements/InventoryView.hpp @@ -123,6 +123,8 @@ namespace gui { SHARE = 2, UNDEFINED, }; + private: + void actIfCannotPut(ItemStack& stack, ItemStack& grabbed, InteractionAction& action); }; class InventoryView final : public gui::Container { diff --git a/src/items/ItemStack.cpp b/src/items/ItemStack.cpp index f99d8700a..d0f39d5fe 100644 --- a/src/items/ItemStack.cpp +++ b/src/items/ItemStack.cpp @@ -48,6 +48,14 @@ void ItemStack::setCount(itemcount_t count) { } } +void ItemStack::maximizeCount(const ContentIndices& indices) { + auto& def = indices.items.require(getItemId()); + this->count = def.stackSize; + if (count == 0) { + clear(); + } +} + void ItemStack::setField(std::string_view name, dv::value value) { if (fields == nullptr) { if (value == nullptr) { diff --git a/src/items/ItemStack.hpp b/src/items/ItemStack.hpp index 4896bc39e..1ec3fe41d 100644 --- a/src/items/ItemStack.hpp +++ b/src/items/ItemStack.hpp @@ -18,6 +18,7 @@ public: void set(const ItemStack& item); void set(ItemStack&& item); void setCount(itemcount_t count); + void maximizeCount(const ContentIndices& indices); /// @brief Set a field in the item stack data. void setField(std::string_view name, dv::value value); diff --git a/src/logic/scripting/lua/libs/libinventory.cpp b/src/logic/scripting/lua/libs/libinventory.cpp index 2aea52394..9d11d66c6 100644 --- a/src/logic/scripting/lua/libs/libinventory.cpp +++ b/src/logic/scripting/lua/libs/libinventory.cpp @@ -2,6 +2,7 @@ #include "items/Inventories.hpp" #include "items/ItemStack.hpp" #include "logic/BlocksController.hpp" +#include "logic/scripting/lua/lua_util.hpp" #include "world/Level.hpp" #include "api_lua.hpp" @@ -180,7 +181,7 @@ static int l_move(lua::State* L) { validate_slotid(slotAid, invA); auto invBid = lua::tointeger(L, 3); - auto slotBid = lua::isnil(L, 4) ? -1 : lua::tointeger(L, 4); + auto slotBid = lua::isnoneornil(L, 4) ? -1 : lua::tointeger(L, 4); auto& invB = get_inventory(invBid, 3); auto& slot = invA.getSlot(slotAid); if (slotBid == -1) { From efb4532536dd85c1edde19a6fc40e2ff19f807d6 Mon Sep 17 00:00:00 2001 From: neveix Date: Sat, 15 Aug 2026 00:55:04 +0500 Subject: [PATCH 2/4] add mul* functions to quats & fix to_string --- src/logic/scripting/lua/libs/libquat.cpp | 40 ++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/logic/scripting/lua/libs/libquat.cpp b/src/logic/scripting/lua/libs/libquat.cpp index 53757cb36..5002e9bb3 100644 --- a/src/logic/scripting/lua/libs/libquat.cpp +++ b/src/logic/scripting/lua/libs/libquat.cpp @@ -1,3 +1,5 @@ +#include +#include #include "api_lua.hpp" #define GLM_ENABLE_EXPERIMENTAL @@ -31,14 +33,14 @@ static int l_tostring(lua::State* L) { lua::check_argc(L, 1); auto quat = lua::toquat(L, 1); + float components[4] = {quat.w, quat.x, quat.y, quat.z}; std::stringstream ss; - ss << "quat" - << "{"; + ss << "quat" << "{"; for (int i = 0; i < 4; i++) { if (i > 0) { ss << ", "; } - ss << quat[i]; + ss << components[i]; } ss << "}"; return lua::pushstring(L, ss.str()); @@ -52,10 +54,42 @@ static int l_from_euler(lua::State *L) { return lua::pushquat(L, glm::quat(euler)); } +static int l_mul(lua::State* L) { + uint argc = lua::check_argc(L, 2, 3); + glm::quat a = lua::toquat(L, 1); + glm::quat b = lua::toquat(L, 2); + + glm::quat result = a * b; + + if (argc == 3) { + lua::setquat(L, 3, result); + return 0; + } + + return lua::pushquat(L, result); +} + +static int l_mul_vec3(lua::State* L) { + uint argc = lua::check_argc(L, 2, 3); + glm::quat q = lua::toquat(L, 1); + glm::vec3 v = lua::tovec3(L, 2); + + glm::vec3 result = q * v; + + if (argc == 3) { + lua::setvec(L, 3, result); + return 0; + } + + return lua::pushvec3(L, result); +} + const luaL_Reg quatlib[] = { {"from_mat4", lua::wrap}, {"from_euler", lua::wrap}, {"slerp", lua::wrap}, {"tostring", lua::wrap}, + {"mul", lua::wrap}, + {"mul_vec3", lua::wrap}, {nullptr, nullptr} }; From ae5c1a4533ae10b026761d6609617b25719c7003 Mon Sep 17 00:00:00 2001 From: neveix Date: Sat, 15 Aug 2026 01:08:32 +0500 Subject: [PATCH 3/4] move GLM_EXPERIMENTAL to the top --- src/logic/scripting/lua/libs/libquat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/scripting/lua/libs/libquat.cpp b/src/logic/scripting/lua/libs/libquat.cpp index 5002e9bb3..d062f40a4 100644 --- a/src/logic/scripting/lua/libs/libquat.cpp +++ b/src/logic/scripting/lua/libs/libquat.cpp @@ -1,8 +1,8 @@ +#define GLM_ENABLE_EXPERIMENTAL #include #include #include "api_lua.hpp" -#define GLM_ENABLE_EXPERIMENTAL #include #include #include From 516b4064768db430eb3e91665367ed9f096fce45 Mon Sep 17 00:00:00 2001 From: neveix Date: Sat, 15 Aug 2026 01:18:39 +0500 Subject: [PATCH 4/4] fix stringstream usage --- src/logic/scripting/lua/libs/libquat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/scripting/lua/libs/libquat.cpp b/src/logic/scripting/lua/libs/libquat.cpp index d062f40a4..a3fe62149 100644 --- a/src/logic/scripting/lua/libs/libquat.cpp +++ b/src/logic/scripting/lua/libs/libquat.cpp @@ -35,7 +35,7 @@ static int l_tostring(lua::State* L) { float components[4] = {quat.w, quat.x, quat.y, quat.z}; std::stringstream ss; - ss << "quat" << "{"; + ss << "quat {"; for (int i = 0; i < 4; i++) { if (i > 0) { ss << ", ";