aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2013_07_23_02_world_spell_miscs_434.sql11
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp103
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();