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

View File

@@ -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();