[CSM] Add callback on open inventory (#5793)
authorVincent Glize <vincentglize@hotmail.fr>
Mon, 2 Oct 2017 20:09:49 +0000 (22:09 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 2 Oct 2017 20:09:49 +0000 (22:09 +0200)
builtin/client/register.lua
clientmods/preview/init.lua
doc/client_lua_api.md
src/game.cpp
src/script/cpp_api/s_client.cpp
src/script/cpp_api/s_client.h

index 2b835c744d7ee1d9d8d4566172b8e9c28c962402..2da37ad5fa5e284b1c8f307aad120024c451b072 100644 (file)
@@ -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()
index 630059946a508b6cd1a570df55ab841a586e2435..288b1b16c1d9ea67e2134fef3372ad5466d05d00 100644 (file)
@@ -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))
index 4c48b6619adf3dbc07c5bf97e3f1464ea9ab1206..1f50ae362b3630bf451dac5b39a20aaf7689b138 100644 (file)
@@ -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`
index 35d0aa9f98ef1b0ea54fa7265cfa98bf0df43c4c..8da789a9eb4bf743697a245c1c2e251de4f6af6e 100644 (file)
@@ -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);
+       }
 }
 
 
index b2dcc60c4c1b86c509c2083efe93bd644505ec94..c6f7a8e191ca7c8859ad0f45c5c6255fb4ea97d8 100644 (file)
@@ -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);
index 074a68e39dd84067971ea6e7a11df4acf6150888..717fbb4cc5bc93a926eb1283cb0e6322a066dc38 100644 (file)
@@ -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);
 };