summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorTakenbacon <revoke1336@live.com>2025-09-08 02:51:41 -0700
committerGitHub <noreply@github.com>2025-09-08 06:51:41 -0300
commit9e04cb9e374af0dc4903fb5470090d376d248a81 (patch)
tree548450c13493d6ce41bfd5d9db09212ab01c0337 /src/server
parentf191d71193afd956ebd0924658cf82f7b896363e (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.cpp52
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();