Merge pull request #8961 from joschiwald/spellscripts3

Core/Spells: convert some spells to SpellScripts
This commit is contained in:
Nay
2013-01-20 08:45:23 -08:00
16 changed files with 1454 additions and 600 deletions

View File

@@ -37,6 +37,7 @@ enum DeathKnightSpells
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,
@@ -584,6 +585,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 +727,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 +861,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
{
@@ -861,9 +965,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();
}

View File

@@ -30,6 +30,9 @@
enum DruidSpells
{
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,
@@ -41,6 +44,35 @@ enum DruidSpells
SPELL_DRUID_ITEM_T8_BALANCE_RELIC = 64950,
};
// -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
{
@@ -121,6 +153,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
{
@@ -276,6 +371,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
{
@@ -349,6 +471,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
{
@@ -658,6 +828,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
{
@@ -715,13 +914,18 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
void AddSC_druid_spell_scripts()
{
new spell_dru_dash();
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_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();
@@ -729,5 +933,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();
}

View File

@@ -226,6 +226,158 @@ 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();
}
};
// 45472 Parachute
enum ParachuteSpells
{
@@ -3195,6 +3347,9 @@ void AddSC_generic_spell_scripts()
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_parachute();
new spell_gen_pet_summoned();
new spell_gen_remove_flight_auras();

View File

@@ -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();
}

View File

@@ -73,6 +73,93 @@ 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();
}
};
// 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
@@ -464,6 +551,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 +638,79 @@ 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();
}
};
// http://www.wowhead.com/item=7734 Six Demon Bag
// 14537 Six Demon Bag
enum SixDemonBagSpells
@@ -593,6 +782,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
@@ -2030,6 +2248,10 @@ 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_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();
@@ -2037,8 +2259,11 @@ void AddSC_item_spell_scripts()
new spell_item_mingos_fortune_generator();
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_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();

View File

@@ -29,7 +29,7 @@
enum MageSpells
{
SPELL_MAGE_COLD_SNAP = 11958,
SPELL_MAGE_FROST_WARDING_R1 = 28332,
SPELL_MAGE_FROST_WARDING_R1 = 11189,
SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394,
SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413,
@@ -45,6 +45,31 @@ enum MageSpells
SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126,
};
// 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
{
@@ -127,29 +152,47 @@ class spell_mage_cold_snap : public SpellScriptLoader
}
};
// -543, -6143 - 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))
{
@@ -164,79 +207,58 @@ 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_frost_warding_trigger_AuraScript();
return new spell_mage_fire_frost_ward_AuraScript();
}
};
class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript
// -11426 - Ice Barrier
class spell_mage_ice_barrier : public SpellScriptLoader
{
public:
spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { }
bool Validate(SpellInfo const* /*spellInfo*/)
class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
return sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED)
&& sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1);
}
PrepareAuraScript(spell_mage_ice_barrier_AuraScript);
void Trigger(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
{
Unit* target = GetTarget();
if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0))
void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
{
int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
canBeRecalculated = false;
if (Unit* caster = GetCaster())
{
// +80.68% from sp bonus
float bonus = 0.8068f;
bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
// Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
// Glyph of Ice Barrier is only applied at the spell damage 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);
}
}
}
};
// -543, -6143, -11426 - Incanter's Absorption
class spell_mage_incanters_absorbtion_absorb : public SpellScriptLoader
{
public:
spell_mage_incanters_absorbtion_absorb() : SpellScriptLoader("spell_mage_incanters_absorbtion_absorb") { }
class spell_mage_incanters_absorbtion_absorb_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
PrepareAuraScript(spell_mage_incanters_absorbtion_absorb_AuraScript);
void Register()
{
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_incanters_absorbtion_absorb_AuraScript::Trigger, EFFECT_0);
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
return new spell_mage_incanters_absorbtion_absorb_AuraScript();
}
};
// -1463 - Incanter's Absorption
class spell_mage_incanters_absorbtion_manashield : public SpellScriptLoader
{
public:
spell_mage_incanters_absorbtion_manashield() : SpellScriptLoader("spell_mage_incanters_absorbtion_manashield") { }
class spell_mage_incanters_absorbtion_manashield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
PrepareAuraScript(spell_mage_incanters_absorbtion_manashield_AuraScript);
void Register()
{
AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_incanters_absorbtion_manashield_AuraScript::Trigger, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
return new spell_mage_incanters_absorbtion_manashield_AuraScript();
return new spell_mage_ice_barrier_AuraScript();
}
};
@@ -279,6 +301,44 @@ class spell_mage_living_bomb : public SpellScriptLoader
}
};
// -1463 - Mana Shield
class spell_mage_mana_shield : public SpellScriptLoader
{
public:
spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
PrepareAuraScript(spell_mage_mana_shield_AuraScript);
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
{
canBeRecalculated = false;
if (Unit* caster = GetCaster())
{
// +80.53% from sp bonus
float bonus = 0.8053f;
bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
amount += int32(bonus);
}
}
void Register()
{
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD);
AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
return new spell_mage_mana_shield_AuraScript();
}
};
enum SilvermoonPolymorph
{
NPC_AUROSALIA = 18744,
@@ -378,10 +438,10 @@ void AddSC_mage_spell_scripts()
{
new spell_mage_blast_wave();
new spell_mage_cold_snap();
new spell_mage_frost_warding_trigger();
new spell_mage_incanters_absorbtion_absorb();
new spell_mage_incanters_absorbtion_manashield();
new spell_mage_fire_frost_ward();
new spell_mage_ice_barrier();
new spell_mage_living_bomb();
new spell_mage_mana_shield();
new spell_mage_polymorph_cast_visual();
new spell_mage_summon_water_elemental();
}

View File

@@ -51,6 +51,13 @@ enum PaladinSpells
SPELL_PALADIN_HAND_OF_SACRIFICE = 6940,
SPELL_PALADIN_DIVINE_SACRIFICE = 64205,
SPELL_PALADIN_GLYPH_OF_SALVATION = 63225,
SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790,
SPELL_GENERIC_ARENA_DAMPENING = 74410,
SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411
};
// 31850 - Ardent Defender
@@ -490,6 +497,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 +696,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 +720,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);
}
};
@@ -685,6 +750,50 @@ class spell_pal_righteous_defense : public SpellScriptLoader
}
};
// 58597 - Sacred Shield
class spell_pal_sacred_shield : public SpellScriptLoader
{
public:
spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { }
class spell_pal_sacred_shield_AuraScript : public AuraScript
{
PrepareAuraScript(spell_pal_sacred_shield_AuraScript);
void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
{
if (Unit* caster = GetCaster())
{
// +75.00% from sp bonus
float bonus = CalculatePct(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()), 75.0f);
// Divine Guardian 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);
// Arena - Dampening
if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0))
AddPct(amount, dampening->GetAmount());
// Battleground - Dampening
else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0))
AddPct(amount, dampening->GetAmount());
}
}
void Register()
{
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
}
};
AuraScript* GetAuraScript() const
{
return new spell_pal_sacred_shield_AuraScript();
}
};
void AddSC_paladin_spell_scripts()
{
new spell_pal_ardent_defender();
@@ -696,8 +805,10 @@ void AddSC_paladin_spell_scripts()
new spell_pal_exorcism_and_holy_wrath_damage();
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();
}

