diff options
28 files changed, 9181 insertions, 314 deletions
diff --git a/sql/updates/world/3.3.5/2016_xx_xx_xx_world.sql b/sql/updates/world/3.3.5/2016_xx_xx_xx_world.sql new file mode 100644 index 00000000000..6f5ff702974 --- /dev/null +++ b/sql/updates/world/3.3.5/2016_xx_xx_xx_world.sql @@ -0,0 +1,1115 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (15290, 59725); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 59725, 0, 0, 33, 0, 1, 0, 0, 1, 0, 0, '', 'Spell Improved Spell Reflection (effect 0) will hit the potential target of the spell if target is not the same as condition target.'), +(13, 1, 15290, 0, 0, 33, 0, 1, 0, 0, 1, 0, 0, '', 'Spell Vampiric Embrace (effect 0) will hit the potential target of the spell if target is not the same as condition target.'); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=24 AND `SourceGroup`=0 AND `SourceEntry` IN (38164,70805); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(24, 0, 38164, 0, 0, 31, 1, 3, 19457, 0, 0, 0, 0, '', 'Spell Unyielding Knights can proc on actionTarget if target is unit Grillok "Darkeye".'), +(24, 0, 70805, 0, 0, 33, 1, 0, 0, 0, 1, 0, 0, '', 'Spell Item - Rogue T10 2P Bonus can proc on actionTarget if target is not the same as condition target.'); + +-- Earth shield heal is DAMAGE_CLASS_NONE, it won't scale +-- Entry is unneeded +DELETE FROM `spell_bonus_data` WHERE `entry`=379; + +-- Remove renamed scripts +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_gen_dummy_trigger','spell_pri_item_greater_heal_refund'); + +-- Stop console spam from dummy EFFECT_2 proc +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_pal_seals'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(20375, 'spell_pal_seals'), -- Seal of Command +(21084, 'spell_pal_seals'), -- Seal of Righteousness +(31801, 'spell_pal_seals'), -- Seal of Vengeance +(31892, 'spell_pal_seals'), -- Seal of Blood +(33127, 'spell_pal_seals'), -- Seal of Command +(38008, 'spell_pal_seals'), -- Seal of Blood +(41459, 'spell_pal_seals'), -- Seal of Blood +(53720, 'spell_pal_seals'), -- Seal of the Martyr +(53736, 'spell_pal_seals'); -- Seal of Corruption + +-- Grouped several hacks and handled with AuraScript now +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_mage_fingers_of_frost'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(74396, 'spell_mage_fingers_of_frost'); -- Fingers of Frost + +-- Threat of Thassarian triggered spells, for easier script access +DELETE FROM `spell_ranks` WHERE `first_spell_id` IN (59133,66198,66196,66216,66188,66215); +INSERT INTO `spell_ranks` (`first_spell_id`, `spell_id`, `rank`) VALUES +(66198, 66198, 1), +(66198, 66972, 2), +(66198, 66973, 3), +(66198, 66974, 4), + +(66196, 66196, 1), +(66196, 66958, 2), +(66196, 66959, 3), +(66196, 66960, 4), +(66196, 66961, 5), +(66196, 66962, 6), + +(66216, 66216, 1), +(66216, 66988, 2), +(66216, 66989, 3), +(66216, 66990, 4), +(66216, 66991, 5), +(66216, 66992, 6), + +(66188, 66188, 1), +(66188, 66950, 2), +(66188, 66951, 3), +(66188, 66952, 4), +(66188, 66953, 5), + +(66215, 66215, 1), +(66215, 66975, 2), +(66215, 66976, 3), +(66215, 66977, 4), +(66215, 66978, 5), +(66215, 66979, 6); + +DELETE FROM `command` WHERE `name`='reload spell_proc_event'; +-- Charges drop (previously hardcoded in SpellMgr::LoadSpellInfoCorrections) +DELETE FROM `spell_proc` WHERE `SpellId` IN (17941, 18820, 22008, 28200, 31834, 32216, 34477, 34936, 44401, 48108, 51124, 54741, 57761, 64823); +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(17941, 0, 5, 0x00000001, 0x00000000, 0x00000000, 65536, 0x1, 0x1, 0, 0x0, 0, 0, 0, 1), -- Shadow Trance +(18820, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x7, 0x1, 0, 0x0, 0, 0, 0, 1), -- Insight +(22008, 0, 3, 0x61400035, 0x00000000, 0x00000000, 69632, 0x5, 0x1, 0, 0x0, 0, 0, 0, 1), -- Netherwind Focus +(28200, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x3, 0x1, 0, 0x0, 0, 0, 0, 6), -- Ascendance +(31834, 0, 10, 0x80000000, 0x00000000, 0x00000000, 16384, 0x2, 0x1, 0, 0x0, 0, 0, 0, 1), -- Light's Grace +(32216, 0, 4, 0x00000000, 0x00000100, 0x00000000, 16, 0x1, 0x4, 0, 0x0, 0, 0, 0, 1), -- Victorious (drop charge on Victory rush cast) +(34477, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x5, 0x2, 0, 0x0, 0, 0, 0, 1), -- Misdirection +(34936, 0, 5, 0x00000001, 0x00000040, 0x00000000, 65536, 0x1, 0x1, 0, 0x8, 0, 0, 0, 1), -- Backlash +(44401, 0, 3, 0x00000800, 0x00000000, 0x00000000, 4096, 0x5, 0x1, 0, 0x8, 0, 0, 0, 1), -- Missile Barrage +(48108, 0, 3, 0x00400000, 0x00000000, 0x00000000, 65536, 0x1, 0x1, 0, 0x8, 0, 0, 0, 1), -- Hot Streak +(51124, 0, 15, 0x00000002, 0x00000006, 0x00000000, 65552, 0x1, 0x2, 0, 0x8, 0, 0, 0, 1), -- Killing Machine +(54741, 0, 3, 0x00000004, 0x00000000, 0x00000000, 65536, 0x5, 0x1, 0, 0x0, 0, 0, 0, 1), -- Firestarter +(57761, 0, 3, 0x00000001, 0x00001000, 0x00000000, 65536, 0x1, 0x1, 0, 0x8, 0, 0, 0, 1), -- Fireball! +(64823, 0, 7, 0x00000004, 0x00000000, 0x00000000, 65536, 0x1, 0x1, 0, 0x0, 0, 0, 0, 1); -- Elune's Wrath + +-- Port procs from spell_proc_event table +DELETE FROM `spell_proc` WHERE `SpellId` IN (-974, -1463, -10400, -11119, -11185, -12834, -13983, -14156, -15337, -16180, -18094, -18213, -20234, -20335, -27243, -29441, -29723, -29834, -30293, -30675, -31244, -31571, -31656, -31785, -31871, -31876, -34497, -34914, -44404, -44445, -44546, -46913, -46951, -47569, -48539, -48979, -49015, -49018, -49182, -49188, -49208, -49217, -49467, -51459, -51474, -51525, -51556, -51625, -51627, -51664, -53178, -53228, -53290, -53380, -53501, -53569, -53695, -54639, -54747, -59088, -61680, -62764, -63156, -63373, -64127, -65661, 1719, 11129, 12536, 15286, 16246, 16864, 16870, 17619, 20185, 20186, 22007, 24658, 24932, 26169, 26467, 28716, 28719, 28744, 28789, 28809, 28823, 28845, 28847, 28849, 29601, 32863, 36123, 38252, 39367, 44141, 70388, 30823, 31801, 32409, 33757, 37288, 37295, 37381, 37377, 39437, 37168, 37594, 38164, 39372, 40438, 40442, 40463, 40470, 40971, 42770, 45057, 46916, 47383, 71162, 71165, 49005, 49028, 49194, 49222, 49796, 51209, 51528, 51529, 51530, 51531, 51532, 51698, 51700, 51701, 52420, 52437, 53601, 53646, 53736, 54274, 54276, 54277, 54748, 54754, 54815, 54821, 54832, 54845, 54909, 54937, 54939, 55198, 55440, 55677, 56218, 56372, 56374, 56375, 56800, 57870, 58375, 58642, 58677, 58877, 59906, 59915, 37447, 61062, 61257, 62259, 62600, 62606, 63279, 63280, 63320, 64890, 64928, 65032, 67228, 69755, 69739, 69762, 70723, 70664, 70770, 70805, 70808, 70817, 70844, 70672, 72455, 72832, 72833, 71756, 72782, 72783, 72784, 71406, 71545, 71880, 71892, 71519, 71562, 71564, 71634, 71640, 71761, 71770, 72176, 75475, 75481); +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(-974, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x2, 0, 0, 3000, 0), -- Earth Shield +(-1463, 0, 3, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 1024, 0x0, 0, 0, 0, 0), -- Mana Shield +(-10400, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Flametongue Weapon (Passive) +(-11119, 4, 3, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Ignite +(-11185, 0, 3, 0x00000080, 0x00000000, 0x00000000, 65536, 0x1, 0x2, 0, 0x2, 0, 0, 0, 0), -- Improved Blizzard +(-12834, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Deep Wounds Aura +(-13983, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 24, 0x0, 0, 0, 1000, 0), -- Setup +(-14156, 0, 8, 0x003E0000, 0x00000009, 0x00000000, 0, 0x0, 0x4, 0, 0x0, 0, 0, 0, 0), -- Ruthlessness +(-15337, 0, 6, 0x00802000, 0x00000002, 0x00000000, 0, 0x1, 0x2, 2, 0x2, 0, 0, 0, 0), -- Improved Spirit Tap +(-16180, 0, 11, 0x000001C0, 0x00000000, 0x00000010, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Improved Water Shield +(-18094, 0, 5, 0x0000000A, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Nightfall +(-18213, 32, 5, 0x00004000, 0x00000000, 0x00000000, 2, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Improved Drain Soul +(-20234, 0, 10, 0x00008000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Lay on Hands +(-20335, 0, 10, 0x00800000, 0x00000000, 0x00000000, 16, 0x5, 0x2, 0, 0x0, 0, 100, 0, 0), -- Heart of the Crusader +(-27243, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of corruption (Warlock) +(-29441, 0, 3, 0x00000000, 0x00000000, 0x00000000, 0, 0x7, 0x0, 8, 0x0, 0, 0, 1000, 0), -- Magic Absorption +(-29723, 0, 4, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Sudden Death +(-29834, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x5, 0x0, 0, 0x0, 0, 0, 0, 0), -- Second Wind (Warrior talent) +(-30293, 0, 5, 0x00000181, 0x008200C0, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Soul Leech +(-30675, 0, 11, 0x00000003, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Lightning Overload +(-31244, 0, 8, 0x003A0000, 0x00000009, 0x00000000, 0, 0x5, 0x2, 11196, 0x0, 0, 0, 0, 0), -- Quick Recovery +(-31571, 0, 3, 0x00000000, 0x00000022, 0x00000008, 16384, 0x7, 0x4, 0, 0x0, 0, 0, 0, 0), -- Arcane Potency +(-31656, 4, 3, 0x08000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Empowered Fire +(-31785, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Spiritual Attunement +(-31871, 0, 10, 0x00000010, 0x00000000, 0x00000000, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Divine Purpose +(-31876, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Judgements of the Wise +(-34497, 0, 9, 0x00060800, 0x00800001, 0x00000201, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Thrill of the Hunt +(-34914, 0, 6, 0x00002000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Vampiric Touch +(-44404, 0, 3, 0x20000021, 0x00009000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Missile Barrage +(-44445, 0, 3, 0x00000013, 0x00011000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Hot Streak +(-44546, 0, 3, 0x000002E0, 0x00001000, 0x00000000, 69632, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Brain Freeze +(-46913, 0, 4, 0x00000040, 0x00000404, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Bloodsurge +(-46951, 0, 4, 0x00000400, 0x00000040, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Sword and Board +(-47569, 0, 6, 0x00004000, 0x00000000, 0x00000000, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Shadowform +(-48539, 0, 7, 0x00000010, 0x04000000, 0x00000000, 262144, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Revitalize +(-48979, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 0, 0), -- Butchery +(-49015, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 0, 0), -- Vendetta +(-49018, 0, 15, 0x01400000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Sudden Doom +(-49182, 0, 15, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Blade Barrier +(-49188, 0, 15, 0x00000000, 0x00020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Rime +(-49208, 0, 15, 0x00400000, 0x00010000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Reaping +(-49217, 0, 15, 0x00000000, 0x00000000, 0x00000002, 0, 0x0, 0x0, 0, 0x0, 0, 0, 1000, 0), -- Wandering Plague +(-49467, 0, 15, 0x00000010, 0x00020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Death Rune Mastery +(-51459, 0, 0, 0x00000000, 0x00000000, 0x00000000, 4, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Necrosis +(-51474, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Astral Shift +(-51525, 0, 11, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0 ,0x0, 0, 0, 0, 0), -- Static Shock +(-51556, 0, 11, 0x000000C0, 0x00000000, 0x00000010, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Ancestral Awakening +(-51625, 0, 8, 0x1000A000, 0x00000000, 0x00000000, 0, 0x5, 0x2, 0, 0x0, 0, 0, 0, 0), -- Deadly Brew +(-51627, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 112, 0x0, 0, 0, 0, 0), -- Turn the Tables +(-51664, 0, 8, 0x00020000, 0x00000008, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Cut to the Chase +(-53178, 0, 9, 0x00000000, 0x10000000, 0x00000000, 65536, 0x4, 0x2, 0, 0x0, 0, 100, 0, 0), -- Guard Dog +(-53228, 0, 9, 0x00000020, 0x01000000, 0x00000000, 0, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Rapid Recuperation +(-53290, 0, 9, 0x00000800, 0x00000001, 0x00000200, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Hunting Party +(-53380, 0, 10, 0x00800000, 0x00028000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Righteous Vengeance +(-53501, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Sheath of Light +(-53569, 0, 10, 0x40200000, 0x00010000, 0x00000000, 0, 0x3, 0x2, 0, 0x0, 0, 0, 0, 0), -- Infusion of Light +(-53695, 0, 10, 0x00800000, 0x00000000, 0x00000008, 16, 0x5, 0x2, 0, 0x2, 0, 0, 0, 0), -- Judgements of the Just +(-54639, 0, 15, 0x00400000, 0x00010000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Blood of the North +(-54747, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Burning Determination +(-59088, 0, 4, 0x00000000, 0x00000002, 0x00000000, 1024, 0x4, 0x4, 0, 0x0, 0, 0, 0, 0), -- Improved Spell Reflection +(-61680, 0, 9, 0x00000000, 0x10000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Culling the Herd +(-62764, 0, 9, 0x00000000, 0x10000000, 0x00000000, 65536, 0x4, 0x2, 0, 0x0, 0, 100, 0, 0), -- Silverback +(-63156, 0, 5, 0x00000001, 0x000000C0, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Decimation +(-63373, 0, 11, 0x80000000, 0x00000000, 0x00000000, 65536, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Frozen Power +(-64127, 0, 6, 0x00000001, 0x00000001, 0x00000000, 0, 0x6, 0x2, 0, 0x0, 0, 0, 0, 0), -- Body and Soul +(-65661, 0, 15, 0x00400011, 0x20020004, 0x00000000, 16, 0x1, 0x2, 0, 0x0, 0, 100, 0, 0), -- Threat of Thassarian + +(1719, 0, 4, 0x2E600444, 0x00404745, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Recklessness +(11129, 4, 3, 0x08C00017, 0x00031048, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Combustion +(12536, 0, 3, 0x20C21AF7, 0x00029040, 0x00000000, 0, 0x0, 0x1, 0, 0x4, 0, 0, 0, 0), -- Clearcasting (Mage) +(15286, 32, 6, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Vampiric Embrace +(16246, 0, 11, 0x981001C3, 0x00001400, 0x00000010, 0, 0x0, 0x1, 0, 0x4, 0, 0, 0, 0), -- Clearcasting (Shaman) +(16864, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 6, 0, 0), -- Omen of Clarity +(16870, 0, 7, 0x00E3BBFF, 0x079007D3, 0x00040400, 0, 0x0, 0x1, 0, 0x4, 0, 0, 0, 0), -- Clearcasting (Druid) +(17619, 0, 13, 0x00000000, 0x00000000, 0x00000000, 32768, 0x7, 0x0, 0, 0x0, 0, 0, 0, 0), -- Alchemist's Stone +(20185, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 15, 0, 0, 0), -- Judgement of Light +(20186, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 15, 0, 0, 0), -- Judgement of Wisdom +(22007, 0, 3, 0x00200021, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Netherwind Focus +(24658, 0, 0, 0x00000000, 0x00000000, 0x00000000, 87376, 0x7, 0x2, 0, 0x0, 0, 0, 0, 0), -- Unstable Power +(24932, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Leader of the Pack +(26169, 0, 6, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Oracle Healing Bonus +(26467, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Persistent Shield +(28716, 0, 7, 0x00000010, 0x00000000, 0x00000000, 262144, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Rejuvenation - Dreamwalker Raiment 2pc +(28719, 0, 7, 0x00000020, 0x00000000, 0x00000000, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Healing Touch - Dreamwalker Raiment 8 pc +(28744, 0, 7, 0x00000040, 0x00000000, 0x00000000, 278528, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Regrowth - Dreamwalker Raiment 6pc +(28789, 0, 10, 0xC0000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Holy Power +(28809, 0, 6, 0x00001000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Greater Heal - Vestments of Faith 4pc +(28823, 0, 11, 0x000000C0, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Totemic Power +(28845, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Cheat Death +(28847, 0, 7, 0x00000020, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Healing Touch Refund +(28849, 0, 11, 0x00000080, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Lesser Heealing Wave +(29601, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x4, 0, 0, 0, 0), -- Enlightenment + +(32863, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of Corruption (Monster) +(36123, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of Corruption (Monster) +(38252, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of Corruption (Monster) +(39367, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of Corruption (Monster) +(44141, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of Corruption (Monster) +(70388, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Seed of Corruption (Monster) + +(30823, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 10, 0, 0, 0), -- Shamanistic Rage +(31801, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x2, 0, 0, 0, 0), -- Seal of Vengeance +(32409, 0, 0, 0x00000000, 0x00002000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Shadow Word: Death - do not require honor target +(33757, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 3000, 0), -- Windfury Weapon (Passive) +(37288, 0, 7, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Mana Restore - Malorne Raiment 2pc +(37295, 0, 7, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Mana Restore - Malorne Regalia 2pc +(37381, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Pet Healing + +(37377, 32, 5, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Shadowflame +(39437, 4, 5, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Shadowflame Hellfire and RoF + +(37168, 0, 8, 0x003E0000, 0x00000009, 0x00000000, 0, 0x0, 0x4, 0, 0x0, 0, 0, 0, 0), -- Finisher Combo +(37594, 0, 6, 0x00001000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Greater Heal Refund +(38164, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Unyielding Knights +(39372, 48, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Frozen Shadoweave +(40438, 0, 6, 0x00008040, 0x00000000, 0x00000000, 0, 0x3, 0x0, 0, 0x0, 0, 0, 0, 0), -- Priest Tier 6 Trinket +(40442, 0, 7, 0x00000014, 0x00000440, 0x00000000, 0, 0x7, 0x1, 0, 0x0, 0, 0, 0, 0), -- Druid Tier 6 Trinket +(40463, 0, 11, 0x00000081, 0x00000010, 0x00000000, 0, 0x3, 0x2, 0, 0x0, 0, 0, 0, 0), -- Shaman Tier 6 Trinket +(40470, 0, 10, 0xC0800000, 0x00000000, 0x00000000, 0, 0x3, 0x2, 0, 0x0, 0, 0, 0, 0), -- Paladin Tier 6 Trinket +(40971, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Bonus Healing (Crystal Spire of Karabor) +(42770, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x5, 0x0, 0, 0x0, 0, 0, 0, 0), -- Second Wind (NPC aura) +(45057, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 30000, 0), -- Evasive Maneuvers +(46916, 0, 4, 0x00200000, 0x00000000, 0x00000000, 0, 0x0, 0x4, 0, 0x0, 0, 0, 0, 0), -- Slam! (Bloodsurge proc) + +(47383, 0, 5, 0x00000000, 0x000000C0, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Molten Core +(71162, 0, 5, 0x00000000, 0x000000C0, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Molten Core +(71165, 0, 5, 0x00000000, 0x000000C0, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Molten Core + +(49005, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Mark of Blood +(49028, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x5, 0x2, 0, 0x0, 0, 0, 0, 0), -- Dancing Rune Weapon +(49194, 0, 15, 0x00000000, 0x00000000, 0x00000001, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Unholy Blight +(49222, 0, 0, 0x00000000, 0x00000000, 0x00000000, 139944, 0x0, 0x0, 0, 0x0, 0, 0, 2000, 0), -- Bone Shield +(49796, 0, 15, 0x00000002, 0x00020006, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Deathchill +(51209, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Hungering Cold + +(51528, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 4, 0, 0, 0), -- Maelstrom Weapon (Rank 1) +(51529, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 8, 0, 0, 0), -- Maelstrom Weapon (Rank 2) +(51530, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 12, 0, 0, 0), -- Maelstrom Weapon (Rank 3) +(51531, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 16, 0, 0, 0), -- Maelstrom Weapon (Rank 4) +(51532, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 20, 0, 0, 0), -- Maelstrom Weapon (Rank 5) + +(51698, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x3, 0x2, 2, 0x0, 0, 33, 0, 0), -- Honor Among Thieves (Rank 1) +(51700, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x3, 0x2, 2, 0x0, 0, 66, 0, 0), -- Honor Among Thieves (Rank 2) +(51701, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x3, 0x2, 2, 0x0, 0, 100, 0, 0), -- Honor Among Thieves (Rank 3) + +(52420, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 30000, 0), -- Deflection +(52437, 1, 4, 0x20000000, 0x00000000, 0x00000000, 16, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Sudden Death proc +(53601, 0, 0, 0x00000000, 0x00000000, 0x00000000, 1048576, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Sacred Shield +(53646, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Demonic Pact +(53736, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x2, 0, 0, 0, 0), -- Seal of Corruption + +(54274, 0, 5, 0x00000165, 0x000310C0, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Backdraft +(54276, 0, 5, 0x00000165, 0x000310C0, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Backdraft +(54277, 0, 5, 0x00000165, 0x000310C0, 0x00000000, 0, 0x0, 0x1, 0, 0x8, 0, 0, 0, 0), -- Backdraft + +(54748, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 259, 0x0, 0, 0, 0, 0), -- Burning Determination proc +(54754, 0, 7, 0x00000010, 0x00000000, 0x00000000, 0, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Glyph of Rejuvenation +(54815, 0, 7, 0x00008000, 0x00000000, 0x00000000, 16, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Shred +(54821, 0, 7, 0x00001000, 0x00000000, 0x00000000, 16, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Rake +(54832, 0, 7, 0x00000000, 0x00001000, 0x00000000, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Innervate +(54845, 0, 7, 0x00000004, 0x00000000, 0x00000000, 65536, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Starfire +(54909, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Demonic Pact +(54937, 0, 10, 0x80000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Holy Light +(54939, 0, 10, 0x00008000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Divinity +(55198, 0, 11, 0x000001C0, 0x00000000, 0x00000000, 16384, 0x2, 0x2, 2, 0x0, 0, 0, 0, 3), -- Tidal Force +(55440, 0, 11, 0x00000040, 0x00000000, 0x00000000, 0, 0x2, 0x1, 0, 0x0, 0, 0, 0, 0), -- Glyph of Healing Wave +(55677, 0, 6, 0x00000000, 0x00000001, 0x00000000, 0, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Dispel Magic +(56218, 0, 5, 0x00000002, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Glyph of Corruption +(56372, 0, 3, 0x00000000, 0x00000080, 0x00000000, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Ice Block +(56374, 0, 3, 0x00000000, 0x00004000, 0x00000008, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Icy Veins +(56375, 0, 3, 0x01000000, 0x00000000, 0x00000000, 65536, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Polymorph +(56800, 0, 8, 0x00000004, 0x00000000, 0x00000000, 16, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Backstab +(57870, 0, 9, 0x00800000, 0x00000000, 0x00000000, 262144, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Glyph of Mend Pet +(58375, 0, 4, 0x00000000, 0x00000200, 0x00000000, 16, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Blocking +(58642, 0, 15, 0x00000000, 0x08000000, 0x00000000, 16, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Scourge Strike +(58677, 0, 15, 0x00002000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x2, 0, 0, 0, 0), -- Glyph of Death's Embrace +(58877, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Spirit Hunt +(59906, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 0, 0), -- Swift Hand of Justice +(59915, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Discerning Eye of the Beast + +(37447, 0, 3, 0x00000000, 0x00000100, 0x00000000, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Mana Gems +(61062, 0, 3, 0x00000000, 0x00000100, 0x00000000, 16384, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Mana Gems + +(61257, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x5, 0x0, 0, 0x0, 0, 0, 0, 0), -- Runic Power Back on Snare/Root +(62259, 0, 15, 0x02000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 0, 0), -- Glyph of Death Grip +(62600, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Savage Defense (Passive) +(62606, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 1027, 0x0, 0, 0, 0, 0), -- Savage Defense +(63279, 0, 11, 0x00000000, 0x00000400, 0x00000000, 0, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Earth Shield +(63280, 0, 11, 0x20000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Totem of Wrath +(63320, 0, 5, 0x80040000, 0x00000000, 0x00008000, 1024, 0x7, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Life Tap +(64890, 0, 10, 0x00000000, 0x00010000, 0x00000000, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Item - Paladin T8 Holy 2P Bonus +(64928, 0, 11, 0x00000001, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Item - Shaman T8 Elemental 4P Bonus +(65032, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- 321-Boombot Aura - do not require experience target +(67228, 0, 11, 0x00000000, 0x00001000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T9 Elemental 4P Bonus (Lava Burst) +(69755, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x7, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Purified Shard of the Scale +(69739, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x7, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Shiny Shard of the Scale +(69762, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Unchained Magic +(70723, 0, 7, 0x00000005, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Item - Druid T10 Balance 4P Bonus +(70664, 0, 7, 0x00000010, 0x00000000, 0x00000000, 0, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Druid T10 Restoration 4P Bonus (Rejuvenation) +(70770, 0, 6, 0x00000800, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Priest T10 Healer 2P Bonus +(70805, 0, 8, 0x00000000, 0x00020000, 0x00000000, 0, 0x4, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Rogue T10 2P Bonus +(70808, 0, 11, 0x00000100, 0x00000000, 0x00000000, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Restoration 4P Bonus +(70817, 0, 11, 0x00000000, 0x00001000, 0x00000000, 65536, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Elemental 4P Bonus +(70844, 0, 4, 0x00000100, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Warrior T10 Protection 4P Bonus + +(70672, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Gaseous Bloat +(72455, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Gaseous Bloat +(72832, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Gaseous Bloat +(72833, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Gaseous Bloat + +(71756, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Ball of Flames Proc +(72782, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Ball of Flames Proc +(72783, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Ball of Flames Proc +(72784, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Ball of Flames Proc + +(71406, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 50, 0, 0), -- Anger Capacitor +(71545, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 50, 0, 0), -- Anger Capacitor + +(71880, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 1, 0, 0, 0), -- Item - Icecrown 25 Normal Dagger Proc +(71892, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 1, 0, 0, 0), -- Item - Icecrown 25 Heroic Dagger Proc + +(71519, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 105000, 0), -- Deathbringer's Will +(71562, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 105000, 0), -- Deathbringer's Will (Heroic) +(71564, 126, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x3, 0x2, 2, 0x0, 0, 0, 0, 5), -- Deadly Precision +(71634, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 30000, 0), -- Item - Icecrown 25 Normal Tank Trinket 1 +(71640, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 30000, 0), -- Item - Icecrown 25 Heroic Tank Trinket 1 +(71761, 3, 0, 0x00000000, 0x00100000, 0x00000000, 0, 0x5, 0x2, 256, 0x0, 0, 0, 0, 0), -- Deep Freeze Immunity State +(71770, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Ooze Spell Tank Protection +(72176, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Blood Beast's Blood Link +(75475, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 45000, 0), -- Item - Chamber of Aspects 25 Tank Trinket +(75481, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 45000, 0); -- Item - Chamber of Aspects 25 Heroic Tank Trinket + +-- Add spellscripts to spells previously on giant switches in Unit.cpp +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_rog_t10_2p_bonus'; +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_sha_flametongue_weapon','spell_mage_imp_blizzard','spell_warr_deep_wounds_aura','spell_rog_setup','spell_pri_improved_spirit_tap','spell_sha_imp_water_shield','spell_warl_improved_drain_soul','spell_pal_improved_lay_of_hands','spell_pal_heart_of_the_crusader','spell_warl_seed_of_corruption_dummy','spell_mage_magic_absorption','spell_warr_extra_proc','spell_warr_second_wind','spell_warl_soul_leech','spell_sha_lightning_overload','spell_rog_quick_recovery','spell_mage_arcane_potency','spell_mage_empowered_fire','spell_pal_spiritual_attunement','spell_pal_divine_purpose','spell_pal_judgements_of_the_wise','spell_hun_thrill_of_the_hunt','spell_mage_missile_barrage','spell_mage_hot_streak','spell_warr_sword_and_board','spell_pri_imp_shadowform','spell_dk_butchery','spell_item_unstable_power','spell_item_restless_strength','spell_dru_leader_of_the_pack','spell_pri_aq_3p_bonus','spell_item_persistent_shield','spell_dru_revitalize','spell_dk_death_rune','spell_dk_scent_of_blood_trigger','spell_dk_vendetta','spell_dk_sudden_doom','spell_dk_blade_barrier','spell_dk_rime','spell_dk_wandering_plague','spell_sha_astral_shift_aura','spell_dk_necrosis','spell_sha_static_shock','spell_sha_maelstrom_weapon','spell_sha_ancestral_awakening','spell_rog_deadly_brew','spell_rog_turn_the_tables','spell_rog_cut_to_the_chase','spell_pet_guard_dog','spell_hun_rapid_recuperation_trigger','spell_hun_hunting_party','spell_pal_righteous_vengeance','spell_pal_sheath_of_light','spell_pal_infusion_of_light','spell_pal_judgements_of_the_just','spell_mage_burning_determination','spell_warr_improved_spell_reflection','spell_pet_culling_the_herd','spell_pet_silverback','spell_warl_decimation','spell_sha_frozen_power','spell_pri_body_and_soul','spell_dk_threat_of_thassarian','spell_warl_seduction','spell_mage_combustion','spell_pri_vampiric_embrace','spell_dru_omen_of_clarity','spell_item_alchemists_stone','spell_pal_judgement_of_light_heal','spell_pal_judgement_of_wisdom_mana','spell_twisted_reflection','spell_dru_t3_2p_bonus','spell_dru_t3_8p_bonus','spell_dru_t3_6p_bonus','spell_pal_t3_6p_bonus','spell_pri_t3_4p_bonus','spell_sha_t3_6p_bonus','spell_warr_t3_prot_8p_bonus','spell_item_healing_touch_refund','spell_item_totem_of_flowing_water','spell_item_pendant_of_the_violet_eye','spell_sha_shamanistic_rage','spell_pal_seal_of_vengeance','spell_warl_seed_of_corruption_generic','spell_mark_of_malice','spell_item_mark_of_conquest','spell_sha_windfury_weapon','spell_dru_t4_2p_bonus','spell_pri_t5_heal_2p_bonus','spell_anetheron_vampiric_aura','spell_item_frozen_shadoweave','spell_item_aura_of_madness','spell_pri_item_t6_trinket','spell_dru_item_t6_trinket','spell_sha_item_t6_trinket','spell_pal_item_t6_trinket','spell_item_crystal_spire_of_karabor','spell_item_dementia','spell_item_pet_healing','spell_warl_t4_2p_bonus_shadow','spell_warl_t4_2p_bonus_fire','spell_mage_gen_extra_effects','spell_uk_second_wind','spell_item_commendation_of_kaelthas','spell_item_sunwell_exalted_caster_neck','spell_item_sunwell_exalted_melee_neck','spell_item_sunwell_exalted_tank_neck','spell_item_sunwell_exalted_healer_neck','spell_warl_glyph_of_corruption_nightfall','spell_dk_mark_of_blood','spell_dk_dancing_rune_weapon','spell_dk_unholy_blight','spell_dk_hungering_cold','spell_item_soul_harvesters_charm','spell_rog_turn_the_tables_proc','spell_pal_sacred_shield_dummy','spell_warl_demonic_pact','spell_pal_seal_of_corruption','spell_dru_glyph_of_rejuvenation','spell_dru_glyph_of_shred','spell_dru_glyph_of_rake','spell_dru_glyph_of_innervate','spell_dru_glyph_of_starfire_dummy','spell_pal_glyph_of_holy_light_dummy','spell_pal_glyph_of_divinity','spell_sha_tidal_force_dummy','spell_sha_glyph_of_healing_wave','spell_pri_glyph_of_dispel_magic','spell_mage_glyph_of_ice_block','spell_mage_glyph_of_icy_veins','spell_mage_glyph_of_polymorph','spell_rog_glyph_of_backstab','spell_hun_glyph_of_mend_pet','spell_pri_shadowfiend_death','spell_warr_glyph_of_blocking','spell_dk_glyph_of_scourge_strike','spell_sha_spirit_hunt','spell_hun_kill_command_pet','spell_item_swift_hand_justice_dummy','spell_item_discerning_eye_beast_dummy','spell_mage_imp_mana_gems','spell_gen_vampiric_touch','spell_dk_pvp_4p_bonus','spell_dk_glyph_of_death_grip','spell_dru_savage_defense','spell_sha_glyph_of_earth_shield','spell_sha_glyph_of_totem_of_wrath','spell_warl_glyph_of_life_tap','spell_pal_t8_2p_bonus','spell_sha_t8_elemental_4p_bonus','spell_xt002_321_boombot_aura','spell_sha_t9_elemental_4p_bonus','spell_item_purified_shard_of_the_scale','spell_item_shiny_shard_of_the_scale','spell_dru_t10_balance_4p_bonus','spell_dru_t10_restoration_4p_bonus_dummy','spell_pri_t10_heal_2p_bonus','spell_sha_t10_restoration_4p_bonus','spell_sha_t10_elemental_4p_bonus','spell_warr_item_t10_prot_4p_bonus','spell_item_tiny_abomination_in_a_jar','spell_item_tiny_abomination_in_a_jar_hero','spell_item_deadly_precision_dummy','spell_item_deadly_precision','spell_item_heartpierce','spell_item_heartpierce_hero','spell_item_deathbringers_will_normal','spell_item_deathbringers_will_heroic','spell_item_corpse_tongue_coin','spell_item_corpse_tongue_coin_heroic','spell_putricide_ooze_tank_protection','spell_deathbringer_blood_beast_blood_link','spell_item_petrified_twilight_scale','spell_item_petrified_twilight_scale_heroic'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-10400, 'spell_sha_flametongue_weapon'), +(-11185, 'spell_mage_imp_blizzard'), +(-12834, 'spell_warr_deep_wounds_aura'), +(-13983, 'spell_rog_setup'), +(-15337, 'spell_pri_improved_spirit_tap'), +(-16180, 'spell_sha_imp_water_shield'), +(-18213, 'spell_warl_improved_drain_soul'), +(-20234, 'spell_pal_improved_lay_of_hands'), +(-20335, 'spell_pal_heart_of_the_crusader'), +(-27243, 'spell_warl_seed_of_corruption_dummy'), +(-29441, 'spell_mage_magic_absorption'), + +(-29723, 'spell_warr_extra_proc'), +(-46913, 'spell_warr_extra_proc'), + +(-29834, 'spell_warr_second_wind'), +(-30293, 'spell_warl_soul_leech'), +(-30675, 'spell_sha_lightning_overload'), +(-31244, 'spell_rog_quick_recovery'), +(-31571, 'spell_mage_arcane_potency'), +(-31656, 'spell_mage_empowered_fire'), +(-31785, 'spell_pal_spiritual_attunement'), +(-31871, 'spell_pal_divine_purpose'), +(-31876, 'spell_pal_judgements_of_the_wise'), +(-34497, 'spell_hun_thrill_of_the_hunt'), +(-44404, 'spell_mage_missile_barrage'), +(-44445, 'spell_mage_hot_streak'), +(-46951, 'spell_warr_sword_and_board'), +(-47569, 'spell_pri_imp_shadowform'), +(-48979, 'spell_dk_butchery'), +(-48539, 'spell_dru_revitalize'), + +(-49208, 'spell_dk_death_rune'), +(-49467, 'spell_dk_death_rune'), +(-54639, 'spell_dk_death_rune'), + +(-49004, 'spell_dk_scent_of_blood_trigger'), +(-49015, 'spell_dk_vendetta'), +(-49018, 'spell_dk_sudden_doom'), +(-49182, 'spell_dk_blade_barrier'), +(-49188, 'spell_dk_rime'), +(-49217, 'spell_dk_wandering_plague'), +(-51474, 'spell_sha_astral_shift_aura'), +(-51459, 'spell_dk_necrosis'), +(-51525, 'spell_sha_static_shock'), +(-51556, 'spell_sha_ancestral_awakening'), +(-51625, 'spell_rog_deadly_brew'), +(-51627, 'spell_rog_turn_the_tables'), +(-51664, 'spell_rog_cut_to_the_chase'), +(-53178, 'spell_pet_guard_dog'), +(-53228, 'spell_hun_rapid_recuperation_trigger'), +(-53290, 'spell_hun_hunting_party'), +(-53380, 'spell_pal_righteous_vengeance'), +(-53501, 'spell_pal_sheath_of_light'), +(-53569, 'spell_pal_infusion_of_light'), +(-53695, 'spell_pal_judgements_of_the_just'), +(-54747, 'spell_mage_burning_determination'), +(-59088, 'spell_warr_improved_spell_reflection'), +(-61680, 'spell_pet_culling_the_herd'), +(-62764, 'spell_pet_silverback'), +(-63156, 'spell_warl_decimation'), +(-63373, 'spell_sha_frozen_power'), +(-64127, 'spell_pri_body_and_soul'), +(-65661, 'spell_dk_threat_of_thassarian'), +(6358, 'spell_warl_seduction'), +(11129, 'spell_mage_combustion'), +(15286, 'spell_pri_vampiric_embrace'), +(16864, 'spell_dru_omen_of_clarity'), +(17619, 'spell_item_alchemists_stone'), +(20185, 'spell_pal_judgement_of_light_heal'), +(20186, 'spell_pal_judgement_of_wisdom_mana'), +(21063, 'spell_twisted_reflection'), +(24658, 'spell_item_unstable_power'), +(24661, 'spell_item_restless_strength'), +(24932, 'spell_dru_leader_of_the_pack'), +(26169, 'spell_pri_aq_3p_bonus'), +(26467, 'spell_item_persistent_shield'), +(28716, 'spell_dru_t3_2p_bonus'), +(28719, 'spell_dru_t3_8p_bonus'), +(28744, 'spell_dru_t3_6p_bonus'), +(28789, 'spell_pal_t3_6p_bonus'), +(28809, 'spell_pri_t3_4p_bonus'), +(28823, 'spell_sha_t3_6p_bonus'), +(28845, 'spell_warr_t3_prot_8p_bonus'), +(28847, 'spell_item_healing_touch_refund'), +(28849, 'spell_item_totem_of_flowing_water'), +(29601, 'spell_item_pendant_of_the_violet_eye'), +(30823, 'spell_sha_shamanistic_rage'), +(31801, 'spell_pal_seal_of_vengeance'), + +(32863, 'spell_warl_seed_of_corruption_generic'), +(36123, 'spell_warl_seed_of_corruption_generic'), +(38252, 'spell_warl_seed_of_corruption_generic'), +(39367, 'spell_warl_seed_of_corruption_generic'), +(44141, 'spell_warl_seed_of_corruption_generic'), +(70388, 'spell_warl_seed_of_corruption_generic'), + +(33493, 'spell_mark_of_malice'), +(33510, 'spell_item_mark_of_conquest'), +(33757, 'spell_sha_windfury_weapon'), +(37288, 'spell_dru_t4_2p_bonus'), +(37295, 'spell_dru_t4_2p_bonus'), +(37594, 'spell_pri_t5_heal_2p_bonus'), +(38196, 'spell_anetheron_vampiric_aura'), +(39372, 'spell_item_frozen_shadoweave'), +(39446, 'spell_item_aura_of_madness'), +(40438, 'spell_pri_item_t6_trinket'), +(40442, 'spell_dru_item_t6_trinket'), +(40463, 'spell_sha_item_t6_trinket'), +(40470, 'spell_pal_item_t6_trinket'), +(40971, 'spell_item_crystal_spire_of_karabor'), +(41404, 'spell_item_dementia'), + +(37381, 'spell_item_pet_healing'), + +(37377, 'spell_warl_t4_2p_bonus_shadow'), +(39437, 'spell_warl_t4_2p_bonus_fire'), + +(44401, 'spell_mage_gen_extra_effects'), +(48108, 'spell_mage_gen_extra_effects'), +(57761, 'spell_mage_gen_extra_effects'), + +(42770, 'spell_uk_second_wind'), +(45057, 'spell_item_commendation_of_kaelthas'), +(45481, 'spell_item_sunwell_exalted_caster_neck'), +(45482, 'spell_item_sunwell_exalted_melee_neck'), +(45483, 'spell_item_sunwell_exalted_tank_neck'), +(45484, 'spell_item_sunwell_exalted_healer_neck'), + +(-18094, 'spell_warl_glyph_of_corruption_nightfall'), +(56218, 'spell_warl_glyph_of_corruption_nightfall'), + +(49005, 'spell_dk_mark_of_blood'), +(49028, 'spell_dk_dancing_rune_weapon'), +(49194, 'spell_dk_unholy_blight'), +(51209, 'spell_dk_hungering_cold'), +(52420, 'spell_item_soul_harvesters_charm'), + +(52910, 'spell_rog_turn_the_tables_proc'), +(52914, 'spell_rog_turn_the_tables_proc'), +(52915, 'spell_rog_turn_the_tables_proc'), + +(53601, 'spell_pal_sacred_shield_dummy'), + +(53646, 'spell_warl_demonic_pact'), +(54909, 'spell_warl_demonic_pact'), + +(53736, 'spell_pal_seal_of_corruption'), +(53817, 'spell_sha_maelstrom_weapon'), +(54748, 'spell_mage_burning_determination'), +(54754, 'spell_dru_glyph_of_rejuvenation'), +(54815, 'spell_dru_glyph_of_shred'), +(54821, 'spell_dru_glyph_of_rake'), +(54832, 'spell_dru_glyph_of_innervate'), +(54845, 'spell_dru_glyph_of_starfire_dummy'), +(54937, 'spell_pal_glyph_of_holy_light_dummy'), +(54939, 'spell_pal_glyph_of_divinity'), +(55198, 'spell_sha_tidal_force_dummy'), +(55440, 'spell_sha_glyph_of_healing_wave'), +(55677, 'spell_pri_glyph_of_dispel_magic'), +(56372, 'spell_mage_glyph_of_ice_block'), +(56374, 'spell_mage_glyph_of_icy_veins'), +(56375, 'spell_mage_glyph_of_polymorph'), +(56800, 'spell_rog_glyph_of_backstab'), +(57870, 'spell_hun_glyph_of_mend_pet'), +(57989, 'spell_pri_shadowfiend_death'), +(58375, 'spell_warr_glyph_of_blocking'), +(58642, 'spell_dk_glyph_of_scourge_strike'), +(58877, 'spell_sha_spirit_hunt'), +(58914, 'spell_hun_kill_command_pet'), +(59906, 'spell_item_swift_hand_justice_dummy'), +(59915, 'spell_item_discerning_eye_beast_dummy'), + +(37447, 'spell_mage_imp_mana_gems'), +(61062, 'spell_mage_imp_mana_gems'), + +(52723, 'spell_gen_vampiric_touch'), +(60501, 'spell_gen_vampiric_touch'), +(61257, 'spell_dk_pvp_4p_bonus'), +(62259, 'spell_dk_glyph_of_death_grip'), +(62600, 'spell_dru_savage_defense'), +(63279, 'spell_sha_glyph_of_earth_shield'), +(63280, 'spell_sha_glyph_of_totem_of_wrath'), +(63320, 'spell_warl_glyph_of_life_tap'), +(64890, 'spell_pal_t8_2p_bonus'), +(64928, 'spell_sha_t8_elemental_4p_bonus'), +(65032, 'spell_xt002_321_boombot_aura'), +(67228, 'spell_sha_t9_elemental_4p_bonus'), +(69755, 'spell_item_purified_shard_of_the_scale'), +(69739, 'spell_item_shiny_shard_of_the_scale'), +(70723, 'spell_dru_t10_balance_4p_bonus'), +(70664, 'spell_dru_t10_restoration_4p_bonus_dummy'), +(70770, 'spell_pri_t10_heal_2p_bonus'), +(70808, 'spell_sha_t10_restoration_4p_bonus'), +(70817, 'spell_sha_t10_elemental_4p_bonus'), +(70844, 'spell_warr_item_t10_prot_4p_bonus'), + +(71406, 'spell_item_tiny_abomination_in_a_jar'), +(71545, 'spell_item_tiny_abomination_in_a_jar_hero'), + +(71563, 'spell_item_deadly_precision_dummy'), +(71564, 'spell_item_deadly_precision'), + +(71880, 'spell_item_heartpierce'), +(71892, 'spell_item_heartpierce_hero'), + +(71519, 'spell_item_deathbringers_will_normal'), +(71562, 'spell_item_deathbringers_will_heroic'), + +(71634, 'spell_item_corpse_tongue_coin'), +(71640, 'spell_item_corpse_tongue_coin_heroic'), + +(71770, 'spell_putricide_ooze_tank_protection'), +(72176, 'spell_deathbringer_blood_beast_blood_link'), + +(75475, 'spell_item_petrified_twilight_scale'), +(75481, 'spell_item_petrified_twilight_scale_heroic'); + +-- Non scripted auras from `spell_proc_event` +DELETE FROM `spell_proc` WHERE `SpellId` IN (-66799, -63730, -61846, -58872, -57878, -57470, -56636, -56342, -55666, -53709, -53671, -53551, -53527, -53486, -53256, -53234, -53221, -53215, -52795, -52127, -51940, -51692, -51672, -51634, -51562, -51523, -51521, -50880, -49223, -49219, -49149, -49027, -49004, -48988, -48516, -48506, -48496, -48483, -47580, -47516, -47509, -47263, -47258, -47245, -47201, -47195, -46945, -46867, -46854, -45234, -44557, -44449, -44442, -41635, -35541, -35100, -34950, -34935, -34753, -34500, -33881, -33191, -33150, -33142, -33076, -32385, -31833, -31569, -31124, -30881, -30701, -30299, -30160, -29593, -29074, -27811, -20925, -20500, -20210, -20177, -20049, -19572, -19184, -18119, -18096, -17793, -17106, -16958, -16952, -16880, -16487, -16257, -16256, -16176, -14892, -14531, -14186, -13754, -13165, -12966, -12319, -12311, -12298, -12289, -12281, -11255, -11213, -11180, -11095, -9799, -9452, -5952, -324, 6346, 7383, 7434, 8178, 9782, 9784, 12169, 12322, 12999, 13000, 13001, 13002, 13163, 15088, 15128, 15277, 15346, 15600, 16164, 16550, 16620, 16624, 17364, 17495, 20128, 20131, 20132, 20164, 20165, 20166, 20375, 20705, 20784, 20911, 21185, 21882, 21890, 22618, 22648, 23547, 23548, 23551, 23552, 23572, 23578, 23581, 23686, 23688, 23689, 23721, 23920, 24353, 24389, 24905, 25050, 25669, 25899, 26107, 26119, 26128, 26135, 26480, 26605, 27419, 27498, 27521, 27656, 27774, 27787, 28305, 28752, 28802, 28812, 28816, 29150, 29385, 29455, 29501, 29624, 29625, 29626, 29632, 29633, 29634, 29635, 29636, 29637, 29977, 30003, 30937, 31394, 31794, 31904, 32587, 32642, 32734, 32748, 32776, 32777, 32837, 32844, 32885, 33089, 33127, 33297, 33299, 33510, 33648, 33719, 33746, 33759, 33953, 34074, 34080, 34138, 34139, 34258, 34262, 34320, 34355, 34584, 34586, 34598, 34749, 34774, 34783, 34827, 35077, 35080, 35083, 35086, 35121, 36032, 36096, 36111, 36541, 37165, 37170, 37173, 37189, 37193, 37195, 37197, 37213, 37214, 37227, 37237, 37247, 37379, 37384, 37443, 37514, 37516, 37519, 37523, 37528, 37536, 37568, 37600, 37601, 37603, 37655, 37657, 38026, 38031, 38290, 38299, 38326, 38327, 38334, 38347, 38350, 38394, 38857, 39027, 39442, 39443, 39530, 39958, 40407, 40444, 40458, 40475, 40478, 40482, 40485, 40899, 41034, 41260, 41262, 41381, 41393, 41434, 41469, 41989, 42083, 42135, 42136, 42368, 42370, 43443, 43726, 43728, 43737, 43739, 43741, 43745, 43748, 43750, 43819, 44543, 44545, 45054, 45354, 45355, 45469, 45481, 45482, 45483, 45484, 46025, 46092, 46098, 46569, 46662, 46832, 46910, 46911, 47981, 48833, 48835, 48837, 49592, 49622, 50240, 50421, 50781, 51123, 51127, 51128, 51129, 51130, 51346, 51349, 51352, 51359, 51414, 51915, 52020, 52423, 52898, 53386, 53397, 54278, 54646, 54695, 54707, 54738, 54808, 54838, 54841, 54925, 55380, 55381, 55640, 55680, 55681, 55689, 55747, 55768, 55776, 56249, 56355, 56364, 56451, 56816, 56817, 56821, 56841, 57345, 57352, 57907, 57989, 58357, 58364, 58372, 58386, 58442, 58444, 58616, 58620, 58626, 58901, 59176, 59327, 59345, 59630, 59725, 60061, 60063, 60066, 60132, 60170, 60172, 60176, 60221, 60301, 60306, 60317, 60436, 60442, 60473, 60482, 60487, 60490, 60493, 60503, 60519, 60524, 60529, 60537, 60564, 60571, 60572, 60573, 60574, 60575, 60710, 60717, 60719, 60722, 60724, 60726, 60770, 60818, 60826, 61188, 61324, 61356, 61618, 61848, 62114, 62115, 62147, 62459, 63086, 63108, 63251, 63310, 63335, 63611, 64343, 64411, 64415, 64440, 64571, 64714, 64738, 64742, 64752, 64786, 64792, 64824, 64860, 64867, 64882, 64908, 64912, 64914, 64938, 64952, 64955, 64964, 64976, 64999, 65002, 65005, 65007, 65013, 65020, 65025, 66808, 67115, 67151, 67209, 67353, 67356, 67361, 67363, 67365, 67379, 67381, 67384, 67386, 67389, 67392, 67653, 67667, 67670, 67672, 67698, 67702, 67712, 67752, 67758, 67771, 68051, 68160, 70188, 70652, 70727, 70730, 70748, 70756, 70761, 70803, 70807, 70811, 70830, 70841, 70854, 71174, 71176, 71178, 71186, 71191, 71194, 71198, 71214, 71217, 71226, 71228, 71402, 71404, 71540, 71585, 71602, 71606, 71611, 71637, 71642, 71645, 71903, 72413, 72417, 72419, 74396, 75455, 75457, 75465, 75474); +INSERT INTO `spell_proc` (`SpellId`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `ProcsPerMinute`, `Chance`, `Cooldown`, `Charges`) VALUES +(-66799, 0, 15, 0x00400000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Desolation +(-63730, 0, 6, 0x00000800, 0x00000004, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Serendipity +(-61846, 0, 0, 0x00000000, 0x00000000, 0x00000000, 64, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Aspect of the Dragonhawk +(-58872, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 8259, 0x0, 0, 0, 0, 0), -- Damage Shield +(-57878, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 16, 0x0, 0, 0, 0, 0), -- Natural Reaction +(-57470, 0, 6, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 15000, 0), -- Renewed Hope +(-56636, 0, 4, 0x00000020, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 6000, 0), -- Taste for Blood +(-56342, 0, 9, 0x00000018, 0x08000000, 0x00024000, 0, 0x0, 0x0, 0, 0x2, 0, 0, 0, 0), -- Lock and Load +(-55666, 0, 15, 0x00000001, 0x08000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Desecration +(-53709, 2, 10, 0x00004000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Shield of the Templar +(-53671, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Judgements of the Pure +(-53551, 0, 10, 0x00001000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Sacred Cleansing +(-53527, 1, 10, 0x00000000, 0x00000000, 0x00000004, 1024, 0x0, 0x2, 1, 0x0, 0, 100, 0, 0), -- Divine Guardian +(-53486, 0, 10, 0x00800000, 0x00028000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- The Art of War +(-53256, 0, 9, 0x00000800, 0x00800001, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Cobra Strikes +(-53234, 0, 9, 0x00020000, 0x00000001, 0x00000001, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Piercing Shots +(-53221, 0, 9, 0x00000000, 0x00000001, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Steady Shot +(-53215, 0, 9, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Wild Quiver +(-52795, 0, 6, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Borrowed Time +(-52127, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Water Shield +(-51940, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 20, 0, 0), -- Earthliving Weapon (Passive) +(-51692, 0, 8, 0x00000204, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Waylay +(-51672, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 16, 0x0, 0, 0, 1000, 0), -- Unfair Advantage +(-51634, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Focused Attacks +(-51562, 0, 11, 0x00000100, 0x00000000, 0x00000010, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Tidal Waves +(-51523, 0, 11, 0x00000000, 0x00000001, 0x00000000, 65536, 0x0, 0x2, 0, 0x0, 0, 50, 0, 0), -- Earthen Power +(-51521, 0, 11, 0x00000000, 0x01000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Stormstrike +(-50880, 0, 15, 0x00000000, 0x04000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Icy Talons +(-49223, 0, 15, 0x00000011, 0x08020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Dirge +(-49219, 0, 0, 0x00000000, 0x00000000, 0x00000000, 4, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Blood-Caked Blade +(-49149, 0, 15, 0x00000006, 0x00020002, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Chill of the Grave +(-49027, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 20000, 0), -- Bloodworms +(-49004, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 51, 0x0, 0, 0, 0, 0), -- Scent of Blood +(-48988, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Bloody Vengeance +(-48516, 0, 7, 0x00000005, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Eclipse +(-48506, 0, 7, 0x00000005, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Earth and Moon +(-48496, 0, 7, 0x00000060, 0x02000002, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Living Seed +(-48483, 0, 7, 0x00008800, 0x00000440, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Infected Wounds +(-47580, 0, 6, 0x00000000, 0x00000000, 0x00000040, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Pain and Suffering +(-47516, 0, 6, 0x00001800, 0x00010000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Grace +(-47509, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Divine Aegis +(-47263, 32, 5, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 20000, 0), -- Torture +(-47258, 0, 5, 0x00000000, 0x00800000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Backdraft +(-47245, 0, 5, 0x00000002, 0x00000000, 0x00000000, 262144, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Molten Core +(-47201, 0, 5, 0x00004009, 0x00040000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Everlasting Affliction +(-47195, 0, 5, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Eradication +(-46945, 0, 4, 0x00000000, 0x00010000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Safeguard +(-46867, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Wrecking Crew +(-46854, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Trauma +(-45234, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Focused Will +(-44557, 0, 3, 0x00000020, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Enduring Winter +(-44449, 0, 3, 0x20E21277, 0x00019048, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Burnout +(-44442, 0, 3, 0x00800000, 0x00000040, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 1000, 0), -- Firestarter +(-41635, 0, 0, 0x00000000, 0x00000000, 0x00000000, 664232, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Prayer of Mending +(-35541, 0, 0, 0x00000000, 0x00000000, 0x00000000, 8388608, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Combat Potency +(-35100, 0, 9, 0x00001000, 0x00000000, 0x00000001, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Concussive Barrage +(-34950, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Go for the Throat +(-34935, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 8000, 0), -- Backlash +(-34753, 0, 6, 0x00001800, 0x00000004, 0x00001000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Holy Concentration +(-34500, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Expose Weakness +(-33881, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Natural Perfection +(-33191, 0, 6, 0x00008000, 0x00000400, 0x00000040, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Misery +(-33150, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Surge of Light +(-33142, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Blessed Resilience +(-33076, 0, 0, 0x00000000, 0x00000000, 0x00000000, 664232, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Prayer of Mending +(-32385, 0, 5, 0x00000001, 0x00040000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Shadow Embrace +(-31833, 0, 10, 0x80000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Light's Grace +(-31569, 0, 3, 0x00010000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Blink +(-31124, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Blade Twisting +(-30881, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 30000, 0), -- Nature's Guardian +(-30701, 28, 0, 0x00000000, 0x00000000, 0x00000000, 664232, 0x0, 0x0, 0, 0x0, 0, 100, 0, 0), -- Elemental Absorption +(-30299,126, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Nether Protection +(-30160, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Elemental Devastation +(-29593, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 112, 0x0, 0, 0, 0, 0), -- Improved Defensive Stance +(-29074, 20, 3, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Master of Elements +(-27811, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 2, 0x0, 0, 0, 0, 0), -- Blessed Recovery +(-20925, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Holy Shield +(-20500, 0, 4, 0x10000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Berserker Rage +(-20210, 0, 10, 0xC0000000, 0x00010000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Illumination +(-20177, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Reckoning +(-20049, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Vengeance +(-19572, 0, 9, 0x00800000, 0x00000000, 0x00000000, 262144, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Improved Mend Pet +(-19184, 0, 9, 0x00000010, 0x00002000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Entrapment +(-18119, 0, 5, 0x00000000, 0x00800000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Aftermath +(-18096, 0, 5, 0x00000100, 0x00800000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Pyroclasm +(-17793, 0, 5, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Shadow Bolt +(-17106, 0, 7, 0x00080000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Intensity +(-16958, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Primal Fury +(-16952, 0, 7, 0x00039000, 0x00000400, 0x00040000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Blood Frenzy +(-16880, 72, 7, 0x00000067, 0x03800002, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Nature's Grace +(-16487, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 2, 0x0, 0, 0, 0, 0), -- Blood Craze +(-16257, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Flurry +(-16256, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Flurry +(-16176, 0, 11, 0x000001C0, 0x00000000, 0x00000010, 0, 0x2, 0x2, 2, 0x0, 0, 0, 0, 0), -- Ancestral Healing +(-14892, 0, 6, 0x10001E00, 0x00010004, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Inspiration +(-14531, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 2, 0x0, 0, 0, 0, 0), -- Martyrdom +(-14186, 0, 8, 0x40800508, 0x00000006, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Seal Fate +(-13754, 0, 8, 0x00000010, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Kick +(-13165, 0, 0, 0x00000000, 0x00000000, 0x00000000, 64, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Aspect of the Hawk +(-12966, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Flurry +(-12319, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Flurry +(-12311, 0, 4, 0x00000800, 0x00000001, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Gag Order +(-12298, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 112, 0x0, 0, 0, 0, 0), -- Shield Specialization +(-12289, 0, 4, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Hamstring +(-12281, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 6000, 0), -- Sword Specialization +(-11255, 0, 3, 0x00004000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Counterspell +(-11213, 0, 3, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Arcane Concentration +(-11180, 16, 3, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Winter's Chill +(-11095, 0, 3, 0x00000010, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Scorch +(-9799, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 2, 0x0, 0, 0, 0, 0), -- Eye for an Eye +(-9452, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 3, 0, 0, 0), -- Vindication +(-5952, 0, 8, 0x00000000, 0x00000001, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Throwing Specialization +(-324, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Lightning Shield +(6346, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 256, 0x0, 0, 0, 0, 0), -- Fear Ward +(7383, 1, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 256, 0x0, 0, 0, 0, 0), -- Water Bubble +(7434, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Fate Rune of Unsurpassed Vigor +(8178, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Grounding Totem Effect +(9782, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Mithril Shield Spike +(9784, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Iron Shield Spike +(12169, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Shield Block +(12322, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 3, 0, 0, 0), -- Unbridled Wrath +(12999, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 6, 0, 0, 0), -- Unbridled Wrath +(13000, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 9, 0, 0, 0), -- Unbridled Wrath +(13001, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 12, 0, 0, 0), -- Unbridled Wrath +(13002, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 15, 0, 0, 0), -- Unbridled Wrath +(13163, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 16, 0x0, 0, 0, 0, 0), -- Aspect of the Monkey +(15088, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Flurry +(15128, 4, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Mark of Flames +(15277, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Seal of Reckoning +(15346, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 0, 0), -- Seal of Reckoning +(15600, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 1, 0, 0, 0), -- Hand of Justice +(16164, 28, 0, 0x00000000, 0x00000000, 0x00000000, 65536, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Elemental Focus +(16550, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Bonespike +(16620, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 30000, 0), -- Proc Self Invulnerability +(16624, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Thorium Shield Spike +(17364, 8, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Stormstrike +(17495, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Crest of Retribution +(20128, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Redoubt +(20131, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Redoubt +(20132, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Redoubt +(20164, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 5, 0, 0, 0), -- Seal of Justice +(20165, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 20, 0, 0, 0), -- Seal of Light +(20166, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 12, 0, 0, 0), -- Seal of Wisdom +(20375, 1, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 1000, 0), -- Seal of Command +(20705, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Power Shield 500 +(20784, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Tamed Pet Passive 07 (DND) +(20911, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 112, 0x0, 0, 0, 0, 0), -- Blessing of Sanctuary +(21185, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Spinal Reaper +(21882, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Judgement Smite +(21890, 0, 4, 0x2A764EEF, 0x0000036C, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Warrior's Wrath +(22618, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Force Reactive Disk +(22648, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Call of Eskhandar +(23547, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 32, 0x0, 0, 0, 0, 0), -- Parry +(23548, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Parry +(23551, 0, 11, 0x000000C0, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Lightning Shield +(23552, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Lightning Shield +(23572, 0, 11, 0x000000C0, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Mana Surge +(23578, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 2, 0, 0, 0), -- Expose Weakness +(23581, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 2, 0, 0, 0), -- Bloodfang +(23686, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 2, 0, 0, 0), -- Lightning Strike +(23688, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Aura of the Blue Dragon +(23689, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 4, 0, 0, 0), -- Heroism +(23721, 0, 9, 0x00000800, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Arcane Infused +(23920, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Spell Reflection +(24353, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Primal Instinct +(24389, 4, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Chaos Fire +(24905, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 15, 0, 0, 0), -- Moonkin Form (Passive) +(25050, 4, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Mark of Flames +(25669, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 1, 0, 0, 0), -- Decapitate +(25899, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 112, 0x0, 0, 0, 0, 0), -- Greater Blessing of Sanctuary +(26107, 0, 7, 0x00800000, 0x10000080, 0x00000000, 0, 0x0, 0x2, 116, 0x0, 0, 0, 0, 0), -- Symbols of Unending Life Finisher Bonus +(26119, 0, 10, 0x90100003, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Stormcaller Spelldamage Bonus +(26128, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 8, 0x0, 0, 0, 0, 0), -- Enigma Resist Bonus +(26135, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x2, 0, 0, 0, 0), -- Battlegear of Eternal Justice +(26480, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Badge of the Swarmguard +(26605, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x2, 0, 0, 0, 0), -- Bloodcrown +(27419, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 3, 0, 0, 0), -- Warrior's Resolve +(27498, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 3, 0, 0, 0), -- Crusader's Wrath +(27521, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 15000, 0), -- Mana Restore +(27656, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Flame Lash +(27774, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- The Furious Storm +(27787, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 3, 0, 0, 0), -- Rogue Armor Energize +(28305, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Mana Leech +(28752, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Adrenaline Rush +(28802, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Epiphany +(28812, 0, 8, 0x02000006, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Head Rush +(28816, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 3, 0, 0, 0), -- Invigorate +(29150, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Electric Discharge +(29385, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 7, 0, 1000, 0), -- Seal of Command +(29455, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Felsteel Shield Spike +(29501, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Frost Arrow +(29624, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Searing Arrow +(29625, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Flaming Cannonball +(29626, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Shadow Bolt +(29632, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Shadow Shot +(29633, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Fire Blast +(29634, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Quill Shot +(29635, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Flaming Shell +(29636, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Venom Shot +(29637, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Keeper's Sting +(29977, 4, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Combustion +(30003, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Sheen of Zanza +(30937, 32, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Mark of Shadow +(31394, 32, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Mark of Shadow +(31794, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Focused Mind +(31904, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Holy Shield +(32587, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Shield Block +(32642, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Spore Cloud +(32734, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Earth Shield +(32748, 0, 8, 0x00000000, 0x00000001, 0x00000000, 320, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Deadly Throw Interrupt +(32776, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Redoubt +(32777, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Holy Shield +(32837, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Spell Focus Trigger +(32844, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 2, 0, 0, 0), -- Lesser Heroism +(32885, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 2, 0x0, 0, 0, 0, 0), -- Infuriate +(33089, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Vigilance of the Colossus +(33127, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 7, 0, 1000, 0), -- Seal of Command +(33297, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Spell Haste Trinket +(33299, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Coilfang Slave Pens Lvl 70 Boss3a Caster Trinket +(33510, 0, 0, 0x00000000, 0x00000000, 0x00000000, 340, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Health Restore +(33648, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Reflection of Torment +(33719, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Perfect Spell Reflection +(33746, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Essence Infused Mushroom +(33759, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Power Infused Mushroom +(33953, 0, 0, 0x00000000, 0x00000000, 0x00000000, 17408, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Essence of Life +(34074, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Aspect of the Viper +(34080, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 32, 0x0, 0, 0, 0, 0), -- Riposte Stance +(34138, 0, 11, 0x00000080, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Totem of the Third Wind +(34139, 0, 10, 0x40000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Libram of Justice +(34258, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x2, 0, 0, 0, 0), -- Justice +(34262, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x2, 0, 0, 0, 0), -- Mercy +(34320, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Call of the Nexus +(34355, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Poison Shield +(34584, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 30000, 0), -- Love Struck +(34586, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0,1.5, 0, 0, 0), -- Romulo's Poison +(34598, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Karazhan Caster Robe +(34749, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 8, 0x2, 0, 0, 0, 0), -- Recurring Power +(34774, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0,1.5, 0, 20000, 0), -- Magtheridon Melee Trinket +(34783, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Spell Reflection +(34827, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Water Shield +(35077, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 55000, 0), -- Band of the Eternal Defender +(35080, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 1, 0, 55000, 0), -- Band of the Eternal Champion +(35083, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 55000, 0), -- Band of the Eternal Sage +(35086, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 55000, 0), -- Band of the Eternal Restorer +(35121, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Nether Power +(36032, 0, 3, 0x00001000, 0x00008000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Arcane Blast +(36096, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Spell Reflection +(36111, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- World Breaker +(36541, 4, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x2, 0, 0, 0, 0), -- Curse of Burning Shadows +(37165, 0, 8, 0x00200400, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Haste +(37170, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 1, 0, 0, 0), -- Free Finisher Chance +(37173, 0, 8, 0x2CBC0598, 0x00000106, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 25000, 0), -- Armor Penetration +(37189, 0, 10, 0xC0000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 60000, 0), -- Recuced Holy Light Cast Time +(37193, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Infused Shield +(37195, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x2, 0, 0, 0, 0), -- Judgement Group Heal +(37197, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Spell Damage +(37213, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Mana Cost Reduction +(37214, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Energized +(37227, 0, 11, 0x000001C0, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 60000, 0), -- Improved Healing Wave +(37237, 0, 11, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Lightning Bolt Discount +(37247, 8, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Regain Mana +(37379, 32, 5, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Flameshadow +(37384, 0, 5, 0x00000001, 0x00000040, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Corruption and Immolate +(37443, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Crit Bonus Damage +(37514, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 32, 0x0, 0, 0, 0, 0), -- Blade Turning +(37516, 0, 4, 0x00000400, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Revenge Bonus +(37519, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 48, 0x0, 0, 0, 0, 0), -- Rage Bonus +(37523, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Reinforced Shield +(37528, 0, 4, 0x00000004, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Overpower Bonus +(37536, 0, 4, 0x00010000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Improved Battle Shout +(37568, 0, 6, 0x00000800, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Greater Heal Discount +(37600, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Offensive Discount +(37601, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Relentlessness +(37603, 0, 6, 0x00008000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Shadow Word Pain Damage +(37655, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 60000, 0), -- Bonus Mana Regen +(37657, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 2500, 0), -- Lightning Capacitor +(38026, 1, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 256, 0x0, 0, 0, 0, 0), -- Viscous Shield +(38031, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Shield Block +(38290, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0,1.6, 0, 0, 0), -- Santos' Blessing +(38299, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 12000, 0), -- HoTs on Heals +(38326, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Crit Threat Reduction Melee +(38327, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 2, 0x0, 0, 0, 0, 0), -- Crit Threat Reduction Spell +(38334, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 60000, 0), -- Proc Mana Regen +(38347, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Crit Proc Spell Damage +(38350, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Crit Proc Heal +(38394, 0, 5, 0x00000006, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Dot Heals +(38857, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Spell Ground +(39027, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Poison Shield +(39442, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 1, 0x0, 0, 0, 0, 0), -- Aura of Wrath +(39443, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Aura of Wrath +(39530, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Focus +(39958, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0,0.7, 0, 40000, 0), -- Skyfire Swiftness +(40407, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Illidan Tank Shield +(40444, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Black Temple Tank Trinket +(40458, 0, 4, 0x02000000, 0x00000601, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Warrior Tier 6 Trinket +(40475, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 3, 0, 0, 0), -- Black Temple Melee Trinket +(40478, 0, 5, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Warlock Tier 6 Trinket +(40482, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Mage Tier 6 Trinket +(40485, 0, 9, 0x00000000, 0x00000001, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Hunter Tier 6 Trinket +(40899, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 1, 0, 0, 0), -- Felfire Proc +(41034, 126, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 1024, 0x0, 0, 0, 0, 0), -- Spell Absorption +(41260, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Aviana's Purpose +(41262, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Aviana's Will +(41381, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 256, 0x0, 0, 0, 0, 0), -- Shell of Life +(41393, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 32, 0x0, 0, 0, 0, 0), -- Riposte +(41434, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 2, 0, 45000, 0), -- The Twin Blades of Azzinoth +(41469, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 7, 0, 1000, 0), -- Seal of Command +(41989, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0,0.5, 0, 0, 0), -- Fists of Fury +(42083, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Fury of the Crashing Waves +(42135, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 90000, 0), -- Lesser Rune of Warding +(42136, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 90000, 0), -- Greater Rune of Warding +(42368, 0, 10, 0x40000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Merciless Libram of Justice +(42370, 0, 11, 0x00000080, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Merciless Totem of the Third WInd +(43443, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Spell Reflection +(43726, 0, 10, 0x40000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Vengeful Libram of Justice +(43728, 0, 11, 0x00000080, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Vengeful Totem of Third WInd +(43737, 0, 7, 0x00000000, 0x00000440, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 10000, 0), -- Primal Instinct +(43739, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Lunar Grace +(43741, 0, 10, 0x80000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Light's Grace +(43745, 0, 10, 0x00000000, 0x00000200, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Crusader's Command +(43748, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Elemental Strength +(43750, 0, 11, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Energized +(43819, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Lucidity +(44543, 0, 3, 0x00100220, 0x00001000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 7, 0, 0), -- Fingers of Frost +(44545, 0, 3, 0x00100220, 0x00001000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 15, 0, 0), -- Fingers of Frost +(45054, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 15000, 0), -- Augment Pain +(45354, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Sunwell Dungeon Melee Trinket +(45355, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - T7 Melee Trinket Base +(45469, 0, 15, 0x00000010, 0x00000000, 0x00000000, 16, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Death Strike +(45481, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Sunwell Exalted Caster Neck +(45482, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Sunwell Exalted Melee Neck +(45483, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Sunwell Exalted Tank Neck +(45484, 0, 0, 0x00000000, 0x00000000, 0x00000000, 16384, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Sunwell Exalted Healer Neck +(46025, 32, 6, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Blackout +(46092, 0, 10, 0x40000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Brutal Libram of Justice +(46098, 0, 11, 0x00000080, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Brutal Totem of Third WInd +(46569, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Sunwell Exalted Caster Neck +(46662, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 20000, 0), -- Deathfrost +(46832, 0, 7, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Moonkin Starfire Bonus +(46910, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0,5.5, 0, 0, 0), -- Furious Attacks +(46911, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0,7.5, 0, 0, 0), -- Furious Attacks +(47981, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Spell Reflection +(48833, 0, 7, 0x00000000, 0x00000440, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Primal Instinct +(48835, 0, 10, 0x00800000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x2, 0, 0, 0, 0), -- Justice +(48837, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Elemental Tenacity +(49592, 0, 0, 0x00000000, 0x00000000, 0x00000000, 8528552, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Temporal Rift +(49622, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 60000, 0), -- Bonus Mana Regen +(50240, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 16, 0x0, 0, 0, 0, 0), -- Evasive Maneuvers +(50421, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Scent of Blood +(50781, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 6000, 0), -- Fate Rune of Primal Energy +(51123, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 1, 0, 0, 0), -- Killing Machine +(51127, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 2, 0, 0, 0), -- Killing Machine +(51128, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 4, 0, 0, 0), -- Killing Machine +(51129, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 6, 0, 0, 0), -- Killing Machine +(51130, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 8, 0, 0, 0), -- Killing Machine +(51346, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Venture Company Beatdown! +(51349, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Venture Company Beatdown +(51352, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Venture Company Beatdown! +(51359, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x1, 0, 0, 10000, 0), -- Venture Company Beatdown +(51414, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 45000, 0), -- Venomous Breath Aura +(51915, 0, 0, 0x00000000, 0x00000000, 0x00000000,16777216, 0x0, 0x0, 0, 0x0, 0, 100, 600000, 0), -- Undying Resolve +(52020, 0, 7, 0x00008000, 0x00100000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Snap and Snarl +(52423, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 32, 0x0, 0, 0, 0, 0), -- Retaliation +(52898, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2, 0x0, 0, 0, 0, 0), -- Spell Damping +(53386, 0, 15, 0x82127F27, 0x000001BF, 0x00000000, 0, 0x1, 0x2, 0, 0x2, 0, 0, 0, 0), -- Cinderglacier +(53397, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Invigoration +(54278, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Empowered Imp +(54646, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Focus Magic +(54695, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Death Knight's Anguish Base +(54707, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 60000, 0), -- Sonic Awareness (DND) +(54738, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Star of Light +(54808, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 60000, 0), -- Sonic Shield +(54838, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Purified Spirit +(54841, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 2500, 0), -- Thunder Capacitor +(54925, 2, 10, 0x00000000, 0x00000200, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Seal of Command +(55380, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0,0.7, 0, 40000, 0), -- Skyflare Swiftness +(55381, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 15000, 0), -- Mana Restore +(55640, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Lightweave Embroidery +(55680, 0, 6, 0x00000200, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Prayer of Healing +(55681, 0, 6, 0x00008000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Shadow Word: Pain +(55689, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Glyph of Shadow +(55747, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Argent Fury +(55768, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Darkglow Embroidery +(55776, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Swordguard Embroidery +(56249, 0, 5, 0x00000000, 0x00000000, 0x00000400, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Felhunter +(56355, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 64, 0x0, 0, 0, 0, 0), -- Titanium Shield Spike +(56364, 0, 3, 0x00000000, 0x01000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Remove Curse +(56451, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 3000, 0), -- Earth Shield +(56816, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 48, 0x0, 0, 0, 0, 0), -- Rune Strike +(56817, 0, 15, 0x00000000, 0x20000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Rune strike proc (SERVERSIDE) +(56821, 0, 8, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Glyph of Sinister Strike +(56841, 0, 9, 0x00000800, 0x00000000, 0x00000000, 256, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Arcane Shot +(57345, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Darkmoon Card: Greatness +(57352, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Darkmoon Card: Death +(57907, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Increased Spirit +(57989, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Shadowfiend Death +(58357, 0, 4, 0x00000040, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Glyph of Heroic Strike +(58364, 0, 4, 0x00000400, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Revenge +(58372, 0, 4, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Hamstring +(58386, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 32, 0x0, 0, 0, 0, 0), -- Glyph of Overpower +(58442, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 15000, 0), -- Airy Pale Ale +(58444, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 5000, 0), -- Worg Tooth Oatmeal Stout +(58616, 0, 15, 0x01000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Heart Strike +(58620, 0, 15, 0x00000004, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Chains of Ice +(58626, 0, 15, 0x02000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Death Grip +(58901, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Tears of Anguish +(59176, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 2, 0x0, 0, 0, 0, 0), -- Spell Damping +(59327, 0, 15, 0x08000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Rune Tap +(59345, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Chagrin +(59630, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 35000, 0), -- Black Magic +(59725, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 2048, 0x0, 0, 0, 0, 0), -- Spell Reflection +(60061, 0, 0, 0x00000000, 0x00000000, 0x00000000, 294912, 0x2, 0x0, 0, 0x0, 0, 0, 45000, 0), -- Flow of Time +(60063, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Now is the Time! +(60066, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Rage of the Unraveller +(60132, 0, 15, 0x00000010, 0x08020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Oblit/Scourge Strike Runic Power Up +(60170, 0, 5, 0x00000006, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Corruption Triggers Crit +(60172, 0, 5, 0x00040000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Life Tap Bonus Spirit +(60176, 0, 4, 0x00000020, 0x00000010, 0x00000000, 262144, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Bleed Cost Reduction +(60221, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 45000, 0), -- Essence of Gossamer +(60301, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Meteorite Whetstone +(60306, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Vestige of Haldor +(60317, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Signet of Edward the Odd +(60436, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Grim Toll +(60442, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Bandit's Insignia +(60473, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Forge Ember +(60482, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Pendulum of Telluric Currents +(60487, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 15000, 0), -- Extract of Necromatic Power +(60490, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Embrace of the Spider +(60493, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Dying Curse +(60503, 1, 4, 0x00000004, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Taste for Blood +(60519, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x3, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Spark of Life +(60524, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Majestic Dragon Figurine +(60529, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Forethought Talisman +(60537, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Soul of the Dead +(60564, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Savage Gladiator's Totem of Survival +(60571, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Hateful Gladiator's Totem of Survival +(60572, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Deadly Gladiator's Totem of Survival +(60573, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- LK Arena 4 Gladiator's Totem of Survival +(60574, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- LK Arena 5 Gladiator's Totem of Survival +(60575, 0, 11, 0x90100000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- LK Arena 6 Gladiator's Totem of Survival +(60710, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Savage Gladiator's Idol of Steadfastness +(60717, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Hateful Gladiator's Idol of Steadfastness +(60719, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Deadly Gladiator's Idol of Steadfastness +(60722, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- LK Arena 4 Gladiator's Idol of Steadfastness +(60724, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- LK Arena 5 Gladiator's Idol of Steadfastness +(60726, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- LK Arena 6 Gladiator's Idol of Steadfastness +(60770, 0, 11, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Totem of the Elemental Plane +(60818, 0, 10, 0x00000000, 0x00000200, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Libram of Reciprocation +(60826, 0, 15, 0x01400000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Sigil of Haunted Dreams +(61188, 0, 5, 0x00000004, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Chaotic Mind +(61324, 0, 10, 0x00000000, 0x00020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Justice +(61356, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 90000, 0), -- Invigorating Earthsiege Diamond Passive +(61618, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Tentacles +(61848, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 16, 0x0, 0, 0, 0, 0), -- Aspect of the Dragonhawk +(62114, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Flow of Knowledge +(62115, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Strength of the Titans +(62147, 0, 15, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Icy Touch Defense Increase +(62459, 0, 15, 0x00000004, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Chains of Ice Frost Rune Refresh +(63086, 0, 9, 0x00000000, 0x00000000, 0x00010000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Raptor Strike +(63108, 0, 5, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Siphon Life +(63251, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Glory of the Jouster +(63310, 0, 5, 0x00000000, 0x00010000, 0x00000000, 65536, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Shadowflame +(63335, 0, 15, 0x00000000, 0x00000002, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Glyph of Howling Blast +(63611, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x1, 0, 0, 0, 0), -- Improved Blood Presence +(64343, 0, 3, 0x00000002, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Impact +(64411, 0, 0, 0x00000000, 0x00000000, 0x00000000, 279552, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Blessing of Ancient Kings +(64415, 0, 0, 0x00000000, 0x00000000, 0x00000000, 279552, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Val'anyr Hammer of Ancient Kings - Equip Effect +(64440, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 32, 0x0, 0, 0, 20000, 0), -- Blade Warding +(64571, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 10000, 0), -- Blood Draining +(64714, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Flame of the Heavens +(64738, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Show of Faith +(64742, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Pandora's Plea +(64752, 0, 7, 0x00001000, 0x00000100, 0x00200000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T8 Feral 2P Bonus +(64786, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Comet's Trail +(64792, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Blood of the Old God +(64824, 0, 7, 0x00200000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T8 Balance 4P Bonus +(64860, 0, 9, 0x00000000, 0x00000001, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Hunter T8 4P Bonus +(64867, 0, 3, 0x20000021, 0x00001000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Mage T8 2P Bonus +(64882, 0, 10, 0x00000000, 0x00100000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T8 Protection 4P Bonus +(64908, 0, 6, 0x00002000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Priest T8 Shadow 4P Bonus +(64912, 0, 6, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Priest T8 Healer 4P Bonus +(64914, 0, 8, 0x00010000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Rogue T8 2P Bonus +(64938, 0, 4, 0x00200040, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 0, 0), -- Item - Warrior T8 Melee 2P Bonus +(64952, 0, 7, 0x00000000, 0x00000440, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T8 Feral Relic +(64955, 0, 10, 0x00000000, 0x00000040, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T8 Protection Relic +(64964, 0, 15, 0x00000000, 0x20000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Death Knight T8 Tank Relic +(64976, 0, 4, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Juggernaut +(64999, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x4, 0, 0, 0, 0), -- Meteoric Inspiration +(65002, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Bonus Mana Regen +(65005, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Alacrity of the Elements +(65007, 0, 0, 0x00000000, 0x00000000, 0x00000000, 81920, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Eye of the Broodmother +(65013, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Pyrite Infusion +(65020, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Mjolnir Runestone +(65025, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Dark Matter +(66808, 0, 0, 0x00000000, 0x00000000, 0x00000000, 4, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Meteor Fists +(67115, 0, 15, 0x01400000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Death Knight T9 Melee 2P Bonus +(67151, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Hunter T9 4P Bonus (Steady Shot) +(67209, 1, 8, 0x00100000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Rogue T9 2P Bonus (Rupture) +(67353, 0, 7, 0x00008000, 0x00100500, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred) +(67356, 8, 7, 0x00000010, 0x00000000, 0x00000000, 0, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T9 Restoration Relic (Rejuvenation) +(67361, 0, 7, 0x00000002, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T9 Balance Relic (Moonfire) +(67363, 0, 10, 0x80000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 10000, 0), -- Item - Paladin T9 Holy Relic (Judgement) +(67365, 0, 10, 0x00000000, 0x00000800, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 6000, 0), -- Item - Paladin T9 Retribution Relic (Seal of Vengeance) +(67379, 0, 10, 0x00000000, 0x00040000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T9 Protection Relic (Hammer of The Righteous) +(67381, 0, 15, 0x00000000, 0x20000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 10000, 0), -- Item - Death Knight T9 Tank Relic (Rune Strike) +(67384, 0, 15, 0x00000010, 0x08020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 80, 10000, 0), -- Item - Death Knight T9 Melee Relic (Rune Strike) +(67386, 0, 11, 0x00000001, 0x00000000, 0x00000000, 65536, 0x0, 0x1, 0, 0x0, 0, 0, 6000, 0), -- Item - Shaman T9 Elemental Relic (Lightning Bolt) +(67389, 0, 11, 0x00000100, 0x00000000, 0x00000000, 16384, 0x0, 0x1, 0, 0x0, 0, 0, 8000, 0), -- Item - Shaman T9 Restoration Relic (Chain Heal) +(67392, 0, 11, 0x00000000, 0x00000000, 0x00000004, 16, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T9 Enhancement Relic (Lava Lash) +(67653, 0, 0, 0x00000000, 0x00000000, 0x00000000, 4194344, 0x1, 0x0, 0, 0x0, 0, 0, 45000, 0), -- Coliseum 5 Tank Trinket +(67667, 0, 0, 0x00000000, 0x00000000, 0x00000000, 16384, 0x2, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Coliseum 5 Healer Trinket +(67670, 0, 0, 0x00000000, 0x00000000, 0x00000000, 65536, 0x1, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Coliseum 5 CasterTrinket +(67672, 0, 0, 0x00000000, 0x00000000, 0x00000000, 8388948, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Coliseum 5 Melee Trinket +(67698, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Item - Coliseum 25 Normal Healer Trinket +(67702, 1, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Coliseum 25 Normal Melee Trinket +(67712, 0, 0, 0x00000000, 0x00000000, 0x00000000, 69632, 0x0, 0x2, 2, 0x0, 0, 0, 2000, 0), -- Item - Coliseum 25 Normal Caster Trinket +(67752, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Item - Coliseum 25 Heroic Healer Trinket +(67758, 0, 0, 0x00000000, 0x00000000, 0x00000000, 69632, 0x0, 0x2, 2, 0x0, 0, 0, 2000, 0), -- Item - Coliseum 25 Heroic Caster Trinket +(67771, 1, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Coliseum 25 Heroic Melee Trinket +(68051, 1, 4, 0x00000004, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Overpower Ready! +(68160, 0, 0, 0x00000000, 0x00000000, 0x00000000, 4, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Meteor Fists +(70188, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 16, 0x0, 0, 0, 0, 0), -- Cloak of Darkness +(70652, 0, 15, 0x00000008, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Death Knight T10 Tank 4P Bonus +(70727, 0, 9, 0x00000001, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Hunter T10 2P Bonus +(70730, 0, 9, 0x00004000, 0x00001000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Hunter T10 4P Bonus +(70748, 0, 3, 0x00000000, 0x00200000, 0x00000000, 1024, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Mage T10 4P Bonus +(70756, 0, 10, 0x00000000, 0x00010000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T10 Holy 4P Bonus +(70761, 0, 10, 0x00000000, 0x00000000, 0x00000001, 1024, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T10 Protection 4P Bonus +(70803, 0, 8, 0x003E0000, 0x00000008, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Rogue T10 4P Bonus +(70807, 0, 11, 0x00000000, 0x00000000, 0x00000010, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Restoration 2P Bonus +(70811, 0, 11, 0x00000003, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Elemental 2P Bonus +(70830, 0, 11, 0x00000000, 0x00020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Enhancement 2P Bonus +(70841, 0, 5, 0x00000004, 0x00000100, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Warlock T10 4P Bonus +(70854, 0, 4, 0x00000000, 0x00000010, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Warrior T10 Melee 2P Bonus +(71174, 1, 7, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T10 Feral Relic (Rake and Lacerate) +(71176, 0, 7, 0x00200002, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T10 Balance Relic (Moonfire and Insect Swarm) +(71178, 0, 7, 0x00000010, 0x00000000, 0x00000000, 0, 0x2, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Druid T10 Restoration Relic (Rejuvenation) +(71186, 0, 10, 0x00000000, 0x00008000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T10 Retribution Relic (Crusader Strike) +(71191, 0, 10, 0x00000000, 0x00010000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T10 Holy Relic (Holy Shock) +(71194, 0, 10, 0x00000000, 0x00100000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Paladin T10 Protection Relic (Shield of Righteousness) +(71198, 4, 11, 0x10000000, 0x00000000, 0x00000000, 0, 0x0, 0x0, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Elemental Relic (Shocks) +(71214, 0, 11, 0x00000000, 0x00000010, 0x00000000, 16, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Enhancement Relic (Stormstrike) +(71217, 0, 11, 0x00000000, 0x00000000, 0x00000010, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Shaman T10 Restoration Relic (Riptide) +(71226, 0, 15, 0x00000010, 0x08020000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Death Knight T10 DPS Relic (Obliterate, Scourge Strike, Death Strike) +(71228, 0, 15, 0x00000000, 0x20000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 0, 0), -- Item - Death Knight T10 Tank Relic (Runestrike) +(71402, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 10 Normal Melee Trinket +(71404, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 2, 0x0, 0, 0, 45000, 0), -- Item - Icecrown Dungeon Melee Trinket +(71540, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 10 Heroic Melee Trinket +(71585, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 25 Emblem Healer Trinket +(71602, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 25 Normal Caster Trinket 1 Base +(71606, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 100000, 0), -- Item - Icecrown 25 Normal Caster Trinket 2 +(71611, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 25 Normal Healer Trinket 2 +(71637, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x0, 0, 0x0, 0, 0, 100000, 0), -- Item - Icecrown 25 Heroic Caster Trinket 2 +(71642, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x2, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 25 Heroic Healer Trinket 2 +(71645, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Item - Icecrown 25 Heroic Caster Trinket 1 Base +(71903, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 12, 0, 0, 0), -- Item - Shadowmourne Legendary +(72413, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 10, 60000, 0), -- Item - Icecrown Reputation Ring Melee +(72417, 0, 0, 0x00000000, 0x00000000, 0x00000000, 327680, 0x0, 0x2, 0, 0x0, 0, 0, 60000, 0), -- Item - Icecrown Reputation Ring Caster Trigger +(72419, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 60000, 0), -- Item - Icecrown Reputation Ring Healer Trigger +(74396, 84, 3, 0x28E212F7, 0x00119048, 0x00000000, 65536, 0x0, 0x1, 0, 0x0, 0, 0, 0, 0), -- Fingers of Frost +(75455, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Chamber of Aspects 25 Melee Trinket +(75457, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x0, 0x2, 0, 0x0, 0, 0, 45000, 0), -- Item - Chamber of Aspects 25 Heroic Melee Trinket +(75465, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x1, 0, 0x0, 0, 0, 45000, 0), -- Item - Chamber of Aspects 25 Nuker Trinket +(75474, 0, 0, 0x00000000, 0x00000000, 0x00000000, 0, 0x1, 0x1, 0, 0x0, 0, 0, 45000, 0); -- Item - Chamber of Aspects 25 Heroic Nuker Trinket + +-- Kill the damned thing already! +DROP TABLE IF EXISTS `spell_proc_event`; diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp index 5009cce48f4..5d41908435e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp @@ -17,17 +17,19 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" #include "hyjal.h" #include "hyjal_trash.h" enum Spells { - SPELL_CARRION_SWARM = 31306, - SPELL_SLEEP = 31298, - SPELL_VAMPIRIC_AURA = 38196, - SPELL_INFERNO = 31299, - SPELL_IMMOLATION = 31303, - SPELL_INFERNO_EFFECT = 31302, + SPELL_CARRION_SWARM = 31306, + SPELL_SLEEP = 31298, + SPELL_VAMPIRIC_AURA = 38196, + SPELL_VAMPIRIC_AURA_HEAL = 31285, + SPELL_INFERNO = 31299, + SPELL_IMMOLATION = 31303, + SPELL_INFERNO_EFFECT = 31302 }; enum Texts @@ -261,8 +263,48 @@ public: }; +class spell_anetheron_vampiric_aura : public SpellScriptLoader +{ + public: + spell_anetheron_vampiric_aura() : SpellScriptLoader("spell_anetheron_vampiric_aura") { } + + class spell_anetheron_vampiric_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_anetheron_vampiric_aura_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_VAMPIRIC_AURA_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 bp = damageInfo->GetDamage() * 3; + eventInfo.GetActor()->CastCustomSpell(SPELL_VAMPIRIC_AURA_HEAL, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetActor(), true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_anetheron_vampiric_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_anetheron_vampiric_aura_AuraScript(); + } +}; + void AddSC_boss_anetheron() { new boss_anetheron(); new npc_towering_infernal(); + new spell_anetheron_vampiric_aura(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 28484280ada..707bbd4eb02 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -1498,6 +1498,26 @@ class spell_taldaram_ball_of_inferno_flame : public SpellScriptLoader { return new spell_taldaram_ball_of_inferno_flame_SpellScript(); } + + class spell_taldaram_ball_of_inferno_flame_AuraScript : public AuraScript + { + PrepareAuraScript(spell_taldaram_ball_of_inferno_flame_AuraScript); + + void HandleStackDrop(ProcEventInfo& /*eventInfo*/) + { + ModStackAmount(-1); + } + + void Register() override + { + OnProc += AuraProcFn(spell_taldaram_ball_of_inferno_flame_AuraScript::HandleStackDrop); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_taldaram_ball_of_inferno_flame_AuraScript(); + } }; // 72080 - Kinetic Bomb (Valanar) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 23049e82d5e..137cdb28fb5 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -431,7 +431,7 @@ class boss_deathbringer_saurfang : public CreatureScript case 72445: case 72446: if (me->GetPower(POWER_ENERGY) != me->GetMaxPower(POWER_ENERGY)) - target->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, me, true); + target->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, (Unit*)nullptr, true); break; default: break; @@ -1135,8 +1135,7 @@ class spell_deathbringer_rune_of_blood : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - if (GetCaster()->GetPower(POWER_ENERGY) != GetCaster()->GetMaxPower(POWER_ENERGY)) - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, GetCaster(), true); + GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 1, (Unit*)nullptr, true); } void Register() override @@ -1151,6 +1150,41 @@ class spell_deathbringer_rune_of_blood : public SpellScriptLoader } }; +// 72176 - Blood Beast's Blood Link +class spell_deathbringer_blood_beast_blood_link : public SpellScriptLoader +{ + public: + spell_deathbringer_blood_beast_blood_link() : SpellScriptLoader("spell_deathbringer_blood_beast_blood_link") { } + + class spell_deathbringer_blood_beast_blood_link_AuraScript : public AuraScript + { + PrepareAuraScript(spell_deathbringer_blood_beast_blood_link_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_BLOOD_LINK_DUMMY)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetProcTarget()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 3, (Unit*)nullptr, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_deathbringer_blood_beast_blood_link_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_deathbringer_blood_beast_blood_link_AuraScript(); + } +}; + class spell_deathbringer_blood_nova : public SpellScriptLoader { public: @@ -1170,8 +1204,7 @@ class spell_deathbringer_blood_nova : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); // make this the default handler - if (GetCaster()->GetPower(POWER_ENERGY) != GetCaster()->GetMaxPower(POWER_ENERGY)) - GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 2, GetCaster(), true); + GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_DUMMY, SPELLVALUE_BASE_POINT0, 2, (Unit*)nullptr, true); } void Register() override @@ -1349,6 +1382,7 @@ void AddSC_boss_deathbringer_saurfang() new spell_deathbringer_blood_link_aura(); new spell_deathbringer_blood_power(); new spell_deathbringer_rune_of_blood(); + new spell_deathbringer_blood_beast_blood_link(); new spell_deathbringer_blood_nova(); new spell_deathbringer_blood_nova_targeting(); new spell_deathbringer_boiling_blood(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 376cadd18d9..77805dbfcb2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -838,9 +838,23 @@ class spell_putricide_gaseous_bloat : public SpellScriptLoader } } + void HandleProc(ProcEventInfo& eventInfo) + { + uint32 stack = GetStackAmount(); + Unit* caster = eventInfo.GetActor(); + + int32 const mod = caster->GetMap()->Is25ManRaid() ? 1500 : 1250; + int32 dmg = 0; + for (uint8 i = 1; i <= stack; ++i) + dmg += mod * i; + + caster->CastCustomSpell(SPELL_EXPUNGED_GAS, SPELLVALUE_BASE_POINT0, dmg); + } + void Register() override { OnEffectPeriodic += AuraEffectPeriodicFn(spell_putricide_gaseous_bloat_AuraScript::HandleExtraEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnProc += AuraProcFn(spell_putricide_gaseous_bloat_AuraScript::HandleProc); } }; @@ -1078,6 +1092,45 @@ class spell_putricide_ooze_eruption_searcher : public SpellScriptLoader } }; +// 71770 - Ooze Spell Tank Protection +class spell_putricide_ooze_tank_protection : public SpellScriptLoader +{ + public: + spell_putricide_ooze_tank_protection() : SpellScriptLoader("spell_putricide_ooze_tank_protection") { } + + class spell_putricide_ooze_tank_protection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_putricide_ooze_tank_protection_AuraScript); + + bool Validate(SpellInfo const* spellInfo) override + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell) || + !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_1].TriggerSpell)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* actionTarget = eventInfo.GetActionTarget(); + actionTarget->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_putricide_ooze_tank_protection_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectProc += AuraEffectProcFn(spell_putricide_ooze_tank_protection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_putricide_ooze_tank_protection_AuraScript(); + } +}; + class spell_putricide_choking_gas_bomb : public SpellScriptLoader { public: @@ -1602,6 +1655,7 @@ void AddSC_boss_professor_putricide() new spell_putricide_slime_puddle_aura(); new spell_putricide_unstable_experiment(); new spell_putricide_ooze_eruption_searcher(); + new spell_putricide_ooze_tank_protection(); new spell_putricide_choking_gas_bomb(); new spell_putricide_unbound_plague(); new spell_putricide_eat_ooze(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index fb8fddeb7db..43ef3bd1eac 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -1189,7 +1189,8 @@ class npc_crok_scourgebane : public CreatureScript } else { - me->DealHeal(me, me->CountPctFromMaxHealth(5)); + // looks totally hacky to me + me->ModifyHealth(me->CountPctFromMaxHealth(5)); _events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); } break; diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index 326a2de43a3..ecf7ec2beb2 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -2037,11 +2037,7 @@ class spell_scion_of_eternity_arcane_barrage : public SpellScriptLoader void TriggerDamageSpellFromPlayer() { if (Player* hitTarget = GetHitPlayer()) - { - // There is some proc in this spell I have absolutely no idea of use, but just in case... - TriggerCastFlags triggerFlags = TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_DISALLOW_PROC_EVENTS); - hitTarget->CastSpell(hitTarget, SPELL_ARCANE_BARRAGE_DAMAGE, triggerFlags, NULL, NULL, GetCaster()->GetGUID()); - } + hitTarget->CastSpell(hitTarget, SPELL_ARCANE_BARRAGE_DAMAGE, true, nullptr, nullptr, GetCaster()->GetGUID()); } void Register() override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 41dcfa5da93..e044e9dbb9c 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -1063,6 +1063,51 @@ class spell_xt002_submerged : public SpellScriptLoader } }; +class spell_xt002_321_boombot_aura : public SpellScriptLoader +{ + public: + spell_xt002_321_boombot_aura() : SpellScriptLoader("spell_xt002_321_boombot_aura") { } + + class spell_xt002_321_boombot_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_xt002_321_boombot_aura_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ACHIEVEMENT_CREDIT_NERF_SCRAPBOTS)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetActionTarget()->GetEntry() != NPC_XS013_SCRAPBOT) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + InstanceScript* instance = eventInfo.GetActor()->GetInstanceScript(); + if (!instance) + return; + + instance->DoCastSpellOnPlayers(SPELL_ACHIEVEMENT_CREDIT_NERF_SCRAPBOTS); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_xt002_321_boombot_aura_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_xt002_321_boombot_aura_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_xt002_321_boombot_aura_AuraScript(); + } +}; + class achievement_nerf_engineering : public AchievementCriteriaScript { public: @@ -1122,6 +1167,7 @@ void AddSC_boss_xt002() new spell_xt002_heart_overload_periodic(); new spell_xt002_tympanic_tantrum(); new spell_xt002_submerged(); + new spell_xt002_321_boombot_aura(); new achievement_nerf_engineering(); new achievement_heartbreaker(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 675268b4e93..6c27aaef25d 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -2750,6 +2750,7 @@ class spell_yogg_saron_grim_reprisal : public SpellScriptLoader // 63305 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { + PreventDefaultAction(); int32 damage = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), 60); GetTarget()->CastCustomSpell(SPELL_GRIM_REPRISAL_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetDamageInfo()->GetAttacker(), true, NULL, aurEff); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index cff5b93d7a2..e159902c3c8 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -456,7 +456,11 @@ class spell_ingvar_woe_strike : public SpellScriptLoader bool CheckProc(ProcEventInfo& eventInfo) { - return eventInfo.GetHealInfo()->GetHeal() != 0; + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return false; + + return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 6c9f7e215e6..b25f7ed3eca 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -191,6 +191,57 @@ class spell_fixate : public SpellScriptLoader } }; +enum SecondWind +{ + SPELL_SECOND_WIND_TRIGGER = 42771 +}; + +// 42770 - Second Wind +class spell_uk_second_wind : public SpellScriptLoader +{ + public: + spell_uk_second_wind() : SpellScriptLoader("spell_uk_second_wind") { } + + class spell_uk_second_wind_AuraScript : public AuraScript + { + PrepareAuraScript(spell_uk_second_wind_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SECOND_WIND_TRIGGER)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + return (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))) != 0; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActionTarget(); + caster->CastSpell(caster, SPELL_SECOND_WIND_TRIGGER, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_uk_second_wind_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_uk_second_wind_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_uk_second_wind_AuraScript(); + } +}; + enum EnslavedProtoDrake { TYPE_PROTODRAKE_AT = 28, @@ -301,4 +352,5 @@ void AddSC_utgarde_keep() new npc_enslaved_proto_drake(); new spell_ticking_time_bomb(); new spell_fixate(); + new spell_uk_second_wind(); } diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp new file mode 100644 index 00000000000..0aba111b6ae --- /dev/null +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "SpellScript.h" + +enum Spells +{ + SPELL_MARK_OF_MALICE_TRIGGERED = 33494 +}; + +class spell_mark_of_malice : public SpellScriptLoader +{ + public: + spell_mark_of_malice() : SpellScriptLoader("spell_mark_of_malice") { } + + class spell_mark_of_malice_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mark_of_malice_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_MALICE_TRIGGERED)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + // just drop charges + if (aurEff->GetBase()->GetCharges() > 1) + return; + + GetTarget()->CastSpell(GetTarget(), SPELL_MARK_OF_MALICE_TRIGGERED, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mark_of_malice_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mark_of_malice_AuraScript(); + } +}; + +void AddSC_shadow_labyrinth() +{ + new spell_mark_of_malice(); +} diff --git a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp index d4f0637c0d1..f305c1e47be 100644 --- a/src/server/scripts/Outland/boss_doomlord_kazzak.cpp +++ b/src/server/scripts/Outland/boss_doomlord_kazzak.cpp @@ -34,16 +34,17 @@ enum Texts enum Spells { - SPELL_SHADOW_VOLLEY = 32963, - SPELL_CLEAVE = 31779, - SPELL_THUNDERCLAP = 36706, - SPELL_VOID_BOLT = 39329, - SPELL_MARK_OF_KAZZAK = 32960, - SPELL_MARK_OF_KAZZAK_DAMAGE = 32961, - SPELL_ENRAGE = 32964, - SPELL_CAPTURE_SOUL = 32966, - SPELL_TWISTED_REFLECTION = 21063, - SPELL_BERSERK = 32965, + SPELL_SHADOW_VOLLEY = 32963, + SPELL_CLEAVE = 31779, + SPELL_THUNDERCLAP = 36706, + SPELL_VOID_BOLT = 39329, + SPELL_MARK_OF_KAZZAK = 32960, + SPELL_MARK_OF_KAZZAK_DAMAGE = 32961, + SPELL_ENRAGE = 32964, + SPELL_CAPTURE_SOUL = 32966, + SPELL_TWISTED_REFLECTION = 21063, + SPELL_TWISTED_REFLECTION_HEAL = 21064, + SPELL_BERSERK = 32965, }; enum Events @@ -222,8 +223,47 @@ class spell_mark_of_kazzak : public SpellScriptLoader } }; +class spell_twisted_reflection : public SpellScriptLoader +{ + public: + spell_twisted_reflection() : SpellScriptLoader("spell_twisted_reflection") { } + + class spell_twisted_reflection_AuraScript : public AuraScript + { + PrepareAuraScript(spell_twisted_reflection_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_TWISTED_REFLECTION_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActor(), SPELL_TWISTED_REFLECTION_HEAL, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_twisted_reflection_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_twisted_reflection_AuraScript(); + } +}; + void AddSC_boss_doomlordkazzak() { new boss_doomlord_kazzak(); new spell_mark_of_kazzak(); + new spell_twisted_reflection(); } diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp index ed2c21da6c3..e5c025a43cf 100644 --- a/src/server/scripts/Outland/outland_script_loader.cpp +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -37,6 +37,7 @@ void AddSC_boss_ambassador_hellmaw(); void AddSC_boss_blackheart_the_inciter(); void AddSC_boss_grandmaster_vorpil(); void AddSC_boss_murmur(); +void AddSC_shadow_labyrinth(); void AddSC_instance_shadow_labyrinth(); // Black Temple @@ -159,6 +160,7 @@ void AddOutlandScripts() AddSC_boss_blackheart_the_inciter(); AddSC_boss_grandmaster_vorpil(); AddSC_boss_murmur(); + AddSC_shadow_labyrinth(); AddSC_instance_shadow_labyrinth(); // Black Temple diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 321e44c8603..e31969bf597 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -35,6 +35,17 @@ enum HunterCreatures NPC_HUNTER_VIPER = 19921 }; +enum PetSpellsMisc +{ + SPELL_PET_GUARD_DOG_HAPPINESS = 54445, + SPELL_PET_SILVERBACK_RANK_1 = 62800, + SPELL_PET_SILVERBACK_RANK_2 = 62801, + PET_ICON_ID_GROWL = 201, + PET_ICON_ID_CLAW = 262, + PET_ICON_ID_BITE = 1680, + PET_ICON_ID_SMACK = 473 +}; + class npc_pet_hunter_snake_trap : public CreatureScript { public: @@ -139,7 +150,156 @@ class npc_pet_hunter_snake_trap : public CreatureScript } }; +// -53178 - Guard Dog +class spell_pet_guard_dog : public SpellScriptLoader +{ + public: + spell_pet_guard_dog() : SpellScriptLoader("spell_pet_guard_dog") { } + + class spell_pet_guard_dog_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pet_guard_dog_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PET_GUARD_DOG_HAPPINESS)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Growl shares family flags with other spells + // filter by spellIcon instead + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || spellInfo->SpellIconID != PET_ICON_ID_GROWL) + return false; + + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + caster->CastSpell((Unit*)nullptr, SPELL_PET_GUARD_DOG_HAPPINESS, true); + + float addThreat = CalculatePct(eventInfo.GetSpellInfo()->Effects[EFFECT_0].CalcValue(caster), aurEff->GetAmount()); + eventInfo.GetProcTarget()->AddThreat(caster, addThreat); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pet_guard_dog_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pet_guard_dog_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pet_guard_dog_AuraScript(); + } +}; + +// -62764 - Silverback +class spell_pet_silverback : public SpellScriptLoader +{ + public: + spell_pet_silverback() : SpellScriptLoader("spell_pet_silverback") { } + + class spell_pet_silverback_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pet_silverback_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PET_GUARD_DOG_HAPPINESS)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Growl shares family flags with other spells + // filter by spellIcon instead + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || spellInfo->SpellIconID != PET_ICON_ID_GROWL) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + static uint32 const triggerSpell[2] = { SPELL_PET_SILVERBACK_RANK_1, SPELL_PET_SILVERBACK_RANK_2 }; + + PreventDefaultAction(); + + uint32 spellId = triggerSpell[GetSpellInfo()->GetRank() - 1]; + eventInfo.GetActor()->CastSpell((Unit*)nullptr, spellId, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pet_silverback_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pet_silverback_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pet_silverback_AuraScript(); + } +}; + +// -61680 - Culling the Herd +class spell_pet_culling_the_herd : public SpellScriptLoader +{ + public: + spell_pet_culling_the_herd() : SpellScriptLoader("spell_pet_culling_the_herd") { } + + class spell_pet_culling_the_herd_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pet_culling_the_herd_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Claw, Bite and Smack share FamilyFlags with other spells + // filter by spellIcon instead + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + switch (spellInfo->SpellIconID) + { + case PET_ICON_ID_CLAW: + case PET_ICON_ID_BITE: + case PET_ICON_ID_SMACK: + break; + default: + return false; + } + + return true; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pet_culling_the_herd_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pet_culling_the_herd_AuraScript(); + } +}; + void AddSC_hunter_pet_scripts() { new npc_pet_hunter_snake_trap(); + new spell_pet_guard_dog(); + new spell_pet_silverback(); + new spell_pet_culling_the_herd(); } diff --git a/src/server/scripts/Pet/pet_priest.cpp b/src/server/scripts/Pet/pet_priest.cpp index a3110ce8f8b..a15b3bd7ffd 100644 --- a/src/server/scripts/Pet/pet_priest.cpp +++ b/src/server/scripts/Pet/pet_priest.cpp @@ -28,7 +28,7 @@ enum PriestSpells { SPELL_PRIEST_GLYPH_OF_SHADOWFIEND = 58228, - SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA = 58227, + SPELL_PRIEST_SHADOWFIEND_DEATH = 57989, SPELL_PRIEST_LIGHTWELL_CHARGES = 59907 }; @@ -70,12 +70,10 @@ class npc_pet_pri_shadowfiend : public CreatureScript { npc_pet_pri_shadowfiendAI(Creature* creature) : PetAI(creature) { } - void JustDied(Unit* /*killer*/) override + void IsSummonedBy(Unit* summoner) override { - if (me->IsSummon()) - if (Unit* owner = me->ToTempSummon()->GetSummoner()) - if (owner->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND)) - owner->CastSpell(owner, SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA, true); + if (summoner->HasAura(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND)) + DoCastAOE(SPELL_PRIEST_SHADOWFIEND_DEATH); } }; diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 4dfd9ff09ff..b3612ec6428 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -73,7 +73,24 @@ enum DeathKnightSpells SPELL_DK_UNHOLY_PRESENCE_TRIGGERED = 49772, SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1 = 49189, SPELL_DK_WILL_OF_THE_NECROPOLIS_AURA_R1 = 52284, - SPELL_DK_GHOUL_THRASH = 47480 + SPELL_DK_GHOUL_THRASH = 47480, + SPELL_DK_GLYPH_OF_SCOURGE_STRIKE_SCRIPT = 69961, + SPELL_DK_BUTCHERY_RUNIC_POWER = 50163, + SPELL_DK_MARK_OF_BLOOD_HEAL = 61607, + SPELL_DK_UNHOLY_BLIGHT_DAMAGE = 50536, + SPELL_DK_GLYPH_OF_UNHOLY_BLIGHT = 63332, + SPELL_DK_VENDETTA_HEAL = 50181, + SPELL_DK_NECROSIS_DAMAGE = 51460, + SPELL_DK_OBLITERATE_OFF_HAND_R1 = 66198, + SPELL_DK_FROST_STRIKE_OFF_HAND_R1 = 66196, + SPELL_DK_PLAGUE_STRIKE_OFF_HAND_R1 = 66216, + SPELL_DK_DEATH_STRIKE_OFF_HAND_R1 = 66188, + SPELL_DK_RUNE_STRIKE_OFF_HAND_R1 = 66217, + SPELL_DK_BLOOD_STRIKE_OFF_HAND_R1 = 66215, + SPELL_DK_RUNIC_RETURN = 61258, + SPELL_DK_WANDERING_PLAGUE_DAMAGE = 50526, + SPELL_DK_DEATH_COIL_R1 = 47541, + SPELL_DK_DEATH_GRIP_INITIAL = 49576 }; enum DeathKnightSpellIcons @@ -83,7 +100,9 @@ enum DeathKnightSpellIcons enum Misc { - NPC_DK_GHOUL = 26125 + NPC_DK_GHOUL = 26125, + NPC_DK_DANCING_RUNE_WEAPON = 27893, + SPELL_CATEGORY_HOWLING_BLAST = 1248 }; // -49200 - Acclimation @@ -393,6 +412,38 @@ class spell_dk_anti_magic_zone : public SpellScriptLoader } }; +// -49182 - Blade Barrier +class spell_dk_blade_barrier : public SpellScriptLoader +{ + public: + spell_dk_blade_barrier() : SpellScriptLoader("spell_dk_blade_barrier") { } + + class spell_dk_blade_barrier_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_blade_barrier_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetSpellInfo() != nullptr) + if (Player* player = eventInfo.GetActor()->ToPlayer()) + if (player->getClass() == CLASS_DEATH_KNIGHT && player->IsBaseRuneSlotsOnCooldown(RUNE_BLOOD)) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_blade_barrier_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_blade_barrier_AuraScript(); + } +}; + // 48721 - Blood Boil class spell_dk_blood_boil : public SpellScriptLoader { @@ -525,6 +576,41 @@ class spell_dk_bloodworms : public SpellScriptLoader } }; +// -48979 - Butchery +class spell_dk_butchery : public SpellScriptLoader +{ + public: + spell_dk_butchery() : SpellScriptLoader("spell_dk_butchery") { } + + class spell_dk_butchery_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_butchery_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_BUTCHERY_RUNIC_POWER)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastCustomSpell(SPELL_DK_BUTCHERY_RUNIC_POWER, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_butchery_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_butchery_AuraScript(); + } +}; + class CorpseExplosionCheck { public: @@ -649,6 +735,69 @@ class spell_dk_corpse_explosion : public SpellScriptLoader } }; +// 49028 - Dancing Rune Weapon +class spell_dk_dancing_rune_weapon : public SpellScriptLoader +{ + public: + spell_dk_dancing_rune_weapon() : SpellScriptLoader("spell_dk_dancing_rune_weapon") { } + + class spell_dk_dancing_rune_weapon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_dancing_rune_weapon_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sObjectMgr->GetCreatureTemplate(NPC_DK_DANCING_RUNE_WEAPON)) + return false; + return true; + } + + // This is a port of the old switch hack in Unit.cpp, it's not correct + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* drw = nullptr; + for (Unit* controlled : caster->m_Controlled) + { + if (controlled->GetEntry() == NPC_DK_DANCING_RUNE_WEAPON) + { + drw = controlled; + break; + } + } + + if (!drw || !drw->GetVictim()) + return; + + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 amount = static_cast<int32>(damageInfo->GetDamage()) / 2; + drw->SendSpellNonMeleeDamageLog(drw->GetVictim(), spellInfo->Id, amount, spellInfo->GetSchoolMask(), 0, 0, false, 0, false); + drw->DealDamage(drw->GetVictim(), amount, nullptr, SPELL_DIRECT_DAMAGE, spellInfo->GetSchoolMask(), spellInfo, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_dancing_rune_weapon_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_dancing_rune_weapon_AuraScript(); + } +}; + class spell_dk_death_and_decay : public SpellScriptLoader { public: @@ -874,6 +1023,84 @@ class spell_dk_death_pact : public SpellScriptLoader } }; +// -54639 - Blood of the North +// -49208 - Reaping +// -49467 - Death Rune Mastery +class spell_dk_death_rune : public SpellScriptLoader +{ + public: + spell_dk_death_rune() : SpellScriptLoader("spell_dk_death_rune") { } + + class spell_dk_death_rune_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_death_rune_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + + if (caster->GetTypeId() != TYPEID_PLAYER) + return false; + + Player* player = caster->ToPlayer(); + if (player->getClass() != CLASS_DEATH_KNIGHT) + return false; + + return true; + } + + void HandleProc(ProcEventInfo& eventInfo) + { + Player* player = eventInfo.GetActor()->ToPlayer(); + + AuraEffect* aurEff = GetEffect(EFFECT_0); + if (!aurEff) + return; + + // Reset amplitude - set death rune remove timer to 30s + aurEff->ResetPeriodic(true); + + uint32 runesLeft = 1; + + // Death Rune Mastery + if (GetSpellInfo()->SpellIconID == 2622) + runesLeft = 2; + + for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i) + { + if (GetSpellInfo()->SpellIconID == 2622) + { + if (player->GetBaseRune(i) == RUNE_BLOOD) + continue; + } + else + { + if (player->GetBaseRune(i) != RUNE_BLOOD) + continue; + } + + if (player->GetRuneCooldown(i) != (player->GetRuneBaseCooldown(i) - player->GetLastRuneGraceTimer(i))) + continue; + + --runesLeft; + // Mark aura as used + player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff); + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_death_rune_AuraScript::CheckProc); + OnProc += AuraProcFn(spell_dk_death_rune_AuraScript::HandleProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_death_rune_AuraScript(); + } +}; + // -49998 - Death Strike class spell_dk_death_strike : public SpellScriptLoader { @@ -966,6 +1193,116 @@ class spell_dk_ghoul_explode : public SpellScriptLoader } }; +// 62259 - Glyph of Death Grip +class spell_dk_glyph_of_death_grip : public SpellScriptLoader +{ + public: + spell_dk_glyph_of_death_grip() : SpellScriptLoader("spell_dk_glyph_of_death_grip") { } + + class spell_dk_glyph_of_death_grip_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_glyph_of_death_grip_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_GRIP_INITIAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->GetSpellHistory()->ResetCooldown(SPELL_DK_DEATH_GRIP_INITIAL, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_glyph_of_death_grip_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_glyph_of_death_grip_AuraScript(); + } +}; + +// 58642 - Glyph of Scourge Strike +class spell_dk_glyph_of_scourge_strike : public SpellScriptLoader +{ + public: + spell_dk_glyph_of_scourge_strike() : SpellScriptLoader("spell_dk_glyph_of_scourge_strike") { } + + class spell_dk_glyph_of_scourge_strike_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_glyph_of_scourge_strike_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_SCOURGE_STRIKE_SCRIPT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_GLYPH_OF_SCOURGE_STRIKE_SCRIPT, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_glyph_of_scourge_strike_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_glyph_of_scourge_strike_AuraScript(); + } +}; + +// 51209 - Hungering Cold +class spell_dk_hungering_cold : public SpellScriptLoader +{ + public: + spell_dk_hungering_cold() : SpellScriptLoader("spell_dk_hungering_cold") { } + + class spell_dk_hungering_cold_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_hungering_cold_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) // probably melee damage so let's proc + return true; + + return (spellInfo->Dispel != DISPEL_DISEASE); + } + + void HandleDummy(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + // Prevent console spam + PreventDefaultAction(); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_hungering_cold_AuraScript::CheckProc); + + OnEffectProc += AuraEffectProcFn(spell_dk_hungering_cold_AuraScript::HandleDummy, EFFECT_1, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_dk_hungering_cold_AuraScript::HandleDummy, EFFECT_2, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_hungering_cold_AuraScript(); + } +}; + // 48792 - Icebound Fortitude class spell_dk_icebound_fortitude : public SpellScriptLoader { @@ -1049,10 +1386,18 @@ class spell_dk_improved_blood_presence : public SpellScriptLoader target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); } + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + // Prevent console spam + PreventDefaultAction(); + } + void Register() override { AfterEffectApply += AuraEffectApplyFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); AfterEffectRemove += AuraEffectRemoveFn(spell_dk_improved_blood_presence_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + + OnEffectProc += AuraEffectProcFn(spell_dk_improved_blood_presence_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -1213,6 +1558,127 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader } }; +// 61257 - Runic Power Back on Snare/Root +class spell_dk_pvp_4p_bonus : public SpellScriptLoader +{ + public: + spell_dk_pvp_4p_bonus() : SpellScriptLoader("spell_dk_pvp_4p_bonus") { } + + class spell_dk_pvp_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_pvp_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_RUNIC_RETURN)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + return (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))) != 0; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActionTarget()->CastSpell((Unit*)nullptr, SPELL_DK_RUNIC_RETURN, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_pvp_4p_bonus_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_pvp_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_pvp_4p_bonus_AuraScript(); + } +}; + +// 49005 - Mark of Blood +class spell_dk_mark_of_blood : public SpellScriptLoader +{ + public: + spell_dk_mark_of_blood() : SpellScriptLoader("spell_dk_mark_of_blood") { } + + class spell_dk_mark_of_blood_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_mark_of_blood_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_MARK_OF_BLOOD_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DK_MARK_OF_BLOOD_HEAL, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_mark_of_blood_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_mark_of_blood_AuraScript(); + } +}; + +// -51459 - Necrosis +class spell_dk_necrosis : public SpellScriptLoader +{ + public: + spell_dk_necrosis() : SpellScriptLoader("spell_dk_necrosis") { } + + class spell_dk_necrosis_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_necrosis_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_NECROSIS_DAMAGE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + eventInfo.GetActor()->CastCustomSpell(SPELL_DK_NECROSIS_DAMAGE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_necrosis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_necrosis_AuraScript(); + } +}; + // ID - 50842 Pestilence class spell_dk_pestilence : public SpellScriptLoader { @@ -1565,6 +2031,43 @@ class spell_dk_raise_dead : public SpellScriptLoader } }; +// -49188 - Rime +class spell_dk_rime : public SpellScriptLoader +{ + public: + spell_dk_rime() : SpellScriptLoader("spell_dk_rime") { } + + class spell_dk_blade_barrier_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_blade_barrier_AuraScript); + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + return GetTarget()->GetTypeId() == TYPEID_PLAYER; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + GetTarget()->GetSpellHistory()->ResetCooldowns([](SpellHistory::CooldownStorageType::iterator itr) -> bool + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + return spellInfo && spellInfo->GetCategory() == SPELL_CATEGORY_HOWLING_BLAST; + }, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dk_blade_barrier_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dk_blade_barrier_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_blade_barrier_AuraScript(); + } +}; + // 59754 Rune Tap - Party class spell_dk_rune_tap_party : public SpellScriptLoader { @@ -1613,7 +2116,7 @@ class spell_dk_scent_of_blood : public SpellScriptLoader { PreventDefaultAction(); GetTarget()->CastSpell(GetTarget(), SPELL_DK_SCENT_OF_BLOOD, true, NULL, aurEff); - GetTarget()->RemoveAuraFromStack(GetSpellInfo()->Id); + ModStackAmount(-1); } void Register() override @@ -1628,6 +2131,37 @@ class spell_dk_scent_of_blood : public SpellScriptLoader } }; +// -49004 - Scent of Blood trigger +class spell_dk_scent_of_blood_trigger : public SpellScriptLoader +{ + public: + spell_dk_scent_of_blood_trigger() : SpellScriptLoader("spell_dk_scent_of_blood_trigger") { } + + class spell_dk_scent_of_blood_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_scent_of_blood_trigger_AuraScript); + + // Each rank of Scent of Blood adds a trigger spell effect + // thus each effect adds one stack when proccing + // We need to remove the old buff before proccing again + // or we would be adding stacks to a possibly existing aura + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + GetTarget()->RemoveAurasDueToSpell(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_scent_of_blood_trigger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_scent_of_blood_trigger_AuraScript(); + } +}; + // 55090 - Scourge Strike (55265, 55270, 55271) class spell_dk_scourge_strike : public SpellScriptLoader { @@ -1744,6 +2278,188 @@ class spell_dk_spell_deflection : public SpellScriptLoader } }; +// -49018 - Sudden Doom +class spell_dk_sudden_doom : public SpellScriptLoader +{ + public: + spell_dk_sudden_doom() : SpellScriptLoader("spell_dk_sudden_doom") { } + + class spell_dk_sudden_doom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_sudden_doom_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_COIL_R1)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DK_DEATH_COIL_R1); + uint32 spellId = 0; + + while (spellInfo) + { + if (!caster->HasSpell(spellInfo->Id)) + break; + + spellId = spellInfo->Id; + spellInfo = spellInfo->GetNextRankSpell(); + } + + if (!spellId) + return; + + caster->CastSpell(eventInfo.GetProcTarget(), spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_sudden_doom_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_sudden_doom_AuraScript(); + } +}; + +// -65661 Threat of Thassarian +class spell_dk_threat_of_thassarian : public SpellScriptLoader +{ + public: + spell_dk_threat_of_thassarian() : SpellScriptLoader("spell_dk_threat_of_thassarian") { } + + class spell_dk_threat_of_thassarian_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_threat_of_thassarian_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_OBLITERATE_OFF_HAND_R1) || + !sSpellMgr->GetSpellInfo(SPELL_DK_FROST_STRIKE_OFF_HAND_R1) || + !sSpellMgr->GetSpellInfo(SPELL_DK_PLAGUE_STRIKE_OFF_HAND_R1) || + !sSpellMgr->GetSpellInfo(SPELL_DK_DEATH_STRIKE_OFF_HAND_R1) || + !sSpellMgr->GetSpellInfo(SPELL_DK_RUNE_STRIKE_OFF_HAND_R1) || + !sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_STRIKE_OFF_HAND_R1)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + if (!roll_chance_i(aurEff->GetAmount())) + return; + + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + // Must dual wield + Unit* caster = eventInfo.GetActor(); + if (!caster->haveOffhandWeapon()) + return; + + uint32 spellId = 0; + // Plague Strike + if (spellInfo->SpellFamilyFlags[0] & 0x00000001) + spellId = SPELL_DK_PLAGUE_STRIKE_OFF_HAND_R1; + // Death Strike + else if (spellInfo->SpellFamilyFlags[0] & 0x00000010) + spellId = SPELL_DK_DEATH_STRIKE_OFF_HAND_R1; + // Blood Strike + else if (spellInfo->SpellFamilyFlags[0] & 0x00400000) + spellId = SPELL_DK_BLOOD_STRIKE_OFF_HAND_R1; + // Frost Strike + else if (spellInfo->SpellFamilyFlags[1] & 0x00000004) + spellId = SPELL_DK_FROST_STRIKE_OFF_HAND_R1; + // Obliterate + else if (spellInfo->SpellFamilyFlags[1] & 0x00020000) + spellId = SPELL_DK_OBLITERATE_OFF_HAND_R1; + // Rune Strike + else if (spellInfo->SpellFamilyFlags[1] & 0x20000000) + spellId = SPELL_DK_RUNE_STRIKE_OFF_HAND_R1; + + if (!spellId) + return; + + spellId = sSpellMgr->GetSpellWithRank(spellId, spellInfo->GetRank()); + caster->CastSpell(eventInfo.GetProcTarget(), spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_threat_of_thassarian_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_threat_of_thassarian_AuraScript(); + } +}; + +// 49194 - Unholy Blight +class spell_dk_unholy_blight : public SpellScriptLoader +{ + public: + spell_dk_unholy_blight() : SpellScriptLoader("spell_dk_unholy_blight") { } + + class spell_dk_unholy_blight_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_unholy_blight_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_UNHOLY_BLIGHT_DAMAGE) || + !sSpellMgr->GetSpellInfo(SPELL_DK_GLYPH_OF_UNHOLY_BLIGHT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DK_UNHOLY_BLIGHT_DAMAGE); + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_UNHOLY_BLIGHT, EFFECT_0, caster->GetGUID())) + AddPct(amount, glyph->GetAmount()); + + amount /= spellInfo->GetMaxTicks(); + + // Add remaining ticks to healing done + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_DK_UNHOLY_BLIGHT_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE); + + caster->CastCustomSpell(SPELL_DK_UNHOLY_BLIGHT_DAMAGE, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_unholy_blight_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_unholy_blight_AuraScript(); + } +}; // 55233 - Vampiric Blood class spell_dk_vampiric_blood : public SpellScriptLoader { @@ -1771,6 +2487,88 @@ class spell_dk_vampiric_blood : public SpellScriptLoader } }; +// -49015 - Vendetta +class spell_dk_vendetta : public SpellScriptLoader +{ + public: + spell_dk_vendetta() : SpellScriptLoader("spell_dk_vendetta") { } + + class spell_dk_vendetta_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_vendetta_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_VENDETTA_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + int32 amount = caster->CountPctFromMaxHealth(aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_DK_VENDETTA_HEAL, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_vendetta_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_vendetta_AuraScript(); + } +}; + +// -49217 - Wandering Plague +class spell_dk_wandering_plague : public SpellScriptLoader +{ + public: + spell_dk_wandering_plague() : SpellScriptLoader("spell_dk_wandering_plague") { } + + class spell_dk_wandering_plague_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dk_wandering_plague_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DK_WANDERING_PLAGUE_DAMAGE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + if (!roll_chance_f(caster->GetUnitCriticalChance(BASE_ATTACK, target))) + return; + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_DK_WANDERING_PLAGUE_DAMAGE, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dk_wandering_plague_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dk_wandering_plague_AuraScript(); + } +}; + // 52284 - Will of the Necropolis class spell_dk_will_of_the_necropolis : public SpellScriptLoader { @@ -2200,30 +2998,47 @@ void AddSC_deathknight_spell_scripts() new spell_dk_anti_magic_shell_raid(); new spell_dk_anti_magic_shell_self(); new spell_dk_anti_magic_zone(); + new spell_dk_blade_barrier(); new spell_dk_blood_boil(); new spell_dk_blood_gorged(); new spell_dk_bloodworms(); + new spell_dk_butchery(); new spell_dk_corpse_explosion(); + new spell_dk_dancing_rune_weapon(); new spell_dk_death_and_decay(); new spell_dk_death_coil(); new spell_dk_death_gate(); new spell_dk_death_grip(); new spell_dk_death_pact(); + new spell_dk_death_rune(); new spell_dk_death_strike(); new spell_dk_ghoul_explode(); + new spell_dk_glyph_of_death_grip(); + new spell_dk_glyph_of_scourge_strike(); + new spell_dk_hungering_cold(); new spell_dk_icebound_fortitude(); new spell_dk_improved_blood_presence(); new spell_dk_improved_blood_presence_triggered(); new spell_dk_improved_frost_presence(); new spell_dk_improved_unholy_presence(); + new spell_dk_pvp_4p_bonus(); + new spell_dk_mark_of_blood(); + new spell_dk_necrosis(); new spell_dk_pestilence(); new spell_dk_presence(); new spell_dk_raise_dead(); + new spell_dk_rime(); new spell_dk_rune_tap_party(); new spell_dk_scent_of_blood(); + new spell_dk_scent_of_blood_trigger(); new spell_dk_scourge_strike(); new spell_dk_spell_deflection(); + new spell_dk_sudden_doom(); + new spell_dk_threat_of_thassarian(); + new spell_dk_unholy_blight(); new spell_dk_vampiric_blood(); + new spell_dk_vendetta(); + new spell_dk_wandering_plague(); new spell_dk_will_of_the_necropolis(); new spell_dk_death_grip_initial(); new spell_dk_raise_ally_initial(); diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 0bf5ab01f45..fc75b6d7972 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -57,7 +57,33 @@ enum DruidSpells SPELL_DRUID_SAVAGE_ROAR = 62071, SPELL_DRUID_T9_FERAL_RELIC_BEAR = 67354, SPELL_DRUID_T9_FERAL_RELIC_CAT = 67355, - SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178 + SPELL_DRUID_TIGER_S_FURY_ENERGIZE = 51178, + SPELL_DRUID_T3_PROC_ENERGIZE_MANA = 28722, + SPELL_DRUID_T3_PROC_ENERGIZE_RAGE = 28723, + SPELL_DRUID_T3_PROC_ENERGIZE_ENERGY = 28724, + SPELL_DRUID_BLESSING_OF_THE_CLAW = 28750, + SPELL_DRUID_REVITALIZE_ENERGIZE_MANA = 48542, + SPELL_DRUID_REVITALIZE_ENERGIZE_RAGE = 48541, + SPELL_DRUID_REVITALIZE_ENERGIZE_ENERGY = 48540, + SPELL_DRUID_REVITALIZE_ENERGIZE_RP = 48543, + SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN = 54833, + SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT = 54846, + SPELL_DRUID_GLYPH_OF_RIP = 54818, + SPELL_DRUID_RIP_DURATION_LACERATE_DMG = 60141, + SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED = 54820, + SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1 = 34297, + SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL = 34299, + SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA = 68285, + SPELL_DRUID_EXHILARATE = 28742, + SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL = 54755, + SPELL_DRUID_INFUSION = 37238, + SPELL_DRUID_BLESSING_OF_REMULOS = 40445, + SPELL_DRUID_BLESSING_OF_ELUNE = 40446, + SPELL_DRUID_BLESSING_OF_CENARIUS = 40452, + SPELL_DRUID_LANGUISH = 71023, + SPELL_DRUID_REJUVENATION_T10_PROC = 70691, + SPELL_DRUID_BALANCE_T10_BONUS = 70718, + SPELL_DRUID_BALANCE_T10_BONUS_PROC = 70721 }; // 1178 - Bear Form (Passive) @@ -175,6 +201,7 @@ public: void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { + PreventDefaultAction(); if (eventInfo.GetSpellInfo()->SpellFamilyFlags[0] & 1) { _lunarProcCooldownEnd = std::chrono::steady_clock::now() + Seconds(aurEff->GetAmount()); @@ -354,6 +381,224 @@ public: } }; +// -33943 - Flight Form +class spell_dru_flight_form : public SpellScriptLoader +{ + public: + spell_dru_flight_form() : SpellScriptLoader("spell_dru_flight_form") { } + + class spell_dru_flight_form_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_flight_form_SpellScript); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->IsInDisallowedMountForm()) + return SPELL_FAILED_NOT_SHAPESHIFT; + + return SPELL_CAST_OK; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dru_flight_form_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_dru_flight_form_SpellScript(); + } +}; + +// 54832 - Glyph of Innervate +class spell_dru_glyph_of_innervate : public SpellScriptLoader +{ + public: + spell_dru_glyph_of_innervate() : SpellScriptLoader("spell_dru_glyph_of_innervate") { } + + class spell_dru_glyph_of_innervate_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_glyph_of_innervate_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN); + int32 amount = CalculatePct(static_cast<int32>(caster->GetCreatePowers(POWER_MANA)), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + + caster->CastCustomSpell(SPELL_DRUID_GLYPH_OF_INNERVATE_REGEN, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_innervate_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_glyph_of_innervate_AuraScript(); + } +}; + +// 54821 - Glyph of Rake +class spell_dru_glyph_of_rake : public SpellScriptLoader +{ + public: + spell_dru_glyph_of_rake() : SpellScriptLoader("spell_dru_glyph_of_rake") { } + + class spell_dru_glyph_of_rake_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_glyph_of_rake_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget()->GetTypeId() == TYPEID_UNIT; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_RAKE_TRIGGERED, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_rake_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_rake_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_glyph_of_rake_AuraScript(); + } +}; + +// 54754 - Glyph of Rejuvenation +class spell_dru_glyph_of_rejuvenation : public SpellScriptLoader +{ + public: + spell_dru_glyph_of_rejuvenation() : SpellScriptLoader("spell_dru_glyph_of_rejuvenation") { } + + class spell_dru_glyph_of_rejuvenation_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_glyph_of_rejuvenation_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget()->HealthBelowPct(50); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + eventInfo.GetActor()->CastCustomSpell(SPELL_DRUID_GLYPH_OF_REJUVENATION_HEAL, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_glyph_of_rejuvenation_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_rejuvenation_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_glyph_of_rejuvenation_AuraScript(); + } +}; + +// 54815 - Glyph of Shred +class spell_dru_glyph_of_shred : public SpellScriptLoader +{ + public: + spell_dru_glyph_of_shred() : SpellScriptLoader("spell_dru_glyph_of_shred") { } + + class spell_dru_glyph_of_shred_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_glyph_of_shred_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_RIP) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_RIP_DURATION_LACERATE_DMG)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + // try to find spell Rip on the target + if (AuraEffect const* rip = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, caster->GetGUID())) + { + // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip + uint32 countMin = rip->GetBase()->GetMaxDuration(); + + // just Rip's max duration without other spells + uint32 countMax = rip->GetSpellInfo()->GetMaxDuration(); + + // add possible auras' and Glyph of Shred's max duration + countMax += 3 * aurEff->GetAmount() * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds + countMax += caster->HasAura(SPELL_DRUID_GLYPH_OF_RIP) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds + countMax += caster->HasAura(SPELL_DRUID_RIP_DURATION_LACERATE_DMG) ? 4 * IN_MILLISECONDS : 0; // T7 set bonus -> +4 seconds + + // if min < max -> that means caster didn't cast 3 shred yet + // so set Rip's duration and max duration + if (countMin < countMax) + { + rip->GetBase()->SetDuration(rip->GetBase()->GetDuration() + aurEff->GetAmount() * IN_MILLISECONDS); + rip->GetBase()->SetMaxDuration(countMin + aurEff->GetAmount() * IN_MILLISECONDS); + } + } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_shred_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_glyph_of_shred_AuraScript(); + } +}; + // 54846 - Glyph of Starfire class spell_dru_glyph_of_starfire : public SpellScriptLoader { @@ -375,6 +620,7 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader { Unit* caster = GetCaster(); if (Unit* unitTarget = GetHitUnit()) + { if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00000002, 0, 0, caster->GetGUID())) { Aura* aura = aurEff->GetBase(); @@ -392,6 +638,7 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader aura->SetMaxDuration(countMin + 3000); } } + } } void Register() override @@ -406,6 +653,41 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader } }; +// 54845 - Glyph of Starfire +class spell_dru_glyph_of_starfire_dummy : public SpellScriptLoader +{ + public: + spell_dru_glyph_of_starfire_dummy() : SpellScriptLoader("spell_dru_glyph_of_starfire_dummy") { } + + class spell_dru_glyph_of_starfire_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_glyph_of_starfire_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_GLYPH_OF_STARFIRE_SCRIPT, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_glyph_of_starfire_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_glyph_of_starfire_dummy_AuraScript(); + } +}; + // 34246 - Idol of the Emerald Queen // 60779 - Idol of Lush Moss class spell_dru_idol_lifebloom : public SpellScriptLoader @@ -501,6 +783,66 @@ class spell_dru_insect_swarm : public SpellScriptLoader } }; +// 24932 - Leader of the Pack +class spell_dru_leader_of_the_pack : public SpellScriptLoader +{ + public: + spell_dru_leader_of_the_pack() : SpellScriptLoader("spell_dru_leader_of_the_pack") { } + + class spell_dru_leader_of_the_pack_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_leader_of_the_pack_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + if (!aurEff->GetAmount()) + return; + + Unit* caster = eventInfo.GetActor(); + if (caster->GetSpellHistory()->HasCooldown(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL)) + return; + + int32 amount = caster->CountPctFromMaxHealth(aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + + // Because of how proc system works, we can't store proc cd on db, it would be applied to entire aura + // so aura could only proc once per 6 seconds, independently of caster + caster->GetSpellHistory()->AddCooldown(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_HEAL, 0, Seconds(6)); + + // only proc on self + if (aurEff->GetCasterGUID() != caster->GetGUID()) + return; + + AuraEffect const* impLotpMana = caster->GetAuraEffectOfRankedSpell(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_R1, EFFECT_1, aurEff->GetCasterGUID()); + if (!impLotpMana) + return; + + int32 manaAmount = CalculatePct(static_cast<int32>(caster->GetMaxPower(POWER_MANA)), impLotpMana->GetAmount()); + caster->CastCustomSpell(SPELL_DRUID_IMP_LEADER_OF_THE_PACK_MANA, SPELLVALUE_BASE_POINT0, manaAmount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_leader_of_the_pack_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_leader_of_the_pack_AuraScript(); + } +}; + // -33763 - Lifebloom class spell_dru_lifebloom : public SpellScriptLoader { @@ -603,7 +945,12 @@ class spell_dru_living_seed : public SpellScriptLoader void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 amount = CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()); GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); } @@ -705,6 +1052,43 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader } }; +// 16864 - Omen of Clarity +class spell_dru_omen_of_clarity : public SpellScriptLoader +{ + public: + spell_dru_omen_of_clarity() : SpellScriptLoader("spell_dru_omen_of_clarity") { } + + class spell_dru_omen_of_clarity_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_omen_of_clarity_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_BALANCE_T10_BONUS) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_BALANCE_T10_BONUS_PROC)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + Unit* target = GetTarget(); + if (target->HasAura(SPELL_DRUID_BALANCE_T10_BONUS)) + target->CastSpell((Unit*)nullptr, SPELL_DRUID_BALANCE_T10_BONUS_PROC, true, nullptr); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_omen_of_clarity_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_omen_of_clarity_AuraScript(); + } +}; + // 48391 - Owlkin Frenzy class spell_dru_owlkin_frenzy : public SpellScriptLoader { @@ -812,6 +1196,68 @@ class spell_dru_primal_tenacity : public SpellScriptLoader } }; +// -48539 - Revitalize +class spell_dru_revitalize : public SpellScriptLoader +{ + public: + spell_dru_revitalize() : SpellScriptLoader("spell_dru_revitalize") { } + + class spell_dru_revitalize_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_revitalize_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_REVITALIZE_ENERGIZE_MANA) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_REVITALIZE_ENERGIZE_RAGE) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_REVITALIZE_ENERGIZE_ENERGY) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_REVITALIZE_ENERGIZE_RP)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + if (!roll_chance_i(aurEff->GetAmount())) + return; + + Unit* target = eventInfo.GetProcTarget(); + uint32 spellId; + + switch (target->getPowerType()) + { + case POWER_MANA: + spellId = SPELL_DRUID_REVITALIZE_ENERGIZE_MANA; + break; + case POWER_RAGE: + spellId = SPELL_DRUID_REVITALIZE_ENERGIZE_RAGE; + break; + case POWER_ENERGY: + spellId = SPELL_DRUID_REVITALIZE_ENERGIZE_ENERGY; + break; + case POWER_RUNIC_POWER: + spellId = SPELL_DRUID_REVITALIZE_ENERGIZE_RP; + break; + default: + return; + } + + eventInfo.GetActor()->CastSpell(target, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_revitalize_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_revitalize_AuraScript(); + } +}; + // -1079 - Rip class spell_dru_rip : public SpellScriptLoader { @@ -860,7 +1306,7 @@ class spell_dru_rip : public SpellScriptLoader } }; -// 62606 - Savage Defense +// 62600 - Savage Defense class spell_dru_savage_defense : public SpellScriptLoader { public: @@ -870,37 +1316,24 @@ class spell_dru_savage_defense : public SpellScriptLoader { PrepareAuraScript(spell_dru_savage_defense_AuraScript); - public: - spell_dru_savage_defense_AuraScript() - { - absorbPct = 0; - } - - private: - uint32 absorbPct; - - bool Load() override + bool Validate(SpellInfo const* spellInfo) override { - absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; return true; } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - absorbAmount = uint32(CalculatePct(GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK), absorbPct)); - aurEff->SetAmount(0); + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + int32 amount = static_cast<int32>(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), aurEff->GetAmount())); + caster->CastCustomSpell(GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); } void Register() override { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_savage_defense_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_dru_savage_defense_AuraScript::Absorb, EFFECT_0); + OnEffectProc += AuraEffectProcFn(spell_dru_savage_defense_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; @@ -1148,37 +1581,6 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader } }; -// -33943 - Flight Form -class spell_dru_flight_form : public SpellScriptLoader -{ - public: - spell_dru_flight_form() : SpellScriptLoader("spell_dru_flight_form") { } - - class spell_dru_flight_form_SpellScript : public SpellScript - { - PrepareSpellScript(spell_dru_flight_form_SpellScript); - - SpellCastResult CheckCast() - { - Unit* caster = GetCaster(); - if (caster->IsInDisallowedMountForm()) - return SPELL_FAILED_NOT_SHAPESHIFT; - - return SPELL_CAST_OK; - } - - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_dru_flight_form_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_dru_flight_form_SpellScript(); - } -}; - // -5217 - Tiger's Fury class spell_dru_tiger_s_fury : public SpellScriptLoader { @@ -1236,6 +1638,247 @@ class spell_dru_typhoon : public SpellScriptLoader } }; +// 28716 - Rejuvenation +class spell_dru_t3_2p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t3_2p_bonus() : SpellScriptLoader("spell_dru_t3_2p_bonus") { } + + class spell_dru_t3_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t3_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_T3_PROC_ENERGIZE_MANA) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_T3_PROC_ENERGIZE_RAGE) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_T3_PROC_ENERGIZE_ENERGY)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + if (!roll_chance_i(50)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* target = eventInfo.GetProcTarget(); + uint32 spellId; + + switch (target->getPowerType()) + { + case POWER_MANA: + spellId = SPELL_DRUID_T3_PROC_ENERGIZE_MANA; + break; + case POWER_RAGE: + spellId = SPELL_DRUID_T3_PROC_ENERGIZE_RAGE; + break; + case POWER_ENERGY: + spellId = SPELL_DRUID_T3_PROC_ENERGIZE_ENERGY; + break; + default: + return; + } + + eventInfo.GetActor()->CastSpell(target, spellId, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_t3_2p_bonus_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_t3_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_t3_2p_bonus_AuraScript(); + } +}; + +// 28744 - Regrowth +class spell_dru_t3_6p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t3_6p_bonus() : SpellScriptLoader("spell_dru_t3_6p_bonus") { } + + class spell_dru_t3_6p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t3_6p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_BLESSING_OF_THE_CLAW)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_DRUID_BLESSING_OF_THE_CLAW, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_t3_6p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_t3_6p_bonus_AuraScript(); + } +}; + +// 28719 - Healing Touch +class spell_dru_t3_8p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t3_8p_bonus() : SpellScriptLoader("spell_dru_t3_8p_bonus") { } + + class spell_dru_t3_8p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t3_8p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_EXHILARATE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + Unit* caster = eventInfo.GetActor(); + int32 amount = CalculatePct(spellInfo->CalcPowerCost(caster, spellInfo->GetSchoolMask()), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_DRUID_EXHILARATE, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_t3_8p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_t3_8p_bonus_AuraScript(); + } +}; + +// 37288 - Mana Restore +// 37295 - Mana Restore +class spell_dru_t4_2p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t4_2p_bonus() : SpellScriptLoader("spell_dru_t4_2p_bonus") { } + + class spell_dru_t4_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t4_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_INFUSION)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_DRUID_INFUSION, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_t4_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_t4_2p_bonus_AuraScript(); + } +}; + +// 40442 - Druid Tier 6 Trinket +class spell_dru_item_t6_trinket : public SpellScriptLoader +{ + public: + spell_dru_item_t6_trinket() : SpellScriptLoader("spell_dru_item_t6_trinket") { } + + class spell_dru_item_t6_trinket_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_item_t6_trinket_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_BLESSING_OF_REMULOS) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_BLESSING_OF_ELUNE) || + !sSpellMgr->GetSpellInfo(SPELL_DRUID_BLESSING_OF_CENARIUS)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + uint32 spellId; + int32 chance; + + // Starfire + if (spellInfo->SpellFamilyFlags[0] & 0x00000004) + { + spellId = SPELL_DRUID_BLESSING_OF_REMULOS; + chance = 25; + } + // Rejuvenation + else if (spellInfo->SpellFamilyFlags[0] & 0x00000010) + { + spellId = SPELL_DRUID_BLESSING_OF_ELUNE; + chance = 25; + } + // Mangle (Bear) and Mangle (Cat) + else if (spellInfo->SpellFamilyFlags[1] & 0x00000440) + { + spellId = SPELL_DRUID_BLESSING_OF_CENARIUS; + chance = 40; + } + else + return; + + if (roll_chance_i(chance)) + eventInfo.GetActor()->CastSpell((Unit*)nullptr, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_item_t6_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_item_t6_trinket_AuraScript(); + } +}; + // 67353 - T9 Feral Relic (Idol of Mutilation) class spell_dru_t9_feral_relic : public SpellScriptLoader { @@ -1307,6 +1950,55 @@ public: } }; +// 70723 - Item - Druid T10 Balance 4P Bonus +class spell_dru_t10_balance_4p_bonus : public SpellScriptLoader +{ + public: + spell_dru_t10_balance_4p_bonus() : SpellScriptLoader("spell_dru_t10_balance_4p_bonus") { } + + class spell_dru_t10_balance_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t10_balance_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LANGUISH)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DRUID_LANGUISH); + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + // Add remaining ticks to damage done + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_DRUID_LANGUISH, SPELL_AURA_PERIODIC_DAMAGE); + + caster->CastCustomSpell(SPELL_DRUID_LANGUISH, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_dru_t10_balance_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_t10_balance_4p_bonus_AuraScript(); + } +}; + // 70691 - Item T10 Restoration 4P Bonus class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader { @@ -1362,6 +2054,61 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader } }; +// 70664 - Druid T10 Restoration 4P Bonus (Rejuvenation) +class spell_dru_t10_restoration_4p_bonus_dummy : public SpellScriptLoader +{ + public: + spell_dru_t10_restoration_4p_bonus_dummy() : SpellScriptLoader("spell_dru_t10_restoration_4p_bonus_dummy") { } + + class spell_dru_t10_restoration_4p_bonus_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_dru_t10_restoration_4p_bonus_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_REJUVENATION_T10_PROC)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || spellInfo->Id == SPELL_DRUID_REJUVENATION_T10_PROC) + return false; + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return false; + + Player* caster = eventInfo.GetActor()->ToPlayer(); + if (!caster) + return false; + + return caster->GetGroup() || caster != eventInfo.GetProcTarget(); + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + int32 amount = static_cast<int32>(eventInfo.GetHealInfo()->GetHeal()); + eventInfo.GetActor()->CastCustomSpell(SPELL_DRUID_REJUVENATION_T10_PROC, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_dru_t10_restoration_4p_bonus_dummy_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_dru_t10_restoration_4p_bonus_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_dru_t10_restoration_4p_bonus_dummy_AuraScript(); + } +}; + class RaidCheck { public: @@ -1439,17 +2186,26 @@ void AddSC_druid_spell_scripts() new spell_dru_eclipse(); new spell_dru_enrage(); new spell_dru_forms_trinket(); + new spell_dru_flight_form(); + new spell_dru_glyph_of_innervate(); + new spell_dru_glyph_of_rake(); + new spell_dru_glyph_of_rejuvenation(); + new spell_dru_glyph_of_shred(); new spell_dru_glyph_of_starfire(); + new spell_dru_glyph_of_starfire_dummy(); new spell_dru_idol_lifebloom(); new spell_dru_innervate(); new spell_dru_insect_swarm(); + new spell_dru_leader_of_the_pack(); new spell_dru_lifebloom(); new spell_dru_living_seed(); new spell_dru_living_seed_proc(); new spell_dru_moonkin_form_passive(); + new spell_dru_omen_of_clarity(); new spell_dru_owlkin_frenzy(); new spell_dru_predatory_strikes(); new spell_dru_primal_tenacity(); + new spell_dru_revitalize(); new spell_dru_rip(); new spell_dru_savage_defense(); new spell_dru_savage_roar(); @@ -1457,10 +2213,16 @@ void AddSC_druid_spell_scripts() new spell_dru_starfall_dummy(); new spell_dru_survival_instincts(); new spell_dru_swift_flight_passive(); - new spell_dru_flight_form(); new spell_dru_tiger_s_fury(); new spell_dru_typhoon(); + new spell_dru_t3_2p_bonus(); + new spell_dru_t3_6p_bonus(); + new spell_dru_t3_8p_bonus(); + new spell_dru_t4_2p_bonus(); + new spell_dru_item_t6_trinket(); new spell_dru_t9_feral_relic(); + new spell_dru_t10_balance_4p_bonus(); new spell_dru_t10_restoration_4p_bonus(); + new spell_dru_t10_restoration_4p_bonus_dummy(); new spell_dru_wild_growth(); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 81da50635c3..b9c037466ee 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1443,51 +1443,6 @@ class spell_gen_ds_flush_knockback : public SpellScriptLoader } }; -enum DummyTrigger -{ - SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470, - SPELL_PERSISTANT_SHIELD = 26467 -}; - -class spell_gen_dummy_trigger : public SpellScriptLoader -{ - public: - spell_gen_dummy_trigger() : SpellScriptLoader("spell_gen_dummy_trigger") { } - - class spell_gen_dummy_trigger_SpellScript : public SpellScript - { - PrepareSpellScript(spell_gen_dummy_trigger_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD_TRIGGERED) || - !sSpellMgr->GetSpellInfo(SPELL_PERSISTANT_SHIELD)) - return false; - return true; - } - - void HandleDummy(SpellEffIndex /* effIndex */) - { - int32 damage = GetEffectValue(); - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - if (SpellInfo const* triggeredByAuraSpell = GetTriggeringSpell()) - if (triggeredByAuraSpell->Id == SPELL_PERSISTANT_SHIELD_TRIGGERED) - caster->CastCustomSpell(target, SPELL_PERSISTANT_SHIELD_TRIGGERED, &damage, NULL, NULL, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gen_dummy_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_gen_dummy_trigger_SpellScript(); - } -}; - class spell_gen_dungeon_credit : public SpellScriptLoader { public: @@ -2763,6 +2718,41 @@ class spell_gen_orc_disguise : public SpellScriptLoader } }; +class spell_gen_proc_below_pct_damaged : public SpellScriptLoader +{ + public: + spell_gen_proc_below_pct_damaged(const char* name) : SpellScriptLoader(name) { } + + class spell_gen_proc_below_pct_damaged_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_proc_below_pct_damaged_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return false; + + int32 pct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); + + if (eventInfo.GetActionTarget()->HealthBelowPctDamaged(pct, damageInfo->GetDamage())) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_gen_proc_below_pct_damaged_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_gen_proc_below_pct_damaged_AuraScript(); + } +}; + enum ParachuteSpells { SPELL_PARACHUTE = 45472, @@ -3535,6 +3525,53 @@ class spell_gen_upper_deck_create_foam_sword : public SpellScriptLoader } }; +enum VampiricTouch +{ + SPELL_VAMPIRIC_TOUCH_HEAL = 52724 +}; + +// 52723 - Vampiric Touch +// 60501 - Vampiric Touch +class spell_gen_vampiric_touch : public SpellScriptLoader +{ + public: + spell_gen_vampiric_touch() : SpellScriptLoader("spell_gen_vampiric_touch") { } + + class spell_gen_vampiric_touch_AuraScript : public AuraScript + { + PrepareAuraScript(spell_gen_vampiric_touch_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_VAMPIRIC_TOUCH_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + Unit* caster = eventInfo.GetActor(); + int32 bp = damageInfo->GetDamage() / 2; + caster->CastCustomSpell(SPELL_VAMPIRIC_TOUCH_HEAL, SPELLVALUE_BASE_POINT0, bp, caster, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_gen_vampiric_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_gen_vampiric_touch_AuraScript(); + } +}; + enum VehicleScaling { SPELL_GEAR_SCALING = 66668 @@ -4324,7 +4361,6 @@ void AddSC_generic_spell_scripts() new spell_gen_despawn_self(); new spell_gen_divine_storm_cd_reset(); new spell_gen_ds_flush_knockback(); - new spell_gen_dummy_trigger(); new spell_gen_dungeon_credit(); new spell_gen_elune_candle(); new spell_gen_gadgetzan_transporter_backfire(); @@ -4352,6 +4388,12 @@ void AddSC_generic_spell_scripts() new spell_gen_on_tournament_mount(); new spell_gen_oracle_wolvar_reputation(); new spell_gen_orc_disguise(); + new spell_gen_proc_below_pct_damaged("spell_item_soul_harvesters_charm"); + new spell_gen_proc_below_pct_damaged("spell_item_commendation_of_kaelthas"); + new spell_gen_proc_below_pct_damaged("spell_item_corpse_tongue_coin"); + new spell_gen_proc_below_pct_damaged("spell_item_corpse_tongue_coin_heroic"); + new spell_gen_proc_below_pct_damaged("spell_item_petrified_twilight_scale"); + new spell_gen_proc_below_pct_damaged("spell_item_petrified_twilight_scale_heroic"); new spell_gen_parachute(); new spell_gen_pet_summoned(); new spell_gen_profession_research(); @@ -4369,6 +4411,7 @@ void AddSC_generic_spell_scripts() new spell_pvp_trinket_wotf_shared_cd(); new spell_gen_turkey_marker(); new spell_gen_upper_deck_create_foam_sword(); + new spell_gen_vampiric_touch(); new spell_gen_vehicle_scaling(); new spell_gen_vendor_bark_trigger(); new spell_gen_wg_water(); diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index 84fe9297344..a6f9008955d 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -60,8 +60,14 @@ enum HunterSpells SPELL_HUNTER_VIPER_ATTACK_SPEED = 60144, SPELL_DRAENEI_GIFT_OF_THE_NAARU = 59543, SPELL_ROAR_OF_SACRIFICE_TRIGGERED = 67481, - SPELL_LOCK_AND_LOAD_TRIGGER = 56453, - SPELL_LOCK_AND_LOAD_MARKER = 67544 + SPELL_HUNTER_LOCK_AND_LOAD_TRIGGER = 56453, + SPELL_HUNTER_LOCK_AND_LOAD_MARKER = 67544, + SPELL_HUNTER_KILL_COMMAND_HUNTER = 34027, + SPELL_HUNTER_THRILL_OF_THE_HUNT_MANA = 34720, + SPELL_REPLENISHMENT = 57669, + SPELL_HUNTER_RAPID_RECUPERATION_MANA_R1 = 56654, + SPELL_HUNTER_RAPID_RECUPERATION_MANA_R2 = 58882, + SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS = 57894 }; // 13161 - Aspect of the Beast @@ -209,51 +215,56 @@ class spell_hun_chimera_shot : public SpellScriptLoader flag96 familyFlag = aura->GetSpellInfo()->SpellFamilyFlags; if (!(familyFlag[1] & 0x00000080 || familyFlag[0] & 0x0000C000)) continue; - if (AuraEffect* aurEff = aura->GetEffect(0)) + if (AuraEffect const* aurEff = aura->GetEffect(EFFECT_0)) { // Serpent Sting - Instantly deals 40% of the damage done by your Serpent Sting. if (familyFlag[0] & 0x4000) { - int32 TickCount = aurEff->GetTotalTicks(); spellId = SPELL_HUNTER_CHIMERA_SHOT_SERPENT; + + // first, calculate damage of basic tick (C&P from AuraEffect::HandlePeriodicDamageAurasTick) basePoint = (aurEff->GetAmount() + aurEff->GetBonusAmount()) * aurEff->GetDonePct(); - ApplyPct(basePoint, TickCount * 40); - basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount()); if (Player* modOwner = caster->GetSpellModOwner()) - modOwner->ApplySpellMod(aura->GetSpellInfo()->Id, SPELLMOD_DOT, basePoint); + modOwner->ApplySpellMod<SPELLMOD_DOT>(aurEff->GetSpellInfo()->Id, basePoint); + basePoint = unitTarget->SpellDamageBonusTaken(caster, aurEff->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount()); - aurEff->SetBonusAmount(caster->SpellDamageBonusDone(unitTarget, aurEff->GetSpellInfo(), 0, DOT)); + // then, multiply to get damage potential + basePoint *= aurEff->GetTotalTicks(); + ApplyPct(basePoint, 40); } // Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting. else if (familyFlag[1] & 0x00000080) { - int32 TickCount = aura->GetEffect(0)->GetTotalTicks(); spellId = SPELL_HUNTER_CHIMERA_SHOT_VIPER; - // Amount of one aura tick + // Amount of one aura tick (C&P from AuraEffect::HandlePeriodicManaLeechAuraTick) + basePoint = aurEff->GetAmount(); + // max value + int32 maxmana = CalculatePct(caster->GetMaxPower(POWER_MANA), basePoint * 2.0f); + ApplyPct(basePoint, caster->GetMaxPower(POWER_MANA)); + if (basePoint > maxmana) + basePoint = maxmana; + basePoint = int32(CalculatePct(unitTarget->GetMaxPower(POWER_MANA), aurEff->GetAmount())); - int32 casterBasePoint = aurEff->GetAmount() * unitTarget->GetMaxPower(POWER_MANA) / 50; /// @todo WTF? caster uses unitTarget? + int32 casterBasePoint = CalculatePct(caster->GetMaxPower(POWER_MANA), aurEff->GetAmount() * 2.0f); if (basePoint > casterBasePoint) basePoint = casterBasePoint; - ApplyPct(basePoint, TickCount * 60); + + basePoint *= aurEff->GetTotalTicks(); + ApplyPct(basePoint, 60); } // Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute. else if (familyFlag[0] & 0x00008000) spellId = SPELL_HUNTER_CHIMERA_SHOT_SCORPID; - // ?? nothing say in spell desc (possibly need addition check) - //if (familyFlag & 0x0000010000000000LL || // dot - // familyFlag & 0x0000100000000000LL) // stun - //{ - // spellId = 53366; // 53366 Chimera Shot - Wyvern - //} // Refresh aura duration aura->RefreshDuration(); } break; } + if (spellId) - caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, true); + caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, basePoint, unitTarget, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD)); if (spellId == SPELL_HUNTER_CHIMERA_SHOT_SCORPID && caster->ToPlayer()) // Scorpid Sting - Add 1 minute cooldown caster->GetSpellHistory()->AddCooldown(spellId, 0, std::chrono::minutes(1)); } @@ -364,6 +375,76 @@ class spell_hun_glyph_of_arcane_shot : public SpellScriptLoader } }; +// 57870 - Glyph of Mend Pet +class spell_hun_glyph_of_mend_pet : public SpellScriptLoader +{ + public: + spell_hun_glyph_of_mend_pet() : SpellScriptLoader("spell_hun_glyph_of_mend_pet") { } + + class spell_hun_glyph_of_mend_pet_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_glyph_of_mend_pet_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_HUNTER_GLYPH_OF_MEND_PET_HAPPINESS, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_glyph_of_mend_pet_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_glyph_of_mend_pet_AuraScript(); + } +}; + +// -53290 - Hunting Party +class spell_hun_hunting_party : public SpellScriptLoader +{ + public: + spell_hun_hunting_party() : SpellScriptLoader("spell_hun_hunting_party") { } + + class spell_hun_hunting_party_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_hunting_party_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_REPLENISHMENT, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_hunting_party_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_hunting_party_AuraScript(); + } +}; + // -19572 - Improved Mend Pet class spell_hun_improved_mend_pet : public SpellScriptLoader { @@ -442,6 +523,46 @@ class spell_hun_invigoration : public SpellScriptLoader } }; +// 58914 - Kill Command +class spell_hun_kill_command_pet : public SpellScriptLoader +{ + public: + spell_hun_kill_command_pet() : SpellScriptLoader("spell_hun_kill_command_pet") { } + + class spell_hun_kill_command_pet_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_kill_command_pet_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_KILL_COMMAND_HUNTER)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + // prevent charge drop (aura has both proc charge and stacks) + PreventDefaultAction(); + + if (Unit* owner = eventInfo.GetActor()->GetOwner()) + owner->RemoveAuraFromStack(SPELL_HUNTER_KILL_COMMAND_HUNTER); + + ModStackAmount(-1); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_kill_command_pet_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_kill_command_pet_AuraScript(); + } +}; + // 53478 - Last Stand Pet class spell_hun_last_stand_pet : public SpellScriptLoader { @@ -490,15 +611,15 @@ class spell_hun_lock_and_load : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) override { - if (!sSpellMgr->GetSpellInfo(SPELL_LOCK_AND_LOAD_TRIGGER) || - !sSpellMgr->GetSpellInfo(SPELL_LOCK_AND_LOAD_MARKER)) + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_LOCK_AND_LOAD_TRIGGER) || + !sSpellMgr->GetSpellInfo(SPELL_HUNTER_LOCK_AND_LOAD_MARKER)) return false; return true; } bool CheckProc(ProcEventInfo& eventInfo) { - if (eventInfo.GetActor()->HasAura(SPELL_LOCK_AND_LOAD_MARKER)) + if (eventInfo.GetActor()->HasAura(SPELL_HUNTER_LOCK_AND_LOAD_MARKER)) return false; return true; @@ -522,8 +643,8 @@ class spell_hun_lock_and_load : public SpellScriptLoader return; Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, SPELL_LOCK_AND_LOAD_TRIGGER, true); - caster->CastSpell(caster, SPELL_LOCK_AND_LOAD_MARKER, true); + caster->CastSpell(caster, SPELL_HUNTER_LOCK_AND_LOAD_TRIGGER, true); + caster->CastSpell(caster, SPELL_HUNTER_LOCK_AND_LOAD_MARKER, true); } void Register() override @@ -753,11 +874,13 @@ class spell_hun_pet_heart_of_the_phoenix : public SpellScriptLoader { Unit* caster = GetCaster(); if (Unit* owner = caster->GetOwner()) + { if (!caster->HasAura(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF)) { owner->CastCustomSpell(SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED, SPELLVALUE_BASE_POINT0, 100, caster, true); caster->CastSpell(caster, SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_DEBUFF, true); } + } } void Register() override @@ -868,6 +991,64 @@ class spell_hun_rapid_recuperation : public SpellScriptLoader } }; +// -53228 - Rapid Recuperation (talent aura) +class spell_hun_rapid_recuperation_trigger : public SpellScriptLoader +{ + public: + spell_hun_rapid_recuperation_trigger() : SpellScriptLoader("spell_hun_rapid_recuperation_trigger") { } + + class spell_hun_rapid_recuperation_trigger_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_rapid_recuperation_trigger_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_RAPID_RECUPERATION_MANA_R1) || + !sSpellMgr->GetSpellInfo(SPELL_HUNTER_RAPID_RECUPERATION_MANA_R2)) + return false; + return true; + } + + void HandleRapidFireProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + // Proc only from Rapid Fire + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 0x00000020)) + { + PreventDefaultAction(); + return; + } + } + + void HandleRapidKillingProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + static uint32 const triggerSpells[2] = { SPELL_HUNTER_RAPID_RECUPERATION_MANA_R1, SPELL_HUNTER_RAPID_RECUPERATION_MANA_R2 }; + + PreventDefaultAction(); + + // Proc only from Rapid Killing + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || !(spellInfo->SpellFamilyFlags[1] & 0x01000000)) + return; + + uint8 rank = GetSpellInfo()->GetRank(); + uint32 spellId = triggerSpells[rank - 1]; + eventInfo.GetActor()->CastSpell((Unit*)nullptr, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_rapid_recuperation_trigger_AuraScript::HandleRapidFireProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectProc += AuraEffectProcFn(spell_hun_rapid_recuperation_trigger_AuraScript::HandleRapidKillingProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_rapid_recuperation_trigger_AuraScript(); + } +}; + // 23989 - Readiness class spell_hun_readiness : public SpellScriptLoader { @@ -1135,6 +1316,64 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader } }; +// -34497 - Thrill of the Hunt +class spell_hun_thrill_of_the_hunt : public SpellScriptLoader +{ + public: + spell_hun_thrill_of_the_hunt() : SpellScriptLoader("spell_hun_thrill_of_the_hunt") { } + + class spell_hun_thrill_of_the_hunt_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_thrill_of_the_hunt_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_THRILL_OF_THE_HUNT_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + Unit* caster = eventInfo.GetActor(); + int32 amount = 0; + + // Explosive Shot + if (spellInfo->SpellFamilyFlags[2] & 0x200) + { + if (AuraEffect const* explosiveShot = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x00000000, 0x80000000, 0x00000000, caster->GetGUID())) + { + // due to Lock and Load SpellInfo::CalcPowerCost might return 0, so just calculate it manually + amount = CalculatePct(static_cast<int32>(CalculatePct(caster->GetCreateMana(), explosiveShot->GetSpellInfo()->ManaCostPercentage)), aurEff->GetAmount()); + amount /= explosiveShot->GetSpellInfo()->GetMaxTicks(); + } + } + else + amount = CalculatePct(static_cast<int32>(spellInfo->CalcPowerCost(caster, spellInfo->GetSchoolMask())), aurEff->GetAmount()); + + if (!amount) + return; + + caster->CastCustomSpell(SPELL_HUNTER_THRILL_OF_THE_HUNT_MANA, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_hun_thrill_of_the_hunt_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_thrill_of_the_hunt_AuraScript(); + } +}; + // 67151 - T9 4P Bonus class spell_hun_t9_4p_bonus : public SpellScriptLoader { @@ -1230,8 +1469,11 @@ void AddSC_hunter_spell_scripts() new spell_hun_chimera_shot(); new spell_hun_disengage(); new spell_hun_glyph_of_arcane_shot(); + new spell_hun_glyph_of_mend_pet(); + new spell_hun_hunting_party(); new spell_hun_improved_mend_pet(); new spell_hun_invigoration(); + new spell_hun_kill_command_pet(); new spell_hun_last_stand_pet(); new spell_hun_lock_and_load(); new spell_hun_masters_call(); @@ -1241,12 +1483,14 @@ void AddSC_hunter_spell_scripts() new spell_hun_pet_heart_of_the_phoenix(); new spell_hun_piercing_shots(); new spell_hun_rapid_recuperation(); + new spell_hun_rapid_recuperation_trigger(); new spell_hun_readiness(); new spell_hun_roar_of_sacrifice(); new spell_hun_scatter_shot(); new spell_hun_sniper_training(); new spell_hun_tame_beast(); new spell_hun_target_only_pet_and_owner(); + new spell_hun_thrill_of_the_hunt(); new spell_hun_t9_4p_bonus(); new spell_hun_viper_attack_speed(); } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 88f0899ee22..0db0be0ef9c 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -115,6 +115,143 @@ class spell_item_aegis_of_preservation : public SpellScriptLoader } }; +enum AlchemistStone +{ + SPELL_ALCHEMISTS_STONE_EXTRA_HEAL = 21399, + SPELL_ALCHEMISTS_STONE_EXTRA_MANA = 21400 +}; + +// Item - 13503: Alchemist's Stone +// Item - 35748: Guardian's Alchemist Stone +// Item - 35749: Sorcerer's Alchemist Stone +// Item - 35750: Redeemer's Alchemist Stone +// Item - 35751: Assassin's Alchemist Stone +// Item - 44322: Mercurial Alchemist Stone +// Item - 44323: Indestructible Alchemist's Stone +// Item - 44324: Mighty Alchemist's Stone + +// 17619 - Alchemist's Stone +class spell_item_alchemists_stone : public SpellScriptLoader +{ + public: + spell_item_alchemists_stone() : SpellScriptLoader("spell_item_alchemists_stone") { } + + class spell_item_alchemists_stone_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_alchemists_stone_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ALCHEMISTS_STONE_EXTRA_HEAL) || + !sSpellMgr->GetSpellInfo(SPELL_ALCHEMISTS_STONE_EXTRA_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + Unit* caster = eventInfo.GetActionTarget(); + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + uint32 spellId; + switch (spellInfo->Effects[i].Effect) + { + case SPELL_EFFECT_HEAL: + spellId = SPELL_ALCHEMISTS_STONE_EXTRA_HEAL; + break; + case SPELL_EFFECT_ENERGIZE: + spellId = SPELL_ALCHEMISTS_STONE_EXTRA_MANA; + break; + default: + continue; + } + + int32 amount = CalculatePct(spellInfo->Effects[i].CalcValue(caster), 40); + caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_alchemists_stone_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_alchemists_stone_AuraScript(); + } +}; + +enum AngerCapacitor +{ + SPELL_MOTE_OF_ANGER = 71432, + SPELL_MANIFEST_ANGER_MAIN_HAND = 71433, + SPELL_MANIFEST_ANGER_OFF_HAND = 71434 +}; + +// Item - 50351: Tiny Abomination in a Jar +// 71406 - Anger Capacitor + +// Item - 50706: Tiny Abomination in a Jar (Heroic) +// 71545 - Anger Capacitor +template <uint8 StackAmount> +class spell_item_anger_capacitor : public SpellScriptLoader +{ + public: + spell_item_anger_capacitor(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint8 Stacks> + class spell_item_anger_capacitor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_anger_capacitor_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MOTE_OF_ANGER) || + !sSpellMgr->GetSpellInfo(SPELL_MANIFEST_ANGER_MAIN_HAND) || + !sSpellMgr->GetSpellInfo(SPELL_MANIFEST_ANGER_OFF_HAND)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + caster->CastSpell((Unit*)nullptr, SPELL_MOTE_OF_ANGER, true); + Aura const* motes = caster->GetAura(SPELL_MOTE_OF_ANGER); + if (!motes || motes->GetStackAmount() < Stacks) + return; + + caster->RemoveAurasDueToSpell(SPELL_MOTE_OF_ANGER); + uint32 spellId = SPELL_MANIFEST_ANGER_MAIN_HAND; + if (Player* player = caster->ToPlayer()) + if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1)) + spellId = SPELL_MANIFEST_ANGER_OFF_HAND; + + caster->CastSpell(target, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_anger_capacitor_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_anger_capacitor_AuraScript<StackAmount>(); + } +}; + // 26400 - Arcane Shroud class spell_item_arcane_shroud : public SpellScriptLoader { @@ -144,6 +281,138 @@ class spell_item_arcane_shroud : public SpellScriptLoader } }; +enum AuraOfMadness +{ + SPELL_SOCIOPATH = 39511, // Sociopath: +35 strength(Paladin, Rogue, Druid, Warrior) + SPELL_DELUSIONAL = 40997, // Delusional: +70 attack power(Rogue, Hunter, Paladin, Warrior, Druid) + SPELL_KLEPTOMANIA = 40998, // Kleptomania: +35 agility(Warrior, Rogue, Paladin, Hunter, Druid) + SPELL_MEGALOMANIA = 40999, // Megalomania: +41 damage / healing(Druid, Shaman, Priest, Warlock, Mage, Paladin) + SPELL_PARANOIA = 41002, // Paranoia: +35 spell / melee / ranged crit strike rating(All classes) + SPELL_MANIC = 41005, // Manic: +35 haste(spell, melee and ranged) (All classes) + SPELL_NARCISSISM = 41009, // Narcissism: +35 intellect(Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter) + SPELL_MARTYR_COMPLEX = 41011, // Martyr Complex: +35 stamina(All classes) + SPELL_DEMENTIA = 41404, // Dementia: Every 5 seconds either gives you +5/-5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin) + + SPELL_DEMENTIA_POS = 41406, + SPELL_DEMENTIA_NEG = 41409, + + SAY_MADNESS = 21954 +}; + +// Item - 31859: Darkmoon Card: Madness +// 39446 - Aura of Madness +class spell_item_aura_of_madness : public SpellScriptLoader +{ + public: + spell_item_aura_of_madness() : SpellScriptLoader("spell_item_aura_of_madness") { } + + class spell_item_aura_of_madness_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_aura_of_madness_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SOCIOPATH) || + !sSpellMgr->GetSpellInfo(SPELL_DELUSIONAL) || + !sSpellMgr->GetSpellInfo(SPELL_KLEPTOMANIA) || + !sSpellMgr->GetSpellInfo(SPELL_MEGALOMANIA) || + !sSpellMgr->GetSpellInfo(SPELL_PARANOIA) || + !sSpellMgr->GetSpellInfo(SPELL_MANIC) || + !sSpellMgr->GetSpellInfo(SPELL_NARCISSISM) || + !sSpellMgr->GetSpellInfo(SPELL_MARTYR_COMPLEX) || + !sSpellMgr->GetSpellInfo(SPELL_DEMENTIA) || + !sObjectMgr->GetBroadcastText(SAY_MADNESS)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + static std::vector<uint32> const triggeredSpells[MAX_CLASSES] = + { + //CLASS_NONE + { }, + //CLASS_WARRIOR + { SPELL_SOCIOPATH, SPELL_DELUSIONAL, SPELL_KLEPTOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_MARTYR_COMPLEX }, + //CLASS_PALADIN + { SPELL_SOCIOPATH, SPELL_DELUSIONAL, SPELL_KLEPTOMANIA, SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA }, + //CLASS_HUNTER + { SPELL_DELUSIONAL, SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA }, + //CLASS_ROGUE + { SPELL_SOCIOPATH, SPELL_DELUSIONAL, SPELL_KLEPTOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_MARTYR_COMPLEX }, + //CLASS_PRIEST + { SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA }, + //CLASS_DEATH_KNIGHT + { SPELL_SOCIOPATH, SPELL_DELUSIONAL, SPELL_KLEPTOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_MARTYR_COMPLEX }, + //CLASS_SHAMAN + { SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA }, + //CLASS_MAGE + { SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA }, + //CLASS_WARLOCK + { SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA }, + //CLASS_UNK + { }, + //CLASS_DRUID + { SPELL_SOCIOPATH, SPELL_DELUSIONAL, SPELL_KLEPTOMANIA, SPELL_MEGALOMANIA, SPELL_PARANOIA, SPELL_MANIC, SPELL_NARCISSISM, SPELL_MARTYR_COMPLEX, SPELL_DEMENTIA } + }; + + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + uint32 spellId = Trinity::Containers::SelectRandomContainerElement(triggeredSpells[caster->getClass()]); + caster->CastSpell(caster, spellId, true); + + if (roll_chance_i(10)) + caster->Unit::Say(SAY_MADNESS); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_aura_of_madness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_aura_of_madness_AuraScript(); + } +}; + +// 41404 - Dementia +class spell_item_dementia : public SpellScriptLoader +{ + public: + spell_item_dementia() : SpellScriptLoader("spell_item_dementia") { } + + class spell_item_dementia_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_dementia_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DEMENTIA_POS) || + !sSpellMgr->GetSpellInfo(SPELL_DEMENTIA_NEG)) + return false; + return true; + } + + void HandlePeriodicDummy(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), RAND(SPELL_DEMENTIA_POS, SPELL_DEMENTIA_NEG), true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_item_dementia_AuraScript::HandlePeriodicDummy, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_dementia_AuraScript(); + } +}; + // 64411 - Blessing of Ancient Kings (Val'anyr, Hammer of Ancient Kings) enum BlessingOfAncientKings { @@ -175,7 +444,11 @@ class spell_item_blessing_of_ancient_kings : public SpellScriptLoader { PreventDefaultAction(); - int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f)); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 absorb = int32(CalculatePct(healInfo->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 @@ -201,6 +474,168 @@ class spell_item_blessing_of_ancient_kings : public SpellScriptLoader } }; +enum DeadlyPrecision +{ + SPELL_DEADLY_PRECISION = 71564 +}; + +// 71564 - Deadly Precision +class spell_item_deadly_precision : public SpellScriptLoader +{ + public: + spell_item_deadly_precision() : SpellScriptLoader("spell_item_deadly_precision") { } + + class spell_item_deadly_precision_charm_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_deadly_precision_charm_AuraScript); + + void HandleStackDrop(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->RemoveAuraFromStack(GetId(), GetTarget()->GetGUID()); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_deadly_precision_charm_AuraScript::HandleStackDrop, EFFECT_0, SPELL_AURA_MOD_RATING); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_deadly_precision_charm_AuraScript(); + } +}; + +// 71563 - Deadly Precision Dummy +class spell_item_deadly_precision_dummy : public SpellScriptLoader +{ + public: + spell_item_deadly_precision_dummy() : SpellScriptLoader("spell_item_deadly_precision_dummy") { } + + class spell_item_deadly_precision_dummy_SpellScript : public SpellScript + { + PrepareSpellScript(spell_item_deadly_precision_dummy_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DEADLY_PRECISION)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_DEADLY_PRECISION); + GetCaster()->CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_STACK, spellInfo->StackAmount, GetCaster(), true); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_item_deadly_precision_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_item_deadly_precision_dummy_SpellScript(); + } +}; + +enum DeathbringersWill +{ + SPELL_STRENGTH_OF_THE_TAUNKA = 71484, // +600 Strength + SPELL_AGILITY_OF_THE_VRYKUL = 71485, // +600 Agility + SPELL_POWER_OF_THE_TAUNKA = 71486, // +1200 Attack Power + SPELL_AIM_OF_THE_IRON_DWARVES = 71491, // +600 Critical + SPELL_SPEED_OF_THE_VRYKUL = 71492, // +600 Haste + + SPELL_AGILITY_OF_THE_VRYKUL_HERO = 71556, // +700 Agility + SPELL_POWER_OF_THE_TAUNKA_HERO = 71558, // +1400 Attack Power + SPELL_AIM_OF_THE_IRON_DWARVES_HERO = 71559, // +700 Critical + SPELL_SPEED_OF_THE_VRYKUL_HERO = 71560, // +700 Haste + SPELL_STRENGTH_OF_THE_TAUNKA_HERO = 71561 // +700 Strength +}; + +// Item - 50362: Deathbringer's Will +// 71519 - Item - Icecrown 25 Normal Melee Trinket + +// Item - 50363: Deathbringer's Will +// 71562 - Item - Icecrown 25 Heroic Melee Trinket +template <uint32 StrengthSpellId, uint32 AgilitySpellId, uint32 APSpellId, uint32 CriticalSpellId, uint32 HasteSpellId> +class spell_item_deathbringers_will : public SpellScriptLoader +{ + public: + spell_item_deathbringers_will(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint32 Strength, uint32 Agility, uint32 AttackPower, uint32 Critical, uint32 Haste> + class spell_item_deathbringers_will_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_deathbringers_will_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(Strength) || + !sSpellMgr->GetSpellInfo(Agility) || + !sSpellMgr->GetSpellInfo(AttackPower) || + !sSpellMgr->GetSpellInfo(Critical) || + !sSpellMgr->GetSpellInfo(Haste)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + static std::vector<uint32> const triggeredSpells[MAX_CLASSES] = + { + //CLASS_NONE + { }, + //CLASS_WARRIOR + { Strength, Critical, Haste }, + //CLASS_PALADIN + { Strength, Critical, Haste }, + //CLASS_HUNTER + { Agility, Critical, AttackPower }, + //CLASS_ROGUE + { Agility, Haste, AttackPower }, + //CLASS_PRIEST + { }, + //CLASS_DEATH_KNIGHT + { Strength, Critical, Haste }, + //CLASS_SHAMAN + { Agility, Haste, AttackPower }, + //CLASS_MAGE + { }, + //CLASS_WARLOCK + { }, + //CLASS_UNK + { }, + //CLASS_DRUID + { Strength, Agility, Haste } + }; + + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + auto const& randomSpells = triggeredSpells[caster->getClass()]; + if (randomSpells.empty()) + return; + + uint32 spellId = Trinity::Containers::SelectRandomContainerElement(randomSpells); + caster->CastSpell(caster, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_deathbringers_will_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_deathbringers_will_AuraScript<StrengthSpellId, AgilitySpellId, APSpellId, CriticalSpellId, HasteSpellId>(); + } +}; + // 47770 - Roll Dice class spell_item_decahedral_dwarven_dice : public SpellScriptLoader { @@ -400,6 +835,46 @@ class spell_item_deviate_fish : public SpellScriptLoader } }; +enum DiscerningEyeBeastMisc +{ + SPELL_DISCERNING_EYE_BEAST = 59914 +}; + +// 59915 - Discerning Eye of the Beast Dummy +class spell_item_discerning_eye_beast_dummy : public SpellScriptLoader +{ + public: + spell_item_discerning_eye_beast_dummy() : SpellScriptLoader("spell_item_discerning_eye_beast_dummy") { } + + class spell_item_discerning_eye_beast_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_discerning_eye_beast_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DISCERNING_EYE_BEAST)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_DISCERNING_EYE_BEAST, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_discerning_eye_beast_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_discerning_eye_beast_dummy_AuraScript(); + } +}; + // 71610, 71641 - Echoes of Light (Althor's Abacus) class spell_item_echoes_of_light : public SpellScriptLoader { @@ -458,6 +933,7 @@ class spell_item_fate_rune_of_unsurpassed_vigor : public SpellScriptLoader void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) { + PreventDefaultAction(); GetTarget()->CastSpell(GetTarget(), SPELL_UNSURPASSED_VIGOR, true); } @@ -543,6 +1019,53 @@ class spell_item_flask_of_the_north : public SpellScriptLoader } }; +enum FrozenShadoweave +{ + SPELL_SHADOWMEND = 39373 +}; + +// 39372 - Frozen Shadoweave +// Frozen Shadoweave set 3p bonus +class spell_item_frozen_shadoweave : public SpellScriptLoader +{ + public: + spell_item_frozen_shadoweave() : SpellScriptLoader("spell_item_frozen_shadoweave") { } + + class spell_item_frozen_shadoweave_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_frozen_shadoweave_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMEND)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + Unit* caster = eventInfo.GetActor(); + caster->CastCustomSpell(SPELL_SHADOWMEND, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_frozen_shadoweave_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_frozen_shadoweave_AuraScript(); + } +}; + // http://www.wowhead.com/item=10645 Gnomish Death Ray // 13280 Gnomish Death Ray enum GnomishDeathRay @@ -591,6 +1114,158 @@ class spell_item_gnomish_death_ray : public SpellScriptLoader } }; +// Item 23004 - Idol of Longevity +// 28847 - Healing Touch Refund +enum IdolOfLongevity +{ + SPELL_HEALING_TOUCH_MANA = 28848 +}; + +class spell_item_healing_touch_refund : public SpellScriptLoader +{ + public: + spell_item_healing_touch_refund() : SpellScriptLoader("spell_item_healing_touch_refund") { } + + class spell_item_healing_touch_refund_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_healing_touch_refund_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HEALING_TOUCH_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_HEALING_TOUCH_MANA, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_healing_touch_refund_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_healing_touch_refund_AuraScript(); + } +}; + +enum Heartpierce +{ + SPELL_INVIGORATION_MANA = 71881, + SPELL_INVIGORATION_ENERGY = 71882, + SPELL_INVIGORATION_RAGE = 71883, + SPELL_INVIGORATION_RP = 71884, + + SPELL_INVIGORATION_RP_HERO = 71885, + SPELL_INVIGORATION_RAGE_HERO = 71886, + SPELL_INVIGORATION_ENERGY_HERO = 71887, + SPELL_INVIGORATION_MANA_HERO = 71888 +}; + +// Item - 49982: Heartpierce +// 71880 - Item - Icecrown 25 Normal Dagger Proc + +// Item - 50641: Heartpierce (Heroic) +// 71892 - Item - Icecrown 25 Heroic Dagger Proc +template <uint32 EnergySpellId, uint32 ManaSpellId, uint32 RageSpellId, uint32 RPSpellId> +class spell_item_heartpierce : public SpellScriptLoader +{ + public: + spell_item_heartpierce(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint32 Energy, uint32 Mana, uint32 Rage, uint32 RunicPower> + class spell_item_heartpierce_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_heartpierce_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(Energy) || + !sSpellMgr->GetSpellInfo(Mana) || + !sSpellMgr->GetSpellInfo(Rage) || + !sSpellMgr->GetSpellInfo(RunicPower)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + + uint32 spellId; + switch (caster->getPowerType()) + { + case POWER_MANA: + spellId = Mana; + break; + case POWER_ENERGY: + spellId = Energy; + break; + case POWER_RAGE: + spellId = Rage; + break; + case POWER_RUNIC_POWER: + spellId = RunicPower; + break; + default: + return; + } + + caster->CastSpell((Unit*)nullptr, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_heartpierce_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_heartpierce_AuraScript<EnergySpellId, ManaSpellId, RageSpellId, RPSpellId>(); + } +}; + +// 40971 - Bonus Healing (Crystal Spire of Karabor) +class spell_item_crystal_spire_of_karabor : public SpellScriptLoader +{ + public: + spell_item_crystal_spire_of_karabor() : SpellScriptLoader("spell_item_crystal_spire_of_karabor") { } + + class spell_item_crystal_spire_of_karabor_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_crystal_spire_of_karabor_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + int32 pct = GetSpellInfo()->Effects[EFFECT_0].BasePoints; + if (HealInfo* healInfo = eventInfo.GetHealInfo()) + if (Unit* healTarget = healInfo->GetTarget()) + if (healTarget->GetHealth() - healInfo->GetEffectiveHeal() <= healTarget->CountPctFromMaxHealth(pct)) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_item_crystal_spire_of_karabor_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_crystal_spire_of_karabor_AuraScript(); + } +}; + // http://www.wowhead.com/item=27388 Mr. Pinchy // 33060 Make a Wish enum MakeAWish @@ -649,6 +1324,53 @@ class spell_item_make_a_wish : public SpellScriptLoader } }; +enum MarkOfConquest +{ + SPELL_MARK_OF_CONQUEST_ENERGIZE = 39599 +}; + +// Item - 27920: Mark of Conquest +// Item - 27921: Mark of Conquest +// 33510 - Health Restore +class spell_item_mark_of_conquest : public SpellScriptLoader +{ + public: + spell_item_mark_of_conquest() : SpellScriptLoader("spell_item_mark_of_conquest") { } + + class spell_item_mark_of_conquest_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_mark_of_conquest_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_CONQUEST_ENERGIZE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + if (eventInfo.GetTypeMask() & (PROC_FLAG_DONE_RANGED_AUTO_ATTACK | PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS)) + { + // in that case, do not cast heal spell + PreventDefaultAction(); + // but mana instead + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_MARK_OF_CONQUEST_ENERGIZE, true); + } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_mark_of_conquest_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_mark_of_conquest_AuraScript(); + } +}; + // http://www.wowhead.com/item=32686 Mingo's Fortune Giblets // 40802 Mingo's Fortune Generator class spell_item_mingos_fortune_generator : public SpellScriptLoader @@ -859,6 +1581,138 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader } }; +// 29601 - Enlightenment (Pendant of the Violet Eye) +class spell_item_pendant_of_the_violet_eye : public SpellScriptLoader +{ + public: + spell_item_pendant_of_the_violet_eye() : SpellScriptLoader("spell_item_pendant_of_the_violet_eye") { } + + class spell_item_pendant_of_the_violet_eye_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_pendant_of_the_violet_eye_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + return spellInfo->PowerType == POWER_MANA || (spellInfo->ManaCost != 0 && spellInfo->ManaCostPercentage != 0 && spellInfo->ManaCostPerlevel != 0); + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_item_pendant_of_the_violet_eye_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_pendant_of_the_violet_eye_AuraScript(); + } +}; + +enum PersistentShieldMisc +{ + SPELL_PERSISTENT_SHIELD_TRIGGERED = 26470 +}; + +// 26467 - Persistent Shield +class spell_item_persistent_shield : public SpellScriptLoader +{ + public: + spell_item_persistent_shield() : SpellScriptLoader("spell_item_persistent_shield") { } + + class spell_item_persistent_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_persistent_shield_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PERSISTENT_SHIELD_TRIGGERED)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetHealInfo() && eventInfo.GetHealInfo()->GetHeal(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + int32 bp0 = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15); + + // Scarab Brooch does not replace stronger shields + if (AuraEffect const* shield = target->GetAuraEffect(SPELL_PERSISTENT_SHIELD_TRIGGERED, EFFECT_0, caster->GetGUID())) + if (shield->GetAmount() > bp0) + return; + + caster->CastCustomSpell(SPELL_PERSISTENT_SHIELD_TRIGGERED, SPELLVALUE_BASE_POINT0, bp0, target, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_item_persistent_shield_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_persistent_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_persistent_shield_AuraScript(); + } +}; + +enum PetHealing +{ + SPELL_HEALTH_LINK = 37382 +}; + +// 37381 - Pet Healing +// Hunter T5 2P Bonus +// Warlock T5 2P Bonus +class spell_item_pet_healing : public SpellScriptLoader +{ + public: + spell_item_pet_healing() : SpellScriptLoader("spell_item_pet_healing") { } + + class spell_item_pet_healing_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_pet_healing_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HEALTH_LINK)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 bp = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + Unit* caster = eventInfo.GetActor(); + caster->CastCustomSpell(SPELL_HEALTH_LINK, SPELLVALUE_BASE_POINT0, bp, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_pet_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_pet_healing_AuraScript(); + } +}; + // 17512 - Piccolo of the Flaming Fire class spell_item_piccolo_of_the_flaming_fire : public SpellScriptLoader { @@ -1286,6 +2140,91 @@ class spell_item_six_demon_bag : public SpellScriptLoader } }; +enum SwiftHandJusticeMisc +{ + SPELL_SWIFT_HAND_OF_JUSTICE_HEAL = 59913 +}; + +// 59906 - Swift Hand of Justice Dummy +class spell_item_swift_hand_justice_dummy : public SpellScriptLoader +{ + public: + spell_item_swift_hand_justice_dummy() : SpellScriptLoader("spell_item_swift_hand_justice_dummy") { } + + class spell_item_swift_hand_justice_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_swift_hand_justice_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SWIFT_HAND_OF_JUSTICE_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + int32 amount = caster->CountPctFromMaxHealth(aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_SWIFT_HAND_OF_JUSTICE_HEAL, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_swift_hand_justice_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_swift_hand_justice_dummy_AuraScript(); + } +}; + +enum TotemOfFlowingWater +{ + SPELL_LESSER_HEALING_WAVE_MANA = 28850 +}; + +// Item - 23005: Totem of Flowing Water +// 28849 - Lesser Healing Wave +class spell_item_totem_of_flowing_water : public SpellScriptLoader +{ + public: + spell_item_totem_of_flowing_water() : SpellScriptLoader("spell_item_totem_of_flowing_water") { } + + class spell_item_totem_of_flowing_water_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_totem_of_flowing_water_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_LESSER_HEALING_WAVE_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_LESSER_HEALING_WAVE_MANA, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_totem_of_flowing_water_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_totem_of_flowing_water_AuraScript(); + } + +}; + // 28862 - The Eye of Diminution class spell_item_the_eye_of_diminution : public SpellScriptLoader { @@ -2731,6 +3670,64 @@ public: } }; +enum ShardOfTheScale +{ + SPELL_PURIFIED_CAUTERIZING_HEAL = 69733, + SPELL_PURIFIED_SEARING_FLAMES = 69729, + + SPELL_SHINY_CAUTERIZING_HEAL = 69734, + SPELL_SHINY_SEARING_FLAMES = 69730 +}; + +// Item - 49310: Purified Shard of the Scale +// 69755 - Purified Shard of the Scale - Equip Effect + +// Item - 49488: Shiny Shard of the Scale +// 69739 - Shiny Shard of the Scale - Equip Effect +template <uint32 HealProcSpellId, uint32 DamageProcSpellId> +class spell_item_shard_of_the_scale : public SpellScriptLoader +{ + public: + spell_item_shard_of_the_scale(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint32 HealProc, uint32 DamageProc> + class spell_item_shard_of_the_scale_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_shard_of_the_scale_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(HealProc) || + !sSpellMgr->GetSpellInfo(DamageProc)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) + caster->CastSpell(target, HealProc, true); + + if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG) + caster->CastSpell(target, DamageProc, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_item_shard_of_the_scale_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_shard_of_the_scale_AuraScript<HealProcSpellId, DamageProcSpellId>(); + } +}; + enum SoulPreserver { SPELL_SOUL_PRESERVER_DRUID = 60512, @@ -2795,6 +3792,90 @@ public: } }; +enum ExaltedSunwellNeck +{ + SPELL_LIGHTS_WRATH = 45479, // Light's Wrath if Exalted by Aldor + SPELL_ARCANE_BOLT = 45429, // Arcane Bolt if Exalted by Scryers + + SPELL_LIGHTS_STRENGTH = 45480, // Light's Strength if Exalted by Aldor + SPELL_ARCANE_STRIKE = 45428, // Arcane Strike if Exalted by Scryers + + SPELL_LIGHTS_WARD = 45432, // Light's Ward if Exalted by Aldor + SPELL_ARCANE_INSIGHT = 45431, // Arcane Insight if Exalted by Scryers + + SPELL_LIGHTS_SALVATION = 45478, // Light's Salvation if Exalted by Aldor + SPELL_ARCANE_SURGE = 45430, // Arcane Surge if Exalted by Scryers + + FACTION_ALDOR = 932, + FACTION_SCRYERS = 934 +}; + +// Item - 34678: Shattered Sun Pendant of Acumen +// 45481 - Sunwell Exalted Caster Neck + +// Item - 34679: Shattered Sun Pendant of Might +// 45482 - Sunwell Exalted Melee Neck + +// Item - 34680: Shattered Sun Pendant of Resolve +// 45483 - Sunwell Exalted Tank Neck + +// Item - 34677: Shattered Sun Pendant of Restoration +// 45484 Sunwell Exalted Healer Neck +template <uint32 AldorSpellId, uint32 ScryersSpellId> +class spell_item_sunwell_neck : public SpellScriptLoader +{ + public: + spell_item_sunwell_neck(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint32 Aldors, uint32 Scryers> + class spell_item_sunwell_neck_AuraScript : public AuraScript + { + PrepareAuraScript(spell_item_sunwell_neck_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sFactionStore.LookupEntry(FACTION_ALDOR) || + !sFactionStore.LookupEntry(FACTION_SCRYERS) || + !sSpellMgr->GetSpellInfo(Aldors) || + !sSpellMgr->GetSpellInfo(Scryers)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetActor()->GetTypeId() != TYPEID_PLAYER) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Player* player = eventInfo.GetActor()->ToPlayer(); + Unit* target = eventInfo.GetProcTarget(); + + // Aggression checks are in the spell system... just cast and forget + if (player->GetReputationRank(FACTION_ALDOR) == REP_EXALTED) + player->CastSpell(target, Aldors, true); + + if (player->GetReputationRank(FACTION_SCRYERS) == REP_EXALTED) + player->CastSpell(target, Scryers, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_item_sunwell_neck_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_sunwell_neck_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_sunwell_neck_AuraScript<AldorSpellId, ScryersSpellId>(); + } +}; + class spell_item_toy_train_set_pulse : public SpellScriptLoader { public: @@ -3226,6 +4307,69 @@ class spell_item_taunt_flag_targeting : public SpellScriptLoader } }; +enum ZandalarianCharms +{ + SPELL_UNSTABLE_POWER_AURA_STACK = 24659, + SPELL_RESTLESS_STRENGTH_AURA_STACK = 24662 +}; + +// Item - 19950: Zandalarian Hero Charm +// 24658 - Unstable Power + +// Item - 19949: Zandalarian Hero Medallion +// 24661 - Restless Strength +class spell_item_zandalarian_charm : public SpellScriptLoader +{ + public: + spell_item_zandalarian_charm(char const* ScriptName, uint32 SpellId) : SpellScriptLoader(ScriptName), _spellId(SpellId) { } + + class spell_item_zandalarian_charm_AuraScript : public AuraScript + { + friend class spell_item_zandalarian_charm; + spell_item_zandalarian_charm_AuraScript(uint32 SpellId) : AuraScript(), _spellId(SpellId) { } + + PrepareAuraScript(spell_item_zandalarian_charm_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(_spellId)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (spellInfo->Id != m_scriptSpellId) + return true; + + return false; + } + + void HandleStackDrop(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->RemoveAuraFromStack(_spellId); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_item_zandalarian_charm_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_item_zandalarian_charm_AuraScript::HandleStackDrop, EFFECT_0, SPELL_AURA_DUMMY); + } + + uint32 _spellId; + }; + + AuraScript* GetAuraScript() const override + { + return new spell_item_zandalarian_charm_AuraScript(_spellId); + } + + private: + uint32 _spellId; +}; + void AddSC_item_spell_scripts() { // 23074 Arcanite Dragonling @@ -3239,22 +4383,41 @@ void AddSC_item_spell_scripts() new spell_item_aegis_of_preservation(); new spell_item_arcane_shroud(); + new spell_item_alchemists_stone(); + new spell_item_anger_capacitor<8>("spell_item_tiny_abomination_in_a_jar"); + new spell_item_anger_capacitor<7>("spell_item_tiny_abomination_in_a_jar_hero"); + new spell_item_aura_of_madness(); + new spell_item_dementia(); new spell_item_blessing_of_ancient_kings(); + new spell_item_deadly_precision(); + new spell_item_deadly_precision_dummy(); + new spell_item_deathbringers_will<SPELL_STRENGTH_OF_THE_TAUNKA, SPELL_AGILITY_OF_THE_VRYKUL, SPELL_POWER_OF_THE_TAUNKA, SPELL_AIM_OF_THE_IRON_DWARVES, SPELL_SPEED_OF_THE_VRYKUL>("spell_item_deathbringers_will_normal"); + new spell_item_deathbringers_will<SPELL_STRENGTH_OF_THE_TAUNKA_HERO, SPELL_AGILITY_OF_THE_VRYKUL_HERO, SPELL_POWER_OF_THE_TAUNKA_HERO, SPELL_AIM_OF_THE_IRON_DWARVES_HERO, SPELL_SPEED_OF_THE_VRYKUL_HERO>("spell_item_deathbringers_will_heroic"); new spell_item_decahedral_dwarven_dice(); 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_desperate_defense(); new spell_item_deviate_fish(); + new spell_item_discerning_eye_beast_dummy(); new spell_item_echoes_of_light(); new spell_item_fate_rune_of_unsurpassed_vigor(); new spell_item_flask_of_the_north(); + new spell_item_frozen_shadoweave(); new spell_item_gnomish_death_ray(); + new spell_item_healing_touch_refund(); + new spell_item_heartpierce<SPELL_INVIGORATION_ENERGY, SPELL_INVIGORATION_MANA, SPELL_INVIGORATION_RAGE, SPELL_INVIGORATION_RP>("spell_item_heartpierce"); + new spell_item_heartpierce<SPELL_INVIGORATION_ENERGY_HERO, SPELL_INVIGORATION_MANA_HERO, SPELL_INVIGORATION_RAGE_HERO, SPELL_INVIGORATION_RP_HERO>("spell_item_heartpierce_hero"); + new spell_item_crystal_spire_of_karabor(); new spell_item_make_a_wish(); + new spell_item_mark_of_conquest(); 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_pendant_of_the_violet_eye(); + new spell_item_persistent_shield(); + new spell_item_pet_healing(); new spell_item_piccolo_of_the_flaming_fire(); new spell_item_savory_deviate_delight(); new spell_item_scroll_of_recall(); @@ -3263,6 +4426,8 @@ void AddSC_item_spell_scripts() new spell_item_shadowmourne(); new spell_item_shadowmourne_soul_fragment(); new spell_item_six_demon_bag(); + new spell_item_swift_hand_justice_dummy(); + new spell_item_totem_of_flowing_water(); new spell_item_the_eye_of_diminution(); new spell_item_underbelly_elixir(); new spell_item_worn_troll_dice(); @@ -3296,7 +4461,13 @@ void AddSC_item_spell_scripts() new spell_item_chicken_cover(); new spell_item_muisek_vessel(); new spell_item_greatmothers_soulcatcher(); + new spell_item_shard_of_the_scale<SPELL_PURIFIED_CAUTERIZING_HEAL, SPELL_PURIFIED_SEARING_FLAMES>("spell_item_purified_shard_of_the_scale"); + new spell_item_shard_of_the_scale<SPELL_SHINY_CAUTERIZING_HEAL, SPELL_SHINY_SEARING_FLAMES>("spell_item_shiny_shard_of_the_scale"); new spell_item_soul_preserver(); + new spell_item_sunwell_neck<SPELL_LIGHTS_WRATH, SPELL_ARCANE_BOLT>("spell_item_sunwell_exalted_caster_neck"); + new spell_item_sunwell_neck<SPELL_LIGHTS_STRENGTH, SPELL_ARCANE_STRIKE>("spell_item_sunwell_exalted_melee_neck"); + new spell_item_sunwell_neck<SPELL_LIGHTS_WARD, SPELL_ARCANE_INSIGHT>("spell_item_sunwell_exalted_tank_neck"); + new spell_item_sunwell_neck<SPELL_LIGHTS_SALVATION, SPELL_ARCANE_SURGE>("spell_item_sunwell_exalted_healer_neck"); new spell_item_toy_train_set_pulse(); new spell_item_death_choice(); new spell_item_trinket_stack("spell_item_lightning_capacitor", SPELL_LIGHTNING_CAPACITOR_STACK, SPELL_LIGHTNING_CAPACITOR_TRIGGER); @@ -3307,4 +4478,7 @@ void AddSC_item_spell_scripts() new spell_item_charm_witch_doctor(); new spell_item_mana_drain(); new spell_item_taunt_flag_targeting(); + + new spell_item_zandalarian_charm("spell_item_unstable_power", SPELL_UNSTABLE_POWER_AURA_STACK); + new spell_item_zandalarian_charm("spell_item_restless_strength", SPELL_RESTLESS_STRENGTH_AURA_STACK); } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index bacbe31630c..f60c1f81601 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -50,6 +50,20 @@ enum MageSpells SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907, SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126, + SPELL_MAGE_CHILLED = 12484, + SPELL_MAGE_MANA_SURGE = 37445, + SPELL_MAGE_MAGIC_ABSORPTION_MANA = 29442, + SPELL_MAGE_ARCANE_POTENCY_RANK_1 = 57529, + SPELL_MAGE_ARCANE_POTENCY_RANK_2 = 57531, + SPELL_MAGE_HOT_STREAK_PROC = 48108, + SPELL_MAGE_ARCANE_SURGE = 37436, + SPELL_MAGE_COMBUSTION_PROC = 28682, + SPELL_MAGE_EMPOWERED_FIRE_PROC = 67545, + SPELL_MAGE_T10_2P_BONUS = 70752, + SPELL_MAGE_T10_2P_BONUS_EFFECT = 70753, + SPELL_MAGE_T8_4P_BONUS = 64869, + SPELL_MAGE_MISSILE_BARRAGE = 44401, + SPELL_MAGE_FINGERS_OF_FROST_AURASTATE_AURA = 44544 }; enum MageSpellIcons @@ -82,6 +96,46 @@ class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript } }; +// -31571 - Arcane Potency +class spell_mage_arcane_potency : public SpellScriptLoader +{ + public: + spell_mage_arcane_potency() : SpellScriptLoader("spell_mage_arcane_potency") { } + + class spell_mage_arcane_potency_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_arcane_potency_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_ARCANE_POTENCY_RANK_1) || + !sSpellMgr->GetSpellInfo(SPELL_MAGE_ARCANE_POTENCY_RANK_2)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + static uint32 const triggerSpell[2] = { SPELL_MAGE_ARCANE_POTENCY_RANK_1, SPELL_MAGE_ARCANE_POTENCY_RANK_2 }; + + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + uint32 spellId = triggerSpell[GetSpellInfo()->GetRank() - 1]; + caster->CastSpell(caster, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_arcane_potency_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_arcane_potency_AuraScript(); + } +}; + // -11113 - Blast Wave class spell_mage_blast_wave : public SpellScriptLoader { @@ -153,6 +207,38 @@ public: } }; +// -54747 - Burning Determination +// 54748 - Burning Determination +class spell_mage_burning_determination : public SpellScriptLoader +{ + public: + spell_mage_burning_determination() : SpellScriptLoader("spell_mage_burning_determination") { } + + class spell_mage_burning_determination_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_burning_determination_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE))) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_burning_determination_AuraScript(); + } +}; + // -44449 - Burnout class spell_mage_burnout : public SpellScriptLoader { @@ -235,6 +321,208 @@ class spell_mage_cold_snap : public SpellScriptLoader } }; +// 11129 - Combustion +class spell_mage_combustion : public SpellScriptLoader +{ + public: + spell_mage_combustion() : SpellScriptLoader("spell_mage_combustion") { } + + class spell_mage_combustion_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_combustion_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_COMBUSTION_PROC)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Do not take charges, add a stack of crit buff + if (!(eventInfo.GetHitMask() & PROC_HIT_CRITICAL)) + { + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_MAGE_COMBUSTION_PROC, true); + return false; + } + + return true; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_combustion_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_combustion_AuraScript(); + } +}; + +// -11185 - Improved Blizzard +class spell_mage_imp_blizzard : public SpellScriptLoader +{ + public: + spell_mage_imp_blizzard() : SpellScriptLoader("spell_mage_imp_blizzard") { } + + class spell_mage_imp_blizzard_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_imp_blizzard_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_CHILLED)) + return false; + return true; + } + + void HandleChill(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + uint32 triggerSpellId = sSpellMgr->GetSpellWithRank(SPELL_MAGE_CHILLED, GetSpellInfo()->GetRank()); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), triggerSpellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_imp_blizzard_AuraScript::HandleChill, EFFECT_0, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_imp_blizzard_AuraScript(); + } +}; + +// 37447 - Improved Mana Gems +// 61062 - Improved Mana Gems +class spell_mage_imp_mana_gems : public SpellScriptLoader +{ + public: + spell_mage_imp_mana_gems() : SpellScriptLoader("spell_mage_imp_mana_gems") { } + + class spell_mage_imp_mana_gems_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_imp_mana_gems_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MANA_SURGE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_MAGE_MANA_SURGE, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_imp_mana_gems_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_imp_mana_gems_AuraScript(); + } +}; + +// -31656 - Empowered Fire +class spell_mage_empowered_fire : public SpellScriptLoader +{ + public: + spell_mage_empowered_fire() : SpellScriptLoader("spell_mage_empowered_fire") { } + + class spell_mage_empowered_fire_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_empowered_fire_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_EMPOWERED_FIRE_PROC)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (spellInfo->Id == SPELL_MAGE_IGNITE) + return true; + + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* target = GetTarget(); + int32 bp0 = int32(CalculatePct(target->GetCreateMana(), aurEff->GetAmount())); + target->CastCustomSpell(SPELL_MAGE_EMPOWERED_FIRE_PROC, SPELLVALUE_BASE_POINT0, bp0, target, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_empowered_fire_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_empowered_fire_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_empowered_fire_AuraScript(); + } +}; + +// 74396 - Fingers of Frost +class spell_mage_fingers_of_frost : public SpellScriptLoader +{ + public: + spell_mage_fingers_of_frost() : SpellScriptLoader("spell_mage_fingers_of_frost") { } + + class spell_mage_fingers_of_frost_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_fingers_of_frost_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FINGERS_OF_FROST_AURASTATE_AURA)) + return false; + return true; + } + + void HandleDummy(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->RemoveAuraFromStack(GetId()); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_MAGE_FINGERS_OF_FROST_AURASTATE_AURA); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_fingers_of_frost_AuraScript::HandleDummy, EFFECT_0, SPELL_AURA_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_fingers_of_frost_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_fingers_of_frost_AuraScript(); + } +}; + // -543 - Fire Ward // -6143 - Frost Ward class spell_mage_fire_frost_ward : public SpellScriptLoader @@ -354,6 +642,222 @@ class spell_mage_focus_magic : public SpellScriptLoader } }; +// 44401 - Missile Barrage +// 48108 - Hot Streak +// 57761 - Fireball! +class spell_mage_gen_extra_effects : public SpellScriptLoader +{ + public: + spell_mage_gen_extra_effects() : SpellScriptLoader("spell_mage_gen_extra_effects") { } + + class spell_mage_gen_extra_effects_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_gen_extra_effects_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_T10_2P_BONUS) || + !sSpellMgr->GetSpellInfo(SPELL_MAGE_T10_2P_BONUS_EFFECT) || + !sSpellMgr->GetSpellInfo(SPELL_MAGE_T8_4P_BONUS)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + // Prevent double proc for Arcane missiles + if (caster == eventInfo.GetProcTarget()) + return false; + + // Proc chance is unknown, we'll just use dummy aura amount + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_MAGE_T8_4P_BONUS, EFFECT_0)) + if (roll_chance_i(aurEff->GetAmount())) + return false; + + return true; + } + + void HandleProc(ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + + if (caster->HasAura(SPELL_MAGE_T10_2P_BONUS)) + caster->CastSpell((Unit*)nullptr, SPELL_MAGE_T10_2P_BONUS_EFFECT, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_gen_extra_effects_AuraScript::CheckProc); + OnProc += AuraProcFn(spell_mage_gen_extra_effects_AuraScript::HandleProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_gen_extra_effects_AuraScript(); + } +}; + +// 56375 - Glyph of Polymorph +class spell_mage_glyph_of_polymorph : public SpellScriptLoader +{ + public: + spell_mage_glyph_of_polymorph() : SpellScriptLoader("spell_mage_glyph_of_polymorph") { } + + class spell_mage_glyph_of_polymorph_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_glyph_of_polymorph_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* target = eventInfo.GetProcTarget(); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed. + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_polymorph_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_glyph_of_polymorph_AuraScript(); + } +}; + +// 56374 - Glyph of Icy Veins +class spell_mage_glyph_of_icy_veins : public SpellScriptLoader +{ + public: + spell_mage_glyph_of_icy_veins() : SpellScriptLoader("spell_mage_glyph_of_icy_veins") { } + + class spell_mage_glyph_of_icy_veins_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_glyph_of_icy_veins_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->RemoveAurasByType(SPELL_AURA_HASTE_SPELLS, ObjectGuid::Empty, 0, true, false); + caster->RemoveAurasByType(SPELL_AURA_MOD_DECREASE_SPEED); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_icy_veins_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_glyph_of_icy_veins_AuraScript(); + } +}; + +// 56372 - Glyph of Ice Block +class spell_mage_glyph_of_ice_block : public SpellScriptLoader +{ + public: + spell_mage_glyph_of_ice_block() : SpellScriptLoader("spell_mage_glyph_of_ice_block") { } + + class spell_mage_glyph_of_ice_block_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_glyph_of_ice_block_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->GetSpellHistory()->ResetCooldowns([](SpellHistory::CooldownStorageType::iterator itr) -> bool + { + SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first); + if (!cdSpell || cdSpell->SpellFamilyName != SPELLFAMILY_MAGE + || !(cdSpell->SpellFamilyFlags[0] & 0x00000040)) + return false; + return true; + }, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_ice_block_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_glyph_of_ice_block_AuraScript(); + } +}; + +// -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 Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_HOT_STREAK_PROC)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + AuraEffect* counter = GetEffect(EFFECT_1); + if (!counter) + return; + + // Count spell criticals in a row in second aura + if (eventInfo.GetHitMask() & PROC_HIT_CRITICAL) + { + counter->SetAmount(counter->GetAmount() * 2); + if (counter->GetAmount() < 100) // not enough + return; + + // roll chance + if (!roll_chance_i(aurEff->GetAmount())) + return; + + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_MAGE_HOT_STREAK_PROC, true); + } + + // reset counter + counter->SetAmount(25); + } + + void HandleDummy(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + // Prevent console spam + PreventDefaultAction(); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_hot_streak_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_mage_hot_streak_AuraScript::HandleDummy, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_hot_streak_AuraScript(); + } +}; + // -11426 - Ice Barrier class spell_mage_ice_barrier : public SpellScriptLoader { @@ -502,6 +1006,43 @@ class spell_mage_living_bomb : public SpellScriptLoader } }; +// -29441 - Magic Absorption +class spell_mage_magic_absorption : public SpellScriptLoader +{ + public: + spell_mage_magic_absorption() : SpellScriptLoader("spell_mage_magic_absorption") { } + + class spell_mage_magic_absorption_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_magic_absorption_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MAGIC_ABSORPTION_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActionTarget(); + int32 bp = CalculatePct(static_cast<int32>(caster->GetMaxPower(POWER_MANA)), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_MAGE_MAGIC_ABSORPTION_MANA, SPELLVALUE_BASE_POINT0, bp, caster, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_magic_absorption_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_magic_absorption_AuraScript(); + } +}; + // -1463 - Mana Shield class spell_mage_mana_shield : public SpellScriptLoader { @@ -512,6 +1053,14 @@ class spell_mage_mana_shield : public SpellScriptLoader { PrepareAuraScript(spell_mage_mana_shield_AuraScript); + bool Validate(SpellInfo const* spellInfo) override + { + if (!spell_mage_incanters_absorbtion_base_AuraScript::Validate(spellInfo) || + !sSpellMgr->GetSpellInfo(SPELL_MAGE_ARCANE_SURGE)) + return false; + return true; + } + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { canBeRecalculated = false; @@ -527,10 +1076,18 @@ class spell_mage_mana_shield : public SpellScriptLoader } } + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActionTarget(); + caster->CastSpell(caster, SPELL_MAGE_ARCANE_SURGE, true); + } + void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD); AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0); + + OnEffectProc += AuraEffectProcFn(spell_mage_mana_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MANA_SHIELD); } }; @@ -586,6 +1143,42 @@ class spell_mage_master_of_elements : public SpellScriptLoader } }; +// -44404 - Missile Barrage +class spell_mage_missile_barrage : public SpellScriptLoader +{ + public: + spell_mage_missile_barrage() : SpellScriptLoader("spell_mage_missile_barrage") { } + + class spell_mage_missile_barrage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_missile_barrage_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + // Arcane Blast - full chance + if (spellInfo->SpellFamilyFlags[0] & 0x20000000) + return true; + + // Rest of spells have half chance + return roll_chance_i(50); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_missile_barrage_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_missile_barrage_AuraScript(); + } +}; + enum SilvermoonPolymorph { NPC_AUROSALIA = 18744, @@ -683,17 +1276,31 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader void AddSC_mage_spell_scripts() { + new spell_mage_arcane_potency(); new spell_mage_blast_wave(); new spell_mage_blazing_speed(); + new spell_mage_burning_determination(); new spell_mage_burnout(); new spell_mage_cold_snap(); + new spell_mage_combustion(); + new spell_mage_imp_blizzard(); + new spell_mage_imp_mana_gems(); + new spell_mage_empowered_fire(); + new spell_mage_fingers_of_frost(); new spell_mage_fire_frost_ward(); new spell_mage_focus_magic(); + new spell_mage_gen_extra_effects(); + new spell_mage_glyph_of_polymorph(); + new spell_mage_glyph_of_icy_veins(); + new spell_mage_glyph_of_ice_block(); + new spell_mage_hot_streak(); new spell_mage_ice_barrier(); new spell_mage_ignite(); new spell_mage_living_bomb(); + new spell_mage_magic_absorption(); new spell_mage_mana_shield(); new spell_mage_master_of_elements(); + new spell_mage_missile_barrage(); new spell_mage_polymorph_cast_visual(); 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 6de95af8d8f..a289226f934 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -70,6 +70,9 @@ enum PaladinSpells SPELL_PALADIN_JUDGEMENT_OF_LIGHT = 20185, SPELL_PALADIN_JUDGEMENT_OF_WISDOM = 20186, + SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL = 20267, + SPELL_PALADIN_JUDGEMENT_OF_WISDOM_MANA = 20268, + SPELL_PALADIN_GLYPH_OF_SALVATION = 63225, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790, @@ -89,7 +92,41 @@ enum PaladinSpells SPELL_PALADIN_AURA_MASTERY_IMMUNE = 64364, SPELL_GENERIC_ARENA_DAMPENING = 74410, - SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411 + SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411, + + SPELL_PALADIN_SACRED_SHIELD = 53601, + SPELL_PALADIN_T9_HOLY_4P_BONUS = 67191, + SPELL_PALADIN_FLASH_OF_LIGHT_PROC = 66922, + + SPELL_PALADIN_JUDGEMENTS_OF_THE_JUST_PROC = 68055, + + SPELL_PALADIN_GLYPH_OF_DIVINITY_PROC = 54986, + + SPELL_PALADIN_JUDGEMENTS_OF_THE_WISE_MANA = 31930, + SPELL_REPLENISHMENT = 57669, + SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE = 61840, + SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL = 54203, + SPELL_PALADIN_SACRED_SHIELD_TRIGGER = 58597, + SPELL_PALADIN_T8_HOLY_4P_BONUS = 64895, + SPELL_PALADIN_HEART_OF_THE_CRUSADER_EFF_R1 = 21183, + + SPELL_PALADIN_HOLY_POWER_ARMOR = 28790, + SPELL_PALADIN_HOLY_POWER_ATTACK_POWER = 28791, + SPELL_PALADIN_HOLY_POWER_SPELL_POWER = 28793, + SPELL_PALADIN_HOLY_POWER_MP5 = 28795, + + SPELL_PALADIN_HOLY_VENGEANCE = 31803, + SPELL_PALADIN_SEAL_OF_VENGEANCE_DAMAGE = 42463, + SPELL_PALADIN_BLOOD_CORRUPTION = 53742, + SPELL_PALADIN_SEAL_OF_CORRUPTION_DAMAGE = 53739, + + SPELL_PALADIN_SPIRITUAL_ATTUNEMENT_MANA = 31786, + + SPELL_PALADIN_ENDURING_LIGHT = 40471, + SPELL_PALADIN_ENDURING_JUDGEMENT = 40472, + + SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL = 54968, + SPELL_PALADIN_HOLY_MENDING = 64891 }; enum PaladinSpellIcons @@ -416,6 +453,37 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader } }; +// -31871 - Divine Purpose +class spell_pal_divine_purpose : public SpellScriptLoader +{ + public: + spell_pal_divine_purpose() : SpellScriptLoader("spell_pal_divine_purpose") { } + + class spell_pal_divine_purpose_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_divine_purpose_AuraScript); + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + if (!roll_chance_i(aurEff->GetAmount())) + return; + + eventInfo.GetProcTarget()->RemoveAurasWithMechanic(1 << MECHANIC_STUN, AURA_REMOVE_BY_ENEMY_SPELL); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_divine_purpose_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_divine_purpose_AuraScript(); + } +}; + // 64205 - Divine Sacrifice class spell_pal_divine_sacrifice : public SpellScriptLoader { @@ -647,6 +715,50 @@ class spell_pal_eye_for_an_eye : public SpellScriptLoader } }; +// 54939 - Glyph of Divinity +class spell_pal_glyph_of_divinity : public SpellScriptLoader +{ + public: + spell_pal_glyph_of_divinity() : SpellScriptLoader("spell_pal_glyph_of_divinity") { } + + class spell_pal_glyph_of_divinity_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_glyph_of_divinity_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_GLYPH_OF_DIVINITY_PROC)) + return false; + return true; + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + // Lay on Hands (Rank 1) does not have mana effect + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || spellInfo->Effects[EFFECT_1].Effect != SPELL_EFFECT_ENERGIZE) + return; + + Unit* caster = eventInfo.GetActor(); + if (caster == eventInfo.GetProcTarget()) + return; + + int32 mana = spellInfo->Effects[EFFECT_1].CalcValue() * 2; + caster->CastCustomSpell(SPELL_PALADIN_GLYPH_OF_DIVINITY_PROC, SPELLVALUE_BASE_POINT1, mana, (Unit*)nullptr, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_glyph_of_divinity_AuraScript::OnProc, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_glyph_of_divinity_AuraScript(); + } +}; + // 54968 - Glyph of Holy Light class spell_pal_glyph_of_holy_light : public SpellScriptLoader { @@ -680,6 +792,49 @@ class spell_pal_glyph_of_holy_light : public SpellScriptLoader } }; +// 54937 - Glyph of Holy Light (dummy aura) +class spell_pal_glyph_of_holy_light_dummy : public SpellScriptLoader +{ + public: + spell_pal_glyph_of_holy_light_dummy() : SpellScriptLoader("spell_pal_glyph_of_holy_light_dummy") { } + + class spell_pal_glyph_of_holy_light_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_glyph_of_holy_light_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + + caster->CastCustomSpell(SPELL_PALADIN_GLYPH_OF_HOLY_LIGHT_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_glyph_of_holy_light_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_glyph_of_holy_light_dummy_AuraScript(); + } +}; + // 63521 - Guarded by The Light class spell_pal_guarded_by_the_light : public SpellScriptLoader { @@ -800,6 +955,43 @@ class spell_pal_hand_of_salvation : public SpellScriptLoader } }; +// -20335 - Heart of the Crusader +class spell_pal_heart_of_the_crusader : public SpellScriptLoader +{ + public: + spell_pal_heart_of_the_crusader() : SpellScriptLoader("spell_pal_heart_of_the_crusader") { } + + class spell_pal_heart_of_the_crusader_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_heart_of_the_crusader_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_HEART_OF_THE_CRUSADER_EFF_R1)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_PALADIN_HEART_OF_THE_CRUSADER_EFF_R1, GetSpellInfo()->GetRank()); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_heart_of_the_crusader_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_heart_of_the_crusader_AuraScript(); + } +}; + // -20473 - Holy Shock class spell_pal_holy_shock : public SpellScriptLoader { @@ -992,7 +1184,7 @@ class spell_pal_improved_aura : public SpellScriptLoader uint32 _spellId; }; -// 63510 - Improved Concentraction Aura (Area Aura) +// 63510 - Improved Concentration Aura (Area Aura) // 63514 - Improved Devotion Aura (Area Aura) // 63531 - Sanctified Retribution (Area Aura) class spell_pal_improved_aura_effect : public SpellScriptLoader @@ -1034,6 +1226,106 @@ class spell_pal_improved_aura_effect : public SpellScriptLoader } }; +// -20234 - Improved Lay on Hands +class spell_pal_improved_lay_of_hands : public SpellScriptLoader +{ + public: + spell_pal_improved_lay_of_hands() : SpellScriptLoader("spell_pal_improved_lay_of_hands") { } + + class spell_pal_improved_lay_of_hands_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_improved_lay_of_hands_AuraScript); + + bool Validate(SpellInfo const* spellInfo) override + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActionTarget()->CastSpell(eventInfo.GetActionTarget(), GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true, nullptr, aurEff, GetTarget()->GetGUID()); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_improved_lay_of_hands_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_improved_lay_of_hands_AuraScript(); + } +}; + +// -53569 - Infusion of Light +class spell_pal_infusion_of_light : public SpellScriptLoader +{ + public: + spell_pal_infusion_of_light() : SpellScriptLoader("spell_pal_infusion_of_light") { } + + class spell_pal_infusion_of_light_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_infusion_of_light_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SACRED_SHIELD) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_T9_HOLY_4P_BONUS) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_FLASH_OF_LIGHT_PROC)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + { + // Flash of Light HoT on Flash of Light when Sacred Shield active + if (spellInfo->SpellFamilyFlags[0] & 0x40000000 && spellInfo->SpellIconID == 242) + { + PreventDefaultAction(); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + Unit* procTarget = eventInfo.GetActionTarget(); + if (procTarget && procTarget->HasAura(SPELL_PALADIN_SACRED_SHIELD)) + { + Unit* target = GetTarget(); + int32 duration = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_FLASH_OF_LIGHT_PROC)->GetMaxDuration() / 1000; + int32 pct = GetSpellInfo()->Effects[EFFECT_2].CalcValue(); + int32 bp0 = CalculatePct(healInfo->GetHeal() / duration, pct); + + // Item - Paladin T9 Holy 4P Bonus + if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_PALADIN_T9_HOLY_4P_BONUS, 0)) + AddPct(bp0, aurEff->GetAmount()); + + target->CastCustomSpell(SPELL_PALADIN_FLASH_OF_LIGHT_PROC, SPELLVALUE_BASE_POINT0, bp0, procTarget, true, nullptr, aurEff); + } + } + // but should not proc on non-critical Holy Shocks + else if ((spellInfo->SpellFamilyFlags[0] & 0x200000 || spellInfo->SpellFamilyFlags[1] & 0x10000) && !(eventInfo.GetHitMask() & PROC_HIT_CRITICAL)) + PreventDefaultAction(); + } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_infusion_of_light_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_infusion_of_light_AuraScript(); + } +}; + // 37705 - Healing Discount class spell_pal_item_healing_discount : public SpellScriptLoader { @@ -1069,6 +1361,65 @@ class spell_pal_item_healing_discount : public SpellScriptLoader } }; +// 40470 - Paladin Tier 6 Trinket +class spell_pal_item_t6_trinket : public SpellScriptLoader +{ + public: + spell_pal_item_t6_trinket() : SpellScriptLoader("spell_pal_item_t6_trinket") { } + + class spell_pal_item_t6_trinket_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_item_t6_trinket_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_ENDURING_LIGHT) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_ENDURING_JUDGEMENT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + uint32 spellId; + int32 chance; + + // Holy Light & Flash of Light + if (spellInfo->SpellFamilyFlags[0] & 0xC0000000) + { + spellId = SPELL_PALADIN_ENDURING_LIGHT; + chance = 15; + } + // Judgements + else if (spellInfo->SpellFamilyFlags[0] & 0x00800000) + { + spellId = SPELL_PALADIN_ENDURING_JUDGEMENT; + chance = 50; + } + else + return; + + if (roll_chance_i(chance)) + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_item_t6_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_item_t6_trinket_AuraScript(); + } +}; + // 53407 - Judgement of Justice // 20271 - Judgement of Light // 53408 - Judgement of Wisdom @@ -1101,11 +1452,13 @@ class spell_pal_judgement : public SpellScriptLoader for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) { if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) + { if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) { spellId2 = (*i)->GetAmount(); break; } + } } GetCaster()->CastSpell(GetHitUnit(), _spellId, true); @@ -1159,6 +1512,164 @@ class spell_pal_judgement_of_command : public SpellScriptLoader } }; +// 20185 - Judgement of Light +class spell_pal_judgement_of_light_heal : public SpellScriptLoader +{ + public: + spell_pal_judgement_of_light_heal() : SpellScriptLoader("spell_pal_judgement_of_light_heal") { } + + class spell_pal_judgement_of_light_heal_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_judgement_of_light_heal_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetProcTarget(); + int32 amount = static_cast<int32>(caster->CountPctFromMaxHealth(aurEff->GetAmount())); + + caster->CastCustomSpell(SPELL_PALADIN_JUDGEMENT_OF_LIGHT_HEAL, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_judgement_of_light_heal_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_judgement_of_light_heal_AuraScript(); + } +}; + +// 20186 - Judgement of Wisdom +class spell_pal_judgement_of_wisdom_mana : public SpellScriptLoader +{ + public: + spell_pal_judgement_of_wisdom_mana() : SpellScriptLoader("spell_pal_judgement_of_wisdom_mana") { } + + class spell_pal_judgement_of_wisdom_mana_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_judgement_of_wisdom_mana_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENT_OF_WISDOM_MANA)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget()->getPowerType() == POWER_MANA; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetProcTarget(); + int32 amount = CalculatePct(static_cast<int32>(caster->GetCreateMana()), aurEff->GetAmount()); + + caster->CastCustomSpell(SPELL_PALADIN_JUDGEMENT_OF_WISDOM_MANA, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pal_judgement_of_wisdom_mana_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pal_judgement_of_wisdom_mana_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_judgement_of_wisdom_mana_AuraScript(); + } +}; + +// -53695 - Judgements of the Just +class spell_pal_judgements_of_the_just : public SpellScriptLoader +{ + public: + spell_pal_judgements_of_the_just() : SpellScriptLoader("spell_pal_judgements_of_the_just") { } + + class spell_pal_judgements_of_the_just_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_judgements_of_the_just_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENTS_OF_THE_JUST_PROC)) + return false; + return true; + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetActionTarget(), SPELL_PALADIN_JUDGEMENTS_OF_THE_JUST_PROC, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_judgements_of_the_just_AuraScript::OnProc, EFFECT_0, SPELL_AURA_ADD_FLAT_MODIFIER); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_judgements_of_the_just_AuraScript(); + } +}; + +// -31876 - Judgements of the Wise +class spell_pal_judgements_of_the_wise : public SpellScriptLoader +{ + public: + spell_pal_judgements_of_the_wise() : SpellScriptLoader("spell_pal_judgements_of_the_wise") { } + + class spell_pal_judgements_of_the_wise_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_judgements_of_the_wise_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_JUDGEMENTS_OF_THE_WISE_MANA)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + caster->CastSpell((Unit*)nullptr, SPELL_PALADIN_JUDGEMENTS_OF_THE_WISE_MANA, true); + caster->CastSpell((Unit*)nullptr, SPELL_REPLENISHMENT, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_judgements_of_the_wise_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_judgements_of_the_wise_AuraScript(); + } +}; + // -633 - Lay on Hands class spell_pal_lay_on_hands : public SpellScriptLoader { @@ -1251,8 +1762,12 @@ class spell_pal_light_s_beacon : public SpellScriptLoader if (!procSpell) return; + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + uint32 healSpellId = procSpell->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_PALADIN_HOLY_LIGHT)) ? SPELL_PALADIN_BEACON_OF_LIGHT_HEAL_1 : SPELL_PALADIN_BEACON_OF_LIGHT_HEAL_3; - uint32 heal = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount()); + uint32 heal = CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()); Unit* beaconTarget = GetCaster(); if (!beaconTarget || !beaconTarget->HasAura(SPELL_PALADIN_BEACON_OF_LIGHT, eventInfo.GetActor()->GetGUID())) @@ -1341,6 +1856,55 @@ class spell_pal_righteous_defense : public SpellScriptLoader } }; +// -53380 - Righteous Vengeance +class spell_pal_righteous_vengeance : public SpellScriptLoader +{ + public: + spell_pal_righteous_vengeance() : SpellScriptLoader("spell_pal_righteous_vengeance") { } + + class spell_pal_righteous_vengeance_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_righteous_vengeance_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE); + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + // Add remaining ticks to damage done + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE); + + caster->CastCustomSpell(SPELL_PALADIN_RIGHTEOUS_VENGEANCE_DAMAGE, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_righteous_vengeance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_righteous_vengeance_AuraScript(); + } +}; + // 58597 - Sacred Shield class spell_pal_sacred_shield : public SpellScriptLoader { @@ -1385,6 +1949,59 @@ class spell_pal_sacred_shield : public SpellScriptLoader } }; +// 53601 - Sacred Shield (dummy) +class spell_pal_sacred_shield_dummy : public SpellScriptLoader +{ + public: + spell_pal_sacred_shield_dummy() : SpellScriptLoader("spell_pal_sacred_shield_dummy") { } + + class spell_pal_sacred_shield_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_sacred_shield_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SACRED_SHIELD_TRIGGER) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_T8_HOLY_4P_BONUS)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = GetCaster(); + if (!caster) + return; + + std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); + if (_cooldownEnd > now) + return; + + Seconds cooldown(aurEff->GetAmount()); + if (AuraEffect const* bonus = caster->GetAuraEffect(SPELL_PALADIN_T8_HOLY_4P_BONUS, EFFECT_0, caster->GetGUID())) + cooldown = Seconds(bonus->GetAmount()); + + _cooldownEnd = now + cooldown; + caster->CastSpell(eventInfo.GetActionTarget(), SPELL_PALADIN_SACRED_SHIELD_TRIGGER, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_sacred_shield_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + + // Cooldown tracking can't be done in DB because of T8 bonus + std::chrono::steady_clock::time_point _cooldownEnd = std::chrono::steady_clock::time_point::min(); + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_sacred_shield_dummy_AuraScript(); + } +}; + // 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 { @@ -1431,6 +2048,341 @@ class spell_pal_seal_of_righteousness : public SpellScriptLoader } }; +// 31801 - Seal of Vengeance +// 53736 - Seal of Corruption +template <uint32 DoTSpellId, uint32 DamageSpellId> +class spell_pal_seal_of_vengeance : public SpellScriptLoader +{ + public: + spell_pal_seal_of_vengeance(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint32 DoTSpell, uint32 DamageSpell> + class spell_pal_seal_of_vengeance_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_seal_of_vengeance_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(DoTSpell) || + !sSpellMgr->GetSpellInfo(DamageSpell)) + return false; + return true; + } + + /* + When an auto-attack lands (does not dodge/parry/miss) that can proc a seal the of the following things happen independently of each other (see 2 roll system). + + 1) A "hidden strike" which uses melee combat mechanics occurs. If it lands it refreshes/stacks SoV DoT. Only white swings can trigger a refresh or stack. (This hidden strike mechanic can also proc things like berserking..) + 2) A weapon damage based proc will occur if you used a special (CS/DS/judge) or if you have a 5 stack (from auto attacks). This attack can not be avoided. + + Remember #2 happens regardless of #1 landing, it just requires the initial attack (autos, cs, etc) to land. + + Stack Number % of Weapon Damage % with SotP + 0 0% 0% + 1 6.6% 7.6% + 2 13.2% 15.2% + 3 19.8% 22.8% + 4 26.4% 30.4% + 5 33% 38% + */ + + void HandleApplyDoT(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + if (!(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MELEE_AUTO_ATTACK)) + return; + + // don't cast triggered, spell already has SPELL_ATTR4_CAN_CAST_WHILE_CASTING attr + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), DoTSpell, false); + } + + void HandleSeal(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PALADIN, 0x00000000, 0x00000800, 0x00000000, caster->GetGUID()); + if (!aurEff) + return; + + uint8 stacks = aurEff->GetBase()->GetStackAmount(); + uint8 maxStacks = aurEff->GetSpellInfo()->StackAmount; + + if (stacks < maxStacks && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS)) + return; + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(DamageSpell); + int32 amount = spellInfo->Effects[EFFECT_0].CalcValue(); + amount *= stacks; + amount /= maxStacks; + + caster->CastCustomSpell(DamageSpell, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_AuraScript::HandleApplyDoT, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_AuraScript::HandleSeal, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_seal_of_vengeance_AuraScript<DoTSpellId, DamageSpellId>(); + } +}; + +// 20375 - Seal of Command +// 21084 - Seal of Righteousness +// 31801 - Seal of Vengeance +// 31892 - Seal of Blood +// 33127 - Seal of Command +// 38008 - Seal of Blood +// 41459 - Seal of Blood +// 53720 - Seal of the Martyr +// 53736 - Seal of Corruption +class spell_pal_seals : public SpellScriptLoader +{ + public: + spell_pal_seals() : SpellScriptLoader("spell_pal_seals") { } + + class spell_pal_seals_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_seals_AuraScript); + + // Effect 2 is used by Judgement code, we prevent the proc to avoid console logging of unknown spell trigger + bool CheckDummyProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + return false; + } + + void Register() override + { + DoCheckEffectProc += AuraCheckEffectProcFn(spell_pal_seals_AuraScript::CheckDummyProc, EFFECT_2, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_seals_AuraScript(); + } +}; + +// -31785 - Spiritual Attunement +class spell_pal_spiritual_attunement : public SpellScriptLoader +{ + public: + spell_pal_spiritual_attunement() : SpellScriptLoader("spell_pal_spiritual_attunement") { } + + class spell_pal_spiritual_attunement_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_spiritual_attunement_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SPIRITUAL_ATTUNEMENT_MANA)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // "when healed by other friendly targets' spells" + if (eventInfo.GetProcTarget() == eventInfo.GetActionTarget()) + return false; + + return eventInfo.GetHealInfo() && eventInfo.GetHealInfo()->GetEffectiveHeal(); + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetEffectiveHeal()), aurEff->GetAmount()); + + eventInfo.GetActionTarget()->CastCustomSpell(SPELL_PALADIN_SPIRITUAL_ATTUNEMENT_MANA, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pal_spiritual_attunement_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pal_spiritual_attunement_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_spiritual_attunement_AuraScript(); + } +}; + +// -53501 - Sheath of Light +class spell_pal_sheath_of_light : public SpellScriptLoader +{ + public: + spell_pal_sheath_of_light() : SpellScriptLoader("spell_pal_sheath_of_light") { } + + class spell_pal_sheath_of_light_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_sheath_of_light_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL); + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + // Add remaining ticks to damage done + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL, SPELL_AURA_PERIODIC_HEAL); + + caster->CastCustomSpell(SPELL_PALADIN_SHEATH_OF_LIGHT_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_sheath_of_light_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_sheath_of_light_AuraScript(); + } +}; + +// 28789 - Holy Power +class spell_pal_t3_6p_bonus : public SpellScriptLoader +{ + public: + spell_pal_t3_6p_bonus() : SpellScriptLoader("spell_pal_t3_6p_bonus") { } + + class spell_pal_t3_6p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_t3_6p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_POWER_ARMOR) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_POWER_ATTACK_POWER) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_POWER_SPELL_POWER) || + !sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_POWER_MP5)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 spellId; + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + switch (target->getClass()) + { + case CLASS_PALADIN: + case CLASS_PRIEST: + case CLASS_SHAMAN: + case CLASS_DRUID: + spellId = SPELL_PALADIN_HOLY_POWER_MP5; + break; + case CLASS_MAGE: + case CLASS_WARLOCK: + spellId = SPELL_PALADIN_HOLY_POWER_SPELL_POWER; + break; + case CLASS_HUNTER: + case CLASS_ROGUE: + spellId = SPELL_PALADIN_HOLY_POWER_ATTACK_POWER; + break; + case CLASS_WARRIOR: + spellId = SPELL_PALADIN_HOLY_POWER_ARMOR; + break; + default: + return; + } + + caster->CastSpell(target, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_t3_6p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_t3_6p_bonus_AuraScript(); + } +}; + +// 64890 Item - Paladin T8 Holy 2P Bonus +class spell_pal_t8_2p_bonus : public SpellScriptLoader +{ + public: + spell_pal_t8_2p_bonus() : SpellScriptLoader("spell_pal_t8_2p_bonus") { } + + class spell_pal_t8_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pal_t8_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_HOLY_MENDING)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PALADIN_HOLY_MENDING); + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + // Add remaining ticks to damage done + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PALADIN_HOLY_MENDING, SPELL_AURA_PERIODIC_HEAL); + + caster->CastCustomSpell(SPELL_PALADIN_HOLY_MENDING, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pal_t8_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pal_t8_2p_bonus_AuraScript(); + } +}; + void AddSC_paladin_spell_scripts() { new spell_pal_ardent_defender(); @@ -1439,15 +2391,19 @@ void AddSC_paladin_spell_scripts() new spell_pal_avenging_wrath(); new spell_pal_blessing_of_faith(); new spell_pal_blessing_of_sanctuary(); + new spell_pal_divine_purpose(); 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_glyph_of_divinity(); new spell_pal_glyph_of_holy_light(); + new spell_pal_glyph_of_holy_light_dummy(); new spell_pal_guarded_by_the_light(); new spell_pal_hand_of_sacrifice(); new spell_pal_hand_of_salvation(); + new spell_pal_heart_of_the_crusader(); new spell_pal_holy_shock(); new spell_pal_illumination(); new spell_pal_improved_aura("spell_pal_improved_concentraction_aura", SPELL_PALADIN_IMPROVED_CONCENTRACTION_AURA); @@ -1457,14 +2413,30 @@ void AddSC_paladin_spell_scripts() new spell_pal_improved_aura_effect("spell_pal_improved_concentraction_aura_effect"); new spell_pal_improved_aura_effect("spell_pal_improved_devotion_aura_effect"); new spell_pal_improved_aura_effect("spell_pal_sanctified_retribution_effect"); + new spell_pal_improved_lay_of_hands(); + new spell_pal_infusion_of_light(); new spell_pal_item_healing_discount(); + new spell_pal_item_t6_trinket(); new spell_pal_judgement("spell_pal_judgement_of_justice", SPELL_PALADIN_JUDGEMENT_OF_JUSTICE); new spell_pal_judgement("spell_pal_judgement_of_light", SPELL_PALADIN_JUDGEMENT_OF_LIGHT); new spell_pal_judgement("spell_pal_judgement_of_wisdom", SPELL_PALADIN_JUDGEMENT_OF_WISDOM); new spell_pal_judgement_of_command(); + new spell_pal_judgement_of_light_heal(); + new spell_pal_judgement_of_wisdom_mana(); + new spell_pal_judgements_of_the_just(); + new spell_pal_judgements_of_the_wise(); new spell_pal_lay_on_hands(); new spell_pal_light_s_beacon(); new spell_pal_righteous_defense(); + new spell_pal_righteous_vengeance(); new spell_pal_sacred_shield(); + new spell_pal_sacred_shield_dummy(); new spell_pal_seal_of_righteousness(); + new spell_pal_seal_of_vengeance<SPELL_PALADIN_HOLY_VENGEANCE, SPELL_PALADIN_SEAL_OF_VENGEANCE_DAMAGE>("spell_pal_seal_of_vengeance"); + new spell_pal_seal_of_vengeance<SPELL_PALADIN_BLOOD_CORRUPTION, SPELL_PALADIN_SEAL_OF_CORRUPTION_DAMAGE>("spell_pal_seal_of_corruption"); + new spell_pal_seals(); + new spell_pal_spiritual_attunement(); + new spell_pal_sheath_of_light(); + new spell_pal_t3_6p_bonus(); + new spell_pal_t8_2p_bonus(); } diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 9e2d265aa9c..fb67dbb419a 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -46,6 +46,20 @@ enum PriestSpells SPELL_PRIEST_SHADOW_WORD_DEATH = 32409, SPELL_PRIEST_T9_HEALING_2P = 67201, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085, + SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA = 58227, + SPELL_REPLENISHMENT = 57669, + SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER = 64136, + SPELL_PRIEST_ABOLISH_DISEASE = 552, + SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL = 15290, + SPELL_PRIEST_DIVINE_BLESSING = 40440, + SPELL_PRIEST_DIVINE_WRATH = 40441, + SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL = 56131, + SPELL_PRIEST_ORACULAR_HEAL = 26170, + SPELL_PRIEST_ARMOR_OF_FAITH = 28810, + SPELL_PRIEST_BLESSED_HEALING = 70772, + SPELL_PRIEST_MIND_BLAST_R1 = 8092, + SPELL_PRIEST_SHADOW_WORD_DEATH_R1 = 32379, + SPELL_PRIEST_MIND_FLAY_DAMAGE = 58381 }; enum PriestSpellIcons @@ -89,6 +103,50 @@ class RaidCheck Unit const* _caster; }; +// 26169 - Oracle Healing Bonus +class spell_pri_aq_3p_bonus : public SpellScriptLoader +{ + public: + spell_pri_aq_3p_bonus() : SpellScriptLoader("spell_pri_aq_3p_bonus") { } + + class spell_pri_aq_3p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_aq_3p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ORACULAR_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + if (caster == eventInfo.GetProcTarget()) + return; + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), 10); + caster->CastCustomSpell(SPELL_PRIEST_ORACULAR_HEAL, SPELLVALUE_BASE_POINT0, amount, caster, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_aq_3p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_aq_3p_bonus_AuraScript(); + } +}; + // -27811 - Blessed Recovery class spell_pri_blessed_recovery : public SpellScriptLoader { @@ -109,16 +167,18 @@ public: void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - if (DamageInfo* dmgInfo = eventInfo.GetDamageInfo()) - { - if (Unit* target = eventInfo.GetActionTarget()) - { - uint32 triggerSpell = sSpellMgr->GetSpellWithRank(SPELL_PRIEST_BLESSED_RECOVERY_R1, aurEff->GetSpellInfo()->GetRank()); - uint32 bp = CalculatePct(int32(dmgInfo->GetDamage()), aurEff->GetAmount()) / 3; - bp += target->GetRemainingPeriodicAmount(target->GetGUID(), triggerSpell, SPELL_AURA_PERIODIC_HEAL); - target->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff); - } - } + DamageInfo* dmgInfo = eventInfo.GetDamageInfo(); + if (!dmgInfo || !dmgInfo->GetDamage()) + return; + + Unit* target = eventInfo.GetActionTarget(); + uint32 triggerSpell = sSpellMgr->GetSpellWithRank(SPELL_PRIEST_BLESSED_RECOVERY_R1, aurEff->GetSpellInfo()->GetRank()); + SpellInfo const* triggerInfo = sSpellMgr->AssertSpellInfo(triggerSpell); + + int32 bp = CalculatePct(static_cast<int32>(dmgInfo->GetDamage()), aurEff->GetAmount()); + bp /= triggerInfo->GetMaxTicks(); + bp += target->GetRemainingPeriodicAmount(target->GetGUID(), triggerSpell, SPELL_AURA_PERIODIC_HEAL); + target->CastCustomSpell(triggerSpell, SPELLVALUE_BASE_POINT0, bp, target, true, nullptr, aurEff); } void Register() override @@ -133,6 +193,65 @@ public: } }; +// -64127 - Body and Soul +class spell_pri_body_and_soul : public SpellScriptLoader +{ + public: + spell_pri_body_and_soul() : SpellScriptLoader("spell_pri_body_and_soul") { } + + class spell_pri_body_and_soul_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_body_and_soul_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER) || + !sSpellMgr->GetSpellInfo(SPELL_PRIEST_ABOLISH_DISEASE)) + return false; + return true; + } + + void HandleProcTriggerSpell(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + // Proc only on Power Word: Shield + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || !(spellInfo->SpellFamilyFlags[0] & 0x00000001)) + { + PreventDefaultAction(); + return; + } + } + + void HandleProcDummy(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + // Proc only on self casted abolish disease + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + Unit* caster = eventInfo.GetActor(); + if (spellInfo->Id != SPELL_PRIEST_ABOLISH_DISEASE || caster != eventInfo.GetProcTarget()) + return; + + if (roll_chance_i(aurEff->GetAmount())) + caster->CastSpell(caster, SPELL_PRIEST_BODY_AND_SOUL_POISON_TRIGGER, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleProcTriggerSpell, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectProc += AuraEffectProcFn(spell_pri_body_and_soul_AuraScript::HandleProcDummy, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_body_and_soul_AuraScript(); + } +}; + // -34861 - Circle of Healing class spell_pri_circle_of_healing : public SpellScriptLoader { @@ -201,7 +320,11 @@ class spell_pri_divine_aegis : public SpellScriptLoader { PreventDefaultAction(); - int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 absorb = CalculatePct(healInfo->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)) @@ -260,6 +383,50 @@ class spell_pri_divine_hymn : public SpellScriptLoader } }; +// 55677 - Glyph of Dispel Magic +class spell_pri_glyph_of_dispel_magic : public SpellScriptLoader +{ + public: + spell_pri_glyph_of_dispel_magic() : SpellScriptLoader("spell_pri_glyph_of_dispel_magic") { } + + class spell_pri_glyph_of_dispel_magic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_glyph_of_dispel_magic_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + // Dispel Magic shares spellfamilyflag with abolish disease + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || spellInfo->SpellIconID != 74) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + int32 amount = static_cast<int32>(target->CountPctFromMaxHealth(aurEff->GetAmount())); + + caster->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_DISPEL_MAGIC_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_dispel_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_glyph_of_dispel_magic_AuraScript(); + } +}; + // 55680 - Glyph of Prayer of Healing class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader { @@ -281,8 +448,12 @@ class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader { PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + SpellInfo const* triggeredSpellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL); - int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); + int32 heal = int32(CalculatePct(healInfo->GetHeal(), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks()); GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff); } @@ -398,38 +569,117 @@ class spell_pri_hymn_of_hope : public SpellScriptLoader } }; -// 37594 - Greater Heal Refund -class spell_pri_item_greater_heal_refund : public SpellScriptLoader +// -47569 - Improved Shadowform +class spell_pri_imp_shadowform : public SpellScriptLoader +{ + public: + spell_pri_imp_shadowform() : SpellScriptLoader("spell_pri_imp_shadowform") { } + + class spell_pri_imp_shadowform_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_imp_shadowform_AuraScript); + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + if (roll_chance_i(aurEff->GetAmount())) + eventInfo.GetActor()->RemoveMovementImpairingAuras(); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_imp_shadowform_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_imp_shadowform_AuraScript(); + } +}; + +// -15337 - Improved Spirit Tap +class spell_pri_improved_spirit_tap : public SpellScriptLoader { public: - spell_pri_item_greater_heal_refund() : SpellScriptLoader("spell_pri_item_greater_heal_refund") { } + spell_pri_improved_spirit_tap() : SpellScriptLoader("spell_pri_improved_spirit_tap") { } - class spell_pri_item_greater_heal_refund_AuraScript : public AuraScript + class spell_pri_improved_spirit_tap_AuraScript : public AuraScript { - PrepareAuraScript(spell_pri_item_greater_heal_refund_AuraScript); + PrepareAuraScript(spell_pri_improved_spirit_tap_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_SHADOW_WORD_DEATH_R1) || + !sSpellMgr->GetSpellInfo(SPELL_PRIEST_MIND_BLAST_R1)) return false; return true; } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + { + if (spellInfo->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_PRIEST_SHADOW_WORD_DEATH_R1)) || + spellInfo->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_PRIEST_MIND_BLAST_R1))) + return true; + else if (spellInfo->Id == SPELL_PRIEST_MIND_FLAY_DAMAGE) + return roll_chance_i(50); + } + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pri_improved_spirit_tap_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_improved_spirit_tap_AuraScript(); + } +}; + +// 40438 - Priest Tier 6 Trinket +class spell_pri_item_t6_trinket : public SpellScriptLoader +{ + public: + spell_pri_item_t6_trinket() : SpellScriptLoader("spell_pri_item_t6_trinket") { } + + class spell_pri_item_t6_trinket_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_item_t6_trinket_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_BLESSING) || + !sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_WRATH)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, NULL, aurEff); + Unit* caster = eventInfo.GetActor(); + if (eventInfo.GetSpellTypeMask() & PROC_SPELL_TYPE_HEAL) + caster->CastSpell((Unit*)nullptr, SPELL_PRIEST_DIVINE_BLESSING, true); + + if (eventInfo.GetSpellTypeMask() & PROC_SPELL_TYPE_DAMAGE) + caster->CastSpell((Unit*)nullptr, SPELL_PRIEST_DIVINE_WRATH, true); } void Register() override { - OnEffectProc += AuraEffectProcFn(spell_pri_item_greater_heal_refund_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + OnEffectProc += AuraEffectProcFn(spell_pri_item_t6_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; AuraScript* GetAuraScript() const override { - return new spell_pri_item_greater_heal_refund_AuraScript(); + return new spell_pri_item_t6_trinket_AuraScript(); } }; @@ -838,6 +1088,56 @@ class spell_pri_renew : public SpellScriptLoader } }; +// 57989 - Shadowfiend Death +class spell_pri_shadowfiend_death : public SpellScriptLoader +{ + public: + spell_pri_shadowfiend_death() : SpellScriptLoader("spell_pri_shadowfiend_death") { } + + class spell_pri_shadowfiend_death_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_shadowfiend_death_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return false; + + Unit* shadowfiend = eventInfo.GetActionTarget(); + if (!shadowfiend->GetOwner()) + return false; + + return shadowfiend->HealthBelowPctDamaged(1, damageInfo->GetDamage()); + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActionTarget()->GetOwner(); + caster->CastSpell(caster, SPELL_PRIEST_GLYPH_OF_SHADOWFIEND_MANA, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pri_shadowfiend_death_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_shadowfiend_death_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_shadowfiend_death_AuraScript(); + } +}; + // -32379 - Shadow Word Death class spell_pri_shadow_word_death : public SpellScriptLoader { @@ -871,6 +1171,48 @@ class spell_pri_shadow_word_death : public SpellScriptLoader } }; +// 15286 - Vampiric Embrace +class spell_pri_vampiric_embrace : public SpellScriptLoader +{ + public: + spell_pri_vampiric_embrace() : SpellScriptLoader("spell_pri_vampiric_embrace") { } + + class spell_pri_vampiric_embrace_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_vampiric_embrace_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + int32 selfHeal = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + int32 partyHeal = selfHeal / 5; + Unit* caster = eventInfo.GetActor(); + caster->CastCustomSpell((Unit*)nullptr, SPELL_PRIEST_VAMPIRIC_EMBRACE_HEAL, &partyHeal, &selfHeal, nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_embrace_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_vampiric_embrace_AuraScript(); + } +}; + // -34914 - Vampiric Touch class spell_pri_vampiric_touch : public SpellScriptLoader { @@ -883,7 +1225,8 @@ class spell_pri_vampiric_touch : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) override { - if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL)) + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL) || + !sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT)) return false; return true; } @@ -891,18 +1234,29 @@ class spell_pri_vampiric_touch : public SpellScriptLoader void HandleDispel(DispelInfo* /*dispelInfo*/) { if (Unit* caster = GetCaster()) + { if (Unit* target = GetUnitOwner()) + { if (AuraEffect const* aurEff = GetEffect(EFFECT_1)) { int32 damage = aurEff->GetAmount() * 8; // backfire damage caster->CastCustomSpell(target, SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL, &damage, NULL, NULL, true, NULL, aurEff); } + } + } + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_REPLENISHMENT, true); } void Register() override { AfterDispel += AuraDispelFn(spell_pri_vampiric_touch_AuraScript::HandleDispel); + OnEffectProc += AuraEffectProcFn(spell_pri_vampiric_touch_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); } }; @@ -912,16 +1266,152 @@ class spell_pri_vampiric_touch : public SpellScriptLoader } }; +// 28809 - Greater Heal +class spell_pri_t3_4p_bonus : public SpellScriptLoader +{ + public: + spell_pri_t3_4p_bonus() : SpellScriptLoader("spell_pri_t3_4p_bonus") { } + + class spell_pri_t3_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_t3_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ARMOR_OF_FAITH)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_PRIEST_ARMOR_OF_FAITH, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_t3_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_t3_4p_bonus_AuraScript(); + } +}; + +// 37594 - Greater Heal Refund +class spell_pri_t5_heal_2p_bonus : public SpellScriptLoader +{ + public: + spell_pri_t5_heal_2p_bonus() : SpellScriptLoader("spell_pri_t5_heal_2p_bonus") { } + + class spell_pri_t5_heal_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_t5_heal_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_ITEM_EFFICIENCY)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (HealInfo* healInfo = eventInfo.GetHealInfo()) + if (Unit* healTarget = healInfo->GetTarget()) + if (healInfo->GetEffectiveHeal()) + if (healTarget->GetHealth() >= healTarget->GetMaxHealth()) + return true; + + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_PRIEST_ITEM_EFFICIENCY, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_pri_t5_heal_2p_bonus_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_pri_t5_heal_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_t5_heal_2p_bonus_AuraScript(); + } +}; + +// 70770 - Item - Priest T10 Healer 2P Bonus +class spell_pri_t10_heal_2p_bonus : public SpellScriptLoader +{ + public: + spell_pri_t10_heal_2p_bonus() : SpellScriptLoader("spell_pri_t10_heal_2p_bonus") { } + + class spell_pri_t10_heal_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_pri_t10_heal_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_BLESSED_HEALING)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_PRIEST_BLESSED_HEALING); + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + + // Add remaining ticks to healing done + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_PRIEST_BLESSED_HEALING, SPELL_AURA_PERIODIC_HEAL); + + caster->CastCustomSpell(SPELL_PRIEST_BLESSED_HEALING, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_t10_heal_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_pri_t10_heal_2p_bonus_AuraScript(); + } +}; + void AddSC_priest_spell_scripts() { + new spell_pri_aq_3p_bonus(); new spell_pri_blessed_recovery(); + new spell_pri_body_and_soul(); new spell_pri_circle_of_healing(); new spell_pri_divine_aegis(); new spell_pri_divine_hymn(); + new spell_pri_glyph_of_dispel_magic(); new spell_pri_glyph_of_prayer_of_healing(); new spell_pri_guardian_spirit(); new spell_pri_hymn_of_hope(); - new spell_pri_item_greater_heal_refund(); + new spell_pri_imp_shadowform(); + new spell_pri_improved_spirit_tap(); + new spell_pri_item_t6_trinket(); new spell_pri_lightwell_renew(); new spell_pri_mana_burn(); new spell_pri_mana_leech(); @@ -931,6 +1421,11 @@ void AddSC_priest_spell_scripts() new spell_pri_power_word_shield(); new spell_pri_prayer_of_mending_heal(); new spell_pri_renew(); + new spell_pri_shadowfiend_death(); new spell_pri_shadow_word_death(); + new spell_pri_vampiric_embrace(); new spell_pri_vampiric_touch(); + new spell_pri_t3_4p_bonus(); + new spell_pri_t5_heal_2p_bonus(); + new spell_pri_t10_heal_2p_bonus(); } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 40bb3c8ad42..bd74e9b2e73 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -44,7 +44,10 @@ enum RogueSpells SPELL_ROGUE_HONOR_AMONG_THIEVES = 51698, SPELL_ROGUE_HONOR_AMONG_THIEVES_PROC = 52916, SPELL_ROGUE_HONOR_AMONG_THIEVES_2 = 51699, - SPELL_ROGUE_T10_2P_BONUS = 70804 + SPELL_ROGUE_T10_2P_BONUS = 70804, + SPELL_ROGUE_GLYPH_OF_BACKSTAB_TRIGGER = 63975, + SPELL_ROGUE_QUICK_RECOVERY_ENERGY = 31663, + SPELL_ROGUE_CRIPPLING_POISON = 3409 }; // 13877, 33735, (check 51211, 65956) - Blade Flurry @@ -173,6 +176,80 @@ class spell_rog_cheat_death : public SpellScriptLoader } }; +// -51664 - Cut to the Chase +class spell_rog_cut_to_the_chase : public SpellScriptLoader +{ + public: + spell_rog_cut_to_the_chase() : SpellScriptLoader("spell_rog_cut_to_the_chase") { } + + class spell_rog_cut_to_the_chase_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_cut_to_the_chase_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + // "refresh your Slice and Dice duration to its 5 combo point maximum" + Unit* caster = eventInfo.GetActor(); + // lookup Slice and Dice + if (AuraEffect const* snd = caster->GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x00040000, 0x00000000, 0x00000000, caster->GetGUID())) + { + // Max 5 cp duration + uint32 countMax = snd->GetSpellInfo()->GetMaxDuration(); + + snd->GetBase()->SetDuration(countMax, true); + snd->GetBase()->SetMaxDuration(snd->GetBase()->GetDuration()); + } + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_rog_cut_to_the_chase_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_cut_to_the_chase_AuraScript(); + } +}; + +// -51625 - Deadly Brew +class spell_rog_deadly_brew : public SpellScriptLoader +{ + public: + spell_rog_deadly_brew() : SpellScriptLoader("spell_rog_deadly_brew") { } + + class spell_rog_deadly_brew_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_deadly_brew_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_CRIPPLING_POISON)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_ROGUE_CRIPPLING_POISON, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_rog_deadly_brew_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_deadly_brew_AuraScript(); + } +}; + // -2818 - Deadly Poison class spell_rog_deadly_poison : public SpellScriptLoader { @@ -522,8 +599,49 @@ class spell_rog_prey_on_the_weak : public SpellScriptLoader } }; +// -31244 - Quick Recovery +class spell_rog_quick_recovery : public SpellScriptLoader +{ + public: + spell_rog_quick_recovery() : SpellScriptLoader("spell_rog_quick_recovery") { } + + class spell_rog_quick_recovery_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_quick_recovery_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_QUICK_RECOVERY_ENERGY)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + Unit* caster = eventInfo.GetActor(); + int32 amount = CalculatePct(spellInfo->CalcPowerCost(caster, spellInfo->GetSchoolMask()), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_ROGUE_QUICK_RECOVERY_ENERGY, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_rog_quick_recovery_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_quick_recovery_AuraScript(); + } +}; + // -1943 - Rupture -#define RuptureScriptName "spell_rog_rupture" +static char const* const RuptureScriptName = "spell_rog_rupture"; class spell_rog_rupture : public SpellScriptLoader { public: @@ -586,6 +704,41 @@ class spell_rog_rupture : public SpellScriptLoader } }; +// 56800 - Glyph of Backstab (dummy) +class spell_rog_glyph_of_backstab : public SpellScriptLoader +{ + public: + spell_rog_glyph_of_backstab() : SpellScriptLoader("spell_rog_glyph_of_backstab") { } + + class spell_rog_glyph_of_backstab_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_glyph_of_backstab_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_GLYPH_OF_BACKSTAB_TRIGGER)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), SPELL_ROGUE_GLYPH_OF_BACKSTAB_TRIGGER, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_rog_glyph_of_backstab_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_glyph_of_backstab_AuraScript(); + } +}; + // 63975 - Glyph of Backstab (triggered - serverside) class spell_rog_glyph_of_backstab_triggered : public SpellScriptLoader { @@ -642,6 +795,37 @@ class spell_rog_glyph_of_backstab_triggered : public SpellScriptLoader } }; +// -13983 - Setup +class spell_rog_setup : public SpellScriptLoader +{ + public: + spell_rog_setup() : SpellScriptLoader("spell_rog_setup") { } + + class spell_rog_setup_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_setup_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (Player* target = GetTarget()->ToPlayer()) + if (eventInfo.GetActor() == target->GetSelectedUnit()) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_rog_setup_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_setup_AuraScript(); + } +}; + // 5938 - Shiv class spell_rog_shiv : public SpellScriptLoader { @@ -785,16 +969,21 @@ public: { PrepareAuraScript(spell_rog_honor_among_thieves_AuraScript); + bool Validate(SpellInfo const* spellInfo) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_HONOR_AMONG_THIEVES_2) || + !sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; + return true; + } + bool CheckProc(ProcEventInfo& /*eventInfo*/) { Unit* caster = GetCaster(); - if (!caster) + if (!caster || caster->HasAura(SPELL_ROGUE_HONOR_AMONG_THIEVES_2)) return false; - if (!caster->GetSpellHistory()->HasCooldown(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell)) - return true; - - return false; + return true; } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) @@ -806,7 +995,7 @@ public: return; Unit* target = GetTarget(); - target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD), nullptr, aurEff, caster->GetGUID()); + target->CastSpell(target, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, nullptr, aurEff, caster->GetGUID()); } void Register() override @@ -851,36 +1040,9 @@ public: targets.push_back(target); } - void HandleBeforeHit() - { - Unit* target = GetHitUnit(); - if (!target) - return; - - /* - * The applied aura has a duration of 8 seconds - * This prevents new applications while its active - * Removing it on each new proc enables the application from different sources (different grouped players) - * and on new procs after the source cooldown is finished (1 second) - */ - if (target->HasAura(GetSpellInfo()->Id)) - target->RemoveAura(GetSpellInfo()->Id); - } - - void TriggerCooldown() - { - Unit* target = GetHitUnit(); - if (!target) - return; - - target->GetSpellHistory()->AddCooldown(GetSpellInfo()->Id, 0, std::chrono::seconds(1)); - } - void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_honor_among_thieves_proc_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); - BeforeHit += SpellHitFn(spell_rog_honor_among_thieves_proc_SpellScript::HandleBeforeHit); - AfterHit += SpellHitFn(spell_rog_honor_among_thieves_proc_SpellScript::TriggerCooldown); } }; @@ -895,14 +1057,17 @@ public: void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - if (Player* player = GetTarget()->ToPlayer()) - if (Unit* spellTarget = ObjectAccessor::GetUnit(*player, player->GetTarget())) - player->CastSpell(spellTarget, SPELL_ROGUE_HONOR_AMONG_THIEVES_2, true); + Unit* caster = GetCaster(); + if (!caster) + return; + + if (Player* player = caster->ToPlayer()) + player->CastSpell((Unit*)nullptr, SPELL_ROGUE_HONOR_AMONG_THIEVES_2, true); } void Register() override { - AfterEffectApply += AuraEffectApplyFn(spell_rog_honor_among_thieves_proc_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_rog_honor_among_thieves_proc_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; @@ -912,55 +1077,101 @@ public: } }; -// 70805 - Rogue T10 2P Bonus -- THIS SHOULD BE REMOVED WITH NEW PROC SYSTEM. -class spell_rog_t10_2p_bonus : public SpellScriptLoader +// -51627 - Turn the Tables +class spell_rog_turn_the_tables : public SpellScriptLoader { -public: - spell_rog_t10_2p_bonus() : SpellScriptLoader("spell_rog_t10_2p_bonus") { } + public: + spell_rog_turn_the_tables() : SpellScriptLoader("spell_rog_turn_the_tables") { } - class spell_rog_t10_2p_bonus_AuraScript : public AuraScript - { - PrepareAuraScript(spell_rog_t10_2p_bonus_AuraScript); + class spell_rog_turn_the_tables_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_turn_the_tables_AuraScript); - bool Validate(SpellInfo const* /*spellInfo*/) override + bool Validate(SpellInfo const* spellInfo) override + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetTarget(); + target->CastSpell((Unit*)nullptr, GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true, nullptr, aurEff, caster->GetGUID()); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_rog_turn_the_tables_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override { - if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_T10_2P_BONUS)) - return false; - return true; + return new spell_rog_turn_the_tables_AuraScript(); } +}; + +// 52910,52914,52915 - Turn the Tables proc +class spell_rog_turn_the_tables_proc : public SpellScriptLoader +{ + public: + spell_rog_turn_the_tables_proc() : SpellScriptLoader("spell_rog_turn_the_tables_proc") { } - bool CheckProc(ProcEventInfo& eventInfo) + class spell_rog_turn_the_tables_proc_SpellScript : public SpellScript { - return eventInfo.GetActor() == eventInfo.GetActionTarget(); - } + PrepareSpellScript(spell_rog_turn_the_tables_proc_SpellScript); - void Register() override + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.clear(); + + Unit* target = GetOriginalCaster(); + if (!target) + return; + + targets.push_back(target); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_turn_the_tables_proc_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_RAID); + } + }; + + SpellScript* GetSpellScript() const override { - DoCheckProc += AuraCheckProcFn(spell_rog_t10_2p_bonus_AuraScript::CheckProc); + return new spell_rog_turn_the_tables_proc_SpellScript(); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_rog_t10_2p_bonus_AuraScript(); - } }; void AddSC_rogue_spell_scripts() { new spell_rog_blade_flurry(); new spell_rog_cheat_death(); + new spell_rog_cut_to_the_chase(); + new spell_rog_deadly_brew(); new spell_rog_deadly_poison(); new spell_rog_killing_spree(); new spell_rog_nerves_of_steel(); new spell_rog_preparation(); new spell_rog_prey_on_the_weak(); + new spell_rog_quick_recovery(); new spell_rog_rupture(); + new spell_rog_glyph_of_backstab(); new spell_rog_glyph_of_backstab_triggered(); + new spell_rog_setup(); new spell_rog_shiv(); new spell_rog_tricks_of_the_trade(); new spell_rog_tricks_of_the_trade_proc(); new spell_rog_honor_among_thieves(); new spell_rog_honor_among_thieves_proc(); - new spell_rog_t10_2p_bonus(); + new spell_rog_turn_the_tables(); + new spell_rog_turn_the_tables_proc(); } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index ad65c7c6ec7..2a568316ad4 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -31,6 +31,7 @@ enum ShamanSpells { + SPELL_SHAMAN_ANCESTRAL_AWAKENING_DUMMY = 52759, SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC = 52752, SPELL_SHAMAN_BIND_SIGHT = 6277, SPELL_SHAMAN_CLEANSING_TOTEM_EFFECT = 52025, @@ -58,13 +59,78 @@ enum ShamanSpells SPELL_SHAMAN_TOTEM_EARTHBIND_TOTEM = 6474, SPELL_SHAMAN_TOTEM_EARTHEN_POWER = 59566, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL = 52042, - SPELL_SHAMAN_TOTEMIC_MASTERY = 38437 + SPELL_SHAMAN_TOTEMIC_MASTERY = 38437, + SPELL_SHAMAN_TIDAL_FORCE_CRIT = 55166, + SPELL_SHAMAN_TOTEMIC_POWER_MP5 = 28824, + SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER = 28825, + SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER = 28826, + SPELL_SHAMAN_TOTEMIC_POWER_ARMOR = 28827, + SPELL_SHAMAN_WINDFURY_WEAPON_R1 = 8232, + SPELL_SHAMAN_WINDFURY_ATTACK_MH = 25504, + SPELL_SHAMAN_WINDFURY_ATTACK_OH = 33750, + SPELL_SHAMAN_ENERGY_SURGE = 40465, + SPELL_SHAMAN_POWER_SURGE = 40466, + SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE_HEAL = 55533, + SPELL_SHAMAN_SPIRIT_HUNT_HEAL = 58879, + SPELL_SHAMAN_ELECTRIFIED = 64930, + SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE = 71824, + SPELL_SHAMAN_CHAINED_HEAL = 70809, + SPELL_SHAMAN_TOTEM_OF_WRATH_SPELL_POWER = 63283, + SPELL_SHAMAN_FREEZE = 63685, + SPELL_SHAMAN_FLAMETONGUE_ATTACK = 10444, + SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_R1 = 45284, + SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_R1 = 45297, + SPELL_SHAMAN_LIGHTNING_SHIELD_DAMAGE_R1 = 26364, + SPELL_SHAMAN_SHAMANISTIC_RAGE_PROC = 30824, + SPELL_SHAMAN_MAELSTROM_POWER = 70831, + SPELL_SHAMAN_T10_ENHANCEMENT_4P_BONUS = 70832 }; enum ShamanSpellIcons { SHAMAN_ICON_ID_RESTORATIVE_TOTEMS = 338, - SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087 + SHAMAN_ICON_ID_SHAMAN_LAVA_FLOW = 3087, + SHAMAN_ICON_ID_TOTEM_OF_WRATH = 2019 +}; + +// -51556 - Ancestral Awakening +class spell_sha_ancestral_awakening : public SpellScriptLoader +{ + public: + spell_sha_ancestral_awakening() : SpellScriptLoader("spell_sha_ancestral_awakening") { } + + class spell_sha_ancestral_awakening_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_ancestral_awakening_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ANCESTRAL_AWAKENING_DUMMY)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + eventInfo.GetActor()->CastCustomSpell(SPELL_SHAMAN_ANCESTRAL_AWAKENING_DUMMY, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_ancestral_awakening_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_ancestral_awakening_AuraScript(); + } }; // 52759 - Ancestral Awakening (Proc) @@ -167,6 +233,37 @@ class spell_sha_astral_shift : public SpellScriptLoader } }; +// -51474 - Astral Shift aura +class spell_sha_astral_shift_aura : public SpellScriptLoader +{ + public: + spell_sha_astral_shift_aura() : SpellScriptLoader("spell_sha_astral_shift_aura") { } + + class spell_sha_astral_shift_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_astral_shift_aura_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_sha_astral_shift_aura_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_astral_shift_aura_AuraScript(); + } +}; + // 2825 - Bloodlust class spell_sha_bloodlust : public SpellScriptLoader { @@ -311,40 +408,14 @@ class spell_sha_earth_shield : public SpellScriptLoader { 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*/) + 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); - - //! WORKAROUND - // If target is affected by healing reduction, modifier is guaranteed to be negative - // value (e.g. -50). To revert the effect, multiply amount with reciprocal of relative value: - // (100 / ((-1) * modifier)) * 100 = (-1) * 100 * 100 / modifier = -10000 / modifier - if (int32 modifier = GetUnitOwner()->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT)) - ApplyPct(amount, -10000.0f / float(modifier)); - - // 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()); - } - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - //! HACK due to currenct proc system implementation - if (Player* player = GetTarget()->ToPlayer()) - if (player->GetSpellHistory()->HasCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL)) - return false; - return true; + // SpellHealingBonusTaken will be called on Heal } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) @@ -352,16 +423,11 @@ class spell_sha_earth_shield : public SpellScriptLoader PreventDefaultAction(); GetTarget()->CastCustomSpell(SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID()); - - /// @hack: due to currenct proc system implementation - if (Player* player = GetTarget()->ToPlayer()) - player->GetSpellHistory()->AddCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, std::chrono::seconds(3)); } void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_earth_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY); - DoCheckProc += AuraCheckProcFn(spell_sha_earth_shield_AuraScript::CheckProc); OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; @@ -575,6 +641,281 @@ class spell_sha_flame_shock : public SpellScriptLoader } }; +// -10400 - Flametongue Weapon (Passive) +class spell_sha_flametongue_weapon : public SpellScriptLoader +{ + public: + spell_sha_flametongue_weapon() : SpellScriptLoader("spell_sha_flametongue_weapon") { } + + class spell_sha_flametongue_weapon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_flametongue_weapon_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FLAMETONGUE_ATTACK)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + Player* player = eventInfo.GetActor()->ToPlayer(); + if (!player) + return false; + + Item* item = player->GetItemByGuid(GetAura()->GetCastItemGUID()); + if (!item || !item->IsEquipped()) + return false; + + WeaponAttackType attType = static_cast<WeaponAttackType>(player->GetAttackBySlot(item->GetSlot())); + if (attType != BASE_ATTACK && attType != OFF_ATTACK) + return false; + + if (((attType == BASE_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) || + ((attType == OFF_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK))) + return false; + + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Player* player = eventInfo.GetActor()->ToPlayer(); + Unit* target = eventInfo.GetProcTarget(); + WeaponAttackType attType = BASE_ATTACK; + if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK) + attType = OFF_ATTACK; + + Item* item = ASSERT_NOTNULL(player->GetWeaponForAttack(attType)); + + float basePoints(GetSpellInfo()->Effects[aurEff->GetEffIndex()].CalcValue()); + + // Flametongue max damage is normalized based on a 4.0 speed weapon + // Tooltip says max damage = BasePoints / 25, so BasePoints / 25 / 4 to get base damage per 1.0s AS + float fireDamage = basePoints / 100.0f; + float attackSpeed = player->GetAttackTime(attType) / 1000.f; + fireDamage *= attackSpeed; + + // clip value between (BasePoints / 77) and (BasePoints / 25) as the tooltip indicates + RoundToInterval(fireDamage, basePoints / 77.0f, basePoints / 25.0f); + + // Calculate Spell Power scaling + float spellPowerBonus(player->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE) + target->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_FIRE)); + float const spCoeff = 0.03811f; + spellPowerBonus *= spCoeff * attackSpeed; + + // All done, now proc damage + int32 amount = static_cast<int32>(fireDamage + spellPowerBonus); + player->CastCustomSpell(SPELL_SHAMAN_FLAMETONGUE_ATTACK, SPELLVALUE_BASE_POINT0, amount, target, true, item); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_sha_flametongue_weapon_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_flametongue_weapon_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_flametongue_weapon_AuraScript(); + } +}; + +// -63373 - Frozen Power +class spell_sha_frozen_power : public SpellScriptLoader +{ + public: + spell_sha_frozen_power() : SpellScriptLoader("spell_sha_frozen_power") { } + + class spell_sha_frozen_power_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_frozen_power_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_FREEZE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + if (!roll_chance_i(aurEff->GetAmount())) + return; + + Unit* caster = eventInfo.GetActor(); + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_FREEZE); + float minDistance(spellInfo->Effects[EFFECT_0].CalcValue(caster)); + + Unit* target = eventInfo.GetProcTarget(); + if (caster->GetDistance(target) < minDistance) + return; + + caster->CastSpell(target, SPELL_SHAMAN_FREEZE, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_frozen_power_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_frozen_power_AuraScript(); + } +}; + +// 63279 - Glyph of Earth Shield +class spell_sha_glyph_of_earth_shield : public SpellScriptLoader +{ + public: + spell_sha_glyph_of_earth_shield() : SpellScriptLoader("spell_sha_glyph_of_earth_shield") { } + + class spell_sha_glyph_of_earth_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_glyph_of_earth_shield_AuraScript); + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + SpellInfo const* earthShield = eventInfo.GetSpellInfo(); + if (!earthShield) + return; + + AuraEffect* earthShieldEffect = eventInfo.GetProcTarget()->GetAuraEffect(earthShield->Id, EFFECT_0, eventInfo.GetActor()->GetGUID()); + if (!earthShieldEffect) + return; + + int32 amount = earthShieldEffect->GetAmount(); + AddPct(amount, aurEff->GetAmount()); + earthShieldEffect->SetAmount(amount); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_glyph_of_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_glyph_of_earth_shield_AuraScript(); + } +}; + +// 55440 - Glyph of Healing Wave +class spell_sha_glyph_of_healing_wave : public SpellScriptLoader +{ + public: + spell_sha_glyph_of_healing_wave() : SpellScriptLoader("spell_sha_glyph_of_healing_wave") { } + + class spell_sha_glyph_of_healing_wave_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_glyph_of_healing_wave_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + if (caster == eventInfo.GetProcTarget()) + return; + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_SHAMAN_GLYPH_OF_HEALING_WAVE_HEAL, SPELLVALUE_BASE_POINT0, amount, (Unit*)nullptr, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_glyph_of_healing_wave_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_glyph_of_healing_wave_AuraScript(); + } +}; + +// 63280 - Glyph of Totem of Wrath +class spell_sha_glyph_of_totem_of_wrath : public SpellScriptLoader +{ + public: + spell_sha_glyph_of_totem_of_wrath() : SpellScriptLoader("spell_sha_glyph_of_totem_of_wrath") { } + + class spell_sha_glyph_of_totem_of_wrath_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_glyph_of_totem_of_wrath_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEM_OF_WRATH_SPELL_POWER)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Totem of Wrath shares family flags with other totems + // filter by spellIcon instead + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || spellInfo->SpellIconID != SHAMAN_ICON_ID_TOTEM_OF_WRATH) + return false; + + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + + // Fire totem summon slot + Creature* totem = ObjectAccessor::GetCreature(*caster, caster->m_SummonSlot[1]); + if (!totem) + return; + + SpellInfo const* totemSpell = sSpellMgr->GetSpellInfo(totem->m_spells[0]); + if (!totemSpell) + return; + + int32 bp0 = CalculatePct(totemSpell->Effects[EFFECT_0].CalcValue(caster), aurEff->GetAmount()); + int32 bp1 = CalculatePct(totemSpell->Effects[EFFECT_1].CalcValue(caster), aurEff->GetAmount()); + caster->CastCustomSpell((Unit*)nullptr, SPELL_SHAMAN_TOTEM_OF_WRATH_SPELL_POWER, &bp0, &bp1, nullptr, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_sha_glyph_of_totem_of_wrath_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_glyph_of_totem_of_wrath_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_glyph_of_totem_of_wrath_AuraScript(); + } +}; + // 52041, 52046, 52047, 52048, 52049, 52050, 58759, 58760, 58761 - Healing Stream Totem class spell_sha_healing_stream_totem : public SpellScriptLoader { @@ -597,6 +938,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader int32 damage = GetEffectValue(); SpellInfo const* triggeringSpell = GetTriggeringSpell(); if (Unit* target = GetHitUnit()) + { if (Unit* caster = GetCaster()) { if (Unit* owner = caster->GetOwner()) @@ -616,6 +958,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader } caster->CastCustomSpell(target, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); } + } } void Register() override @@ -673,6 +1016,125 @@ class spell_sha_heroism : public SpellScriptLoader } }; +// -16180 - Improved Water Shield +class spell_sha_imp_water_shield : public SpellScriptLoader +{ + public: + spell_sha_imp_water_shield() : SpellScriptLoader("spell_sha_imp_water_shield") { } + + class spell_sha_imp_water_shield_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_imp_water_shield_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + // If we're here, we've already passed initial aura roll + // So just chance based on 100% + + // Default chance for Healing Wave and Riptide + int32 chance = 100; + // Lesser Healing Wave - 0.6 of default + if (spellInfo->SpellFamilyFlags[0] & 0x00000080) + chance = 60; + // Chain heal - 0.3 of default + else if (spellInfo->SpellFamilyFlags[0] & 0x00000100) + chance = 30; + + if (!roll_chance_i(chance)) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + // Get Water Shield + AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0x00000000, 0x00000020, 0x00000000, caster->GetGUID()); + if (!aurEff) + return; + + uint32 spellId = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + caster->CastSpell((Unit*)nullptr, spellId, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_sha_imp_water_shield_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_imp_water_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_imp_water_shield_AuraScript(); + } +}; + +// -30675 - Lightning Overload +class spell_sha_lightning_overload : public SpellScriptLoader +{ + public: + spell_sha_lightning_overload() : SpellScriptLoader("spell_sha_lightning_overload") { } + + class spell_sha_lightning_overload_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_lightning_overload_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_R1) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_R1)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + uint32 spellId; + + // Lightning Bolt + if (spellInfo->SpellFamilyFlags[0] & 0x00000001) + spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_R1, spellInfo->GetRank()); + // Chain Lightning + else + { + // Chain lightning has [LightOverload_Proc_Chance] / [Max_Number_of_Targets] chance to proc of each individual target hit. + // A maxed LO would have a 33% / 3 = 11% chance to proc of each target. + // LO chance was already "accounted" at the proc chance roll, now need to divide the chance by [Max_Number_of_Targets] + float chance = 100.0f / spellInfo->Effects[EFFECT_0].ChainTarget; + if (!roll_chance_f(chance)) + return; + + spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_R1, spellInfo->GetRank()); + } + + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_lightning_overload_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_lightning_overload_AuraScript(); + } +}; + // 23551 - Lightning Shield T2 Bonus class spell_sha_item_lightning_shield : public SpellScriptLoader { @@ -768,7 +1230,11 @@ class spell_sha_item_mana_surge : public SpellScriptLoader void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); - int32 mana = eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetSchoolMask()); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + int32 mana = spellInfo->CalcPowerCost(GetTarget(), eventInfo.GetSchoolMask()); int32 damage = CalculatePct(mana, 35); GetTarget()->CastCustomSpell(SPELL_SHAMAN_ITEM_MANA_SURGE, SPELLVALUE_BASE_POINT0, damage, GetTarget(), true, NULL, aurEff); @@ -787,6 +1253,71 @@ class spell_sha_item_mana_surge : public SpellScriptLoader } }; +// 40463 - Shaman Tier 6 Trinket +class spell_sha_item_t6_trinket : public SpellScriptLoader +{ + public: + spell_sha_item_t6_trinket() : SpellScriptLoader("spell_sha_item_t6_trinket") { } + + class spell_sha_item_t6_trinket_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_item_t6_trinket_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ENERGY_SURGE) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_POWER_SURGE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return; + + uint32 spellId; + int32 chance; + + // Lesser Healing Wave + if (spellInfo->SpellFamilyFlags[0] & 0x00000080) + { + spellId = SPELL_SHAMAN_ENERGY_SURGE; + chance = 10; + } + // Lightning Bolt + else if (spellInfo->SpellFamilyFlags[0] & 0x00000001) + { + spellId = SPELL_SHAMAN_ENERGY_SURGE; + chance = 15; + } + // Stormstrike + else if (spellInfo->SpellFamilyFlags[1] & 0x00000010) + { + spellId = SPELL_SHAMAN_POWER_SURGE; + chance = 50; + } + else + return; + + if (roll_chance_i(chance)) + eventInfo.GetActor()->CastSpell((Unit*)nullptr, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_item_t6_trinket_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_item_t6_trinket_AuraScript(); + } +}; + // 70811 - Item - Shaman T10 Elemental 2P Bonus class spell_sha_item_t10_elemental_2p_bonus : public SpellScriptLoader { @@ -844,11 +1375,12 @@ class spell_sha_lava_lash : public SpellScriptLoader { int32 damage = GetEffectValue(); int32 hitDamage = GetHitDamage(); - if (caster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND)) + if (Item* offhand = caster->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND)) { // Damage is increased by 25% if your off-hand weapon is enchanted with Flametongue. - if (caster->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0x200000, 0, 0)) - AddPct(hitDamage, damage); + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0x200000, 0, 0)) + if (aurEff->GetBase()->GetCastItemGUID() == offhand->GetGUID()) + AddPct(hitDamage, damage); SetHitDamage(hitDamage); } } @@ -912,6 +1444,49 @@ public: } }; +// 53817 - Maelstrom Weapon +class spell_sha_maelstrom_weapon : public SpellScriptLoader +{ + public: + spell_sha_maelstrom_weapon() : SpellScriptLoader("spell_sha_maelstrom_weapon") { } + + class spell_sha_maelstrom_weapon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_maelstrom_weapon_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_MAELSTROM_POWER) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_T10_ENHANCEMENT_4P_BONUS)) + return false; + return true; + } + + void HandleBonus(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetStackAmount() < GetSpellInfo()->StackAmount) + return; + + Unit* caster = GetUnitOwner(); + AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_SHAMAN_T10_ENHANCEMENT_4P_BONUS, EFFECT_0); + if (!aurEff || !roll_chance_i(aurEff->GetAmount())) + return; + + caster->CastSpell((Unit*)nullptr, SPELL_SHAMAN_MAELSTROM_POWER, true); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_sha_maelstrom_weapon_AuraScript::HandleBonus, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_CHANGE_AMOUNT); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_maelstrom_weapon_AuraScript(); + } +}; + // 52031, 52033, 52034, 52035, 52036, 58778, 58779, 58780 - Mana Spring Totem class spell_sha_mana_spring_totem : public SpellScriptLoader { @@ -1021,11 +1596,15 @@ public: void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo) + return; + int32 healthpct = aurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // %s2 - the 30% threshold for health if (Unit* target = eventInfo.GetActionTarget()) { - if (target->HealthBelowPctDamaged(healthpct, eventInfo.GetDamageInfo()->GetDamage())) + if (target->HealthBelowPctDamaged(healthpct, damageInfo->GetDamage())) { uint32 bp = CalculatePct(target->GetMaxHealth(), aurEff->GetAmount()); @@ -1096,6 +1675,170 @@ class spell_sha_sentry_totem : public SpellScriptLoader } }; +// 30823 - Shamanistic Rage +class spell_sha_shamanistic_rage : public SpellScriptLoader +{ + public: + spell_sha_shamanistic_rage() : SpellScriptLoader("spell_sha_shamanistic_rage") { } + + class spell_sha_shamanistic_rage_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_shamanistic_rage_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SHAMANISTIC_RAGE_PROC)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* target = GetTarget(); + int32 amount = CalculatePct(static_cast<int32>(target->GetTotalAttackPowerValue(BASE_ATTACK)), aurEff->GetAmount()); + target->CastCustomSpell(SPELL_SHAMAN_SHAMANISTIC_RAGE_PROC, SPELLVALUE_BASE_POINT0, amount, target, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_shamanistic_rage_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_shamanistic_rage_AuraScript(); + } +}; + +// 58877 - Spirit Hunt +class spell_sha_spirit_hunt : public SpellScriptLoader +{ + public: + spell_sha_spirit_hunt() : SpellScriptLoader("spell_sha_spirit_hunt") { } + + class spell_sha_spirit_hunt_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_spirit_hunt_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_SPIRIT_HUNT_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + Unit* caster = eventInfo.GetActor(); + Unit* target = caster->GetOwner(); + if (!target) + return; + + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_SHAMAN_SPIRIT_HUNT_HEAL, SPELLVALUE_BASE_POINT0, amount, caster, true); + caster->CastCustomSpell(SPELL_SHAMAN_SPIRIT_HUNT_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_spirit_hunt_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_spirit_hunt_AuraScript(); + } +}; + +// -51525 - Static Shock +class spell_sha_static_shock : public SpellScriptLoader +{ + public: + spell_sha_static_shock() : SpellScriptLoader("spell_sha_static_shock") { } + + class spell_sha_static_shock_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_static_shock_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LIGHTNING_SHIELD_DAMAGE_R1)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + + // Get Lightning Shield + AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0x00000400, 0x00000000, 0x00000000, caster->GetGUID()); + if (!aurEff) + return; + + uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_SHAMAN_LIGHTNING_SHIELD_DAMAGE_R1, aurEff->GetSpellInfo()->GetRank()); + eventInfo.GetActor()->CastSpell(eventInfo.GetProcTarget(), spellId, true); + aurEff->GetBase()->DropCharge(); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_static_shock_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_static_shock_AuraScript(); + } +}; + +// 55198 - Tidal Force +class spell_sha_tidal_force_dummy : public SpellScriptLoader +{ + public: + spell_sha_tidal_force_dummy() : SpellScriptLoader("spell_sha_tidal_force_dummy") { } + + class spell_sha_tidal_force_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_tidal_force_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TIDAL_FORCE_CRIT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->RemoveAuraFromStack(SPELL_SHAMAN_TIDAL_FORCE_CRIT); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_tidal_force_dummy_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_tidal_force_dummy_AuraScript(); + } +}; + // -51490 - Thunderstorm class spell_sha_thunderstorm : public SpellScriptLoader { @@ -1165,10 +1908,367 @@ public: } }; +// 28823 - Totemic Power +class spell_sha_t3_6p_bonus : public SpellScriptLoader +{ + public: + spell_sha_t3_6p_bonus() : SpellScriptLoader("spell_sha_t3_6p_bonus") { } + + class spell_sha_t3_6p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_t3_6p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEMIC_POWER_ARMOR) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_TOTEMIC_POWER_MP5)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + uint32 spellId; + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + switch (target->getClass()) + { + case CLASS_PALADIN: + case CLASS_PRIEST: + case CLASS_SHAMAN: + case CLASS_DRUID: + spellId = SPELL_SHAMAN_TOTEMIC_POWER_MP5; + break; + case CLASS_MAGE: + case CLASS_WARLOCK: + spellId = SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER; + break; + case CLASS_HUNTER: + case CLASS_ROGUE: + spellId = SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER; + break; + case CLASS_WARRIOR: + spellId = SPELL_SHAMAN_TOTEMIC_POWER_ARMOR; + break; + default: + return; + } + + caster->CastSpell(target, spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_t3_6p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_t3_6p_bonus_AuraScript(); + } +}; + +// 64928 - Item - Shaman T8 Elemental 4P Bonus +class spell_sha_t8_elemental_4p_bonus : public SpellScriptLoader +{ + public: + spell_sha_t8_elemental_4p_bonus() : SpellScriptLoader("spell_sha_t8_elemental_4p_bonus") { } + + class spell_sha_t8_elemental_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_t8_elemental_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_ELECTRIFIED)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_ELECTRIFIED); + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + + // Add remaining ticks to healing done + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_SHAMAN_ELECTRIFIED, SPELL_AURA_PERIODIC_DAMAGE); + + caster->CastCustomSpell(SPELL_SHAMAN_ELECTRIFIED, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_t8_elemental_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_t8_elemental_4p_bonus_AuraScript(); + } +}; + +// 67228 - Item - Shaman T9 Elemental 4P Bonus (Lava Burst) +class spell_sha_t9_elemental_4p_bonus : public SpellScriptLoader +{ + public: + spell_sha_t9_elemental_4p_bonus() : SpellScriptLoader("spell_sha_t9_elemental_4p_bonus") { } + + class spell_sha_t9_elemental_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_t9_elemental_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE); + int32 amount = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + + // Add remaining ticks to healing done + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE); + + caster->CastCustomSpell(SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_t9_elemental_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_t9_elemental_4p_bonus_AuraScript(); + } +}; + +// 70817 - Item - Shaman T10 Elemental 4P Bonus +class spell_sha_t10_elemental_4p_bonus : public SpellScriptLoader +{ + public: + spell_sha_t10_elemental_4p_bonus() : SpellScriptLoader("spell_sha_t10_elemental_4p_bonus") { } + + class spell_sha_t10_elemental_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_t10_elemental_4p_bonus_AuraScript); + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + + // try to find spell Flame Shock on the target + AuraEffect* flameShock = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x00000000, 0x00000000, caster->GetGUID()); + if (!flameShock) + return; + + Aura* flameShockAura = flameShock->GetBase(); + + int32 maxDuration = flameShockAura->GetMaxDuration(); + int32 newDuration = flameShockAura->GetDuration() + aurEff->GetAmount() * IN_MILLISECONDS; + + flameShockAura->SetDuration(newDuration); + // is it blizzlike to change max duration for FS? + if (newDuration > maxDuration) + flameShockAura->SetMaxDuration(newDuration); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_t10_elemental_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_t10_elemental_4p_bonus_AuraScript(); + } +}; + +// 70808 - Item - Shaman T10 Restoration 4P Bonus +class spell_sha_t10_restoration_4p_bonus : public SpellScriptLoader +{ + public: + spell_sha_t10_restoration_4p_bonus() : SpellScriptLoader("spell_sha_t10_restoration_4p_bonus") { } + + class spell_sha_t10_restoration_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_t10_restoration_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_CHAINED_HEAL)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + HealInfo* healInfo = eventInfo.GetHealInfo(); + if (!healInfo || !healInfo->GetHeal()) + return; + + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_CHAINED_HEAL); + int32 amount = CalculatePct(static_cast<int32>(healInfo->GetHeal()), aurEff->GetAmount()); + amount /= spellInfo->GetMaxTicks(); + + // Add remaining ticks to healing done + Unit* caster = eventInfo.GetActor(); + Unit* target = eventInfo.GetProcTarget(); + amount += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_SHAMAN_CHAINED_HEAL, SPELL_AURA_PERIODIC_HEAL); + + caster->CastCustomSpell(SPELL_SHAMAN_CHAINED_HEAL, SPELLVALUE_BASE_POINT0, amount, target, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_sha_t10_restoration_4p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_t10_restoration_4p_bonus_AuraScript(); + } +}; + +// 33757 - Windfury Weapon (Passive) +class spell_sha_windfury_weapon : public SpellScriptLoader +{ + public: + spell_sha_windfury_weapon() : SpellScriptLoader("spell_sha_windfury_weapon") { } + + class spell_sha_windfury_weapon_AuraScript : public AuraScript + { + PrepareAuraScript(spell_sha_windfury_weapon_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_WINDFURY_WEAPON_R1) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_WINDFURY_ATTACK_MH) || + !sSpellMgr->GetSpellInfo(SPELL_SHAMAN_WINDFURY_ATTACK_OH)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + + Player* player = eventInfo.GetActor()->ToPlayer(); + if (!player) + return false; + + Item* item = player->GetItemByGuid(GetAura()->GetCastItemGUID()); + if (!item || !item->IsEquipped()) + return false; + + WeaponAttackType attType = static_cast<WeaponAttackType>(player->GetAttackBySlot(item->GetSlot())); + if (attType != BASE_ATTACK && attType != OFF_ATTACK) + return false; + + if (((attType == BASE_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK)) || + ((attType == OFF_ATTACK) && !(eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK))) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Player* player = eventInfo.GetActor()->ToPlayer(); + + uint32 spellId = 0; + WeaponAttackType attType = BASE_ATTACK; + if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_MAINHAND_ATTACK) + spellId = SPELL_SHAMAN_WINDFURY_ATTACK_MH; + + if (eventInfo.GetTypeMask() & PROC_FLAG_DONE_OFFHAND_ATTACK) + { + spellId = SPELL_SHAMAN_WINDFURY_ATTACK_OH; + attType = OFF_ATTACK; + } + + Item* item = ASSERT_NOTNULL(player->GetWeaponForAttack(attType)); + + int32 enchantId = static_cast<int32>(item->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)); + int32 extraAttackPower = 0; + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_SHAMAN_WINDFURY_WEAPON_R1); + while (spellInfo) + { + if (spellInfo->Effects[EFFECT_0].MiscValue == enchantId) + { + extraAttackPower = spellInfo->Effects[EFFECT_1].CalcValue(player); + break; + } + spellInfo = spellInfo->GetNextRankSpell(); + } + + if (!extraAttackPower) + return; + + // Value gained from additional AP + int32 amount = static_cast<int32>(extraAttackPower / 14.f * player->GetAttackTime(attType) / 1000.f); + + // Attack twice + for (uint8 i = 0; i < 2; ++i) + player->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, item); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_sha_windfury_weapon_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_sha_windfury_weapon_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_sha_windfury_weapon_AuraScript(); + } +}; + void AddSC_shaman_spell_scripts() { + new spell_sha_ancestral_awakening(); new spell_sha_ancestral_awakening_proc(); new spell_sha_astral_shift(); + new spell_sha_astral_shift_aura(); new spell_sha_bloodlust(); new spell_sha_chain_heal(); new spell_sha_cleansing_totem_pulse(); @@ -1177,18 +2277,37 @@ void AddSC_shaman_spell_scripts() new spell_sha_earthen_power(); new spell_sha_fire_nova(); new spell_sha_flame_shock(); + new spell_sha_flametongue_weapon(); + new spell_sha_frozen_power(); + new spell_sha_glyph_of_earth_shield(); + new spell_sha_glyph_of_healing_wave(); + new spell_sha_glyph_of_totem_of_wrath(); new spell_sha_healing_stream_totem(); new spell_sha_heroism(); + new spell_sha_imp_water_shield(); + new spell_sha_lightning_overload(); new spell_sha_item_lightning_shield(); new spell_sha_item_lightning_shield_trigger(); new spell_sha_item_mana_surge(); + new spell_sha_item_t6_trinket(); new spell_sha_item_t10_elemental_2p_bonus(); new spell_sha_lava_lash(); new spell_sha_lightning_shield(); + new spell_sha_maelstrom_weapon(); new spell_sha_mana_spring_totem(); new spell_sha_mana_tide_totem(); new spell_sha_nature_guardian(); new spell_sha_sentry_totem(); + new spell_sha_shamanistic_rage(); + new spell_sha_spirit_hunt(); + new spell_sha_static_shock(); + new spell_sha_tidal_force_dummy(); new spell_sha_thunderstorm(); new spell_sha_totemic_mastery(); + new spell_sha_t3_6p_bonus(); + new spell_sha_t8_elemental_4p_bonus(); + new spell_sha_t9_elemental_4p_bonus(); + new spell_sha_t10_elemental_4p_bonus(); + new spell_sha_t10_restoration_4p_bonus(); + new spell_sha_windfury_weapon(); } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 5e0074bf9f7..30ad961dca6 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -37,6 +37,7 @@ enum WarlockSpells SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444, + SPELL_WARLOCK_DEMONIC_PACT_PROC = 48090, SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181, SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME = 63311, SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106, @@ -58,13 +59,29 @@ enum WarlockSpells SPELL_WARLOCK_NETHER_PROTECTION_NATURE = 54375, SPELL_WARLOCK_SOULSHATTER = 32835, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, - SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117 + SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117, + SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED = 63321, + SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1 = 27285, + SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC = 32865, + SPELL_WARLOCK_SHADOW_TRANCE = 17941, + SPELL_WARLOCK_SOUL_LEECH_HEAL = 30294, + SPELL_WARLOCK_IMP_SOUL_LEECH_R1 = 54117, + SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1 = 54607, + SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2 = 59118, + SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1 = 54300, + SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2 = 59117, + SPELL_REPLENISHMENT = 57669, + SPELL_WARLOCK_SHADOWFLAME = 37378, + SPELL_WARLOCK_FLAMESHADOW = 37379, + SPELL_WARLOCK_GLYPH_OF_SUCCUBUS = 56250, + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC = 18371 }; enum WarlockSpellIcons { WARLOCK_ICON_ID_IMPROVED_LIFE_TAP = 208, - WARLOCK_ICON_ID_MANA_FEED = 1982 + WARLOCK_ICON_ID_MANA_FEED = 1982, + WARLOCK_ICON_ID_DEMONIC_PACT = 3220 }; // -710 - Banish @@ -250,6 +267,36 @@ class spell_warl_curse_of_doom : public SpellScriptLoader } }; +class spell_warl_decimation : public SpellScriptLoader +{ + public: + spell_warl_decimation() : SpellScriptLoader("spell_warl_decimation") { } + + class spell_warl_decimation_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_decimation_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (eventInfo.GetActionTarget()->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellInfo, eventInfo.GetActor())) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_decimation_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_decimation_AuraScript(); + } +}; + // 48018 - Demonic Circle: Summon class spell_warl_demonic_circle_summon : public SpellScriptLoader { @@ -480,6 +527,79 @@ class spell_warl_fel_synergy : public SpellScriptLoader } }; +// -18094 - Nightfall +// 56218 - Glyph of Corruption +class spell_warl_glyph_of_corruption_nightfall : public SpellScriptLoader +{ + public: + spell_warl_glyph_of_corruption_nightfall() : SpellScriptLoader("spell_warl_glyph_of_corruption_nightfall") { } + + class spell_warl_glyph_of_corruption_nightfall_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_glyph_of_corruption_nightfall_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SHADOW_TRANCE)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_WARLOCK_SHADOW_TRANCE, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_corruption_nightfall_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_glyph_of_corruption_nightfall_AuraScript(); + } +}; + +// 63320 - Glyph of Life Tap +class spell_warl_glyph_of_life_tap : public SpellScriptLoader +{ +public: + spell_warl_glyph_of_life_tap() : SpellScriptLoader("spell_warl_glyph_of_life_tap") { } + + class spell_warl_glyph_of_life_tap_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_glyph_of_life_tap_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_life_tap_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_glyph_of_life_tap_AuraScript(); + } +}; + // 63310 - Glyph of Shadowflame class spell_warl_glyph_of_shadowflame : public SpellScriptLoader { @@ -618,6 +738,44 @@ class spell_warl_health_funnel : public SpellScriptLoader } }; +// -18213 - Improved Drain Soul +class spell_warl_improved_drain_soul : public SpellScriptLoader +{ + public: + spell_warl_improved_drain_soul() : SpellScriptLoader("spell_warl_improved_drain_soul") { } + + class spell_warl_improved_drain_soul_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_improved_drain_soul_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* target = GetTarget(); + int32 bp0 = CalculatePct(target->GetMaxPower(POWER_MANA), GetSpellInfo()->Effects[EFFECT_2].BasePoints); + target->CastCustomSpell(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, SPELLVALUE_BASE_POINT0, bp0, target, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_improved_drain_soul_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_improved_drain_soul_AuraScript(); + } +}; + // -1454 - Life Tap class spell_warl_life_tap : public SpellScriptLoader { @@ -779,6 +937,55 @@ public: } }; +// 54909, 53646 - Demonic Pact +class spell_warl_demonic_pact : public SpellScriptLoader +{ + public: + spell_warl_demonic_pact() : SpellScriptLoader("spell_warl_demonic_pact") { } + + class spell_warl_demonic_pact_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_demonic_pact_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMONIC_PACT_PROC)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetActor() && eventInfo.GetActor()->IsPet(); + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + if (Unit* owner = eventInfo.GetActor()->GetOwner()) + { + if (AuraEffect* aurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_DEMONIC_PACT, EFFECT_0)) + { + int32 bp0 = static_cast<int32>((aurEff->GetAmount() * owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) + 100.0f) / 100.0f); + owner->CastCustomSpell(SPELL_WARLOCK_DEMONIC_PACT_PROC, SPELLVALUE_BASE_POINT0, bp0, (Unit*)nullptr, true, nullptr, aurEff); + } + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_demonic_pact_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_demonic_pact_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_demonic_pact_AuraScript(); + } +}; + // 18541 - Ritual of Doom Effect class spell_warl_ritual_of_doom_effect : public SpellScriptLoader { @@ -807,6 +1014,47 @@ class spell_warl_ritual_of_doom_effect : public SpellScriptLoader } }; +// 6358 - Seduction +class spell_warl_seduction : public SpellScriptLoader +{ + public: + spell_warl_seduction() : SpellScriptLoader("spell_warl_seduction") { } + + class spell_warl_seduction_SpellScript : public SpellScript + { + PrepareSpellScript(spell_warl_seduction_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS)) + return false; + return true; + } + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* owner = GetCaster()->GetOwner(); + if (!owner || !owner->HasAura(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS)) + return; + + Unit* target = GetHitUnit(); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed. + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + } + + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_warl_seduction_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_warl_seduction_SpellScript(); + } +}; + // -27285 - Seed of Corruption class spell_warl_seed_of_corruption : public SpellScriptLoader { @@ -835,6 +1083,118 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader } }; +// -27243 - Seed of Corruption +class spell_warl_seed_of_corruption_dummy : public SpellScriptLoader +{ + public: + spell_warl_seed_of_corruption_dummy() : SpellScriptLoader("spell_warl_seed_of_corruption_dummy") { } + + class spell_warl_seed_of_corruption_dummy_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_seed_of_corruption_dummy_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo) + return; + + int32 amount = aurEff->GetAmount() - damageInfo->GetDamage(); + if (amount > 0) + { + const_cast<AuraEffect*>(aurEff)->SetAmount(amount); + if (!GetTarget()->HealthBelowPctDamaged(1, damageInfo->GetDamage())) + return; + } + + Remove(); + + Unit* caster = GetCaster(); + if (!caster) + return; + + uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1, GetSpellInfo()->GetRank()); + caster->CastSpell(eventInfo.GetActionTarget(), spellId, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_dummy_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_seed_of_corruption_dummy_AuraScript(); + } +}; + +// 32863 - Seed of Corruption +// 36123 - Seed of Corruption +// 38252 - Seed of Corruption +// 39367 - Seed of Corruption +// 44141 - Seed of Corruption +// 70388 - Seed of Corruption +// Monster spells, triggered only on amount drop (not on death) +class spell_warl_seed_of_corruption_generic : public SpellScriptLoader +{ + public: + spell_warl_seed_of_corruption_generic() : SpellScriptLoader("spell_warl_seed_of_corruption_generic") { } + + class spell_warl_seed_of_corruption_generic_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_seed_of_corruption_generic_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo) + return; + + int32 amount = aurEff->GetAmount() - damageInfo->GetDamage(); + if (amount > 0) + { + const_cast<AuraEffect*>(aurEff)->SetAmount(amount); + return; + } + + Remove(); + + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_generic_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_seed_of_corruption_generic_AuraScript(); + } +}; + // -7235 - Shadow Ward class spell_warl_shadow_ward : public SpellScriptLoader { @@ -921,6 +1281,71 @@ class spell_warl_siphon_life : public SpellScriptLoader } }; +// -30293 - Soul Leech +class spell_warl_soul_leech : public SpellScriptLoader +{ + public: + spell_warl_soul_leech() : SpellScriptLoader("spell_warl_soul_leech") { } + + class spell_warl_soul_leech_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_soul_leech_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_LEECH_HEAL) || + !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMP_SOUL_LEECH_R1) || + !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1) || + !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2) || + !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1) || + !sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2) || + !sSpellMgr->GetSpellInfo(SPELL_REPLENISHMENT)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + static uint32 const casterMana[2] = { SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1, SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2 }; + static uint32 const petMana[2] = { SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1, SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2 }; + + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; + + Unit* caster = eventInfo.GetActor(); + int32 bp = CalculatePct(static_cast<int32>(damageInfo->GetDamage()), aurEff->GetAmount()); + caster->CastCustomSpell(SPELL_WARLOCK_SOUL_LEECH_HEAL, SPELLVALUE_BASE_POINT0, bp, caster, true); + + // Improved Soul Leech code below + AuraEffect const* impSoulLeech = GetTarget()->GetAuraEffectOfRankedSpell(SPELL_WARLOCK_IMP_SOUL_LEECH_R1, EFFECT_1, aurEff->GetCasterGUID()); + if (!impSoulLeech) + return; + + uint8 impSoulLeechRank = impSoulLeech->GetSpellInfo()->GetRank(); + uint32 selfSpellId = casterMana[impSoulLeechRank - 1]; + uint32 petSpellId = petMana[impSoulLeechRank - 1]; + + caster->CastSpell((Unit*)nullptr, selfSpellId, true); + caster->CastSpell((Unit*)nullptr, petSpellId, true); + + if (roll_chance_i(impSoulLeech->GetAmount())) + caster->CastSpell((Unit*)nullptr, SPELL_REPLENISHMENT, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_soul_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_soul_leech_AuraScript(); + } +}; + // 29858 - Soulshatter class spell_warl_soulshatter : public SpellScriptLoader { @@ -960,6 +1385,45 @@ class spell_warl_soulshatter : public SpellScriptLoader } }; +// 37377 - Shadowflame +// 39437 - Shadowflame Hellfire and RoF +template <uint32 TriggerSpellId> +class spell_warl_t4_2p_bonus : public SpellScriptLoader +{ + public: + spell_warl_t4_2p_bonus(char const* ScriptName) : SpellScriptLoader(ScriptName) { } + + template <uint32 Trigger> + class spell_warl_t4_2p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_t4_2p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(Trigger)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, Trigger, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_t4_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_t4_2p_bonus_AuraScript<TriggerSpellId>(); + } +}; + // -30108 - Unstable Affliction class spell_warl_unstable_affliction : public SpellScriptLoader { @@ -1005,20 +1469,31 @@ void AddSC_warlock_spell_scripts() new spell_warl_banish(); new spell_warl_create_healthstone(); new spell_warl_curse_of_doom(); + new spell_warl_decimation(); new spell_warl_demonic_circle_summon(); new spell_warl_demonic_circle_teleport(); new spell_warl_demonic_empowerment(); + new spell_warl_demonic_pact(); new spell_warl_everlasting_affliction(); new spell_warl_fel_synergy(); + new spell_warl_glyph_of_life_tap(); new spell_warl_glyph_of_shadowflame(); new spell_warl_haunt(); new spell_warl_health_funnel(); + new spell_warl_glyph_of_corruption_nightfall(); + new spell_warl_improved_drain_soul(); new spell_warl_life_tap(); new spell_warl_nether_protection(); new spell_warl_ritual_of_doom_effect(); + new spell_warl_seduction(); new spell_warl_seed_of_corruption(); + new spell_warl_seed_of_corruption_dummy(); + new spell_warl_seed_of_corruption_generic(); new spell_warl_shadow_ward(); new spell_warl_siphon_life(); + new spell_warl_soul_leech(); new spell_warl_soulshatter(); + new spell_warl_t4_2p_bonus<SPELL_WARLOCK_FLAMESHADOW>("spell_warl_t4_2p_bonus_shadow"); + new spell_warl_t4_2p_bonus<SPELL_WARLOCK_SHADOWFLAME>("spell_warl_t4_2p_bonus_fire"); new spell_warl_unstable_affliction(); } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index ea9ccc956e5..2b6b6facc33 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -32,6 +32,7 @@ enum WarriorSpells SPELL_WARRIOR_BLADESTORM_PERIODIC_WHIRLWIND = 50622, SPELL_WARRIOR_BLOODTHIRST = 23885, SPELL_WARRIOR_BLOODTHIRST_DAMAGE = 23881, + SPELL_WARRIOR_BLOODSURGE_R1 = 29723, SPELL_WARRIOR_CHARGE = 34846, SPELL_WARRIOR_DAMAGE_SHIELD_DAMAGE = 59653, SPELL_WARRIOR_DEEP_WOUNDS_RANK_1 = 12162, @@ -39,6 +40,8 @@ enum WarriorSpells SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 = 12868, SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC = 12721, SPELL_WARRIOR_EXECUTE = 20647, + SPELL_WARRIOR_EXECUTE_GCD_REDUCED = 71069, + SPELL_WARRIOR_EXTRA_CHARGE = 70849, SPELL_WARRIOR_GLYPH_OF_EXECUTION = 58367, SPELL_WARRIOR_GLYPH_OF_VIGILANCE = 63326, SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF = 65156, @@ -46,6 +49,8 @@ enum WarriorSpells SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976, SPELL_WARRIOR_RETALIATION_DAMAGE = 22858, SPELL_WARRIOR_SLAM = 50783, + SPELL_WARRIOR_SLAM_GCD_REDUCED = 71072, + SPELL_WARRIOR_SUDDEN_DEATH_R1 = 46913, SPELL_WARRIOR_SUNDER_ARMOR = 58567, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_1 = 12723, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK_2 = 26654, @@ -55,7 +60,13 @@ enum WarriorSpells 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_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665, + SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER = 59725, + SPELL_WARRIOR_SECOND_WIND_TRIGGER_1 = 29841, + SPELL_WARRIOR_SECOND_WIND_TRIGGER_2 = 29842, + SPELL_WARRIOR_GLYPH_OF_BLOCKING = 58374, + SPELL_WARRIOR_STOICISM = 70845, + SPELL_WARRIOR_T10_MELEE_4P_BONUS = 70847 }; enum WarriorSpellIcons @@ -69,6 +80,7 @@ enum MiscSpells SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY = 25899, SPELL_PRIEST_RENEWED_HOPE = 63944, SPELL_GEN_DAMAGE_REDUCTION_AURA = 68066, + SPELL_CATEGORY_SHIELD_SLAM = 1209 }; // 23881 - Bloodthirst @@ -258,7 +270,10 @@ class spell_warr_deep_wounds : public SpellScriptLoader bool Validate(SpellInfo const* /*spellInfo*/) override { - if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_1) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_2) || !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_3)) + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_1) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_2) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_RANK_3) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC)) return false; return true; } @@ -272,15 +287,11 @@ class spell_warr_deep_wounds : public SpellScriptLoader ApplyPct(damage, 16 * GetSpellInfo()->GetRank()); SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC); - uint32 ticks = uint32(spellInfo->GetDuration()) / spellInfo->Effects[EFFECT_0].Amplitude; + damage /= spellInfo->GetMaxTicks(); // Add remaining ticks to damage done - if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC, EFFECT_0, caster->GetGUID())) - damage += (aurEff->GetAmount() + aurEff->GetBonusAmount()) * aurEff->GetDonePct() * int32(ticks - aurEff->GetTickNumber()); - - damage /= int32(ticks); - - caster->CastCustomSpell(target, SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC, &damage, NULL, NULL, true); + damage += target->GetRemainingPeriodicAmount(caster->GetGUID(), SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC, SPELL_AURA_PERIODIC_DAMAGE); + caster->CastCustomSpell(SPELL_WARRIOR_DEEP_WOUNDS_PERIODIC, SPELLVALUE_BASE_POINT0, damage, target, true); } } @@ -296,6 +307,56 @@ class spell_warr_deep_wounds : public SpellScriptLoader } }; +// -12834 - Deep Wounds Aura +class spell_warr_deep_wounds_aura : public SpellScriptLoader +{ + public: + spell_warr_deep_wounds_aura() : SpellScriptLoader("spell_warr_deep_wounds_aura") { } + + class spell_warr_deep_wounds_aura_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_deep_wounds_aura_AuraScript); + + bool Validate(SpellInfo const* spellInfo) override + { + if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetActor()->GetTypeId() == TYPEID_PLAYER && eventInfo.GetDamageInfo(); + } + + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* actor = eventInfo.GetActor(); + float damage = 0.f; + + if (eventInfo.GetDamageInfo()->GetAttackType() == OFF_ATTACK) + damage = (actor->GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE) + actor->GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE)) / 2.f; + else + damage = (actor->GetFloatValue(UNIT_FIELD_MINDAMAGE) + actor->GetFloatValue(UNIT_FIELD_MAXDAMAGE)) / 2.f; + + actor->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, SPELLVALUE_BASE_POINT0, int32(damage), eventInfo.GetProcTarget(), true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warr_deep_wounds_aura_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_deep_wounds_aura_AuraScript::OnProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_deep_wounds_aura_AuraScript(); + } +}; + // -5308 - Execute class spell_warr_execute : public SpellScriptLoader { @@ -352,6 +413,94 @@ class spell_warr_execute : public SpellScriptLoader } }; +// -29723 - Bloodsurge +// -46913 - Sudden Death +class spell_warr_extra_proc : public SpellScriptLoader +{ + public: + spell_warr_extra_proc() : SpellScriptLoader("spell_warr_extra_proc") { } + + class spell_warr_extra_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_extra_proc_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_T10_MELEE_4P_BONUS) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXTRA_CHARGE) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SLAM_GCD_REDUCED) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_EXECUTE_GCD_REDUCED)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + Unit* target = GetTarget(); + AuraEffect const* bonusAurEff = target->GetAuraEffect(SPELL_WARRIOR_T10_MELEE_4P_BONUS, EFFECT_0); + if (!bonusAurEff) + return; + + if (!roll_chance_i(bonusAurEff->GetAmount())) + return; + + target->CastSpell((Unit*)nullptr, SPELL_WARRIOR_EXTRA_CHARGE, true, nullptr, aurEff); + + SpellInfo const* auraInfo = aurEff->GetSpellInfo(); + if (auraInfo->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_BLOODSURGE_R1))) + target->CastSpell((Unit*)nullptr, SPELL_WARRIOR_SLAM_GCD_REDUCED, true, nullptr, aurEff); + else if (auraInfo->IsRankOf(sSpellMgr->AssertSpellInfo(SPELL_WARRIOR_SUDDEN_DEATH_R1))) + target->CastSpell((Unit*)nullptr, SPELL_WARRIOR_EXECUTE_GCD_REDUCED, true, nullptr, aurEff); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warr_extra_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_extra_proc_AuraScript(); + } +}; + +// 58375 - Glyph of Blocking +class spell_warr_glyph_of_blocking : public SpellScriptLoader +{ + public: + spell_warr_glyph_of_blocking() : SpellScriptLoader("spell_warr_glyph_of_blocking") { } + + class spell_warr_glyph_of_blocking_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_glyph_of_blocking_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_BLOCKING)) + return false; + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_WARRIOR_GLYPH_OF_BLOCKING, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warr_glyph_of_blocking_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_glyph_of_blocking_AuraScript(); + } +}; + // 58387 - Glyph of Sunder Armor class spell_warr_glyph_of_sunder_armor : public SpellScriptLoader { @@ -388,31 +537,39 @@ class spell_warr_glyph_of_sunder_armor : public SpellScriptLoader } }; -// 59725 - Improved Spell Reflection +// -59088 - 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 + class spell_warr_improved_spell_reflection_AuraScript : public AuraScript { - PrepareSpellScript(spell_warr_improved_spell_reflection_SpellScript); + PrepareAuraScript(spell_warr_improved_spell_reflection_AuraScript); - void FilterTargets(std::list<WorldObject*>& unitList) + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER)) + return false; + return true; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - if (GetCaster()) - unitList.remove(GetCaster()); + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastCustomSpell(SPELL_WARRIOR_IMPROVED_SPELL_REFLECTION_TRIGGER, SPELLVALUE_MAX_TARGETS, aurEff->GetAmount(), caster, true); } void Register() override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); + OnEffectProc += AuraEffectProcFn(spell_warr_improved_spell_reflection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); } }; - SpellScript* GetSpellScript() const override + AuraScript* GetAuraScript() const override { - return new spell_warr_improved_spell_reflection_SpellScript(); + return new spell_warr_improved_spell_reflection_AuraScript(); } }; @@ -444,6 +601,44 @@ class spell_warr_intimidating_shout : public SpellScriptLoader } }; +// 70844 - Item - Warrior T10 Protection 4P Bonus +class spell_warr_item_t10_prot_4p_bonus : public SpellScriptLoader +{ + public: + spell_warr_item_t10_prot_4p_bonus() : SpellScriptLoader("spell_warr_item_t10_prot_4p_bonus") { } + + class spell_warr_item_t10_prot_4p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_item_t10_prot_4p_bonus_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_STOICISM)) + return false; + return true; + } + + void HandleProc(ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* target = eventInfo.GetActionTarget(); + int32 bp0 = CalculatePct(target->GetMaxHealth(), GetSpellInfo()->Effects[EFFECT_1].CalcValue()); + target->CastCustomSpell(SPELL_WARRIOR_STOICISM, SPELLVALUE_BASE_POINT0, bp0, (Unit*)nullptr, true); + } + + void Register() override + { + OnProc += AuraProcFn(spell_warr_item_t10_prot_4p_bonus_AuraScript::HandleProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_item_t10_prot_4p_bonus_AuraScript(); + } +}; + // 12975 - Last Stand class spell_warr_last_stand : public SpellScriptLoader { @@ -606,6 +801,56 @@ class spell_warr_retaliation : public SpellScriptLoader } }; +// -29834 - Second Wind +class spell_warr_second_wind : public SpellScriptLoader +{ + public: + spell_warr_second_wind() : SpellScriptLoader("spell_warr_second_wind") { } + + class spell_warr_second_wind_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_second_wind_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOND_WIND_TRIGGER_1) || + !sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SECOND_WIND_TRIGGER_2)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + return (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))) != 0; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + static uint32 const triggeredSpells[2] = { SPELL_WARRIOR_SECOND_WIND_TRIGGER_1, SPELL_WARRIOR_SECOND_WIND_TRIGGER_2 }; + + PreventDefaultAction(); + Unit* caster = eventInfo.GetActionTarget(); + uint32 spellId = triggeredSpells[GetSpellInfo()->GetRank() - 1]; + caster->CastSpell(caster, spellId, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warr_second_wind_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warr_second_wind_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_second_wind_AuraScript(); + } +}; + // 64380, 65941 - Shattering Throw class spell_warr_shattering_throw : public SpellScriptLoader { @@ -737,6 +982,73 @@ class spell_warr_sweeping_strikes : public SpellScriptLoader } }; +// -46951 - Sword and Board +class spell_warr_sword_and_board : public SpellScriptLoader +{ + public: + spell_warr_sword_and_board() : SpellScriptLoader("spell_warr_sword_and_board") { } + + class spell_warr_sword_and_board_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_sword_and_board_AuraScript); + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) + { + // Remove cooldown on Shield Slam + GetTarget()->GetSpellHistory()->ResetCooldowns([](SpellHistory::CooldownStorageType::iterator itr) -> bool + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first); + return spellInfo && spellInfo->GetCategory() == SPELL_CATEGORY_SHIELD_SLAM; + }, true); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warr_sword_and_board_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_sword_and_board_AuraScript(); + } +}; + +// 28845 - Cheat Death +class spell_warr_t3_prot_8p_bonus : public SpellScriptLoader +{ + public: + spell_warr_t3_prot_8p_bonus() : SpellScriptLoader("spell_warr_t3_prot_8p_bonus") { } + + class spell_warr_t3_prot_8p_bonus_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warr_t3_prot_8p_bonus_AuraScript); + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (eventInfo.GetActionTarget()->HealthBelowPct(20)) + return true; + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (damageInfo && damageInfo->GetDamage()) + if (GetTarget()->HealthBelowPctDamaged(20, damageInfo->GetDamage())) + return true; + + return false; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warr_t3_prot_8p_bonus_AuraScript::CheckProc); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warr_t3_prot_8p_bonus_AuraScript(); + } +}; + // 50720 - Vigilance class spell_warr_vigilance : public SpellScriptLoader { @@ -871,17 +1183,24 @@ void AddSC_warrior_spell_scripts() new spell_warr_concussion_blow(); new spell_warr_damage_shield(); new spell_warr_deep_wounds(); + new spell_warr_deep_wounds_aura(); new spell_warr_execute(); + new spell_warr_extra_proc(); + new spell_warr_glyph_of_blocking(); new spell_warr_glyph_of_sunder_armor(); new spell_warr_improved_spell_reflection(); new spell_warr_intimidating_shout(); + new spell_warr_item_t10_prot_4p_bonus(); new spell_warr_last_stand(); new spell_warr_overpower(); new spell_warr_rend(); new spell_warr_retaliation(); + new spell_warr_second_wind(); new spell_warr_shattering_throw(); new spell_warr_slam(); new spell_warr_sweeping_strikes(); + new spell_warr_sword_and_board(); + new spell_warr_t3_prot_8p_bonus(); new spell_warr_vigilance(); new spell_warr_vigilance_trigger(); } |
