mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 10:56:38 +01:00
Scripts/Spells: Implement Demon Hunter Havoc talent "First Blood" (#27176)
This commit is contained in:
14
sql/updates/world/master/2021_10_26_08_world.sql
Normal file
14
sql/updates/world/master/2021_10_26_08_world.sql
Normal file
@@ -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');
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user