From 0727bb3ddd9c550ff962af4546bac8cc058bce73 Mon Sep 17 00:00:00 2001 From: red-001 Date: Sun, 29 Jan 2017 18:28:38 +0000 Subject: [PATCH] [CSM] Add `on_punchnode` callback --- builtin/client/register.lua | 3 +-- clientmods/preview/init.lua | 8 ++++++++ doc/client_lua_api.txt | 12 ++++++++---- src/game.cpp | 15 +++++++++------ src/script/cpp_api/s_client.cpp | 22 +++++++++++++++++++++- src/script/cpp_api/s_client.h | 1 + 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/builtin/client/register.lua b/builtin/client/register.lua index c8a5ddbda..1c3966eda 100644 --- a/builtin/client/register.lua +++ b/builtin/client/register.lua @@ -67,5 +67,4 @@ core.registered_on_hp_modification, core.register_on_hp_modification = make_regi core.registered_on_damage_taken, core.register_on_damage_taken = make_registration() core.registered_on_formspec_input, core.register_on_formspec_input = make_registration() core.registered_on_dignode, core.register_on_dignode = make_registration() - - +core.registered_on_punchnode, core.register_on_punchnode = make_registration() diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index 91b12d810..db4f28350 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -52,6 +52,14 @@ core.after(2, function() end) core.register_on_dignode(function(pos, node) + print("The local player dug a node!") + print("pos:" .. dump(pos)) + print("node:" .. dump(node)) + return false +end) + +core.register_on_punchnode(function(pos, node) + print("The local player punched a node!") print("pos:" .. dump(pos)) print("node:" .. dump(node)) return false diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 7b24452e8..5ffffe938 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -694,19 +694,23 @@ Call these functions only at load time! * `minetest.register_chatcommand(cmd, chatcommand definition)` * Adds definition to minetest.registered_chatcommands * `minetest.register_on_death(func())` - * Called when player die + * Called when the local player dies * `minetest.register_on_hp_modification(func(hp))` * Called when server modified player's HP * `minetest.register_on_damage_taken(func(hp))` - * Called when player take damages + * Called when the local player take damages * `minetest.register_on_formspec_input(func(formname, fields))` - * Called when a button is pressed in player's inventory form + * Called when a button is pressed in the local player's inventory form * Newest functions are called first * If function returns `true`, remaining functions are not called * `minetest.register_on_dignode(func(pos, node))` - * Called when a player digs a node + * Called when the local player digs a node * Newest functions are called first * If any function returns true, the node isn't dug +* `minetest.register_on_punchnode(func(pos, node))` + * Called when the local player punches a node + * Newest functions are called first + * If any function returns true, the punch is ignored ### Sounds * `minetest.sound_play(spec, parameters)`: returns a handle * `spec` is a `SimpleSoundSpec` diff --git a/src/game.cpp b/src/game.cpp index 66c8859c8..612bd2536 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3895,17 +3895,20 @@ void Game::handleDigging(GameRunData *runData, const PointedThing &pointed, const v3s16 &nodepos, const ToolCapabilities &playeritem_toolcap, f32 dtime) { - if (!runData->digging) { - infostream << "Started digging" << std::endl; - client->interact(0, pointed); - runData->digging = true; - runData->ldown_for_dig = true; - } LocalPlayer *player = client->getEnv().getLocalPlayer(); ClientMap &map = client->getEnv().getClientMap(); MapNode n = client->getEnv().getClientMap().getNodeNoEx(nodepos); + if (!runData->digging) { + infostream << "Started digging" << std::endl; + if (client->getScript()->on_punchnode(nodepos, n)) + return; + client->interact(0, pointed); + runData->digging = true; + runData->ldown_for_dig = true; + } + // NOTE: Similar piece of code exists on the server side for // cheat detection. // Get digging parameters diff --git a/src/script/cpp_api/s_client.cpp b/src/script/cpp_api/s_client.cpp index 2c8fee334..8c5e3796b 100644 --- a/src/script/cpp_api/s_client.cpp +++ b/src/script/cpp_api/s_client.cpp @@ -157,4 +157,24 @@ bool ScriptApiClient::on_dignode(v3s16 p, MapNode node) runCallbacks(2, RUN_CALLBACKS_MODE_OR); bool blocked = lua_toboolean(L, -1); return blocked; -} \ No newline at end of file +} + +bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node) +{ + SCRIPTAPI_PRECHECKHEADER + + INodeDefManager *ndef = getClient()->ndef(); + + // Get core.registered_on_punchgnode + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_punchnode"); + + // Push data + push_v3s16(L, p); + pushnode(L, node, ndef); + + // Call functions + runCallbacks(2, RUN_CALLBACKS_MODE_OR); + bool blocked = lua_toboolean(L, -1); + return blocked; +} diff --git a/src/script/cpp_api/s_client.h b/src/script/cpp_api/s_client.h index 09fd3a691..93e9558f2 100644 --- a/src/script/cpp_api/s_client.h +++ b/src/script/cpp_api/s_client.h @@ -46,5 +46,6 @@ public: void on_formspec_input(const std::string &formname, const StringMap &fields); bool on_dignode(v3s16 p, MapNode node); + bool on_punchnode(v3s16 p, MapNode node); }; #endif