diff options
author | Seyden <saiifii@live.de> | 2021-10-27 00:46:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-27 00:46:57 +0200 |
commit | 62e444e4b0ef7199e5ce40b216c13fb57a6e56ec (patch) | |
tree | a81d6f49742231effc8db82a8259e8ac2a6b700d /src | |
parent | 247c9210d9d456f1a5dbd94744436d1de817452e (diff) |
Scripts/Spells: Implement Demon Hunter Havoc talent "First Blood" (#27176)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_dh.cpp | 136 |
1 files changed, 126 insertions, 10 deletions
diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp index 924d067b8f6..14e9a8543aa 100644 --- a/src/server/scripts/Spells/spell_dh.cpp +++ b/src/server/scripts/Spells/spell_dh.cpp @@ -31,14 +31,15 @@ enum DemonHunterSpells { - SPELL_CHAOS_STRIKE_ENERGIZE = 193840, - SPELL_DH_SIGIL_OF_CHAINS_GRIP = 208674, - SPELL_DH_SIGIL_OF_CHAINS_SLOW = 204843, - SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT = 204834, - SPELL_DH_SIGIL_OF_CHAINS_VISUAL = 208673, - SPELL_DH_SIGIL_OF_FLAME_AOE = 204598, - SPELL_DH_SIGIL_OF_MISERY_AOE = 207685, - SPELL_DH_SIGIL_OF_SILENCE_AOE = 204490, + SPELL_DH_CHAOS_STRIKE_ENERGIZE = 193840, + SPELL_DH_FIRST_BLOOD = 206416, + SPELL_DH_SIGIL_OF_CHAINS_GRIP = 208674, + SPELL_DH_SIGIL_OF_CHAINS_SLOW = 204843, + SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT = 204834, + SPELL_DH_SIGIL_OF_CHAINS_VISUAL = 208673, + SPELL_DH_SIGIL_OF_FLAME_AOE = 204598, + SPELL_DH_SIGIL_OF_MISERY_AOE = 207685, + SPELL_DH_SIGIL_OF_SILENCE_AOE = 204490, }; // 197125 - Chaos Strike @@ -48,7 +49,7 @@ class spell_dh_chaos_strike : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_CHAOS_STRIKE_ENERGIZE }); + return ValidateSpellInfo({ SPELL_DH_CHAOS_STRIKE_ENERGIZE }); } void HandleEffectProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/) @@ -57,7 +58,7 @@ class spell_dh_chaos_strike : public AuraScript CastSpellExtraArgs args(TRIGGERED_FULL_MASK); args.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount()); args.SetTriggeringAura(aurEff); - GetTarget()->CastSpell(GetTarget(), SPELL_CHAOS_STRIKE_ENERGIZE, args); + GetTarget()->CastSpell(GetTarget(), SPELL_DH_CHAOS_STRIKE_ENERGIZE, args); } void Register() override @@ -66,6 +67,103 @@ class spell_dh_chaos_strike : public AuraScript } }; + +// 206416 - First Blood +class spell_dh_first_blood : public AuraScript +{ + PrepareAuraScript(spell_dh_first_blood); + +public: + ObjectGuid const& GetFirstTarget() const { return _firstTargetGUID; } + void SetFirstTarget(ObjectGuid const& targetGuid) { _firstTargetGUID = targetGuid; } + +private: + void Register() override + { + } + +private: + ObjectGuid _firstTargetGUID; +}; + +// 188499 - Blade Dance +// 210152 - Death Sweep +class spell_dh_blade_dance : public SpellScript +{ + PrepareSpellScript(spell_dh_blade_dance); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DH_FIRST_BLOOD }); + } + + void DecideFirstTarget(std::list<WorldObject*>& targetList) + { + if (targetList.empty()) + return; + + Aura* aura = GetCaster()->GetAura(SPELL_DH_FIRST_BLOOD); + if (!aura) + return; + + ObjectGuid firstTargetGUID = ObjectGuid::Empty; + ObjectGuid selectedTarget = GetCaster()->GetTarget(); + + // Prefer the selected target if he is one of the enemies + if (targetList.size() > 1 && !selectedTarget.IsEmpty()) + { + auto it = std::find_if(targetList.begin(), targetList.end(), [selectedTarget](WorldObject* object) + { + return object->GetGUID() == selectedTarget; + }); + if (it != targetList.end()) + firstTargetGUID = (*it)->GetGUID(); + } + + if (firstTargetGUID.IsEmpty()) + firstTargetGUID = targetList.front()->GetGUID(); + + if (spell_dh_first_blood* script = aura->GetScript<spell_dh_first_blood>(STRINGIZE(spell_dh_first_blood))) + script->SetFirstTarget(firstTargetGUID); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dh_blade_dance::DecideFirstTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; + +// 199552 - Blade Dance +// 200685 - Blade Dance +// 210153 - Death Sweep +// 210155 - Death Sweep +class spell_dh_blade_dance_damage : public SpellScript +{ + PrepareSpellScript(spell_dh_blade_dance_damage); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DH_FIRST_BLOOD }); + } + + void HandleHitTarget() + { + int32 damage = GetHitDamage(); + + if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_DH_FIRST_BLOOD, EFFECT_0)) + if (spell_dh_first_blood* script = aurEff->GetBase()->GetScript<spell_dh_first_blood>(STRINGIZE(spell_dh_first_blood))) + if (GetHitUnit()->GetGUID() == script->GetFirstTarget()) + AddPct(damage, aurEff->GetAmount()); + + SetHitDamage(damage); + } + + void Register() override + { + OnHit += SpellHitFn(spell_dh_blade_dance_damage::HandleHitTarget); + } +}; + // 204596 - Sigil of Flame // 207684 - Sigil of Misery // 202137 - Sigil of Silence @@ -142,4 +240,22 @@ void AddSC_demon_hunter_spell_scripts() new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_FLAME_AOE>("areatrigger_dh_sigil_of_flame"); RegisterAreaTriggerAI(areatrigger_dh_sigil_of_chains); RegisterSpellScript(spell_dh_sigil_of_chains); + + // Havoc + + /* Spells & Auras */ + + + /* Auras */ + + RegisterAuraScript(spell_dh_first_blood); + + /* AreaTrigger */ + + + /* Spells */ + + RegisterSpellScript(spell_dh_blade_dance); + RegisterSpellScript(spell_dh_blade_dance_damage); + } |