Server: Add reason for leave to `on_leaveplayer` callbacks
authorDiego Martinez <kaeza@users.sf.net>
Tue, 5 Jan 2016 01:49:11 +0000 (22:49 -0300)
committerparamat <mat.gregory@virginmedia.com>
Sat, 11 Jun 2016 03:17:04 +0000 (04:17 +0100)
doc/lua_api.txt
src/script/cpp_api/s_player.cpp
src/script/cpp_api/s_player.h
src/server.cpp

index ea47d0044b9481a4c9860ba2b5c2fb81073ba187..d89b0bf7b107d3a0b417bbd1902fb1837d0b23d2 100644 (file)
@@ -1912,8 +1912,9 @@ Call these functions only at load time!
      * If it returns a string, the player is disconnected with that string as reason
 * `minetest.register_on_joinplayer(func(ObjectRef))`
     * Called when a player joins the game
-* `minetest.register_on_leaveplayer(func(ObjectRef))`
+* `minetest.register_on_leaveplayer(func(ObjectRef, timed_out))`
     * Called when a player leaves the game
+    * `timed_out`: True for timeout, false for other reasons.
 * `minetest.register_on_cheat(func(ObjectRef, cheat))`
     * Called when a player cheats
     * `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
index 8074306786819898678d1681cf4a40c5bf71bc53..a8c07476cfa9ea5439770d5a019a318dc2549980 100644 (file)
@@ -135,7 +135,8 @@ void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
        runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
 }
 
-void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
+void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player,
+               bool timeout)
 {
        SCRIPTAPI_PRECHECKHEADER
 
@@ -144,7 +145,8 @@ void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
        lua_getfield(L, -1, "registered_on_leaveplayers");
        // Call callbacks
        objectrefGetOrCreate(L, player);
-       runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
+       lua_pushboolean(L, timeout);
+       runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
 }
 
 void ScriptApiPlayer::on_cheat(ServerActiveObject *player,
index 2e4dc222270569dd865a0f5e7d6bd78b48da11f0..86ee1b024b25f3b4587711a06ec09761f8bfdd5f 100644 (file)
@@ -38,7 +38,7 @@ public:
        bool on_prejoinplayer(const std::string &name, const std::string &ip,
                std::string *reason);
        void on_joinplayer(ServerActiveObject *player);
-       void on_leaveplayer(ServerActiveObject *player);
+       void on_leaveplayer(ServerActiveObject *player, bool timeout);
        void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
        bool on_punchplayer(ServerActiveObject *player,
                ServerActiveObject *hitter, float time_from_last_punch,
index ada45dc684fdb2983327bccf0c1ef7177cbdf530..f7f698d500eba882e3fab2e1198d3691f2e3d0a9 100644 (file)
@@ -2683,7 +2683,7 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
                                PlayerSAO *playersao = player->getPlayerSAO();
                                assert(playersao);
 
-                               m_script->on_leaveplayer(playersao);
+                               m_script->on_leaveplayer(playersao, reason == CDR_TIMEOUT);
 
                                playersao->disconnected();
                        }