diff options
author | red-001 <red-001@outlook.ie> | 2017-01-29 17:43:44 +0000 |
---|---|---|
committer | Loïc Blot <nerzhul@users.noreply.github.com> | 2017-03-13 23:56:05 +0100 |
commit | 073f5cf03d95ce1cdf04ce8a0adcaf1fc571d95f (patch) | |
tree | eb35aa9d964972e85beaf66eda3bd9077018861a /src | |
parent | ba66fce8339f818a638f97679bd29da064a8c1c6 (diff) | |
download | minetest-073f5cf03d95ce1cdf04ce8a0adcaf1fc571d95f.tar.gz minetest-073f5cf03d95ce1cdf04ce8a0adcaf1fc571d95f.tar.bz2 minetest-073f5cf03d95ce1cdf04ce8a0adcaf1fc571d95f.zip |
[CSM] Add `on_dignode` callback (#5140)
Diffstat (limited to 'src')
-rw-r--r-- | src/game.cpp | 34 | ||||
-rw-r--r-- | src/script/cpp_api/s_client.cpp | 22 | ||||
-rw-r--r-- | src/script/cpp_api/s_client.h | 3 |
3 files changed, 46 insertions, 13 deletions
diff --git a/src/game.cpp b/src/game.cpp index c84e08b01..66c8859c8 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3967,20 +3967,8 @@ void Game::handleDigging(GameRunData *runData, client->setCrack(runData->dig_index, nodepos); } else { infostream << "Digging completed" << std::endl; - client->interact(2, pointed); client->setCrack(-1, v3s16(0, 0, 0)); - bool is_valid_position; - MapNode wasnode = map.getNodeNoEx(nodepos, &is_valid_position); - if (is_valid_position) - client->removeNode(nodepos); - - if (m_cache_enable_particles) { - const ContentFeatures &features = - client->getNodeDefManager()->get(wasnode); - client->getParticleManager()->addDiggingParticles(client, smgr, - player, nodepos, wasnode, features); - } - + runData->dig_time = 0; runData->digging = false; @@ -3999,6 +3987,26 @@ void Game::handleDigging(GameRunData *runData, if (runData->nodig_delay_timer < mindelay) runData->nodig_delay_timer = mindelay; + bool is_valid_position; + MapNode wasnode = map.getNodeNoEx(nodepos, &is_valid_position); + if (is_valid_position) { + bool block = client->getScript()->on_dignode(nodepos, wasnode); + if (block) { + return; + } + client->removeNode(nodepos); + } + + client->interact(2, pointed); + + if (m_cache_enable_particles) { + const ContentFeatures &features = + client->getNodeDefManager()->get(wasnode); + client->getParticleManager()->addDiggingParticles(client, smgr, + player, nodepos, wasnode, features); + } + + // Send event to trigger sound MtEvent *e = new NodeDugEvent(nodepos, wasnode); client->event()->put(e); diff --git a/src/script/cpp_api/s_client.cpp b/src/script/cpp_api/s_client.cpp index 1827d483b..2c8fee334 100644 --- a/src/script/cpp_api/s_client.cpp +++ b/src/script/cpp_api/s_client.cpp @@ -21,6 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "s_client.h" #include "s_internal.h" #include "client.h" +#include "common/c_converter.h" +#include "common/c_content.h" void ScriptApiClient::on_shutdown() { @@ -136,3 +138,23 @@ void ScriptApiClient::on_formspec_input(const std::string &formname, } runCallbacks(2, RUN_CALLBACKS_MODE_OR_SC); } + +bool ScriptApiClient::on_dignode(v3s16 p, MapNode node) +{ + SCRIPTAPI_PRECHECKHEADER + + INodeDefManager *ndef = getClient()->ndef(); + + // Get core.registered_on_dignode + lua_getglobal(L, "core"); + lua_getfield(L, -1, "registered_on_dignode"); + + // 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; +}
\ No newline at end of file diff --git a/src/script/cpp_api/s_client.h b/src/script/cpp_api/s_client.h index 42c41f8a4..09fd3a691 100644 --- a/src/script/cpp_api/s_client.h +++ b/src/script/cpp_api/s_client.h @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "cpp_api/s_base.h" #include "util/string.h" +#include "mapnode.h" #ifdef _CRT_MSVCP_CURRENT #include <cstdint> @@ -43,5 +44,7 @@ public: void on_death(); void environment_step(float dtime); void on_formspec_input(const std::string &formname, const StringMap &fields); + + bool on_dignode(v3s16 p, MapNode node); }; #endif |