]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Add API function to invoke player respawn
authorsfan5 <sfan5@live.de>
Wed, 25 May 2022 17:29:11 +0000 (19:29 +0200)
committersfan5 <sfan5@live.de>
Sun, 29 May 2022 12:00:19 +0000 (14:00 +0200)
closes #12272

doc/lua_api.txt
src/script/lua_api/l_object.cpp
src/script/lua_api/l_object.h
src/server.cpp
src/server.h

index 882c9c54c89a66c03a2dda7348610be35f0de49c..15a067a5ed82ea037fda7638d5fdeaef00ae4371 100644 (file)
@@ -7099,6 +7099,8 @@ object you are working with still exists.
         * `intensity` sets the intensity of the shadows from 0 (no shadows, default) to 1 (blackness)
 * `get_lighting()`: returns the current state of lighting for the player.
     * Result is a table with the same fields as `light_definition` in `set_lighting`.
+* `respawn()`: Respawns the player using the same mechanism as the death screen,
+  including calling on_respawnplayer callbacks.
 
 `PcgRandom`
 -----------
index 39b19364eb91157d0fa9f7d90f2b90bce923b9ff..37ba1521a1d56026019b0b6406bac6d8e56dcbf4 100644 (file)
@@ -2323,6 +2323,21 @@ int ObjectRef::l_get_lighting(lua_State *L)
        return 1;
 }
 
+// respawn(self)
+int ObjectRef::l_respawn(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       ObjectRef *ref = checkobject(L, 1);
+       RemotePlayer *player = getplayer(ref);
+       if (player == nullptr)
+               return 0;
+
+       getServer(L)->RespawnPlayer(player->getPeerId());
+       lua_pushboolean(L, true);
+       return 1;
+}
+
+
 ObjectRef::ObjectRef(ServerActiveObject *object):
        m_object(object)
 {}
@@ -2478,5 +2493,7 @@ luaL_Reg ObjectRef::methods[] = {
        luamethod(ObjectRef, set_minimap_modes),
        luamethod(ObjectRef, set_lighting),
        luamethod(ObjectRef, get_lighting),
+       luamethod(ObjectRef, respawn),
+
        {0,0}
 };
index 3e4e6681a122b4b9ec80b7756b452dd133cfa971..b36bab49265767f18112667c060516e0c65ca626 100644 (file)
@@ -382,4 +382,7 @@ class ObjectRef : public ModApiBase {
        
        // get_lighting(self)
        static int l_get_lighting(lua_State *L);
+
+       // respawn(self)
+       static int l_respawn(lua_State *L);
 };
index b6330c96a839705d0ce7b02dc8ecd413b8411aaa..c775f5d07a3d4b5d02d180707b442dd50a7a43b3 100644 (file)
@@ -2784,9 +2784,10 @@ void Server::RespawnPlayer(session_t peer_id)
                        << playersao->getPlayer()->getName()
                        << " respawns" << std::endl;
 
-       playersao->setHP(playersao->accessObjectProperties()->hp_max,
+       const auto *prop = playersao->accessObjectProperties();
+       playersao->setHP(prop->hp_max,
                        PlayerHPChangeReason(PlayerHPChangeReason::RESPAWN));
-       playersao->setBreath(playersao->accessObjectProperties()->breath_max);
+       playersao->setBreath(prop->breath_max);
 
        bool repositioned = m_script->on_respawnplayer(playersao);
        if (!repositioned) {
index 71f692e872a696aaaf665fa1229e02bb2d993df2..a9c5bcb5f153969f3364a372546832470bdf1df5 100644 (file)
@@ -336,6 +336,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 
        void setLighting(RemotePlayer *player, const Lighting &lighting);
 
+       void RespawnPlayer(session_t peer_id);
+
        /* con::PeerHandler implementation. */
        void peerAdded(con::Peer *peer);
        void deletingPeer(con::Peer *peer, bool timeout);
@@ -529,7 +531,6 @@ class Server : public con::PeerHandler, public MapEventReceiver,
        */
 
        void HandlePlayerDeath(PlayerSAO* sao, const PlayerHPChangeReason &reason);
-       void RespawnPlayer(session_t peer_id);
        void DeleteClient(session_t peer_id, ClientDeletionReason reason);
        void UpdateCrafting(RemotePlayer *player);
        bool checkInteractDistance(RemotePlayer *player, const f32 d, const std::string &what);