Advertisement
Guest User

By Cronic

a guest
Apr 9th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.37 KB | None | 0 0
  1. /*
  2.  * AscEmu Framework based on ArcEmu MMORPG Server
  3.  * Copyright (C) 2014-2016 AscEmu Team <http://www.ascemu.org/>
  4.  * Copyright (C) 2008-2012 ArcEmu Team <http://www.ArcEmu.org/>
  5.  * Copyright (C) 2005-2007 Ascent Team
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU Affero General Public License as published by
  9.  * the Free Software Foundation, either version 3 of the License, or
  10.  * any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15.  * GNU Affero General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Affero General Public License
  18.  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19.  *
  20.  */
  21.  
  22. #include "StdAfx.h"
  23.  
  24. //////////////////////////////////////////////////////////////////////////////////////////
  25. // Warrior Scripts
  26.  
  27. //////////////////////////////////////////////////////////////////////////////////////////
  28. // Warlock Scripts
  29.  
  30. //////////////////////////////////////////////////////////////////////////////////////////
  31. // Shaman Scripts
  32. class FireNova : public Spell
  33. {
  34.     SPELL_FACTORY_FUNCTION(FireNova);
  35.     bool HasFireTotem = false;
  36.     uint8 CanCast(bool tolerate)
  37.     {
  38.         uint8 result = Spell::CanCast(tolerate);
  39.  
  40.         if (result == SPELL_CANCAST_OK)
  41.         {
  42.             if (u_caster)
  43.             {
  44.                 // If someone has a better solutionen, your welcome :-)
  45.                 int totem_ids[32] = {
  46.                     //Searing Totems
  47.                     2523, 3902, 3903, 3904, 7400, 7402, 15480, 31162, 31164, 31165,
  48.                     //Magma Totems
  49.                     8929, 7464, 7435, 7466, 15484, 31166, 31167,
  50.                     //Fire Elementel
  51.                     15439,
  52.                     //Flametongue Totems
  53.                     5950, 6012, 7423, 10557, 15485, 31132, 31158, 31133,
  54.                     //Frost Resistance Totems
  55.                     5926, 7412, 7413, 15486, 31171, 31172
  56.                 };
  57.                 Unit* totem;
  58.                 for (uint8 i = 0; i < 32; i++)
  59.                 {
  60.                     totem = u_caster->summonhandler.GetSummonWithEntry(totem_ids[i]);   // Get possible firetotem
  61.                     if (totem != NULL)
  62.                     {
  63.                         HasFireTotem = true;
  64.                         CastSpell(totem);
  65.                     }
  66.                 }
  67.                 if (!HasFireTotem)
  68.                 {
  69.                     SetExtraCastResult(SPELL_EXTRA_ERROR_MUST_HAVE_FIRE_TOTEM);
  70.                     result = SPELL_FAILED_CUSTOM_ERROR;
  71.                 }
  72.             }
  73.         }
  74.         return result;
  75.     }
  76.  
  77.     void CastSpell(Unit* totem)
  78.     {
  79.         uint32 fireNovaSpells = Spell::GetProto()->Id;
  80.         //Cast spell. NOTICE All ranks are linked with a extra spell in HackFixes.cpp
  81.         totem->CastSpellAoF(totem->GetPositionX(), totem->GetPositionY(), totem->GetPositionZ(), dbcSpell.LookupEntryForced(fireNovaSpells), true);
  82.     }
  83. };
  84.  
  85. //////////////////////////////////////////////////////////////////////////////////////////
  86. // Rogue Scripts
  87. class CheatDeathAura : public AbsorbAura
  88. {
  89. public:
  90.  
  91.     static Aura* Create(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL) { return new CheatDeathAura(proto, duration, caster, target, temporary, i_caster); }
  92.  
  93.     CheatDeathAura(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL)
  94.         : AbsorbAura(proto, duration, caster, target, temporary, i_caster)
  95.     {
  96.         dSpell = dbcSpell.LookupEntry(31231);
  97.     }
  98.  
  99.     uint32 AbsorbDamage(uint32 School, uint32* dmg)
  100.     {
  101.         // Checking for 1 min cooldown
  102.         if (dSpell == NULL || !p_target->Cooldown_CanCast(dSpell))
  103.             return 0;
  104.  
  105.         // Check for proc chance
  106.         if (RandomFloat(100.0f) > GetSpellProto()->EffectBasePoints[0] + 1)
  107.             return 0;
  108.  
  109.         // Check if damage will kill player.
  110.         uint32 cur_hlth = p_target->GetHealth();
  111.         if ((*dmg) < cur_hlth)
  112.             return 0;
  113.  
  114.         uint32 max_hlth = p_target->GetMaxHealth();
  115.         uint32 min_hlth = max_hlth / 10;
  116.  
  117.         /*
  118.         looks like the following lines are not so good, we check and cast on spell id 31231_
  119.         and adding the cooldown to it, but it looks like this spell is useless(all it's doing is_
  120.         casting 45182, so we can do all this stuff on 45182 at first place), BUT_
  121.         as long as proceeding cheat death is not so height (how many rogue at the same time_
  122.         gonna get to this point?) so it's better to use it because we wont lose anything!!
  123.         */
  124.         p_target->CastSpell(p_target->GetGUID(), dSpell, true);
  125.  
  126.         // set dummy effect,
  127.         // this spell is used to procced the post effect of cheat death later.
  128.         // Move next line to SPELL::SpellEffectDummy ?!! well it's better in case of dbc changing!!
  129.         p_target->CastSpell(p_target->GetGUID(), 45182, true);
  130.  
  131.         // Better to add custom cooldown procedure then fucking with entry, or not!!
  132.         dSpell->RecoveryTime = 60000;
  133.         p_target->Cooldown_Add(dSpell, NULL);
  134.  
  135.         // Calc abs and applying it
  136.         uint32 real_dmg = (cur_hlth > min_hlth ? cur_hlth - min_hlth : 0);
  137.         uint32 absorbed_dmg = *dmg - real_dmg;
  138.  
  139.         *dmg = real_dmg;
  140.         return absorbed_dmg;
  141.     }
  142.  
  143. private:
  144.  
  145.     SpellEntry* dSpell;
  146. };
  147.  
  148. //////////////////////////////////////////////////////////////////////////////////////////
  149. // Priest Scripts
  150. class DispersionSpell : public Spell
  151. {
  152.     SPELL_FACTORY_FUNCTION(DispersionSpell);
  153.  
  154.     void DoAfterHandleEffect(Unit* target, uint32 i)
  155.     {
  156.         if (p_caster != NULL)
  157.         {
  158.             // Mana regeneration
  159.             p_caster->CastSpell(target, 60069, true);
  160.             // Remove snares and movement impairing effects and make player immune to them
  161.             p_caster->CastSpell(target, 63230, true);
  162.         }
  163.     }
  164. };
  165.  
  166. //////////////////////////////////////////////////////////////////////////////////////////
  167. // Druid Scripts
  168. class InnervateSpell : public Spell
  169. {
  170.     SPELL_FACTORY_FUNCTION(InnervateSpell);
  171.  
  172.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  173.     {
  174.         if (p_caster != NULL && i == 0 && target != NULL)
  175.             value = (uint32)(p_caster->GetBaseMana() * 0.225f);
  176.  
  177.         return value;
  178.     }
  179. };
  180.  
  181. //////////////////////////////////////////////////////////////////////////////////////////
  182. // DeathKnight Scripts
  183. class BloodPlagueSpell : public Spell
  184. {
  185.     SPELL_FACTORY_FUNCTION(BloodPlagueSpell);
  186.  
  187.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  188.     {
  189.         if (p_caster != NULL && i == 0)
  190.             value += (uint32)(p_caster->GetAP() * 0.055 * 1.15);
  191.  
  192.         return value;
  193.     }
  194. };
  195.  
  196. class IcyTouchSpell : public Spell
  197. {
  198.     SPELL_FACTORY_FUNCTION(IcyTouchSpell);
  199.  
  200.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  201.     {
  202.         if (p_caster != NULL && i == 0)
  203.             value += (uint32)(p_caster->GetAP() * 0.1);
  204.  
  205.         return value;
  206.     }
  207. };
  208.  
  209. class FrostFeverSpell : public Spell
  210. {
  211.     SPELL_FACTORY_FUNCTION(FrostFeverSpell);
  212.  
  213.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  214.     {
  215.         if (p_caster != NULL && i == 0)
  216.             value += (uint32)(p_caster->GetAP() * 0.055 * 1.15);
  217.  
  218.         return value;
  219.     }
  220. };
  221.  
  222. class BloodBoilSpell : public Spell
  223. {
  224.     SPELL_FACTORY_FUNCTION(BloodBoilSpell);
  225.  
  226.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  227.     {
  228.         if (p_caster != NULL && i == 0)
  229.         {
  230.             int32 ap = p_caster->GetAP();
  231.  
  232.             value += (uint32)(ap * 0.08);
  233.  
  234.             // Does additional damage if target has diseases (http://www.tankspot.com/forums/f14/48814-3-1-blood-boil-mechanics-tested.html)
  235.             if (target != NULL && (target->HasAura(55078) || target->HasAura(55095)))
  236.                 value += (uint32)(ap * 0.015 + 95);
  237.         }
  238.  
  239.         return value;
  240.     }
  241. };
  242.  
  243. class BloodStrikeSpell : public Spell
  244. {
  245.     SPELL_FACTORY_FUNCTION(BloodStrikeSpell);
  246.  
  247.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  248.     {
  249.         if (target != NULL)
  250.         {
  251.             uint32 count = target->GetAuraCountWithDispelType(DISPEL_DISEASE, m_caster->GetGUID());
  252.             if (count)
  253.                 value += value * count * (GetProto()->EffectBasePoints[2] + 1) / 200;
  254.         }
  255.  
  256.         return value;
  257.     }
  258.  
  259.     void DoAfterHandleEffect(Unit* target, uint32 i)
  260.     {
  261.         if (p_caster == NULL || i != 1)
  262.             return;
  263.  
  264.         Aura* aur = p_caster->FindAuraByNameHash(SPELL_HASH_SUDDEN_DOOM);
  265.  
  266.         if (aur == NULL)
  267.             return;
  268.  
  269.         if (!Rand(aur->GetSpellProto()->procChance))
  270.             return;
  271.  
  272.         p_caster->CastSpell(target, 47632, false);
  273.     }
  274. };
  275.  
  276. class DeathCoilSpell : public Spell
  277. {
  278.     SPELL_FACTORY_FUNCTION(DeathCoilSpell);
  279.  
  280.     uint8 CanCast(bool tolerate)
  281.     {
  282.         uint8 result = Spell::CanCast(tolerate);
  283.  
  284.         if (result == SPELL_CANCAST_OK)
  285.         {
  286.             if (m_caster != NULL && m_caster->IsInWorld())
  287.             {
  288.                 Unit* target = m_caster->GetMapMgr()->GetUnit(m_targets.m_unitTarget);
  289.  
  290.                 if (target == NULL || !(isAttackable(m_caster, target, false) || target->getRace() == RACE_UNDEAD))
  291.                     result = SPELL_FAILED_BAD_TARGETS;
  292.             }
  293.         }
  294.  
  295.         return result;
  296.     }
  297. };
  298.  
  299. class RuneStrileSpell : public Spell
  300. {
  301.     SPELL_FACTORY_FUNCTION(RuneStrileSpell);
  302.  
  303.     void HandleEffects(uint64 guid, uint32 i)
  304.     {
  305.         Spell::HandleEffects(guid, i);
  306.  
  307.         if (u_caster != NULL)
  308.             u_caster->RemoveAura(56817);
  309.     }
  310. };
  311.  
  312. class AntiMagicShellAura : public AbsorbAura
  313. {
  314.     public:
  315.     static Aura* Create(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL) { return new AntiMagicShellAura(proto, duration, caster, target, temporary, i_caster); }
  316.  
  317.     AntiMagicShellAura(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL)
  318.         : AbsorbAura(proto, duration, caster, target, temporary, i_caster) {}
  319.  
  320.     int32 CalcAbsorbAmount()
  321.     {
  322.         Player* caster = GetPlayerCaster();
  323.         if (caster != NULL)
  324.             return caster->GetMaxHealth() * (GetSpellProto()->EffectBasePoints[1] + 1) / 100;
  325.         else
  326.             return mod->m_amount;
  327.     }
  328.  
  329.     int32 CalcPctDamage()
  330.     {
  331.         return GetSpellProto()->EffectBasePoints[0] + 1;
  332.     }
  333. };
  334.  
  335. class SpellDeflectionAura : public AbsorbAura
  336. {
  337.     public:
  338.     static Aura* Create(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL) { return new SpellDeflectionAura(proto, duration, caster, target, temporary, i_caster); }
  339.  
  340.     SpellDeflectionAura(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL)
  341.         : AbsorbAura(proto, duration, caster, target, temporary, i_caster) {}
  342.  
  343.     uint32 AbsorbDamage(uint32 School, uint32* dmg)
  344.     {
  345.         uint32 mask = GetSchoolMask();
  346.         if (!(mask & g_spellSchoolConversionTable[School]))
  347.             return 0;
  348.  
  349.         Player* caster = GetPlayerCaster();
  350.         if (caster == NULL)
  351.             return 0;
  352.  
  353.         if (!Rand(caster->GetParryChance()))
  354.             return 0;
  355.  
  356.         uint32 dmg_absorbed = *dmg * GetModAmount(0) / 100;
  357.         *dmg -= dmg_absorbed;
  358.  
  359.         return dmg_absorbed;
  360.     }
  361. };
  362.  
  363. class BloodwormSpell : public Spell
  364. {
  365.     SPELL_FACTORY_FUNCTION(BloodwormSpell);
  366.  
  367.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  368.     {
  369.         return 2 + RandomUInt(2);
  370.     }
  371. };
  372.  
  373. class WillOfTheNecropolisAura : public AbsorbAura
  374. {
  375.     public:
  376.     static Aura* Create(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL) { return new WillOfTheNecropolisAura(proto, duration, caster, target, temporary, i_caster); }
  377.  
  378.     WillOfTheNecropolisAura(SpellEntry* proto, int32 duration, Object* caster, Unit* target, bool temporary = false, Item* i_caster = NULL)
  379.         : AbsorbAura(proto, duration, caster, target, temporary, i_caster) {}
  380.  
  381.     uint32 AbsorbDamage(uint32 School, uint32* dmg)
  382.     {
  383.         Unit* caster = GetUnitCaster();
  384.         if (caster == NULL)
  385.             return 0;
  386.  
  387.         int health_pct = caster->GetHealthPct();
  388.         uint32 cur_health = caster->GetHealth();
  389.         uint32 max_health = caster->GetMaxHealth();
  390.         uint32 new_health_pct = (cur_health - *dmg) * 100 / max_health;
  391.  
  392.         // "Damage that would take you below $s1% health or taken while you are at $s1% health is reduced by $52284s1%."
  393.         if ((health_pct > 35 && new_health_pct < 35) || health_pct == 35)
  394.         {
  395.             uint32 dmg_absorbed = *dmg * (GetSpellProto()->EffectBasePoints[0] + 1) / 100;
  396.             *dmg -= dmg_absorbed;
  397.  
  398.             return dmg_absorbed;
  399.         }
  400.         else
  401.             return 0;
  402.     }
  403. };
  404.  
  405. class VampiricBloodSpell : public Spell
  406. {
  407.     SPELL_FACTORY_FUNCTION(VampiricBloodSpell);
  408.  
  409.     int32 DoCalculateEffect(uint32 i, Unit* target, int32 value)
  410.     {
  411.         if (i == 1 && p_caster != NULL)
  412.             value = p_caster->GetMaxHealth() * (GetProto()->EffectBasePoints[i] + 1) / 100;
  413.  
  414.         return value;
  415.     }
  416. };
  417.  
  418. class HeartStrikeSpell : public Spell
  419. {
  420.     SPELL_FACTORY_FUNCTION(HeartStrikeSpell);
  421.  
  422.     void DoAfterHandleEffect(Unit* target, uint32 i)
  423.     {
  424.         if (p_caster == NULL || i != 1)
  425.             return;
  426.  
  427.         Aura* aur = p_caster->FindAuraByNameHash(SPELL_HASH_SUDDEN_DOOM);
  428.  
  429.         if (aur == NULL)
  430.             return;
  431.  
  432.         if (!Rand(aur->GetSpellProto()->procChance))
  433.             return;
  434.  
  435.         p_caster->CastSpell(target, 47632, false);
  436.     }
  437. };
  438.  
  439. // Mage
  440. //Missile Barrage
  441. /*
  442. SPELL/AURA INFORMATION:
  443. How did the spell/aura act BEFORE this fix??
  444.     -The missile barrage aura was not correctly being removed after casting arcane missiles at a target when this aura was active.
  445.  
  446. How does the spell/aura act AFTER this fix and is there still any issues?
  447.     -Missile Barrage is now correctly removed after casting arcane missiles. There is no other issues with this aura.
  448. */
  449. class MissileBarrage : public Spell
  450. {
  451.     SPELL_FACTORY_FUNCTION(MissileBarrage);
  452.  
  453.     void DoAfterHandleEffect(Unit* target, uint32 i)
  454.     {
  455.         if (p_caster != NULL && target != NULL && p_caster->HasAura(44401)) // Player has "Missile Barrage" aura so we remove it AFTER casting arcane missles.
  456.         {
  457.             p_caster->RemoveAllAuraById(44401);
  458.         }
  459.     }
  460. };
  461.  
  462. void SpellFactoryMgr::SetupSpellClassScripts()
  463. {
  464.     //////////////////////////////////////////////////////////////////////////////////////////
  465.     // Mage
  466.     AddSpellById(5143, MissileBarrage::Create);   //Rank 1
  467.     AddSpellById(5144, MissileBarrage::Create);   //Rank 2
  468.     AddSpellById(5145, MissileBarrage::Create);   //Rank 3
  469.     AddSpellById(8416, MissileBarrage::Create);   //Rank 4
  470.     AddSpellById(8417, MissileBarrage::Create);   //Rank 5
  471.     AddSpellById(10211, MissileBarrage::Create);   //Rank 6
  472.     AddSpellById(10212, MissileBarrage::Create);   //Rank 7
  473.     AddSpellById(25345, MissileBarrage::Create);   //Rank 8
  474.     AddSpellById(27075, MissileBarrage::Create);   //Rank 9
  475.     AddSpellById(38699, MissileBarrage::Create);   //Rank 10
  476.     AddSpellById(38704, MissileBarrage::Create);   //Rank 11
  477.     AddSpellById(42843, MissileBarrage::Create);   //Rank 12
  478.     AddSpellById(42846, MissileBarrage::Create);   //Rank 13
  479.  
  480.     //////////////////////////////////////////////////////////////////////////////////////////
  481.     // Warrior
  482.  
  483.     //////////////////////////////////////////////////////////////////////////////////////////
  484.     // Warlock
  485.  
  486.     //////////////////////////////////////////////////////////////////////////////////////////
  487.     // Shaman
  488.     AddSpellById(1535, FireNova::Create);   //Rank 1
  489.     AddSpellById(8498, FireNova::Create);   //Rank 2
  490.     AddSpellById(8499, FireNova::Create);   //Rank 3
  491.     AddSpellById(11314, FireNova::Create);  //Rank 4
  492.     AddSpellById(11315, FireNova::Create);  //Rank 5
  493.     AddSpellById(25546, FireNova::Create);  //Rank 6
  494.     AddSpellById(25547, FireNova::Create);  //Rank 7
  495.     AddSpellById(61649, FireNova::Create);  //Rank 8
  496.     AddSpellById(61657, FireNova::Create);  //Rank 9
  497.  
  498.     //////////////////////////////////////////////////////////////////////////////////////////
  499.     // Rogue
  500.     AddAuraById(31228, &CheatDeathAura::Create);   // Rank 1
  501.     AddAuraById(31229, &CheatDeathAura::Create);   // Rank 2
  502.     AddAuraById(31230, &CheatDeathAura::Create);   // Rank 3
  503.  
  504.     //////////////////////////////////////////////////////////////////////////////////////////
  505.     // Priest
  506.     AddSpellById(47585, &DispersionSpell::Create);
  507.  
  508.     //////////////////////////////////////////////////////////////////////////////////////////
  509.     // Druid
  510.     AddSpellByNameHash(SPELL_HASH_INNERVATE, &InnervateSpell::Create);
  511.  
  512.     //////////////////////////////////////////////////////////////////////////////////////////
  513.     // DeathKnight
  514.     AddSpellById(55078, &BloodPlagueSpell::Create);
  515.     AddSpellById(45477, &IcyTouchSpell::Create);
  516.     AddSpellById(55095, &FrostFeverSpell::Create);
  517.  
  518.     AddSpellById(48721, &BloodBoilSpell::Create);   // Rank 1
  519.     AddSpellById(49939, &BloodBoilSpell::Create);   // Rank 2
  520.     AddSpellById(49940, &BloodBoilSpell::Create);   // Rank 3
  521.     AddSpellById(49941, &BloodBoilSpell::Create);   // Rank 4
  522.  
  523.     AddSpellById(45902, &BloodStrikeSpell::Create);   // Rank 1
  524.     AddSpellById(49926, &BloodStrikeSpell::Create);   // Rank 2
  525.     AddSpellById(49927, &BloodStrikeSpell::Create);   // Rank 3
  526.     AddSpellById(49928, &BloodStrikeSpell::Create);   // Rank 4
  527.     AddSpellById(49929, &BloodStrikeSpell::Create);   // Rank 5
  528.     AddSpellById(49930, &BloodStrikeSpell::Create);   // Rank 6
  529.  
  530.     AddSpellById(47541, &DeathCoilSpell::Create);   // Rank 1
  531.     AddSpellById(49892, &DeathCoilSpell::Create);   // Rank 2
  532.     AddSpellById(49893, &DeathCoilSpell::Create);   // Rank 3
  533.     AddSpellById(49894, &DeathCoilSpell::Create);   // Rank 4
  534.     AddSpellById(49895, &DeathCoilSpell::Create);   // Rank 5
  535.  
  536.     AddSpellById(56815, &RuneStrileSpell::Create);
  537.  
  538.     AddAuraById(48707, &AntiMagicShellAura::Create);
  539.  
  540.     AddAuraById(49145, &SpellDeflectionAura::Create);   // Rank 1
  541.     AddAuraById(49495, &SpellDeflectionAura::Create);   // Rank 2
  542.     AddAuraById(49497, &SpellDeflectionAura::Create);   // Rank 3
  543.  
  544.     AddSpellById(50452, &BloodwormSpell::Create);
  545.  
  546.     AddAuraById(52284, &WillOfTheNecropolisAura::Create);   // Rank 1
  547.     AddAuraById(52285, &WillOfTheNecropolisAura::Create);   // Rank 1
  548.     AddAuraById(52286, &WillOfTheNecropolisAura::Create);   // Rank 1
  549.  
  550.     AddSpellById(55233, &VampiricBloodSpell::Create);
  551.  
  552.     AddSpellById(55050, &HeartStrikeSpell::Create);   // Rank 1
  553.     AddSpellById(55258, &HeartStrikeSpell::Create);   // Rank 2
  554.     AddSpellById(55259, &HeartStrikeSpell::Create);   // Rank 3
  555.     AddSpellById(55260, &HeartStrikeSpell::Create);   // Rank 4
  556.     AddSpellById(55261, &HeartStrikeSpell::Create);   // Rank 5
  557.     AddSpellById(55262, &HeartStrikeSpell::Create);   // Rank 6
  558. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement