From 6c01f761b2c00d9ea8d44f2856c7a82cadb9bbfc Mon Sep 17 00:00:00 2001 From: Aqua Deus <95978183+aquadeus@users.noreply.github.com> Date: Sat, 26 Feb 2022 21:23:37 +0100 Subject: Core/Auras: Implement SPELL_AURA_FORCE_BREATH_BAR (#27790) Co-authored-by: Shauren --- src/server/game/Entities/Player/Player.cpp | 21 +++++---------------- src/server/game/Spells/Auras/SpellAuraDefines.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 14 +++++++++++++- src/server/game/Spells/Auras/SpellAuraEffects.h | 1 + 4 files changed, 20 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c1ac6f3f357..de466cd4b5b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -26153,44 +26153,33 @@ void Player::ProcessTerrainStatusUpdate(ZLiquidStatus oldLiquidStatus, Optional< // process liquid auras using generic unit code Unit::ProcessTerrainStatusUpdate(oldLiquidStatus, newLiquidData); + m_MirrorTimerFlags &= ~(UNDERWATER_INWATER | UNDERWATER_INLAVA | UNDERWATER_INSLIME | UNDERWATER_INDARKWATER); + // player specific logic for mirror timers if (GetLiquidStatus() && newLiquidData) { // Breath bar state (under water in any liquid type) if (newLiquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::AllLiquids)) - { if (GetLiquidStatus() & LIQUID_MAP_UNDER_WATER) m_MirrorTimerFlags |= UNDERWATER_INWATER; - else - m_MirrorTimerFlags &= ~UNDERWATER_INWATER; - } // Fatigue bar state (if not on flight path or transport) if (newLiquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::DarkWater) && !IsInFlight() && !GetTransport()) m_MirrorTimerFlags |= UNDERWATER_INDARKWATER; - else - m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER; // Lava state (any contact) if (newLiquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::Magma)) - { if (GetLiquidStatus() & MAP_LIQUID_STATUS_IN_CONTACT) m_MirrorTimerFlags |= UNDERWATER_INLAVA; - else - m_MirrorTimerFlags &= ~UNDERWATER_INLAVA; - } // Slime state (any contact) if (newLiquidData->type_flags.HasFlag(map_liquidHeaderTypeFlags::Slime)) - { if (GetLiquidStatus() & MAP_LIQUID_STATUS_IN_CONTACT) m_MirrorTimerFlags |= UNDERWATER_INSLIME; - else - m_MirrorTimerFlags &= ~UNDERWATER_INSLIME; - } } - else - m_MirrorTimerFlags &= ~(UNDERWATER_INWATER | UNDERWATER_INLAVA | UNDERWATER_INSLIME | UNDERWATER_INDARKWATER); + + if (HasAuraType(SPELL_AURA_FORCE_BREATH_BAR)) + m_MirrorTimerFlags |= UNDERWATER_INWATER; } void Player::AtEnterCombat() diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index a584ab6c243..90c3f3ebc45 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -255,7 +255,7 @@ enum AuraType : uint32 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT = 161, SPELL_AURA_POWER_BURN = 162, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS = 163, - SPELL_AURA_FORCE_BREATH_BAR = 164, // NYI + SPELL_AURA_FORCE_BREATH_BAR = 164, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS = 165, SPELL_AURA_MOD_ATTACK_POWER_PCT = 166, SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT = 167, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 75f7535dcec..3d150f4f559 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -230,7 +230,7 @@ NonDefaultConstructible AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNoImmediateEffect, //161 SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT &AuraEffect::HandleNoImmediateEffect, //162 SPELL_AURA_POWER_BURN implemented in AuraEffect::PeriodicTick &AuraEffect::HandleNoImmediateEffect, //163 SPELL_AURA_MOD_CRIT_DAMAGE_BONUS - &AuraEffect::HandleNULL, //164 SPELL_AURA_FORCE_BREATH_BAR + &AuraEffect::HandleForceBreathBar, //164 SPELL_AURA_FORCE_BREATH_BAR &AuraEffect::HandleNoImmediateEffect, //165 SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS implemented in Unit::MeleeDamageBonus &AuraEffect::HandleAuraModAttackPowerPercent, //166 SPELL_AURA_MOD_ATTACK_POWER_PCT &AuraEffect::HandleAuraModRangedAttackPowerPercent, //167 SPELL_AURA_MOD_RANGED_ATTACK_POWER_PCT @@ -6143,6 +6143,18 @@ void AuraEffect::HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication con aura->ApplyForTargets(); } +void AuraEffect::HandleForceBreathBar(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const +{ + if (!(mode & AURA_EFFECT_HANDLE_REAL)) + return; + + Player* playerTarget = aurApp->GetTarget()->ToPlayer(); + if (!playerTarget) + return; + + playerTarget->UpdatePositionData(); +} + template TC_GAME_API void AuraEffect::GetTargetList(std::list&) const; template TC_GAME_API void AuraEffect::GetTargetList(std::deque&) const; template TC_GAME_API void AuraEffect::GetTargetList(std::vector&) const; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index c9f04b647ec..8ed3ef13e41 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -327,6 +327,7 @@ class TC_GAME_API AuraEffect void HandleMountRestrictions(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleForceBreathBar(AuraApplication const* aurApp, uint8 mode, bool apply) const; // aura effect periodic tick handlers void HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) const; -- cgit v1.2.3