Skip to content

Commit

Permalink
Script API: Check that SAOs are still usable before attempting to use…
Browse files Browse the repository at this point in the history
… them
  • Loading branch information
sfan5 committed Feb 11, 2020
1 parent b14aa1c commit 91eef64
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/content_sao.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down
4 changes: 4 additions & 0 deletions src/script/lua_api/l_object.cpp
Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down
10 changes: 2 additions & 8 deletions src/server.cpp
Expand Up @@ -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");
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 91eef64

Please sign in to comment.