aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Phasing/PhaseShift.cpp19
-rw-r--r--src/server/game/Phasing/PhaseShift.h22
-rw-r--r--src/server/game/Phasing/PhasingHandler.cpp45
-rw-r--r--src/server/game/Phasing/PhasingHandler.h2
5 files changed, 65 insertions, 25 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 338301b9b1b..6ad25a0e61d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2109,7 +2109,7 @@ void Player::SetGameMaster(bool on)
}
else
{
- PhasingHandler::SetAlwaysVisible(this, !HasAuraType(SPELL_AURA_PHASE_ALWAYS_VISIBLE), false);
+ PhasingHandler::SetAlwaysVisible(this, HasAuraType(SPELL_AURA_PHASE_ALWAYS_VISIBLE), false);
m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
setFactionForRace(getRace());
diff --git a/src/server/game/Phasing/PhaseShift.cpp b/src/server/game/Phasing/PhaseShift.cpp
index 16ed9aaa5e8..c5c0bba5549 100644
--- a/src/server/game/Phasing/PhaseShift.cpp
+++ b/src/server/game/Phasing/PhaseShift.cpp
@@ -82,7 +82,6 @@ PhaseShift::EraseResult<PhaseShift::UiMapPhaseIdContainer> PhaseShift::RemoveUiM
void PhaseShift::Clear()
{
ClearPhases();
- PersonalGuid.Clear();
VisibleMapIds.clear();
UiMapPhaseIds.clear();
}
@@ -90,9 +89,11 @@ void PhaseShift::Clear()
void PhaseShift::ClearPhases()
{
Flags &= PhaseShiftFlags::AlwaysVisible | PhaseShiftFlags::Inverse;
+ PersonalGuid.Clear();
Phases.clear();
NonCosmeticReferences = 0;
CosmeticReferences = 0;
+ PersonalReferences = 0;
DefaultReferences = 0;
UpdateUnphasedFlag();
}
@@ -126,12 +127,12 @@ bool PhaseShift::CanSee(PhaseShift const& other) const
if (phaseShift.Flags.HasFlag(PhaseShiftFlags::Unphased) && !excludedPhaseShift.Flags.HasFlag(PhaseShiftFlags::InverseUnphased))
return true;
- for (auto itr = phaseShift.Phases.begin(); itr != phaseShift.Phases.end(); ++itr)
+ for (PhaseRef const& phase : phaseShift.Phases)
{
- if (itr->Flags.HasFlag(excludePhasesWithFlag))
+ if (phase.Flags.HasFlag(excludePhasesWithFlag))
continue;
- auto itr2 = std::find(excludedPhaseShift.Phases.begin(), excludedPhaseShift.Phases.end(), *itr);
+ auto itr2 = std::find(excludedPhaseShift.Phases.begin(), excludedPhaseShift.Phases.end(), phase);
if (itr2 == excludedPhaseShift.Phases.end() || itr2->Flags.HasFlag(excludePhasesWithFlag))
return true;
}
@@ -158,12 +159,16 @@ void PhaseShift::ModifyPhasesReferences(PhaseContainer::iterator itr, int32 refe
else
DefaultReferences += references;
+ if (itr->Flags.HasFlag(PhaseFlags::Personal))
+ PersonalReferences += references;
+
if (CosmeticReferences)
Flags |= PhaseShiftFlags::NoCosmetic;
else
Flags &= ~PhaseShiftFlags::NoCosmetic;
UpdateUnphasedFlag();
+ UpdatePersonalGuid();
}
}
@@ -176,3 +181,9 @@ void PhaseShift::UpdateUnphasedFlag()
else
Flags |= unphasedFlag;
}
+
+void PhaseShift::UpdatePersonalGuid()
+{
+ if (!PersonalReferences)
+ PersonalGuid.Clear();
+}
diff --git a/src/server/game/Phasing/PhaseShift.h b/src/server/game/Phasing/PhaseShift.h
index 0fadbcc42df..133f58056a2 100644
--- a/src/server/game/Phasing/PhaseShift.h
+++ b/src/server/game/Phasing/PhaseShift.h
@@ -81,11 +81,9 @@ public:
typename Container::iterator Iterator;
bool Erased;
};
- typedef boost::container::flat_set<PhaseRef> PhaseContainer;
- typedef std::map<uint32, VisibleMapIdRef> VisibleMapIdContainer;
- typedef std::map<uint32, UiMapPhaseIdRef> UiMapPhaseIdContainer;
-
- PhaseShift() : Flags(PhaseShiftFlags::Unphased), NonCosmeticReferences(0), CosmeticReferences(0), DefaultReferences(0), IsDbPhaseShift(false) { }
+ using PhaseContainer = boost::container::flat_set<PhaseRef>;
+ using VisibleMapIdContainer = std::map<uint32, VisibleMapIdRef>;
+ using UiMapPhaseIdContainer = std::map<uint32, UiMapPhaseIdRef>;
bool AddPhase(uint32 phaseId, PhaseFlags flags, std::vector<Condition*> const* areaConditions, int32 references = 1);
EraseResult<PhaseContainer> RemovePhase(uint32 phaseId);
@@ -100,7 +98,7 @@ public:
bool AddUiMapPhaseId(uint32 uiMapPhaseId, int32 references = 1);
EraseResult<UiMapPhaseIdContainer> RemoveUiMapPhaseId(uint32 uiMapPhaseId);
bool HasUiMapPhaseId(uint32 uiMapPhaseId) const { return UiMapPhaseIds.find(uiMapPhaseId) != UiMapPhaseIds.end(); }
- UiMapPhaseIdContainer const& GetUiWorldMapAreaIdSwaps() const { return UiMapPhaseIds; }
+ UiMapPhaseIdContainer const& GetUiMapPhaseIds() const { return UiMapPhaseIds; }
void Clear();
void ClearPhases();
@@ -110,7 +108,7 @@ public:
protected:
friend class PhasingHandler;
- EnumFlag<PhaseShiftFlags> Flags;
+ EnumFlag<PhaseShiftFlags> Flags = PhaseShiftFlags::Unphased;
ObjectGuid PersonalGuid;
PhaseContainer Phases;
VisibleMapIdContainer VisibleMapIds;
@@ -118,10 +116,12 @@ protected:
void ModifyPhasesReferences(PhaseContainer::iterator itr, int32 references);
void UpdateUnphasedFlag();
- int32 NonCosmeticReferences;
- int32 CosmeticReferences;
- int32 DefaultReferences;
- bool IsDbPhaseShift;
+ void UpdatePersonalGuid();
+ int32 NonCosmeticReferences = 0;
+ int32 CosmeticReferences = 0;
+ int32 PersonalReferences = 0;
+ int32 DefaultReferences = 0;
+ bool IsDbPhaseShift = false;
};
#endif // PhaseShift_h__
diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp
index 943144ded64..57260d54c18 100644
--- a/src/server/game/Phasing/PhasingHandler.cpp
+++ b/src/server/game/Phasing/PhasingHandler.cpp
@@ -55,23 +55,31 @@ inline void ForAllControlled(Unit* unit, Func&& func)
if (controlled->GetTypeId() != TYPEID_PLAYER)
func(controlled);
- for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
- if (!unit->m_SummonSlot[i].IsEmpty())
- if (Creature* summon = unit->GetMap()->GetCreature(unit->m_SummonSlot[i]))
+ for (ObjectGuid summonGuid : unit->m_SummonSlot)
+ if (!summonGuid.IsEmpty())
+ if (Creature* summon = unit->GetMap()->GetCreature(summonGuid))
func(summon);
}
}
void PhasingHandler::AddPhase(WorldObject* object, uint32 phaseId, bool updateVisibility)
{
+ AddPhase(object, phaseId, object->GetGUID(), updateVisibility);
+}
+
+void PhasingHandler::AddPhase(WorldObject* object, uint32 phaseId, ObjectGuid const& personalGuid, bool updateVisibility)
+{
bool changed = object->GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId), nullptr);
+ if (object->GetPhaseShift().PersonalReferences)
+ object->GetPhaseShift().PersonalGuid = personalGuid;
+
if (Unit* unit = object->ToUnit())
{
unit->OnPhaseChange();
ForAllControlled(unit, [&](Unit* controlled)
{
- AddPhase(controlled, phaseId, updateVisibility);
+ AddPhase(controlled, phaseId, personalGuid, updateVisibility);
});
unit->RemoveNotOwnSingleTargetAuras(true);
}
@@ -98,6 +106,11 @@ void PhasingHandler::RemovePhase(WorldObject* object, uint32 phaseId, bool updat
void PhasingHandler::AddPhaseGroup(WorldObject* object, uint32 phaseGroupId, bool updateVisibility)
{
+ AddPhaseGroup(object, phaseGroupId, object->GetGUID(), updateVisibility);
+}
+
+void PhasingHandler::AddPhaseGroup(WorldObject* object, uint32 phaseGroupId, ObjectGuid const& personalGuid, bool updateVisibility)
+{
std::vector<uint32> const* phasesInGroup = sDB2Manager.GetPhasesForGroup(phaseGroupId);
if (!phasesInGroup)
return;
@@ -106,12 +119,15 @@ void PhasingHandler::AddPhaseGroup(WorldObject* object, uint32 phaseGroupId, boo
for (uint32 phaseId : *phasesInGroup)
changed = object->GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId), nullptr) || changed;
+ if (object->GetPhaseShift().PersonalReferences)
+ object->GetPhaseShift().PersonalGuid = personalGuid;
+
if (Unit* unit = object->ToUnit())
{
unit->OnPhaseChange();
ForAllControlled(unit, [&](Unit* controlled)
{
- AddPhaseGroup(controlled, phaseGroupId, updateVisibility);
+ AddPhaseGroup(controlled, phaseGroupId, personalGuid, updateVisibility);
});
unit->RemoveNotOwnSingleTargetAuras(true);
}
@@ -269,6 +285,9 @@ void PhasingHandler::OnAreaChange(WorldObject* object)
for (uint32 phaseId : *phasesInGroup)
changed = phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), nullptr) || changed;
+ if (phaseShift.PersonalReferences)
+ phaseShift.PersonalGuid = unit->GetGUID();
+
if (changed)
unit->OnPhaseChange();
@@ -280,6 +299,11 @@ void PhasingHandler::OnAreaChange(WorldObject* object)
if (changed)
unit->RemoveNotOwnSingleTargetAuras(true);
}
+ else
+ {
+ if (phaseShift.PersonalReferences)
+ phaseShift.PersonalGuid = object->GetGUID();
+ }
UpdateVisibilityIfNeeded(object, true, changed);
}
@@ -371,12 +395,15 @@ void PhasingHandler::OnConditionChange(WorldObject* object)
}
}
+ if (phaseShift.PersonalReferences)
+ phaseShift.PersonalGuid = object->GetGUID();
+
changed = changed || !newSuppressions.Phases.empty() || !newSuppressions.VisibleMapIds.empty();
- for (auto itr = newSuppressions.Phases.begin(); itr != newSuppressions.Phases.end(); ++itr)
- suppressedPhaseShift.AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References);
+ for (PhaseShift::PhaseRef const& phaseRef : newSuppressions.Phases)
+ suppressedPhaseShift.AddPhase(phaseRef.Id, phaseRef.Flags, phaseRef.AreaConditions, phaseRef.References);
- for (auto itr = newSuppressions.VisibleMapIds.begin(); itr != newSuppressions.VisibleMapIds.end(); ++itr)
- suppressedPhaseShift.AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References);
+ for (std::pair<uint32 const, PhaseShift::VisibleMapIdRef> const& visibleMap : newSuppressions.VisibleMapIds)
+ suppressedPhaseShift.AddVisibleMapId(visibleMap.first, visibleMap.second.VisibleMapInfo, visibleMap.second.References);
if (unit)
{
diff --git a/src/server/game/Phasing/PhasingHandler.h b/src/server/game/Phasing/PhasingHandler.h
index a2ee1cfc046..59b2f606b5e 100644
--- a/src/server/game/Phasing/PhasingHandler.h
+++ b/src/server/game/Phasing/PhasingHandler.h
@@ -70,6 +70,8 @@ public:
static std::string FormatPhases(PhaseShift const& phaseShift);
private:
+ static void AddPhase(WorldObject* object, uint32 phaseId, ObjectGuid const& personalGuid, bool updateVisibility);
+ static void AddPhaseGroup(WorldObject* object, uint32 phaseGroupId, ObjectGuid const& personalGuid, bool updateVisibility);
static void UpdateVisibilityIfNeeded(WorldObject* object, bool updateVisibility, bool changed);
};