aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Glize <vincentglize@hotmail.fr>2017-10-02 22:09:49 +0200
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-10-02 22:09:49 +0200
commit4e19791cde6b203ad853905d8c1481c43004a7ea (patch)
tree9db628a01d6678b453fe7ae2b49c60c38179a29c
parentb9fb3cea33f495f0c9c9d7d74ed67af6aab78b04 (diff)
downloadminetest-4e19791cde6b203ad853905d8c1481c43004a7ea.tar.gz
minetest-4e19791cde6b203ad853905d8c1481c43004a7ea.tar.bz2
minetest-4e19791cde6b203ad853905d8c1481c43004a7ea.zip
[CSM] Add callback on open inventory (#5793)
-rw-r--r--builtin/client/register.lua1
-rw-r--r--clientmods/preview/init.lua6
-rw-r--r--doc/client_lua_api.md4
-rw-r--r--src/game.cpp13
-rw-r--r--src/script/cpp_api/s_client.cpp21
-rw-r--r--src/script/cpp_api/s_client.h2
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(&current_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(&current_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<const InventoryList*> lists = inventory->getLists();
+ std::vector<const InventoryList*>::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);
};