View File

@@ -30,6 +30,7 @@
enum PriestSpells
{
SPELL_PRIEST_EMPOWERED_RENEW = 63544,
SPELL_PRIEST_GLYPHE_OF_LIGHTWELL = 55673,
SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
SPELL_PRIEST_PENANCE_R1 = 47540,
SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758,
@@ -43,6 +44,7 @@ enum PriestSpells
enum PriestSpellIcons
{
PRIEST_ICON_ID_BORROWED_TIME = 2899,
PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021,
PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874,
};
@@ -104,6 +106,38 @@ class spell_pri_guardian_spirit : 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_GLYPHE_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
{
@@ -260,6 +294,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
{
@@ -295,49 +405,6 @@ class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
}
};
// -17 - Reflective Shield
class spell_pri_reflective_shield_trigger : public SpellScriptLoader
{
public:
spell_pri_reflective_shield_trigger() : SpellScriptLoader("spell_pri_reflective_shield_trigger") { }
class spell_pri_reflective_shield_trigger_AuraScript : public AuraScript
{
PrepareAuraScript(spell_pri_reflective_shield_trigger_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/)
{
if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
return false;
return true;
}
void Trigger(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
{
Unit* target = GetTarget();
if (dmgInfo.GetAttacker() == target)
return;
if (GetCaster())
if (AuraEffect* talentAurEff = target->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()
{
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_reflective_shield_trigger_AuraScript::Trigger, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
return new spell_pri_reflective_shield_trigger_AuraScript();
}
};
// -139 - Renew
class spell_pri_renew : public SpellScriptLoader
{
@@ -458,12 +525,13 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
void AddSC_priest_spell_scripts()
{
new spell_pri_guardian_spirit();
new spell_pri_lightwell_renew();
new spell_pri_mana_burn();
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();
new spell_pri_shadow_word_death();
new spell_pri_vampiric_touch();

View File

@@ -347,6 +347,58 @@ class spell_rog_prey_on_the_weak : 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
{
@@ -395,5 +447,6 @@ void AddSC_rogue_spell_scripts()
new spell_rog_nerves_of_steel();
new spell_rog_preparation();
new spell_rog_prey_on_the_weak();
new spell_rog_rupture();
new spell_rog_shiv();
}

View File

@@ -38,6 +38,7 @@ enum ShamanSpells
SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1 = 8349,
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 = 64694,
SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE = 52032,
@@ -743,6 +744,35 @@ class spell_sha_sentry_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();
@@ -760,4 +790,5 @@ void AddSC_shaman_spell_scripts()
new spell_sha_mana_spring_totem();
new spell_sha_mana_tide_totem();
new spell_sha_sentry_totem();
new spell_sha_thunderstorm();
}

View File

@@ -649,6 +649,43 @@ 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();
}
};
// 29858 - Soulshatter
class spell_warl_soulshatter : public SpellScriptLoader
{
@@ -742,6 +779,7 @@ void AddSC_warlock_spell_scripts()
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_soulshatter();
new spell_warl_unstable_affliction();
}

View File

@@ -41,6 +41,7 @@ enum WarriorSpells
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976,
SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976,
SPELL_WARRIOR_SLAM = 50783,
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,
@@ -333,6 +334,34 @@ class spell_warr_improved_spell_reflection : public SpellScriptLoader
}
};
// 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();
}
};
// 12975 - Last Stand
class spell_warr_last_stand : public SpellScriptLoader
{
@@ -409,6 +438,83 @@ class spell_warr_overpower : public SpellScriptLoader
}
};
// -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();
}
};
// -1464 - Slam
class spell_warr_slam : public SpellScriptLoader
{
@@ -493,6 +599,37 @@ class spell_warr_vigilance : public SpellScriptLoader
}
};
// 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();
@@ -502,8 +639,12 @@ void AddSC_warrior_spell_scripts()
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_vigilance();
new spell_warr_vigilance_trigger();
}