From cd87350a17bf5ee4a94c5f054eb234ed7d51bdae Mon Sep 17 00:00:00 2001 From: Takenbacon Date: Wed, 30 Jul 2025 18:49:09 -0700 Subject: [PATCH] fix(Core/Grids): Fix corpse loading after a server restart (#22594) --- src/server/game/Grids/GridObjectLoader.cpp | 10 ++-------- src/server/game/Maps/Map.cpp | 16 ++++++++++++---- src/server/game/Maps/Map.h | 8 ++++---- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/server/game/Grids/GridObjectLoader.cpp b/src/server/game/Grids/GridObjectLoader.cpp index 10172a4a1..ff960db65 100644 --- a/src/server/game/Grids/GridObjectLoader.cpp +++ b/src/server/game/Grids/GridObjectLoader.cpp @@ -84,20 +84,14 @@ void GridObjectLoader::LoadAllCellsInGrid() LoadGameObjects(cell_guids.gameobjects, _map); LoadCreatures(cell_guids.creatures, _map); - if (std::unordered_set const* corpses = _map->GetCorpsesInCell(_grid.GetId())) + if (std::unordered_set const* corpses = _map->GetCorpsesInGrid(_grid.GetId())) { for (Corpse* corpse : *corpses) { if (corpse->IsInGrid()) continue; - CellCoord cellCoord = Acore::ComputeCellCoord(corpse->GetPositionX(), corpse->GetPositionY()); - Cell cell(cellCoord); - - if (corpse->IsWorldObject()) - _grid.AddWorldObject(cell.CellX(), cell.CellY(), corpse); - else - _grid.AddGridObject(cell.CellX(), cell.CellY(), corpse); + AddObjectHelper(_map, corpse); } } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index bed34b9a5..4e731fc30 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1033,7 +1033,7 @@ void Map::UnloadAll() _transports.clear(); - for (auto& cellCorpsePair : _corpsesByCell) + for (auto& cellCorpsePair : _corpsesByGrid) { for (Corpse* corpse : cellCorpsePair.second) { @@ -1043,7 +1043,7 @@ void Map::UnloadAll() } } - _corpsesByCell.clear(); + _corpsesByGrid.clear(); _corpsesByPlayer.clear(); _corpseBones.clear(); } @@ -1848,6 +1848,12 @@ void Map::AddToActive(GameObject* d) AddToActiveHelper(d); } +template<> +void Map::AddToActive(Corpse* /*c*/) +{ + // do nothing for corpses +} + template void Map::RemoveFromActive(T* obj) { @@ -2667,7 +2673,8 @@ void Map::AddCorpse(Corpse* corpse) { corpse->SetMap(this); - _corpsesByCell[corpse->GetCellCoord().GetId()].insert(corpse); + GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY()); + _corpsesByGrid[gridCoord.GetId()].insert(corpse); if (corpse->GetType() != CORPSE_BONES) _corpsesByPlayer[corpse->GetOwnerGUID()] = corpse; else @@ -2677,6 +2684,7 @@ void Map::AddCorpse(Corpse* corpse) void Map::RemoveCorpse(Corpse* corpse) { ASSERT(corpse); + GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY()); corpse->DestroyForNearbyPlayers(); if (corpse->IsInGrid()) @@ -2687,7 +2695,7 @@ void Map::RemoveCorpse(Corpse* corpse) corpse->ResetMap(); } - _corpsesByCell[corpse->GetCellCoord().GetId()].erase(corpse); + _corpsesByGrid[gridCoord.GetId()].erase(corpse); if (corpse->GetType() != CORPSE_BONES) _corpsesByPlayer.erase(corpse->GetOwnerGUID()); else diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index c92c52cc6..53a35efb9 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -359,10 +359,10 @@ public: typedef std::unordered_multimap GameObjectBySpawnIdContainer; GameObjectBySpawnIdContainer& GetGameObjectBySpawnIdStore() { return _gameobjectBySpawnIdStore; } - [[nodiscard]] std::unordered_set const* GetCorpsesInCell(uint32 cellId) const + [[nodiscard]] std::unordered_set const* GetCorpsesInGrid(uint32 gridId) const { - auto itr = _corpsesByCell.find(cellId); - if (itr != _corpsesByCell.end()) + auto itr = _corpsesByGrid.find(gridId); + if (itr != _corpsesByGrid.end()) return &itr->second; return nullptr; @@ -631,7 +631,7 @@ private: MapStoredObjectTypesContainer _objectsStore; CreatureBySpawnIdContainer _creatureBySpawnIdStore; GameObjectBySpawnIdContainer _gameobjectBySpawnIdStore; - std::unordered_map> _corpsesByCell; + std::unordered_map> _corpsesByGrid; std::unordered_map _corpsesByPlayer; std::unordered_set _corpseBones;