Script API: Check that SAOs are still usable before attempting to use them
authorsfan5 <sfan5@live.de>
Tue, 11 Feb 2020 12:23:03 +0000 (13:23 +0100)
committersfan5 <sfan5@live.de>
Tue, 11 Feb 2020 18:21:12 +0000 (19:21 +0100)
src/content_sao.cpp
src/script/lua_api/l_object.cpp
src/server.cpp

index 43c784b426fe475d267b8e5703c13e78702ba4db..5119223a7c43493addcdfd1b02c74eaf27f4362b 100644 (file)
@@ -864,7 +864,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
        m_peer_id(peer_id_),
        m_is_singleplayer(is_singleplayer)
 {
-       assert(m_peer_id != 0); // pre-condition
+       SANITY_CHECK(m_peer_id != PEER_ID_INEXISTENT);
 
        m_prop.hp_max = PLAYER_MAX_HP_DEFAULT;
        m_prop.breath_max = PLAYER_MAX_BREATH_DEFAULT;
@@ -1393,7 +1393,7 @@ bool PlayerSAO::setWieldedItem(const ItemStack &item)
 
 void PlayerSAO::disconnected()
 {
-       m_peer_id = 0;
+       m_peer_id = PEER_ID_INEXISTENT;
        m_pending_removal = true;
 }
 
index efdb345c9b577edde90546dfb4142d113d3d745e..f23282a950bb665e3d175acd36af980e30c2652f 100644 (file)
@@ -60,6 +60,8 @@ LuaEntitySAO* ObjectRef::getluaobject(ObjectRef *ref)
                return NULL;
        if (obj->getType() != ACTIVEOBJECT_TYPE_LUAENTITY)
                return NULL;
+       if (obj->isGone())
+               return NULL;
        return (LuaEntitySAO*)obj;
 }
 
@@ -70,6 +72,8 @@ PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref)
                return NULL;
        if (obj->getType() != ACTIVEOBJECT_TYPE_PLAYER)
                return NULL;
+       if (obj->isGone())
+               return NULL;
        return (PlayerSAO*)obj;
 }
 
index f1613cffe4bc11f1d564b1e42b594f3bc0da2a56..c1f27149004ee33d7852955d365f0f06312dd44b 100644 (file)
@@ -1768,10 +1768,7 @@ void Server::SendTimeOfDay(session_t peer_id, u16 time, f32 time_speed)
 void Server::SendPlayerHP(session_t peer_id)
 {
        PlayerSAO *playersao = getPlayerSAO(peer_id);
-       // In some rare case if the player is disconnected
-       // while Lua call l_punch, for example, this can be NULL
-       if (!playersao)
-               return;
+       assert(playersao);
 
        SendHP(peer_id, playersao->getHP());
        m_script->player_event(playersao,"health_changed");
@@ -2701,10 +2698,7 @@ void Server::sendDetachedInventories(session_t peer_id, bool incremental)
 void Server::DiePlayer(session_t peer_id, const PlayerHPChangeReason &reason)
 {
        PlayerSAO *playersao = getPlayerSAO(peer_id);
-       // In some rare cases this can be NULL -- if the player is disconnected
-       // when a Lua function modifies l_punch, for example
-       if (!playersao)
-               return;
+       assert(playersao);
 
        infostream << "Server::DiePlayer(): Player "
                        << playersao->getPlayer()->getName()