fix(Core/Visibility): Add some safety to visibility grid container (#22837)

This commit is contained in:
Takenbacon
2025-09-08 02:51:41 -07:00
committed by GitHub
parent f191d71193
commit 9e04cb9e37
+34 -18
View File
@@ -611,23 +611,40 @@ void Map::RemoveObjectFromMapUpdateList(WorldObject* obj)
// Used in VisibilityDistanceType::Large and VisibilityDistanceType::Gigantic // Used in VisibilityDistanceType::Large and VisibilityDistanceType::Gigantic
void Map::AddWorldObjectToFarVisibleMap(WorldObject* obj) void Map::AddWorldObjectToFarVisibleMap(WorldObject* obj)
{ {
Cell curr_cell(obj->GetPositionX(), obj->GetPositionY()); if (Creature* creature = obj->ToCreature())
MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); {
if (!creature->IsInGrid())
return;
if (obj->IsCreature()) Cell curr_cell = creature->GetCurrentCell();
grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToCreature()); MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY());
else if (obj->IsGameObject()) grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), creature);
grid->AddFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToGameObject()); }
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) void Map::RemoveWorldObjectFromFarVisibleMap(WorldObject* obj)
{ {
Cell curr_cell(obj->GetPositionX(), obj->GetPositionY()); if (Creature* creature = obj->ToCreature())
MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY()); {
if (obj->IsCreature()) Cell curr_cell = creature->GetCurrentCell();
grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToCreature()); MapGridType* grid = GetMapGrid(curr_cell.GridX(), curr_cell.GridY());
else if (obj->IsGameObject()) grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), creature);
grid->RemoveFarVisibleObject(curr_cell.CellX(), curr_cell.CellY(), obj->ToGameObject()); }
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 // Used in VisibilityDistanceType::Infinite
@@ -904,11 +921,10 @@ void Map::MoveAllCreaturesInMoveList()
Cell const& old_cell = c->GetCurrentCell(); Cell const& old_cell = c->GetCurrentCell();
Cell new_cell(c->GetPositionX(), c->GetPositionY()); Cell new_cell(c->GetPositionX(), c->GetPositionY());
MapGridType* oldGrid = GetMapGrid(old_cell.GridX(), old_cell.GridY());
if (c->IsFarVisible()) if (c->IsFarVisible())
{ {
oldGrid->RemoveFarVisibleObject(old_cell.CellX(), old_cell.CellY(), c); // Removes via GetCurrentCell, added back in AddToGrid
AddWorldObjectToFarVisibleMap(c); RemoveWorldObjectFromFarVisibleMap(c);
} }
c->RemoveFromGrid(); c->RemoveFromGrid();
@@ -939,11 +955,11 @@ void Map::MoveAllGameObjectsInMoveList()
Cell const& old_cell = go->GetCurrentCell(); Cell const& old_cell = go->GetCurrentCell();
Cell new_cell(go->GetPositionX(), go->GetPositionY()); Cell new_cell(go->GetPositionX(), go->GetPositionY());
MapGridType* oldGrid = GetMapGrid(old_cell.GridX(), old_cell.GridY());
if (go->IsFarVisible()) if (go->IsFarVisible())
{ {
oldGrid->RemoveFarVisibleObject(old_cell.CellX(), old_cell.CellY(), go); // Removes via GetCurrentCell, added back in AddToGrid
AddWorldObjectToFarVisibleMap(go); RemoveWorldObjectFromFarVisibleMap(go);
} }
go->RemoveFromGrid(); go->RemoveFromGrid();