mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
[CSM] Add on_dignode
callback (#5140)
This commit is contained in:
parent
ba66fce833
commit
073f5cf03d
@ -66,5 +66,6 @@ core.registered_on_death, core.register_on_death = make_registration()
|
|||||||
core.registered_on_hp_modification, core.register_on_hp_modification = make_registration()
|
core.registered_on_hp_modification, core.register_on_hp_modification = make_registration()
|
||||||
core.registered_on_damage_taken, core.register_on_damage_taken = make_registration()
|
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_formspec_input, core.register_on_formspec_input = make_registration()
|
||||||
|
core.registered_on_dignode, core.register_on_dignode = make_registration()
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,3 +42,9 @@ core.register_chatcommand("dump", {
|
|||||||
core.after(2, function()
|
core.after(2, function()
|
||||||
print("[PREVIEW] loaded " .. modname .. " mod")
|
print("[PREVIEW] loaded " .. modname .. " mod")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
core.register_on_dignode(function(pos, node)
|
||||||
|
print("pos:" .. dump(pos))
|
||||||
|
print("node:" .. dump(node))
|
||||||
|
return false
|
||||||
|
end)
|
@ -703,6 +703,10 @@ Call these functions only at load time!
|
|||||||
* Called when a button is pressed in player's inventory form
|
* Called when a button is pressed in player's inventory form
|
||||||
* Newest functions are called first
|
* Newest functions are called first
|
||||||
* If function returns `true`, remaining functions are not called
|
* If function returns `true`, remaining functions are not called
|
||||||
|
* `minetest.register_on_dignode(func(pos, node))`
|
||||||
|
* Called when a player digs a node
|
||||||
|
* Newest functions are called first
|
||||||
|
* If any function returns true, the node isn't dug
|
||||||
### Sounds
|
### Sounds
|
||||||
* `minetest.sound_play(spec, parameters)`: returns a handle
|
* `minetest.sound_play(spec, parameters)`: returns a handle
|
||||||
* `spec` is a `SimpleSoundSpec`
|
* `spec` is a `SimpleSoundSpec`
|
||||||
|
34
src/game.cpp
34
src/game.cpp
@ -3967,20 +3967,8 @@ void Game::handleDigging(GameRunData *runData,
|
|||||||
client->setCrack(runData->dig_index, nodepos);
|
client->setCrack(runData->dig_index, nodepos);
|
||||||
} else {
|
} else {
|
||||||
infostream << "Digging completed" << std::endl;
|
infostream << "Digging completed" << std::endl;
|
||||||
client->interact(2, pointed);
|
|
||||||
client->setCrack(-1, v3s16(0, 0, 0));
|
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->dig_time = 0;
|
||||||
runData->digging = false;
|
runData->digging = false;
|
||||||
|
|
||||||
@ -3999,6 +3987,26 @@ void Game::handleDigging(GameRunData *runData,
|
|||||||
if (runData->nodig_delay_timer < mindelay)
|
if (runData->nodig_delay_timer < mindelay)
|
||||||
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
|
// Send event to trigger sound
|
||||||
MtEvent *e = new NodeDugEvent(nodepos, wasnode);
|
MtEvent *e = new NodeDugEvent(nodepos, wasnode);
|
||||||
client->event()->put(e);
|
client->event()->put(e);
|
||||||
|
@ -21,6 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "s_client.h"
|
#include "s_client.h"
|
||||||
#include "s_internal.h"
|
#include "s_internal.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "common/c_converter.h"
|
||||||
|
#include "common/c_content.h"
|
||||||
|
|
||||||
void ScriptApiClient::on_shutdown()
|
void ScriptApiClient::on_shutdown()
|
||||||
{
|
{
|
||||||
@ -136,3 +138,23 @@ void ScriptApiClient::on_formspec_input(const std::string &formname,
|
|||||||
}
|
}
|
||||||
runCallbacks(2, RUN_CALLBACKS_MODE_OR_SC);
|
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;
|
||||||
|
}
|
@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
|
|
||||||
#include "cpp_api/s_base.h"
|
#include "cpp_api/s_base.h"
|
||||||
#include "util/string.h"
|
#include "util/string.h"
|
||||||
|
#include "mapnode.h"
|
||||||
|
|
||||||
#ifdef _CRT_MSVCP_CURRENT
|
#ifdef _CRT_MSVCP_CURRENT
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
@ -43,5 +44,7 @@ public:
|
|||||||
void on_death();
|
void on_death();
|
||||||
void environment_step(float dtime);
|
void environment_step(float dtime);
|
||||||
void on_formspec_input(const std::string &formname, const StringMap &fields);
|
void on_formspec_input(const std::string &formname, const StringMap &fields);
|
||||||
|
|
||||||
|
bool on_dignode(v3s16 p, MapNode node);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user