[CSM] Add on_punchnode callback

This commit is contained in:
red-001 2017-01-29 18:28:38 +00:00 committed by Loïc Blot
parent 37df9cb7d7
commit 0727bb3ddd
6 changed files with 48 additions and 13 deletions

@ -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_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() core.registered_on_dignode, core.register_on_dignode = make_registration()
core.registered_on_punchnode, core.register_on_punchnode = make_registration()

@ -52,6 +52,14 @@ core.after(2, function()
end) end)
core.register_on_dignode(function(pos, node) 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("pos:" .. dump(pos))
print("node:" .. dump(node)) print("node:" .. dump(node))
return false return false

@ -694,19 +694,23 @@ Call these functions only at load time!
* `minetest.register_chatcommand(cmd, chatcommand definition)` * `minetest.register_chatcommand(cmd, chatcommand definition)`
* Adds definition to minetest.registered_chatcommands * Adds definition to minetest.registered_chatcommands
* `minetest.register_on_death(func())` * `minetest.register_on_death(func())`
* Called when player die * Called when the local player dies
* `minetest.register_on_hp_modification(func(hp))` * `minetest.register_on_hp_modification(func(hp))`
* Called when server modified player's HP * Called when server modified player's HP
* `minetest.register_on_damage_taken(func(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))` * `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 * 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))` * `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 * Newest functions are called first
* If any function returns true, the node isn't dug * 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 ### 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`

@ -3895,17 +3895,20 @@ void Game::handleDigging(GameRunData *runData,
const PointedThing &pointed, const v3s16 &nodepos, const PointedThing &pointed, const v3s16 &nodepos,
const ToolCapabilities &playeritem_toolcap, f32 dtime) 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(); LocalPlayer *player = client->getEnv().getLocalPlayer();
ClientMap &map = client->getEnv().getClientMap(); ClientMap &map = client->getEnv().getClientMap();
MapNode n = client->getEnv().getClientMap().getNodeNoEx(nodepos); 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 // NOTE: Similar piece of code exists on the server side for
// cheat detection. // cheat detection.
// Get digging parameters // Get digging parameters

@ -158,3 +158,23 @@ bool ScriptApiClient::on_dignode(v3s16 p, MapNode node)
bool blocked = lua_toboolean(L, -1); bool blocked = lua_toboolean(L, -1);
return blocked; return blocked;
} }
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;
}

@ -46,5 +46,6 @@ public:
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); bool on_dignode(v3s16 p, MapNode node);
bool on_punchnode(v3s16 p, MapNode node);
}; };
#endif #endif