From 9e04cb9e374af0dc4903fb5470090d376d248a81 Mon Sep 17 00:00:00 2001 From: Takenbacon Date: Mon, 8 Sep 2025 02:51:41 -0700 Subject: [PATCH] fix(Core/Visibility): Add some safety to visibility grid container (#22837) --- src/server/game/Maps/Map.cpp | 52 +++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 17ab70da0..d8dde935e 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -611,23 +611,40 @@ void Map::RemoveObjectFromMapUpdateList(WorldObject* obj) // Used in VisibilityDistanceType::Large and VisibilityDistanceType::Gigantic void Map::AddWorldObjectToFarVisibleMap(WorldObject* obj) { - Cell curr_cell(obj->GetPositionX(), obj->GetPositionY()); - MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); + if (Creature* creature = obj->ToCreature()) + { + if (!creature->IsInGrid()) + return; - if (obj->IsCreature()) - grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToCreature()); - else if (obj->IsGameObject()) - grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToGameObject()); + Cell curr_cell = creature->GetCurrentCell(); + MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); + grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), creature); + } + else if (GameObject* go = obj->ToGameObject()) + { + if (!go->IsInGrid()) + return; + + Cell curr_cell = go->GetCurrentCell(); + MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); + grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), go); + } } void Map::RemoveWorldObjectFromFarVisibleMap(WorldObject* obj) { - Cell curr_cell(obj->GetPositionX(), obj->GetPositionY()); - MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); - if (obj->IsCreature()) - grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToCreature()); - else if (obj->IsGameObject()) - grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToGameObject()); + if (Creature* creature = obj->ToCreature()) + { + Cell curr_cell = creature->GetCurrentCell(); + MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); + grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), creature); + } + else if (GameObject* go = obj->ToGameObject()) + { + Cell curr_cell = go->GetCurrentCell(); + MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); + grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), go); + } } // Used in VisibilityDistanceType::Infinite @@ -904,11 +921,10 @@ void Map::MoveAllCreaturesInMoveList() Cell const& old_cell = c->GetCurrentCell(); Cell new_cell(c->GetPositionX(), c->GetPositionY()); - MapGridType* oldGrid = GetMapGrid(old_cell.GridX(), old_cell.GridY()); if (c->IsFarVisible()) { - oldGrid->RemoveFarVisibleObject(old_cell.CellX(), old_cell.CellY(), c); - AddWorldObjectToFarVisibleMap(c); + // Removes via GetCurrentCell, added back in AddToGrid + RemoveWorldObjectFromFarVisibleMap(c); } c->RemoveFromGrid(); @@ -939,11 +955,11 @@ void Map::MoveAllGameObjectsInMoveList() Cell const& old_cell = go->GetCurrentCell(); Cell new_cell(go->GetPositionX(), go->GetPositionY()); - MapGridType* oldGrid = GetMapGrid(old_cell.GridX(), old_cell.GridY()); + if (go->IsFarVisible()) { - oldGrid->RemoveFarVisibleObject(old_cell.CellX(), old_cell.CellY(), go); - AddWorldObjectToFarVisibleMap(go); + // Removes via GetCurrentCell, added back in AddToGrid + RemoveWorldObjectFromFarVisibleMap(go); } go->RemoveFromGrid();