diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Phasing/PhasingHandler.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Phasing/PhasingHandler.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
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; |