diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 7d0081aaa..44a1d1efd 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -2165,7 +2165,7 @@ namespace Game.Entities } else { - PhasingHandler.SetAlwaysVisible(this, !HasAuraType(AuraType.PhaseAlwaysVisible), false); + PhasingHandler.SetAlwaysVisible(this, HasAuraType(AuraType.PhaseAlwaysVisible), false); m_ExtraFlags &= ~PlayerExtraFlags.GMOn; SetFactionForRace(GetRace()); diff --git a/Source/Game/Phasing/PhaseShift.cs b/Source/Game/Phasing/PhaseShift.cs index 07f55674a..befe68155 100644 --- a/Source/Game/Phasing/PhaseShift.cs +++ b/Source/Game/Phasing/PhaseShift.cs @@ -128,7 +128,6 @@ namespace Game public void Clear() { ClearPhases(); - PersonalGuid.Clear(); VisibleMapIds.Clear(); UiMapPhaseIds.Clear(); } @@ -136,9 +135,11 @@ namespace Game public void ClearPhases() { Flags &= PhaseShiftFlags.AlwaysVisible | PhaseShiftFlags.Inverse; + PersonalGuid.Clear(); Phases.Clear(); NonCosmeticReferences = 0; CosmeticReferences = 0; + PersonalReferences = 0; DefaultReferences = 0; UpdateUnphasedFlag(); } @@ -168,7 +169,6 @@ namespace Game if (phaseShift.Flags.HasFlag(PhaseShiftFlags.Unphased) && !excludedPhaseShift.Flags.HasFlag(PhaseShiftFlags.InverseUnphased)) return true; - var list = excludedPhaseShift.Phases.ToList(); foreach (var pair in phaseShift.Phases) { if (pair.Value.Flags.HasAnyFlag(excludePhasesWithFlag)) @@ -201,12 +201,16 @@ namespace Game else DefaultReferences += references; + if (phaseRef.Flags.HasFlag(PhaseFlags.Personal)) + PersonalReferences += references; + if (CosmeticReferences != 0) Flags |= PhaseShiftFlags.NoCosmetic; else Flags &= ~PhaseShiftFlags.NoCosmetic; UpdateUnphasedFlag(); + UpdatePersonalGuid(); } } @@ -220,6 +224,12 @@ namespace Game Flags |= unphasedFlag; } + void UpdatePersonalGuid() + { + if (PersonalReferences == 0) + PersonalGuid.Clear(); + } + public bool HasPhase(uint phaseId) { return Phases.ContainsKey(phaseId); } public Dictionary GetPhases() { return Phases; } @@ -227,9 +237,9 @@ namespace Game public Dictionary GetVisibleMapIds() { return VisibleMapIds; } public bool HasUiWorldMapAreaIdSwap(uint uiWorldMapAreaId) { return UiMapPhaseIds.ContainsKey(uiWorldMapAreaId); } - public Dictionary GetUiWorldMapAreaIdSwaps() { return UiMapPhaseIds; } + public Dictionary GetUiMapPhaseIds() { return UiMapPhaseIds; } - public PhaseShiftFlags Flags; + public PhaseShiftFlags Flags = PhaseShiftFlags.Unphased; public ObjectGuid PersonalGuid; public Dictionary Phases = new Dictionary(); public Dictionary VisibleMapIds = new Dictionary(); @@ -237,6 +247,7 @@ namespace Game int NonCosmeticReferences; int CosmeticReferences; + public int PersonalReferences; int DefaultReferences; public bool IsDbPhaseShift; } diff --git a/Source/Game/Phasing/PhasingHandler.cs b/Source/Game/Phasing/PhasingHandler.cs index 0b03fbd7b..d7acc0710 100644 --- a/Source/Game/Phasing/PhasingHandler.cs +++ b/Source/Game/Phasing/PhasingHandler.cs @@ -53,16 +53,24 @@ namespace Game } public static void AddPhase(WorldObject obj, uint phaseId, bool updateVisibility) + { + AddPhase(obj, phaseId, obj.GetGUID(), updateVisibility); + } + + static void AddPhase(WorldObject obj, uint phaseId, ObjectGuid personalGuid, bool updateVisibility) { bool changed = obj.GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId), null); + if (obj.GetPhaseShift().PersonalReferences != 0) + obj.GetPhaseShift().PersonalGuid = personalGuid; + Unit unit = obj.ToUnit(); if (unit) { unit.OnPhaseChange(); ForAllControlled(unit, controlled => { - AddPhase(controlled, phaseId, updateVisibility); + AddPhase(controlled, phaseId, personalGuid, updateVisibility); }); unit.RemoveNotOwnSingleTargetAuras(true); } @@ -89,6 +97,11 @@ namespace Game } public static void AddPhaseGroup(WorldObject obj, uint phaseGroupId, bool updateVisibility) + { + AddPhaseGroup(obj, phaseGroupId, obj.GetGUID(), updateVisibility); + } + + static void AddPhaseGroup(WorldObject obj, uint phaseGroupId, ObjectGuid personalGuid, bool updateVisibility) { var phasesInGroup = Global.DB2Mgr.GetPhasesForGroup(phaseGroupId); if (phasesInGroup.Empty()) @@ -98,13 +111,16 @@ namespace Game foreach (uint phaseId in phasesInGroup) changed = obj.GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId), null) || changed; + if (obj.GetPhaseShift().PersonalReferences != 0) + obj.GetPhaseShift().PersonalGuid = personalGuid; + Unit unit = obj.ToUnit(); if (unit) { unit.OnPhaseChange(); ForAllControlled(unit, controlled => { - AddPhaseGroup(controlled, phaseGroupId, updateVisibility); + AddPhaseGroup(controlled, phaseGroupId, personalGuid, updateVisibility); }); unit.RemoveNotOwnSingleTargetAuras(true); } @@ -266,6 +282,9 @@ namespace Game changed = phaseShift.AddPhase(phaseId, GetPhaseFlags(phaseId), null) || changed; } + if (phaseShift.PersonalReferences != 0) + phaseShift.PersonalGuid = unit.GetGUID(); + if (changed) unit.OnPhaseChange(); @@ -277,6 +296,11 @@ namespace Game if (changed) unit.RemoveNotOwnSingleTargetAuras(true); } + else + { + if (phaseShift.PersonalReferences != 0) + phaseShift.PersonalGuid = obj.GetGUID(); + } UpdateVisibilityIfNeeded(obj, true, changed); } @@ -360,6 +384,9 @@ namespace Game } } + if (phaseShift.PersonalReferences != 0) + phaseShift.PersonalGuid = obj.GetGUID(); + changed = changed || !newSuppressions.Phases.Empty() || !newSuppressions.VisibleMapIds.Empty(); foreach (var pair in newSuppressions.Phases) suppressedPhaseShift.AddPhase(pair.Key, pair.Value.Flags, pair.Value.AreaConditions, pair.Value.References);