Core/Auras: Implemented SPELL_AURA_PHASE_ALWAYS_VISIBLE

This commit is contained in:
Shauren
2021-02-26 22:10:34 +01:00
parent f269f60d8a
commit c9344c145a
6 changed files with 36 additions and 13 deletions

View File

@@ -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());

View File

@@ -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;
phaseShift.UpdateUnphasedFlag();
object->GetPhaseShift().UpdateUnphasedFlag();
UpdateVisibilityIfNeeded(object, updateVisibility, true);
}
void PhasingHandler::PrintToChat(ChatHandler* chat, PhaseShift const& phaseShift)

View File

@@ -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);

View File

@@ -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,

View File

@@ -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 ***/
/**********************/

View File

@@ -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;