diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 11952e02c..54f6abdb0 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -296,7 +296,6 @@ Creature::Creature(bool isWorldObject): Unit(isWorldObject), MovableMapObject(), ResetLootMode(); // restore default loot mode TriggerJustRespawned = false; - m_isTempWorldObject = false; _focusSpell = nullptr; m_respawnedTime = time_t(0); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 49a7854cc..06444ef46 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -376,8 +376,6 @@ public: float m_SightDistance, m_CombatDistance; - bool m_isTempWorldObject; //true when possessed - // Handling caster facing during spellcast void SetTarget(ObjectGuid guid = ObjectGuid::Empty) override; void ClearTarget() { SetTarget(); }; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 1a9d54c82..c87395169 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1072,25 +1072,6 @@ void WorldObject::Update(uint32 diff) sScriptMgr->OnWorldObjectUpdate(this, diff); } -void WorldObject::SetWorldObject(bool on) -{ - if (!IsInWorld()) - return; - - GetMap()->AddObjectToSwitchList(this, on); -} - -bool WorldObject::IsWorldObject() const -{ - if (m_isWorldObject) - return true; - - if (ToCreature() && ToCreature()->m_isTempWorldObject) - return true; - - return false; -} - void WorldObject::setActive(bool on) { if (m_isActive == on) diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index db634761a..c432d8575 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -635,9 +635,7 @@ public: [[nodiscard]] bool IsFarVisible() const { return m_isFarVisible; } [[nodiscard]] bool IsVisibilityOverridden() const { return m_visibilityDistanceOverride.has_value(); } void SetVisibilityDistanceOverride(VisibilityDistanceType type); - void SetWorldObject(bool apply); - [[nodiscard]] bool IsPermanentWorldObject() const { return m_isWorldObject; } - [[nodiscard]] bool IsWorldObject() const; + [[nodiscard]] bool IsWorldObject() const { return m_isWorldObject; } [[nodiscard]] bool IsInWintergrasp() const { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index efc71eab7..5532033dd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11212,10 +11212,8 @@ Unit* Unit::GetNextRandomRaidMemberOrPet(float radius) void Unit::AddPlayerToVision(Player* player) { if (m_sharedVision.empty()) - { setActive(true); - SetWorldObject(true); - } + m_sharedVision.push_back(player); player->m_isInSharedVisionOf.insert(this); } @@ -11225,11 +11223,10 @@ void Unit::RemovePlayerFromVision(Player* player) { m_sharedVision.remove(player); player->m_isInSharedVisionOf.erase(this); + + /// @todo: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active if (m_sharedVision.empty()) - { setActive(false); - SetWorldObject(false); - } } void Unit::RemoveBindSightAuras() diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h index eebdb3fd3..b70353112 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -52,7 +52,7 @@ class ObjectGuid; #define MAP_HALFSIZE (MAP_SIZE/2) // Creature used instead pet to simplify *::Visit templates (not required duplicate code for Creature->Pet case) -typedef TYPELIST_5(GameObject, Player, Creature/*pets*/, Corpse/*resurrectable*/, DynamicObject/*farsight target*/) AllWorldObjectTypes; +typedef TYPELIST_4(GameObject, Player, Creature/*pets*/, Corpse/*resurrectable*/) AllWorldObjectTypes; typedef TYPELIST_4(GameObject, Creature/*except pets*/, DynamicObject, Corpse/*Bones*/) AllGridObjectTypes; typedef TYPELIST_5(Creature, GameObject, DynamicObject, Pet, Corpse) AllMapStoredObjectTypes; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cf1e22543..bed34b9a5 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -175,81 +175,6 @@ void Map::AddToGrid(Corpse* obj, Cell const& cell) } } -template -void Map::SwitchGridContainers(T* /*obj*/, bool /*on*/) -{ -} - -template<> -void Map::SwitchGridContainers(Creature* obj, bool on) -{ - ASSERT(!obj->IsPermanentWorldObject()); - CellCoord p = Acore::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY()); - if (!p.IsCoordValid()) - { - LOG_ERROR("maps", "Map::SwitchGridContainers: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]", - obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord); - return; - } - - Cell cell(p); - if (!IsGridLoaded(GridCoord(cell.data.Part.grid_x, cell.data.Part.grid_y))) - return; - - LOG_DEBUG("maps", "Switch object {} from grid[{}, {}] {}", obj->GetGUID().ToString(), cell.GridX(), cell.GridY(), on); - MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY()); - ASSERT(grid); - - obj->RemoveFromGrid(); //This step is not really necessary but we want to do ASSERT in remove/add - - if (on) - { - grid->AddWorldObject(cell.CellX(), cell.CellY(), obj); - AddWorldObject(obj); - } - else - { - grid->AddGridObject(cell.CellX(), cell.CellY(), obj); - RemoveWorldObject(obj); - } - - obj->m_isTempWorldObject = on; -} - -template<> -void Map::SwitchGridContainers(GameObject* obj, bool on) -{ - ASSERT(!obj->IsPermanentWorldObject()); - CellCoord p = Acore::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY()); - if (!p.IsCoordValid()) - { - LOG_ERROR("maps", "Map::SwitchGridContainers: Object {} has invalid coordinates X:{} Y:{} grid cell [{}:{}]", - obj->GetGUID().ToString(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord); - return; - } - - Cell cell(p); - if (!IsGridLoaded(GridCoord(cell.data.Part.grid_x, cell.data.Part.grid_y))) - return; - - //LOG_DEBUG(LOG_FILTER_MAPS, "Switch object {} from grid[{}, {}] {}", obj->GetGUID().ToString(), cell.data.Part.grid_x, cell.data.Part.grid_y, on); - MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY()); - ASSERT(grid); - - obj->RemoveFromGrid(); //This step is not really necessary but we want to do ASSERT in remove/add - - if (on) - { - grid->AddWorldObject(cell.CellX(), cell.CellY(), obj); - AddWorldObject(obj); - } - else - { - grid->AddGridObject(cell.CellX(), cell.CellY(), obj); - RemoveWorldObject(obj); - } -} - template void Map::DeleteFromWorld(T* obj) { @@ -1843,49 +1768,8 @@ void Map::AddObjectToRemoveList(WorldObject* obj) //LOG_DEBUG("maps", "Object ({}) added to removing list.", obj->GetGUID().ToString()); } -void Map::AddObjectToSwitchList(WorldObject* obj, bool on) -{ - ASSERT(obj->GetMapId() == GetId() && obj->GetInstanceId() == GetInstanceId()); - // i_objectsToSwitch is iterated only in Map::RemoveAllObjectsInRemoveList() and it uses - // the contained objects only if IsCreature() , so we can return in all other cases - if (!obj->IsCreature() && !obj->IsGameObject()) - return; - - std::map::iterator itr = i_objectsToSwitch.find(obj); - if (itr == i_objectsToSwitch.end()) - i_objectsToSwitch.insert(itr, std::make_pair(obj, on)); - else if (itr->second != on) - i_objectsToSwitch.erase(itr); - else - ABORT(); -} - void Map::RemoveAllObjectsInRemoveList() { - while (!i_objectsToSwitch.empty()) - { - std::map::iterator itr = i_objectsToSwitch.begin(); - WorldObject* obj = itr->first; - bool on = itr->second; - i_objectsToSwitch.erase(itr); - - if (!obj->IsPermanentWorldObject()) - { - switch (obj->GetTypeId()) - { - case TYPEID_UNIT: - SwitchGridContainers(obj->ToCreature(), on); - break; - case TYPEID_GAMEOBJECT: - SwitchGridContainers(obj->ToGameObject(), on); - break; - default: - break; - } - } - } - - //LOG_DEBUG("maps", "Object remover 1 check."); while (!i_objectsToRemove.empty()) { std::unordered_set::iterator itr = i_objectsToRemove.begin(); @@ -1923,8 +1807,6 @@ void Map::RemoveAllObjectsInRemoveList() break; } } - - //LOG_DEBUG("maps", "Object remover 2 check."); } uint32 Map::GetPlayersCountExceptGMs() const diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 7f70020dc..c92c52cc6 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -306,7 +306,6 @@ public: } void AddObjectToRemoveList(WorldObject* obj); - void AddObjectToSwitchList(WorldObject* obj, bool on); virtual void DelayedUpdate(const uint32 diff); void resetMarkedCells() { marked_cells.reset(); } @@ -336,7 +335,6 @@ public: template void RemoveFromActive(T* obj); - template void SwitchGridContainers(T* obj, bool on); CreatureGroupHolderType CreatureGroupHolder; void UpdateIteratorBack(Player* player); @@ -577,7 +575,6 @@ private: bool i_scriptLock; std::unordered_set i_objectsToRemove; - std::map i_objectsToSwitch; std::unordered_set i_worldObjects; typedef std::multimap ScriptScheduleMap; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 74a1a1bba..dbacbb56b 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2731,7 +2731,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) // Remove old farsight if exist bool updateViewerVisibility = m_caster->RemoveDynObject(m_spellInfo->Id); - DynamicObject* dynObj = new DynamicObject(true); + DynamicObject* dynObj = new DynamicObject(false); if (!dynObj->CreateDynamicObject(m_caster->GetMap()->GenerateLowGuid(), m_caster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) { delete dynObj;