Slight cleanup after portals
This commit is contained in:
parent
30e64ed4d8
commit
4f5d73b770
@ -476,11 +476,9 @@ bool cPluginManager::CallHookDisconnect(cClientHandle & a_Client, const AString
|
||||
|
||||
bool cPluginManager::CallHookEntityAddEffect(cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier)
|
||||
{
|
||||
HookMap::iterator Plugins = m_Hooks.find(HOOK_ENTITY_ADD_EFFECT);
|
||||
if (Plugins == m_Hooks.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
FIND_HOOK(HOOK_ENTITY_ADD_EFFECT);
|
||||
VERIFY_HOOK;
|
||||
|
||||
for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
|
||||
{
|
||||
if ((*itr)->OnEntityAddEffect(a_Entity, a_EffectType, a_EffectDurationTicks, a_EffectIntensity, a_DistanceModifier))
|
||||
|
@ -120,8 +120,7 @@ cClientHandle::~cClientHandle()
|
||||
}
|
||||
if (World != NULL)
|
||||
{
|
||||
m_Player->SetWorldTravellingFrom(NULL); // Make sure that the player entity is actually removed
|
||||
World->RemovePlayer(m_Player); // Must be called before cPlayer::Destroy() as otherwise cChunk tries to delete the player, and then we do it again
|
||||
World->RemovePlayer(m_Player, true); // Must be called before cPlayer::Destroy() as otherwise cChunk tries to delete the player, and then we do it again
|
||||
m_Player->Destroy();
|
||||
}
|
||||
delete m_Player;
|
||||
|
@ -1627,7 +1627,7 @@ bool cPlayer::DoMoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn)
|
||||
|
||||
// Remove player from the old world
|
||||
SetWorldTravellingFrom(GetWorld()); // cChunk handles entity removal
|
||||
GetWorld()->RemovePlayer(this);
|
||||
GetWorld()->RemovePlayer(this, false);
|
||||
|
||||
// Queue adding player to the new world, including all the necessary adjustments to the object
|
||||
a_World->AddPlayer(this);
|
||||
|
@ -638,7 +638,7 @@ void cCompoGenNether::ComposeTerrain(cChunkDesc & a_ChunkDesc)
|
||||
CeilingDisguise = -CeilingDisguise;
|
||||
}
|
||||
|
||||
int CeilingDisguiseHeight = Height - 2 - CeilingDisguise * 3;
|
||||
int CeilingDisguiseHeight = Height - 2 - (int)CeilingDisguise * 3;
|
||||
|
||||
for (int y = Height - 1; y > CeilingDisguiseHeight; y--)
|
||||
{
|
||||
|
@ -2465,10 +2465,12 @@ void cWorld::AddPlayer(cPlayer * a_Player)
|
||||
|
||||
|
||||
|
||||
void cWorld::RemovePlayer(cPlayer * a_Player)
|
||||
void cWorld::RemovePlayer(cPlayer * a_Player, bool a_RemoveFromChunk)
|
||||
{
|
||||
if (!a_Player->IsWorldTravellingFrom(this))
|
||||
if (a_RemoveFromChunk)
|
||||
{
|
||||
// To prevent iterator invalidations when an entity goes through a portal and calls this function whilst being ticked by cChunk
|
||||
// we should not change cChunk's entity list if asked not to
|
||||
m_ChunkMap->RemoveEntity(a_Player);
|
||||
}
|
||||
{
|
||||
|
@ -281,8 +281,9 @@ public:
|
||||
|
||||
/** Removes the player from the world.
|
||||
Removes the player from the addition queue, too, if appropriate.
|
||||
If the player has a ClientHandle, the ClientHandle is removed from all chunks in the world and will not be ticked by this world anymore. */
|
||||
void RemovePlayer(cPlayer * a_Player);
|
||||
If the player has a ClientHandle, the ClientHandle is removed from all chunks in the world and will not be ticked by this world anymore.
|
||||
@param a_RemoveFromChunk determines if the entity should be removed from its chunk as well. Should be false when ticking from cChunk. */
|
||||
void RemovePlayer(cPlayer * a_Player, bool a_RemoveFromChunk);
|
||||
|
||||
/** Calls the callback for each player in the list; returns true if all players processed, false if the callback aborted by returning true */
|
||||
virtual bool ForEachPlayer(cPlayerListCallback & a_Callback) override; // >> EXPORTED IN MANUALBINDINGS <<
|
||||
|
@ -486,7 +486,6 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
|
||||
m_Writer.AddFloat("", a_Monster->GetDropChanceBoots());
|
||||
m_Writer.EndList();
|
||||
m_Writer.AddByte("CanPickUpLoot", (char)a_Monster->CanPickUpLoot());
|
||||
m_Writer.AddShort("Health", (short)a_Monster->GetHealth());
|
||||
switch (a_Monster->GetMobType())
|
||||
{
|
||||
case cMonster::mtBat:
|
||||
|
@ -2475,10 +2475,7 @@ bool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_N
|
||||
|
||||
// Load health:
|
||||
int Health = a_NBT.FindChildByName(a_TagIdx, "Health");
|
||||
if (Health > 0)
|
||||
{
|
||||
a_Entity.SetHealth(a_NBT.GetShort(Health));
|
||||
}
|
||||
a_Entity.SetHealth(Health > 0 ? a_NBT.GetShort(Health) : a_Entity.GetMaxHealth());
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -2507,8 +2504,6 @@ bool cWSSAnvil::LoadMonsterBaseFromNBT(cMonster & a_Monster, const cParsedNBT &
|
||||
a_Monster.SetCanPickUpLoot(CanPickUpLoot);
|
||||
}
|
||||
|
||||
int HealthTag = a_NBT.FindChildByName(a_TagIdx, "Health");
|
||||
a_Monster.SetHealth(HealthTag > 0 ? a_NBT.GetShort(HealthTag) : a_Monster.GetMaxHealth());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user