diff options
author | Shauren <shauren.trinity@gmail.com> | 2014-03-22 19:44:54 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2014-03-22 19:44:54 +0100 |
commit | 3c16c63293e417921a34756a00cacad53f410e3c (patch) | |
tree | 6e338229c839ae5d997ff88b5accaa891c930aae | |
parent | 529cabea68ab90e34ccafa276fc40a8f2723902b (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.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.h | 10 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 5 |
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 |