Scripts/Spells: Implement Demon Hunter Havoc talent "First Blood"

Port From (https://github.com/TrinityCore/TrinityCore/commit/62e444e4b0ef7199e5ce40b216c13fb57a6e56ec)
This commit is contained in:
hondacrx
2021-11-03 12:25:48 -04:00
parent f649596651
commit b1e6aabee7
2 changed files with 103 additions and 0 deletions
+89
View File
@@ -20,12 +20,14 @@ using Game.Entities;
using Game.Scripting; using Game.Scripting;
using Game.Spells; using Game.Spells;
using Game.AI; using Game.AI;
using System.Collections.Generic;
namespace Scripts.Spells.DemonHunter namespace Scripts.Spells.DemonHunter
{ {
struct SpellIds struct SpellIds
{ {
public const uint ChaosStrikeEnergize = 193840; public const uint ChaosStrikeEnergize = 193840;
public const uint FirstBlood = 206416;
public const uint SigilOfChainsGrip = 208674; public const uint SigilOfChainsGrip = 208674;
public const uint SigilOfChainsSlow = 204843; public const uint SigilOfChainsSlow = 204843;
public const uint SigilOfChainsTargetSelect = 204834; public const uint SigilOfChainsTargetSelect = 204834;
@@ -58,6 +60,93 @@ namespace Scripts.Spells.DemonHunter
} }
} }
[Script] // 206416 - First Blood
class spell_dh_first_blood : AuraScript
{
ObjectGuid _firstTargetGUID;
public ObjectGuid GetFirstTarget() { return _firstTargetGUID; }
public void SetFirstTarget(ObjectGuid targetGuid) { _firstTargetGUID = targetGuid; }
public override void Register() { }
}
// 188499 - Blade Dance
[Script] // 210152 - Death Sweep
class spell_dh_blade_dance : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.FirstBlood);
}
void DecideFirstTarget(List<WorldObject> targetList)
{
if (targetList.Empty())
return;
Aura aura = GetCaster().GetAura(SpellIds.FirstBlood);
if (aura == null)
return;
ObjectGuid firstTargetGUID = ObjectGuid.Empty;
ObjectGuid selectedTarget = GetCaster().GetTarget();
// Prefer the selected target if he is one of the enemies
if (targetList.Count > 1 && !selectedTarget.IsEmpty())
{
var foundObj = targetList.Find(obj => obj.GetGUID() == selectedTarget);
if (foundObj != null)
firstTargetGUID = foundObj.GetGUID();
}
if (firstTargetGUID.IsEmpty())
firstTargetGUID = targetList[0].GetGUID();
spell_dh_first_blood script = aura.GetScript<spell_dh_first_blood>(nameof(spell_dh_first_blood));
if (script != null)
script.SetFirstTarget(firstTargetGUID);
}
public override void Register()
{
OnObjectAreaTargetSelect.Add(new ObjectAreaTargetSelectHandler(DecideFirstTarget, 0, Targets.UnitSrcAreaEnemy));
}
}
// 199552 - Blade Dance
// 200685 - Blade Dance
// 210153 - Death Sweep
[Script] // 210155 - Death Sweep
class spell_dh_blade_dance_damage : SpellScript
{
public override bool Validate(SpellInfo spellInfo)
{
return ValidateSpellInfo(SpellIds.FirstBlood);
}
void HandleHitTarget()
{
int damage = GetHitDamage();
AuraEffect aurEff = GetCaster().GetAuraEffect(SpellIds.FirstBlood, 0);
if (aurEff != null)
{
spell_dh_first_blood script = aurEff.GetBase().GetScript<spell_dh_first_blood>(nameof(spell_dh_first_blood));
if (script != null)
if (GetHitUnit().GetGUID() == script.GetFirstTarget())
MathFunctions.AddPct(ref damage, aurEff.GetAmount());
}
SetHitDamage(damage);
}
public override void Register()
{
OnHit.Add(new HitHandler(HandleHitTarget));
}
}
// 204596 - Sigil of Flame // 204596 - Sigil of Flame
// 207684 - Sigil of Misery // 207684 - Sigil of Misery
// 202137 - Sigil of Silence // 202137 - Sigil of Silence
@@ -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');