aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-03-22 19:44:54 +0100
committerShauren <shauren.trinity@gmail.com>2014-03-22 19:44:54 +0100
commit3c16c63293e417921a34756a00cacad53f410e3c (patch)
tree6e338229c839ae5d997ff88b5accaa891c930aae
parent529cabea68ab90e34ccafa276fc40a8f2723902b (diff)
Core/Transports: Fixed crashes happening when a transport was despawned with players/dynamicobjects on it
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp15
-rw-r--r--src/server/game/Entities/Transport/Transport.h10
-rw-r--r--src/server/game/Maps/Map.cpp5
3 files changed, 25 insertions, 5 deletions
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 6d6e749fe44..a07cc5f73af 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -98,6 +98,21 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa
return true;
}
+void Transport::CleanupsBeforeDelete(bool finalCleanup /*= true*/)
+{
+ UnloadStaticPassengers();
+ while (!_passengers.empty())
+ {
+ WorldObject* obj = *_passengers.begin();
+ obj->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
+ obj->m_movementInfo.transport.Reset();
+ obj->SetTransport(NULL);
+ RemovePassenger(obj);
+ }
+
+ GameObject::CleanupsBeforeDelete(finalCleanup);
+}
+
void Transport::Update(uint32 diff)
{
uint32 const positionUpdateDelay = 200;
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index 1315d9292a5..f429d938429 100644
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -34,9 +34,11 @@ class Transport : public GameObject, public TransportBase
~Transport();
bool Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress);
- void Update(uint32 diff);
+ void CleanupsBeforeDelete(bool finalCleanup = true) OVERRIDE;
- void BuildUpdate(UpdateDataMapType& data_map);
+ void Update(uint32 diff) OVERRIDE;
+
+ void BuildUpdate(UpdateDataMapType& data_map) OVERRIDE;
void AddPassenger(WorldObject* passenger);
void RemovePassenger(WorldObject* passenger);
@@ -46,13 +48,13 @@ class Transport : public GameObject, public TransportBase
GameObject* CreateGOPassenger(uint32 guid, GameObjectData const* data);
/// This method transforms supplied transport offsets into global coordinates
- void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const
+ void CalculatePassengerPosition(float& x, float& y, float& z, float* o = NULL) const OVERRIDE
{
TransportBase::CalculatePassengerPosition(x, y, z, o, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
}
/// This method transforms supplied global coordinates into local offsets
- void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const
+ void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const OVERRIDE
{
TransportBase::CalculatePassengerOffset(x, y, z, o, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 9a26f0ae0e4..0fc56516c56 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2650,7 +2650,10 @@ void Map::RemoveAllObjectsInRemoveList()
RemoveFromMap((DynamicObject*)obj, true);
break;
case TYPEID_GAMEOBJECT:
- RemoveFromMap((GameObject*)obj, true);
+ if (Transport* transport = obj->ToGameObject()->ToTransport())
+ RemoveFromMap(transport, true);
+ else
+ RemoveFromMap(obj->ToGameObject(), true);
break;
case TYPEID_UNIT:
// in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call