diff options
author | Takenbacon <revoke1336@live.com> | 2025-09-08 02:51:41 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-08 06:51:41 -0300 |
commit | 9e04cb9e374af0dc4903fb5470090d376d248a81 (patch) | |
tree | 548450c13493d6ce41bfd5d9db09212ab01c0337 /src/server | |
parent | f191d71193afd956ebd0924658cf82f7b896363e (diff) |
fix(Core/Visibility): Add some safety to visibility grid container (#22837)
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 17ab70da0f..d8dde935e5 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(); |