From 80128a419075df35e7558aee11ddd43e0e0d53ba Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 12 Jan 2025 17:14:01 +0300 Subject: [PATCH] add `on_inventory_open` and `on_inventory_closed` events --- src/content/ContentPack.hpp | 2 ++ src/frontend/hud.cpp | 9 +++++--- src/logic/scripting/scripting.cpp | 34 +++++++++++++++++++++++++++++++ src/logic/scripting/scripting.hpp | 3 +++ 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index 84e835dd..e4360bdc 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -111,6 +111,8 @@ struct WorldFuncsSet { bool onplayertick; bool onchunkpresent; bool onchunkremove; + bool oninventoryopen; + bool oninventoryclosed; }; class ContentPackRuntime { diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 3bf7cab2..fa7b539d 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -447,6 +447,8 @@ void Hud::openInventory( blockPos = block; currentblockid = chunks.require(block.x, block.y, block.z).id; add(HudElement(hud_element_mode::inventory_bound, doc, blockUI, false)); + + scripting::on_inventory_open(&player, *blockinv); } void Hud::showExchangeSlot() { @@ -461,7 +463,6 @@ void Hud::showExchangeSlot() { exchangeSlot->setInteractive(false); exchangeSlot->setZIndex(1); gui.store(SlotView::EXCHANGE_SLOT_NAME, exchangeSlot); - } void Hud::showOverlay( @@ -517,13 +518,15 @@ void Hud::dropExchangeSlot() { } void Hud::closeInventory() { + if (blockUI) { + scripting::on_inventory_closed(&player, *blockUI->getInventory()); + blockUI = nullptr; + } dropExchangeSlot(); gui.remove(SlotView::EXCHANGE_SLOT_NAME); exchangeSlot = nullptr; exchangeSlotInv = nullptr; inventoryOpen = false; - inventoryView = nullptr; - blockUI = nullptr; secondUI = nullptr; for (auto& element : elements) { diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index e19a82bc..d58879d3 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -441,6 +441,36 @@ void scripting::on_chunk_remove(const Chunk& chunk) { } } +void scripting::on_inventory_open(const Player* player, const Inventory& inventory) { + auto args = [player, &inventory](lua::State* L) { + lua::pushinteger(L, inventory.getId()); + lua::pushinteger(L, player ? player->getId() : -1); + return 2; + }; + for (auto& [packid, pack] : content->getPacks()) { + if (pack->worldfuncsset.oninventoryopen) { + lua::emit_event( + lua::get_main_state(), packid + ":.inventoryopen", args + ); + } + } +} + +void scripting::on_inventory_closed(const Player* player, const Inventory& inventory) { + auto args = [player, &inventory](lua::State* L) { + lua::pushinteger(L, inventory.getId()); + lua::pushinteger(L, player ? player->getId() : -1); + return 2; + }; + for (auto& [packid, pack] : content->getPacks()) { + if (pack->worldfuncsset.oninventoryclosed) { + lua::emit_event( + lua::get_main_state(), packid + ":.inventoryclosed", args + ); + } + } +} + void scripting::on_player_tick(Player* player, int tps) { auto args = [=](lua::State* L) { lua::pushinteger(L, player ? player->getId() : -1); @@ -871,6 +901,10 @@ void scripting::load_world_script( register_event(env, "on_chunk_present", prefix + ":.chunkpresent"); funcsset.onchunkremove = register_event(env, "on_chunk_remove", prefix + ":.chunkremove"); + funcsset.oninventoryopen = + register_event(env, "on_inventory_open", prefix + ":.inventoryopen"); + funcsset.oninventoryclosed = + register_event(env, "on_inventory_closed", prefix + ":.inventoryclosed"); } void scripting::load_layout_script( diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index ee4be4f8..b447de28 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -89,6 +89,9 @@ namespace scripting { void on_chunk_present(const Chunk& chunk, bool loaded); void on_chunk_remove(const Chunk& chunk); + void on_inventory_open(const Player* player, const Inventory& inventory); + void on_inventory_closed(const Player* player, const Inventory& inventory); + void on_player_tick(Player* player, int tps); /// @brief Called on RMB click with the item selected