Core/Spells: fixed Mage's Hot Streak and Improved Hot Streak talents

This commit is contained in:
Ovalord committed 2018-02-26 02:07:56 +01:00
1 parent fb61a8f3c6
commit fe952e429a
2 files changed
+234 -1

No files matched your search

+220 -1
View File
@@ -49,6 +49,8 @@ enum MageSpells
SPELL_MAGE_EARLY_FROST_TRIGGERED_R1 = 83162,
SPELL_MAGE_EARLY_FROST_TRIGGERED_R2 = 83239,
SPELL_MAGE_EARLY_FROST_VISUAL = 94315,
SPELL_MAGE_FIREBALL = 133,
SPELL_MAGE_FIRE_BLAST = 2136,
SPELL_MAGE_FOCUS_MAGIC_PROC = 54648,
SPELL_MAGE_FROST_NOVA = 122,
SPELL_MAGE_FROST_WARDING_R1 = 11189,
@@ -60,7 +62,7 @@ enum MageSpells
SPELL_MAGE_FLAME_ORB_BEAM_DUMMY = 86719,
SPELL_MAGE_FLAME_ORB_DAMAGE = 82739,
SPELL_MAGE_FLAME_ORB_SELF_SNARE = 82736,
SPELL_MAGE_FROSTFIRE_BOLT = 44614,
SPELL_MAGE_FROSTFIRE_ORB_DUMMY = 92283,
SPELL_MAGE_FROSTFIRE_ORB_SUMMON = 84714,
SPELL_MAGE_FROSTFIRE_ORB_AOE = 84718,
@@ -71,6 +73,9 @@ enum MageSpells
SPELL_MAGE_FROSTFIRE_BOLT_CHILL_EFFECT = 44614,
SPELL_MAGE_HOT_STREAK = 44445,
SPELL_MAGE_HOT_STREAK_TRIGGERED = 48108,
SPELL_MAGE_IMPROVED_HOT_STREAK_R1 = 44446,
SPELL_MAGE_IMPROVED_HOT_STREAK_R2 = 44448,
SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1 = 11210,
SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1 = 83046,
SPELL_MAGE_IMPROVED_POLYMORPH_MARKER = 87515,
@@ -79,6 +84,8 @@ enum MageSpells
SPELL_MAGE_IGNITE = 12654,
SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077,
SPELL_MAGE_PERMAFROST = 91394,
SPELL_MAGE_PYRO_BLAST = 11366,
SPELL_MAGE_SCORCH = 2948,
SPELL_MAGE_SLOW = 31589,
SPELL_MAGE_SQUIRREL_FORM = 32813,
SPELL_MAGE_GIRAFFE_FORM = 32816,
@@ -1850,6 +1857,215 @@ class spell_mage_flame_orb_aoe_dummy: public SpellScriptLoader
}
};
// 44445 - Hot Streak
class spell_mage_hot_streak : public SpellScriptLoader
{
public:
spell_mage_hot_streak() : SpellScriptLoader("spell_mage_hot_streak") { }
class spell_mage_hot_streak_AuraScript : public AuraScript
{
PrepareAuraScript(spell_mage_hot_streak_AuraScript);
bool Load() override
{
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
{
SPELL_MAGE_HOT_STREAK_TRIGGERED,
SPELL_MAGE_IMPROVED_HOT_STREAK_R1,
SPELL_MAGE_IMPROVED_HOT_STREAK_R2,
SPELL_MAGE_FIREBALL,
SPELL_MAGE_PYRO_BLAST,
SPELL_MAGE_FIRE_BLAST,
SPELL_MAGE_FROSTFIRE_BOLT
});
}
bool CheckProc(ProcEventInfo& eventInfo)
{
if (Unit* caster = GetCaster())
if (roll_chance_i(GetSpellInfo()->Effects[EFFECT_0].BasePoints)
&& !caster->HasAura(SPELL_MAGE_IMPROVED_HOT_STREAK_R1)
&& !caster->HasAura(SPELL_MAGE_IMPROVED_HOT_STREAK_R2))
switch (eventInfo.GetSpellInfo()->Id)
{
case SPELL_MAGE_FIREBALL:
case SPELL_MAGE_PYRO_BLAST:
case SPELL_MAGE_FIRE_BLAST:
case SPELL_MAGE_FROSTFIRE_BOLT:
return true;
default:
return false;
}
return false;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
PreventDefaultAction();
GetCaster()->CastSpell(GetCaster(), SPELL_MAGE_HOT_STREAK_TRIGGERED, true, nullptr, aurEff);
}
void Register() override
{
DoCheckProc += AuraCheckProcFn(spell_mage_hot_streak_AuraScript::CheckProc);
OnEffectProc += AuraEffectProcFn(spell_mage_hot_streak_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_mage_hot_streak_AuraScript();
}
};
// -44446 - Improved Hot Streak
class spell_mage_improved_hot_streak : public SpellScriptLoader
{
public:
spell_mage_improved_hot_streak() : SpellScriptLoader("spell_mage_improved_hot_streak") { }
class spell_mage_improved_hot_streak_AuraScript : public AuraScript
{
PrepareAuraScript(spell_mage_improved_hot_streak_AuraScript);
uint8 criticalStrikesCounter;
bool Load() override
{
criticalStrikesCounter = 0;
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
{
SPELL_MAGE_HOT_STREAK_TRIGGERED,
SPELL_MAGE_FIREBALL,
SPELL_MAGE_PYRO_BLAST,
SPELL_MAGE_FIRE_BLAST,
SPELL_MAGE_FROSTFIRE_BOLT
});
}
bool CheckProc(ProcEventInfo& eventInfo)
{
switch (eventInfo.GetSpellInfo()->Id)
{
case SPELL_MAGE_FIREBALL:
case SPELL_MAGE_PYRO_BLAST:
case SPELL_MAGE_FIRE_BLAST:
case SPELL_MAGE_FROSTFIRE_BOLT:
if (eventInfo.GetDamageInfo()->GetHitMask() & PROC_HIT_CRITICAL)
criticalStrikesCounter++;
else
criticalStrikesCounter = 0;
if (criticalStrikesCounter == 2)
{
if (roll_chance_i(GetSpellInfo()->Effects[EFFECT_0].BasePoints))
{
criticalStrikesCounter = 0;
return true;
}
else
{
criticalStrikesCounter = 0;
return false;
}
}
}
return false;
}
void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
{
PreventDefaultAction();
GetCaster()->CastSpell(GetCaster(), SPELL_MAGE_HOT_STREAK_TRIGGERED, true, nullptr, aurEff);
}
void Register() override
{
DoCheckProc += AuraCheckProcFn(spell_mage_improved_hot_streak_AuraScript::CheckProc);
OnEffectProc += AuraEffectProcFn(spell_mage_improved_hot_streak_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
AuraScript* GetAuraScript() const override
{
return new spell_mage_improved_hot_streak_AuraScript();
}
};
// 92315 - Pyroblast!
class spell_mage_pyroblast : public SpellScriptLoader
{
public:
spell_mage_pyroblast() : SpellScriptLoader("spell_mage_pyroblast") { }
class spell_mage_pyroblast_SpellScript : public SpellScript
{
PrepareSpellScript(spell_mage_pyroblast_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo(
{
SPELL_MAGE_HOT_STREAK_TRIGGERED,
SPELL_MAGE_PYRO_BLAST
});
}
void HandleHotStreak(SpellEffIndex /*effIndex*/)
{
GetCaster()->RemoveAurasDueToSpell(SPELL_MAGE_HOT_STREAK_TRIGGERED);
}
void HandleDamage(SpellEffIndex /*effIndex*/)
{
// Copy the spellpower coefficient from the original pyroblast spell
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_MAGE_PYRO_BLAST))
{
int32 damage = GetEffectValue();
if (Unit* target = GetHitUnit())
{
damage = GetCaster()->SpellDamageBonusDone(target, spell, uint32(damage), SPELL_DIRECT_DAMAGE, EFFECT_0);
damage = target->SpellDamageBonusTaken(GetCaster(), spell, uint32(damage), SPELL_DIRECT_DAMAGE);
}
SetHitDamage(damage);
}
}
void ApplyDotBonus()
{
if (Unit* target = GetHitUnit())
if (Unit* caster = GetCaster())
if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_MAGE_PYRO_BLAST))
if (Aura* aura = target->GetAura(GetSpellInfo()->Id))
aura->GetEffect(EFFECT_1)->SetBonusAmount(caster->SpellDamageBonusDone(target, spell, 0, DOT, EFFECT_1));
}
void Register() override
{
OnEffectLaunch += SpellEffectFn(spell_mage_pyroblast_SpellScript::HandleHotStreak, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
OnEffectHitTarget += SpellEffectFn(spell_mage_pyroblast_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
AfterHit += SpellHitFn(spell_mage_pyroblast_SpellScript::ApplyDotBonus);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_mage_pyroblast_SpellScript();
}
};
void AddSC_mage_spell_scripts()
{
new spell_mage_arcane_potency();
@@ -1866,8 +2082,10 @@ void AddSC_mage_spell_scripts()
new spell_mage_flame_orb_aoe_dummy();
new spell_mage_focus_magic();
new spell_mage_frostbolt();
new spell_mage_hot_streak();
new spell_mage_ice_barrier();
new spell_mage_ignite();
new spell_mage_improved_hot_streak();
new spell_mage_glyph_of_ice_block();
new spell_mage_glyph_of_icy_veins();
new spell_mage_glyph_of_polymorph();
@@ -1879,6 +2097,7 @@ void AddSC_mage_spell_scripts()
new spell_mage_permafrost();
new spell_mage_polymorph();
new spell_mage_polymorph_cast_visual();
new spell_mage_pyroblast();
new spell_mage_replenish_mana();
new spell_mage_ring_of_frost();
new spell_mage_ring_of_frost_freeze();