diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 131259714..6928a0424 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -348,7 +348,7 @@ namespace Framework.Constants OverrideUnlockedAzeriteEssenceRank = 324, // testing aura LearnPvpTalent = 325, // NYI PhaseGroup = 326, // Phase Related - PhaseAlwaysVisible = 327, // NYI - sets PhaseShiftFlags::AlwaysVisible + PhaseAlwaysVisible = 327, // Sets PhaseShiftFlags::AlwaysVisible TriggerSpellOnPowerPct = 328, ModPowerGainPct = 329, CastWhileWalking = 330, diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index de7854c4a..7d0081aaa 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -2160,12 +2160,12 @@ namespace Game.Entities GetHostileRefManager().SetOnlineOfflineState(false); CombatStopWithPets(); - PhasingHandler.SetAlwaysVisible(GetPhaseShift(), true); + PhasingHandler.SetAlwaysVisible(this, true, false); m_serverSideVisibilityDetect.SetValue(ServerSideVisibilityType.GM, GetSession().GetSecurity()); } else { - PhasingHandler.SetAlwaysVisible(GetPhaseShift(), false); + PhasingHandler.SetAlwaysVisible(this, !HasAuraType(AuraType.PhaseAlwaysVisible), false); m_ExtraFlags &= ~PlayerExtraFlags.GMOn; SetFactionForRace(GetRace()); diff --git a/Source/Game/Phasing/PhasingHandler.cs b/Source/Game/Phasing/PhasingHandler.cs index 5d19a0d97..0b03fbd7b 100644 --- a/Source/Game/Phasing/PhasingHandler.cs +++ b/Source/Game/Phasing/PhasingHandler.cs @@ -481,22 +481,26 @@ namespace Game return map.GetId(); } - public static void SetAlwaysVisible(PhaseShift phaseShift, bool apply) + public static void SetAlwaysVisible(WorldObject obj, bool apply, bool updateVisibility) { if (apply) - phaseShift.Flags |= PhaseShiftFlags.AlwaysVisible; + obj.GetPhaseShift().Flags |= PhaseShiftFlags.AlwaysVisible; else - phaseShift.Flags &= ~PhaseShiftFlags.AlwaysVisible; + obj.GetPhaseShift().Flags &= ~PhaseShiftFlags.AlwaysVisible; + + UpdateVisibilityIfNeeded(obj, updateVisibility, true); } - public static void SetInversed(PhaseShift phaseShift, bool apply) + public static void SetInversed(WorldObject obj, bool apply, bool updateVisibility) { if (apply) - phaseShift.Flags |= PhaseShiftFlags.Inverse; + obj.GetPhaseShift().Flags |= PhaseShiftFlags.Inverse; else - phaseShift.Flags &= ~PhaseShiftFlags.Inverse; + obj.GetPhaseShift().Flags &= ~PhaseShiftFlags.Inverse; - phaseShift.UpdateUnphasedFlag(); + obj.GetPhaseShift().UpdateUnphasedFlag(); + + UpdateVisibilityIfNeeded(obj, updateVisibility, true); } public static void PrintToChat(CommandHandler chat, PhaseShift phaseShift) diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index f25c6997b..12d2c3c62 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -1273,6 +1273,25 @@ namespace Game.Spells PhasingHandler.RemovePhaseGroup(target, (uint)GetMiscValueB(), true); } + [AuraEffectHandler(AuraType.PhaseAlwaysVisible)] + void HandlePhaseAlwaysVisible(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) + { + if (!mode.HasAnyFlag(AuraEffectHandleModes.Real)) + return; + + Unit target = aurApp.GetTarget(); + + if (!apply) + PhasingHandler.SetAlwaysVisible(target, true, true); + else + { + if (target.HasAuraType(AuraType.PhaseAlwaysVisible) || (target.IsPlayer() && target.ToPlayer().IsGameMaster())) + return; + + PhasingHandler.SetAlwaysVisible(target, false, true); + } + } + /**********************/ /*** UNIT MODEL ***/ /**********************/