From 39a119658ddf623d83cd7d2c26133f7438201a0c Mon Sep 17 00:00:00 2001 From: killerwife Date: Sun, 9 Feb 2025 20:09:50 +0100 Subject: [PATCH] Map: Add grid persistence for large and gigantic objects --- .../sunwell_plateau/sunwell_plateau.cpp | 1 + src/game/Entities/Player.cpp | 9 +---- src/game/Entities/Unit.cpp | 2 +- src/game/Maps/Map.cpp | 39 ++++++++++++++++++- src/game/Maps/Map.h | 2 +- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.cpp b/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.cpp index c70ac6fa554..c5786409e76 100644 --- a/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.cpp +++ b/src/game/AI/ScriptDevAI/scripts/eastern_kingdoms/sunwell_plateau/sunwell_plateau.cpp @@ -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) diff --git a/src/game/Entities/Player.cpp b/src/game/Entities/Player.cpp index b99b4823051..54a0df5497f 100644 --- a/src/game/Entities/Player.cpp +++ b/src/game/Entities/Player.cpp @@ -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)); } @@ -21282,12 +21281,6 @@ void Player::UpdateVisibilityOf(WorldObject const* viewPoint, WorldObject* targe template 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()); diff --git a/src/game/Entities/Unit.cpp b/src/game/Entities/Unit.cpp index ea0a1baf423..ad04d613008 100644 --- a/src/game/Entities/Unit.cpp +++ b/src/game/Entities/Unit.cpp @@ -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; diff --git a/src/game/Maps/Map.cpp b/src/game/Maps/Map.cpp index 7fdea46be6e..62a0c301d10 100644 --- a/src/game/Maps/Map.cpp +++ b/src/game/Maps/Map.cpp @@ -764,6 +764,8 @@ void Map::VisitNearbyCellsOf(WorldObject* obj, TypeContainerVisitorGetPositionX(), 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) { @@ -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(t2 - t1); + sLog.outError("Map Id %u took %u miliseconds", GetId(), ms_int.count()); } void Map::Remove(Player* player, bool remove) @@ -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 visited; diff --git a/src/game/Maps/Map.h b/src/game/Maps/Map.h index c5c0be59107..42a0acaf32e 100644 --- a/src/game/Maps/Map.h +++ b/src/game/Maps/Map.h @@ -497,7 +497,7 @@ class Map : public GridRefManager void setNGrid(NGridType* grid, uint32 x, uint32 y); void ScriptsProcess(); - void UpdateVisibility(UpdateDataMapType update_players); + void UpdateVisibility(UpdateDataMapType& update_players); void SendObjectUpdates(); std::set m_objectsToClientUpdate; std::set m_objectsToClientCreateUpdate;