summaryrefslogtreecommitdiffstats
path: root/src/Entities
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Entities/Entity.cpp3
-rw-r--r--src/Entities/Entity.h10
-rw-r--r--src/Entities/Player.cpp1
3 files changed, 12 insertions, 2 deletions
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp
index 9110cd83b..9a8c6586d 100644
--- a/src/Entities/Entity.cpp
+++ b/src/Entities/Entity.cpp
@@ -57,6 +57,7 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, d
, m_Width(a_Width)
, m_Height(a_Height)
, m_InvulnerableTicks(0)
+ , m_IsTravellingThroughPortal(false)
{
cCSLock Lock(m_CSCount);
m_EntityCount++;
@@ -1183,7 +1184,7 @@ bool cEntity::MoveToWorld(const AString & a_WorldName, cWorld * a_World, bool a_
}
// Remove all links to the old world
- GetWorld()->RemoveEntity(this);
+ SetIsTravellingThroughPortal(true); // cChunk handles entity removal
GetWorld()->BroadcastDestroyEntity(*this);
// Queue add to new world
diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h
index 8975803a2..0293968ab 100644
--- a/src/Entities/Entity.h
+++ b/src/Entities/Entity.h
@@ -374,6 +374,12 @@ public:
virtual bool MoveToWorld(const AString & a_WorldName, cWorld * a_World = NULL, bool a_ShouldSendRespawn = true);
// tolua_end
+
+ /** Returns if the entity is travelling through a portal. Set to true by MoveToWorld and to false when the entity is removed by the old chunk */
+ bool IsTravellingThroughPortal(void) const { return m_IsTravellingThroughPortal; }
+
+ /** Sets if the entity has begun travelling through a portal or not */
+ void SetIsTravellingThroughPortal(bool a_Flag) { m_IsTravellingThroughPortal = a_Flag; }
/// Updates clients of changes in the entity.
virtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = NULL);
@@ -470,6 +476,9 @@ protected:
/** True when entity is initialised (Initialize()) and false when destroyed pending deletion (Destroy()) */
bool m_IsInitialized;
+ /** True when entity is being moved across worlds, false anytime else */
+ bool m_IsTravellingThroughPortal;
+
eEntityType m_EntityType;
cWorld * m_World;
@@ -492,7 +501,6 @@ protected:
/// Time, in ticks, since the last damage dealt by the void. Reset to zero when moving out of the void.
int m_TicksSinceLastVoidDamage;
-
virtual void Destroyed(void) {} // Called after the entity has been destroyed
/** Called in each tick to handle air-related processing i.e. drowning */
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp
index e975abdf5..b72f14f57 100644
--- a/src/Entities/Player.cpp
+++ b/src/Entities/Player.cpp
@@ -1600,6 +1600,7 @@ bool cPlayer::MoveToWorld(const AString & a_WorldName, cWorld * a_World, bool a_
}
// Remove player from the old world
+ SetIsTravellingThroughPortal(true); // cChunk handles entity removal
m_World->RemovePlayer(this);
// Queue adding player to the new world, including all the necessary adjustments to the object