Skip to content

Commit

Permalink
Add LuaEntity on_death callback (#6177)
Browse files Browse the repository at this point in the history
Add LuaEntity on_death callback

This fixes #5474
  • Loading branch information
nerzhul committed Jul 27, 2017
1 parent ba959ce commit 550c040
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 7 deletions.
3 changes: 3 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -3864,6 +3864,9 @@ Registered entities
* `tool_capabilities`: capability table of used tool (can be `nil`)
* `dir`: unit vector of direction of punch. Always defined. Points from
the puncher to the punched.
`on_death(self, killer)`
* Called when the object dies.
* `killer`: an `ObjectRef` (can be `nil`)
* `on_rightclick(self, clicker)`
* `get_staticdata(self)`
* Should return a string that will be passed to `on_activate` when
Expand Down
15 changes: 9 additions & 6 deletions games/minimal/mods/experimental/init.lua
Expand Up @@ -317,6 +317,9 @@ minetest.register_entity("experimental:testentity", {
self.object:remove()
hitter:add_to_inventory('craft testobject1 1')
end,
on_death = function(self, killer)
print("testentity.on_death")
end
})
--
Expand Down Expand Up @@ -398,11 +401,11 @@ minetest.register_abm({
if ncpos ~= nil then
return
end
if pos.x % 16 ~= 8 or pos.z % 16 ~= 8 then
return
end
pos.y = pos.y + 1
n = minetest.get_node(pos)
print(dump(n))
Expand Down Expand Up @@ -431,7 +434,7 @@ minetest.register_abm({
return
end
nctime = clock
s0 = ncstuff[ncq]
ncq = s0[1]
s1 = ncstuff[ncq]
Expand Down Expand Up @@ -477,15 +480,15 @@ minetest.register_node("experimental:tester_node_1", {
experimental.print_to_everything("incorrect metadata found")
end
end,
on_destruct = function(pos)
experimental.print_to_everything("experimental:tester_node_1:on_destruct("..minetest.pos_to_string(pos)..")")
end,
after_destruct = function(pos)
experimental.print_to_everything("experimental:tester_node_1:after_destruct("..minetest.pos_to_string(pos)..")")
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
experimental.print_to_everything("experimental:tester_node_1:after_dig_node("..minetest.pos_to_string(pos)..")")
end,
Expand Down
4 changes: 3 additions & 1 deletion src/content_sao.cpp
Expand Up @@ -582,8 +582,10 @@ int LuaEntitySAO::punch(v3f dir,
}
}

if (getHP() == 0)
if (getHP() == 0) {
m_removed = true;
m_env->getScriptIface()->luaentity_on_death(m_id, puncher);
}



Expand Down
28 changes: 28 additions & 0 deletions src/script/cpp_api/s_entity.cpp
Expand Up @@ -262,6 +262,34 @@ bool ScriptApiEntity::luaentity_Punch(u16 id,
return retval;
}

bool ScriptApiEntity::luaentity_on_death(u16 id, ServerActiveObject *killer)
{
SCRIPTAPI_PRECHECKHEADER

int error_handler = PUSH_ERROR_HANDLER(L);

// Get core.luaentities[id]
luaentity_get(L, id);
int object = lua_gettop(L);
// State: object is at top of stack
// Get function
lua_getfield(L, -1, "on_death");
if (lua_isnil(L, -1)) {
lua_pop(L, 2); // Pop on_death and entity
return false;
}
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushvalue(L, object); // self
objectrefGetOrCreate(L, killer); // killer reference

setOriginFromTable(object);
PCALL_RES(lua_pcall(L, 6, 1, error_handler));

bool retval = lua_toboolean(L, -1);
lua_pop(L, 2); // Pop object and error handler
return retval;
}

// Calls entity:on_rightclick(ObjectRef clicker)
void ScriptApiEntity::luaentity_Rightclick(u16 id,
ServerActiveObject *clicker)
Expand Down
1 change: 1 addition & 0 deletions src/script/cpp_api/s_entity.h
Expand Up @@ -41,6 +41,7 @@ class ScriptApiEntity
bool luaentity_Punch(u16 id,
ServerActiveObject *puncher, float time_from_last_punch,
const ToolCapabilities *toolcap, v3f dir, s16 damage);
bool luaentity_on_death(u16 id, ServerActiveObject *killer);
void luaentity_Rightclick(u16 id,
ServerActiveObject *clicker);
};
Expand Down

0 comments on commit 550c040

Please sign in to comment.