From 4e19791cde6b203ad853905d8c1481c43004a7ea Mon Sep 17 00:00:00 2001 From: Vincent Glize Date: Mon, 2 Oct 2017 22:09:49 +0200 Subject: [PATCH] [CSM] Add callback on open inventory (#5793) --- builtin/client/register.lua | 1 + clientmods/preview/init.lua | 6 ++++++ doc/client_lua_api.md | 4 ++++ src/game.cpp | 13 ++++++++----- src/script/cpp_api/s_client.cpp | 21 +++++++++++++++++++++ src/script/cpp_api/s_client.h | 2 ++ 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/builtin/client/register.lua b/builtin/client/register.lua index 2b835c744..2da37ad5f 100644 --- a/builtin/client/register.lua +++ b/builtin/client/register.lua @@ -73,3 +73,4 @@ core.registered_on_placenode, core.register_on_placenode = make_registration() core.registered_on_item_use, core.register_on_item_use = make_registration() core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration() core.registered_on_modchannel_signal, core.register_on_modchannel_signal = make_registration() +core.registered_on_inventory_open, core.register_on_inventory_open = make_registration() diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index 630059946..288b1b16c 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -38,6 +38,12 @@ core.register_on_modchannel_signal(function(channel, signal) .. channel) end) +core.register_on_inventory_open(function(inventory) + print("INVENTORY OPEN") + print(dump(inventory)) + return false +end) + core.register_on_placenode(function(pointed_thing, node) print("The local player place a node!") print("pointed_thing :" .. dump(pointed_thing)) diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md index 4c48b6619..1f50ae362 100644 --- a/doc/client_lua_api.md +++ b/doc/client_lua_api.md @@ -689,6 +689,10 @@ Call these functions only at load time! join request. * If message comes from a server mod, `sender` field is an empty string. +* `minetest.register_on_inventory_open(func(inventory))` + * Called when the local player open inventory + * Newest functions are called first + * If any function returns true, inventory doesn't open ### Sounds * `minetest.sound_play(spec, parameters)`: returns a handle * `spec` is a `SimpleSoundSpec` diff --git a/src/game.cpp b/src/game.cpp index 35d0aa9f9..8da789a9e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2671,14 +2671,17 @@ void Game::openInventory() infostream << "the_game: " << "Launching inventory" << std::endl; PlayerInventoryFormSource *fs_src = new PlayerInventoryFormSource(client); - TextDest *txt_dst = new TextDestPlayerInventory(client); - - create_formspec_menu(¤t_formspec, client, &input->joystick, fs_src, txt_dst); - cur_formname = ""; InventoryLocation inventoryloc; inventoryloc.setCurrentPlayer(); - current_formspec->setFormSpec(fs_src->getForm(), inventoryloc); + + if (!client->moddingEnabled() + || !client->getScript()->on_inventory_open(fs_src->m_client->getInventory(inventoryloc))) { + TextDest *txt_dst = new TextDestPlayerInventory(client); + create_formspec_menu(¤t_formspec, client, &input->joystick, fs_src, txt_dst); + cur_formname = ""; + current_formspec->setFormSpec(fs_src->getForm(), inventoryloc); + } } diff --git a/src/script/cpp_api/s_client.cpp b/src/script/cpp_api/s_client.cpp index b2dcc60c4..c6f7a8e19 100644 --- a/src/script/cpp_api/s_client.cpp +++ b/src/script/cpp_api/s_client.cpp @@ -224,6 +224,27 @@ bool ScriptApiClient::on_item_use(const ItemStack &item, const PointedThing &poi return lua_toboolean(L, -1); } +bool ScriptApiClient::on_inventory_open(Inventory *inventory) +{ + SCRIPTAPI_PRECHECKHEADER + + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_inventory_open"); + + std::vector lists = inventory->getLists(); + std::vector::iterator iter = lists.begin(); + lua_createtable(L, 0, lists.size()); + for (; iter != lists.end(); iter++) { + const char* name = (*iter)->getName().c_str(); + lua_pushstring(L, name); + push_inventory_list(L, inventory, name); + lua_rawset(L, -3); + } + + runCallbacks(1, RUN_CALLBACKS_MODE_OR); + return lua_toboolean(L, -1); +} + void ScriptApiClient::setEnv(ClientEnvironment *env) { ScriptApiBase::setEnv(env); diff --git a/src/script/cpp_api/s_client.h b/src/script/cpp_api/s_client.h index 074a68e39..717fbb4cc 100644 --- a/src/script/cpp_api/s_client.h +++ b/src/script/cpp_api/s_client.h @@ -57,5 +57,7 @@ public: bool on_placenode(const PointedThing &pointed, const ItemDefinition &item); bool on_item_use(const ItemStack &item, const PointedThing &pointed); + bool on_inventory_open(Inventory *inventory); + void setEnv(ClientEnvironment *env); };