aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Phasing/PhasingHandler.cpp18
-rw-r--r--src/server/game/Phasing/PhasingHandler.h4
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp20
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
6 files changed, 36 insertions, 13 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index a427cec796a..338301b9b1b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2104,12 +2104,12 @@ void Player::SetGameMaster(bool on)
getHostileRefManager().setOnlineOfflineState(false);
CombatStopWithPets();
- PhasingHandler::SetAlwaysVisible(GetPhaseShift(), true);
+ PhasingHandler::SetAlwaysVisible(this, true, false);
m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GM, GetSession()->GetSecurity());
}
else
{
- PhasingHandler::SetAlwaysVisible(GetPhaseShift(), 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/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp
index ad725bade8d..943144ded64 100644
--- a/src/server/game/Phasing/PhasingHandler.cpp
+++ b/src/server/game/Phasing/PhasingHandler.cpp
@@ -494,22 +494,26 @@ uint32 PhasingHandler::GetTerrainMapId(PhaseShift const& phaseShift, Map const*
return map->GetId();
}
-void PhasingHandler::SetAlwaysVisible(PhaseShift& phaseShift, bool apply)
+void PhasingHandler::SetAlwaysVisible(WorldObject* object, bool apply, bool updateVisibility)
{
if (apply)
- phaseShift.Flags |= PhaseShiftFlags::AlwaysVisible;
+ object->GetPhaseShift().Flags |= PhaseShiftFlags::AlwaysVisible;
else
- phaseShift.Flags &= ~PhaseShiftFlags::AlwaysVisible;
+ object->GetPhaseShift().Flags &= ~PhaseShiftFlags::AlwaysVisible;
+
+ UpdateVisibilityIfNeeded(object, updateVisibility, true);
}
-void PhasingHandler::SetInversed(PhaseShift& phaseShift, bool apply)
+void PhasingHandler::SetInversed(WorldObject* object, bool apply, bool updateVisibility)
{
if (apply)
- phaseShift.Flags |= PhaseShiftFlags::Inverse;
+ object->GetPhaseShift().Flags |= PhaseShiftFlags::Inverse;
else
- phaseShift.Flags &= PhaseShiftFlags::Inverse;
+ object->GetPhaseShift().Flags &= PhaseShiftFlags::Inverse;
+
+ object->GetPhaseShift().UpdateUnphasedFlag();
- phaseShift.UpdateUnphasedFlag();
+ UpdateVisibilityIfNeeded(object, updateVisibility, true);
}
void PhasingHandler::PrintToChat(ChatHandler* chat, PhaseShift const& phaseShift)
diff --git a/src/server/game/Phasing/PhasingHandler.h b/src/server/game/Phasing/PhasingHandler.h
index 701820e2dcc..a2ee1cfc046 100644
--- a/src/server/game/Phasing/PhasingHandler.h
+++ b/src/server/game/Phasing/PhasingHandler.h
@@ -63,8 +63,8 @@ public:
static uint32 GetTerrainMapId(PhaseShift const& phaseShift, Map const* map, float x, float y);
- static void SetAlwaysVisible(PhaseShift& phaseShift, bool apply);
- static void SetInversed(PhaseShift& phaseShift, bool apply);
+ static void SetAlwaysVisible(WorldObject* object, bool apply, bool updateVisibility);
+ static void SetInversed(WorldObject* object, bool apply, bool updateVisibility);
static void PrintToChat(ChatHandler* chat, PhaseShift const& phaseShift);
static std::string FormatPhases(PhaseShift const& phaseShift);
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index d8742ea51d9..54d4ea1ce08 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -399,7 +399,7 @@ enum AuraType : uint32
SPELL_AURA_OVERRIDE_UNLOCKED_AZERITE_ESSENCE_RANK = 324, // testing aura
SPELL_AURA_LEARN_PVP_TALENT = 325, // NYI
SPELL_AURA_PHASE_GROUP = 326, // Puts the player in all the phases that are in the group with id = miscB
- SPELL_AURA_PHASE_ALWAYS_VISIBLE = 327, // NYI - sets PhaseShiftFlags::AlwaysVisible
+ SPELL_AURA_PHASE_ALWAYS_VISIBLE = 327, // Sets PhaseShiftFlags::AlwaysVisible
SPELL_AURA_TRIGGER_SPELL_ON_POWER_PCT = 328, // NYI Triggers spell when power goes above (MiscB = 0) or falls below (MiscB = 1) specified percent value (once, not every time condition has meet)
SPELL_AURA_MOD_POWER_GAIN_PCT = 329,
SPELL_AURA_CAST_WHILE_WALKING = 330,
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index d7a6877715b..453510f96ca 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -395,7 +395,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNULL, //324 SPELL_AURA_OVERRIDE_UNLOCKED_AZERITE_ESSENCE_RANK
&AuraEffect::HandleUnused, //325 SPELL_AURA_LEARN_PVP_TALENT
&AuraEffect::HandlePhaseGroup, //326 SPELL_AURA_PHASE_GROUP
- &AuraEffect::HandleNULL, //327 SPELL_AURA_PHASE_ALWAYS_VISIBLE
+ &AuraEffect::HandlePhaseAlwaysVisible, //327 SPELL_AURA_PHASE_ALWAYS_VISIBLE
&AuraEffect::HandleNULL, //328 SPELL_AURA_TRIGGER_SPELL_ON_POWER_PCT
&AuraEffect::HandleNULL, //329 SPELL_AURA_MOD_POWER_GAIN_PCT
&AuraEffect::HandleNoImmediateEffect, //330 SPELL_AURA_CAST_WHILE_WALKING
@@ -1722,6 +1722,24 @@ void AuraEffect::HandlePhaseGroup(AuraApplication const* aurApp, uint8 mode, boo
PhasingHandler::RemovePhaseGroup(target, uint32(GetMiscValueB()), true);
}
+void AuraEffect::HandlePhaseAlwaysVisible(AuraApplication const* aurApp, uint8 mode, bool apply) const
+{
+ if (!(mode & AURA_EFFECT_HANDLE_REAL))
+ return;
+
+ Unit* target = aurApp->GetTarget();
+
+ if (!apply)
+ PhasingHandler::SetAlwaysVisible(target, true, true);
+ else
+ {
+ if (target->HasAuraType(SPELL_AURA_PHASE_ALWAYS_VISIBLE) || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
+ return;
+
+ PhasingHandler::SetAlwaysVisible(target, false, true);
+ }
+}
+
/**********************/
/*** UNIT MODEL ***/
/**********************/
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 0c304d558e1..233ed26100d 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -153,6 +153,7 @@ class TC_GAME_API AuraEffect
void HandleAuraGhost(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandlePhase(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandlePhaseGroup(AuraApplication const* aurApp, uint8 mode, bool apply) const;
+ void HandlePhaseAlwaysVisible(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// unit model
void HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mode, bool apply) const;