Skip to content

Commit

Permalink
Map: Add grid persistence for large and gigantic objects
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Feb 9, 2025
1 parent 91c1c43 commit 39a1196
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ void instance_sunwell_plateau::OnObjectCreate(GameObject* go)
case GO_BOSS_COLLISION_1:
case GO_BOSS_COLLISION_2:
case GO_ICE_BARRIER:
go->GetVisibilityData().SetVisibilityDistanceOverride(VisibilityDistanceType::Gigantic);
break;
case GO_FIRE_BARRIER:
if (m_auiEncounter[TYPE_FELMYST] == DONE)
Expand Down
9 changes: 1 addition & 8 deletions src/game/Entities/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21272,8 +21272,7 @@ void Player::UpdateVisibilityOf(WorldObject const* viewPoint, WorldObject* targe
if (target->isVisibleForInState(this, viewPoint, false))
{
target->BuildCreateUpdateBlockForPlayer(updateData, this);
if (!target->GetVisibilityData().IsInfiniteVisibility())
AddAtClient(target);
AddAtClient(target);

DEBUG_FILTER_LOG(LOG_FILTER_VISIBILITY_CHANGES, "UpdateVisibilityOf: %s is visible now for player %u. Distance = %f", target->GetGuidStr().c_str(), GetGUIDLow(), GetDistance(target));
}
Expand All @@ -21282,12 +21281,6 @@ void Player::UpdateVisibilityOf(WorldObject const* viewPoint, WorldObject* targe

template<class T>
inline void UpdateVisibilityOf_helper(GuidSet& s64, T* target)
{
s64.insert(target->GetObjectGuid());
}

template<>
inline void UpdateVisibilityOf_helper(GuidSet& s64, GameObject* target)
{
if (!target->GetVisibilityData().IsInfiniteVisibility())
s64.insert(target->GetObjectGuid());
Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9247,7 +9247,7 @@ bool Unit::IsVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, boo
}

// Any units far than max visible distance for viewer or not in our map are not visible too
if (!at_same_transport && !u->GetVisibilityData().IsInfiniteVisibility()) // distance for show player/pet/creature (no transport case)
if (!at_same_transport && !GetVisibilityData().IsInfiniteVisibility()) // distance for show player/pet/creature (no transport case)
{
if (!IsWithinDistInMap(viewPoint, u->GetVisibilityData().GetVisibilityDistanceFor((WorldObject *)this), is3dDistance))
return false;
Expand Down
39 changes: 38 additions & 1 deletion src/game/Maps/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,8 @@ void Map::VisitNearbyCellsOf(WorldObject* obj, TypeContainerVisitor<MaNGOS::Obje

void Map::Update(const uint32& t_diff)
{
auto t1 = std::chrono::high_resolution_clock::now();

m_clientUpdateTimer += t_diff;
if (IsUpdateObjectTick())
++m_clientUpdateTick;
Expand Down Expand Up @@ -1066,6 +1068,37 @@ void Map::Update(const uint32& t_diff)
}
}

auto visitHomeCell = [&](WorldObject* largeObj)
{
CellPair p = MaNGOS::ComputeCellPair(largeObj->GetPositionX(), largeObj->GetPositionY());
Cell cell(p);
uint32 cell_id = (cell.GridY() * TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell.GridX();
if (!isCellMarked(cell_id))
{
markCell(cell_id);
cell.SetNoCreate();
Visit(cell, grid_object_update);
Visit(cell, world_object_update);
}
};

if (!m_infiniteObjects.empty())
{
for (auto& infiniteObject : m_infiniteObjects)
{
visitHomeCell(infiniteObject);
}
}

if (!m_largeObjects.empty())
{
for (auto& largeObjData : m_largeObjects)
{
WorldObject* largeObj = largeObjData.first;
visitHomeCell(largeObj);
}
}

// update all objects
for (auto wObj : objToUpdate)
{
Expand Down Expand Up @@ -1108,6 +1141,10 @@ void Map::Update(const uint32& t_diff)
}

m_weatherSystem->UpdateWeathers(t_diff);

auto t2 = std::chrono::high_resolution_clock::now();
auto ms_int = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
sLog.outError("Map Id %u took %u miliseconds", GetId(), ms_int.count());
}

void Map::Remove(Player* player, bool remove)
Expand Down Expand Up @@ -2652,7 +2689,7 @@ WorldObject* Map::GetWorldObject(ObjectGuid guid)
return nullptr;
}

void Map::UpdateVisibility(UpdateDataMapType update_players)
void Map::UpdateVisibility(UpdateDataMapType& update_players)
{
// newly created npcs are done every tick
std::unordered_set<Object*> visited;
Expand Down
2 changes: 1 addition & 1 deletion src/game/Maps/Map.h
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ class Map : public GridRefManager<NGridType>
void setNGrid(NGridType* grid, uint32 x, uint32 y);
void ScriptsProcess();

void UpdateVisibility(UpdateDataMapType update_players);
void UpdateVisibility(UpdateDataMapType& update_players);
void SendObjectUpdates();
std::set<Object*> m_objectsToClientUpdate;
std::set<Object*> m_objectsToClientCreateUpdate;
Expand Down

0 comments on commit 39a1196

Please sign in to comment.