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)
|
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);
|
FIND_HOOK(HOOK_ENTITY_ADD_EFFECT);
|
||||||
if (Plugins == m_Hooks.end())
|
VERIFY_HOOK;
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
|
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))
|
if ((*itr)->OnEntityAddEffect(a_Entity, a_EffectType, a_EffectDurationTicks, a_EffectIntensity, a_DistanceModifier))
|
||||||
|
@ -120,8 +120,7 @@ cClientHandle::~cClientHandle()
|
|||||||
}
|
}
|
||||||
if (World != NULL)
|
if (World != NULL)
|
||||||
{
|
{
|
||||||
m_Player->SetWorldTravellingFrom(NULL); // Make sure that the player entity is actually removed
|
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
|
||||||
World->RemovePlayer(m_Player); // Must be called before cPlayer::Destroy() as otherwise cChunk tries to delete the player, and then we do it again
|
|
||||||
m_Player->Destroy();
|
m_Player->Destroy();
|
||||||
}
|
}
|
||||||
delete m_Player;
|
delete m_Player;
|
||||||
|
@ -1627,7 +1627,7 @@ bool cPlayer::DoMoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn)
|
|||||||
|
|
||||||
// Remove player from the old world
|
// Remove player from the old world
|
||||||
SetWorldTravellingFrom(GetWorld()); // cChunk handles entity removal
|
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
|
// Queue adding player to the new world, including all the necessary adjustments to the object
|
||||||
a_World->AddPlayer(this);
|
a_World->AddPlayer(this);
|
||||||
|
@ -638,7 +638,7 @@ void cCompoGenNether::ComposeTerrain(cChunkDesc & a_ChunkDesc)
|
|||||||
CeilingDisguise = -CeilingDisguise;
|
CeilingDisguise = -CeilingDisguise;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CeilingDisguiseHeight = Height - 2 - CeilingDisguise * 3;
|
int CeilingDisguiseHeight = Height - 2 - (int)CeilingDisguise * 3;
|
||||||
|
|
||||||
for (int y = Height - 1; y > CeilingDisguiseHeight; y--)
|
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);
|
m_ChunkMap->RemoveEntity(a_Player);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -281,8 +281,9 @@ public:
|
|||||||
|
|
||||||
/** Removes the player from the world.
|
/** Removes the player from the world.
|
||||||
Removes the player from the addition queue, too, if appropriate.
|
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. */
|
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);
|
@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 */
|
/** 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 <<
|
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.AddFloat("", a_Monster->GetDropChanceBoots());
|
||||||
m_Writer.EndList();
|
m_Writer.EndList();
|
||||||
m_Writer.AddByte("CanPickUpLoot", (char)a_Monster->CanPickUpLoot());
|
m_Writer.AddByte("CanPickUpLoot", (char)a_Monster->CanPickUpLoot());
|
||||||
m_Writer.AddShort("Health", (short)a_Monster->GetHealth());
|
|
||||||
switch (a_Monster->GetMobType())
|
switch (a_Monster->GetMobType())
|
||||||
{
|
{
|
||||||
case cMonster::mtBat:
|
case cMonster::mtBat:
|
||||||
|
@ -2475,10 +2475,7 @@ bool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_N
|
|||||||
|
|
||||||
// Load health:
|
// Load health:
|
||||||
int Health = a_NBT.FindChildByName(a_TagIdx, "Health");
|
int Health = a_NBT.FindChildByName(a_TagIdx, "Health");
|
||||||
if (Health > 0)
|
a_Entity.SetHealth(Health > 0 ? a_NBT.GetShort(Health) : a_Entity.GetMaxHealth());
|
||||||
{
|
|
||||||
a_Entity.SetHealth(a_NBT.GetShort(Health));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2507,8 +2504,6 @@ bool cWSSAnvil::LoadMonsterBaseFromNBT(cMonster & a_Monster, const cParsedNBT &
|
|||||||
a_Monster.SetCanPickUpLoot(CanPickUpLoot);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user