Scripts/Spells: Implement demon hunter talent "Darkness" (#30473)

This commit is contained in:
Aqua Deus
2024-12-01 15:10:42 +01:00
committed by GitHub
parent 7231f6722f
commit 711fe685dd
2 changed files with 132 additions and 65 deletions

View File

@@ -0,0 +1,9 @@
UPDATE `areatrigger_template` SET `VerifiedBuild`=57689 WHERE (`Id`=11203 AND `IsCustom`=0);
DELETE FROM `areatrigger_create_properties` WHERE (`Id`=6615 AND `IsCustom`=0);
INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTarget`, `TimeToTargetScale`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
(6615, 0, 11203, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 8000, 0, 8, 8, 0, 0, 0, 0, 0, 0, 'areatrigger_dh_darkness', 57689); -- Spell: 196718 (Darkness)
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dh_darkness';
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(209426, 'spell_dh_darkness');

View File

@@ -279,6 +279,62 @@ private:
uint32 _healAmount = 0;
};
// 209426 - Darkness
class spell_dh_darkness : public AuraScript
{
bool Validate(SpellInfo const* spellInfo) override
{
return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
}
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
// Set absorbtion amount to unlimited
amount = -1;
}
void Absorb(AuraEffect const* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) const
{
if (AuraEffect const* chanceEffect = GetEffect(EFFECT_1))
if (roll_chance_i(chanceEffect->GetAmount()))
absorbAmount = dmgInfo.GetDamage();
}
void Register() override
{
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dh_darkness::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
OnEffectAbsorb += AuraEffectAbsorbFn(spell_dh_darkness::Absorb, EFFECT_0);
}
};
// 196718 - Darkness
// Id: 6615
struct areatrigger_dh_darkness : AreaTriggerAI
{
areatrigger_dh_darkness(AreaTrigger* areaTrigger) : AreaTriggerAI(areaTrigger),
_absorbAuraInfo(sSpellMgr->GetSpellInfo(SPELL_DH_DARKNESS_ABSORB, DIFFICULTY_NONE)) { }
void OnUnitEnter(Unit* unit) override
{
Unit* caster = at->GetCaster();
if (!caster || !caster->IsValidAssistTarget(unit, _absorbAuraInfo))
return;
caster->CastSpell(unit, SPELL_DH_DARKNESS_ABSORB, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.SpellValueOverrides = { { SPELLVALUE_DURATION, at->GetDuration() } }
});
}
void OnUnitExit(Unit* unit) override
{
unit->RemoveAura(SPELL_DH_DARKNESS_ABSORB, at->GetCasterGuid());
}
private:
SpellInfo const* _absorbAuraInfo;
};
// 198013 - Eye Beam
class spell_dh_eye_beam : public AuraScript
{
@@ -392,71 +448,6 @@ class spell_dh_blade_dance_damage : public SpellScript
}
};
// 204596 - Sigil of Flame
// 207684 - Sigil of Misery
// 202137 - Sigil of Silence
template<uint32 TriggerSpellId>
class areatrigger_dh_generic_sigil : public AreaTriggerEntityScript
{
public:
areatrigger_dh_generic_sigil(char const* script) : AreaTriggerEntityScript(script) { }
template<uint32 Trigger>
struct areatrigger_dh_generic_sigilAI : AreaTriggerAI
{
areatrigger_dh_generic_sigilAI(AreaTrigger* at) : AreaTriggerAI(at) { }
void OnRemove() override
{
if (Unit* caster = at->GetCaster())
caster->CastSpell(at->GetPosition(), Trigger);
}
};
AreaTriggerAI* GetAI(AreaTrigger* at) const override
{
return new areatrigger_dh_generic_sigilAI<TriggerSpellId>(at);
}
};
// 208673 - Sigil of Chains
class spell_dh_sigil_of_chains : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_DH_SIGIL_OF_CHAINS_SLOW, SPELL_DH_SIGIL_OF_CHAINS_GRIP });
}
void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
{
if (WorldLocation const* loc = GetExplTargetDest())
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_DH_SIGIL_OF_CHAINS_SLOW, true);
GetHitUnit()->CastSpell(loc->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_GRIP, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_dh_sigil_of_chains::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 202138 - Sigil of Chains
struct areatrigger_dh_sigil_of_chains : AreaTriggerAI
{
areatrigger_dh_sigil_of_chains(AreaTrigger* at) : AreaTriggerAI(at) { }
void OnRemove() override
{
if (Unit* caster = at->GetCaster())
{
caster->CastSpell(at->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_VISUAL);
caster->CastSpell(at->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT);
}
}
};
// 131347 - Glide
class spell_dh_glide : public SpellScript
{
@@ -583,6 +574,71 @@ class spell_dh_soul_furnace_conduit : public AuraScript
}
};
// 204596 - Sigil of Flame
// 207684 - Sigil of Misery
// 202137 - Sigil of Silence
template<uint32 TriggerSpellId>
class areatrigger_dh_generic_sigil : public AreaTriggerEntityScript
{
public:
areatrigger_dh_generic_sigil(char const* script) : AreaTriggerEntityScript(script) { }
template<uint32 Trigger>
struct areatrigger_dh_generic_sigilAI : AreaTriggerAI
{
areatrigger_dh_generic_sigilAI(AreaTrigger* at) : AreaTriggerAI(at) { }
void OnRemove() override
{
if (Unit* caster = at->GetCaster())
caster->CastSpell(at->GetPosition(), Trigger);
}
};
AreaTriggerAI* GetAI(AreaTrigger* at) const override
{
return new areatrigger_dh_generic_sigilAI<TriggerSpellId>(at);
}
};
// 208673 - Sigil of Chains
class spell_dh_sigil_of_chains : public SpellScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_DH_SIGIL_OF_CHAINS_SLOW, SPELL_DH_SIGIL_OF_CHAINS_GRIP });
}
void HandleEffectHitTarget(SpellEffIndex /*effIndex*/)
{
if (WorldLocation const* loc = GetExplTargetDest())
{
GetCaster()->CastSpell(GetHitUnit(), SPELL_DH_SIGIL_OF_CHAINS_SLOW, true);
GetHitUnit()->CastSpell(loc->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_GRIP, true);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_dh_sigil_of_chains::HandleEffectHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
// 202138 - Sigil of Chains
struct areatrigger_dh_sigil_of_chains : AreaTriggerAI
{
areatrigger_dh_sigil_of_chains(AreaTrigger* at) : AreaTriggerAI(at) { }
void OnRemove() override
{
if (Unit* caster = at->GetCaster())
{
caster->CastSpell(at->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_VISUAL);
caster->CastSpell(at->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT);
}
}
};
// Called by 198793 - Vengeful Retreat
class spell_dh_tactical_retreat : public SpellScript
{
@@ -635,11 +691,13 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_chaos_strike);
RegisterSpellScript(spell_dh_chaotic_transformation);
RegisterSpellScript(spell_dh_charred_warblades);
RegisterSpellScript(spell_dh_darkness);
RegisterSpellScript(spell_dh_eye_beam);
RegisterSpellScript(spell_dh_sigil_of_chains);
RegisterSpellScript(spell_dh_tactical_retreat);
RegisterSpellScript(spell_dh_vengeful_retreat_damage);
RegisterAreaTriggerAI(areatrigger_dh_darkness);
new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_SILENCE_AOE>("areatrigger_dh_sigil_of_silence");
new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_MISERY_AOE>("areatrigger_dh_sigil_of_misery");
new areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_FLAME_AOE>("areatrigger_dh_sigil_of_flame");