Core/Corpses: Fixed leaking bones
Ref #15765 (cherry picked from commit bd16520ecc91d827abae7f0447cc292fe9e843e9) Conflicts: src/server/game/Entities/Corpse/Corpse.cpp
This commit is contained in:
1 parent
6664a3acc3
commit
fc9c587604
6 files changed
+43
-37
No files matched your search
@@ -1578,6 +1578,13 @@ void Map::UnloadAll()
|
||||
|
||||
RemoveFromMap<Transport>(transport, true);
|
||||
}
|
||||
|
||||
for (auto& cellCorpsePair : _corpsesByCell)
|
||||
for (Corpse* corpse : cellCorpsePair.second)
|
||||
delete corpse;
|
||||
|
||||
_corpsesByCell.clear();
|
||||
_corpsesByPlayer.clear();
|
||||
}
|
||||
|
||||
// *****************************
|
||||
@@ -3600,14 +3607,16 @@ void Map::AddCorpse(Corpse* corpse)
|
||||
{
|
||||
corpse->SetMap(this);
|
||||
|
||||
CellCoord cellCoord = Trinity::ComputeCellCoord(corpse->GetPositionX(), corpse->GetPositionY());
|
||||
_corpsesByCell[cellCoord.GetId()].insert(corpse);
|
||||
_corpsesByPlayer[corpse->GetOwnerGUID()] = corpse;
|
||||
_corpsesByCell[corpse->GetCellCoord().GetId()].insert(corpse);
|
||||
if (corpse->GetType() != CORPSE_BONES)
|
||||
_corpsesByPlayer[corpse->GetOwnerGUID()] = corpse;
|
||||
else
|
||||
_corpseBones.insert(corpse);
|
||||
}
|
||||
|
||||
void Map::RemoveCorpse(Corpse* corpse)
|
||||
{
|
||||
ASSERT(corpse && corpse->GetType() != CORPSE_BONES);
|
||||
ASSERT(corpse);
|
||||
|
||||
corpse->DestroyForNearbyPlayers();
|
||||
if (corpse->IsInGrid())
|
||||
@@ -3618,9 +3627,11 @@ void Map::RemoveCorpse(Corpse* corpse)
|
||||
corpse->ResetMap();
|
||||
}
|
||||
|
||||
CellCoord cellCoord = Trinity::ComputeCellCoord(corpse->GetPositionX(), corpse->GetPositionY());
|
||||
_corpsesByCell[cellCoord.GetId()].erase(corpse);
|
||||
_corpsesByPlayer.erase(corpse->GetOwnerGUID());
|
||||
_corpsesByCell[corpse->GetCellCoord().GetId()].erase(corpse);
|
||||
if (corpse->GetType() != CORPSE_BONES)
|
||||
_corpsesByPlayer.erase(corpse->GetOwnerGUID());
|
||||
else
|
||||
_corpseBones.erase(corpse);
|
||||
}
|
||||
|
||||
Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*= false*/)
|
||||
@@ -3651,12 +3662,12 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*=
|
||||
for (uint8 i = OBJECT_FIELD_GUID + 4; i < CORPSE_END; ++i) // don't overwrite guid
|
||||
bones->SetUInt32Value(i, corpse->GetUInt32Value(i));
|
||||
|
||||
bones->SetGridCoord(corpse->GetGridCoord());
|
||||
bones->SetCellCoord(corpse->GetCellCoord());
|
||||
bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());
|
||||
|
||||
bones->SetUInt32Value(CORPSE_FIELD_FLAGS, CORPSE_FLAG_UNK2 | CORPSE_FLAG_BONES);
|
||||
bones->SetGuidValue(CORPSE_FIELD_OWNER, ObjectGuid::Empty);
|
||||
bones->SetGuidValue(OBJECT_FIELD_DATA, corpse->GetGuidValue(OBJECT_FIELD_DATA));
|
||||
bones->SetGuidValue(OBJECT_FIELD_DATA, ObjectGuid::Empty);
|
||||
|
||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
if (corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i))
|
||||
@@ -3664,6 +3675,8 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*=
|
||||
|
||||
bones->CopyPhaseFrom(corpse);
|
||||
|
||||
AddCorpse(bones);
|
||||
|
||||
// add bones in grid store if grid loaded where corpse placed
|
||||
AddToMap(bones);
|
||||
}
|
||||
@@ -3687,6 +3700,17 @@ void Map::RemoveOldCorpses()
|
||||
|
||||
for (ObjectGuid const& ownerGuid : corpses)
|
||||
ConvertCorpseToBones(ownerGuid);
|
||||
|
||||
std::vector<Corpse*> expiredBones;
|
||||
for (Corpse* bones : _corpseBones)
|
||||
if (bones->IsExpired(now))
|
||||
expiredBones.push_back(bones);
|
||||
|
||||
for (Corpse* bones : expiredBones)
|
||||
{
|
||||
RemoveCorpse(bones);
|
||||
delete bones;
|
||||
}
|
||||
}
|
||||
|
||||
void Map::SendZoneDynamicInfo(Player* player)
|
||||
|
||||
Reference in new issue
Block a user