Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Script API: Check that SAOs are still usable before attempting to use…
- Loading branch information
Showing
with
8 additions
and
10 deletions.
-
+2
−2
src/content_sao.cpp
-
+4
−0
src/script/lua_api/l_object.cpp
-
+2
−8
src/server.cpp
|
@@ -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; |
|
|
} |
|
|
|
|
|
|
@@ -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; |
|
|
} |
|
|
|
|
|
|
@@ -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() |
|
|