diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 599f486b94..adb0657802 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -78,8 +78,7 @@ bool AreaTrigger::CreateAreaTrigger(uint32 guidlow, uint32 triggerEntry, Unit* c SetFloatValue(AREATRIGGER_FINAL_POS + 1, pos.GetPositionY()); SetFloatValue(AREATRIGGER_FINAL_POS + 2, pos.GetPositionZ()); - for (auto phase : caster->GetPhases()) - SetInPhase(phase, false, true); + CopyPhaseFrom(caster); if (!GetMap()->AddToMap(this)) return false; diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 285da6870e..c821cbd0d4 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -92,8 +92,7 @@ bool Corpse::Create(uint32 guidlow, Player* owner) _gridCoord = Trinity::ComputeGridCoord(GetPositionX(), GetPositionY()); - for (auto itr : owner->GetPhases()) - SetInPhase(itr, false, true); + CopyPhaseFrom(owner); return true; } @@ -124,7 +123,7 @@ void Corpse::SaveToDB() stmt->setUInt32(index++, GetInstanceId()); // instanceId trans->Append(stmt); - for (auto phaseId : GetPhases()) + for (uint32 phaseId : GetPhases()) { index = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE_PHASES); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index eecafed30f..6592e2a6b8 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2191,10 +2191,6 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert } } - std::set phases; - if (summoner) - phases = summoner->GetPhases(); - TempSummon* summon = NULL; switch (mask) { @@ -2222,8 +2218,7 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert } // Set the summon to the summoner's phase - for (auto phaseId : phases) - summon->SetInPhase(phaseId, false, true); + summon->CopyPhaseFrom(summoner); summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId); @@ -2319,8 +2314,7 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, float x, float y, float return NULL; } - for (auto phase : GetPhases()) - go->SetInPhase(phase, false, true); + go->CopyPhaseFrom(this); go->SetRespawnTime(respawnTime); if (GetTypeId() == TYPEID_PLAYER || GetTypeId() == TYPEID_UNIT) //not sure how to handle this @@ -2737,6 +2731,18 @@ void WorldObject::SetInPhase(uint32 id, bool update, bool apply) UpdateObjectVisibility(); } +void WorldObject::CopyPhaseFrom(WorldObject* obj, bool update) +{ + if (!obj) + return; + + for (uint32 phase : obj->GetPhases()) + SetInPhase(phase, false, true); + + if (update && IsInWorld()) + UpdateObjectVisibility(); +} + bool WorldObject::IsInPhase(WorldObject const* obj) const { // PhaseId 169 is the default fallback phase diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index e0da835496..ecfdec36e0 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -593,6 +593,7 @@ class WorldObject : public Object, public WorldLocation virtual void SetPhaseMask(uint32 newPhaseMask, bool update); virtual void SetInPhase(uint32 id, bool update, bool apply); + void CopyPhaseFrom(WorldObject* obj, bool update = false); void RebuildTerrainSwaps(); uint32 GetPhaseMask() const { return m_phaseMask; } bool IsInPhase(uint32 phase) const { return _phases.find(phase) != _phases.end(); } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 3a814634c0..d97fc4d8f6 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -179,8 +179,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c if (!Create(guid, map, petEntry, petId)) return false; - for (auto itr : owner->GetPhases()) - SetInPhase(itr, false, true); + CopyPhaseFrom(owner); setPetType(petType); setFaction(owner->getFaction()); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 585ca7813a..9788f5ef43 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27618,8 +27618,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy return NULL; } - for (auto itr : GetPhases()) - pet->SetInPhase(itr, false, true); + pet->CopyPhaseFrom(this); pet->SetCreatorGUID(GetGUID()); pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, getFaction()); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index dd4dbb41f8..866b245ae7 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -316,8 +316,7 @@ Creature* Transport::CreateNPCPassenger(uint32 guid, CreatureData const* data) for (auto phase : GetPhasesForGroup(data->phaseGroup)) creature->SetInPhase(phase, false, true); else - for (auto phase : GetPhases()) // Set the creature to the transport's phases - creature->SetInPhase(phase, false, true); + creature->CopyPhaseFrom(this); if (!map->AddToMap(creature)) { @@ -459,8 +458,8 @@ TempSummon* Transport::SummonPassenger(uint32 entry, Position const& pos, TempSu return NULL; } - for (auto itr : phases) - summon->SetInPhase(itr, false, true); + for (uint32 phase : phases) + summon->SetInPhase(phase, false, true); summon->SetUInt32Value(UNIT_CREATED_BY_SPELL, spellId); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c604f88de6..ecf14089b9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13404,8 +13404,7 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id) return false; } - for (auto phase : GetPhases()) - pet->SetInPhase(phase, false, true); + pet->CopyPhaseFrom(this); pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); // this enables pet details window (Shift+P) diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index bb1401c26c..3d6f1abcca 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -413,8 +413,7 @@ Corpse* ObjectAccessor::ConvertCorpseForPlayer(ObjectGuid player_guid, bool insi bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0); } - for (auto phaseId : corpse->GetPhases()) - bones->SetInPhase(phaseId, false, true); + bones->CopyPhaseFrom(corpse); // add bones in grid store if grid loaded where corpse placed map->AddToMap(bones); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 6f800c4ed1..732520f4b3 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3213,8 +3213,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) return; } - for (auto phase : m_caster->GetPhases()) - pGameObj->SetInPhase(phase, false, true); + pGameObj->CopyPhaseFrom(m_caster); int32 duration = m_spellInfo->GetDuration(); @@ -3237,8 +3236,7 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) if (linkedGO->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, map, m_caster->GetPhaseMask(), x, y, z, target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, GO_STATE_READY)) { - for (auto phase : m_caster->GetPhases()) - linkedGO->SetInPhase(phase, false, true); + linkedGO->CopyPhaseFrom(m_caster); linkedGO->SetRespawnTime(duration > 0 ? duration/IN_MILLISECONDS : 0); linkedGO->SetSpellId(m_spellInfo->Id); @@ -3871,8 +3869,7 @@ void Spell::EffectDuel(SpellEffIndex effIndex) return; } - for (auto phase : m_caster->GetPhases()) - pGameObj->SetInPhase(phase, false, true); + pGameObj->CopyPhaseFrom(m_caster); pGameObj->SetUInt32Value(GAMEOBJECT_FACTION, m_caster->getFaction()); pGameObj->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel()+1); @@ -4230,8 +4227,7 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) return; } - for (auto phase : m_caster->GetPhases()) - go->SetInPhase(phase, false, true); + go->CopyPhaseFrom(m_caster); //pGameObj->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel()); int32 duration = m_spellInfo->GetDuration(); @@ -4863,8 +4859,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) return; } - for (auto phase : m_caster->GetPhases()) - pGameObj->SetInPhase(phase, false, true); + pGameObj->CopyPhaseFrom(m_caster); int32 duration = m_spellInfo->GetDuration(); @@ -4928,8 +4923,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) if (linkedGO->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT), linkedEntry, cMap, 0, fx, fy, fz, m_caster->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 100, GO_STATE_READY)) { - for (auto phase : m_caster->GetPhases()) - linkedGO->SetInPhase(phase, false, true); + linkedGO->CopyPhaseFrom(m_caster); linkedGO->SetRespawnTime(duration > 0 ? duration/IN_MILLISECONDS : 0); //linkedGO->SetUInt32Value(GAMEOBJECT_LEVEL, m_caster->getLevel()); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 862b683597..cb4296a780 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -934,8 +934,7 @@ public: return false; } - for (auto phase : handler->GetSession()->GetPlayer()->GetPhases()) - v->SetInPhase(phase, false, true); + v->CopyPhaseFrom(handler->GetSession()->GetPlayer()); map->AddToMap(v->ToCreature()); diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index c8168a1391..07a466d671 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -158,8 +158,7 @@ public: return false; } - for (auto phase : player->GetPhases()) - object->SetInPhase(phase, false, true); + object->CopyPhaseFrom(player); if (spawntimeSecs) { diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 42040df8ed..388eb64580 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -372,8 +372,8 @@ public: target->GetContactPoint(_player, x, y, z); _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE); - for (auto phase : target->GetPhases()) - _player->SetInPhase(phase, true, true); + + _player->CopyPhaseFrom(target, true); } else { @@ -497,8 +497,7 @@ public: float x, y, z; handler->GetSession()->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize()); target->TeleportTo(handler->GetSession()->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation()); - for (auto phase : handler->GetSession()->GetPlayer()->GetPhases()) - target->SetInPhase(phase, true, true); + target->CopyPhaseFrom(handler->GetSession()->GetPlayer(), true); } else { diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 85bc6db46f..d94ffe51f4 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -285,8 +285,7 @@ public: return false; } - for (auto phase : chr->GetPhases()) - creature->SetInPhase(phase, false, true); + creature->CopyPhaseFrom(chr); creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask()); diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index f158b9aa59..71b45c9065 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -680,8 +680,7 @@ public: return false; } - for (auto phase : chr->GetPhases()) - wpCreature2->SetInPhase(phase, false, true); + wpCreature2->CopyPhaseFrom(chr); wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); @@ -899,8 +898,7 @@ public: return false; } - for (auto phase : chr->GetPhases()) - wpCreature->SetInPhase(phase, false, true); + wpCreature->CopyPhaseFrom(chr); // Set "wpguid" column to the visual waypoint stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID); @@ -964,8 +962,7 @@ public: return false; } - for (auto phase : chr->GetPhases()) - creature->SetInPhase(phase, false, true); + creature->CopyPhaseFrom(chr); creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask()); if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map)) @@ -1016,8 +1013,7 @@ public: return false; } - for (auto phase : chr->GetPhases()) - creature->SetInPhase(phase, false, true); + creature->CopyPhaseFrom(chr); creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMask()); if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map)) diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index 49250c9d63..3e54a73717 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -172,8 +172,7 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) return true; } - for (auto phase : player->GetPhases()) - go->SetInPhase(phase, false, true); + go->CopyPhaseFrom(player); go->SetRespawnTime(0); @@ -209,8 +208,7 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) return true; } - for (auto phase : player->GetPhases()) - go->SetInPhase(phase, false, true); + go->CopyPhaseFrom(player); go->SetRespawnTime(0);