diff --git a/data/builtin.lua b/data/builtin.lua index b2ce9688..1046e934 100644 --- a/data/builtin.lua +++ b/data/builtin.lua @@ -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_generateds, minetest.register_on_generated = 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() -- END diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index 8de651ef..aa03eabe 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -101,8 +101,10 @@ -- minetest.register_on_punchnode(func(pos, node, puncher)) -- minetest.register_on_generated(func(minp, maxp)) -- minetest.register_on_newplayer(func(ObjectRef)) +-- minetest.register_on_dieplayer(func(ObjectRef)) -- minetest.register_on_respawnplayer(func(ObjectRef)) -- ^ 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.add_to_creative_inventory(itemstring) -- minetest.setting_get(name) -> string or nil diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 35b59733..8321a452 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -3638,6 +3638,32 @@ void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player) // 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) { realitycheck(L); diff --git a/src/scriptapi.h b/src/scriptapi.h index d107b15c..af8afa3d 100644 --- a/src/scriptapi.h +++ b/src/scriptapi.h @@ -62,6 +62,7 @@ void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp); /* misc */ 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); void scriptapi_get_creative_inventory(lua_State *L, ServerRemotePlayer *player); diff --git a/src/server.cpp b/src/server.cpp index d1a71bdb..d704bf86 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4537,7 +4537,8 @@ void Server::HandlePlayerHP(Player *player, s16 damage) player->hp = 0; - //TODO: Throw items around + // Trigger scripted stuff + scriptapi_on_dieplayer(m_lua, srp); // Handle players that are not connected if(player->peer_id == PEER_ID_INEXISTENT){