mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-29 16:43:47 +00:00
feat(Core/Maps): Remove worldobject container switch functionality (#22586)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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(); };
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -175,81 +175,6 @@ void Map::AddToGrid(Corpse* obj, Cell const& cell)
|
||||
}
|
||||
}
|
||||
|
||||
template<class T>
|
||||
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<class T>
|
||||
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<WorldObject*, bool>::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<WorldObject*, bool>::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<Creature>(obj->ToCreature(), on);
|
||||
break;
|
||||
case TYPEID_GAMEOBJECT:
|
||||
SwitchGridContainers<GameObject>(obj->ToGameObject(), on);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//LOG_DEBUG("maps", "Object remover 1 check.");
|
||||
while (!i_objectsToRemove.empty())
|
||||
{
|
||||
std::unordered_set<WorldObject*>::iterator itr = i_objectsToRemove.begin();
|
||||
@@ -1923,8 +1807,6 @@ void Map::RemoveAllObjectsInRemoveList()
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//LOG_DEBUG("maps", "Object remover 2 check.");
|
||||
}
|
||||
|
||||
uint32 Map::GetPlayersCountExceptGMs() const
|
||||
|
||||
@@ -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<class T>
|
||||
void RemoveFromActive(T* obj);
|
||||
|
||||
template<class T> void SwitchGridContainers(T* obj, bool on);
|
||||
CreatureGroupHolderType CreatureGroupHolder;
|
||||
|
||||
void UpdateIteratorBack(Player* player);
|
||||
@@ -577,7 +575,6 @@ private:
|
||||
|
||||
bool i_scriptLock;
|
||||
std::unordered_set<WorldObject*> i_objectsToRemove;
|
||||
std::map<WorldObject*, bool> i_objectsToSwitch;
|
||||
std::unordered_set<WorldObject*> i_worldObjects;
|
||||
|
||||
typedef std::multimap<time_t, ScriptAction> ScriptScheduleMap;
|
||||
|
||||
@@ -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<HighGuid::DynamicObject>(), m_caster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
|
||||
{
|
||||
delete dynObj;
|
||||
|
||||
Reference in New Issue
Block a user