aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Spells
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/Spells')
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp161
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp280
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp555
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp87
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp78
-rw-r--r--src/server/scripts/Spells/spell_item.cpp576
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp362
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp251
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp269
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp207
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp98
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp329
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp373
13 files changed, 3398 insertions, 228 deletions
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 5b43a46cb1f..f5a6bb61120 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -31,12 +31,14 @@ enum DeathKnightSpells
SPELL_DK_ANTI_MAGIC_SHELL_TALENT = 51052,
SPELL_DK_BLACK_ICE_R1 = 49140,
SPELL_DK_BLOOD_BOIL_TRIGGERED = 65658,
+ SPELL_DK_BLOOD_GORGED_HEAL = 50454,
SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999,
SPELL_DK_CORPSE_EXPLOSION_VISUAL = 51270,
SPELL_DK_DEATH_COIL_DAMAGE = 47632,
SPELL_DK_DEATH_COIL_HEAL = 47633,
SPELL_DK_DEATH_STRIKE_HEAL = 45470,
SPELL_DK_GHOUL_EXPLODE = 47496,
+ SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE = 58625,
SPELL_DK_RUNIC_POWER_ENERGIZE = 49088,
SPELL_DK_SCOURGE_STRIKE_TRIGGERED = 70890,
SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1 = 49189,
@@ -251,6 +253,58 @@ class spell_dk_blood_boil : public SpellScriptLoader
}
};
+// 50453 - Bloodworms Health Leech
+class spell_dk_blood_gorged : public SpellScriptLoader
+{
+ public:
+ spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { }
+
+ class spell_dk_blood_gorged_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_blood_gorged_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_GORGED_HEAL))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetTarget()->GetOwner();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 1.5f);
+ GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_blood_gorged_AuraScript();
+ }
+};
+
// 49158 - Corpse Explosion (51325, 51326, 51327, 51328)
class spell_dk_corpse_explosion : public SpellScriptLoader
{
@@ -584,6 +638,55 @@ class spell_dk_ghoul_explode : public SpellScriptLoader
}
};
+// 48792 - Icebound Fortitude
+class spell_dk_icebound_fortitude : public SpellScriptLoader
+{
+ public:
+ spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { }
+
+ class spell_dk_icebound_fortitude_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ int32 value = amount;
+ uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
+
+ if (defValue > 400)
+ value -= int32((defValue - 400) * 0.15);
+
+ // Glyph of Icebound Fortitude
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0))
+ {
+ int32 valMax = -aurEff->GetAmount();
+ if (value > valMax)
+ value = valMax;
+ }
+ amount = value;
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_icebound_fortitude_AuraScript();
+ }
+};
+
// 50365, 50371 - Improved Blood Presence
class spell_dk_improved_blood_presence : public SpellScriptLoader
{
@@ -677,6 +780,33 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader
}
};
+// 59754 Rune Tap - Party
+class spell_dk_rune_tap_party : public SpellScriptLoader
+{
+ public:
+ spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { }
+
+ class spell_dk_rune_tap_party_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dk_rune_tap_party_SpellScript);
+
+ void CheckTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove(GetCaster());
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dk_rune_tap_party_SpellScript();
+ }
+};
+
// 55090 - Scourge Strike (55265, 55270, 55271)
class spell_dk_scourge_strike : public SpellScriptLoader
{
@@ -784,6 +914,33 @@ class spell_dk_spell_deflection : public SpellScriptLoader
}
};
+// 55233 - Vampiric Blood
+class spell_dk_vampiric_blood : public SpellScriptLoader
+{
+ public:
+ spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { }
+
+ class spell_dk_vampiric_blood_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_vampiric_blood_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = GetUnitOwner()->CountPctFromMaxHealth(amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_vampiric_blood_AuraScript();
+ }
+};
+
// 52284 - Will of the Necropolis
class spell_dk_will_of_the_necropolis : public SpellScriptLoader
{
@@ -854,6 +1011,7 @@ void AddSC_deathknight_spell_scripts()
new spell_dk_anti_magic_shell_self();
new spell_dk_anti_magic_zone();
new spell_dk_blood_boil();
+ new spell_dk_blood_gorged();
new spell_dk_corpse_explosion();
new spell_dk_death_coil();
new spell_dk_death_gate();
@@ -861,9 +1019,12 @@ void AddSC_deathknight_spell_scripts()
new spell_dk_death_pact();
new spell_dk_death_strike();
new spell_dk_ghoul_explode();
+ new spell_dk_icebound_fortitude();
new spell_dk_improved_blood_presence();
new spell_dk_improved_unholy_presence();
+ new spell_dk_rune_tap_party();
new spell_dk_scourge_strike();
new spell_dk_spell_deflection();
+ new spell_dk_vampiric_blood();
new spell_dk_will_of_the_necropolis();
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index b5b4937a14c..8fd44544fb8 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -39,10 +39,15 @@ enum DruidSpells
SPELL_DRUID_SOLAR_ECLIPSE = 48517,
SPELL_DRUID_LUNAR_ECLIPSE = 48518,
SPELL_DRUID_ENRAGE_MOD_DAMAGE = 51185,
+ SPELL_DRUID_GLYPH_OF_TYPHOON = 62135,
+ SPELL_DRUID_IDOL_OF_FERAL_SHADOWS = 34241,
+ SPELL_DRUID_IDOL_OF_WORSHIP = 60774,
SPELL_DRUID_INCREASED_MOONFIRE_DURATION = 38414,
SPELL_DRUID_KING_OF_THE_JUNGLE = 48492,
SPELL_DRUID_LIFEBLOOM_ENERGIZE = 64372,
SPELL_DRUID_LIFEBLOOM_FINAL_HEAL = 33778,
+ SPELL_DRUID_LIVING_SEED_HEAL = 48503,
+ SPELL_DRUID_LIVING_SEED_PROC = 48504,
SPELL_DRUID_NATURES_SPLENDOR = 57865,
SPELL_DRUID_SURVIVAL_INSTINCTS = 50322,
SPELL_DRUID_SAVAGE_ROAR = 62071,
@@ -160,6 +165,35 @@ class spell_dru_eclipse_energize : public SpellScriptLoader
}
};
+// -1850 - Dash
+class spell_dru_dash : public SpellScriptLoader
+{
+ public:
+ spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { }
+
+ class spell_dru_dash_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_dash_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ // do not set speed if not in cat form
+ if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT)
+ amount = 0;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_dash_AuraScript();
+ }
+};
+
// -5229 - Enrage
class spell_dru_enrage : public SpellScriptLoader
{
@@ -240,6 +274,69 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader
}
};
+// 34246 - Idol of the Emerald Queen
+// 60779 - Idol of Lush Moss
+class spell_dru_idol_lifebloom : public SpellScriptLoader
+{
+ public:
+ spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { }
+
+ class spell_dru_idol_lifebloom_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript);
+
+ void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ {
+ if (!spellMod)
+ {
+ spellMod = new SpellModifier(GetAura());
+ spellMod->op = SPELLMOD_DOT;
+ spellMod->type = SPELLMOD_FLAT;
+ spellMod->spellId = GetId();
+ spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask;
+ }
+ spellMod->value = aurEff->GetAmount() / 7;
+ }
+
+ void Register()
+ {
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_idol_lifebloom_AuraScript();
+ }
+};
+
+// 29166 - Innervate
+class spell_dru_innervate : public SpellScriptLoader
+{
+ public:
+ spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { }
+
+ class spell_dru_innervate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_innervate_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = CalculatePct(int32(GetUnitOwner()->GetCreatePowers(POWER_MANA) / aurEff->GetTotalTicks()), amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_innervate_AuraScript();
+ }
+};
+
// -5570 - Insect Swarm
class spell_dru_insect_swarm : public SpellScriptLoader
{
@@ -351,6 +448,77 @@ class spell_dru_lifebloom : public SpellScriptLoader
}
};
+// -48496 - Living Seed
+class spell_dru_living_seed : public SpellScriptLoader
+{
+ public:
+ spell_dru_living_seed() : SpellScriptLoader("spell_dru_living_seed") { }
+
+ class spell_dru_living_seed_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_living_seed_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_living_seed_AuraScript();
+ }
+};
+
+// 48504 - Living Seed (Proc)
+class spell_dru_living_seed_proc : public SpellScriptLoader
+{
+ public:
+ spell_dru_living_seed_proc() : SpellScriptLoader("spell_dru_living_seed_proc") { }
+
+ class spell_dru_living_seed_proc_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_living_seed_proc_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_living_seed_proc_AuraScript();
+ }
+};
+
// 69366 - Moonkin Form passive
class spell_dru_moonkin_form_passive : public SpellScriptLoader
{
@@ -395,6 +563,33 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader
}
};
+// 48391 - Owlkin Frenzy
+class spell_dru_owlkin_frenzy : public SpellScriptLoader
+{
+ public:
+ spell_dru_owlkin_frenzy() : SpellScriptLoader("spell_dru_owlkin_frenzy") { }
+
+ class spell_dru_owlkin_frenzy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_owlkin_frenzy_AuraScript();
+ }
+};
+
// -16972 - Predatory Strikes
class spell_dru_predatory_strikes : public SpellScriptLoader
{
@@ -468,6 +663,54 @@ class spell_dru_primal_tenacity : public SpellScriptLoader
}
};
+// -1079 - Rip
+class spell_dru_rip : public SpellScriptLoader
+{
+ public:
+ spell_dru_rip() : SpellScriptLoader("spell_dru_rip") { }
+
+ class spell_dru_rip_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_rip_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+
+ if (Unit* caster = GetCaster())
+ {
+ // 0.01 * $AP * cp
+ uint8 cp = caster->ToPlayer()->GetComboPoints();
+
+ // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs
+ if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0))
+ amount += cp * idol->GetAmount();
+ // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs
+ else if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0))
+ amount += cp * idol->GetAmount();
+
+ amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp));
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_rip_AuraScript();
+ }
+};
+
// 62606 - Savage Defense
class spell_dru_savage_defense : public SpellScriptLoader
{
@@ -777,6 +1020,35 @@ class spell_dru_tiger_s_fury : public SpellScriptLoader
}
};
+// -61391 - Typhoon
+class spell_dru_typhoon : public SpellScriptLoader
+{
+ public:
+ spell_dru_typhoon() : SpellScriptLoader("spell_dru_typhoon") { }
+
+ class spell_dru_typhoon_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dru_typhoon_SpellScript);
+
+ void HandleKnockBack(SpellEffIndex effIndex)
+ {
+ // Glyph of Typhoon
+ if (GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_TYPHOON))
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dru_typhoon_SpellScript::HandleKnockBack, EFFECT_0, SPELL_EFFECT_KNOCK_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dru_typhoon_SpellScript();
+ }
+};
+
// 70691 - Item T10 Restoration 4P Bonus
class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
{
@@ -834,14 +1106,21 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
void AddSC_druid_spell_scripts()
{
+ new spell_dru_dash();
new spell_dru_eclipse_energize();
new spell_dru_enrage();
new spell_dru_glyph_of_starfire();
+ new spell_dru_idol_lifebloom();
+ new spell_dru_innervate();
new spell_dru_insect_swarm();
new spell_dru_lifebloom();
+ new spell_dru_living_seed();
+ new spell_dru_living_seed_proc();
new spell_dru_moonkin_form_passive();
+ new spell_dru_owlkin_frenzy();
new spell_dru_predatory_strikes();
new spell_dru_primal_tenacity();
+ new spell_dru_rip();
new spell_dru_savage_defense();
new spell_dru_savage_roar();
new spell_dru_starfall_aoe();
@@ -849,5 +1128,6 @@ void AddSC_druid_spell_scripts()
new spell_dru_survival_instincts();
new spell_dru_swift_flight_passive();
new spell_dru_tiger_s_fury();
+ new spell_dru_typhoon();
new spell_dru_t10_restoration_4p_bonus();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 54cb346a033..74334f192f4 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -72,6 +72,97 @@ class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
}
};
+// 28764 - Adaptive Warding (Frostfire Regalia Set)
+enum AdaptiveWarding
+{
+ SPELL_GEN_ADAPTIVE_WARDING_FIRE = 28765,
+ SPELL_GEN_ADAPTIVE_WARDING_NATURE = 28768,
+ SPELL_GEN_ADAPTIVE_WARDING_FROST = 28766,
+ SPELL_GEN_ADAPTIVE_WARDING_SHADOW = 28769,
+ SPELL_GEN_ADAPTIVE_WARDING_ARCANE = 28770
+};
+
+class spell_gen_adaptive_warding : public SpellScriptLoader
+{
+ public:
+ spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { }
+
+ class spell_gen_adaptive_warding_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_adaptive_warding_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
+ return false;
+
+ // find Mage Armor
+ if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0))
+ return false;
+
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_NORMAL:
+ case SPELL_SCHOOL_HOLY:
+ return false;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ uint32 spellId = 0;
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_FIRE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE;
+ break;
+ default:
+ return;
+ }
+ GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_adaptive_warding_AuraScript();
+ }
+};
+
// 41337 Aura of Anger
class spell_gen_aura_of_anger : public SpellScriptLoader
{
@@ -226,6 +317,245 @@ class spell_gen_cannibalize : public SpellScriptLoader
}
};
+// 63845 - Create Lance
+enum CreateLanceSpells
+{
+ SPELL_CREATE_LANCE_ALLIANCE = 63914,
+ SPELL_CREATE_LANCE_HORDE = 63919
+};
+
+class spell_gen_create_lance : public SpellScriptLoader
+{
+ public:
+ spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { }
+
+ class spell_gen_create_lance_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_create_lance_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Player* target = GetHitPlayer())
+ {
+ if (target->GetTeam() == ALLIANCE)
+ GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true);
+ else
+ GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_create_lance_SpellScript();
+ }
+};
+
+// 28702 - Netherbloom
+enum Netherbloom
+{
+ SPELL_NETHERBLOOM_POLLEN_1 = 28703
+};
+
+class spell_gen_netherbloom : public SpellScriptLoader
+{
+ public:
+ spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { }
+
+ class spell_gen_netherbloom_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_netherbloom_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ for (uint8 i = 0; i < 5; ++i)
+ if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* target = GetHitUnit())
+ {
+ // 25% chance of casting a random buff
+ if (roll_chance_i(75))
+ return;
+
+ // triggered spells are 28703 to 28707
+ // Note: some sources say, that there was the possibility of
+ // receiving a debuff. However, this seems to be removed by a patch.
+
+ // don't overwrite an existing aura
+ for (uint8 i = 0; i < 5; ++i)
+ if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i))
+ return;
+
+ target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_netherbloom_SpellScript();
+ }
+};
+
+// 28720 - Nightmare Vine
+enum NightmareVine
+{
+ SPELL_NIGHTMARE_POLLEN = 28721
+};
+
+class spell_gen_nightmare_vine : public SpellScriptLoader
+{
+ public:
+ spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { }
+
+ class spell_gen_nightmare_vine_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_nightmare_vine_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* target = GetHitUnit())
+ {
+ // 25% chance of casting Nightmare Pollen
+ if (roll_chance_i(25))
+ target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_nightmare_vine_SpellScript();
+ }
+};
+
+// 27539 - Obsidian Armor
+enum ObsidianArmor
+{
+ SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536,
+ SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533,
+ SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538,
+ SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534,
+ SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535,
+ SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540
+};
+
+class spell_gen_obsidian_armor : public SpellScriptLoader
+{
+ public:
+ spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { }
+
+ class spell_gen_obsidian_armor_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_obsidian_armor_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
+ return false;
+
+ if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL)
+ return false;
+
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ uint32 spellId = 0;
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY;
+ break;
+ case SPELL_SCHOOL_FIRE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE;
+ break;
+ default:
+ return;
+ }
+ GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_obsidian_armor_AuraScript();
+ }
+};
+
// 45472 Parachute
enum ParachuteSpells
{
@@ -1322,68 +1652,6 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader
}
};
-class spell_gen_luck_of_the_draw : public SpellScriptLoader
-{
- public:
- spell_gen_luck_of_the_draw() : SpellScriptLoader("spell_gen_luck_of_the_draw") { }
-
- class spell_gen_luck_of_the_draw_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_luck_of_the_draw_AuraScript);
-
- bool Load()
- {
- return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;
- }
-
- // cheap hax to make it have update calls
- void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
- {
- isPeriodic = true;
- amplitude = 5 * IN_MILLISECONDS;
- }
-
- void Update(AuraEffect* /*effect*/)
- {
- if (Player* owner = GetUnitOwner()->ToPlayer())
- {
- const LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(owner->GetGUID());
- LfgDungeonSet::const_iterator itr = dungeons.begin();
-
- if (itr == dungeons.end())
- {
- Remove(AURA_REMOVE_BY_DEFAULT);
- return;
- }
-
-
- LFGDungeonData const* randomDungeon = sLFGMgr->GetLFGDungeon(*itr);
- if (Group* group = owner->GetGroup())
- if (Map const* map = owner->GetMap())
- if (group->isLFGGroup())
- if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
- if (LFGDungeonData const* dungeon = sLFGMgr->GetLFGDungeon(dungeonId))
- if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty())
- if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM)
- return; // in correct dungeon
-
- Remove(AURA_REMOVE_BY_DEFAULT);
- }
- }
-
- void Register()
- {
- DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_luck_of_the_draw_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_luck_of_the_draw_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_gen_luck_of_the_draw_AuraScript();
- }
-};
-
enum DummyTrigger
{
SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470,
@@ -3163,13 +3431,172 @@ class spell_gen_replenishment : public SpellScriptLoader
}
};
+enum RunningWildMountIds
+{
+ RUNNING_WILD_MODEL_MALE = 29422,
+ RUNNING_WILD_MODEL_FEMALE = 29423,
+ SPELL_ALTERED_FORM = 97709,
+};
+
+class spell_gen_running_wild : public SpellScriptLoader
+{
+ public:
+ spell_gen_running_wild() : SpellScriptLoader("spell_gen_running_wild") { }
+
+ class spell_gen_running_wild_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_running_wild_AuraScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_MALE))
+ return false;
+ if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_FEMALE))
+ return false;
+ return true;
+ }
+
+ void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ PreventDefaultAction();
+
+ target->Mount(target->getGender() == GENDER_FEMALE ? RUNNING_WILD_MODEL_FEMALE : RUNNING_WILD_MODEL_MALE, 0, 0);
+
+ // cast speed aura
+ if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount()))
+ target->CastSpell(target, mountCapability->SpeedModSpell, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_AuraScript::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ class spell_gen_running_wild_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_running_wild_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ALTERED_FORM))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ // Definitely not a good thing, but currently the only way to do something at cast start
+ // Should be replaced as soon as possible with a new hook: BeforeCastStart
+ GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
+ return false;
+ }
+
+ void Register()
+ {
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_running_wild_AuraScript();
+ }
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_running_wild_SpellScript();
+ }
+};
+
+class spell_gen_two_forms : public SpellScriptLoader
+{
+ public:
+ spell_gen_two_forms() : SpellScriptLoader("spell_gen_two_forms") { }
+
+ class spell_gen_two_forms_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_two_forms_SpellScript);
+
+ SpellCastResult CheckCast()
+ {
+ if (GetCaster()->isInCombat())
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ // Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight)
+ if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1)
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ return SPELL_CAST_OK;
+ }
+
+ void HandleTransform(SpellEffIndex effIndex)
+ {
+ Unit* target = GetHitUnit();
+ PreventHitDefaultEffect(effIndex);
+ if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM))
+ target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM);
+ else // Basepoints 1 for this aura control whether to trigger transform transition animation or not.
+ target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_gen_two_forms_SpellScript::CheckCast);
+ OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms_SpellScript::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_two_forms_SpellScript();
+ }
+};
+
+class spell_gen_darkflight : public SpellScriptLoader
+{
+ public:
+ spell_gen_darkflight() : SpellScriptLoader("spell_gen_darkflight") { }
+
+ class spell_gen_darkflight_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_darkflight_SpellScript);
+
+ void TriggerTransform()
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ AfterCast += SpellCastFn(spell_gen_darkflight_SpellScript::TriggerTransform);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_darkflight_SpellScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
+ new spell_gen_adaptive_warding();
new spell_gen_aura_of_anger();
new spell_gen_av_drekthar_presence();
new spell_gen_burn_brutallus();
new spell_gen_cannibalize();
+ new spell_gen_create_lance();
+ new spell_gen_netherbloom();
+ new spell_gen_nightmare_vine();
+ new spell_gen_obsidian_armor();
new spell_gen_parachute();
new spell_gen_pet_summoned();
new spell_gen_remove_flight_auras();
@@ -3192,7 +3619,6 @@ void AddSC_generic_spell_scripts()
new spell_gen_launch();
new spell_gen_vehicle_scaling();
new spell_gen_oracle_wolvar_reputation();
- new spell_gen_luck_of_the_draw();
new spell_gen_dummy_trigger();
new spell_gen_spirit_healer_res();
new spell_gen_gadgetzan_transporter_backfire();
@@ -3243,4 +3669,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance");
new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance");
new spell_gen_replenishment();
+ new spell_gen_running_wild();
+ new spell_gen_two_forms();
+ new spell_gen_darkflight();
}
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index d883b4d7da7..dbfc2b44501 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -303,27 +303,10 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
void HandleScript(SpellEffIndex /*effIndex*/)
{
- Unit* caster = GetCaster();
-
if (Player* target = GetHitPlayer())
{
- uint32 spellId = 0;
- switch (urand(0, 2))
- {
- case 0:
- spellId = SPELL_CREATE_MISTLETOE;
- break;
- case 1:
- spellId = SPELL_CREATE_HOLLY;
- break;
- case 2:
- spellId = SPELL_CREATE_SNOWFLAKES;
- break;
- default:
- return;
- }
-
- caster->CastSpell(target, spellId, true);
+ uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES);
+ GetCaster()->CastSpell(target, spellId, true);
}
}
@@ -339,6 +322,71 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
}
};
+// 26275 - PX-238 Winter Wondervolt TRAP
+enum PX238WinterWondervolt
+{
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1 = 26157,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2 = 26272,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3 = 26273,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4 = 26274
+};
+
+class spell_winter_veil_px_238_winter_wondervolt : public SpellScriptLoader
+{
+ public:
+ spell_winter_veil_px_238_winter_wondervolt() : SpellScriptLoader("spell_winter_veil_px_238_winter_wondervolt") { }
+
+ class spell_winter_veil_px_238_winter_wondervolt_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_winter_veil_px_238_winter_wondervolt_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ uint32 const spells[4] =
+ {
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4
+ };
+
+ if (Unit* target = GetHitUnit())
+ {
+ for (uint8 i = 0; i < 4; ++i)
+ if (target->HasAura(spells[i]))
+ return;
+
+ GetCaster()->CastSpell(target, spells[urand(0, 3)], true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_winter_veil_px_238_winter_wondervolt_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+
+ private:
+
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_winter_veil_px_238_winter_wondervolt_SpellScript();
+ }
+};
+
void AddSC_holiday_spell_scripts()
{
// Love is in the Air
@@ -349,4 +397,5 @@ void AddSC_holiday_spell_scripts()
new spell_hallow_end_tricky_treat();
// Winter Veil
new spell_winter_veil_mistletoe();
+ new spell_winter_veil_px_238_winter_wondervolt();
}
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index a9b21807899..891a7daaa1f 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -33,12 +33,15 @@
enum HunterSpells
{
SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET = 61669,
+ SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE = 34075,
SPELL_HUNTER_BESTIAL_WRATH = 19574,
SPELL_HUNTER_CHIMERA_SHOT_SERPENT = 53353,
SPELL_HUNTER_CHIMERA_SHOT_VIPER = 53358,
SPELL_HUNTER_CHIMERA_SHOT_SCORPID = 53359,
+ SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER = 56851,
SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398,
SPELL_HUNTER_MASTERS_CALL_TRIGGERED = 62305,
+ SPELL_HUNTER_MISDIRECTION_PROC = 35079,
SPELL_HUNTER_PET_LAST_STAND_TRIGGERED = 53479,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX = 55709,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
@@ -99,6 +102,50 @@ class spell_hun_aspect_of_the_beast : public SpellScriptLoader
}
};
+// 34074 - Aspect of the Viper
+class spell_hun_ascpect_of_the_viper : public SpellScriptLoader
+{
+ public:
+ spell_hun_ascpect_of_the_viper() : SpellScriptLoader("spell_hun_ascpect_of_the_viper") { }
+
+ class spell_hun_ascpect_of_the_viper_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_ascpect_of_the_viper_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ uint32 maxMana = GetTarget()->GetMaxPower(POWER_MANA);
+ int32 mana = CalculatePct(maxMana, GetTarget()->GetAttackTime(RANGED_ATTACK) / 1000.0f);
+
+ if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER, EFFECT_0))
+ AddPct(mana, glyph->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_hun_ascpect_of_the_viper_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OBS_MOD_POWER);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_hun_ascpect_of_the_viper_AuraScript();
+ }
+};
+
// 53209 - Chimera Shot
class spell_hun_chimera_shot : public SpellScriptLoader
{
@@ -358,16 +405,35 @@ class spell_hun_misdirection : public SpellScriptLoader
{
PrepareAuraScript(spell_hun_misdirection_AuraScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MISDIRECTION_PROC))
+ return false;
+ return true;
+ }
+
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (Unit* caster = GetCaster())
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
- caster->SetReducedThreatPercent(0, 0);
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
+ GetTarget()->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetTarget()->GetRedirectThreatTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, true, NULL, aurEff);
}
void Register()
{
AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_hun_misdirection_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_hun_misdirection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
}
};
@@ -377,7 +443,7 @@ class spell_hun_misdirection : public SpellScriptLoader
}
};
-// 35079 - Misdirection proc
+// 35079 - Misdirection (Proc)
class spell_hun_misdirection_proc : public SpellScriptLoader
{
public:
@@ -389,8 +455,7 @@ class spell_hun_misdirection_proc : public SpellScriptLoader
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (GetCaster())
- GetCaster()->SetReducedThreatPercent(0, 0);
+ GetTarget()->ResetRedirectThreat();
}
void Register()
@@ -740,6 +805,7 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader
void AddSC_hunter_spell_scripts()
{
new spell_hun_aspect_of_the_beast();
+ new spell_hun_ascpect_of_the_viper();
new spell_hun_chimera_shot();
new spell_hun_disengage();
new spell_hun_invigoration();
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index b4e06cb6b48..b8e17f4ecca 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -73,6 +73,150 @@ class spell_item_trigger_spell : public SpellScriptLoader
}
};
+// 26400 - Arcane Shroud
+class spell_item_arcane_shroud : public SpellScriptLoader
+{
+ public:
+ spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { }
+
+ class spell_item_arcane_shroud_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_arcane_shroud_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ int32 diff = GetUnitOwner()->getLevel() - 60;
+ if (diff > 0)
+ amount += 2 * diff;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_arcane_shroud_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_arcane_shroud_AuraScript();
+ }
+};
+
+// 64411 - Blessing of Ancient Kings (Val'anyr, Hammer of Ancient Kings)
+enum BlessingOfAncientKings
+{
+ SPELL_PROTECTION_OF_ANCIENT_KINGS = 64413
+};
+
+class spell_item_blessing_of_ancient_kings : public SpellScriptLoader
+{
+ public:
+ spell_item_blessing_of_ancient_kings() : SpellScriptLoader("spell_item_blessing_of_ancient_kings") { }
+
+ class spell_item_blessing_of_ancient_kings_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_blessing_of_ancient_kings_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PROTECTION_OF_ANCIENT_KINGS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f));
+ if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0, eventInfo.GetActor()->GetGUID()))
+ {
+ // The shield can grow to a maximum size of 20,000 damage absorbtion
+ protEff->SetAmount(std::min<int32>(protEff->GetAmount() + absorb, 20000));
+
+ // Refresh and return to prevent replacing the aura
+ aurEff->GetBase()->RefreshDuration();
+ }
+ else
+ GetTarget()->CastCustomSpell(SPELL_PROTECTION_OF_ANCIENT_KINGS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_blessing_of_ancient_kings_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_blessing_of_ancient_kings_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_blessing_of_ancient_kings_AuraScript();
+ }
+};
+
+// 8342 - Defibrillate (Goblin Jumper Cables) have 33% chance on success
+// 22999 - Defibrillate (Goblin Jumper Cables XL) have 50% chance on success
+// 54732 - Defibrillate (Gnomish Army Knife) have 67% chance on success
+enum Defibrillate
+{
+ SPELL_GOBLIN_JUMPER_CABLES_FAIL = 8338,
+ SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL = 23055
+};
+
+class spell_item_defibrillate : public SpellScriptLoader
+{
+ public:
+ spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { }
+
+ class spell_item_defibrillate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_defibrillate_SpellScript);
+
+ public:
+ spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { }
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ if (roll_chance_i(_chance))
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (_failSpell)
+ GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem());
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_defibrillate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_RESURRECT);
+ }
+
+ private:
+ uint8 _chance;
+ uint32 _failSpell;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_defibrillate_SpellScript(_chance, _failSpell);
+ }
+
+ private:
+ uint8 _chance;
+ uint32 _failSpell;
+};
+
// http://www.wowhead.com/item=6522 Deviate Fish
// 8063 Deviate Fish
enum DeviateFishSpells
@@ -357,6 +501,47 @@ class spell_item_mingos_fortune_generator : public SpellScriptLoader
}
};
+// 71875, 71877 - Item - Black Bruise: Necrotic Touch Proc
+enum NecroticTouch
+{
+ SPELL_ITEM_NECROTIC_TOUCH_PROC = 71879
+};
+
+class spell_item_necrotic_touch : public SpellScriptLoader
+{
+ public:
+ spell_item_necrotic_touch() : SpellScriptLoader("spell_item_necrotic_touch") { }
+
+ class spell_item_necrotic_touch_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_necrotic_touch_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ITEM_NECROTIC_TOUCH_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 bp = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_ITEM_NECROTIC_TOUCH_PROC, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_necrotic_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_necrotic_touch_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=10720 Gnomish Net-o-Matic Projector
// 13120 Net-o-Matic
enum NetOMaticSpells
@@ -464,6 +649,35 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader
}
};
+// 17512 - Piccolo of the Flaming Fire
+class spell_item_piccolo_of_the_flaming_fire : public SpellScriptLoader
+{
+ public:
+ spell_item_piccolo_of_the_flaming_fire() : SpellScriptLoader("spell_item_piccolo_of_the_flaming_fire") { }
+
+ class spell_item_piccolo_of_the_flaming_fire_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_piccolo_of_the_flaming_fire_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (Player* target = GetHitPlayer())
+ target->HandleEmoteCommand(EMOTE_STATE_DANCE);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_piccolo_of_the_flaming_fire_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_piccolo_of_the_flaming_fire_SpellScript();
+ }
+};
+
// http://www.wowhead.com/item=6657 Savory Deviate Delight
// 8213 Savory Deviate Delight
enum SavoryDeviateDelight
@@ -522,6 +736,262 @@ class spell_item_savory_deviate_delight : public SpellScriptLoader
}
};
+// 48129 - Scroll of Recall
+// 60320 - Scroll of Recall II
+// 60321 - Scroll of Recall III
+enum ScrollOfRecall
+{
+ SPELL_SCROLL_OF_RECALL_I = 48129,
+ SPELL_SCROLL_OF_RECALL_II = 60320,
+ SPELL_SCROLL_OF_RECALL_III = 60321,
+ SPELL_LOST = 60444,
+ SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1 = 60323,
+ SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1 = 60328,
+};
+
+class spell_item_scroll_of_recall : public SpellScriptLoader
+{
+ public:
+ spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { }
+
+ class spell_item_scroll_of_recall_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_scroll_of_recall_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ Unit* caster = GetCaster();
+ uint8 maxSafeLevel = 0;
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_SCROLL_OF_RECALL_I: // Scroll of Recall
+ maxSafeLevel = 40;
+ break;
+ case SPELL_SCROLL_OF_RECALL_II: // Scroll of Recall II
+ maxSafeLevel = 70;
+ break;
+ case SPELL_SCROLL_OF_RECALL_III: // Scroll of Recal III
+ maxSafeLevel = 80;
+ break;
+ default:
+ break;
+ }
+
+ if (caster->getLevel() > maxSafeLevel)
+ {
+ caster->CastSpell(caster, SPELL_LOST, true);
+
+ // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335
+ uint32 spellId = SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1;
+ if (GetCaster()->ToPlayer()->GetTeam() == HORDE)
+ spellId = SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1;
+
+ GetCaster()->CastSpell(GetCaster(), spellId + urand(0, 7), true);
+
+ PreventHitDefaultEffect(effIndex);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_scroll_of_recall_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_scroll_of_recall_SpellScript();
+ }
+};
+
+// 71169 - Shadow's Fate (Shadowmourne questline)
+enum ShadowsFate
+{
+ SPELL_SOUL_FEAST = 71203,
+ QUEST_A_FEAST_OF_SOULS = 24547
+};
+
+class spell_item_shadows_fate : public SpellScriptLoader
+{
+ public:
+ spell_item_shadows_fate() : SpellScriptLoader("spell_item_shadows_fate") { }
+
+ class spell_item_shadows_fate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadows_fate_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SOUL_FEAST))
+ return false;
+ if (!sObjectMgr->GetQuestTemplate(QUEST_A_FEAST_OF_SOULS))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget && _procTarget->GetTypeId() == TYPEID_PLAYER && _procTarget->ToPlayer()->GetQuestStatus(QUEST_A_FEAST_OF_SOULS) == QUEST_STATUS_INCOMPLETE;
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_SOUL_FEAST, true);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_shadows_fate_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_shadows_fate_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadows_fate_AuraScript();
+ }
+};
+
+enum Shadowmourne
+{
+ SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE = 71904,
+ SPELL_SHADOWMOURNE_SOUL_FRAGMENT = 71905,
+ SPELL_SHADOWMOURNE_VISUAL_LOW = 72521,
+ SPELL_SHADOWMOURNE_VISUAL_HIGH = 72523,
+ SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF = 73422,
+};
+
+// 71903 - Item - Shadowmourne Legendary
+class spell_item_shadowmourne : public SpellScriptLoader
+{
+ public:
+ spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
+
+ class spell_item_shadowmourne_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadowmourne_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff
+ return false;
+ return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->isAlive();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true, NULL, aurEff);
+
+ // this can't be handled in AuraScript of SoulFragments because we need to know victim
+ if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
+ {
+ if (soulFragments->GetStackAmount() >= 10)
+ {
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, NULL, aurEff);
+ soulFragments->Remove();
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_shadowmourne_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_shadowmourne_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadowmourne_AuraScript();
+ }
+};
+
+// 71905 - Soul Fragment
+class spell_item_shadowmourne_soul_fragment : public SpellScriptLoader
+{
+ public:
+ spell_item_shadowmourne_soul_fragment() : SpellScriptLoader("spell_item_shadowmourne_soul_fragment") { }
+
+ class spell_item_shadowmourne_soul_fragment_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadowmourne_soul_fragment_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
+ return false;
+ return true;
+ }
+
+ void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ switch (GetStackAmount())
+ {
+ case 1:
+ target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
+ break;
+ case 6:
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
+ target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
+ break;
+ case 10:
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
+ target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY));
+ AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadowmourne_soul_fragment_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=7734 Six Demon Bag
// 14537 Six Demon Bag
enum SixDemonBagSpells
@@ -593,6 +1063,35 @@ class spell_item_six_demon_bag : public SpellScriptLoader
}
};
+// 28862 - The Eye of Diminution
+class spell_item_the_eye_of_diminution : public SpellScriptLoader
+{
+ public:
+ spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { }
+
+ class spell_item_the_eye_of_diminution_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_the_eye_of_diminution_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ int32 diff = GetUnitOwner()->getLevel() - 60;
+ if (diff > 0)
+ amount += diff;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_the_eye_of_diminution_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_the_eye_of_diminution_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=44012 Underbelly Elixir
// 59640 Underbelly Elixir
enum UnderbellyElixirSpells
@@ -646,70 +1145,6 @@ class spell_item_underbelly_elixir : public SpellScriptLoader
}
};
-enum eShadowmourneVisuals
-{
- SPELL_SHADOWMOURNE_VISUAL_LOW = 72521,
- SPELL_SHADOWMOURNE_VISUAL_HIGH = 72523,
- SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF = 73422,
-};
-
-class spell_item_shadowmourne : public SpellScriptLoader
-{
-public:
- spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
-
- class spell_item_shadowmourne_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_item_shadowmourne_AuraScript);
-
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
- return false;
- return true;
- }
-
- void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- switch (GetStackAmount())
- {
- case 1:
- target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
- break;
- case 6:
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
- target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
- break;
- case 10:
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
- target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
- break;
- default:
- break;
- }
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
- }
-
- void Register()
- {
- AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY));
- AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_item_shadowmourne_AuraScript();
- }
-};
-
enum AirRifleSpells
{
SPELL_AIR_RIFLE_HOLD_VISUAL = 65582,
@@ -2030,17 +2465,28 @@ void AddSC_item_spell_scripts()
// 23075 Mithril Mechanical Dragonling
new spell_item_trigger_spell("spell_item_mithril_mechanical_dragonling", SPELL_MITHRIL_MECHANICAL_DRAGONLING);
+ new spell_item_arcane_shroud();
+ new spell_item_blessing_of_ancient_kings();
+ new spell_item_defibrillate("spell_item_goblin_jumper_cables", 67, SPELL_GOBLIN_JUMPER_CABLES_FAIL);
+ new spell_item_defibrillate("spell_item_goblin_jumper_cables_xl", 50, SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL);
+ new spell_item_defibrillate("spell_item_gnomish_army_knife", 33);
new spell_item_deviate_fish();
new spell_item_flask_of_the_north();
new spell_item_gnomish_death_ray();
new spell_item_make_a_wish();
new spell_item_mingos_fortune_generator();
+ new spell_item_necrotic_touch();
new spell_item_net_o_matic();
new spell_item_noggenfogger_elixir();
+ new spell_item_piccolo_of_the_flaming_fire();
new spell_item_savory_deviate_delight();
+ new spell_item_scroll_of_recall();
+ new spell_item_shadows_fate();
+ new spell_item_shadowmourne();
+ new spell_item_shadowmourne_soul_fragment();
new spell_item_six_demon_bag();
+ new spell_item_the_eye_of_diminution();
new spell_item_underbelly_elixir();
- new spell_item_shadowmourne();
new spell_item_red_rider_air_rifle();
new spell_item_create_heart_candy();
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index 8c33117bb96..cd3673c17de 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -25,45 +25,47 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "Pet.h"
enum MageSpells
{
+ SPELL_MAGE_BURNOUT = 29077,
+ SPELL_MAGE_COLD_SNAP = 11958,
+ SPELL_MAGE_FOCUS_MAGIC_PROC = 54648,
+ SPELL_MAGE_FROST_WARDING_R1 = 11189,
+ SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
+ SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394,
+ SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413,
+ SPELL_MAGE_IGNITE = 12654,
+ SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077,
+ SPELL_MAGE_SQUIRREL_FORM = 32813,
+ SPELL_MAGE_GIRAFFE_FORM = 32816,
+ SPELL_MAGE_SERPENT_FORM = 32817,
+ SPELL_MAGE_DRAGONHAWK_FORM = 32818,
+ SPELL_MAGE_WORGEN_FORM = 32819,
+ SPELL_MAGE_SHEEP_FORM = 32820,
+ SPELL_MAGE_GLYPH_OF_ETERNAL_WATER = 70937,
+ SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908,
+ SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907,
+ SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126,
+
SPELL_MAGE_FLAMESTRIKE = 2120,
SPELL_MAGE_CHILLED_R1 = 12484,
SPELL_MAGE_CHILLED_R2 = 12485,
- SPELL_MAGE_COLD_SNAP = 11958,
-
SPELL_MAGE_CONE_OF_COLD_AURA_R1 = 11190,
SPELL_MAGE_CONE_OF_COLD_AURA_R2 = 12489,
SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1 = 83301,
SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2 = 83302,
- SPELL_MAGE_FROST_WARDING_R1 = 28332,
- SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
-
SPELL_MAGE_SHATTERED_BARRIER_R1 = 44745,
SPELL_MAGE_SHATTERED_BARRIER_R2 = 54787,
SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R1 = 55080,
SPELL_MAGE_SHATTERED_BARRIER_FREEZE_R2 = 83073,
- SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED = 44413,
- SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK = 86261,
-
- SPELL_MAGE_SQUIRREL_FORM = 32813,
- SPELL_MAGE_GIRAFFE_FORM = 32816,
- SPELL_MAGE_SERPENT_FORM = 32817,
- SPELL_MAGE_DRAGONHAWK_FORM = 32818,
- SPELL_MAGE_WORGEN_FORM = 32819,
- SPELL_MAGE_SHEEP_FORM = 32820,
-
SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED = 83098,
- SPELL_MAGE_GLYPH_OF_ETERNAL_WATER = 70937,
- SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908,
- SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907,
-
SPELL_MAGE_FINGERS_OF_FROST = 44544
};
@@ -76,6 +78,31 @@ enum MageIcons
ICON_MAGE_IMPROVED_MANA_GEM = 1036
};
+// Incanter's Absorbtion
+class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript
+{
+ public:
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1))
+ return false;
+ return true;
+ }
+
+ void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
+ {
+ Unit* target = GetTarget();
+
+ if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
+ target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+};
+
// 11113 - Blast Wave
class spell_mage_blast_wave : public SpellScriptLoader
{
@@ -130,6 +157,51 @@ class spell_mage_blast_wave : public SpellScriptLoader
}
};
+// -44449 - Burnout
+class spell_mage_burnout : public SpellScriptLoader
+{
+ public:
+ spell_mage_burnout() : SpellScriptLoader("spell_mage_burnout") { }
+
+ class spell_mage_burnout_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_burnout_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BURNOUT))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_MAGE_BURNOUT, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_burnout_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_burnout_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_burnout_AuraScript();
+ }
+};
+
// 42208 - Blizzard
/// Updated 4.3.4
class spell_mage_blizzard : public SpellScriptLoader
@@ -327,29 +399,47 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader
}
};
-// -6143, -543 - Frost Warding
-class spell_mage_frost_warding_trigger : public SpellScriptLoader
+// -543 - Fire Ward
+// -6143 - Frost Ward
+class spell_mage_fire_frost_ward : public SpellScriptLoader
{
public:
- spell_mage_frost_warding_trigger() : SpellScriptLoader("spell_mage_frost_warding_trigger") { }
+ spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { }
- class spell_mage_frost_warding_trigger_AuraScript : public AuraScript
+ class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
- PrepareAuraScript(spell_mage_frost_warding_trigger_AuraScript);
+ PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))
return false;
return true;
}
- void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
{
Unit* target = GetTarget();
if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0))
{
- int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue();
+ int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET
if (roll_chance_i(chance))
{
@@ -364,13 +454,66 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader
void Register()
{
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_frost_warding_trigger_AuraScript::Absorb, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_fire_frost_ward_AuraScript();
+ }
+};
+
+// 54646 - Focus Magic
+class spell_mage_focus_magic : public SpellScriptLoader
+{
+ public:
+ spell_mage_focus_magic() : SpellScriptLoader("spell_mage_focus_magic") { }
+
+ class spell_mage_focus_magic_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_focus_magic_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FOCUS_MAGIC_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget && _procTarget->isAlive();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_MAGE_FOCUS_MAGIC_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_focus_magic_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_focus_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
}
+
+ private:
+ Unit* _procTarget;
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_frost_warding_trigger_AuraScript();
+ return new spell_mage_focus_magic_AuraScript();
}
};
@@ -483,77 +626,170 @@ class spell_mage_ice_barrier : public SpellScriptLoader
}
};
-// 1463 - Mana Shield
-/// Updated 4.3.4
-class spell_mage_mana_shield : public SpellScriptLoader
+// -11119 - Ignite
+class spell_mage_ignite : public SpellScriptLoader
{
public:
- spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
+ spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { }
- class spell_mage_mana_shield_AuraScript : public AuraScript
+ class spell_mage_ignite_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_ignite_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ SpellInfo const* igniteDot = sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE);
+ int32 pct = 8 * GetSpellInfo()->GetRank();
+
+ int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks());
+ amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE);
+ GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_ignite_AuraScript();
+ }
+};
+
+// 543 - Mage Ward
+/// Updated 4.3.4
+class spell_mage_mage_ward : public SpellScriptLoader
+{
+ public:
+ spell_mage_mage_ward() : SpellScriptLoader("spell_mage_mage_ward") { }
+
+ class spell_mage_mage_ward_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_mana_shield_AuraScript);
+ PrepareAuraScript(spell_mage_mage_ward_AuraScript);
void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
{
if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0))
{
int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount());
- GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true);
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true);
}
}
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
- GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK, true);
- }
-
void Register()
{
- AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::HandleAbsorb, EFFECT_0);
- AfterEffectRemove += AuraEffectRemoveFn(spell_mage_mana_shield_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MANA_SHIELD, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_mana_shield_AuraScript();
+ return new spell_mage_mage_ward_AuraScript();
}
};
-// 543 - Mage Ward
+// 1463 - Mana Shield
/// Updated 4.3.4
-class spell_mage_mage_ward : public SpellScriptLoader
+class spell_mage_mana_shield : public SpellScriptLoader
{
- public:
- spell_mage_mage_ward() : SpellScriptLoader("spell_mage_mage_ward") { }
+ public:
+ spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
- class spell_mage_mage_ward_AuraScript : public AuraScript
+ class spell_mage_mana_shield_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_mage_ward_AuraScript);
+ PrepareAuraScript(spell_mage_mana_shield_AuraScript);
void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
{
if (AuraEffect* aurEff = GetTarget()->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_GENERIC, ICON_MAGE_INCANTER_S_ABSORPTION, EFFECT_0))
{
int32 bp = CalculatePct(absorbAmount, aurEff->GetAmount());
- GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true);
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true);
}
}
+ void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
+ GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_R1, true);
+ }
+
void Register()
{
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0);
+ AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::HandleAbsorb, EFFECT_0);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_mage_mana_shield_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_MANA_SHIELD, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_mage_ward_AuraScript();
+ return new spell_mage_mana_shield_AuraScript();
}
};
+// -29074 - Master of Elements
+class spell_mage_master_of_elements : public SpellScriptLoader
+{
+ public:
+ spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { }
+
+ class spell_mage_master_of_elements_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_master_of_elements_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
+
+ if (mana > 0)
+ GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_master_of_elements_AuraScript();
+ }
+};
+
enum SilvermoonPolymorph
{
NPC_AUROSALIA = 18744
@@ -669,6 +905,14 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
+
+ if (Player* player = caster->ToPlayer())
+ if (Guardian* elemental = player->GetGuardianPet())
+ // Check if the pet we are going to unsummon is the mage's water elemental
+ if (elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)->Effects[EFFECT_0].MiscValue) ||
+ elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)->Effects[EFFECT_0].MiscValue))
+ elemental->UnSummon();
+
// Glyph of Eternal Water
if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER))
caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true);
@@ -748,15 +992,19 @@ void AddSC_mage_spell_scripts()
{
new spell_mage_blast_wave();
new spell_mage_blizzard();
+ new spell_mage_burnout();
new spell_mage_cold_snap();
new spell_mage_cone_of_cold();
new spell_mage_conjure_refreshment();
- new spell_mage_frost_warding_trigger();
+ new spell_mage_fire_frost_ward();
+ new spell_mage_focus_magic();
new spell_mage_frostbolt();
- new spell_mage_living_bomb();
new spell_mage_ice_barrier();
- new spell_mage_mana_shield();
+ new spell_mage_ignite();
+ new spell_mage_living_bomb();
new spell_mage_mage_ward();
+ new spell_mage_mana_shield();
+ new spell_mage_master_of_elements();
new spell_mage_polymorph_cast_visual();
new spell_mage_replenish_mana();
new spell_mage_summon_water_elemental();
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 47592630a11..ac9b861f584 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -31,6 +31,7 @@ enum PaladinSpells
{
SPELL_PALADIN_DIVINE_PLEA = 54428,
SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF = 67480,
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE = 57319,
SPELL_PALADIN_HOLY_SHOCK_R1 = 20473,
SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE = 25912,
@@ -45,12 +46,25 @@ enum PaladinSpells
SPELL_PALADIN_DIVINE_STORM_DUMMY = 54171,
SPELL_PALADIN_DIVINE_STORM_HEAL = 54172,
+ SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE = 25997,
+
SPELL_PALADIN_FORBEARANCE = 25771,
SPELL_PALADIN_AVENGING_WRATH_MARKER = 61987,
SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988,
SPELL_PALADIN_HAND_OF_SACRIFICE = 6940,
- SPELL_PALADIN_DIVINE_SACRIFICE = 64205
+ SPELL_PALADIN_DIVINE_SACRIFICE = 64205,
+
+ SPELL_PALADIN_DIVINE_PURPOSE_PROC = 90174,
+
+ SPELL_PALADIN_GLYPH_OF_SALVATION = 63225,
+
+ SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790,
+
+ SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS = 25742,
+
+ SPELL_GENERIC_ARENA_DAMPENING = 74410,
+ SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411
};
// 31850 - Ardent Defender
@@ -185,8 +199,8 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader
}
};
-// 20911 Blessing of Sanctuary
-// 25899 Greater Blessing of Sanctuary
+// 20911 - Blessing of Sanctuary
+// 25899 - Greater Blessing of Sanctuary
class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
public:
@@ -200,6 +214,8 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF))
return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE))
+ return false;
return true;
}
@@ -216,10 +232,23 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
target->RemoveAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, GetCasterGUID());
}
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetTarget()->getPowerType() == POWER_MANA;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE, true, NULL, aurEff);
+ }
+
void Register()
{
AfterEffectApply += AuraEffectApplyFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
AfterEffectRemove += AuraEffectRemoveFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ DoCheckProc += AuraCheckProcFn(spell_pal_blessing_of_sanctuary_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
@@ -410,6 +439,43 @@ class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
}
};
+// -9799 - Eye for an Eye
+class spell_pal_eye_for_an_eye : public SpellScriptLoader
+{
+ public:
+ spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { }
+
+ class spell_pal_eye_for_an_eye_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ // return damage % to attacker but < 50% own total health
+ int32 damage = int32(std::min(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), GetTarget()->GetMaxHealth() / 2));
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_eye_for_an_eye_AuraScript();
+ }
+};
+
// 63521 - Guarded by The Light
class spell_pal_guarded_by_the_light : public SpellScriptLoader
{
@@ -490,6 +556,39 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader
}
};
+// 1038 - Hand of Salvation
+class spell_pal_hand_of_salvation : public SpellScriptLoader
+{
+ public:
+ spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { }
+
+ class spell_pal_hand_of_salvation_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_hand_of_salvation_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ // Glyph of Salvation
+ if (caster->GetGUID() == GetUnitOwner()->GetGUID())
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_PALADIN_GLYPH_OF_SALVATION, EFFECT_0))
+ amount -= aurEff->GetAmount();
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_hand_of_salvation_AuraScript();
+ }
+};
+
// -20473 - Holy Shock
class spell_pal_holy_shock : public SpellScriptLoader
{
@@ -656,6 +755,13 @@ class spell_pal_righteous_defense : public SpellScriptLoader
{
PrepareSpellScript(spell_pal_righteous_defense_SpellScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT))
+ return false;
+ return true;
+ }
+
SpellCastResult CheckCast()
{
Unit* caster = GetCaster();
@@ -673,9 +779,27 @@ class spell_pal_righteous_defense : public SpellScriptLoader
return SPELL_CAST_OK;
}
+ void HandleTriggerSpellLaunch(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void HandleTriggerSpellHit(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (Unit* target = GetHitUnit())
+ GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true);
+ }
+
void Register()
{
OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast);
+ //! WORKAROUND
+ //! target select will be executed in hitphase of effect 0
+ //! so we must handle trigger spell also in hit phase (default execution in launch phase)
+ //! see issue #3718
+ OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
+ OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
}
};
@@ -719,18 +843,139 @@ class spell_pal_sacred_shield : public SpellScriptLoader
}
};
+// 85256 - Templar's Verdict
+/// Updated 4.3.4
+class spell_pal_templar_s_verdict : public SpellScriptLoader
+{
+ public:
+ spell_pal_templar_s_verdict() : SpellScriptLoader("spell_pal_templar_s_verdict") { }
+
+ class spell_pal_templar_s_verdict_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pal_templar_s_verdict_SpellScript);
+
+ bool Validate (SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PURPOSE_PROC))
+ return false;
+
+ return true;
+ }
+
+ bool Load()
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN)
+ return false;
+
+ return true;
+ }
+
+ void ChangeDamage(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ int32 damage = GetHitDamage();
+
+ if (caster->HasAura(SPELL_PALADIN_DIVINE_PURPOSE_PROC))
+ damage *= 7.5; // 7.5*30% = 225%
+ else
+ {
+ switch (caster->GetPower(POWER_HOLY_POWER))
+ {
+ case 0: // 1 Holy Power
+ damage = damage;
+ break;
+ case 1: // 2 Holy Power
+ damage *= 3; // 3*30 = 90%
+ break;
+ case 2: // 3 Holy Power
+ damage *= 7.5; // 7.5*30% = 225%
+ break;
+ }
+ }
+
+ SetHitDamage(damage);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict_SpellScript::ChangeDamage, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pal_templar_s_verdict_SpellScript();
+ }
+};
+
+// 20154, 21084 - Seal of Righteousness - melee proc dummy (addition ${$MWS*(0.022*$AP+0.044*$SPH)} damage)
+class spell_pal_seal_of_righteousness : public SpellScriptLoader
+{
+ public:
+ spell_pal_seal_of_righteousness() : SpellScriptLoader("spell_pal_seal_of_righteousness") { }
+
+ class spell_pal_seal_of_righteousness_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_seal_of_righteousness_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ float ap = GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = GetTarget()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY);
+ holy += eventInfo.GetProcTarget()->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_HOLY);
+ int32 bp = int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000);
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_righteousness_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_righteousness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_seal_of_righteousness_AuraScript();
+ }
+};
+
+
void AddSC_paladin_spell_scripts()
{
//new spell_pal_ardent_defender();
new spell_pal_blessing_of_faith();
new spell_pal_blessing_of_sanctuary();
new spell_pal_divine_sacrifice();
+ new spell_pal_divine_storm();
+ new spell_pal_divine_storm_dummy();
new spell_pal_exorcism_and_holy_wrath_damage();
+ new spell_pal_eye_for_an_eye();
new spell_pal_guarded_by_the_light();
new spell_pal_hand_of_sacrifice();
+ new spell_pal_hand_of_salvation();
new spell_pal_holy_shock();
new spell_pal_judgement_of_command();
new spell_pal_lay_on_hands();
new spell_pal_righteous_defense();
new spell_pal_sacred_shield();
+ new spell_pal_templar_s_verdict();
+ new spell_pal_seal_of_righteousness();
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index b47eff816a3..c2bfc913893 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -29,29 +29,122 @@
enum PriestSpells
{
+ SPELL_PRIEST_DIVINE_AEGIS = 47753,
SPELL_PRIEST_EMPOWERED_RENEW = 63544,
+ SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673,
+ SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL = 56161,
SPELL_PRIEST_GLYPH_OF_SHADOW = 107906,
SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
SPELL_PRIEST_LEAP_OF_FAITH = 73325,
- SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572,
- SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833,
SPELL_PRIEST_LEAP_OF_FAITH_EFFECT = 92832,
+ SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833,
+ SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572,
+ SPELL_PRIEST_MANA_LEECH_PROC = 34650,
SPELL_PRIEST_PENANCE_R1 = 47540,
SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758,
SPELL_PRIEST_PENANCE_R1_HEAL = 47757,
- SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201,
- SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
+ SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904,
+ SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
SPELL_PRIEST_T9_HEALING_2P = 67201,
- SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085
+ SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
};
enum PriestSpellIcons
{
+ PRIEST_ICON_ID_BORROWED_TIME = 2899,
PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021,
- PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874
+ PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874,
+};
+
+// -47509 - Divine Aegis
+class spell_pri_divine_aegis : public SpellScriptLoader
+{
+ public:
+ spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { }
+
+ class spell_pri_divine_aegis_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_divine_aegis_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount());
+
+ // Multiple effects stack, so let's try to find this aura.
+ if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0))
+ absorb += aegis->GetAmount();
+
+ absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125);
+
+ GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_divine_aegis_AuraScript();
+ }
+};
+
+// 55680 - Glyph of Prayer of Healing
+class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
+{
+ public:
+ spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { }
+
+ class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL);
+ int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks());
+ GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_glyph_of_prayer_of_healing_AuraScript();
+ }
};
// 47788 - Guardian Spirit
@@ -151,6 +244,38 @@ class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader
}
};
+// -7001 - Lightwell Renew
+class spell_pri_lightwell_renew : public SpellScriptLoader
+{
+ public:
+ spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { }
+
+ class spell_pri_lightwell_renew_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_lightwell_renew_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ // Bonus from Glyph of Lightwell
+ if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0))
+ AddPct(amount, modHealing->GetAmount());
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_lightwell_renew_AuraScript();
+ }
+};
+
// 8129 - Mana Burn
class spell_pri_mana_burn : public SpellScriptLoader
{
@@ -179,6 +304,57 @@ class spell_pri_mana_burn : public SpellScriptLoader
}
};
+// 28305 - Mana Leech (Passive) (Priest Pet Aura)
+class spell_pri_mana_leech : public SpellScriptLoader
+{
+ public:
+ spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { }
+
+ class spell_pri_mana_leech_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_mana_leech_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetTarget()->GetOwner();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_mana_leech_AuraScript();
+ }
+};
+
// 49821 - Mind Sear
class spell_pri_mind_sear : public SpellScriptLoader
{
@@ -307,6 +483,82 @@ class spell_pri_penance : public SpellScriptLoader
}
};
+// -17 - Power Word: Shield
+class spell_pri_power_word_shield : public SpellScriptLoader
+{
+ public:
+ spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
+
+ class spell_pri_power_word_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
+ return false;
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ // Borrowed Time
+ if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1))
+ bonus += CalculatePct(1.0f, borrowedTime->GetAmount());
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+
+ // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
+ // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
+ bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+
+ // Twin Disciplines
+ if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, GetCasterGUID()))
+ AddPct(amount, twinDisciplines->GetAmount());
+
+ // Focused Power
+ amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
+ }
+ }
+
+ void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
+ {
+ Unit* target = GetTarget();
+ if (dmgInfo.GetAttacker() == target)
+ return;
+
+ if (Unit* caster = GetCaster())
+ if (AuraEffect* talentAurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
+ target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_power_word_shield_AuraScript();
+ }
+};
+
// 33110 - Prayer of Mending Heal
class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
{
@@ -545,12 +797,17 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
void AddSC_priest_spell_scripts()
{
+ new spell_pri_divine_aegis();
+ new spell_pri_glyph_of_prayer_of_healing();
new spell_pri_guardian_spirit();
new spell_pri_leap_of_faith_effect_trigger();
+ new spell_pri_lightwell_renew();
new spell_pri_mana_burn();
+ new spell_pri_mana_leech();
new spell_pri_mind_sear();
new spell_pri_pain_and_suffering_proc();
new spell_pri_penance();
+ new spell_pri_power_word_shield();
new spell_pri_prayer_of_mending_heal();
new spell_pri_reflective_shield_trigger();
new spell_pri_renew();
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 14d1c1a2f98..b19f5e2cbed 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -28,10 +28,13 @@
enum RogueSpells
{
+ SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482,
SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231,
SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819,
SPELL_ROGUE_PREY_ON_THE_WEAK = 58670,
- SPELL_ROGUE_SHIV_TRIGGERED = 5940
+ SPELL_ROGUE_SHIV_TRIGGERED = 5940,
+ SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933,
+ SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
};
enum RogueSpellIcons
@@ -39,6 +42,61 @@ enum RogueSpellIcons
ICON_ROGUE_IMPROVED_RECUPERATE = 4819
};
+// 13877, 33735, (check 51211, 65956) - Blade Flurry
+class spell_rog_blade_flurry : public SpellScriptLoader
+{
+ public:
+ spell_rog_blade_flurry() : SpellScriptLoader("spell_rog_blade_flurry") { }
+
+ class spell_rog_blade_flurry_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_blade_flurry_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ if (eventInfo.GetDamageInfo())
+ {
+ int32 damage = eventInfo.GetDamageInfo()->GetDamage();
+ GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_blade_flurry_AuraScript();
+ }
+};
+
// 31228 - Cheat Death
class spell_rog_cheat_death : public SpellScriptLoader
{
@@ -404,6 +462,58 @@ class spell_rog_recuperate : public SpellScriptLoader
}
};
+// -1943 - Rupture
+class spell_rog_rupture : public SpellScriptLoader
+{
+ public:
+ spell_rog_rupture() : SpellScriptLoader("spell_rog_rupture") { }
+
+ class spell_rog_rupture_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_rupture_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ canBeRecalculated = false;
+
+ float const attackpowerPerCombo[6] =
+ {
+ 0.0f,
+ 0.015f, // 1 point: ${($m1 + $b1*1 + 0.015 * $AP) * 4} damage over 8 secs
+ 0.024f, // 2 points: ${($m1 + $b1*2 + 0.024 * $AP) * 5} damage over 10 secs
+ 0.03f, // 3 points: ${($m1 + $b1*3 + 0.03 * $AP) * 6} damage over 12 secs
+ 0.03428571f, // 4 points: ${($m1 + $b1*4 + 0.03428571 * $AP) * 7} damage over 14 secs
+ 0.0375f // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs
+ };
+
+ uint8 cp = caster->ToPlayer()->GetComboPoints();
+ if (cp > 5)
+ cp = 5;
+
+ amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_rupture_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_rupture_AuraScript();
+ }
+};
+
// 5938 - Shiv
class spell_rog_shiv : public SpellScriptLoader
{
@@ -445,13 +555,108 @@ class spell_rog_shiv : public SpellScriptLoader
}
};
+// 57934 - Tricks of the Trade
+class spell_rog_tricks_of_the_trade : public SpellScriptLoader
+{
+ public:
+ spell_rog_tricks_of_the_trade() : SpellScriptLoader("spell_rog_tricks_of_the_trade") { }
+
+ class spell_rog_tricks_of_the_trade_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_tricks_of_the_trade_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _redirectTarget = NULL;
+ return true;
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
+ GetTarget()->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _redirectTarget = GetTarget()->GetRedirectThreatTarget();
+ return _redirectTarget;
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ Unit* target = GetTarget();
+ target->CastSpell(_redirectTarget, SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST, true);
+ target->CastSpell(target, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC, true);
+ Remove(AURA_REMOVE_BY_DEFAULT); // maybe handle by proc charges
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_rog_tricks_of_the_trade_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_rog_tricks_of_the_trade_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _redirectTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_tricks_of_the_trade_AuraScript();
+ }
+};
+
+// 59628 - Tricks of the Trade (Proc)
+class spell_rog_tricks_of_the_trade_proc : public SpellScriptLoader
+{
+ public:
+ spell_rog_tricks_of_the_trade_proc() : SpellScriptLoader("spell_rog_tricks_of_the_trade_proc") { }
+
+ class spell_rog_tricks_of_the_trade_proc_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_tricks_of_the_trade_proc_AuraScript);
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->ResetRedirectThreat();
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_proc_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_tricks_of_the_trade_proc_AuraScript();
+ }
+};
+
void AddSC_rogue_spell_scripts()
{
+ new spell_rog_blade_flurry();
new spell_rog_cheat_death();
new spell_rog_deadly_poison();
new spell_rog_nerves_of_steel();
new spell_rog_preparation();
new spell_rog_prey_on_the_weak();
new spell_rog_recuperate();
+ new spell_rog_rupture();
new spell_rog_shiv();
+ new spell_rog_tricks_of_the_trade();
+ new spell_rog_tricks_of_the_trade_proc();
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index e2e3f5a52e7..045227a8f99 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -34,9 +34,14 @@ enum ShamanSpells
SPELL_MAGE_TEMPORAL_DISPLACEMENT = 80354,
SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC = 52752,
SPELL_SHAMAN_BIND_SIGHT = 6277,
+ SPELL_SHAMAN_EARTH_SHIELD_HEAL = 379,
SPELL_SHAMAN_EXHAUSTION = 57723,
SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1 = 8349,
SPELL_SHAMAN_FLAME_SHOCK = 8050,
+ SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD = 63279,
+ SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM = 55456,
+ SPELL_SHAMAN_GLYPH_OF_MANA_TIDE = 55441,
+ SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM = 62132,
SPELL_SHAMAN_LAVA_FLOWS_R1 = 51480,
SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264,
SPELL_SHAMAN_SATED = 57724,
@@ -193,6 +198,68 @@ class spell_sha_chain_heal : public SpellScriptLoader
}
};
+// -974 - Earth Shield
+class spell_sha_earth_shield : public SpellScriptLoader
+{
+ public:
+ spell_sha_earth_shield() : SpellScriptLoader("spell_sha_earth_shield") { }
+
+ class spell_sha_earth_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_earth_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD))
+ return false;
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL);
+ amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL);
+
+ // Glyph of Earth Shield
+ //! WORKAROUND
+ //! this glyph is a proc
+ if (AuraEffect* glyph = caster->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD, EFFECT_0))
+ AddPct(amount, glyph->GetAmount());
+ }
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ //! HACK due to currenct proc system implementation
+ if (Player* player = GetTarget()->ToPlayer())
+ if (player->HasSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
+ return;
+
+ GetTarget()->CastCustomSpell(SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID());
+
+ if (Player* player = GetTarget()->ToPlayer())
+ player->AddSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, time(NULL) + 3);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_earth_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_earth_shield_AuraScript();
+ }
+};
+
// 6474 - Earthbind Totem - Fix Talent:Earthen Power, Earth's Grasp
/// Updated 4.3.4
class spell_sha_earthbind_totem : public SpellScriptLoader
@@ -549,11 +616,41 @@ class spell_sha_mana_tide_totem : public SpellScriptLoader
}
};
+// -51490 - Thunderstorm
+class spell_sha_thunderstorm : public SpellScriptLoader
+{
+ public:
+ spell_sha_thunderstorm() : SpellScriptLoader("spell_sha_thunderstorm") { }
+
+ class spell_sha_thunderstorm_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_thunderstorm_SpellScript);
+
+ void HandleKnockBack(SpellEffIndex effIndex)
+ {
+ // Glyph of Thunderstorm
+ if (GetCaster()->HasAura(SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM))
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_thunderstorm_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_thunderstorm_SpellScript();
+ }
+};
+
void AddSC_shaman_spell_scripts()
{
new spell_sha_ancestral_awakening_proc();
new spell_sha_bloodlust();
new spell_sha_chain_heal();
+ new spell_sha_earth_shield();
new spell_sha_earthbind_totem();
new spell_sha_earthen_power();
new spell_sha_fire_nova();
@@ -562,4 +659,5 @@ void AddSC_shaman_spell_scripts()
new spell_sha_heroism();
new spell_sha_lava_lash();
new spell_sha_mana_tide_totem();
+ new spell_sha_thunderstorm();
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 21dea0b726b..92d8e940a22 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -25,29 +25,41 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "SpellAuras.h"
enum WarlockSpells
{
SPELL_WARLOCK_BANE_OF_DOOM_EFFECT = 18662,
+ SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662,
+ SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
- SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
- SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
- SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
+ SPELL_WARLOCK_DEMON_SOUL_IMP = 79459,
+ SPELL_WARLOCK_DEMON_SOUL_FELHUNTER = 79460,
+ SPELL_WARLOCK_DEMON_SOUL_FELGUARD = 79452,
+ SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS = 79453,
+ SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER = 79454,
+ SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181,
+ SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106,
+ SPELL_WARLOCK_HAUNT = 48181,
+ SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_IMMOLATE = 348,
SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692,
SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955,
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
- SPELL_WARLOCK_HAUNT = 48181,
- SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553,
+ SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106,
SPELL_WARLOCK_SOULSHATTER = 32835,
+ SPELL_WARLOCK_UNSTABLE_AFFLICTION = 30108,
SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117
};
@@ -112,6 +124,41 @@ class spell_warl_banish : public SpellScriptLoader
}
};
+// 17962 - Conflagrate - Updated to 4.3.4
+class spell_warl_conflagrate : public SpellScriptLoader
+{
+ public:
+ spell_warl_conflagrate() : SpellScriptLoader("spell_warl_conflagrate") { }
+
+ class spell_warl_conflagrate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_conflagrate_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMMOLATE))
+ return false;
+ return true;
+ }
+
+ void HandleHit(SpellEffIndex /*effIndex*/)
+ {
+ if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID()))
+ SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster())));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_conflagrate_SpellScript();
+ }
+};
+
// 6201 - Create Healthstone
class spell_warl_create_healthstone : public SpellScriptLoader
{
@@ -332,6 +379,73 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader
}
};
+// 77801 - Demon Soul - Updated to 4.3.4
+class spell_warl_demon_soul : public SpellScriptLoader
+{
+ public:
+ spell_warl_demon_soul() : SpellScriptLoader("spell_warl_demon_soul") { }
+
+ class spell_warl_demon_soul_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_demon_soul_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_IMP))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELHUNTER))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELGUARD))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER))
+ return false;
+ return true;
+ }
+
+ void OnHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Creature* targetCreature = GetHitCreature())
+ {
+ if (targetCreature->isPet())
+ {
+ CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry());
+ switch (ci->family)
+ {
+ case CREATURE_FAMILY_SUCCUBUS:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS);
+ break;
+ case CREATURE_FAMILY_VOIDWALKER:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER);
+ break;
+ case CREATURE_FAMILY_FELGUARD:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELGUARD);
+ break;
+ case CREATURE_FAMILY_FELHUNTER:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELHUNTER);
+ break;
+ case CREATURE_FAMILY_IMP:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_IMP);
+ break;
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_demon_soul_SpellScript::OnHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_demon_soul_SpellScript;
+ }
+};
+
// 47193 - Demonic Empowerment
/// Updated 4.3.4
class spell_warl_demonic_empowerment : public SpellScriptLoader
@@ -426,6 +540,86 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader
}
};
+// 77799 - Fel Flame - Updated to 4.3.4
+class spell_warl_fel_flame : public SpellScriptLoader
+{
+ public:
+ spell_warl_fel_flame() : SpellScriptLoader("spell_warl_fel_flame") { }
+
+ class spell_warl_fel_flame_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_fel_flame_SpellScript);
+
+ void OnHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ Unit* target = GetHitUnit();
+ Aura* aura = target->GetAura(SPELL_WARLOCK_UNSTABLE_AFFLICTION, caster->GetGUID());
+ if (!aura)
+ aura = target->GetAura(SPELL_WARLOCK_IMMOLATE, caster->GetGUID());
+
+ if (!aura)
+ return;
+
+ int32 newDuration = aura->GetDuration() + GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 1000;
+ aura->SetDuration(std::min(newDuration, aura->GetMaxDuration()));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_fel_flame_SpellScript::OnHitTarget, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_fel_flame_SpellScript;
+ }
+};
+
+// -47230 - Fel Synergy
+class spell_warl_fel_synergy : public SpellScriptLoader
+{
+ public:
+ spell_warl_fel_synergy() : SpellScriptLoader("spell_warl_fel_synergy") { }
+
+ class spell_warl_fel_synergy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_fel_synergy_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_FEL_SYNERGY_HEAL))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return GetTarget()->GetGuardianPet() && eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_WARLOCK_FEL_SYNERGY_HEAL, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); // TARGET_UNIT_PET
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_fel_synergy_AuraScript();
+ }
+};
+
// 48181 - Haunt
/// Updated 4.3.4
class spell_warl_haunt : public SpellScriptLoader
@@ -601,6 +795,34 @@ class spell_warl_life_tap : public SpellScriptLoader
}
};
+// 18541 - Ritual of Doom Effect
+class spell_warl_ritual_of_doom_effect : public SpellScriptLoader
+{
+ public:
+ spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { }
+
+ class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, GetEffectValue(), true);
+ }
+
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_ritual_of_doom_effect_SpellScript();
+ }
+};
+
// 27285 - Seed of Corruption
/// Updated 4.3.4
class spell_warl_seed_of_corruption : public SpellScriptLoader
@@ -630,6 +852,92 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader
}
};
+// -7235 - Shadow Ward
+class spell_warl_shadow_ward : public SpellScriptLoader
+{
+ public:
+ spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { }
+
+ class spell_warl_shadow_ward_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_shadow_ward_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_shadow_ward_AuraScript();
+ }
+};
+
+// 63108 - Siphon Life
+class spell_warl_siphon_life : public SpellScriptLoader
+{
+ public:
+ spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { }
+
+ class spell_warl_siphon_life_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_siphon_life_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SIPHON_LIFE_HEAL))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()));
+ // Glyph of Siphon Life
+ if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0))
+ AddPct(amount, glyph->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_WARLOCK_SIPHON_LIFE_HEAL, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_siphon_life_AuraScript();
+ }
+};
+
// 29858 - Soulshatter
/// Updated 4.3.4
class spell_warl_soulshatter : public SpellScriptLoader
@@ -713,15 +1021,22 @@ void AddSC_warlock_spell_scripts()
{
new spell_warl_bane_of_doom();
new spell_warl_banish();
+ new spell_warl_conflagrate();
new spell_warl_create_healthstone();
new spell_warl_demonic_circle_summon();
new spell_warl_demonic_circle_teleport();
new spell_warl_demonic_empowerment();
+ new spell_warl_demon_soul();
new spell_warl_everlasting_affliction();
+ new spell_warl_fel_flame();
+ new spell_warl_fel_synergy();
new spell_warl_haunt();
new spell_warl_health_funnel();
new spell_warl_life_tap();
+ new spell_warl_ritual_of_doom_effect();
new spell_warl_seed_of_corruption();
+ new spell_warl_shadow_ward();
+ new spell_warl_siphon_life();
new spell_warl_soulshatter();
new spell_warl_unstable_affliction();
}
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 909e90beaad..9e2cb8aad71 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -35,10 +35,26 @@ enum WarriorSpells
SPELL_WARRIOR_DEEP_WOUNDS_RANK_2 = 12850,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 = 12868,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC = 12721,
+ SPELL_WARRIOR_EXECUTE = 20647,
+ SPELL_WARRIOR_GLYPH_OF_EXECUTION = 58367,
+ SPELL_WARRIOR_GLYPH_OF_VIGILANCE = 63326,
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF = 65156,
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976,
SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976,
- SPELL_WARRIOR_SLAM = 50782
+ SPELL_WARRIOR_SLAM = 50782,
+ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654,
+ SPELL_WARRIOR_TAUNT = 355,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
+ SPELL_WARRIOR_VIGILANCE_PROC = 50725,
+ SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665,
+
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY = 20911,
+ SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY = 25899,
+ SPELL_PRIEST_RENEWED_HOPE = 63944,
+ SPELL_GEN_DAMAGE_REDUCTION_AURA = 68066,
};
enum WarriorSpellIcons
@@ -286,6 +302,62 @@ class spell_warr_execute : public SpellScriptLoader
}
};
+// 59725 - Improved Spell Reflection
+class spell_warr_improved_spell_reflection : public SpellScriptLoader
+{
+ public:
+ spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { }
+
+ class spell_warr_improved_spell_reflection_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_improved_spell_reflection_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& unitList)
+ {
+ if (GetCaster())
+ unitList.remove(GetCaster());
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_improved_spell_reflection_SpellScript();
+ }
+};
+
+// 5246 - Intimidating Shout
+class spell_warr_intimidating_shout : public SpellScriptLoader
+{
+ public:
+ spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { }
+
+ class spell_warr_intimidating_shout_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_intimidating_shout_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& unitList)
+ {
+ unitList.remove(GetExplTargetWorldObject());
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_intimidating_shout_SpellScript();
+ }
+};
+
/// Updated 4.3.4
class spell_warr_last_stand : public SpellScriptLoader
{
@@ -325,6 +397,121 @@ class spell_warr_last_stand : public SpellScriptLoader
}
};
+// 7384, 7887, 11584, 11585 - Overpower
+class spell_warr_overpower : public SpellScriptLoader
+{
+ public:
+ spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { }
+
+ class spell_warr_overpower_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_overpower_SpellScript);
+
+ void HandleEffect(SpellEffIndex /*effIndex*/)
+ {
+ uint32 spellId = 0;
+ if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1))
+ spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1;
+ else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2))
+ spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2;
+
+ if (!spellId)
+ return;
+
+ if (Player* target = GetHitPlayer())
+ if (target->HasUnitState(UNIT_STATE_CASTING))
+ target->CastSpell(target, spellId, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_overpower_SpellScript();
+ }
+};
+
+// -772 - Rend
+class spell_warr_rend : public SpellScriptLoader
+{
+ public:
+ spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { }
+
+ class spell_warr_rend_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_rend_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ canBeRecalculated = false;
+
+ // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick
+ float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 mws = caster->GetAttackTime(BASE_ATTACK);
+ float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE);
+ float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE);
+ float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f;
+ amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb));
+
+ // "If used while your target is above 75% health, Rend does 35% more damage."
+ // as for 3.1.3 only ranks above 9 (wrong tooltip?)
+ if (GetSpellInfo()->GetRank() >= 9)
+ {
+ if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster))
+ AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster));
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_rend_AuraScript();
+ }
+};
+
+// 64380, 65941 - Shattering Throw
+class spell_warr_shattering_throw : public SpellScriptLoader
+{
+ public:
+ spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { }
+
+ class spell_warr_shattering_throw_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_shattering_throw_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ // remove shields, will still display immune to damage part
+ if (Unit* target = GetHitUnit())
+ target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_shattering_throw_SpellScript();
+ }
+};
+
/// Updated 4.3.4
class spell_warr_slam : public SpellScriptLoader
{
@@ -361,6 +548,182 @@ class spell_warr_slam : public SpellScriptLoader
}
};
+// 12328, 18765, 35429 - Sweeping Strikes
+class spell_warr_sweeping_strikes : public SpellScriptLoader
+{
+ public:
+ spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { }
+
+ class spell_warr_sweeping_strikes_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_sweeping_strikes_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_sweeping_strikes_AuraScript();
+ }
+};
+
+// 50720 - Vigilance
+class spell_warr_vigilance : public SpellScriptLoader
+{
+ public:
+ spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { }
+
+ class spell_warr_vigilance_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_vigilance_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_VIGILANCE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_PROC))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_DAMAGE_REDUCTION_AURA))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true);
+
+ if (Unit* caster = GetCaster())
+ target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true);
+ }
+
+ void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ //! WORKAROUND
+ //! this glyph is a proc
+ if (Unit* caster = GetCaster())
+ {
+ if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0))
+ GetTarget()->ModifyRedirectThreat(glyph->GetAmount());
+ }
+ }
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) &&
+ !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) ||
+ target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) ||
+ target->HasAura(SPELL_PRIEST_RENEWED_HOPE)))
+ {
+ target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA);
+ }
+
+ target->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ DoCheckProc += AuraCheckProcFn(spell_warr_vigilance_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warr_vigilance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_vigilance_AuraScript();
+ }
+};
+
+// 50725 Vigilance
+class spell_warr_vigilance_trigger : public SpellScriptLoader
+{
+ public:
+ spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { }
+
+ class spell_warr_vigilance_trigger_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ // Remove Taunt cooldown
+ if (Player* target = GetHitPlayer())
+ target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_vigilance_trigger_SpellScript();
+ }
+};
+
void AddSC_warrior_spell_scripts()
{
new spell_warr_bloodthirst();
@@ -369,6 +732,14 @@ void AddSC_warrior_spell_scripts()
new spell_warr_concussion_blow();
new spell_warr_deep_wounds();
new spell_warr_execute();
+ new spell_warr_improved_spell_reflection();
+ new spell_warr_intimidating_shout();
new spell_warr_last_stand();
+ new spell_warr_overpower();
+ new spell_warr_rend();
+ new spell_warr_shattering_throw();
new spell_warr_slam();
+ new spell_warr_sweeping_strikes();
+ new spell_warr_vigilance();
+ new spell_warr_vigilance_trigger();
}