diff options
| author | Warpten <vertozor@gmail.com> | 2013-07-23 14:55:05 +0200 |
|---|---|---|
| committer | Warpten <vertozor@gmail.com> | 2013-07-23 14:56:03 +0200 |
| commit | 804204c522c70f5b32b1d1ab34c4cf70f5c86186 (patch) | |
| tree | 73c13fa8082d69fba19877f4394c143caff0352b | |
| parent | 61313806edd8d826c657e129c468df532ac56673 (diff) | |
Spells/DK: Fixed Death Strike.
| -rw-r--r-- | sql/updates/world/2013_07_23_02_world_spell_miscs_434.sql | 11 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 103 |
2 files changed, 104 insertions, 10 deletions
diff --git a/sql/updates/world/2013_07_23_02_world_spell_miscs_434.sql b/sql/updates/world/2013_07_23_02_world_spell_miscs_434.sql new file mode 100644 index 00000000000..0bd26f016c1 --- /dev/null +++ b/sql/updates/world/2013_07_23_02_world_spell_miscs_434.sql @@ -0,0 +1,11 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_dk_death_strike_enabler'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(89832, 'spell_dk_death_strike_enabler'); + +-- Improved Death Strike (talent) ranks +DELETE FROM `spell_ranks` WHERE `first_spell_id` = 62905; +INSERT INTO `spell_ranks` (`first_spell_id`, `spell_id`, `rank`) VALUES +(62905, 62905, 1), +(62905, 62908, 2), +(62905, 81138, 3); + diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index b704a475edd..9b4c30bcd74 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -39,6 +39,7 @@ enum DeathKnightSpells SPELL_DK_DEATH_COIL_DAMAGE = 47632, SPELL_DK_DEATH_COIL_HEAL = 47633, SPELL_DK_DEATH_STRIKE_HEAL = 45470, + SPELL_DK_DEATH_STRIKE_ENABLER = 89832, SPELL_DK_GHOUL_EXPLODE = 47496, SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE = 58625, SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED = 63611, @@ -604,30 +605,37 @@ class spell_dk_death_strike : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE { - if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL)) + if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_ENABLER) + || !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_HEAL)) return false; return true; } void HandleDummy(SpellEffIndex /*effIndex*/) { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) + if (AuraEffect* enabler = GetCaster()->GetAuraEffect(SPELL_DK_DEATH_STRIKE_ENABLER, EFFECT_0, GetCaster()->GetGUID())) { - uint32 count = target->GetDiseasesByCaster(caster->GetGUID()); - int32 bp = int32(count * caster->CountPctFromMaxHealth(int32(GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier))); - // Improved Death Strike - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_DEATHKNIGHT, DK_ICON_ID_IMPROVED_DEATH_STRIKE, 0)) - AddPct(bp, caster->CalculateSpellDamage(caster, aurEff->GetSpellInfo(), 2)); - caster->CastCustomSpell(caster, SPELL_DK_DEATH_STRIKE_HEAL, &bp, NULL, NULL, false); + // Call CalculateAmount() to constantly fire the AuraEffect's HandleCalcAmount method + int32 heal = CalculatePct(enabler->CalculateAmount(GetCaster()), GetSpellInfo()->Effects[EFFECT_0].DamageMultiplier); + + if (AuraEffect const* aurEff = GetCaster()->GetAuraEffectOfRankedSpell(SPELL_DK_IMPROVED_DEATH_STRIKE, EFFECT_2)) + heal = AddPct(heal, aurEff->GetAmount()); + + heal = std::max(heal, int32(GetCaster()->CountPctFromMaxHealth(GetEffectValue()))); + GetCaster()->CastCustomSpell(SPELL_DK_DEATH_STRIKE_HEAL, SPELLVALUE_BASE_POINT0, heal, GetCaster(), true); } + + if (!GetCaster()->HasAura(SPELL_DK_BLOOD_PRESENCE)) + return; + + if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_DK_BLOOD_SHIELD_MASTERY, EFFECT_0)) + GetCaster()->CastCustomSpell(SPELL_DK_BLOOD_SHIELD_ABSORB, SPELLVALUE_BASE_POINT0, GetCaster()->CountPctFromMaxHealth(aurEff->GetAmount()), GetCaster()); } void Register() OVERRIDE { OnEffectHitTarget += SpellEffectFn(spell_dk_death_strike_SpellScript::HandleDummy, EFFECT_2, SPELL_EFFECT_DUMMY); } - }; SpellScript* GetSpellScript() const OVERRIDE @@ -636,6 +644,80 @@ class spell_dk_death_strike : public SpellScriptLoader } }; +// 89832 - Death Strike (Save damage taken in last 5 sec) +class spell_dk_death_strike_enabler : public SpellScriptLoader +{ +public: + spell_dk_death_strike_enabler() : SpellScriptLoader("spell_dk_death_strike_enabler") { } + + class spell_dk_death_strike_enabler_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_death_strike_enabler_AuraScript); + + bool Load() OVERRIDE + { + for (uint8 i = 0; i < 5; ++i) + _damagePerSecond[i] = 0; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + if (!GetUnitOwner()->HasAura(SPELL_DK_BLOOD_PRESENCE)) + { + for (uint8 i = 0; i < 5; ++i) + _damagePerSecond[i] = 0; + } + else + _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage(); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetDamageInfo(); + } + + // Cheap hack to have update calls + void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& amplitude) + { + isPeriodic = true; + amplitude = 1000; + } + + void Update(AuraEffect* aurEff) + { + // Move backwards all datas by one + for (uint8 i = 4; i > 0; --i) + _damagePerSecond[i] = _damagePerSecond[i - 1]; + _damagePerSecond[0] = 0; + } + + void HandleCalcAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = true; + amount = 0; + for (uint8 i = 0; i < 5; ++i) + amount += int32(_damagePerSecond[i]); + } + + void Register() OVERRIDE + { + DoCheckProc += AuraCheckProcFn(spell_dk_death_strike_enabler_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_death_strike_enabler_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_dk_death_strike_enabler_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dk_death_strike_enabler_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_death_strike_enabler_AuraScript::HandleCalcAmount, EFFECT_0, SPELL_AURA_DUMMY); + } + + uint32 _damagePerSecond[5]; + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_dk_death_strike_enabler_AuraScript(); + } +}; + // 47496 - Explode, Ghoul spell for Corpse Explosion class spell_dk_ghoul_explode : public SpellScriptLoader { @@ -1095,6 +1177,7 @@ void AddSC_deathknight_spell_scripts() new spell_dk_death_grip(); new spell_dk_death_pact(); new spell_dk_death_strike(); + new spell_dk_death_strike_enabler(); new spell_dk_ghoul_explode(); new spell_dk_icebound_fortitude(); new spell_dk_improved_blood_presence(); |
