diff options
-rw-r--r-- | sql/updates/world/master/2021_10_26_08_world.sql | 14 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_dh.cpp | 136 |
2 files changed, 140 insertions, 10 deletions
diff --git a/sql/updates/world/master/2021_10_26_08_world.sql b/sql/updates/world/master/2021_10_26_08_world.sql new file mode 100644 index 00000000000..1f620337b5d --- /dev/null +++ b/sql/updates/world/master/2021_10_26_08_world.sql @@ -0,0 +1,14 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_dh_blade_dance', +'spell_dh_blade_dance_damage', +'spell_dh_first_blood' +); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(188499, 'spell_dh_blade_dance'), +(210152, 'spell_dh_blade_dance'), +(199552, 'spell_dh_blade_dance_damage'), +(200685, 'spell_dh_blade_dance_damage'), +(210153, 'spell_dh_blade_dance_damage'), +(210155, 'spell_dh_blade_dance_damage'), +(206416, 'spell_dh_first_blood'); 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); + } |