From 1ddd884d6a69b2fde6647c6af24cee987dba9510 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Sat, 17 Sep 2022 03:09:04 -0600 Subject: [PATCH 1/7] feat(Core): Implement SP Bonus Coefficients from DBC (#12562) * cherry-pick commit (https://github.com/TrinityCore/TrinityCore/commit/1826437c094966ae339a154844df8587b2122888) * Co-authored by: ariel- * feat(Core): Implement SP Bonus Coefficients from DBC * Several coefficient corrections * Fix spell_dru_lifebloom --- .../rev_1658948121144924800.sql | 817 ++++++++++++++++++ src/server/game/Entities/Unit/Unit.cpp | 15 +- src/server/game/Entities/Unit/Unit.h | 4 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 14 +- src/server/game/Spells/Spell.cpp | 2 +- src/server/game/Spells/SpellEffects.cpp | 22 +- src/server/game/Spells/SpellMgr.cpp | 2 +- src/server/game/Spells/SpellMgr.h | 4 +- src/server/game/World/World.cpp | 2 +- src/server/scripts/Commands/cs_reload.cpp | 2 +- src/server/scripts/Spells/spell_druid.cpp | 4 +- src/server/scripts/Spells/spell_shaman.cpp | 8 +- src/server/scripts/Spells/spell_warrior.cpp | 4 +- 13 files changed, 860 insertions(+), 40 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1658948121144924800.sql diff --git a/data/sql/updates/pending_db_world/rev_1658948121144924800.sql b/data/sql/updates/pending_db_world/rev_1658948121144924800.sql new file mode 100644 index 000000000..84b49dd85 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1658948121144924800.sql @@ -0,0 +1,817 @@ +-- +DELETE FROM `spell_bonus_data` WHERE `entry` IN ( +116, /* Mage - Frost Bolt */ +120, /* Mage - Cone of Cold */ +122, /* Mage - Frost Nova */ +133, /* Mage - Fire ball */ +139, /* Priest - Renew */ +143, /* Mage - Fire ball */ +145, /* Mage - Fire ball */ +172, /* Warlock - Corruption */ +205, /* Mage - Frost Bolt */ +331, /* Shaman - Healing Wave */ +332, /* Shaman - Healing Wave */ +339, /* Druid - Entangling Roots */ +348, /* Warlock - Immolate */ +403, /* Shaman - Lightning Bolt */ +421, /* Shaman - Chain Lightning */ +529, /* Shaman - Lightning Bolt */ +547, /* Shaman - Healing Wave */ +548, /* Shaman - Lightning Bolt */ +585, /* Priest - Smite */ +591, /* Priest - Smite */ +596, /* Priest - Prayer of Healing */ +598, /* Priest - Smite */ +603, /* Warlock - Curse of Doom */ +635, /* Paladin - Holy Light */ +639, /* Paladin - Holy Light */ +647, /* Paladin - Holy Light */ +686, /* Warlock - Shadow Bolt */ +689, /* Warlock - Drain Life */ +695, /* Warlock - Shadow Bolt */ +699, /* Warlock - Drain Life */ +705, /* Warlock - Shadow Bolt */ +707, /* Warlock - Immolate */ +709, /* Warlock - Drain Life */ +755, /* Warlock - Health Funnel */ +774, /* Druid - Rejuvenation */ +837, /* Mage - Frost Bolt */ +865, /* Mage - Frost Nova */ +879, /* Paladin - Exorcism */ +913, /* Shaman - Healing Wave */ +915, /* Shaman - Lightning Bolt */ +930, /* Shaman - Chain Lightning */ +939, /* Shaman - Healing Wave */ +943, /* Shaman - Lightning Bolt */ +959, /* Shaman - Healing Wave */ +980, /* Warlock - Curse of Agony */ +984, /* Priest - Smite */ +996, /* Priest - Prayer of Healing */ +1004, /* Priest - Smite */ +1014, /* Warlock - Curse of Agony */ +1026, /* Paladin - Holy Light */ +1042, /* Paladin - Holy Light */ +1058, /* Druid - Rejuvenation */ +1062, /* Druid - Entangling Roots */ +1064, /* Shaman - Chain Heal */ +1088, /* Warlock - Shadow Bolt */ +1094, /* Warlock - Immolate */ +1106, /* Warlock - Shadow Bolt */ +1120, /* Warlock - Drain Soul */ +1430, /* Druid - Rejuvenation */ +1449, /* Mage - Arcane Explosion */ +1949, /* Warlock - Hellfire */ +2050, /* Priest - Lesser Heal */ +2052, /* Priest - Lesser Heal */ +2053, /* Priest - Lesser Heal */ +2054, /* Priest - Heal */ +2055, /* Priest - Heal */ +2060, /* Priest - Greater Heal */ +2061, /* Priest - Flash Heal */ +2090, /* Druid - Rejuvenation */ +2091, /* Druid - Rejuvenation */ +2120, /* Mage - Flamestrike */ +2121, /* Mage - Flamestrike */ +2136, /* Mage - Fire Blast */ +2137, /* Mage - Fire Blast */ +2138, /* Mage - Fire Blast */ +2812, /* Paladin - Holy Wrath */ +2860, /* Shaman - Chain Lightning */ +2941, /* Warlock - Immolate */ +2944, /* Priest - Devouring Plague */ +2948, /* Mage - Scorch */ +3110, /* Pet Warlock - Firebolt */ +3140, /* Mage - Fire ball */ +3472, /* Paladin - Holy Light */ +3606, /* Shaman - Searing Totem Attack Rank 1 */ +3627, /* Druid - Rejuvenation */ +3674, /* Hunter - Black Arrow($RAP*0.1 / number of ticks) */ +3698, /* Warlock - Health Funnel */ +3699, /* Warlock - Health Funnel */ +3700, /* Warlock - Health Funnel */ +5176, /* Druid - Wrath */ +5177, /* Druid - Wrath */ +5178, /* Druid - Wrath */ +5179, /* Druid - Wrath */ +5180, /* Druid - Wrath */ +5185, /* Druid - Healing Touch */ +5186, /* Druid - Healing Touch */ +5187, /* Druid - Healing Touch */ +5188, /* Druid - Healing Touch */ +5189, /* Druid - Healing Touch */ +5195, /* Druid - Entangling Roots */ +5196, /* Druid - Entangling Roots */ +5570, /* Druid - Insect Swarm */ +5614, /* Paladin - Exorcism */ +5615, /* Paladin - Exorcism */ +5676, /* Warlock - Searing Pain */ +5857, /* Warlock - Hellfire Effect on Enemy Rank 1 */ +6041, /* Shaman - Lightning Bolt */ +6060, /* Priest - Smite */ +6063, /* Priest - Heal */ +6064, /* Priest - Heal */ +6074, /* Priest - Renew */ +6075, /* Priest - Renew */ +6076, /* Priest - Renew */ +6077, /* Priest - Renew */ +6078, /* Priest - Renew */ +6131, /* Mage - Frost Nova */ +6217, /* Warlock - Curse of Agony */ +6350, /* Shaman - Searing Totem Attack Rank 2 */ +6351, /* Shaman - Searing Totem Attack Rank 3 */ +6352, /* Shaman - Searing Totem Attack Rank 4 */ +6353, /* Warlock - Soul Fire */ +6778, /* Druid - Healing Touch */ +6780, /* Druid - Wrath */ +6789, /* Warlock - Death Coil */ +7268, /* Mage - Arcane Missiles */ +7269, /* Mage - Arcane Missiles */ +7270, /* Mage - Arcane Missiles */ +7294, /* Paladin - Retribution Aura */ +7322, /* Mage - Frost Bolt */ +7641, /* Warlock - Shadow Bolt */ +7651, /* Warlock - Drain Life */ +7799, /* Pet Warlock - Firebolt */ +7800, /* Pet Warlock - Firebolt */ +7801, /* Pet Warlock - Firebolt */ +7802, /* Pet Warlock - Firebolt */ +7814, /* Pet Warlock - Lash of Pain */ +7815, /* Pet Warlock - Lash of Pain */ +7816, /* Pet Warlock - Lash of Pain */ +8004, /* Shaman - Lesser Healing Wave */ +8005, /* Shaman - Healing Wave */ +8008, /* Shaman - Lesser Healing Wave */ +8010, /* Shaman - Lesser Healing Wave */ +8034, /* Shaman - Frostbrand Attack */ +8037, /* Shaman - Frostbrand Attack */ +8042, /* Shaman - Earth Shock */ +8044, /* Shaman - Earth Shock */ +8045, /* Shaman - Earth Shock */ +8046, /* Shaman - Earth Shock */ +8050, /* Shaman - Flame Shock */ +8052, /* Shaman - Flame Shock */ +8053, /* Shaman - Flame Shock */ +8056, /* Shaman - Frost Shock */ +8058, /* Shaman - Frost Shock */ +8092, /* Priest - Mind Blast */ +8102, /* Priest - Mind Blast */ +8103, /* Priest - Mind Blast */ +8104, /* Priest - Mind Blast */ +8105, /* Priest - Mind Blast */ +8106, /* Priest - Mind Blast */ +8187, /* Shaman - Magma totem trigger 1 */ +8288, /* Warlock - Drain Soul */ +8289, /* Warlock - Drain Soul */ +8349, /* Shaman - Fire Nova Totem */ +8406, /* Mage - Frost Bolt */ +8407, /* Mage - Frost Bolt */ +8408, /* Mage - Frost Bolt */ +8412, /* Mage - Fire Blast */ +8413, /* Mage - Fire Blast */ +8418, /* Mage - Arcane Missiles */ +8419, /* Mage - Arcane Missiles */ +8422, /* Mage - Flamestrike */ +8423, /* Mage - Flamestrike */ +8437, /* Mage - Arcane Explosion */ +8438, /* Mage - Arcane Explosion */ +8439, /* Mage - Arcane Explosion */ +8444, /* Mage - Scorch */ +8445, /* Mage - Scorch */ +8446, /* Mage - Scorch */ +8492, /* Mage - Cone of Cold */ +8502, /* Shaman - Fire Nova Totem */ +8503, /* Shaman - Fire Nova Totem */ +8903, /* Druid - Healing Touch */ +8905, /* Druid - Wrath */ +8910, /* Druid - Rejuvenation */ +8921, /* Druid - Moonfire */ +8924, /* Druid - Moonfire */ +8925, /* Druid - Moonfire */ +8926, /* Druid - Moonfire */ +8927, /* Druid - Moonfire */ +8928, /* Druid - Moonfire */ +8929, /* Druid - Moonfire */ +8936, /* Druid - Regrowth */ +8938, /* Druid - Regrowth */ +8939, /* Druid - Regrowth */ +8940, /* Druid - Regrowth */ +8941, /* Druid - Regrowth */ +9472, /* Priest - Flash Heal */ +9473, /* Priest - Flash Heal */ +9474, /* Priest - Flash Heal */ +9750, /* Druid - Regrowth */ +9758, /* Druid - Healing Touch */ +9833, /* Druid - Moonfire */ +9834, /* Druid - Moonfire */ +9835, /* Druid - Moonfire */ +9839, /* Druid - Rejuvenation */ +9840, /* Druid - Rejuvenation */ +9841, /* Druid - Rejuvenation */ +9852, /* Druid - Entangling Roots */ +9853, /* Druid - Entangling Roots */ +9856, /* Druid - Regrowth */ +9857, /* Druid - Regrowth */ +9858, /* Druid - Regrowth */ +9888, /* Druid - Healing Touch */ +9889, /* Druid - Healing Touch */ +9912, /* Druid - Wrath */ +10159, /* Mage - Cone of Cold */ +10160, /* Mage - Cone of Cold */ +10161, /* Mage - Cone of Cold */ +10179, /* Mage - Frost Bolt */ +10180, /* Mage - Frost Bolt */ +10181, /* Mage - Frost Bolt */ +10197, /* Mage - Fire Blast */ +10199, /* Mage - Fire Blast */ +10201, /* Mage - Arcane Explosion */ +10202, /* Mage - Arcane Explosion */ +10205, /* Mage - Scorch */ +10206, /* Mage - Scorch */ +10207, /* Mage - Scorch */ +10215, /* Mage - Flamestrike */ +10216, /* Mage - Flamestrike */ +10230, /* Mage - Frost Nova */ +10273, /* Mage - Arcane Missiles */ +10274, /* Mage - Arcane Missiles */ +10312, /* Paladin - Exorcism */ +10313, /* Paladin - Exorcism */ +10314, /* Paladin - Exorcism */ +10318, /* Paladin - Holy Wrath */ +10328, /* Paladin - Holy Light */ +10329, /* Paladin - Holy Light */ +10391, /* Shaman - Lightning Bolt */ +10392, /* Shaman - Lightning Bolt */ +10395, /* Shaman - Healing Wave */ +10396, /* Shaman - Healing Wave */ +10412, /* Shaman - Earth Shock */ +10413, /* Shaman - Earth Shock */ +10414, /* Shaman - Earth Shock */ +10435, /* Shaman - Searing Totem Attack Rank 5 */ +10436, /* Shaman - Searing Totem Attack Rank 6 */ +10447, /* Shaman - Flame Shock */ +10448, /* Shaman - Flame Shock */ +10458, /* Shaman - Frostbrand Attack */ +10466, /* Shaman - Lesser Healing Wave */ +10467, /* Shaman - Lesser Healing Wave */ +10468, /* Shaman - Lesser Healing Wave */ +10472, /* Shaman - Frost Shock */ +10473, /* Shaman - Frost Shock */ +10579, /* Shaman - Magma totem trigger 2 */ +10580, /* Shaman - Magma totem trigger 3 */ +10581, /* Shaman - Magma totem trigger 4 */ +10605, /* Shaman - Chain Lightning */ +10622, /* Shaman - Chain Heal */ +10623, /* Shaman - Chain Heal */ +10915, /* Priest - Flash Heal */ +10916, /* Priest - Flash Heal */ +10917, /* Priest - Flash Heal */ +10927, /* Priest - Renew */ +10928, /* Priest - Renew */ +10929, /* Priest - Renew */ +10933, /* Priest - Smite */ +10934, /* Priest - Smite */ +10945, /* Priest - Mind Blast */ +10946, /* Priest - Mind Blast */ +10947, /* Priest - Mind Blast */ +10960, /* Priest - Prayer of Healing */ +10961, /* Priest - Prayer of Healing */ +10963, /* Priest - Greater Heal */ +10964, /* Priest - Greater Heal */ +10965, /* Priest - Greater Heal */ +11113, /* Mage - Blast Wave */ +11306, /* Shaman - Fire Nova Totem */ +11307, /* Shaman - Fire Nova Totem */ +11366, /* Mage - Pyroblast */ +11659, /* Warlock - Shadow Bolt */ +11660, /* Warlock - Shadow Bolt */ +11661, /* Warlock - Shadow Bolt */ +11665, /* Warlock - Immolate */ +11667, /* Warlock - Immolate */ +11668, /* Warlock - Immolate */ +11675, /* Warlock - Drain Soul */ +11681, /* Warlock - Hellfire Effect on Enemy Rank 1 */ +11682, /* Warlock - Hellfire Effect on Enemy Rank 1 */ +11683, /* Warlock - Hellfire */ +11684, /* Warlock - Hellfire */ +11693, /* Warlock - Health Funnel */ +11694, /* Warlock - Health Funnel */ +11695, /* Warlock - Health Funnel */ +11699, /* Warlock - Drain Life */ +11700, /* Warlock - Drain Life */ +11711, /* Warlock - Curse of Agony */ +11712, /* Warlock - Curse of Agony */ +11713, /* Warlock - Curse of Agony */ +11762, /* Pet Warlock - Firebolt */ +11763, /* Pet Warlock - Firebolt */ +11778, /* Pet Warlock - Lash of Pain */ +11779, /* Pet Warlock - Lash of Pain */ +11780, /* Pet Warlock - Lash of Pain */ +12505, /* Mage - Pyroblast */ +12522, /* Mage - Pyroblast */ +12523, /* Mage - Pyroblast */ +12524, /* Mage - Pyroblast */ +12525, /* Mage - Pyroblast */ +12526, /* Mage - Pyroblast */ +13018, /* Mage - Blast Wave */ +13019, /* Mage - Blast Wave */ +13020, /* Mage - Blast Wave */ +13021, /* Mage - Blast Wave */ +13376, /* Pet Shaman - Fire Elemental Fire Shield */ +14914, /* Priest - Holy Fire */ +15207, /* Shaman - Lightning Bolt */ +15208, /* Shaman - Lightning Bolt */ +15237, /* Priest - Holy Nova Damage */ +15261, /* Priest - Holy Fire */ +15262, /* Priest - Holy Fire */ +15263, /* Priest - Holy Fire */ +15264, /* Priest - Holy Fire */ +15265, /* Priest - Holy Fire */ +15266, /* Priest - Holy Fire */ +15267, /* Priest - Holy Fire */ +15430, /* Priest - Holy Nova Damage */ +15431, /* Priest - Holy Nova Damage */ +16352, /* Shaman - Frostbrand Attack */ +16353, /* Shaman - Frostbrand Attack */ +17877, /* Warlock - Shadowburn */ +17919, /* Warlock - Searing Pain */ +17920, /* Warlock - Searing Pain */ +17921, /* Warlock - Searing Pain */ +17922, /* Warlock - Searing Pain */ +17923, /* Warlock - Searing Pain */ +17924, /* Warlock - Soul Fire */ +17925, /* Warlock - Death Coil */ +17926, /* Warlock - Death Coil */ +18809, /* Mage - Pyroblast */ +18867, /* Warlock - Shadowburn */ +18868, /* Warlock - Shadowburn */ +18869, /* Warlock - Shadowburn */ +18870, /* Warlock - Shadowburn */ +18871, /* Warlock - Shadowburn */ +19236, /* Priest - Desperate Prayer */ +19238, /* Priest - Desperate Prayer */ +19240, /* Priest - Desperate Prayer */ +19241, /* Priest - Desperate Prayer */ +19242, /* Priest - Desperate Prayer */ +19243, /* Priest - Desperate Prayer */ +19276, /* Priest - Devouring Plague */ +19277, /* Priest - Devouring Plague */ +19278, /* Priest - Devouring Plague */ +19279, /* Priest - Devouring Plague */ +19280, /* Priest - Devouring Plague */ +19750, /* Paladin - Flash of Light */ +19939, /* Paladin - Flash of Light */ +19940, /* Paladin - Flash of Light */ +19941, /* Paladin - Flash of Light */ +19942, /* Paladin - Flash of Light */ +19943, /* Paladin - Flash of Light */ +19970, /* Druid - Entangling Roots (Natures Grasp) */ +19971, /* Druid - Entangling Roots (Natures Grasp) */ +19972, /* Druid - Entangling Roots (Natures Grasp) */ +19973, /* Druid - Entangling Roots (Natures Grasp) */ +19974, /* Druid - Entangling Roots (Natures Grasp) */ +19975, /* Druid - Entangling Roots (Natures Grasp) */ +20116, /* Paladin - Consecration */ +20187, /* Paladin - Judgement of Righteousness */ +20922, /* Paladin - Consecration */ +20923, /* Paladin - Consecration */ +20924, /* Paladin - Consecration */ +20925, /* Paladin - Holy Shield */ +20927, /* Paladin - Holy Shield */ +20928, /* Paladin - Holy Shield */ +23455, /* Priest - Holy Nova Heal */ +23458, /* Priest - Holy Nova Heal */ +23459, /* Priest - Holy Nova Heal */ +24239, /* Paladin - Hammer of Wrath */ +24274, /* Paladin - Hammer of Wrath */ +24275, /* Paladin - Hammer of Wrath */ +24974, /* Druid - Insect Swarm */ +24975, /* Druid - Insect Swarm */ +24976, /* Druid - Insect Swarm */ +24977, /* Druid - Insect Swarm */ +25210, /* Priest - Greater Heal */ +25213, /* Priest - Greater Heal */ +25221, /* Priest - Renew */ +25222, /* Priest - Renew */ +25233, /* Priest - Flash Heal */ +25235, /* Priest - Flash Heal */ +25292, /* Paladin - Holy Light */ +25297, /* Druid - Healing Touch */ +25299, /* Druid - Rejuvenation */ +25304, /* Mage - Frost Bolt */ +25307, /* Warlock - Shadow Bolt */ +25308, /* Priest - Prayer of Healing */ +25309, /* Warlock - Immolate */ +25314, /* Priest - Greater Heal */ +25315, /* Priest - Renew */ +25316, /* Priest - Prayer of Healing */ +25329, /* Priest - Holy Nova Heal */ +25331, /* Priest - Holy Nova Damage */ +25346, /* Mage - Arcane Missiles */ +25357, /* Shaman - Healing Wave */ +25363, /* Priest - Smite */ +25364, /* Priest - Smite */ +25372, /* Priest - Mind Blast */ +25375, /* Priest - Mind Blast */ +25384, /* Priest - Holy Fire */ +25391, /* Shaman - Healing Wave */ +25396, /* Shaman - Healing Wave */ +25420, /* Shaman - Lesser Healing Wave */ +25422, /* Shaman - Chain Heal */ +25423, /* Shaman - Chain Heal */ +25437, /* Priest - Desperate Prayer */ +25439, /* Shaman - Chain Lightning */ +25442, /* Shaman - Chain Lightning */ +25448, /* Shaman - Lightning Bolt */ +25449, /* Shaman - Lightning Bolt */ +25454, /* Shaman - Earth Shock */ +25457, /* Shaman - Flame Shock */ +25464, /* Shaman - Frost Shock */ +25467, /* Priest - Devouring Plague */ +25501, /* Shaman - Frostbrand Attack */ +25530, /* Shaman - Searing Totem Attack Rank 7 */ +25535, /* Shaman - Fire Nova Totem */ +25537, /* Shaman - Fire Nova Totem */ +25550, /* Shaman - Magma totem trigger 5 */ +25902, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +25903, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +25911, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +25912, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +25913, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +25914, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +26363, /* Shaman - Lightning Shield Proc Rank 1 */ +26364, /* Shaman - Lightning Shield Proc Rank 1 */ +26365, /* Shaman - Lightning Shield Proc Rank 1 */ +26366, /* Shaman - Lightning Shield Proc Rank 1 */ +26367, /* Shaman - Lightning Shield Proc Rank 1 */ +26369, /* Shaman - Lightning Shield Proc Rank 1 */ +26370, /* Shaman - Lightning Shield Proc Rank 1 */ +26371, /* Shaman - Lightning Shield Proc Rank 1 */ +26372, /* Shaman - Lightning Shield Proc Rank 1 */ +26573, /* Paladin - Consecration */ +26978, /* Druid - Healing Touch */ +26979, /* Druid - Healing Touch */ +26980, /* Druid - Regrowth */ +26981, /* Druid - Rejuvenation */ +26982, /* Druid - Rejuvenation */ +26984, /* Druid - Wrath */ +26985, /* Druid - Wrath */ +26987, /* Druid - Moonfire */ +26988, /* Druid - Moonfire */ +26989, /* Druid - Entangling Roots */ +27010, /* Druid - Entangling Roots (Natures Grasp) */ +27013, /* Druid - Insect Swarm */ +27071, /* Mage - Frost Bolt */ +27072, /* Mage - Frost Bolt */ +27073, /* Mage - Scorch */ +27074, /* Mage - Scorch */ +27076, /* Mage - Arcane Missiles */ +27078, /* Mage - Fire Blast */ +27079, /* Mage - Fire Blast */ +27080, /* Mage - Arcane Explosion */ +27082, /* Mage - Arcane Explosion */ +27086, /* Mage - Flamestrike */ +27087, /* Mage - Cone of Cold */ +27088, /* Mage - Frost Nova */ +27132, /* Mage - Pyroblast */ +27133, /* Mage - Blast Wave */ +27135, /* Paladin - Holy Light */ +27136, /* Paladin - Holy Light */ +27137, /* Paladin - Flash of Light */ +27138, /* Paladin - Exorcism */ +27139, /* Paladin - Holy Wrath */ +27173, /* Paladin - Consecration */ +27175, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +27176, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +27179, /* Paladin - Holy Shield */ +27180, /* Paladin - Hammer of Wrath */ +27209, /* Warlock - Shadow Bolt */ +27210, /* Warlock - Searing Pain */ +27211, /* Warlock - Soul Fire */ +27213, /* Warlock - Hellfire */ +27214, /* Warlock - Hellfire Effect on Enemy Rank 1 */ +27215, /* Warlock - Immolate */ +27217, /* Warlock - Drain Soul */ +27218, /* Warlock - Curse of Agony */ +27219, /* Warlock - Drain Life */ +27220, /* Warlock - Drain Life */ +27223, /* Warlock - Death Coil */ +27243, /* Warlock - Seed of Corruption DOT */ +27259, /* Warlock - Health Funnel */ +27263, /* Warlock - Shadowburn */ +27267, /* Pet Warlock - Firebolt */ +27274, /* Pet Warlock - Lash of Pain */ +27285, /* Warlock - Seed of Corruption DD */ +27799, /* Priest - Holy Nova Damage */ +27800, /* Priest - Holy Nova Damage */ +27801, /* Priest - Holy Nova Damage */ +27803, /* Priest - Holy Nova Heal */ +27804, /* Priest - Holy Nova Heal */ +27805, /* Priest - Holy Nova Heal */ +29228, /* Shaman - Flame Shock */ +29722, /* Warlock - Incinerate */ +30108, /* Warlock - Unstable Affliction */ +30283, /* Warlock - Shadowfury */ +30404, /* Warlock - Unstable Affliction */ +30405, /* Warlock - Unstable Affliction */ +30413, /* Warlock - Shadowfury */ +30414, /* Warlock - Shadowfury */ +30451, /* Mage - Arcane Blast */ +30455, /* Mage - Ice Lance */ +30459, /* Warlock - Searing Pain */ +30545, /* Warlock - Soul Fire */ +30546, /* Warlock - Shadowburn */ +30910, /* Warlock - Curse of Doom */ +31661, /* Mage - Dragons Breath */ +31707, /* Pet Mage - Water Elemental Frostbolt */ +31803, /* Paladin - Seal of Vengeance */ +31804, /* Paladin - Judgement of Vengeance */ +31935, /* Paladin - Avenger Shield */ +32231, /* Warlock - Incinerate */ +32379, /* Priest - Shadow Word: Death */ +32546, /* Priest - Binding Heal */ +32699, /* Paladin - Avenger Shield */ +32700, /* Paladin - Avenger Shield */ +32996, /* Priest - Shadow Word: Death */ +33041, /* Mage - Dragons Breath */ +33042, /* Mage - Dragons Breath */ +33043, /* Mage - Dragons Breath */ +33073, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +33074, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +33763, /* Druid - Lifebloom HOT */ +33933, /* Mage - Blast Wave */ +33938, /* Mage - Pyroblast */ +34861, /* Priest - Circle of Healing */ +34863, /* Priest - Circle of Healing */ +34864, /* Priest - Circle of Healing */ +34865, /* Priest - Circle of Healing */ +34866, /* Priest - Circle of Healing */ +34914, /* Priest - Vampiric Touch */ +34916, /* Priest - Vampiric Touch */ +34917, /* Priest - Vampiric Touch */ +38697, /* Mage - Frost Bolt */ +38700, /* Mage - Arcane Missiles */ +38703, /* Mage - Arcane Missiles */ +42198, /* Mage - Blizzard Triggered Spell */ +42208, /* Mage - Blizzard Triggered Spell */ +42209, /* Mage - Blizzard Triggered Spell */ +42210, /* Mage - Blizzard Triggered Spell */ +42211, /* Mage - Blizzard Triggered Spell */ +42212, /* Mage - Blizzard Triggered Spell */ +42213, /* Mage - Blizzard Triggered Spell */ +42218, /* Warlock - Rain of Fire Triggered Rank 1 */ +42223, /* Warlock - Rain of Fire Triggered Rank 1 */ +42224, /* Warlock - Rain of Fire Triggered Rank 1 */ +42225, /* Warlock - Rain of Fire Triggered Rank 1 */ +42226, /* Warlock - Rain of Fire Triggered Rank 1 */ +42227, /* Pet Warlock - Rain of Fire */ +42230, /* Druid - Hurricane Triggered */ +42231, /* Druid - Hurricane Triggered */ +42232, /* Druid - Hurricane Triggered */ +42233, /* Druid - Hurricane Triggered */ +42841, /* Mage - Frost Bolt */ +42842, /* Mage - Frost Bolt */ +42844, /* Mage - Arcane Missiles */ +42845, /* Mage - Arcane Missiles */ +42858, /* Mage - Scorch */ +42859, /* Mage - Scorch */ +42872, /* Mage - Fire Blast */ +42873, /* Mage - Fire Blast */ +42890, /* Mage - Pyroblast */ +42891, /* Mage - Pyroblast */ +42894, /* Mage - Arcane Blast */ +42896, /* Mage - Arcane Blast */ +42897, /* Mage - Arcane Blast */ +42913, /* Mage - Ice Lance */ +42914, /* Mage - Ice Lance */ +42917, /* Mage - Frost Nova */ +42920, /* Mage - Arcane Explosion */ +42921, /* Mage - Arcane Explosion */ +42925, /* Mage - Flamestrike */ +42926, /* Mage - Flamestrike */ +42930, /* Mage - Cone of Cold */ +42931, /* Mage - Cone of Cold */ +42937, /* Mage - Blizzard Triggered Spell */ +42938, /* Mage - Blizzard Triggered Spell */ +42944, /* Mage - Blast Wave */ +42945, /* Mage - Blast Wave */ +42949, /* Mage - Dragons Breath */ +42950, /* Mage - Dragons Breath */ +44203, /* Druid - Tranquility Triggered */ +44205, /* Druid - Tranquility Triggered */ +44206, /* Druid - Tranquility Triggered */ +44207, /* Druid - Tranquility Triggered */ +44208, /* Druid - Tranquility Triggered */ +44425, /* Mage - Arcane Barrage */ +44457, /* Mage - Living Bomb DOT */ +44461, /* Mage - Living Bomb DD */ +44614, /* Mage - Frostfire Bolt */ +44780, /* Mage - Arcane Barrage */ +44781, /* Mage - Arcane Barrage */ +47610, /* Mage - Frostfire Bolt */ +47666, /* Priest - Pennance damage */ +47750, /* Priest - Pennance heal */ +47808, /* Warlock - Shadow Bolt */ +47809, /* Warlock - Shadow Bolt */ +47810, /* Warlock - Immolate */ +47811, /* Warlock - Immolate */ +47814, /* Warlock - Searing Pain */ +47815, /* Warlock - Searing Pain */ +47817, /* Warlock - Rain of Fire Triggered Rank 1 */ +47818, /* Warlock - Rain of Fire Triggered Rank 1 */ +47822, /* Warlock - Hellfire Effect on Enemy Rank 1 */ +47823, /* Warlock - Hellfire */ +47824, /* Warlock - Soul Fire */ +47825, /* Warlock - Soul Fire */ +47826, /* Warlock - Shadowburn */ +47827, /* Warlock - Shadowburn */ +47833, /* Warlock - Seed of Corruption DD */ +47834, /* Warlock - Seed of Corruption DD */ +47835, /* Warlock - Seed of Corruption DOT */ +47836, /* Warlock - Seed of Corruption DOT */ +47837, /* Warlock - Incinerate */ +47838, /* Warlock - Incinerate */ +47841, /* Warlock - Unstable Affliction */ +47843, /* Warlock - Unstable Affliction */ +47846, /* Warlock - Shadowfury */ +47847, /* Warlock - Shadowfury */ +47855, /* Warlock - Drain Soul */ +47856, /* Warlock - Health Funnel */ +47857, /* Warlock - Drain Life */ +47859, /* Warlock - Death Coil */ +47860, /* Warlock - Death Coil */ +47863, /* Warlock - Curse of Agony */ +47864, /* Warlock - Curse of Agony */ +47867, /* Warlock - Curse of Doom */ +47897, /* Warlock - Shadowflame(rank 1, DD) */ +47960, /* Warlock - Shadowflame(rank 1, DOT) */ +47964, /* Pet Warlock - Firebolt */ +47991, /* Pet Warlock - Lash of Pain */ +47992, /* Pet Warlock - Lash of Pain */ +48062, /* Priest - Greater Heal */ +48063, /* Priest - Greater Heal */ +48067, /* Priest - Renew */ +48068, /* Priest - Renew */ +48070, /* Priest - Flash Heal */ +48071, /* Priest - Flash Heal */ +48072, /* Priest - Prayer of Healing */ +48075, /* Priest - Holy Nova Heal */ +48076, /* Priest - Holy Nova Heal */ +48077, /* Priest - Holy Nova Damage */ +48078, /* Priest - Holy Nova Damage */ +48088, /* Priest - Circle of Healing */ +48089, /* Priest - Circle of Healing */ +48119, /* Priest - Binding Heal */ +48120, /* Priest - Binding Heal */ +48122, /* Priest - Smite */ +48123, /* Priest - Smite */ +48126, /* Priest - Mind Blast */ +48127, /* Priest - Mind Blast */ +48134, /* Priest - Holy Fire */ +48135, /* Priest - Holy Fire */ +48157, /* Priest - Shadow Word: Death */ +48158, /* Priest - Shadow Word: Death */ +48159, /* Priest - Vampiric Touch */ +48160, /* Priest - Vampiric Touch */ +48172, /* Priest - Desperate Prayer */ +48173, /* Priest - Desperate Prayer */ +48299, /* Priest - Devouring Plague */ +48300, /* Priest - Devouring Plague */ +48377, /* Druid - Healing Touch */ +48378, /* Druid - Healing Touch */ +48438, /* Druid - Wild Growth */ +48440, /* Druid - Rejuvenation */ +48441, /* Druid - Rejuvenation */ +48442, /* Druid - Regrowth */ +48443, /* Druid - Regrowth */ +48444, /* Druid - Tranquility Triggered */ +48445, /* Druid - Tranquility Triggered */ +48450, /* Druid - Lifebloom HOT */ +48451, /* Druid - Lifebloom HOT */ +48459, /* Druid - Wrath */ +48461, /* Druid - Wrath */ +48462, /* Druid - Moonfire */ +48463, /* Druid - Moonfire */ +48466, /* Druid - Hurricane Triggered */ +48468, /* Druid - Insect Swarm */ +48781, /* Paladin - Holy Light */ +48782, /* Paladin - Holy Light */ +48784, /* Paladin - Flash of Light */ +48785, /* Paladin - Flash of Light */ +48800, /* Paladin - Exorcism */ +48801, /* Paladin - Exorcism */ +48805, /* Paladin - Hammer of Wrath */ +48806, /* Paladin - Hammer of Wrath */ +48816, /* Paladin - Holy Wrath */ +48817, /* Paladin - Holy Wrath */ +48818, /* Paladin - Consecration */ +48819, /* Paladin - Consecration */ +48820, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +48821, /* Paladin - Holy Shock Triggered Heal Rank 1 */ +48822, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +48823, /* Paladin - Holy Shock Triggered Hurt Rank 1 */ +48826, /* Paladin - Avenger Shield */ +48827, /* Paladin - Avenger Shield */ +48951, /* Paladin - Holy Shield */ +48952, /* Paladin - Holy Shield */ +49230, /* Shaman - Earth Shock */ +49231, /* Shaman - Earth Shock */ +49232, /* Shaman - Flame Shock */ +49233, /* Shaman - Flame Shock */ +49235, /* Shaman - Frost Shock */ +49236, /* Shaman - Frost Shock */ +49237, /* Shaman - Lightning Bolt */ +49238, /* Shaman - Lightning Bolt */ +49270, /* Shaman - Chain Lightning */ +49271, /* Shaman - Chain Lightning */ +49272, /* Shaman - Healing Wave */ +49273, /* Shaman - Healing Wave */ +49275, /* Shaman - Lesser Healing Wave */ +49276, /* Shaman - Lesser Healing Wave */ +49278, /* Shaman - Lightning Shield Proc Rank 1 */ +49279, /* Shaman - Lightning Shield Proc Rank 1 */ +49821, /* Priest - Mind Sear Trigger Rank 1 */ +50288, /* Druid - Starfall rank 1 */ +50294, /* Druid - Starfall AOE rank 1 */ +50464, /* Druid - Nourish */ +50581, /* Warlock - Shadow Cleave */ +50590, /* Warlock - Immolation Aura */ +50796, /* Warlock - Chaos Bolt */ +51505, /* Shaman - Lava Burst */ +51945, /* Shaman - Earthliving Weapon */ +51963, /* Pet Death Knight, Gargoyle Strike */ +51990, /* Shaman - Earthliving Weapon */ +51997, /* Shaman - Earthliving Weapon */ +51998, /* Shaman - Earthliving Weapon */ +51999, /* Shaman - Earthliving Weapon */ +52000, /* Shaman - Earthliving Weapon */ +52042, /* Shaman - Healing Stream Totem Triggered Heal */ +52983, /* Priest - Pennance heal */ +52984, /* Priest - Pennance heal */ +52985, /* Priest - Pennance heal */ +52998, /* Priest - Pennance damage */ +52999, /* Priest - Pennance damage */ +53000, /* Priest - Pennance damage */ +53022, /* Priest - Mind Sear Trigger Rank 1 */ +53188, /* Druid - Starfall AOE rank 2 */ +53189, /* Druid - Starfall AOE rank 3 */ +53190, /* Druid - Starfall AOE rank 4 */ +53191, /* Druid - Starfall rank 2 */ +53194, /* Druid - Starfall rank 3 */ +53195, /* Druid - Starfall rank 4 */ +53227, /* Druid - Typhoon */ +53248, /* Druid - Wild Growth */ +53249, /* Druid - Wild Growth */ +53251, /* Druid - Wild Growth */ +53308, /* Druid - Entangling Roots */ +53313, /* Druid - Entangling Roots (Natures Grasp) */ +53733, /* Paladin - Judgement of Corruption */ +53742, /* Paladin - Seal of Corruption */ +54049, /* Pet Warlock - Shadow Bite */ +54050, /* Pet Warlock - Shadow Bite */ +54051, /* Pet Warlock - Shadow Bite */ +54052, /* Pet Warlock - Shadow Bite */ +54053, /* Pet Warlock - Shadow Bite */ +54158, /* Paladin - Jugdement (Seal of Light, Seal of Wisdom, Seal of Justice) */ +55359, /* Mage - Living Bomb DOT */ +55360, /* Mage - Living Bomb DOT */ +55361, /* Mage - Living Bomb DD */ +55362, /* Mage - Living Bomb DD */ +55458, /* Shaman - Chain Heal */ +55459, /* Shaman - Chain Heal */ +57984, /* Pet Shaman - Fire Elemental Fire Blast */ +58381, /* Priest - Mind Flay */ +58700, /* Shaman - Searing Totem Attack Rank 8 */ +58701, /* Shaman - Searing Totem Attack Rank 9 */ +58702, /* Shaman - Searing Totem Attack Rank 10 */ +58732, /* Shaman - Magma totem trigger 6 */ +58735, /* Shaman - Magma totem trigger 7 */ +58797, /* Shaman - Frostbrand Attack */ +58798, /* Shaman - Frostbrand Attack */ +58799, /* Shaman - Frostbrand Attack */ +59170, /* Warlock - Chaos Bolt */ +59171, /* Warlock - Chaos Bolt */ +59172, /* Warlock - Chaos Bolt */ +59637, /* Pet Mage - Mirror Image Fireblast */ +59638, /* Pet Mage - Mirror Image Frostbolt */ +60043, /* Shaman - Lava Burst */ +61290, /* Warlock - Shadowflame(rank 1, DD) */ +61291, /* Warlock - Shadowflame(rank 2, DOT) */ +61295, /* Shaman - Riptide */ +61299, /* Shaman - Riptide */ +61300, /* Shaman - Riptide */ +61301, /* Shaman - Riptide */ +61387, /* Druid - Typhoon */ +61388, /* Druid - Typhoon */ +61390, /* Druid - Typhoon */ +61391, /* Druid - Typhoon */ +61650, /* Shaman - Fire Nova Totem */ +61654, /* Shaman - Fire Nova Totem */ +63668, /* Hunter - Black Arrow($RAP*0.1 / number of ticks) */ +63669, /* Hunter - Black Arrow($RAP*0.1 / number of ticks) */ +63670, /* Hunter - Black Arrow($RAP*0.1 / number of ticks) */ +63671, /* Hunter - Black Arrow($RAP*0.1 / number of ticks) */ +63672, /* Hunter - Black Arrow($RAP*0.1 / number of ticks) */ +64844, /* Priest - Divine Hymn */ +71757, /* Mage - Deep Freeze */ +72898 /* Pet Mage - Water Elemental Frostbolt */ +); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ce05bb5d6..fb9e51ff6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1762,7 +1762,10 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation if (Unit* caster = (*dmgShieldItr)->GetCaster()) + { + damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex()); damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE); + } uint32 absorb = 0; @@ -11233,7 +11236,7 @@ float Unit::SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, Da return DoneTotalMod; } -uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, float TotalMod, uint32 stack) +uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod, uint32 stack) { if (!spellProto || !victim || damagetype == DIRECT_DAMAGE) return pdamage; @@ -11248,7 +11251,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin if (IsTotem()) { if (Unit* owner = GetOwner()) - return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack); + return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack); } // Dancing Rune Weapon... else if (GetEntry() == 27893) @@ -11325,7 +11328,7 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin int32 DoneAdvertisedBenefit = SpellBaseDamageBonusDone(spellProto->GetSchoolMask()); // Check for table values - float coeff = 0; + float coeff = spellProto->Effects[effIndex].BonusMultiplier; SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id); if (bonus) { @@ -12037,12 +12040,12 @@ float Unit::SpellPctHealingModsDone(Unit* victim, SpellInfo const* spellProto, D return DoneTotalMod; } -uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, float TotalMod, uint32 stack) +uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod, uint32 stack) { // For totems get healing bonus from owner (statue isn't totem in fact) if (GetTypeId() == TYPEID_UNIT && IsTotem()) if (Unit* owner = GetOwner()) - return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, TotalMod, stack); + return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack); // No bonus healing for potion spells if (spellProto->SpellFamilyName == SPELLFAMILY_POTION) @@ -12073,7 +12076,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui // Done fixed damage bonus auras int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask()); - float coeff = 0; + float coeff = spellProto->Effects[effIndex].BonusMultiplier; switch (spellProto->SpellFamilyName) { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 8ece9e956..8d87b3062 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2166,12 +2166,12 @@ public: int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask); int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT = false); float SpellPctDamageModsDone(Unit* victim, SpellInfo const* spellProto, DamageEffectType damagetype); - uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, float TotalMod = 0.0f, uint32 stack = 1); + uint32 SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod = 0.0f, uint32 stack = 1); uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1); int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask); int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask); float SpellPctHealingModsDone(Unit* victim, SpellInfo const* spellProto, DamageEffectType damagetype); - uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, float TotalMod = 0.0f, uint32 stack = 1); + uint32 SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod = 0.0f, uint32 stack = 1); uint32 SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1); uint32 MeleeDamageBonusDone(Unit* pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const* spellProto = nullptr); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 4468cf6c2..94a6d72b6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -551,11 +551,11 @@ int32 AuraEffect::CalculateAmount(Unit* caster) case SPELL_AURA_PERIODIC_LEECH: // xinef: save caster depending auras, always pass 1 as stack amount, effect will be multiplicated at the end of the function by correct value! if (GetBase()->GetType() == UNIT_AURA_TYPE) - amount = caster->SpellDamageBonusDone(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, DOT, GetPctMods(), 1); + amount = caster->SpellDamageBonusDone(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, DOT, GetEffIndex(), GetPctMods(), 1); break; case SPELL_AURA_PERIODIC_HEAL: if (GetBase()->GetType() == UNIT_AURA_TYPE) - amount = caster->SpellHealingBonusDone(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, DOT, GetPctMods(), 1); + amount = caster->SpellHealingBonusDone(GetBase()->GetUnitOwner(), GetSpellInfo(), amount, DOT, GetEffIndex(), GetPctMods(), 1); break; case SPELL_AURA_DAMAGE_SHIELD: if (GetBase()->GetType() == UNIT_AURA_TYPE) @@ -6304,7 +6304,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const { // xinef: leave only target depending bonuses, rest is handled in calculate amount if (GetBase()->GetType() == DYNOBJ_AURA_TYPE && caster) - damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, 0.0f, GetBase()->GetStackAmount()); + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetEffIndex(), 0.0f, GetBase()->GetStackAmount()); damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); // Calculate armor mitigation @@ -6413,7 +6413,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c sScriptMgr->ModifyPeriodicDamageAurasTick(target, caster, damage); if (GetBase()->GetType() == DYNOBJ_AURA_TYPE) - damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, 0.0f, GetBase()->GetStackAmount()); + damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetEffIndex(), 0.0f, GetBase()->GetStackAmount()); damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); bool crit = false; @@ -6483,7 +6483,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c float gainMultiplier = GetSpellInfo()->Effects[GetEffIndex()].CalcValueMultiplier(caster); - uint32 heal = uint32(caster->SpellHealingBonusDone(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, 0.0f, GetBase()->GetStackAmount())); + uint32 heal = uint32(caster->SpellHealingBonusDone(caster, GetSpellInfo(), uint32(new_damage * gainMultiplier), DOT, GetEffIndex(), 0.0f, GetBase()->GetStackAmount())); heal = uint32(caster->SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DOT, GetBase()->GetStackAmount())); HealInfo healInfo(caster, caster, heal, GetSpellInfo(), GetSpellInfo()->GetSchoolMask()); @@ -6604,7 +6604,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const } if (GetBase()->GetType() == DYNOBJ_AURA_TYPE) - damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, 0.0f, GetBase()->GetStackAmount()); + damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, GetEffIndex(), 0.0f, GetBase()->GetStackAmount()); damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount()); } @@ -6898,7 +6898,7 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv } SpellNonMeleeDamage damageInfo(target, triggerTarget, GetSpellInfo(), GetSpellInfo()->SchoolMask); - uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE); + uint32 damage = target->SpellDamageBonusDone(triggerTarget, GetSpellInfo(), GetAmount(), SPELL_DIRECT_DAMAGE, GetEffIndex()); damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE); target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo()); Unit::DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 38abbb126..18a8c30ec 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2845,7 +2845,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) if (m_caster->IsAlive()) { - healthGain = m_caster->SpellHealingBonusDone(m_caster, m_spellInfo, healthGain, HEAL); + healthGain = m_caster->SpellHealingBonusDone(m_caster, m_spellInfo, healthGain, HEAL, effIndex); healthGain = m_caster->SpellHealingBonusTaken(m_caster, m_spellInfo, healthGain, HEAL); HealInfo healInfo(m_caster, m_caster, healthGain, m_spellInfo, m_spellInfo->GetSchoolMask()); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 26b2cb27b..cd5809cd0 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -644,7 +644,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (damage < 0) damage = 0; - damage = m_originalCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); + damage = m_originalCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE, effIndex); damage = unitTarget->SpellDamageBonusTaken(m_originalCaster, m_spellInfo, (uint32)damage, SPELL_DIRECT_DAMAGE); } @@ -1356,7 +1356,7 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex) return; // add spell damage bonus - damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE, effIndex); damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); // resilience reduce mana draining effect at spell crit damage reduction (added in 2.4) @@ -1463,7 +1463,7 @@ void Spell::EffectPowerBurn(SpellEffIndex effIndex) m_damage += newDamage; } -void Spell::EffectHeal(SpellEffIndex /*effIndex*/) +void Spell::EffectHeal(SpellEffIndex effIndex) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; @@ -1550,12 +1550,12 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) // Death Pact - return pct of max health to caster else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] & 0x00080000) { - addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL); + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, int32(caster->CountPctFromMaxHealth(damage)), HEAL, effIndex); addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL); } else if (m_spellInfo->Id != 33778) // not lifebloom { - addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL); + addhealth = caster->SpellHealingBonusDone(unitTarget, m_spellInfo, addhealth, HEAL, effIndex); addhealth = unitTarget->SpellHealingBonusTaken(caster, m_spellInfo, addhealth, HEAL); } @@ -1574,7 +1574,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) } } -void Spell::EffectHealPct(SpellEffIndex /*effIndex*/) +void Spell::EffectHealPct(SpellEffIndex effIndex) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; @@ -1586,13 +1586,13 @@ void Spell::EffectHealPct(SpellEffIndex /*effIndex*/) if (!m_originalCaster) return; - uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL); + uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL, effIndex); heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); m_damage -= heal; } -void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) +void Spell::EffectHealMechanical(SpellEffIndex effIndex) { if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; @@ -1604,12 +1604,12 @@ void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) if (!m_originalCaster) return; - uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL); + uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, uint32(damage), HEAL, effIndex); m_damage -= unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); } -void Spell::EffectHealthLeech(SpellEffIndex /*effIndex*/) +void Spell::EffectHealthLeech(SpellEffIndex effIndex) { if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; @@ -1617,7 +1617,7 @@ void Spell::EffectHealthLeech(SpellEffIndex /*effIndex*/) if (!unitTarget || !unitTarget->IsAlive() || damage < 0) return; - damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); + damage = m_caster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE, effIndex); damage = unitTarget->SpellDamageBonusTaken(m_caster, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE); LOG_DEBUG("spells.aura", "HealthLeech :{}", damage); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 5a7c615d1..579b5548d 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1965,7 +1965,7 @@ void SpellMgr::LoadSpellProcs() LOG_INFO("server.loading", " "); } -void SpellMgr::LoadSpellBonusess() +void SpellMgr::LoadSpellBonuses() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 52201a013..d02342f11 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -381,7 +381,7 @@ struct SpellThreatEntry float apPctMod; // Pct of AP that is added as Threat - default: 0.0f }; -typedef std::map SpellThreatMap; +typedef std::unordered_map SpellThreatMap; typedef std::map SpellMixologyMap; // coordinates for spells (accessed using SpellMgr functions) @@ -752,7 +752,7 @@ public: void LoadSpellGroupStackRules(); void LoadSpellProcEvents(); void LoadSpellProcs(); - void LoadSpellBonusess(); + void LoadSpellBonuses(); void LoadSpellThreats(); void LoadSpellMixology(); void LoadSkillLineAbilityMap(); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 82c25842a..9763ea44a 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1661,7 +1661,7 @@ void World::SetInitialWorldSettings() sSpellMgr->LoadSpellProcs(); LOG_INFO("server.loading", "Loading Spell Bonus Data..."); - sSpellMgr->LoadSpellBonusess(); + sSpellMgr->LoadSpellBonuses(); LOG_INFO("server.loading", "Loading Aggro Spells Definitions..."); sSpellMgr->LoadSpellThreats(); diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 6f3b9ca74..2fee7b3b6 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -872,7 +872,7 @@ public: static bool HandleReloadSpellBonusesCommand(ChatHandler* handler) { LOG_INFO("server.loading", "Re-Loading Spell Bonus Data..."); - sSpellMgr->LoadSpellBonusess(); + sSpellMgr->LoadSpellBonuses(); handler->SendGlobalGMSysMessage("DB table `spell_bonus_data` (spell damage/healing coefficients) reloaded."); return true; } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 021dc7aa7..d7f697a33 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -569,7 +569,7 @@ class spell_dru_lifebloom : public AuraScript if (Unit* caster = GetCaster()) { - healAmount = caster->SpellHealingBonusDone(GetTarget(), finalHeal, healAmount, HEAL, 0.0f, stack); + healAmount = caster->SpellHealingBonusDone(GetTarget(), finalHeal, healAmount, HEAL, aurEff->GetEffIndex(), 0.0f, stack); healAmount = GetTarget()->SpellHealingBonusTaken(caster, finalHeal, healAmount, HEAL, stack); // restore mana int32 returnmana = (GetSpellInfo()->ManaCostPercentage * caster->GetCreateMana() / 100) * stack / 2; @@ -590,7 +590,7 @@ class spell_dru_lifebloom : public AuraScript if (caster) { // healing with bonus - healAmount = caster->SpellHealingBonusDone(target, finalHeal, healAmount, HEAL, 0.0f, dispelInfo->GetRemovedCharges()); + healAmount = caster->SpellHealingBonusDone(target, finalHeal, healAmount, HEAL, EFFECT_1, 0.0f, dispelInfo->GetRemovedCharges()); healAmount = target->SpellHealingBonusTaken(caster, finalHeal, healAmount, HEAL, dispelInfo->GetRemovedCharges()); // mana amount diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 9211527a3..6977a0824 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -525,12 +525,12 @@ class spell_sha_earth_shield : public AuraScript return ValidateSpellInfo({ SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD }); } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) { if (Unit* caster = GetCaster()) { int32 baseAmount = amount; - amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL); + amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL, aurEff->GetEffIndex()); // xinef: taken should be calculated at every heal //amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL); @@ -782,7 +782,7 @@ class spell_sha_healing_stream_totem : public SpellScript return ValidateSpellInfo({ SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM, SPELL_SHAMAN_TOTEM_HEALING_STREAM_HEAL }); } - void HandleDummy(SpellEffIndex /*effIndex*/) + void HandleDummy(SpellEffIndex effIndex) { int32 damage = GetEffectValue(); SpellInfo const* triggeringSpell = GetTriggeringSpell(); @@ -792,7 +792,7 @@ class spell_sha_healing_stream_totem : public SpellScript if (Unit* owner = caster->GetOwner()) { if (triggeringSpell) - damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL)); + damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL, effIndex)); // Restorative Totems if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, SHAMAN_ICON_ID_RESTORATIVE_TOTEMS, 1)) diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index b107256d7..77108ca9a 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -456,14 +456,14 @@ class spell_warr_bloodthirst : public SpellScript return ValidateSpellInfo({ SPELL_WARRIOR_BLOODTHIRST }); } - void HandleDamage(SpellEffIndex /*effIndex*/) + void HandleDamage(SpellEffIndex effIndex) { int32 damage = GetEffectValue(); ApplyPct(damage, GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)); if (Unit* target = GetHitUnit()) { - damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); + damage = GetCaster()->SpellDamageBonusDone(target, GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE, effIndex); damage = target->SpellDamageBonusTaken(GetCaster(), GetSpellInfo(), uint32(damage), SPELL_DIRECT_DAMAGE); } SetHitDamage(damage); From 78077dfdb8eb0b9a955a77861488e18831814966 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 17 Sep 2022 09:11:15 +0000 Subject: [PATCH 2/7] chore(DB): import pending files Referenced commit(s): 1ddd884d6a69b2fde6647c6af24cee987dba9510 --- .../rev_1658948121144924800.sql => db_world/2022_09_17_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1658948121144924800.sql => db_world/2022_09_17_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1658948121144924800.sql b/data/sql/updates/db_world/2022_09_17_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1658948121144924800.sql rename to data/sql/updates/db_world/2022_09_17_00.sql index 84b49dd85..bf3bc3afc 100644 --- a/data/sql/updates/pending_db_world/rev_1658948121144924800.sql +++ b/data/sql/updates/db_world/2022_09_17_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_09_15_01 -> 2022_09_17_00 -- DELETE FROM `spell_bonus_data` WHERE `entry` IN ( 116, /* Mage - Frost Bolt */ From 2682697df68e908f176479368e511872df5d07d5 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 17 Sep 2022 16:51:45 -0300 Subject: [PATCH 3/7] fix(Scripts/TempleOfAhnQiraj): C'thun rewrite (#12993) --- .../rev_1662835816011805500.sql | 10 + .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 575 ++++++------------ .../instance_temple_of_ahnqiraj.cpp | 1 + 3 files changed, 213 insertions(+), 373 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1662835816011805500.sql diff --git a/data/sql/updates/pending_db_world/rev_1662835816011805500.sql b/data/sql/updates/pending_db_world/rev_1662835816011805500.sql new file mode 100644 index 000000000..821a6aef1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1662835816011805500.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `creature_template_movement` WHERE `creatureId` = 15727; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(15727, 1, 0, 0, 1, 0, 0, 0); + +DELETE FROM `areatrigger_scripts` WHERE `ScriptName` = 'at_cthun_stomach_exit' AND `entry` = 4033; +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES (4033, 'at_cthun_stomach_exit'); + +DELETE FROM `areatrigger_scripts` WHERE `ScriptName` = 'at_cthun_center' AND `entry` = 4036; +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES (4036, 'at_cthun_center'); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 3b72c1ea3..9c19e2747 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -46,7 +46,7 @@ enum Spells // ***** Main Phase 2 ****** //Body spells - //SPELL_CARAPACE_CTHUN = 26156 //Was removed from client dbcs + SPELL_CARAPACE_CTHUN = 26156, // Server-side SPELL_TRANSFORM = 26232, SPELL_PURPLE_COLORATION = 22581, //Probably not the right spell but looks similar @@ -69,7 +69,12 @@ enum Spells // Tentacles SPELL_SUBMERGE_VISUAL = 26234, - SPELL_BIRTH = 26262 + SPELL_BIRTH = 26262, + + // Areatriggers + SPELL_SPIT_OUT = 25383, + SPELL_EXIT_STOMACH = 26221, + SPELL_RUBBLE_ROCKY = 26271 }; enum Actions @@ -77,12 +82,24 @@ enum Actions ACTION_FLESH_TENTACLE_KILLED = 1, ACTION_SPAWN_EYE_TENTACLES = 1, + + ACTION_START_PHASE_TWO = 1, +}; + +enum TaskGroups +{ + GROUP_BEAM_PHASE = 1 +}; + +enum Phases +{ + PHASE_BODY = 2 }; enum Misc { MAX_TENTACLE_GROUPS = 5, - GROUP_BEAM_PHASE = 1 + NPC_TRIGGER = 15384, }; enum Yells @@ -128,7 +145,7 @@ const Position KickPos = { -8545.0f, 1984.0f, -96.0f, 0.0f}; struct boss_eye_of_cthun : public BossAI { - boss_eye_of_cthun(Creature* creature) : BossAI(creature, DATA_CTHUN), _summons(creature) + boss_eye_of_cthun(Creature* creature) : BossAI(creature, DATA_CTHUN) { SetCombatMovement(false); } @@ -143,8 +160,6 @@ struct boss_eye_of_cthun : public BossAI _eyeTentacleCounter = 0; //Reset flags - me->RemoveAurasDueToSpell(SPELL_RED_COLORATION); - me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); me->SetVisible(true); @@ -156,19 +171,23 @@ struct boss_eye_of_cthun : public BossAI if (pPortal) pPortal->SetReactState(REACT_PASSIVE); - _summons.DespawnAll(); _scheduler.CancelAll(); BossAI::Reset(); } - void JustDied(Unit* /*killer*/) override { } + void JustDied(Unit* /*killer*/) override + { + if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + { + cthun->AI()->DoAction(ACTION_START_PHASE_TWO); + } + } void EnterCombat(Unit* who) override { DoZoneInCombat(); ScheduleTasks(); - instance->SetData(DATA_CTHUN_PHASE, PHASE_EYE_GREEN_BEAM); BossAI::EnterCombat(who); } @@ -294,39 +313,12 @@ struct boss_eye_of_cthun : public BossAI }); } - void JustSummoned(Creature* summon) override - { - _summons.Summon(summon); - summon->SetInCombatWithZone(); - } - void UpdateAI(uint32 diff) override { //Check if we have a target if (!UpdateVictim()) return; - switch (instance->GetData(DATA_CTHUN_PHASE)) - { - //Transition phase - case PHASE_CTHUN_TRANSITION: - //Remove any target - me->SetTarget(); - me->SetHealth(0); - me->SetVisible(false); - break; - - //Dead phase - case PHASE_CTHUN_DONE: - if (Creature* pPortal = me->FindNearestCreature(NPC_CTHUN_PORTAL, 10)) - { - pPortal->DespawnOrUnsummon(); - } - - me->DespawnOrUnsummon(); - break; - } - _scheduler.Update(diff); } @@ -352,15 +344,18 @@ struct boss_eye_of_cthun : public BossAI //Remove Target field me->SetTarget(); - //Death animation/respawning; - instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_TRANSITION); - me->SetHealth(0); damage = 0; me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); _scheduler.CancelAll(); + + if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + { + cthun->AI()->DoAction(ACTION_START_PHASE_TWO); + } + break; case PHASE_CTHUN_DONE: @@ -382,7 +377,6 @@ private: uint32 _eyeTentacleCounter; TaskScheduler _scheduler; - SummonList _summons; }; struct boss_cthun : public BossAI @@ -392,60 +386,19 @@ struct boss_cthun : public BossAI SetCombatMovement(false); } - //Out of combat whisper timer - uint32 WisperTimer; - - //Global variables - uint32 PhaseTimer; - - //------------------- - - //Phase transition - ObjectGuid HoldPlayer; - - //Body Phase - uint32 EyeTentacleTimer; - uint8 FleshTentaclesKilled; - uint32 GiantClawTentacleTimer; - uint32 GiantEyeTentacleTimer; - uint32 StomachAcidTimer; - uint32 StomachEnterTimer; - uint32 StomachEnterVisTimer; - ObjectGuid StomachEnterTarget; - - //Stomach map, bool = true then in stomach - std::unordered_map Stomach_Map; - void Reset() override { //One random wisper every 90 - 300 seconds WisperTimer = 90000; - //Phase information - PhaseTimer = 10000; //Emerge in 10 seconds - - //No hold player for transition - HoldPlayer.Clear(); - - //Body Phase - EyeTentacleTimer = 30000; - FleshTentaclesKilled = 0; - GiantClawTentacleTimer = 15000; //15 seconds into body phase (1 min repeat) - GiantEyeTentacleTimer = 45000; //15 seconds into body phase (1 min repeat) - StomachAcidTimer = 4000; //Every 4 seconds - StomachEnterTimer = 10000; //Every 10 seconds - StomachEnterVisTimer = 0; //Always 3.5 seconds after Stomach Enter Timer - StomachEnterTarget.Clear(); //Target to be teleported to stomach - - //Clear players in stomach and outside - Stomach_Map.clear(); + _fleshTentaclesKilled = 0; //Reset flags me->RemoveAurasDueToSpell(SPELL_TRANSFORM); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - me->SetVisible(false); - instance->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED); + BossAI::Reset(); + _scheduler.CancelAll(); } void EnterCombat(Unit* /*who*/) override @@ -453,39 +406,80 @@ struct boss_cthun : public BossAI DoZoneInCombat(); } - Unit* SelectRandomNotStomach() + void DoAction(int32 actionId) override { - if (Stomach_Map.empty()) - return nullptr; - - std::unordered_map::const_iterator i = Stomach_Map.begin(); - - std::list temp; - std::list::const_iterator j; - - //Get all players in map - while (i != Stomach_Map.end()) + if (actionId == ACTION_START_PHASE_TWO) { - //Check for valid player - Unit* unit = ObjectAccessor::GetUnit(*me, i->first); + // Animation only plays if Cthun already has this aura... + DoCastSelf(SPELL_TRANSFORM); - //Only units out of stomach - if (unit && !i->second) - temp.push_back(unit); + me->m_Events.AddEventAtOffset([this]() + { + DoCastSelf(SPELL_TRANSFORM); + DoCastSelf(SPELL_CARAPACE_CTHUN, true); + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); + DoZoneInCombat(); + }, 500ms); - ++i; + //Spawn flesh tentacle + for (uint8 i = 0; i < 2; i++) + { + me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); + } + + ScheduleTasks(); } + } - if (temp.empty()) - return nullptr; + void ScheduleTasks() + { + _scheduler.Schedule(13800ms, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, -SPELL_DIGESTIVE_ACID)) + { + target->CastSpell(target, SPELL_MOUTH_TENTACLE, true); - j = temp.begin(); + target->m_Events.AddEventAtOffset([target, this]() + { + DoTeleportPlayer(target, STOMACH_X, STOMACH_Y, STOMACH_Z, STOMACH_O); + target->RemoveAurasDueToSpell(SPELL_MIND_FLAY); + //Cast digestive acid on them + DoCast(target, SPELL_DIGESTIVE_ACID, true); + }, 3800ms); + } - //Get random but only if we have more than one unit on threat list - if (temp.size() > 1) - advance(j, rand() % (temp.size() - 1)); + context.Repeat(); + }).Schedule(30s, [this](TaskContext context) + { + if (Creature* eye = instance->GetCreature(DATA_EYE_OF_CTHUN)) + { + eye->AI()->DoAction(ACTION_SPAWN_EYE_TENTACLES); + } - return (*j); + context.Repeat(30s); + }).Schedule(15s, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, -SPELL_DIGESTIVE_ACID)) + { + //Spawn claw tentacle on the random target + if (Creature* spawned = me->SummonCreature(NPC_GIANT_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500)) + if (spawned->AI()) + spawned->AI()->AttackStart(target); + } + + context.Repeat(1min); + }).Schedule(15s, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, -SPELL_DIGESTIVE_ACID)) + { + //Spawn claw tentacle on the random target + if (Creature* spawned = me->SummonCreature(NPC_GIANT_EYE_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500)) + if (spawned->AI()) + spawned->AI()->AttackStart(target); + } + + context.Repeat(1min); + }); } void UpdateAI(uint32 diff) override @@ -523,277 +517,16 @@ struct boss_cthun : public BossAI me->SetTarget(); - uint32 currentPhase = instance->GetData(DATA_CTHUN_PHASE); - if (currentPhase == PHASE_CTHUN_STOMACH || currentPhase == PHASE_CTHUN_WEAK) - { - // EyeTentacleTimer - if (EyeTentacleTimer <= diff) - { - if (Creature* eye = instance->GetCreature(DATA_EYE_OF_CTHUN)) - { - eye->AI()->DoAction(ACTION_SPAWN_EYE_TENTACLES); - } - - EyeTentacleTimer = 30000; // every 30sec in phase 2 - } - else EyeTentacleTimer -= diff; - } - - switch (currentPhase) - { - //Transition phase - case PHASE_CTHUN_TRANSITION: - //PhaseTimer - if (PhaseTimer <= diff) - { - //Switch - instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_STOMACH); - - //Switch to c'thun model - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_TRANSFORM, false); - me->SetFullHealth(); - - me->SetVisible(true); - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); - - //Emerging phase - //AttackStart(ObjectAccessor::GetUnit(*me, HoldpPlayer)); - DoZoneInCombat(); - - //Place all units in threat list on outside of stomach - Stomach_Map.clear(); - - for (std::list::const_iterator i = me->GetThreatMgr().getThreatList().begin(); i != me->GetThreatMgr().getThreatList().end(); ++i) - Stomach_Map[(*i)->getUnitGuid()] = false; //Outside stomach - - //Spawn 2 flesh tentacles - FleshTentaclesKilled = 0; - - //Spawn flesh tentacle - for (uint8 i = 0; i < 2; i++) - { - Creature* spawned = me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); - if (!spawned) - ++FleshTentaclesKilled; - } - - PhaseTimer = 0; - } - else PhaseTimer -= diff; - - break; - - //Body Phase - case PHASE_CTHUN_STOMACH: - //Remove Target field - me->SetTarget(); - - //Weaken - if (FleshTentaclesKilled > 1) - { - instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_WEAK); - - Talk(EMOTE_WEAKENED); - PhaseTimer = 45000; - - DoCast(me, SPELL_PURPLE_COLORATION, true); - - std::unordered_map::iterator i = Stomach_Map.begin(); - - //Kick all players out of stomach - while (i != Stomach_Map.end()) - { - //Check for valid player - Unit* unit = ObjectAccessor::GetUnit(*me, i->first); - - //Only move units in stomach - if (unit && i->second) - { - //Teleport each player out - DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10, float(rand() % 6)); - - //Cast knockback on them - DoCast(unit, SPELL_EXIT_STOMACH_KNOCKBACK, true); - - //Remove the acid debuff - unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); - - i->second = false; - } - ++i; - } - - return; - } - - //Stomach acid - if (StomachAcidTimer <= diff) - { - //Apply aura to all players in stomach - std::unordered_map::iterator i = Stomach_Map.begin(); - - while (i != Stomach_Map.end()) - { - //Check for valid player - Unit* unit = ObjectAccessor::GetUnit(*me, i->first); - - //Only apply to units in stomach - if (unit && i->second) - { - //Cast digestive acid on them - DoCast(unit, SPELL_DIGESTIVE_ACID, true); - - //Check if player should be kicked from stomach - if (unit->IsWithinDist3d(&KickPos, 15.0f)) - { - //Teleport each player out - DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10, float(rand() % 6)); - - //Cast knockback on them - DoCast(unit, SPELL_EXIT_STOMACH_KNOCKBACK, true); - - //Remove the acid debuff - unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); - - i->second = false; - } - } - ++i; - } - - StomachAcidTimer = 4000; - } - else StomachAcidTimer -= diff; - - //Stomach Enter Timer - if (StomachEnterTimer <= diff) - { - if (Unit* target = SelectRandomNotStomach()) - { - //Set target in stomach - Stomach_Map[target->GetGUID()] = true; - target->InterruptNonMeleeSpells(false); - target->CastSpell(target, SPELL_MOUTH_TENTACLE, true, nullptr, nullptr, me->GetGUID()); - StomachEnterTarget = target->GetGUID(); - StomachEnterVisTimer = 3800; - } - - StomachEnterTimer = 13800; - } - else StomachEnterTimer -= diff; - - if (StomachEnterVisTimer && StomachEnterTarget) - { - if (StomachEnterVisTimer <= diff) - { - //Check for valid player - Unit* unit = ObjectAccessor::GetUnit(*me, StomachEnterTarget); - - if (unit) - { - DoTeleportPlayer(unit, STOMACH_X, STOMACH_Y, STOMACH_Z, STOMACH_O); - } - - StomachEnterTarget.Clear(); - StomachEnterVisTimer = 0; - } - else StomachEnterVisTimer -= diff; - } - - //GientClawTentacleTimer - if (GiantClawTentacleTimer <= diff) - { - if (Unit* target = SelectRandomNotStomach()) - { - //Spawn claw tentacle on the random target - if (Creature* spawned = me->SummonCreature(NPC_GIANT_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500)) - if (spawned->AI()) - spawned->AI()->AttackStart(target); - } - - //One giant claw tentacle every minute - GiantClawTentacleTimer = 60000; - } - else GiantClawTentacleTimer -= diff; - - //GiantEyeTentacleTimer - if (GiantEyeTentacleTimer <= diff) - { - if (Unit* target = SelectRandomNotStomach()) - { - //Spawn claw tentacle on the random target - if (Creature* spawned = me->SummonCreature(NPC_GIANT_EYE_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500)) - if (spawned->AI()) - spawned->AI()->AttackStart(target); - } - - //One giant eye tentacle every minute - GiantEyeTentacleTimer = 60000; - } - else GiantEyeTentacleTimer -= diff; - - break; - - //Weakened state - case PHASE_CTHUN_WEAK: - //PhaseTimer - if (PhaseTimer <= diff) - { - //Switch - instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_STOMACH); - - //Remove purple coloration - me->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION); - - //Spawn 2 flesh tentacles - FleshTentaclesKilled = 0; - - //Spawn flesh tentacle - for (uint8 i = 0; i < 2; i++) - { - Creature* spawned = me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); - if (!spawned) - ++FleshTentaclesKilled; - } - - PhaseTimer = 0; - } - else PhaseTimer -= diff; - - break; - } + _scheduler.Update(diff); } void JustDied(Unit* killer) override { - instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_DONE); BossAI::JustDied(killer); - } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override - { - switch (instance->GetData(DATA_CTHUN_PHASE)) + if (Creature* pPortal = me->FindNearestCreature(NPC_CTHUN_PORTAL, 10.0f)) { - case PHASE_CTHUN_STOMACH: - //Not weakened so reduce damage by 99% - damage /= 100; - if (damage == 0) - damage = 1; - - //Prevent death in non-weakened state - if (damage >= me->GetHealth()) - damage = 0; - - return; - - case PHASE_CTHUN_WEAK: - //Weakened - takes normal damage - return; - - default: - damage = 0; - break; + pPortal->DespawnOrUnsummon(); } } @@ -801,9 +534,42 @@ struct boss_cthun : public BossAI { if (creature->GetEntry() == NPC_FLESH_TENTACLE) { - ++FleshTentaclesKilled; + ++_fleshTentaclesKilled; + + if (_fleshTentaclesKilled > 1) + { + _scheduler.CancelAll(); + + _fleshTentaclesKilled = 0; + + Talk(EMOTE_WEAKENED); + + DoCast(me, SPELL_PURPLE_COLORATION, true); + me->RemoveAurasDueToSpell(SPELL_CARAPACE_CTHUN); + + _scheduler.Schedule(45s, [this](TaskContext /*context*/) + { + ScheduleTasks(); + //Remove purple coloration + me->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION); + + //Spawn flesh tentacle + for (uint8 i = 0; i < 2; i++) + { + me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); + } + }); + } } } + + private: + //Out of combat whisper timer + uint32 WisperTimer; + + //Body Phase + uint8 _fleshTentaclesKilled; + TaskScheduler _scheduler; }; struct npc_eye_tentacle : public ScriptedAI @@ -968,6 +734,8 @@ struct npc_giant_claw_tentacle : public ScriptedAI DoCastSelf(SPELL_THRASH); context.Repeat(10s); }); + + ScheduleMeleeCheck(); } void ScheduleMeleeCheck() @@ -1113,6 +881,65 @@ private: ObjectGuid _portalGUID; }; +// 4033 - At C'thun's stomach +class at_cthun_stomach_exit : public AreaTriggerScript +{ +public: + at_cthun_stomach_exit() : AreaTriggerScript("at_cthun_stomach_exit") { } + + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + { + player->CastSpell(player, SPELL_RUBBLE_ROCKY, true); + + player->m_Events.AddEventAtOffset([player]() + { + if (Creature* trigger = player->FindNearestCreature(NPC_TRIGGER, 15.0f)) + { + trigger->CastSpell(player, SPELL_EXIT_STOMACH, true); + } + }, 3s); + + player->m_Events.AddEventAtOffset([player]() + { + player->JumpTo(0.0f, 80.0f, false); + }, 5s); + + player->m_Events.AddEventAtOffset([player, cthun]() + { + if (cthun) + { + player->NearTeleportTo(cthun->GetPositionX(), cthun->GetPositionY(), cthun->GetPositionZ() + 10, float(rand32() % 6)); + } + + player->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); + }, 6s); + } + } + + return true; + } +}; + +class at_cthun_center : public AreaTriggerScript +{ +public: + at_cthun_center() : AreaTriggerScript("at_cthun_center") { } + + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override + { + if (Creature* trigger = player->FindNearestCreature(NPC_TRIGGER, 15.0f)) + { + trigger->CastSpell(player, SPELL_SPIT_OUT, true); + } + + return true; + } +}; + void AddSC_boss_cthun() { RegisterTempleOfAhnQirajCreatureAI(boss_eye_of_cthun); @@ -1121,4 +948,6 @@ void AddSC_boss_cthun() RegisterTempleOfAhnQirajCreatureAI(npc_claw_tentacle); RegisterTempleOfAhnQirajCreatureAI(npc_giant_claw_tentacle); RegisterTempleOfAhnQirajCreatureAI(npc_giant_eye_tentacle); + new at_cthun_stomach_exit(); + new at_cthun_center(); } diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp index aeab896c8..773e8afb3 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp @@ -23,6 +23,7 @@ ObjectData const creatureData[] = { { NPC_SARTURA, DATA_SARTURA }, + { NPC_CTHUN, DATA_CTHUN }, { NPC_EYE_OF_CTHUN, DATA_EYE_OF_CTHUN }, { NPC_OURO_SPAWNER, DATA_OURO_SPAWNER }, { NPC_MASTERS_EYE, DATA_MASTERS_EYE }, From a3ac2787bbea7f996697d31106a191f3504c9249 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 17 Sep 2022 19:53:54 +0000 Subject: [PATCH 4/7] chore(DB): import pending files Referenced commit(s): 2682697df68e908f176479368e511872df5d07d5 --- .../rev_1662835816011805500.sql => db_world/2022_09_17_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1662835816011805500.sql => db_world/2022_09_17_01.sql} (93%) diff --git a/data/sql/updates/pending_db_world/rev_1662835816011805500.sql b/data/sql/updates/db_world/2022_09_17_01.sql similarity index 93% rename from data/sql/updates/pending_db_world/rev_1662835816011805500.sql rename to data/sql/updates/db_world/2022_09_17_01.sql index 821a6aef1..ade3c32ce 100644 --- a/data/sql/updates/pending_db_world/rev_1662835816011805500.sql +++ b/data/sql/updates/db_world/2022_09_17_01.sql @@ -1,3 +1,4 @@ +-- DB update 2022_09_17_00 -> 2022_09_17_01 -- DELETE FROM `creature_template_movement` WHERE `creatureId` = 15727; INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES From 9c4a9178f3da73c21536b2ce7ceb6b0ad10dfc1b Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 17 Sep 2022 16:54:16 -0300 Subject: [PATCH 5/7] =?UTF-8?q?chore(Core/Player):=20Small=20optimization?= =?UTF-8?q?=20in=20the=20IsInWhisperWhiteList()=20=E2=80=A6=20(#13026)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...function. --- src/server/game/Entities/Player/Player.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 80818758f..d1fb0338e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15515,9 +15515,13 @@ void Player::_SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans) bool Player::IsInWhisperWhiteList(ObjectGuid guid) { - for (WhisperListContainer::const_iterator itr = WhisperList.begin(); itr != WhisperList.end(); ++itr) - if (*itr == guid) + for (auto const& itr : WhisperList) + { + if (itr == guid) + { return true; + } + } return false; } From 3dde9d904c0d9a25e60d28a90f946579f2b8be33 Mon Sep 17 00:00:00 2001 From: SoglaHash <74299960+SoglaHash@users.noreply.github.com> Date: Sun, 18 Sep 2022 00:05:43 +0200 Subject: [PATCH 6/7] fix(Core/Spell): Mixology duration Gift of Arthas (#12982) Gift of Arthas duration with Mixology should be increased to 1 hour Closes https://github.com/azerothcore/azerothcore-wotlk/issues/12941 --- src/server/game/Spells/SpellInfoCorrections.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 531b1f00f..4545c377a 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4385,6 +4385,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->ProcFlags = PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS; }); + // Gift of Arthas + ApplySpellFix({ 11371 }, [](SpellInfo* spellInfo) + { + spellInfo->SpellFamilyName = SPELLFAMILY_POTION; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From f06f5a1334c40e010abe47488bb2847f21f54696 Mon Sep 17 00:00:00 2001 From: Malcrom Date: Sun, 18 Sep 2022 10:36:15 -0300 Subject: [PATCH 7/7] fix(Core/Smart Scripts): Add param5 flag for range event (#13049) * fix(Core/Smart Scripts): Add param5 flag for range event to prevent cast on entering combat. --- src/server/game/AI/SmartScripts/SmartScript.cpp | 9 +++++++-- src/server/game/AI/SmartScripts/SmartScriptMgr.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 61db4f067..58f1f33a4 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3430,8 +3430,13 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui if (me->IsInRange(me->GetVictim(), (float)e.event.minMaxRepeat.min, (float)e.event.minMaxRepeat.max)) ProcessTimedAction(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax, me->GetVictim()); - else // xinef: make it predictable - RecalcTimer(e, 500, 500); + else + { + if (!e.event.minMaxRepeat.controller) + RecalcTimer(e, 500, 500); // xinef: make it predictable "Malcrom: This seems to be done to standardize min, max start rather than using the range values for the timer." + else + RecalcTimer(e, e.event.minMaxRepeat.repeatMin, e.event.minMaxRepeat.repeatMax); // Malcrom: if param5 value is greater than 0 first action will not happen until after repeat timer fires. + } break; } case SMART_EVENT_VICTIM_CASTING: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 5bb07ec3e..74e9c9199 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -221,6 +221,7 @@ struct SmartEvent uint32 max; uint32 repeatMin; uint32 repeatMax; + uint32 controller; } minMaxRepeat; struct