fix(Core/Visibility): Add some safety to visibility grid container (#22837)
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user