add on_inventory_open and on_inventory_closed events

This commit is contained in:
MihailRis 2025-01-12 17:14:01 +03:00
parent e1150f9e05
commit 80128a4190
4 changed files with 45 additions and 3 deletions

View File

@ -111,6 +111,8 @@ struct WorldFuncsSet {
bool onplayertick;
bool onchunkpresent;
bool onchunkremove;
bool oninventoryopen;
bool oninventoryclosed;
};
class ContentPackRuntime {

View File

@ -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) {

View File

@ -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(

View File

@ -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