Implement minetest.register_on_dieplayer()

This commit is contained in:
Perttu Ahola 2012-01-06 00:12:33 +02:00
parent bc743ca7ce
commit 4f2c1e36a1
5 changed files with 32 additions and 1 deletions

@ -435,6 +435,7 @@ minetest.registered_on_dignodes, minetest.register_on_dignode = make_registratio
minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration() minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration()
minetest.registered_on_generateds, minetest.register_on_generated = make_registration() minetest.registered_on_generateds, minetest.register_on_generated = make_registration()
minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration() minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
minetest.registered_on_dieplayers, minetest.register_on_dieplayer = make_registration()
minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration() minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
-- END -- END

@ -101,8 +101,10 @@
-- minetest.register_on_punchnode(func(pos, node, puncher)) -- minetest.register_on_punchnode(func(pos, node, puncher))
-- minetest.register_on_generated(func(minp, maxp)) -- minetest.register_on_generated(func(minp, maxp))
-- minetest.register_on_newplayer(func(ObjectRef)) -- minetest.register_on_newplayer(func(ObjectRef))
-- minetest.register_on_dieplayer(func(ObjectRef))
-- minetest.register_on_respawnplayer(func(ObjectRef)) -- minetest.register_on_respawnplayer(func(ObjectRef))
-- ^ return true in func to disable regular player placement -- ^ return true in func to disable regular player placement
-- ^ currently called _before_ repositioning of player occurs
-- minetest.register_on_chat_message(func(name, message)) -- minetest.register_on_chat_message(func(name, message))
-- minetest.add_to_creative_inventory(itemstring) -- minetest.add_to_creative_inventory(itemstring)
-- minetest.setting_get(name) -> string or nil -- minetest.setting_get(name) -> string or nil

@ -3638,6 +3638,32 @@ void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player)
// value removed, keep key for next iteration // value removed, keep key for next iteration
} }
} }
void scriptapi_on_dieplayer(lua_State *L, ServerActiveObject *player)
{
realitycheck(L);
assert(lua_checkstack(L, 20));
StackUnroller stack_unroller(L);
// Get minetest.registered_on_dieplayers
lua_getglobal(L, "minetest");
lua_getfield(L, -1, "registered_on_dieplayers");
luaL_checktype(L, -1, LUA_TTABLE);
int table = lua_gettop(L);
// Foreach
lua_pushnil(L);
while(lua_next(L, table) != 0){
// key at index -2 and value at index -1
luaL_checktype(L, -1, LUA_TFUNCTION);
// Call function
objectref_get_or_create(L, player);
if(lua_pcall(L, 1, 0, 0))
script_error(L, "error: %s", lua_tostring(L, -1));
// value removed, keep key for next iteration
}
}
bool scriptapi_on_respawnplayer(lua_State *L, ServerActiveObject *player) bool scriptapi_on_respawnplayer(lua_State *L, ServerActiveObject *player)
{ {
realitycheck(L); realitycheck(L);

@ -62,6 +62,7 @@ void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp);
/* misc */ /* misc */
void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player); void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player);
void scriptapi_on_dieplayer(lua_State *L, ServerActiveObject *player);
bool scriptapi_on_respawnplayer(lua_State *L, ServerActiveObject *player); bool scriptapi_on_respawnplayer(lua_State *L, ServerActiveObject *player);
void scriptapi_get_creative_inventory(lua_State *L, ServerRemotePlayer *player); void scriptapi_get_creative_inventory(lua_State *L, ServerRemotePlayer *player);

@ -4537,7 +4537,8 @@ void Server::HandlePlayerHP(Player *player, s16 damage)
player->hp = 0; player->hp = 0;
//TODO: Throw items around // Trigger scripted stuff
scriptapi_on_dieplayer(m_lua, srp);
// Handle players that are not connected // Handle players that are not connected
if(player->peer_id == PEER_ID_INEXISTENT){ if(player->peer_id == PEER_ID_INEXISTENT){