diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 116 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_wintergrasp.cpp | 19 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 132 |
4 files changed, 152 insertions, 116 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 5c48daa7941..d9cd8dc70e5 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -772,7 +772,7 @@ void AuraEffect::Update(uint32 diff, Unit* caster) ++_ticksDone; - UpdatePeriodic(caster); + GetBase()->CallScriptEffectUpdatePeriodicHandlers(this); std::vector<AuraApplication*> effectApplications; GetApplicationList(effectApplications); @@ -784,120 +784,6 @@ void AuraEffect::Update(uint32 diff, Unit* caster) } } -void AuraEffect::UpdatePeriodic(Unit* caster) -{ - switch (GetAuraType()) - { - case SPELL_AURA_PERIODIC_DUMMY: - switch (GetSpellInfo()->SpellFamilyName) - { - case SPELLFAMILY_GENERIC: - switch (GetId()) - { - // Drink - case 430: - case 431: - case 432: - case 1133: - case 1135: - case 1137: - case 10250: - case 22734: - case 27089: - case 34291: - case 43182: - case 43183: - case 46755: - case 49472: // Drink Coffee - case 57073: - case 61830: - case 72623: - if (!caster || caster->GetTypeId() != TYPEID_PLAYER) - return; - // Get SPELL_AURA_MOD_POWER_REGEN aura from spell - if (AuraEffect* aurEff = GetBase()->GetEffect(0)) - { - if (aurEff->GetAuraType() != SPELL_AURA_MOD_POWER_REGEN) - { - m_isPeriodic = false; - TC_LOG_ERROR("spells", "Aura %d structure has been changed - first aura is no longer SPELL_AURA_MOD_POWER_REGEN", GetId()); - } - else - { - // default case - not in arena - if (!caster->ToPlayer()->InArena()) - { - aurEff->ChangeAmount(GetAmount()); - m_isPeriodic = false; - } - else - { - // ********************************************** - // This feature uses only in arenas - // ********************************************** - // Here need increase mana regen per tick (6 second rule) - // on 0 tick - 0 (handled in 2 second) - // on 1 tick - 166% (handled in 4 second) - // on 2 tick - 133% (handled in 6 second) - - // Apply bonus for 1 - 4 tick - switch (_ticksDone) - { - case 1: // 0% - aurEff->ChangeAmount(0); - break; - case 2: // 166% - aurEff->ChangeAmount(GetAmount() * 5 / 3); - break; - case 3: // 133% - aurEff->ChangeAmount(GetAmount() * 4 / 3); - break; - default: // 100% - normal regen - aurEff->ChangeAmount(GetAmount()); - // No need to update after 4th tick - m_isPeriodic = false; - break; - } - } - } - } - break; - case 58549: // Tenacity - case 59911: // Tenacity (vehicle) - GetBase()->RefreshDuration(); - break; - default: - break; - } - break; - case SPELLFAMILY_MAGE: - if (GetId() == 55342)// Mirror Image - m_isPeriodic = false; - break; - case SPELLFAMILY_DEATHKNIGHT: - // Chains of Ice - if (GetSpellInfo()->SpellFamilyFlags[1] & 0x00004000) - { - // Get 0 effect aura - if (AuraEffect* slow = GetBase()->GetEffect(EFFECT_0)) - { - int32 newAmount = slow->GetAmount() + GetAmount(); - if (newAmount > 0) - newAmount = 0; - slow->ChangeAmount(newAmount); - } - return; - } - break; - default: - break; - } - default: - break; - } - GetBase()->CallScriptEffectUpdatePeriodicHandlers(this); -} - bool AuraEffect::CanPeriodicTickCrit(Unit const* caster) const { ASSERT(caster); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 65d1f46d155..861f02c14f4 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -81,7 +81,6 @@ class TC_GAME_API AuraEffect float GetDonePct() const { return m_donePct; } void Update(uint32 diff, Unit* caster); - void UpdatePeriodic(Unit* caster); void ResetTicks() { _ticksDone = 0; } uint32 GetTickNumber() const { return _ticksDone; } diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 64ac0441f93..051b346c83e 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -27,6 +27,7 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "ScriptSystem.h" +#include "SpellAuras.h" #include "SpellScript.h" #include "Vehicle.h" #include "WorldSession.h" @@ -579,6 +580,23 @@ class spell_wintergrasp_defender_teleport_trigger : public SpellScriptLoader } }; +// 58549 Tenacity +// 59911 Tenacity +class spell_wintergrasp_tenacity_refresh : public AuraScript +{ + PrepareAuraScript(spell_wintergrasp_tenacity_refresh); + + void Refresh(AuraEffect* /*aurEff*/) + { + GetAura()->RefreshDuration(); + } + + void Register() override + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_wintergrasp_tenacity_refresh::Refresh, EFFECT_2, SPELL_AURA_PERIODIC_DUMMY); + } +}; + class condition_is_wintergrasp_horde : public ConditionScript { public: @@ -619,6 +637,7 @@ void AddSC_wintergrasp() new achievement_wg_didnt_stand_a_chance(); new spell_wintergrasp_defender_teleport(); new spell_wintergrasp_defender_teleport_trigger(); + RegisterAuraScript(spell_wintergrasp_tenacity_refresh); new condition_is_wintergrasp_horde(); new condition_is_wintergrasp_alliance(); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 4a95c19c628..05fbc6b3423 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -201,6 +201,96 @@ class spell_gen_animal_blood : public AuraScript } }; +// 430 Drink +// 431 Drink +// 432 Drink +// 1133 Drink +// 1135 Drink +// 1137 Drink +// 10250 Drink +// 22734 Drink +// 27089 Drink +// 34291 Drink +// 43182 Drink +// 43183 Drink +// 46755 Drink +// 49472 Drink Coffee +// 57073 Drink +// 61830 Drink +// 72623 Drink +class spell_gen_arena_drink : public AuraScript +{ + PrepareAuraScript(spell_gen_arena_drink); + + bool Load() override + { + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void CalcPeriodic(AuraEffect const* aurEff, bool& isPeriodic, int32& amplitude) + { + // Get SPELL_AURA_MOD_POWER_REGEN aura from spell + AuraEffect* regen = GetAura()->GetEffect(EFFECT_0); + if (!regen) + return; + + if (regen->GetAuraType() != SPELL_AURA_MOD_POWER_REGEN) + { + isPeriodic = false; + TC_LOG_ERROR("spells", "Aura %d structure has been changed - first aura is no longer SPELL_AURA_MOD_POWER_REGEN", GetId()); + } + else + { + // default case - not in arena + if (!GetCaster()->ToPlayer()->InArena()) + { + regen->ChangeAmount(aurEff->GetAmount()); + isPeriodic = false; + } + } + } + + void UpdatePeriodic(AuraEffect* aurEff) + { + AuraEffect* regen = GetAura()->GetEffect(EFFECT_0); + if (!regen) + return; + + // ********************************************** + // This feature used only in arenas + // ********************************************** + // Here need increase mana regen per tick (6 second rule) + // on 0 tick - 0 (handled in 2 second) + // on 1 tick - 166% (handled in 4 second) + // on 2 tick - 133% (handled in 6 second) + + // Apply bonus for 1 - 4 tick + switch (aurEff->GetTickNumber()) + { + case 1: // 0% + regen->ChangeAmount(0); + break; + case 2: // 166% + regen->ChangeAmount(aurEff->GetAmount() * 5 / 3); + break; + case 3: // 133% + regen->ChangeAmount(aurEff->GetAmount() * 4 / 3); + break; + default: // 100% - normal regen + regen->ChangeAmount(aurEff->GetAmount()); + // No need to update after 4th tick + aurEff->SetPeriodic(false); + break; + } + } + + void Register() override + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_arena_drink::CalcPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_arena_drink::UpdatePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } +}; + // 41337 Aura of Anger class spell_gen_aura_of_anger : public AuraScript { @@ -643,6 +733,29 @@ class spell_gen_cannibalize : public SpellScript } }; +// 45524 Chains of Ice +// 66020 Chains of Ice +class spell_gen_chains_of_ice : public AuraScript +{ + PrepareAuraScript(spell_gen_chains_of_ice); + + void UpdatePeriodic(AuraEffect* aurEff) + { + // Get 0 effect aura + AuraEffect* slow = GetAura()->GetEffect(EFFECT_0); + if (!slow) + return; + + int32 newAmount = std::min<int32>(slow->GetAmount() + aurEff->GetAmount(), 0); + slow->ChangeAmount(newAmount); + } + + void Register() override + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_chains_of_ice::UpdatePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } +}; + enum ChaosBlast { SPELL_CHAOS_BLAST = 37675 @@ -2026,6 +2139,22 @@ class spell_gen_obsidian_armor : public AuraScript } }; +// 55342 Mirror Image +class spell_gen_one_tick_dummy : public AuraScript +{ + PrepareAuraScript(spell_gen_one_tick_dummy); + + void DisablePeriodic(AuraEffect* aurEff) + { + aurEff->SetPeriodic(false); + } + + void Register() override + { + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_one_tick_dummy::DisablePeriodic, EFFECT_FIRST_FOUND, SPELL_AURA_PERIODIC_DUMMY); + } +}; + class spell_gen_oracle_wolvar_reputation : public SpellScript { PrepareSpellScript(spell_gen_oracle_wolvar_reputation); @@ -3448,6 +3577,7 @@ void AddSC_generic_spell_scripts() RegisterAuraScript(spell_gen_adaptive_warding); RegisterSpellScript(spell_gen_allow_cast_from_item_only); RegisterAuraScript(spell_gen_animal_blood); + RegisterAuraScript(spell_gen_arena_drink); RegisterAuraScript(spell_gen_aura_of_anger); RegisterAuraScript(spell_gen_aura_service_uniform); RegisterAuraScript(spell_gen_av_drekthar_presence); @@ -3460,6 +3590,7 @@ void AddSC_generic_spell_scripts() RegisterAuraScript(spell_gen_burn_brutallus); RegisterAuraScript(spell_gen_burning_depths_necrolyte_image); RegisterSpellScript(spell_gen_cannibalize); + RegisterAuraScript(spell_gen_chains_of_ice); RegisterSpellScript(spell_gen_chaos_blast); RegisterSpellScript(spell_gen_clone); RegisterSpellScript(spell_gen_clone_weapon); @@ -3501,6 +3632,7 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_netherbloom); RegisterSpellScript(spell_gen_nightmare_vine); RegisterAuraScript(spell_gen_obsidian_armor); + RegisterAuraScript(spell_gen_one_tick_dummy); RegisterSpellScript(spell_gen_oracle_wolvar_reputation); RegisterSpellScript(spell_gen_orc_disguise); RegisterAuraScript(spell_gen_paralytic_poison); |
