[ScriptAPI] Player died

robin
Member
 
Posts: 22
Joined: Mon Jan 02, 2012 15:53

[ScriptAPI] Player died

by robin » Thu Jan 05, 2012 07:09

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
diff --git a/data/builtin.lua b/data/builtin.lua
index b2ce968..1046e93 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/src/scriptapi.cpp b/src/scriptapi.cpp
index 35b5973..546a61e 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 d107b15..af8afa3 100644
--- a/src/scriptapi.h
+++ b/src/scriptapi.h
@@ -62,6 +62,7 @@ void scriptapi_environment_on_punchnode(lua_State *L, v3s16 p, MapNode node,
 
 /* 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 8bf9eee..010a214 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -4522,6 +4522,7 @@ void Server::HandlePlayerHP(Player *player, s16 damage)
     player->hp = 0;
     
     //TODO: Throw items around
+    scriptapi_on_dieplayer(m_lua, srp);
     
     // Handle players that are not connected
     if(player->peer_id == PEER_ID_INEXISTENT){


Example Die Mod (/data/mods/die/init.lua)
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
minetest.register_on_dieplayer(function(player)
    print("Player died.")
end)


The patch applies against git-commit bc743ca7ced997e75ee72b8f493f6ffb14879aad (current master 20120105)

It creates a scriptable callback, that is executed, when a player dies. It also fills the TODO gap in server.cpp.

Feedback is welcome.

robin
Last edited by robin on Thu Jan 05, 2012 07:13, edited 1 time in total.
 

User avatar
sfan5
Member
 
Posts: 3636
Joined: Wed Aug 24, 2011 09:44
GitHub: sfan5
IRC: sfan5

by sfan5 » Thu Jan 05, 2012 07:33

+1 Should be merged
Mods: Mesecons | WorldEdit | Nuke
Minetest builds for Windows (32-bit & 64-bit)
 

User avatar
dannydark
Member
 
Posts: 428
Joined: Fri Aug 12, 2011 21:28

by dannydark » Thu Jan 05, 2012 08:58

@robin I've linked this on the patchsets page on the wiki http://c55.me/minetest/wiki/doku.php?id=patchsets
 

User avatar
redcrab
Member
 
Posts: 831
Joined: Tue Dec 13, 2011 13:45

by redcrab » Fri Jan 06, 2012 00:47

This add on is part of the mainstream now , latest celeron git master commit (06/01/2012)
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
commit 4f2c1e36a10ee00c6779a02dd4441fa680fb3497
Author: Perttu Ahola <celeron55@gmail.com>
Date:   Fri Jan 6 00:12:33 2012 +0200

    Implement minetest.register_on_dieplayer()
Last edited by redcrab on Fri Jan 06, 2012 00:49, edited 1 time in total.
0.4 for serious builder click here
Dedicated Minetest redcrab server forum at http://minetestbb.suret.net

It's nice to be important but it is more important to be nice.
 


Return to Minetest Engine

Who is online

Users browsing this forum: No registered users and 1 guest

cron