From 927611c06ba4d2bd3a1d24e176fe3f561384f3d7 Mon Sep 17 00:00:00 2001 From: neveix Date: Thu, 13 Aug 2026 22:16:21 +0500 Subject: [PATCH 01/17] implement a bit --- src/graphics/ui/elements/InventoryView.cpp | 7 +++++++ src/items/ItemStack.cpp | 8 ++++++++ src/items/ItemStack.hpp | 1 + 3 files changed, 16 insertions(+) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index e99a86d33..29111a4ad 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -1,5 +1,7 @@ #include "InventoryView.hpp" +#include + #include #include @@ -368,6 +370,7 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { return; } + std::cout << "perform left click" << std::endl; if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { action = InteractionAction::PUT; stack.move(grabbed, *content->getIndices()); @@ -375,6 +378,10 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { if (layout.itemSource) { if (grabbed.isEmpty()) { action = InteractionAction::TAKE; + if (input.pressed(Keycode::LEFT_SHIFT)) { + stack.maximizeCount(*content->getIndices()); + std::cout << "maximized grabbed item" << std::endl; + } grabbed.set(stack); } else { action = InteractionAction::PUT; 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); From d328b4deb5ff871532291eeb00a70d5101c4df62 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 01:27:51 +0500 Subject: [PATCH 02/17] change shift to ctrl --- src/graphics/ui/elements/InventoryView.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index c8cca1f5b..4204cfa25 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -369,7 +369,6 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { return; } - std::cout << "perform left click" << std::endl; if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { action = InteractionAction::PUT; stack.move(grabbed, *content->getIndices()); @@ -377,7 +376,7 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { if (layout.itemSource) { if (grabbed.isEmpty()) { action = InteractionAction::TAKE; - if (input.pressed(Keycode::LEFT_SHIFT)) { + if (input.pressed(Keycode::LEFT_CONTROL)) { stack.maximizeCount(*content->getIndices()); std::cout << "maximized grabbed item" << std::endl; } From dfff6f5dd7dfc6e2d72f5f4dc54710447d7ed625 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 02:08:51 +0500 Subject: [PATCH 03/17] add enhancement #2 --- src/graphics/ui/elements/InventoryView.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 4204cfa25..0cf482a0d 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -376,11 +376,10 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { if (layout.itemSource) { if (grabbed.isEmpty()) { action = InteractionAction::TAKE; - if (input.pressed(Keycode::LEFT_CONTROL)) { - stack.maximizeCount(*content->getIndices()); - std::cout << "maximized grabbed item" << std::endl; - } grabbed.set(stack); + if (input.pressed(Keycode::LEFT_CONTROL)) { + grabbed.maximizeCount(*content->getIndices()); + } } else { action = InteractionAction::PUT; grabbed.clear(); From 4d290a58fcdc5ad76f5a6a780c78b425fcdef332 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 02:50:53 +0500 Subject: [PATCH 04/17] add ctrl-interaction with content access --- src/frontend/hud.cpp | 14 +++++++++++--- src/graphics/ui/elements/InventoryView.cpp | 2 -- 2 files changed, 11 insertions(+), 5 deletions(-) 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 0cf482a0d..310c9fd28 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -1,7 +1,5 @@ #include "InventoryView.hpp" -#include - #include #include From 2c9cb8b3d43afaa4676896bf9ba8f40e7a0e1c9c Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 14:05:28 +0500 Subject: [PATCH 05/17] fix libinventory.move bug (none checking) --- src/logic/scripting/lua/libs/libinventory.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/logic/scripting/lua/libs/libinventory.cpp b/src/logic/scripting/lua/libs/libinventory.cpp index 2aea52394..20f090a01 100644 --- a/src/logic/scripting/lua/libs/libinventory.cpp +++ b/src/logic/scripting/lua/libs/libinventory.cpp @@ -1,7 +1,10 @@ +#include + #include "content/Content.hpp" #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 +183,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 5d66c41f80f3c0db2508c47f7f50af2dc29748d6 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 14:30:34 +0500 Subject: [PATCH 06/17] fix p.5 --- src/graphics/ui/elements/InventoryView.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 310c9fd28..333777857 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -366,10 +366,10 @@ 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()) { @@ -379,8 +379,17 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { grabbed.maximizeCount(*content->getIndices()); } } else { - action = InteractionAction::PUT; - grabbed.clear(); + // TODO: refactor to reduce nesting + 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) { From da7ac66bf83e04946d7426312b6252fa29729173 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 14:38:41 +0500 Subject: [PATCH 07/17] move shareinv logic into inventory_utils --- res/layouts/inventory.xml | 4 ++-- res/layouts/inventory.xml.lua | 13 +------------ 2 files changed, 3 insertions(+), 14 deletions(-) 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 From 54e90a25fe1c64318708071c51354962eeab0d3c Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 14:40:27 +0500 Subject: [PATCH 08/17] add inventory utils --- res/modules/inventory_utils.lua | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 res/modules/inventory_utils.lua 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 From e76b5b0dcdec77e10903fe49004ad9716d8bdf66 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 15:22:06 +0500 Subject: [PATCH 09/17] small refactor --- src/graphics/ui/elements/InventoryView.cpp | 63 ++++++++++--------- src/graphics/ui/elements/InventoryView.hpp | 2 + src/logic/scripting/lua/libs/libinventory.cpp | 2 - 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 333777857..614d4c913 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -371,35 +371,7 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { action = InteractionAction::PUT; stack.move(grabbed, indices); } else { - if (layout.itemSource) { - if (grabbed.isEmpty()) { - action = InteractionAction::TAKE; - grabbed.set(stack); - if (input.pressed(Keycode::LEFT_CONTROL)) { - grabbed.maximizeCount(*content->getIndices()); - } - } else { - // TODO: refactor to reduce nesting - 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); - } + actIfCannotPut(stack, grabbed, action); } if (action != InteractionAction::UNDEFINED) { @@ -412,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/logic/scripting/lua/libs/libinventory.cpp b/src/logic/scripting/lua/libs/libinventory.cpp index 20f090a01..9d11d66c6 100644 --- a/src/logic/scripting/lua/libs/libinventory.cpp +++ b/src/logic/scripting/lua/libs/libinventory.cpp @@ -1,5 +1,3 @@ -#include - #include "content/Content.hpp" #include "items/Inventories.hpp" #include "items/ItemStack.hpp" From 1a2f0f486807f05ca9fa2c02e5153c8c4396ef0c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 13 Aug 2026 23:52:01 +0300 Subject: [PATCH 10/17] fix iframe.src = "" --- src/graphics/ui/elements/InlineFrame.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/graphics/ui/elements/InlineFrame.cpp b/src/graphics/ui/elements/InlineFrame.cpp index 319a16b1b..eeef50e47 100644 --- a/src/graphics/ui/elements/InlineFrame.cpp +++ b/src/graphics/ui/elements/InlineFrame.cpp @@ -14,6 +14,7 @@ void InlineFrame::setSrc(const std::string& src) { this->src = src; if (document) { scripting::on_ui_close(*document, nullptr); + clear(); document = nullptr; root = nullptr; } From cedeaa68ad9299c544f213432fec408e6802efe2 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 16:10:41 +0500 Subject: [PATCH 11/17] fix p.6 --- src/graphics/ui/elements/InventoryView.cpp | 15 +++++++++++++++ src/graphics/ui/elements/InventoryView.hpp | 1 + 2 files changed, 16 insertions(+) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 614d4c913..0859cebac 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -500,6 +500,19 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { ); } +void SlotView::performMiddleClick(ItemStack& stack, ItemStack& grabbed) { + auto indices = *content->getIndices(); + if (!grabbed.isEmpty()) { + if (stack.isEmpty()) { + stack.set(grabbed); + stack.maximizeCount(indices); + } + return; + } + grabbed.set(stack); + grabbed.maximizeCount(indices); +} + void SlotView::clicked(Mousecode button) { if (bound == nullptr) return; auto exchangeSlot = @@ -514,6 +527,8 @@ void SlotView::clicked(Mousecode button) { performLeftClick(stack, grabbed); } else if (button == Mousecode::BUTTON_2) { performRightClick(stack, grabbed); + } else if (button == Mousecode::BUTTON_3) { + performMiddleClick(stack, grabbed); } if (layout.updateFunc) { diff --git a/src/graphics/ui/elements/InventoryView.hpp b/src/graphics/ui/elements/InventoryView.hpp index fbfe3eee9..b8e16cc44 100644 --- a/src/graphics/ui/elements/InventoryView.hpp +++ b/src/graphics/ui/elements/InventoryView.hpp @@ -67,6 +67,7 @@ namespace gui { void performLeftClick(ItemStack& stack, ItemStack& grabbed); void performRightClick(ItemStack& stack, ItemStack& grabbed); + void performMiddleClick(ItemStack& stack, ItemStack& grabbed); void drawItemIcon( Batch2D& batch, From 1040a3a183842b8516720f344c72facafc9b9ede Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 19:06:21 +0500 Subject: [PATCH 12/17] fix p.6 --- res/content/base/scripts/hud.lua | 21 +++++++++++++++++++++ src/graphics/ui/elements/InventoryView.cpp | 14 ++++---------- src/logic/scripting/scripting.hpp | 2 ++ src/logic/scripting/scripting_hud.cpp | 13 +++++++++++++ 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index d0e3d1532..65d86118f 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -5,6 +5,27 @@ function on_hud_open() local invid = hud.get_exchange_inventory() base_util.drop_from_slot(invid, 0, mode) end) + + events.on("core:slot_middle_click", function(invid, slot) + if not player.is_infinite_items(hud.get_player()) then + return + end + local itemid = inventory.get(invid, slot) + local exc_invid = hud.get_exchange_inventory() + local exc_itemid = inventory.get(exc_invid, 0) + if itemid == 0 then + if exc_itemid ~= 0 then + local stack_size = item.stack_size(exc_itemid) + inventory.set(invid, slot, exc_itemid, stack_size) + end + else + if exc_itemid == 0 then + local stack_size = item.stack_size(itemid) + inventory.set(exc_invid, 0, itemid, stack_size) + end + end + end) + input.add_callback("player.drop", function() if hud.is_paused() or hud.is_inventory_open() then return diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 0859cebac..f93a2a614 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -501,16 +501,10 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { } void SlotView::performMiddleClick(ItemStack& stack, ItemStack& grabbed) { - auto indices = *content->getIndices(); - if (!grabbed.isEmpty()) { - if (stack.isEmpty()) { - stack.set(grabbed); - stack.maximizeCount(indices); - } - return; - } - grabbed.set(stack); - grabbed.maximizeCount(indices); + scripting::on_slot_middle_click( + inventoryId, + layout.index + ); } void SlotView::clicked(Mousecode button) { diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index 0044213cd..064417995 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -110,6 +110,8 @@ namespace scripting { void on_inventory_closed(const Player* player, const Inventory& inventory); void on_inventory_interact(int invid, int slot, int action, int mode); + void on_slot_middle_click(int invid, int slot); + void on_player_tick(Player* player, int tps); /// @brief Called on RMB click with the item selected diff --git a/src/logic/scripting/scripting_hud.cpp b/src/logic/scripting/scripting_hud.cpp index 59b928d21..f3499ae71 100644 --- a/src/logic/scripting/scripting_hud.cpp +++ b/src/logic/scripting/scripting_hud.cpp @@ -110,6 +110,19 @@ void scripting::on_inventory_interact(int invid, int slot, int action, int mode) } } +void scripting::on_slot_middle_click(int invid, int slot) { + auto L = lua::get_main_state(); + lua::emit_event( + L, + "core:slot_middle_click", + [&](lua::State* L) { + lua::pushinteger(L, invid); + lua::pushinteger(L, slot); + return 2; + } + ); +} + void scripting::load_hud_script( const scriptenv& senv, const std::string& packid, From 047f0503640058ac464ae918c72a97684b0e5570 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 19:57:53 +0500 Subject: [PATCH 13/17] fix middle click on access panel --- res/content/base/scripts/hud.lua | 12 +++++++++++- src/graphics/ui/elements/InventoryView.cpp | 13 +++++++++---- src/logic/scripting/scripting.hpp | 1 + src/logic/scripting/scripting_hud.cpp | 13 +++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index 65d86118f..d7d970a90 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -6,13 +6,18 @@ function on_hud_open() base_util.drop_from_slot(invid, 0, mode) end) + events.on("core:access_panel_slot_middle_click", function(itemid) + local exc_invid = hud.get_exchange_inventory() + inventory.set(exc_invid, 0, itemid, item.stack_size(itemid)) + end) + events.on("core:slot_middle_click", function(invid, slot) if not player.is_infinite_items(hud.get_player()) then return end - local itemid = inventory.get(invid, slot) local exc_invid = hud.get_exchange_inventory() local exc_itemid = inventory.get(exc_invid, 0) + local itemid = inventory.get(invid, slot) if itemid == 0 then if exc_itemid ~= 0 then local stack_size = item.stack_size(exc_itemid) @@ -22,6 +27,11 @@ function on_hud_open() if exc_itemid == 0 then local stack_size = item.stack_size(itemid) inventory.set(exc_invid, 0, itemid, stack_size) + else + if exc_itemid == itemid then + local stack_size = item.stack_size(exc_itemid) + inventory.set(invid, slot, exc_itemid, stack_size) + end end end end) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index f93a2a614..45edf8ee2 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -1,6 +1,7 @@ #include "InventoryView.hpp" #include +#include #include #include "assets/Assets.hpp" @@ -501,10 +502,14 @@ void SlotView::performRightClick(ItemStack& stack, ItemStack& grabbed) { } void SlotView::performMiddleClick(ItemStack& stack, ItemStack& grabbed) { - scripting::on_slot_middle_click( - inventoryId, - layout.index - ); + if (layout.itemSource) { + scripting::on_access_panel_slot_middle_click(stack.getItemId()); + } else { + scripting::on_slot_middle_click( + inventoryId, + layout.index + ); + } } void SlotView::clicked(Mousecode button) { diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index 064417995..84acab5ad 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -111,6 +111,7 @@ namespace scripting { void on_inventory_interact(int invid, int slot, int action, int mode); void on_slot_middle_click(int invid, int slot); + void on_access_panel_slot_middle_click(const itemid_t itemid); void on_player_tick(Player* player, int tps); diff --git a/src/logic/scripting/scripting_hud.cpp b/src/logic/scripting/scripting_hud.cpp index f3499ae71..940db766b 100644 --- a/src/logic/scripting/scripting_hud.cpp +++ b/src/logic/scripting/scripting_hud.cpp @@ -12,6 +12,7 @@ #include "lua/libs/api_lua.hpp" #include "lua/lua_engine.hpp" #include "scripting.hpp" +#include "typedefs.hpp" using namespace scripting; @@ -123,6 +124,18 @@ void scripting::on_slot_middle_click(int invid, int slot) { ); } +void scripting::on_access_panel_slot_middle_click(const itemid_t itemid) { + auto L = lua::get_main_state(); + lua::emit_event( + L, + "core:access_panel_slot_middle_click", + [&](lua::State* L) { + lua::pushinteger(L, itemid); + return 1; + } + ); +} + void scripting::load_hud_script( const scriptenv& senv, const std::string& packid, From b50531895c1f6bfd2c8752cf8d9bd1eb323f75c7 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 20:12:33 +0500 Subject: [PATCH 14/17] remove redundant allocations --- src/graphics/ui/elements/InventoryView.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 45edf8ee2..9449ce3b0 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -367,7 +367,7 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { ); return; } - auto indices = *content->getIndices(); + auto& indices = *content->getIndices(); if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { action = InteractionAction::PUT; stack.move(grabbed, indices); @@ -387,13 +387,13 @@ 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(); + 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()); + grabbed.maximizeCount(indices); } } else { if (grabbed.accepts(stack)) { From 242c59d73ce4a3c6ccd989a4e24b460e37c2d6f2 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 20:19:30 +0500 Subject: [PATCH 15/17] fix p.13 --- src/graphics/ui/elements/InventoryView.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 9449ce3b0..61403cad0 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -1,7 +1,6 @@ #include "InventoryView.hpp" #include -#include #include #include "assets/Assets.hpp" @@ -369,8 +368,14 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { } auto& indices = *content->getIndices(); if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { - action = InteractionAction::PUT; - stack.move(grabbed, indices); + auto& def = indices.items.require(stack.getItemId()); + if (stack.getCount() < def.stackSize) { + action = InteractionAction::PUT; + stack.move(grabbed, indices); + } else { + action = InteractionAction::TAKE; + std::swap(grabbed, stack); + } } else { actIfCannotPut(stack, grabbed, action); } From 818da085b5886fc34c268d84e9409a920752e391 Mon Sep 17 00:00:00 2001 From: neveix Date: Fri, 14 Aug 2026 23:55:08 +0500 Subject: [PATCH 16/17] resolve conflicts 2 (first was not successful for some reason) --- src/graphics/ui/elements/InventoryView.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 8b8ea3eb7..61403cad0 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -366,7 +366,6 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { ); return; } -<<<<<<< HEAD auto& indices = *content->getIndices(); if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { auto& def = indices.items.require(stack.getItemId()); @@ -377,12 +376,6 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { action = InteractionAction::TAKE; std::swap(grabbed, stack); } -======= - auto indices = *content->getIndices(); - if (!layout.itemSource && stack.accepts(grabbed) && layout.placing) { - action = InteractionAction::PUT; - stack.move(grabbed, indices); ->>>>>>> main } else { actIfCannotPut(stack, grabbed, action); } @@ -399,21 +392,13 @@ void SlotView::performLeftClick(ItemStack& stack, ItemStack& grabbed) { void SlotView::actIfCannotPut(ItemStack& stack, ItemStack& grabbed, InteractionAction& action) { const auto& input = gui.getInput(); -<<<<<<< HEAD auto& indices = *content->getIndices(); -======= - auto indices = *content->getIndices(); ->>>>>>> main if (layout.itemSource) { if (grabbed.isEmpty()) { action = InteractionAction::TAKE; grabbed.set(stack); if (input.pressed(Keycode::LEFT_CONTROL)) { -<<<<<<< HEAD grabbed.maximizeCount(indices); -======= - grabbed.maximizeCount(*content->getIndices()); ->>>>>>> main } } else { if (grabbed.accepts(stack)) { From a4403ee6e5ce82692e3e89e11aa1aaa9254058c0 Mon Sep 17 00:00:00 2001 From: neveix Date: Sat, 15 Aug 2026 20:19:00 +0500 Subject: [PATCH 17/17] fix ifs --- res/content/base/scripts/hud.lua | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/res/content/base/scripts/hud.lua b/res/content/base/scripts/hud.lua index d7d970a90..6f4a2558d 100644 --- a/res/content/base/scripts/hud.lua +++ b/res/content/base/scripts/hud.lua @@ -18,21 +18,15 @@ function on_hud_open() local exc_invid = hud.get_exchange_inventory() local exc_itemid = inventory.get(exc_invid, 0) local itemid = inventory.get(invid, slot) - if itemid == 0 then - if exc_itemid ~= 0 then - local stack_size = item.stack_size(exc_itemid) - inventory.set(invid, slot, exc_itemid, stack_size) - end - else - if exc_itemid == 0 then - local stack_size = item.stack_size(itemid) - inventory.set(exc_invid, 0, itemid, stack_size) - else - if exc_itemid == itemid then - local stack_size = item.stack_size(exc_itemid) - inventory.set(invid, slot, exc_itemid, stack_size) - end - end + if itemid == 0 and exc_itemid ~= 0 then + local stack_size = item.stack_size(exc_itemid) + inventory.set(invid, slot, exc_itemid, stack_size) + elseif exc_itemid == 0 then + local stack_size = item.stack_size(itemid) + inventory.set(exc_invid, 0, itemid, stack_size) + elseif exc_itemid == itemid then + local stack_size = item.stack_size(exc_itemid) + inventory.set(invid, slot, exc_itemid, stack_size) end end) @@ -44,7 +38,7 @@ function on_hud_open() local invid, slot = player.get_inventory(pid) local mode = 1 if input.is_pressed("key:left-ctrl") or input.is_pressed("key:right-ctrl") then - mode = 0 + mode = 0 end base_util.drop_from_slot(invid, slot, mode) end)