Skip to content

Commit

Permalink
[CSM] Add callback on open inventory (#5793)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dumbeldor authored and nerzhul committed Oct 2, 2017
1 parent b9fb3ce commit 4e19791
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 5 deletions.
1 change: 1 addition & 0 deletions builtin/client/register.lua
Expand Up @@ -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()
6 changes: 6 additions & 0 deletions clientmods/preview/init.lua
Expand Up @@ -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))
Expand Down
4 changes: 4 additions & 0 deletions doc/client_lua_api.md
Expand Up @@ -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`
Expand Down
13 changes: 8 additions & 5 deletions src/game.cpp
Expand Up @@ -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);
}
}


Expand Down
21 changes: 21 additions & 0 deletions src/script/cpp_api/s_client.cpp
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions src/script/cpp_api/s_client.h
Expand Up @@ -57,5 +57,7 @@ class ScriptApiClient : virtual public ScriptApiBase
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);
};

0 comments on commit 4e19791

Please sign in to comment.