diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index a4548d038..676bdffa3 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -127,6 +127,7 @@ struct WorldFuncsSet { bool onchunkremove; bool oninventoryopen; bool oninventoryclosed; + bool oninventoryinteract; }; class ContentPackRuntime { diff --git a/src/graphics/ui/elements/InventoryView.cpp b/src/graphics/ui/elements/InventoryView.cpp index 49c8bd3b9..f366a64a8 100644 --- a/src/graphics/ui/elements/InventoryView.cpp +++ b/src/graphics/ui/elements/InventoryView.cpp @@ -431,14 +431,23 @@ void SlotView::clicked(Mousecode button) { ItemStack& grabbed = exchangeSlot->getStack(); ItemStack& stack = *bound; + int action = -1; + if (button == Mousecode::BUTTON_1) { performLeftClick(stack, grabbed); + action = 0; } else if (button == Mousecode::BUTTON_2) { performRightClick(stack, grabbed); + action = 1; } + if (layout.updateFunc) { layout.updateFunc(layout.index, stack); } + + const auto& input = gui.getInput(); + action = action | (input.pressed(Keycode::LEFT_SHIFT) ? 2 : 0); + scripting::on_inventory_interact(inventoryId, layout.index, action); } void SlotView::onFocus() { diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index e3c23ee1e..713018503 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -540,6 +540,22 @@ void scripting::on_inventory_closed(const Player* player, const Inventory& inven } } +void scripting::on_inventory_interact(int invid, int slot, int action) { + auto args = [invid, slot, action](lua::State* L) { + lua::pushinteger(L, invid); + lua::pushinteger(L, slot); + lua::pushinteger(L, action); + return 3; + }; + for (auto& [packid, pack] : content->getPacks()) { + if (pack->worldfuncsset.oninventoryinteract) { + lua::emit_event( + lua::get_main_state(), packid + ":.inventoryinteract", args + ); + } + } +} + void scripting::on_player_tick(Player* player, int tps) { auto args = [=](lua::State* L) { lua::pushinteger(L, player ? player->getId() : -1); @@ -761,6 +777,8 @@ void scripting::load_world_script( register_event(env, "on_inventory_open", prefix + ":.inventoryopen"); funcsset.oninventoryclosed = register_event(env, "on_inventory_closed", prefix + ":.inventoryclosed"); + funcsset.oninventoryinteract = + register_event(env, "on_inventory_interact", prefix + ":.inventoryinteract"); } void scripting::load_layout_script( diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index e1553216d..c54a5fcf1 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -108,6 +108,7 @@ namespace scripting { void on_inventory_open(const Player* player, const Inventory& inventory); void on_inventory_closed(const Player* player, const Inventory& inventory); + void on_inventory_interact(int invid, int slot, int action); void on_player_tick(Player* player, int tps);