From b7d37daa74701096208aada4463aeba3ec2a645a Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 29 Oct 2015 18:46:37 +0100 Subject: [PATCH] Core/Corpses: Fixed map crash happening during map unload when there are corpses inside (cherry picked from commit 1d17475791cae66beafda1e2c3198a66d355086f) --- src/server/game/Entities/Corpse/Corpse.cpp | 2 +- src/server/game/Entities/Corpse/Corpse.h | 2 +- src/server/game/Maps/Map.cpp | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 3eb7164245c..adc84c75548 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -58,7 +58,7 @@ void Corpse::RemoveFromWorld() WorldObject::RemoveFromWorld(); } -bool Corpse::Create(ObjectGuid::LowType guidlow, Map* map) +bool Corpse::Create(ObjectGuid::LowType guidlow) { Object::_Create(guidlow, 0, HighGuid::Corpse); return true; diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h index c135548bee3..7f2608e4bf3 100644 --- a/src/server/game/Entities/Corpse/Corpse.h +++ b/src/server/game/Entities/Corpse/Corpse.h @@ -55,7 +55,7 @@ class Corpse : public WorldObject, public GridObject void AddToWorld() override; void RemoveFromWorld() override; - bool Create(ObjectGuid::LowType guidlow, Map* map); + bool Create(ObjectGuid::LowType guidlow); bool Create(ObjectGuid::LowType guidlow, Player* owner); void SaveToDB(); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 405b0b7152c..217e1927786 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1580,11 +1580,18 @@ void Map::UnloadAll() } for (auto& cellCorpsePair : _corpsesByCell) + { for (Corpse* corpse : cellCorpsePair.second) + { + corpse->RemoveFromWorld(); + corpse->ResetMap(); delete corpse; + } + } _corpsesByCell.clear(); _corpsesByPlayer.clear(); + _corpseBones.clear(); } // ***************************** @@ -3657,7 +3664,7 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*= { // Create bones, don't change Corpse bones = new Corpse(); - bones->Create(corpse->GetGUID().GetCounter(), this); + bones->Create(corpse->GetGUID().GetCounter()); for (uint8 i = OBJECT_FIELD_GUID + 4; i < CORPSE_END; ++i) // don't overwrite guid bones->SetUInt32Value(i, corpse->GetUInt32Value(i));