diff options
author | Takenbacon <revoke1336@live.com> | 2025-08-08 12:07:56 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-08 16:07:56 -0300 |
commit | c97cee1e4fcc9bb6fcae82e1775cdc9a32af8ba6 (patch) | |
tree | 3c1deb5ab82ec6c88c02af938abdf1e255213beb | |
parent | b5fa1aae276f229aa3b366b82f828434a07fd21b (diff) |
feat(Core/Maps): Remove active objects nearby cell marking handling (#22585)
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Grids/GridObjectLoader.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 81 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 38 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_debug.cpp | 4 |
5 files changed, 6 insertions, 140 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 91889565fc..c8fd3d8514 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1083,31 +1083,14 @@ void WorldObject::setActive(bool on) m_isActive = on; - if (on && !IsInWorld()) + if (!on || !IsInWorld()) return; Map* map = FindMap(); if (!map) return; - if (on) - { - if (IsCreature()) - map->AddToActive(this->ToCreature()); - else if (IsDynamicObject()) - map->AddToActive((DynamicObject*)this); - else if (IsGameObject()) - map->AddToActive((GameObject*)this); - } - else - { - if (IsCreature()) - map->RemoveFromActive(this->ToCreature()); - else if (IsDynamicObject()) - map->RemoveFromActive((DynamicObject*)this); - else if (IsGameObject()) - map->RemoveFromActive((GameObject*)this); - } + map->AddObjectToPendingUpdateList(this); } void WorldObject::SetVisibilityDistanceOverride(VisibilityDistanceType type) diff --git a/src/server/game/Grids/GridObjectLoader.cpp b/src/server/game/Grids/GridObjectLoader.cpp index ff960db654..248551069c 100644 --- a/src/server/game/Grids/GridObjectLoader.cpp +++ b/src/server/game/Grids/GridObjectLoader.cpp @@ -32,8 +32,6 @@ void GridObjectLoader::AddObjectHelper(Map* map, T* obj) map->AddToGrid(obj, cell); obj->AddToWorld(); - if (obj->isActiveObject()) - map->AddToActive(obj); } void GridObjectLoader::LoadCreatures(CellGuidSet const& guid_set, Map* map) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index e82fbcaed0..6216613574 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -73,8 +73,7 @@ Map::~Map() Map::Map(uint32 id, uint32 InstanceId, uint8 SpawnMode, Map* _parent) : _mapGridManager(this), i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId), - m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), - _instanceResetPeriod(0), m_activeNonPlayersIter(m_activeNonPlayers.end()), + m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), _instanceResetPeriod(0), _transportsUpdateIter(_transports.end()), i_scriptLock(false), _defaultLight(GetDefaultMapLight(id)) { m_parentMap = (_parent ? _parent : this); @@ -357,9 +356,6 @@ bool Map::AddToMap(T* obj, bool checkTransport) InitializeObject(obj); - if (obj->isActiveObject()) - AddToActive(obj); - //something, such as vehicle, needs to be update immediately //also, trigger needs to cast spell, if not update, cannot see visual obj->UpdateObjectVisibility(true); @@ -393,9 +389,6 @@ bool Map::AddToMap(MotionTransport* obj, bool /*checkTransport*/) obj->AddToWorld(); - if (obj->isActiveObject()) - AddToActive(obj); - _transports.insert(obj); // Broadcast creation to players @@ -511,19 +504,6 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) } } - if (_updatableObjectListRecheckTimer.Passed()) - { - // Mark all cells near active objects - for (m_activeNonPlayersIter = m_activeNonPlayers.begin(); m_activeNonPlayersIter != m_activeNonPlayers.end(); ++m_activeNonPlayersIter) - { - WorldObject* obj = *m_activeNonPlayersIter; - if (!obj || !obj->IsInWorld()) - continue; - - MarkNearbyCellsOf(obj); - } - } - UpdateNonPlayerObjects(t_diff); SendObjectUpdates(); @@ -699,9 +679,6 @@ void Map::RemoveFromMap(T* obj, bool remove) { obj->RemoveFromWorld(); - if (obj->isActiveObject()) - RemoveFromActive(obj); - obj->RemoveFromGrid(); obj->ResetMap(); @@ -717,8 +694,6 @@ template<> void Map::RemoveFromMap(MotionTransport* obj, bool remove) { obj->RemoveFromWorld(); - if (obj->isActiveObject()) - RemoveFromActive(obj); Map::PlayerList const& players = GetPlayers(); if (!players.IsEmpty()) @@ -1820,60 +1795,6 @@ void Map::SendToPlayers(WorldPacket const* data) const itr->GetSource()->GetSession()->SendPacket(data); } -template<class T> -void Map::AddToActive(T* obj) -{ - AddToActiveHelper(obj); -} - -template <> -void Map::AddToActive(Creature* c) -{ - AddToActiveHelper(c); -} - -template<> -void Map::AddToActive(DynamicObject* d) -{ - AddToActiveHelper(d); -} - -template<> -void Map::AddToActive(GameObject* d) -{ - AddToActiveHelper(d); -} - -template<> -void Map::AddToActive(Corpse* /*c*/) -{ - // do nothing for corpses -} - -template<class T> -void Map::RemoveFromActive(T* obj) -{ - RemoveFromActiveHelper(obj); -} - -template <> -void Map::RemoveFromActive(Creature* c) -{ - RemoveFromActiveHelper(c); -} - -template<> -void Map::RemoveFromActive(DynamicObject* obj) -{ - RemoveFromActiveHelper(obj); -} - -template<> -void Map::RemoveFromActive(GameObject* obj) -{ - RemoveFromActiveHelper(obj); -} - template bool Map::AddToMap(Corpse*, bool); template bool Map::AddToMap(Creature*, bool); template bool Map::AddToMap(GameObject*, bool); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 53a35efb9c..d5bb8c6b55 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -327,14 +327,6 @@ public: void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target); void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target); - // must called with AddToWorld - template<class T> - void AddToActive(T* obj); - - // must called with RemoveFromWorld - template<class T> - void RemoveFromActive(T* obj); - CreatureGroupHolderType CreatureGroupHolder; void UpdateIteratorBack(Player* player); @@ -490,10 +482,7 @@ public: _updateObjects.erase(obj); } - std::size_t GetActiveNonPlayersCount() const - { - return m_activeNonPlayers.size(); - } + size_t GetUpdateObjectsCount() const { return _updateObjects.size(); } virtual std::string GetDebugInfo() const; @@ -549,10 +538,6 @@ protected: MapRefMgr m_mapRefMgr; MapRefMgr::iterator m_mapRefIter; - typedef std::set<WorldObject*> ActiveNonPlayers; - ActiveNonPlayers m_activeNonPlayers; - ActiveNonPlayers::iterator m_activeNonPlayersIter; - // Objects that must update even in inactive grids without activating them TransportsContainer _transports; TransportsContainer::iterator _transportsUpdateIter; @@ -583,27 +568,6 @@ private: template<class T> void DeleteFromWorld(T*); - void AddToActiveHelper(WorldObject* obj) - { - m_activeNonPlayers.insert(obj); - } - - void RemoveFromActiveHelper(WorldObject* obj) - { - // Map::Update for active object in proccess - if (m_activeNonPlayersIter != m_activeNonPlayers.end()) - { - ActiveNonPlayers::iterator itr = m_activeNonPlayers.find(obj); - if (itr == m_activeNonPlayers.end()) - return; - if (itr == m_activeNonPlayersIter) - ++m_activeNonPlayersIter; - m_activeNonPlayers.erase(itr); - } - else - m_activeNonPlayers.erase(obj); - } - void UpdateNonPlayerObjects(uint32 const diff); void _AddObjectToUpdateList(WorldObject* obj); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 8a6def72a7..33acdde9a5 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1347,11 +1347,11 @@ public: static void HandleDebugObjectCountMap(ChatHandler* handler, Map* map) { - handler->PSendSysMessage("Map Id: {} Name: '{}' Instance Id: {} Creatures: {} GameObjects: {} SetActive Objects: {}", + handler->PSendSysMessage("Map Id: {} Name: '{}' Instance Id: {} Creatures: {} GameObjects: {} Update Objects: {}", map->GetId(), map->GetMapName(), map->GetInstanceId(), uint64(map->GetObjectsStore().Size<Creature>()), uint64(map->GetObjectsStore().Size<GameObject>()), - uint64(map->GetActiveNonPlayersCount())); + uint64(map->GetUpdateObjectsCount())); CreatureCountWorker worker; TypeContainerVisitor<CreatureCountWorker, MapStoredObjectTypesContainer> visitor(worker); |