From 20515ec13ba8e4349538c4797e19cb034170d428 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 7 Oct 2022 19:33:48 -0300 Subject: [PATCH 01/66] fix(DB/loot): Adjust AQ40 loot (#13327) --- .../rev_1662213489218975200.sql | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1662213489218975200.sql diff --git a/data/sql/updates/pending_db_world/rev_1662213489218975200.sql b/data/sql/updates/pending_db_world/rev_1662213489218975200.sql new file mode 100644 index 000000000..abd73f441 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1662213489218975200.sql @@ -0,0 +1,115 @@ +-- Idols +UPDATE `creature_loot_template` SET `Chance`=0.4 WHERE `Item` IN (20874, 20875, 20876, 20877, 20878, 20879, 20881, 20882); + +-- The Prophet Skeram +DELETE FROM `reference_loot_template` WHERE `Entry`=34046; +DELETE FROM `creature_loot_template` WHERE (`Entry` = 15263) AND (`Item` IN (34045, 34046, 21128, 21698, 21699, 21700, 21701, 21702, 21703, 21704, 21705, 21706, 21707, 21708, 21814)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(15263, 21128, 0, 10, 0, 1, 1, 1, 1, 'The Prophet Skeram - Staff of the Qiraji Prophets'), +(15263, 21698, 0, 0, 0, 1, 1, 1, 1, 'The Prophet Skeram - Leggings of Immersion'), +(15263, 21699, 0, 0, 0, 1, 1, 1, 1, 'The Prophet Skeram - Barrage Shoulders'), +(15263, 21700, 0, 0, 0, 1, 1, 1, 1, 'The Prophet Skeram - Pendant of the Qiraji Guardian'), +(15263, 21701, 0, 0, 0, 1, 1, 1, 1, 'The Prophet Skeram - Cloak of Concentrated Hatred'), +(15263, 21702, 0, 0, 0, 1, 1, 1, 1, 'The Prophet Skeram - Amulet of Foul Warding'), +(15263, 21703, 0, 10, 0, 1, 2, 1, 1, 'The Prophet Skeram - Hammer of Ji\'zhi'), +(15263, 21704, 0, 0, 0, 1, 2, 1, 1, 'The Prophet Skeram - Boots of the Redeemed Prophecy'), +(15263, 21705, 0, 0, 0, 1, 2, 1, 1, 'The Prophet Skeram - Boots of the Fallen Prophet'), +(15263, 21706, 0, 0, 0, 1, 2, 1, 1, 'The Prophet Skeram - Boots of the Unwavering Will'), +(15263, 21707, 0, 0, 0, 1, 2, 1, 1, 'The Prophet Skeram - Ring of Swarming Thought'), +(15263, 21708, 0, 0, 0, 1, 2, 1, 1, 'The Prophet Skeram - Beetle Scaled Wristguards'), +(15263, 21814, 0, 0, 0, 1, 2, 1, 1, 'The Prophet Skeram - Breastplate of Annihilation'), +(15263, 34045, 34045, 7, 0, 1, 0, 1, 1, 'The Prophet Skeram - Reference Table'); + +-- Battleguard Sartura +DELETE FROM `reference_loot_template` WHERE `Entry`=34047; +DELETE FROM `creature_loot_template` WHERE (`Entry` = 15516) AND (`Item` IN (34047, 21648, 21666, 21667, 21668, 21669, 21670, 21671, 21672, 21673, 21674, 21675, 21676, 21678)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(15516, 21648, 0, 0, 0, 1, 2, 1, 1, 'Battleguard Sartura - Recomposed Boots'), +(15516, 21666, 0, 7.7, 0, 1, 1, 1, 1, 'Battleguard Sartura - Sartura\'s Might'), +(15516, 21667, 0, 0, 0, 1, 1, 1, 1, 'Battleguard Sartura - Legplates of Blazing Light'), +(15516, 21668, 0, 0, 0, 1, 1, 1, 1, 'Battleguard Sartura - Scaled Leggings of Qiraji Fury'), +(15516, 21669, 0, 0, 0, 1, 1, 1, 1, 'Battleguard Sartura - Creeping Vine Helm'), +(15516, 21670, 0, 0, 0, 1, 1, 1, 1, 'Battleguard Sartura - Badge of the Swarmguard'), +(15516, 21671, 0, 0, 0, 1, 1, 1, 1, 'Battleguard Sartura - Robes of the Battleguard'), +(15516, 21672, 0, 0, 0, 1, 1, 1, 1, 'Battleguard Sartura - Gloves of Enforcement'), +(15516, 21673, 0, 9.09, 0, 1, 2, 1, 1, 'Battleguard Sartura - Silithid Claw'), +(15516, 21674, 0, 0, 0, 1, 2, 1, 1, 'Battleguard Sartura - Gauntlets of Steadfast Determination'), +(15516, 21675, 0, 0, 0, 1, 2, 1, 1, 'Battleguard Sartura - Thick Qirajihide Belt'), +(15516, 21676, 0, 0, 0, 1, 2, 1, 1, 'Battleguard Sartura - Leggings of the Festering Swarm'), +(15516, 21678, 0, 0, 0, 1, 2, 1, 1, 'Battleguard Sartura - Necklace of Purity'); + +-- Fankriss the Unyielding +DELETE FROM `reference_loot_template` WHERE `Entry`=34048; +DELETE FROM `creature_loot_template` WHERE (`Entry` = 15510) AND (`Item` IN (34048, 21627, 21635, 21639, 21645, 21647, 21650, 21651, 21652, 21663, 21664, 21665, 22396, 22402)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(15510, 21627, 0, 0, 0, 1, 2, 1, 1, 'Fankriss the Unyielding - Cloak of Untold Secrets'), +(15510, 21635, 0, 10, 0, 1, 2, 1, 1, 'Fankriss the Unyielding - Barb of the Sand Reaver'), +(15510, 21639, 0, 0, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Pauldrons of the Unrelenting'), +(15510, 21645, 0, 0, 0, 1, 2, 1, 1, 'Fankriss the Unyielding - Hive Tunneler\'s Boots'), +(15510, 21647, 0, 0, 0, 1, 2, 1, 1, 'Fankriss the Unyielding - Fetish of the Sand Reaver'), +(15510, 21650, 0, 10, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Ancient Qiraji Ripper'), +(15510, 21651, 0, 0, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Scaled Sand Reaver Leggings'), +(15510, 21652, 0, 0, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Silithid Carapace Chestguard'), +(15510, 21663, 0, 0, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Robes of the Guardian Saint'), +(15510, 21664, 0, 0, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Barbed Choker'), +(15510, 21665, 0, 0, 0, 1, 1, 1, 1, 'Fankriss the Unyielding - Mantle of Wicked Revenge'), +(15510, 22396, 0, 0, 0, 1, 2, 1, 1, 'Fankriss the Unyielding - Totem of Life'), +(15510, 22402, 0, 0, 0, 1, 2, 1, 1, 'Fankriss the Unyielding - Libram of Grace'); + +-- Princess Huhuran +UPDATE `creature_loot_template` SET `Chance`=0 WHERE `entry`=15509 AND `item` BETWEEN 21616 AND 21621; + +-- Twin Emperors +UPDATE `creature_loot_template` SET `Chance`=6.5 WHERE `entry` IN (15275,15276) AND `item` IN (20726,20735); +UPDATE `creature_loot_template` SET `Chance`=0 WHERE `entry` IN (15275,15276) AND `item` IN (21604,21605,21606,21607,21608,21609,21679,21597,21598,21599,21600,21601,21602); + +-- C'Thun +DELETE FROM `reference_loot_template` WHERE `Entry`=34049; +DELETE FROM `creature_loot_template` WHERE (`Entry` = 15727) AND (`Item` IN (34049, 21579, 21126, 21134, 21581, 21582, 21583, 21585, 21586, 21596, 21839, 22730, 22731, 22732)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(15727, 21579, 0, 20, 0, 1, 0, 1, 1, 'C\'Thun - Vanquished Tentacle of C\'Thun'), +(15727, 21126, 0, 8, 0, 1, 1, 1, 1, 'C\'Thun - Death\'s Sting'), +(15727, 21134, 0, 8, 0, 1, 2, 1, 1, 'C\'Thun - Dark Edge of Insanity'), +(15727, 21581, 0, 0, 0, 1, 2, 1, 1, 'C\'Thun - Gauntlets of Annihilation'), +(15727, 21582, 0, 0, 0, 1, 2, 1, 1, 'C\'Thun - Grasp of the Old God'), +(15727, 21583, 0, 0, 0, 1, 2, 1, 1, 'C\'Thun - Cloak of Clarity'), +(15727, 21585, 0, 0, 0, 1, 1, 1, 1, 'C\'Thun - Dark Storm Gauntlets'), +(15727, 21586, 0, 0, 0, 1, 1, 1, 1, 'C\'Thun - Belt of Never-ending Agony'), +(15727, 21596, 0, 0, 0, 1, 1, 1, 1, 'C\'Thun - Ring of the Godslayer'), +(15727, 21839, 0, 8, 0, 1, 2, 1, 1, 'C\'Thun - Scepter of the False Prophet'), +(15727, 22730, 0, 0, 0, 1, 1, 1, 1, 'C\'Thun - Eyestalk Waist Cord'), +(15727, 22731, 0, 0, 0, 1, 1, 1, 1, 'C\'Thun - Cloak of the Devoured'), +(15727, 22732, 0, 0, 0, 1, 2, 1, 1, 'C\'Thun - Mark of C\'Thun'); + +-- Imperial Qiraji items and Recipes +DELETE FROM `reference_loot_template` WHERE `Entry`=34045 AND `Item` IN (21232, 21237); +DELETE FROM `reference_loot_template` WHERE `Entry`=34046 AND `Item` IN (21232, 21237); +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Chance`, `GroupId`, `Comment`) VALUES +(34046, 21232, 0, 1, 'Imperial Qiraji Armaments'), +(34046, 21237, 0, 1, 'Imperial Qiraji Regalia'); + +DELETE FROM `creature_loot_template` WHERE `Reference` IN (34045, 34046); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(15263, 34045, 34045, 7, 0, 1, 0, 1, 1, 'The Prophet Skeram - Reference Table'), +(15516, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Battleguard Sartura - Reference Table'), +(15516, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Battleguard Sartura - Reference Table'), +(15544, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Vem - Reference Table'), +(15544, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Vem - Reference Table'), +(15543, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Princess Yauj - Reference Table'), +(15543, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Princess Yauj - Reference Table'), +(15511, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Lord Kri - Reference Table'), +(15511, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Lord Kri - Reference Table'), +(15510, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Fankriss the Unyielding - Reference Table'), +(15510, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Fankriss the Unyielding - Reference Table'), +(15299, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Viscidus - Reference Table'), +(15299, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Viscidus - Reference Table'), +(15509, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Princess Huhuran - Reference Table'), +(15509, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Princess Huhuran - Reference Table'), +(15275, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Emperor Vek\'nilash - Reference Table'), +(15275, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Emperor Vek\'nilash - Reference Table'), +(15276, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Emperor Vek\'lor - Reference Table'), +(15276, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Emperor Vek\'lor - Reference Table'), +(15517, 34045, 34045, 7, 0, 1, 0, 1, 1, 'Ouro - Reference Table'), +(15517, 34046, 34046, 8, 0, 1, 0, 1, 1, 'Ouro - Reference Table'), +(15727, 34045, 34045, 7, 0, 1, 0, 1, 1, 'C\'Thun - Reference Table'), +(15727, 34046, 34046, 8, 0, 1, 0, 1, 1, 'C\'Thun - Reference Table'); From d6d28b6f5980c3cdba2e4eb81ca1fcdc836310a4 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 7 Oct 2022 19:35:23 -0300 Subject: [PATCH 02/66] fix(DB/creature): Add id2 to Qiraji Scarabs/Scorpions (#13337) --- data/sql/updates/pending_db_world/rev_1665108660264438400.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665108660264438400.sql diff --git a/data/sql/updates/pending_db_world/rev_1665108660264438400.sql b/data/sql/updates/pending_db_world/rev_1665108660264438400.sql new file mode 100644 index 000000000..57a958400 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665108660264438400.sql @@ -0,0 +1,3 @@ +-- +UPDATE `creature` SET `id2`=15317 WHERE `id1`=15316; +UPDATE `creature` SET `id2`=15316 WHERE `id1`=15317; From 600dfece00c3ace7d874ecfda15296b71e1b5262 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 7 Oct 2022 19:35:46 -0300 Subject: [PATCH 03/66] fix(DB/creature_template): Update AQ40 detection ranges (#13339) --- .../sql/updates/pending_db_world/rev_1665166481073025800.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665166481073025800.sql diff --git a/data/sql/updates/pending_db_world/rev_1665166481073025800.sql b/data/sql/updates/pending_db_world/rev_1665166481073025800.sql new file mode 100644 index 000000000..8871e9c47 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665166481073025800.sql @@ -0,0 +1,5 @@ +UPDATE `creature_template` SET `detection_range` = 37.5 WHERE (`entry` IN (15262, 15312)); +UPDATE `creature_template` SET `detection_range` = 38.5 WHERE (`entry` = 15263); +UPDATE `creature_template` SET `detection_range` = 15 WHERE (`entry` = 15300); +UPDATE `creature_template` SET `detection_range` = 35 WHERE (`entry` IN (15240, 15230, 15264, 15311)); +UPDATE `creature_template` SET `detection_range` = 40 WHERE (`entry` IN (15235, 15236, 15249, 15509, 15277, 15229, 15544, 15543, 15511, 15233, 15247, 15275, 15276, 15252, 15246, 15250, 15299)); From 92cf5bab7f61d5a3e13d814982080c43773f622f Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Fri, 7 Oct 2022 16:36:12 -0600 Subject: [PATCH 04/66] fix(DB/spell_bonus_data): Add Missing Spell Bonus Data (#13333) --- .../rev_1665083915954697700.sql | 1273 +++++++++++++++++ 1 file changed, 1273 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665083915954697700.sql diff --git a/data/sql/updates/pending_db_world/rev_1665083915954697700.sql b/data/sql/updates/pending_db_world/rev_1665083915954697700.sql new file mode 100644 index 000000000..b8ca9e0d8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665083915954697700.sql @@ -0,0 +1,1273 @@ +-- +DELETE FROM `spell_bonus_data` WHERE `entry` BETWEEN 116 AND 72898; +INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`, `ap_bonus`, `ap_dot_bonus`, `comments`) VALUES + (116, 0.172, 0, 0, 0, 'Mage - Frost Bolt'), + (120, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (122, 0.018, 0, 0, 0, 'Mage - Frost Nova'), + (133, 0.123, 0, 0, 0, 'Mage - Fire ball'), + (139, 0, 0.207, 0, 0, 'Priest - Renew'), + (143, 0.271, 0, 0, 0, 'Mage - Fire ball'), + (145, 0.5, 0, 0, 0, 'Mage - Fire ball'), + (172, 0, 0.0624, 0, 0, 'Warlock - Corruption'), + (205, 0.283, 0, 0, 0, 'Mage - Frost Bolt'), + (331, 0.231, 0, 0, 0, 'Shaman - Healing Wave'), + (332, 0.51, 0, 0, 0, 'Shaman - Healing Wave'), + (339, 0, 0.055, 0, 0, 'Druid - Entangling Roots'), + (348, 0.058, 0.058, 0, 0, 'Warlock - Immolate'), + (403, 0.125, 0, 0, 0, 'Shaman - Lightning Bolt'), + (421, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (467, 0.033, 0, 0, 0, 'Druid - Thorns'), + (529, 0.317, 0, 0, 0, 'Shaman - Lightning Bolt'), + (547, 0.94, 0, 0, 0, 'Shaman - Healing Wave'), + (548, 0.561, 0, 0, 0, 'Shaman - Lightning Bolt'), + (585, 0.123, 0, 0, 0, 'Priest - Smite'), + (589, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (591, 0.271, 0, 0, 0, 'Priest - Smite'), + (594, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (596, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (598, 0.554, 0, 0, 0, 'Priest - Smite'), + (603, 0, 2, 0, 0, 'Warlock - Curse of Doom'), + (635, 0.481, 0, 0, 0, 'Paladin - Holy Light'), + (639, 0.796, 0, 0, 0, 'Paladin - Holy Light'), + (647, 1.3, 0, 0, 0, 'Paladin - Holy Light'), + (686, 0.14, 0, 0, 0, 'Warlock - Shadow Bolt'), + (689, 0, 0.111, 0, 0, 'Warlock - Drain Life'), + (695, 0.299, 0, 0, 0, 'Warlock - Shadow Bolt'), + (699, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (703, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (705, 0.56, 0, 0, 0, 'Warlock - Shadow Bolt'), + (707, 0.125, 0.125, 0, 0, 'Warlock - Immolate'), + (709, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (755, 0, 0.376, 0, 0, 'Warlock - Health Funnel'), + (769, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (774, 0, 0.15, 0, 0, 'Druid - Rejuvenation'), + (779, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (780, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (782, 0.033, 0, 0, 0, 'Druid - Thorns'), + (837, 0.488, 0, 0, 0, 'Mage - Frost Bolt'), + (865, 0.043, 0, 0, 0, 'Mage - Frost Nova'), + (879, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (913, 1.491, 0, 0, 0, 'Shaman - Healing Wave'), + (915, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (930, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (939, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (943, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (959, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (970, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (974, 0.5371, 0, 0, 0, 'Shaman - Earth Shield'), + (980, 0, 0.0548, 0, 0, 'Warlock - Curse of Agony'), + (984, 0.714, 0, 0, 0, 'Priest - Smite'), + (992, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (996, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (1004, 0.714, 0, 0, 0, 'Priest - Smite'), + (1014, 0, 0.0923, 0, 0, 'Warlock - Curse of Agony'), + (1026, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (1042, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (1058, 0, 0.235, 0, 0, 'Druid - Rejuvenation'), + (1062, 0, 0.093, 0, 0, 'Druid - Entangling Roots'), + (1064, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (1075, 0.033, 0, 0, 0, 'Druid - Thorns'), + (1088, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (1094, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (1106, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (1120, 0, 0.268, 0, 0, 'Warlock - Drain Soul'), + (1430, 0, 0.32, 0, 0, 'Druid - Rejuvenation'), + (1449, 0.166, 0, 0, 0, 'Mage - Arcane Explosion'), + (1495, 0, 0, 0.2, 0, 'Hunter - Mongoose Bite'), + (1776, 0, 0, 0.21, 0, 'Rogue - Gouge'), + (1822, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (1823, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (1824, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (1949, 0, 0.0949, 0, 0, 'Warlock - Hellfire'), + (1978, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (2050, 0.231, 0, 0, 0, 'Priest - Lesser Heal'), + (2052, 0.431, 0, 0, 0, 'Priest - Lesser Heal'), + (2053, 0.755, 0, 0, 0, 'Priest - Lesser Heal'), + (2054, 1.37, 0, 0, 0, 'Priest - Heal'), + (2055, 1.37, 0, 0, 0, 'Priest - Heal'), + (2060, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (2061, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (2090, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (2091, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (2120, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (2121, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (2136, 0.204, 0, 0, 0, 'Mage - Fire Blast'), + (2137, 0.332, 0, 0, 0, 'Mage - Fire Blast'), + (2138, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (2643, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (2767, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (2812, 0.07, 0, 0.07, 0, 'Paladin - Holy Wrath'), + (2818, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 1($AP*0.12 / number of ticks)'), + (2819, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 2($AP*0.12 / number of ticks)'), + (2860, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (2912, 1, 0, 0, 0, 'Druid - Starfire'), + (2941, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (2944, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (2948, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (3009, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (3010, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (3044, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (3110, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (3140, 0.793, 0, 0, 0, 'Mage - Fire ball'), + (3472, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (3606, 0.104, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 1'), + (3627, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (3674, 0, 0, 0, 0.02, 'Hunter - Black Arrow($RAP*0.1 / number of ticks)'), + (3698, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (3699, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (3700, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (4524, 1.35, 0, 0, 0, 'Pet Warlock - Demonic Immolation'), + (5176, 0.123, 0, 0, 0, 'Druid - Wrath'), + (5177, 0.231, 0, 0, 0, 'Druid - Wrath'), + (5178, 0.443, 0, 0, 0, 'Druid - Wrath'), + (5179, 0.571, 0, 0, 0, 'Druid - Wrath'), + (5180, 0.571, 0, 0, 0, 'Druid - Wrath'), + (5185, 0.231, 0, 0, 0, 'Druid - Healing Touch'), + (5186, 0.59, 0, 0, 0, 'Druid - Healing Touch'), + (5187, 1.042, 0, 0, 0, 'Druid - Healing Touch'), + (5188, 1.611, 0, 0, 0, 'Druid - Healing Touch'), + (5189, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (5195, 0, 0.1, 0, 0, 'Druid - Entangling Roots'), + (5196, 0, 0.1, 0, 0, 'Druid - Entangling Roots'), + (5570, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (5614, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (5615, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (5676, 0.396, 0, 0, 0, 'Warlock - Searing Pain'), + (5857, 0.143, 0, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 1'), + (6041, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (6060, 0.714, 0, 0, 0, 'Priest - Smite'), + (6063, 1.37, 0, 0, 0, 'Priest - Heal'), + (6064, 1.37, 0, 0, 0, 'Priest - Heal'), + (6074, 0, 0.291, 0, 0, 'Priest - Renew'), + (6075, 0, 0.376, 0, 0, 'Priest - Renew'), + (6076, 0, 0.376, 0, 0, 'Priest - Renew'), + (6077, 0, 0.376, 0, 0, 'Priest - Renew'), + (6078, 0, 0.376, 0, 0, 'Priest - Renew'), + (6131, 0.043, 0, 0, 0, 'Mage - Frost Nova'), + (6217, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (6222, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (6223, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (6343, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (6350, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 2'), + (6351, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 3'), + (6352, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 4'), + (6353, 1.15, 0, 0, 0, 'Warlock - Soul Fire'), + (6572, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (6574, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (6778, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (6780, 0.571, 0, 0, 0, 'Druid - Wrath'), + (6789, 0.214, 0, 0, 0, 'Warlock - Death Coil'), + (7001, 0, 0.3333, 0, 0, 'Priest - Lightwell Renew Rank 1'), + (7268, 0.157, 0, 0, 0, 'Mage - Arcane Missiles'), + (7269, 0.243, 0, 0, 0, 'Mage - Arcane Missiles'), + (7270, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (7294, 0.025, 0, 0, 0, 'Paladin - Retribution Aura'), + (7322, 0.743, 0, 0, 0, 'Mage - Frost Bolt'), + (7379, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (7641, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (7648, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (7651, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (7799, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (7800, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (7801, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (7802, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (7814, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (7815, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (7816, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (8004, 0.807, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (8005, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (8008, 0.807, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (8010, 0.807, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (8026, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (8028, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (8029, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (8034, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (8037, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (8042, 0.154, 0, 0, 0, 'Shaman - Earth Shock'), + (8044, 0.212, 0, 0, 0, 'Shaman - Earth Shock'), + (8045, 0.299, 0, 0, 0, 'Shaman - Earth Shock'), + (8046, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (8050, 0.134, 0.1, 0, 0, 'Shaman - Flame Shock'), + (8052, 0.198, 0.1, 0, 0, 'Shaman - Flame Shock'), + (8053, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (8056, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (8058, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (8092, 0.268, 0, 0, 0, 'Priest - Mind Blast'), + (8102, 0.364, 0, 0, 0, 'Priest - Mind Blast'), + (8103, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (8104, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (8105, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (8106, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (8187, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 1'), + (8198, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (8204, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (8205, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (8288, 0, 0.429, 0, 0, 'Warlock - Drain Soul'), + (8289, 0, 0.429, 0, 0, 'Warlock - Drain Soul'), + (8349, 0.15, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (8400, 1, 0, 0, 0, 'Mage - Fire ball'), + (8401, 1, 0, 0, 0, 'Mage - Fire ball'), + (8402, 1, 0, 0, 0, 'Mage - Fire ball'), + (8406, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (8407, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (8408, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (8412, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (8413, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (8418, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (8419, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (8422, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (8423, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (8437, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (8438, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (8439, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (8444, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (8445, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (8446, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (8492, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (8502, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (8503, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (8631, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (8632, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (8633, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (8680, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 1'), + (8685, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 2'), + (8689, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 3'), + (8903, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (8905, 0.571, 0, 0, 0, 'Druid - Wrath'), + (8910, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (8914, 0.033, 0, 0, 0, 'Druid - Thorns'), + (8921, 0.052, 0.052, 0, 0, 'Druid - Moonfire'), + (8924, 0.081, 0.081, 0, 0, 'Druid - Moonfire'), + (8925, 0.111, 0.111, 0, 0, 'Druid - Moonfire'), + (8926, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (8927, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (8928, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (8929, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (8936, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (8938, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (8939, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (8940, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (8941, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (8949, 1, 0, 0, 0, 'Druid - Starfire'), + (8950, 1, 0, 0, 0, 'Druid - Starfire'), + (8951, 1, 0, 0, 0, 'Druid - Starfire'), + (9005, 0, 0, 0, 0.03, 'Druid - Pounce'), + (9472, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (9473, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (9474, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (9750, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (9754, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (9756, 0.033, 0, 0, 0, 'Druid - Thorns'), + (9758, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (9823, 0, 0, 0, 0.03, 'Druid - Pounce'), + (9827, 0, 0, 0, 0.03, 'Druid - Pounce'), + (9833, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (9834, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (9835, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (9839, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (9840, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (9841, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (9852, 0, 0.1, 0, 0, 'Druid - Entangling Roots'), + (9853, 0, 0.1, 0, 0, 'Druid - Entangling Roots'), + (9856, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (9857, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (9858, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (9875, 1, 0, 0, 0, 'Druid - Starfire'), + (9876, 1, 0, 0, 0, 'Druid - Starfire'), + (9888, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (9889, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (9904, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (9908, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (9910, 0.033, 0, 0, 0, 'Druid - Thorns'), + (9912, 0.571, 0, 0, 0, 'Druid - Wrath'), + (10148, 1, 0, 0, 0, 'Mage - Fire ball'), + (10149, 1, 0, 0, 0, 'Mage - Fire ball'), + (10150, 1, 0, 0, 0, 'Mage - Fire ball'), + (10151, 1, 0, 0, 0, 'Mage - Fire ball'), + (10159, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (10160, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (10161, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (10179, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (10180, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (10181, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (10197, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (10199, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (10201, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (10202, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (10205, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (10206, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (10207, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (10215, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (10216, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (10230, 0.043, 0, 0, 0, 'Mage - Frost Nova'), + (10273, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (10274, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (10312, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (10313, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (10314, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (10318, 0.07, 0, 0.07, 0, 'Paladin - Holy Wrath'), + (10328, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (10329, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (10391, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (10392, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (10395, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (10396, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (10412, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (10413, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (10414, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (10435, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 5'), + (10436, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 6'), + (10445, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (10447, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (10448, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (10458, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (10466, 0.8057, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (10467, 0.8057, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (10468, 0.8057, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (10472, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (10473, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (10579, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 2'), + (10580, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 3'), + (10581, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 4'), + (10605, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (10622, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (10623, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (10892, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (10893, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (10894, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (10915, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (10916, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (10917, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (10927, 0, 0.376, 0, 0, 'Priest - Renew'), + (10928, 0, 0.376, 0, 0, 'Priest - Renew'), + (10929, 0, 0.376, 0, 0, 'Priest - Renew'), + (10933, 0.714, 0, 0, 0, 'Priest - Smite'), + (10934, 0.714, 0, 0, 0, 'Priest - Smite'), + (10945, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (10946, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (10947, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (10960, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (10961, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (10963, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (10964, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (10965, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (11113, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (11289, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (11290, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (11306, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (11307, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (11335, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 4'), + (11336, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 5'), + (11337, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 6'), + (11353, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 3($AP*0.12 / number of ticks)'), + (11354, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 4($AP*0.12 / number of ticks)'), + (11366, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (11580, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (11581, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (11600, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (11601, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (11659, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (11660, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (11661, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (11665, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (11667, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (11668, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (11671, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (11672, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (11675, 0, 0.429, 0, 0, 'Warlock - Drain Soul'), + (11681, 0.143, 0, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 1'), + (11682, 0.143, 0, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 1'), + (11683, 0, 0.0949, 0, 0, 'Warlock - Hellfire'), + (11684, 0, 0.0949, 0, 0, 'Warlock - Hellfire'), + (11693, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (11694, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (11695, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (11699, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (11700, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (11711, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (11712, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (11713, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (11762, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (11763, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (11778, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (11779, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (11780, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (12470, 0.5, 0, 0, 0, 'Pet Shaman - Fire Elemental Fire Nova'), + (12505, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (12522, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (12523, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (12524, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (12525, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (12526, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (13018, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (13019, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (13020, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (13021, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (13218, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 1'), + (13222, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 2'), + (13223, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 3'), + (13224, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 4'), + (13376, 0.015, 0, 0, 0, 'Pet Shaman - Fire Elemental Fire Shield'), + (13549, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13550, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13551, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13552, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13553, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13554, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13555, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (13797, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (13812, 0, 0, 0.1, 0.1, 'Hunter - Explosive Trap Effect'), + (14269, 0, 0, 0.2, 0, 'Hunter - Mongoose Bite'), + (14270, 0, 0, 0.2, 0, 'Hunter - Mongoose Bite'), + (14271, 0, 0, 0.2, 0, 'Hunter - Mongoose Bite'), + (14281, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14282, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14283, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14284, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14285, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14286, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14287, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (14288, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (14289, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (14290, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (14298, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (14299, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (14300, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (14301, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (14314, 0, 0, 0.1, 0.1, 'Hunter - Explosive Trap Effect'), + (14315, 0, 0, 0.1, 0.1, 'Hunter - Explosive Trap Effect'), + (14914, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15207, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (15208, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (15237, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (15261, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15262, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15263, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15264, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15265, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15266, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15267, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (15430, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (15431, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (16343, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (16344, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (16352, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (16353, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (16827, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (16828, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (16829, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (16830, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (16831, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (16832, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (17253, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17255, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17256, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17257, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17258, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17259, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17260, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17261, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (17877, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (17919, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (17920, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (17921, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (17922, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (17923, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (17924, 1.15, 0, 0, 0, 'Warlock - Soul Fire'), + (17925, 0.214, 0, 0, 0, 'Warlock - Death Coil'), + (17926, 0.214, 0, 0, 0, 'Warlock - Death Coil'), + (18220, 0.96, 0, 0, 0, 'Warlock - Dark Pact'), + (18809, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (18867, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (18868, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (18869, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (18870, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (18871, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (18937, 0.96, 0, 0, 0, 'Warlock - Dark Pact'), + (18938, 0.96, 0, 0, 0, 'Warlock - Dark Pact'), + (19236, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (19238, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (19240, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (19241, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (19242, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (19243, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (19276, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (19277, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (19278, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (19279, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (19280, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (19306, 0, 0, 0.2, 0, 'Hunter - Counterattack'), + (19750, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (19939, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (19940, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (19941, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (19942, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (19943, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (19970, 0, 0.1, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (19971, 0, 0.1, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (19972, 0, 0.1, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (19973, 0, 0.1, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (19974, 0, 0.093, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (19975, 0, 0.055, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (20116, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (20153, 1.35, 0, 0, 0, 'Pet Warlock - Immolation (Infernal)'), + (20167, 0.15, 0, 0.15, 0, 'Paladin - Seal of Light Proc'), + (20187, 0.32, 0, 0.2, 0, 'Paladin - Judgement of Righteousness'), + (20253, 0, 0, 0.12, 0, 'Warrior - Intercept'), + (20909, 0, 0, 0.2, 0, 'Hunter - Counterattack'), + (20910, 0, 0, 0.2, 0, 'Hunter - Counterattack'), + (20922, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (20923, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (20924, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (20925, 0.09, 0, 0.056, 0, 'Paladin - Holy Shield'), + (20927, 0.09, 0, 0.056, 0, 'Paladin - Holy Shield'), + (20928, 0.09, 0, 0.056, 0, 'Paladin - Holy Shield'), + (22703, 1, 0, 0, 0, 'Warlock - Inferno Effect'), + (23455, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (23458, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (23459, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (24239, 0.15, 0, 0.15, 0, 'Paladin - Hammer of Wrath'), + (24274, 0.15, 0, 0.15, 0, 'Paladin - Hammer of Wrath'), + (24275, 0.15, 0, 0.15, 0, 'Paladin - Hammer of Wrath'), + (24423, 0.119658, 0, 0.07, 0, 'Pet Skills - Demoralizing Screech'), + (24577, 0.119658, 0, 0.07, 0, 'Pet Skills - Demoralizing Screech'), + (24578, 0.119658, 0, 0.07, 0, 'Pet Skills - Demoralizing Screech'), + (24579, 0.119658, 0, 0.07, 0, 'Pet Skills - Demoralizing Screech'), + (24583, 0, 0.067, 0, 0, 'Pet Skills - Scorpid Poison'), + (24586, 0, 0.067, 0, 0, 'Pet Skills - Scorpid Poison'), + (24587, 0, 0.067, 0, 0, 'Pet Skills - Scorpid Poison'), + (24640, 0, 0.067, 0, 0, 'Pet Skills - Scorpid Poison'), + (24844, 0.333, 0, 0, 0, 'Pet Skills - Lightning Breath'), + (24974, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (24975, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (24976, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (24977, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (25008, 0.333, 0, 0, 0, 'Pet Skills - Lightning Breath'), + (25009, 0.333, 0, 0, 0, 'Pet Skills - Lightning Breath'), + (25010, 0.333, 0, 0, 0, 'Pet Skills - Lightning Breath'), + (25011, 0.333, 0, 0, 0, 'Pet Skills - Lightning Breath'), + (25012, 0.333, 0, 0, 0, 'Pet Skills - Lightning Breath'), + (25210, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (25213, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (25221, 0, 0.376, 0, 0, 'Priest - Renew'), + (25222, 0, 0.376, 0, 0, 'Priest - Renew'), + (25233, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (25235, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (25264, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (25269, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (25288, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (25292, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (25294, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (25295, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (25297, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (25298, 1, 0, 0, 0, 'Druid - Starfire'), + (25299, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (25304, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (25306, 1, 0, 0, 0, 'Mage - Fire ball'), + (25307, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (25308, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (25309, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (25311, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (25314, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (25315, 0, 0.376, 0, 0, 'Priest - Renew'), + (25316, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (25329, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (25331, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (25346, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (25349, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 5($AP*0.12 / number of ticks)'), + (25357, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (25363, 0.714, 0, 0, 0, 'Priest - Smite'), + (25364, 0.714, 0, 0, 0, 'Priest - Smite'), + (25367, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (25368, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (25372, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (25375, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (25384, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (25391, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (25396, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (25420, 0.8057, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (25422, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (25423, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (25437, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (25439, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (25442, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (25448, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (25449, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (25454, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (25457, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (25464, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (25467, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (25488, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (25501, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (25530, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 7'), + (25535, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (25537, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (25550, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 5'), + (25902, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (25903, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (25911, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (25912, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (25913, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (25914, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (26363, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26364, 0.147, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26365, 0.227, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26366, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26367, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26369, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26370, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26371, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26372, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (26573, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (26839, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (26884, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (26890, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 7'), + (26968, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 6($AP*0.12 / number of ticks)'), + (26978, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (26979, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (26980, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (26981, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (26982, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (26984, 0.571, 0, 0, 0, 'Druid - Wrath'), + (26985, 0.571, 0, 0, 0, 'Druid - Wrath'), + (26986, 1, 0, 0, 0, 'Druid - Starfire'), + (26987, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (26988, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (26989, 0, 0.1, 0, 0, 'Druid - Entangling Roots'), + (26992, 0.033, 0, 0, 0, 'Druid - Thorns'), + (26997, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (27003, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (27006, 0, 0, 0, 0.03, 'Druid - Pounce'), + (27010, 0, 0.1, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (27013, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (27016, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (27019, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (27021, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (27024, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (27026, 0, 0, 0.1, 0.1, 'Hunter - Explosive Trap Effect'), + (27049, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (27050, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (27051, 0.119658, 0, 0.07, 0, 'Pet Skills - Demoralizing Screech'), + (27060, 0, 0.067, 0, 0, 'Pet Skills - Scorpid Poison'), + (27067, 0, 0, 0.2, 0, 'Hunter - Counterattack'), + (27070, 1, 0, 0, 0, 'Mage - Fire ball'), + (27071, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (27072, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (27073, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (27074, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (27076, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (27078, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (27079, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (27080, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (27082, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (27086, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (27087, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (27088, 0.193, 0, 0, 0, 'Mage - Frost Nova'), + (27132, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (27133, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (27135, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (27136, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (27137, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (27138, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (27139, 0.07, 0, 0.07, 0, 'Paladin - Holy Wrath'), + (27173, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (27175, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (27176, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (27179, 0.09, 0, 0.056, 0, 'Paladin - Holy Shield'), + (27180, 0.15, 0, 0.15, 0, 'Paladin - Hammer of Wrath'), + (27187, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 7($AP*0.12 / number of ticks)'), + (27189, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 5'), + (27209, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (27210, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (27211, 1.15, 0, 0, 0, 'Warlock - Soul Fire'), + (27213, 0, 0.0949, 0, 0, 'Warlock - Hellfire'), + (27214, 0.143, 0, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 1'), + (27215, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (27216, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (27217, 0, 0.429, 0, 0, 'Warlock - Drain Soul'), + (27218, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (27219, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (27220, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (27223, 0.214, 0, 0, 0, 'Warlock - Death Coil'), + (27243, 0, 0.25, 0, 0, 'Warlock - Seed of Corruption DOT'), + (27259, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (27263, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (27265, 0.96, 0, 0, 0, 'Warlock - Dark Pact'), + (27267, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (27274, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (27285, 0.2129, 0, 0, 0, 'Warlock - Seed of Corruption DD'), + (27799, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (27800, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (27801, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (27803, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (27804, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (27805, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (27873, 0, 0.3333, 0, 0, 'Priest - Lightwell Renew Rank 1'), + (27874, 0, 0.3333, 0, 0, 'Priest - Lightwell Renew Rank 1'), + (28276, 0, 0.3333, 0, 0, 'Priest - Lightwell Renew Rank 1'), + (29228, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (29722, 0.714, 0, 0, 0, 'Warlock - Incinerate'), + (30108, 0, 0.2, 0, 0, 'Warlock - Unstable Affliction'), + (30153, 0, 0, 0.028, 0, 'Pet Warlock - Intercept'), + (30195, 0, 0, 0.028, 0, 'Pet Warlock - Intercept'), + (30197, 0, 0, 0.028, 0, 'Pet Warlock - Intercept'), + (30213, 0, 0, 0.1429, 0, 'Pet Warlock - Cleave'), + (30219, 0, 0, 0.1429, 0, 'Pet Warlock - Cleave'), + (30223, 0, 0, 0.1429, 0, 'Pet Warlock - Cleave'), + (30283, 0.193, 0, 0, 0, 'Warlock - Shadowfury'), + (30357, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (30404, 0, 0.2, 0, 0, 'Warlock - Unstable Affliction'), + (30405, 0, 0.2, 0, 0, 'Warlock - Unstable Affliction'), + (30413, 0.193, 0, 0, 0, 'Warlock - Shadowfury'), + (30414, 0.193, 0, 0, 0, 'Warlock - Shadowfury'), + (30451, 0.714, 0, 0, 0, 'Mage - Arcane Blast'), + (30455, 0.1429, 0, 0, 0, 'Mage - Ice Lance'), + (30459, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (30545, 1.15, 0, 0, 0, 'Warlock - Soul Fire'), + (30546, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (30910, 0, 2, 0, 0, 'Warlock - Curse of Doom'), + (31117, 1.8, 0, 0, 0, 'Warlock - Unstable Affliction Dispell'), + (31661, 0.193, 0, 0, 0, 'Mage - Dragons Breath'), + (31707, 0.83, 0, 0, 0, 'Pet Mage - Water Elemental Frostbolt'), + (31803, 0, 0.013, 0, 0.025, 'Paladin - Seal of Vengeance'), + (31804, 0.22, 0, 0.14, 0, 'Paladin - Judgement of Vengeance'), + (31935, 0.07, 0, 0.07, 0, 'Paladin - Avenger Shield'), + (32231, 0.714, 0, 0, 0, 'Warlock - Incinerate'), + (32379, 0.4286, 0, 0, 0, 'Priest - Shadow Word: Death'), + (32546, 0.8057, 0, 0, 0, 'Priest - Binding Heal'), + (32593, 0.5371, 0, 0, 0, 'Shaman - Earth Shield'), + (32594, 0.5371, 0, 0, 0, 'Shaman - Earth Shield'), + (32699, 0.07, 0, 0.07, 0, 'Paladin - Avenger Shield'), + (32700, 0.07, 0, 0.07, 0, 'Paladin - Avenger Shield'), + (32996, 0.4286, 0, 0, 0, 'Priest - Shadow Word: Death'), + (33041, 0.193, 0, 0, 0, 'Mage - Dragons Breath'), + (33042, 0.193, 0, 0, 0, 'Mage - Dragons Breath'), + (33043, 0.193, 0, 0, 0, 'Mage - Dragons Breath'), + (33073, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (33074, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (33110, 0.8057, 0, 0, 0, 'Priest - Prayer of Mending Heal Proc'), + (33745, 0, 0, 0, 0.01, 'Druid - Lacerate($AP*0.05 / number of ticks)'), + (33763, 0, 0.09518, 0, 0, 'Druid - Lifebloom HOT'), + (33778, 0.655, 0, 0, 0, 'Druid - Lifebloom DH'), + (33933, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (33938, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (34120, 0, 0, 0.1, 0, 'Hunter - Steady Shot'), + (34433, 0.65, 0, 0, 0, 'Priest - Shadowfiend'), + (34861, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (34863, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (34864, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (34865, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (34866, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (34889, 0.333, 0.167, 0, 0, 'Pet Skills - Fire Breath'), + (34914, 0, 0.4, 0, 0, 'Priest - Vampiric Touch'), + (34916, 0, 0.4, 0, 0, 'Priest - Vampiric Touch'), + (34917, 0, 0.4, 0, 0, 'Priest - Vampiric Touch'), + (35290, 0.119658, 0, 0.07, 0, 'Pet Skills - Gore'), + (35291, 0.119658, 0, 0.07, 0, 'Pet Skills - Gore'), + (35292, 0.119658, 0, 0.07, 0, 'Pet Skills - Gore'), + (35293, 0.119658, 0, 0.07, 0, 'Pet Skills - Gore'), + (35294, 0.119658, 0, 0.07, 0, 'Pet Skills - Gore'), + (35295, 0.119658, 0, 0.07, 0, 'Pet Skills - Gore'), + (35323, 0.333, 0.167, 0, 0, 'Pet Skills - Fire Breath'), + (35387, 0, 0.067, 0, 0, 'Pet Skills - Poison Spit'), + (35389, 0, 0.067, 0, 0, 'Pet Skills - Poison Spit'), + (35392, 0, 0.067, 0, 0, 'Pet Skills - Poison Spit'), + (36916, 0, 0, 0.2, 0, 'Hunter - Mongoose Bite'), + (38692, 1, 0, 0, 0, 'Mage - Fire ball'), + (38697, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (38700, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (38703, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (42198, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42208, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42209, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42210, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42211, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42212, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42213, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42218, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (42223, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (42224, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (42225, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (42226, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (42227, 0.286, 0, 0, 0, 'Pet Warlock - Rain of Fire'), + (42230, 0.12898, 0, 0, 0, 'Druid - Hurricane Triggered'), + (42231, 0.12898, 0, 0, 0, 'Druid - Hurricane Triggered'), + (42232, 0.12898, 0, 0, 0, 'Druid - Hurricane Triggered'), + (42233, 0.12898, 0, 0, 0, 'Druid - Hurricane Triggered'), + (42234, 0, 0, 0.0837, 0, 'Hunter - Volley'), + (42243, 0, 0, 0.0837, 0, 'Hunter - Volley'), + (42244, 0, 0, 0.0837, 0, 'Hunter - Volley'), + (42245, 0, 0, 0.0837, 0, 'Hunter - Volley'), + (42832, 1, 0, 0, 0, 'Mage - Fire ball'), + (42833, 1, 0, 0, 0, 'Mage - Fire ball'), + (42841, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (42842, 0.857, 0, 0, 0, 'Mage - Frost Bolt'), + (42844, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (42845, 0.2857, 0, 0, 0, 'Mage - Arcane Missiles'), + (42858, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (42859, 0.4286, 0, 0, 0, 'Mage - Scorch'), + (42872, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (42873, 0.4286, 0, 0, 0, 'Mage - Fire Blast'), + (42890, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (42891, 1.15, 0.05, 0, 0, 'Mage - Pyroblast'), + (42894, 0.714, 0, 0, 0, 'Mage - Arcane Blast'), + (42896, 0.714, 0, 0, 0, 'Mage - Arcane Blast'), + (42897, 0.714, 0, 0, 0, 'Mage - Arcane Blast'), + (42913, 0.1429, 0, 0, 0, 'Mage - Ice Lance'), + (42914, 0.1429, 0, 0, 0, 'Mage - Ice Lance'), + (42917, 0.193, 0, 0, 0, 'Mage - Frost Nova'), + (42920, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (42921, 0.214, 0, 0, 0, 'Mage - Arcane Explosion'), + (42925, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (42926, 0.2357, 0.122, 0, 0, 'Mage - Flamestrike'), + (42930, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (42931, 0.2036, 0, 0, 0, 'Mage - Cone of Cold'), + (42937, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42938, 0.1429, 0, 0, 0, 'Mage - Blizzard Triggered Spell'), + (42944, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (42945, 0.193, 0, 0, 0, 'Mage - Blast Wave'), + (42949, 0.193, 0, 0, 0, 'Mage - Dragons Breath'), + (42950, 0.193, 0, 0, 0, 'Mage - Dragons Breath'), + (44203, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (44205, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (44206, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (44207, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (44208, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (44425, 0.714, 0, 0, 0, 'Mage - Arcane Barrage'), + (44457, 0, 0.2, 0, 0, 'Mage - Living Bomb DOT'), + (44461, 0.4, 0, 0, 0, 'Mage - Living Bomb DD'), + (44614, 0.857, 0, 0, 0, 'Mage - Frostfire Bolt'), + (44780, 0.714, 0, 0, 0, 'Mage - Arcane Barrage'), + (44781, 0.714, 0, 0, 0, 'Mage - Arcane Barrage'), + (45477, 0, 0, 0.1, 0, 'Death Knight - Icy Touch'), + (47476, 0, 0, 0.06, 0, 'Death Knight - Strangulate'), + (47501, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (47502, 0, 0, 0.12, 0, 'Warrior - Thunder Clap'), + (47610, 0.857, 0, 0, 0, 'Mage - Frostfire Bolt'), + (47632, 0, 0, 0.15, 0, 'Death Knight - Death Coil'), + (47633, 0, 0, 0.225, 0, 'Death Knight - Death Coil Heal'), + (47666, 0.1905, 0, 0, 0, 'Priest - Pennance damage'), + (47750, 0.5362, 0, 0, 0, 'Priest - Pennance heal'), + (47808, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (47809, 0.857, 0, 0, 0, 'Warlock - Shadow Bolt'), + (47810, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (47811, 0.2, 0.2, 0, 0, 'Warlock - Immolate'), + (47812, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (47813, 0, 0.2, 0, 0, 'Warlock - Corruption'), + (47814, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (47815, 0.4286, 0, 0, 0, 'Warlock - Searing Pain'), + (47817, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (47818, 0.286, 0, 0, 0, 'Warlock - Rain of Fire Triggered Rank 1'), + (47822, 0.143, 0, 0, 0, 'Warlock - Hellfire Effect on Enemy Rank 1'), + (47823, 0, 0.0949, 0, 0, 'Warlock - Hellfire'), + (47824, 1.15, 0, 0, 0, 'Warlock - Soul Fire'), + (47825, 1.15, 0, 0, 0, 'Warlock - Soul Fire'), + (47826, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (47827, 0.4286, 0, 0, 0, 'Warlock - Shadowburn'), + (47833, 0.2129, 0, 0, 0, 'Warlock - Seed of Corruption DD'), + (47834, 0.2129, 0, 0, 0, 'Warlock - Seed of Corruption DD'), + (47835, 0, 0.25, 0, 0, 'Warlock - Seed of Corruption DOT'), + (47836, 0, 0.25, 0, 0, 'Warlock - Seed of Corruption DOT'), + (47837, 0.714, 0, 0, 0, 'Warlock - Incinerate'), + (47838, 0.714, 0, 0, 0, 'Warlock - Incinerate'), + (47841, 0, 0.2, 0, 0, 'Warlock - Unstable Affliction'), + (47843, 0, 0.2, 0, 0, 'Warlock - Unstable Affliction'), + (47846, 0.193, 0, 0, 0, 'Warlock - Shadowfury'), + (47847, 0.193, 0, 0, 0, 'Warlock - Shadowfury'), + (47855, 0, 0.429, 0, 0, 'Warlock - Drain Soul'), + (47856, 0, 0.538, 0, 0, 'Warlock - Health Funnel'), + (47857, 0, 0.143, 0, 0, 'Warlock - Drain Life'), + (47859, 0.214, 0, 0, 0, 'Warlock - Death Coil'), + (47860, 0.214, 0, 0, 0, 'Warlock - Death Coil'), + (47863, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (47864, 0, 0.1, 0, 0, 'Warlock - Curse of Agony'), + (47867, 0, 2, 0, 0, 'Warlock - Curse of Doom'), + (47897, 0.1064, 0, 0, 0, 'Warlock - Shadowflame(rank 1, DD)'), + (47960, 0, 0.0667, 0, 0, 'Warlock - Shadowflame(rank 1, DOT)'), + (47964, 0.714, 0, 0, 0, 'Pet Warlock - Firebolt'), + (47991, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (47992, 0.429, 0, 0, 0, 'Pet Warlock - Lash of Pain'), + (47994, 0, 0, 0.1429, 0, 'Pet Warlock - Cleave'), + (47995, 0, 0, 0.028, 0, 'Pet Warlock - Intercept'), + (48062, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (48063, 1.611, 0, 0, 0, 'Priest - Greater Heal'), + (48067, 0, 0.376, 0, 0, 'Priest - Renew'), + (48068, 0, 0.376, 0, 0, 'Priest - Renew'), + (48070, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (48071, 0.8057, 0, 0, 0, 'Priest - Flash Heal'), + (48072, 0.526, 0, 0, 0, 'Priest - Prayer of Healing'), + (48075, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (48076, 0.303, 0, 0, 0, 'Priest - Holy Nova Heal'), + (48077, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (48078, 0.161, 0, 0, 0, 'Priest - Holy Nova Damage'), + (48084, 0, 0.3333, 0, 0, 'Priest - Lightwell Renew Rank 1'), + (48088, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (48089, 0.402, 0, 0, 0, 'Priest - Circle of Healing'), + (48119, 0.8057, 0, 0, 0, 'Priest - Binding Heal'), + (48120, 0.8057, 0, 0, 0, 'Priest - Binding Heal'), + (48122, 0.714, 0, 0, 0, 'Priest - Smite'), + (48123, 0.714, 0, 0, 0, 'Priest - Smite'), + (48124, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (48125, 0, 0.1833, 0, 0, 'Priest - Shadow Word: Pain'), + (48126, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (48127, 0.4286, 0, 0, 0, 'Priest - Mind Blast'), + (48134, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (48135, 0.571, 0.0529, 0, 0, 'Priest - Holy Fire'), + (48157, 0.4286, 0, 0, 0, 'Priest - Shadow Word: Death'), + (48158, 0.4286, 0, 0, 0, 'Priest - Shadow Word: Death'), + (48159, 0, 0.4, 0, 0, 'Priest - Vampiric Touch'), + (48160, 0, 0.4, 0, 0, 'Priest - Vampiric Touch'), + (48172, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (48173, 0.8057, 0, 0, 0, 'Priest - Desperate Prayer'), + (48181, 0.4286, 0, 0, 0, 'Warlock - Haunt'), + (48299, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (48300, 0, 0.18, 0, 0, 'Priest - Devouring Plague'), + (48377, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (48378, 1.61, 0, 0, 0, 'Druid - Healing Touch'), + (48438, 0, 0.115, 0, 0, 'Druid - Wild Growth'), + (48440, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (48441, 0, 0.376, 0, 0, 'Druid - Rejuvenation'), + (48442, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (48443, 0.3, 0.1878, 0, 0, 'Druid - Regrowth'), + (48444, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (48445, 0.538, 0, 0, 0, 'Druid - Tranquility Triggered'), + (48450, 0, 0.09518, 0, 0, 'Druid - Lifebloom HOT'), + (48451, 0, 0.09518, 0, 0, 'Druid - Lifebloom HOT'), + (48459, 0.571, 0, 0, 0, 'Druid - Wrath'), + (48461, 0.571, 0, 0, 0, 'Druid - Wrath'), + (48462, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (48463, 0.13, 0.13, 0, 0, 'Druid - Moonfire'), + (48464, 1, 0, 0, 0, 'Druid - Starfire'), + (48465, 1, 0, 0, 0, 'Druid - Starfire'), + (48466, 0.12898, 0, 0, 0, 'Druid - Hurricane Triggered'), + (48468, 0, 0.2, 0, 0, 'Druid - Insect Swarm'), + (48561, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (48562, 0, 0, 0.063, 0, 'Druid - Swipe (Bear)'), + (48567, 0, 0, 0, 0.01, 'Druid - Lacerate($AP*0.05 / number of ticks)'), + (48568, 0, 0, 0, 0.01, 'Druid - Lacerate($AP*0.05 / number of ticks)'), + (48573, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (48574, 0, 0, 0.01, 0.06, 'Druid - Rake ($AP*0.18 / number of ticks)'), + (48628, 0, 0, 0, 0.15, 'Druid - Lock Jaw'), + (48675, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (48676, 0, 0, 0, 0.07, 'Rogue - Garrote'), + (48721, 0, 0, 0.06, 0, 'Death Knight - Blood Boil'), + (48781, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (48782, 1.66, 0, 0, 0, 'Paladin - Holy Light'), + (48784, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (48785, 1, 0, 0, 0, 'Paladin - Flash of Light'), + (48800, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (48801, 0.15, 0, 0.15, 0, 'Paladin - Exorcism'), + (48805, 0.15, 0, 0.15, 0, 'Paladin - Hammer of Wrath'), + (48806, 0.15, 0, 0.15, 0, 'Paladin - Hammer of Wrath'), + (48816, 0.07, 0, 0.07, 0, 'Paladin - Holy Wrath'), + (48817, 0.07, 0, 0.07, 0, 'Paladin - Holy Wrath'), + (48818, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (48819, 0, 0.04, 0, 0.04, 'Paladin - Consecration'), + (48820, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (48821, 0.8057, 0, 0, 0, 'Paladin - Holy Shock Triggered Heal Rank 1'), + (48822, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (48823, 0.4286, 0, 0, 0, 'Paladin - Holy Shock Triggered Hurt Rank 1'), + (48826, 0.07, 0, 0.07, 0, 'Paladin - Avenger Shield'), + (48827, 0.07, 0, 0.07, 0, 'Paladin - Avenger Shield'), + (48951, 0.09, 0, 0.056, 0, 'Paladin - Holy Shield'), + (48952, 0.09, 0, 0.056, 0, 'Paladin - Holy Shield'), + (48998, 0, 0, 0.2, 0, 'Hunter - Counterattack'), + (48999, 0, 0, 0.2, 0, 'Hunter - Counterattack'), + (49000, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (49001, 0, 0, 0, 0.04, 'Hunter - Serpent Sting($RAP*0.2 / number of ticks)'), + (49044, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (49045, 0, 0, 0.15, 0, 'Hunter - Arcane Shot'), + (49047, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (49048, 0, 0, 0.2, 0, 'Hunter - Multi Shot'), + (49051, 0, 0, 0.1, 0, 'Hunter - Steady Shot'), + (49052, 0, 0, 0.1, 0, 'Hunter - Steady Shot'), + (49053, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (49054, 0, 0, 0, 0.02, 'Hunter - Immolation Trap($RAP*0.1 / number of ticks)'), + (49064, 0, 0, 0.1, 0.1, 'Hunter - Explosive Trap Effect'), + (49065, 0, 0, 0.1, 0.1, 'Hunter - Explosive Trap Effect'), + (49184, 0, 0, 0.2, 0, 'Death Knight - Howling Blast'), + (49230, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (49231, 0.3858, 0, 0, 0, 'Shaman - Earth Shock'), + (49232, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (49233, 0.214, 0.1, 0, 0, 'Shaman - Flame Shock'), + (49235, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (49236, 0.3858, 0, 0, 0, 'Shaman - Frost Shock'), + (49237, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (49238, 0.714, 0, 0, 0, 'Shaman - Lightning Bolt'), + (49270, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (49271, 0.571, 0, 0, 0, 'Shaman - Chain Lightning'), + (49272, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (49273, 1.611, 0, 0, 0, 'Shaman - Healing Wave'), + (49275, 0.8057, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (49276, 0.8057, 0, 0, 0, 'Shaman - Lesser Healing Wave'), + (49278, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (49279, 0.267, 0, 0, 0, 'Shaman - Lightning Shield Proc Rank 1'), + (49283, 0.5371, 0, 0, 0, 'Shaman - Earth Shield'), + (49284, 0.5371, 0, 0, 0, 'Shaman - Earth Shield'), + (49803, 0, 0, 0, 0.03, 'Druid - Pounce'), + (49821, 0.2857, 0, 0, 0, 'Priest - Mind Sear Trigger Rank 1'), + (49896, 0, 0, 0.1, 0, 'Death Knight - Icy Touch'), + (49903, 0, 0, 0.1, 0, 'Death Knight - Icy Touch'), + (49904, 0, 0, 0.1, 0, 'Death Knight - Icy Touch'), + (49909, 0, 0, 0.1, 0, 'Death Knight - Icy Touch'), + (49939, 0, 0, 0.06, 0, 'Death Knight - Blood Boil'), + (49940, 0, 0, 0.06, 0, 'Death Knight - Blood Boil'), + (49941, 0, 0, 0.06, 0, 'Death Knight - Blood Boil'), + (49966, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49967, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49968, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49969, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49970, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49971, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49972, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49973, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (49974, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (50245, 0.333, 0, 0, 0, 'Pet Skills - Pin'), + (50256, 0.119658, 0, 0.07, 0, 'Pet Skills - Swipe'), + (50271, 0.333, 0, 0, 0, 'Pet Skills - Tendon Rip'), + (50274, 0, 0.333, 0, 0, 'Pet Skills - Spore Cloud'), + (50288, 0.3, 0, 0, 0, 'Druid - Starfall rank 1'), + (50294, 0.13, 0, 0, 0, 'Druid - Starfall AOE rank 1'), + (50444, 0, 0, 0.105, 0, 'Death Knight - Corpse Explosion Triggered'), + (50464, 0.672, 0, 0, 0, 'Druid - Nourish'), + (50479, 0.333, 0, 0, 0, 'Pet Skills - Nether Shock'), + (50498, 0.119658, 0, 0.07, 0, 'Pet Skills - Savage Rend'), + (50518, 0.119658, 0, 0.07, 0, 'Pet Skills - Ravage'), + (50519, 0.333, 0, 0, 0, 'Pet Skills - Sonic Blast'), + (50541, 0.119658, 0, 0.07, 0, 'Pet Skills - Snatch'), + (50581, 0.213, 0, 0, 0, 'Warlock - Shadow Cleave'), + (50590, 0.143, 0, 0, 0, 'Warlock - Immolation Aura'), + (50796, 0.714, 0, 0, 0, 'Warlock - Chaos Bolt'), + (50842, 0, 0, 0.04, 0, 'Death Knight - Pestilence'), + (51409, 0, 0, 0.2, 0, 'Death Knight - Howling Blast'), + (51410, 0, 0, 0.2, 0, 'Death Knight - Howling Blast'), + (51411, 0, 0, 0.2, 0, 'Death Knight - Howling Blast'), + (51505, 0.571, 0, 0, 0, 'Shaman - Lava Burst'), + (51945, 0, 0.164, 0, 0, 'Shaman - Earthliving Weapon'), + (51963, 0.453, 0, 0, 0, 'Pet Death Knight, Gargoyle Strike'), + (51990, 0, 0.164, 0, 0, 'Shaman - Earthliving Weapon'), + (51997, 0, 0.164, 0, 0, 'Shaman - Earthliving Weapon'), + (51998, 0, 0.164, 0, 0, 'Shaman - Earthliving Weapon'), + (51999, 0, 0.164, 0, 0, 'Shaman - Earthliving Weapon'), + (52000, 0, 0.164, 0, 0, 'Shaman - Earthliving Weapon'), + (52042, 0.0827, 0, 0, 0, 'Shaman - Healing Stream Totem Triggered Heal'), + (52212, 0, 0, 0.04805, 0, 'Death Knight - Death and Decay'), + (52471, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (52472, 0.119658, 0, 0.07, 0, 'Pet Skills - Claw'), + (52473, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (52474, 0.119658, 0, 0.07, 0, 'Pet Skills - Bite'), + (52475, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (52476, 0.119658, 0, 0.07, 0, 'Pet Skills - Smack'), + (52983, 0.5362, 0, 0, 0, 'Priest - Pennance heal'), + (52984, 0.5362, 0, 0, 0, 'Priest - Pennance heal'), + (52985, 0.5362, 0, 0, 0, 'Priest - Pennance heal'), + (52998, 0.1905, 0, 0, 0, 'Priest - Pennance damage'), + (52999, 0.1905, 0, 0, 0, 'Priest - Pennance damage'), + (53000, 0.1905, 0, 0, 0, 'Priest - Pennance damage'), + (53022, 0.2857, 0, 0, 0, 'Priest - Mind Sear Trigger Rank 1'), + (53188, 0.13, 0, 0, 0, 'Druid - Starfall AOE rank 2'), + (53189, 0.13, 0, 0, 0, 'Druid - Starfall AOE rank 3'), + (53190, 0.13, 0, 0, 0, 'Druid - Starfall AOE rank 4'), + (53191, 0.3, 0, 0, 0, 'Druid - Starfall rank 2'), + (53194, 0.3, 0, 0, 0, 'Druid - Starfall rank 3'), + (53195, 0.3, 0, 0, 0, 'Druid - Starfall rank 4'), + (53227, 0.193, 0, 0, 0, 'Druid - Typhoon'), + (53248, 0, 0.115, 0, 0, 'Druid - Wild Growth'), + (53249, 0, 0.115, 0, 0, 'Druid - Wild Growth'), + (53251, 0, 0.115, 0, 0, 'Druid - Wild Growth'), + (53307, 0.033, 0, 0, 0, 'Druid - Thorns'), + (53308, 0, 0.1, 0, 0, 'Druid - Entangling Roots'), + (53313, 0, 0.1, 0, 0, 'Druid - Entangling Roots (Natures Grasp)'), + (53339, 0, 0, 0.2, 0, 'Hunter - Mongoose Bite'), + (53352, 0, 0, 0.16, 0, 'Hunter - Explosive Shot (triggered)'), + (53526, 0.119658, 0, 0.07, 0, 'Pet Skills - Swipe'), + (53528, 0.119658, 0, 0.07, 0, 'Pet Skills - Swipe'), + (53529, 0.119658, 0, 0.07, 0, 'Pet Skills - Swipe'), + (53532, 0.119658, 0, 0.07, 0, 'Pet Skills - Swipe'), + (53533, 0.119658, 0, 0.07, 0, 'Pet Skills - Swipe'), + (53537, 0.119658, 0, 0.07, 0, 'Pet Skills - Snatch'), + (53538, 0.119658, 0, 0.07, 0, 'Pet Skills - Snatch'), + (53540, 0.119658, 0, 0.07, 0, 'Pet Skills - Snatch'), + (53542, 0.119658, 0, 0.07, 0, 'Pet Skills - Snatch'), + (53543, 0.119658, 0, 0.07, 0, 'Pet Skills - Snatch'), + (53544, 0.333, 0, 0, 0, 'Pet Skills - Pin'), + (53545, 0.333, 0, 0, 0, 'Pet Skills - Pin'), + (53546, 0.333, 0, 0, 0, 'Pet Skills - Pin'), + (53547, 0.333, 0, 0, 0, 'Pet Skills - Pin'), + (53548, 0.333, 0, 0, 0, 'Pet Skills - Pin'), + (53558, 0.119658, 0, 0.07, 0, 'Pet Skills - Ravage'), + (53559, 0.119658, 0, 0.07, 0, 'Pet Skills - Ravage'), + (53560, 0.119658, 0, 0.07, 0, 'Pet Skills - Ravage'), + (53561, 0.119658, 0, 0.07, 0, 'Pet Skills - Ravage'), + (53562, 0.119658, 0, 0.07, 0, 'Pet Skills - Ravage'), + (53564, 0.333, 0, 0, 0, 'Pet Skills - Sonic Blast'), + (53565, 0.333, 0, 0, 0, 'Pet Skills - Sonic Blast'), + (53566, 0.333, 0, 0, 0, 'Pet Skills - Sonic Blast'), + (53567, 0.333, 0, 0, 0, 'Pet Skills - Sonic Blast'), + (53568, 0.333, 0, 0, 0, 'Pet Skills - Sonic Blast'), + (53571, 0.333, 0, 0, 0, 'Pet Skills - Tendon Rip'), + (53572, 0.333, 0, 0, 0, 'Pet Skills - Tendon Rip'), + (53573, 0.333, 0, 0, 0, 'Pet Skills - Tendon Rip'), + (53574, 0.333, 0, 0, 0, 'Pet Skills - Tendon Rip'), + (53575, 0.333, 0, 0, 0, 'Pet Skills - Tendon Rip'), + (53578, 0.119658, 0, 0.07, 0, 'Pet Skills - Savage Rend'), + (53579, 0.119658, 0, 0.07, 0, 'Pet Skills - Savage Rend'), + (53580, 0.119658, 0, 0.07, 0, 'Pet Skills - Savage Rend'), + (53581, 0.119658, 0, 0.07, 0, 'Pet Skills - Savage Rend'), + (53582, 0.119658, 0, 0.07, 0, 'Pet Skills - Savage Rend'), + (53584, 0.333, 0, 0, 0, 'Pet Skills - Nether Shock'), + (53586, 0.333, 0, 0, 0, 'Pet Skills - Nether Shock'), + (53587, 0.333, 0, 0, 0, 'Pet Skills - Nether Shock'), + (53588, 0.333, 0, 0, 0, 'Pet Skills - Nether Shock'), + (53589, 0.333, 0, 0, 0, 'Pet Skills - Nether Shock'), + (53593, 0, 0.333, 0, 0, 'Pet Skills - Spore Cloud'), + (53594, 0, 0.333, 0, 0, 'Pet Skills - Spore Cloud'), + (53596, 0, 0.333, 0, 0, 'Pet Skills - Spore Cloud'), + (53597, 0, 0.333, 0, 0, 'Pet Skills - Spore Cloud'), + (53598, 0, 0.333, 0, 0, 'Pet Skills - Spore Cloud'), + (53733, 0.22, 0, 0.14, 0, 'Paladin - Judgement of Corruption'), + (53742, 0, 0.013, 0, 0.025, 'Paladin - Seal of Corruption'), + (54049, 0.429, 0, 0, 0, 'Pet Warlock - Shadow Bite'), + (54050, 0.429, 0, 0, 0, 'Pet Warlock - Shadow Bite'), + (54051, 0.429, 0, 0, 0, 'Pet Warlock - Shadow Bite'), + (54052, 0.429, 0, 0, 0, 'Pet Warlock - Shadow Bite'), + (54053, 0.429, 0, 0, 0, 'Pet Warlock - Shadow Bite'), + (54158, 0.25, 0, 0.16, 0, 'Paladin - Jugdement (Seal of Light, Seal of Wisdom, Seal of Justice)'), + (54644, 0.333, 0, 0, 0, 'Pet Skills - Froststorm Breath'), + (54680, 0.119658, 0, 0.07, 0, 'Pet Skills - Monstrous Bite'), + (54706, 0, 0.333, 0, 0, 'Pet Skills - Venom Web Spray'), + (55078, 0, 0, 0, 0.06325, 'Death Knight - Blood Plague'), + (55095, 0, 0, 0, 0.06325, 'Death Knight - Frost Fever'), + (55359, 0, 0.2, 0, 0, 'Mage - Living Bomb DOT'), + (55360, 0, 0.2, 0, 0, 'Mage - Living Bomb DOT'), + (55361, 0.4, 0, 0, 0, 'Mage - Living Bomb DD'), + (55362, 0.4, 0, 0, 0, 'Mage - Living Bomb DD'), + (55458, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (55459, 1.3428, 0, 0, 0, 'Shaman - Chain Heal'), + (55482, 0.333, 0.167, 0, 0, 'Pet Skills - Fire Breath'), + (55483, 0.333, 0.167, 0, 0, 'Pet Skills - Fire Breath'), + (55484, 0.333, 0.167, 0, 0, 'Pet Skills - Fire Breath'), + (55485, 0.333, 0.167, 0, 0, 'Pet Skills - Fire Breath'), + (55487, 0.119658, 0, 0.07, 0, 'Pet Skills - Demoralizing Screech'), + (55488, 0.333, 0, 0, 0, 'Pet Skills - Froststorm Breath'), + (55489, 0.333, 0, 0, 0, 'Pet Skills - Froststorm Breath'), + (55490, 0.333, 0, 0, 0, 'Pet Skills - Froststorm Breath'), + (55491, 0.333, 0, 0, 0, 'Pet Skills - Froststorm Breath'), + (55492, 0.333, 0, 0, 0, 'Pet Skills - Froststorm Breath'), + (55495, 0.119658, 0, 0.07, 0, 'Pet Skills - Monstrous Bite'), + (55496, 0.119658, 0, 0.07, 0, 'Pet Skills - Monstrous Bite'), + (55497, 0.119658, 0, 0.07, 0, 'Pet Skills - Monstrous Bite'), + (55498, 0.119658, 0, 0.07, 0, 'Pet Skills - Monstrous Bite'), + (55499, 0.119658, 0, 0.07, 0, 'Pet Skills - Monstrous Bite'), + (55505, 0, 0.333, 0, 0, 'Pet Skills - Venom Web Spray'), + (55506, 0, 0.333, 0, 0, 'Pet Skills - Venom Web Spray'), + (55507, 0, 0.333, 0, 0, 'Pet Skills - Venom Web Spray'), + (55508, 0, 0.333, 0, 0, 'Pet Skills - Venom Web Spray'), + (55509, 0, 0.333, 0, 0, 'Pet Skills - Venom Web Spray'), + (55555, 0, 0.067, 0, 0, 'Pet Skills - Poison Spit'), + (55556, 0, 0.067, 0, 0, 'Pet Skills - Poison Spit'), + (55557, 0, 0.067, 0, 0, 'Pet Skills - Poison Spit'), + (55728, 0, 0.067, 0, 0, 'Pet Skills - Scorpid Poison'), + (55749, 0.333, 0, 0, 0, 'Pet Skills - Acid Spit'), + (55750, 0.333, 0, 0, 0, 'Pet Skills - Acid Spit'), + (55751, 0.333, 0, 0, 0, 'Pet Skills - Acid Spit'), + (55752, 0.333, 0, 0, 0, 'Pet Skills - Acid Spit'), + (55753, 0.333, 0, 0, 0, 'Pet Skills - Acid Spit'), + (55754, 0.333, 0, 0, 0, 'Pet Skills - Acid Spit'), + (56626, 0.333, 0, 0, 0, 'Pet Skills - Sting'), + (56627, 0.333, 0, 0, 0, 'Pet Skills - Sting'), + (56628, 0.333, 0, 0, 0, 'Pet Skills - Sting'), + (56629, 0.333, 0, 0, 0, 'Pet Skills - Sting'), + (56630, 0.333, 0, 0, 0, 'Pet Skills - Sting'), + (56631, 0.333, 0, 0, 0, 'Pet Skills - Sting'), + (56641, 0, 0, 0.1, 0, 'Hunter - Steady Shot'), + (57386, 0.333, 0, 0, 0, 'Pet Skills - Stampede'), + (57389, 0.333, 0, 0, 0, 'Pet Skills - Stampede'), + (57390, 0.333, 0, 0, 0, 'Pet Skills - Stampede'), + (57391, 0.333, 0, 0, 0, 'Pet Skills - Stampede'), + (57392, 0.333, 0, 0, 0, 'Pet Skills - Stampede'), + (57393, 0.333, 0, 0, 0, 'Pet Skills - Stampede'), + (57755, 0, 0, 0.5, 0, 'Warrior - Shattering Throw'), + (57823, 0, 0, 0.31, 0, 'Warrior - Revenge'), + (57964, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 8'), + (57965, 0, 0, 0.1, 0, 'Rogue - Instant Poison Rank 9'), + (57969, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 8($AP*0.12 / number of ticks)'), + (57970, 0, 0, 0, 0.03, 'Rogue - Deadly Poison Rank 9($AP*0.12 / number of ticks)'), + (57974, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 6'), + (57975, 0, 0, 0.04, 0, 'Rogue - Wound Poison Rank 7'), + (57984, 0.2, 0, 0, 0, 'Pet Shaman - Fire Elemental Fire Blast'), + (58381, 0.257, 0, 0, 0, 'Priest - Mind Flay'), + (58432, 0, 0, 0.0837, 0, 'Hunter - Volley'), + (58433, 0, 0, 0.0837, 0, 'Hunter - Volley'), + (58604, 0.333, 0, 0, 0, 'Pet Skills - Lava Breath'), + (58607, 0.333, 0, 0, 0, 'Pet Skills - Lava Breath'), + (58608, 0.333, 0, 0, 0, 'Pet Skills - Lava Breath'), + (58609, 0.333, 0, 0, 0, 'Pet Skills - Lava Breath'), + (58610, 0.333, 0, 0, 0, 'Pet Skills - Lava Breath'), + (58611, 0.333, 0, 0, 0, 'Pet Skills - Lava Breath'), + (58621, 0, 0, 0.08, 0, 'Death Knight - Glyph of Chains of Ice'), + (58700, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 8'), + (58701, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 9'), + (58702, 0.1667, 0, 0, 0, 'Shaman - Searing Totem Attack Rank 10'), + (58732, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 6'), + (58735, 0.1, 0, 0, 0, 'Shaman - Magma totem trigger 7'), + (58786, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (58787, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (58788, 0.1, 0, 0, 0, 'Shaman - Flametongue Weapon'), + (58797, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (58798, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (58799, 0.1, 0, 0, 0, 'Shaman - Frostbrand Attack'), + (59092, 0.96, 0, 0, 0, 'Warlock - Dark Pact'), + (59161, 0.4286, 0, 0, 0, 'Warlock - Haunt'), + (59163, 0.4286, 0, 0, 0, 'Warlock - Haunt'), + (59164, 0.4286, 0, 0, 0, 'Warlock - Haunt'), + (59170, 0.714, 0, 0, 0, 'Warlock - Chaos Bolt'), + (59171, 0.714, 0, 0, 0, 'Warlock - Chaos Bolt'), + (59172, 0.714, 0, 0, 0, 'Warlock - Chaos Bolt'), + (59637, 0.15, 0, 0, 0, 'Pet Mage - Mirror Image Fireblast'), + (59638, 0.3, 0, 0, 0, 'Pet Mage - Mirror Image Frostbolt'), + (59881, 0.0299, 0.0299, 0.0175, 0.0175, 'Pet Skills - Rake'), + (59882, 0.0299, 0.0299, 0.0175, 0.0175, 'Pet Skills - Rake'), + (59883, 0.0299, 0.0299, 0.0175, 0.0175, 'Pet Skills - Rake'), + (59884, 0.0299, 0.0299, 0.0175, 0.0175, 'Pet Skills - Rake'), + (59885, 0.0299, 0.0299, 0.0175, 0.0175, 'Pet Skills - Rake'), + (59886, 0.0299, 0.0299, 0.0175, 0.0175, 'Pet Skills - Rake'), + (60043, 0.571, 0, 0, 0, 'Shaman - Lava Burst'), + (60089, 0, 0, 0.15, 0, 'Druid - Faerie Fire (feral), damage'), + (61193, 0.333, 0.333, 0, 0, 'Pet Skills - Spirit Strike'), + (61194, 0.333, 0.333, 0, 0, 'Pet Skills - Spirit Strike'), + (61195, 0.333, 0.333, 0, 0, 'Pet Skills - Spirit Strike'), + (61196, 0.333, 0.333, 0, 0, 'Pet Skills - Spirit Strike'), + (61197, 0.333, 0.333, 0, 0, 'Pet Skills - Spirit Strike'), + (61198, 0.333, 0.333, 0, 0, 'Pet Skills - Spirit Strike'), + (61290, 0.1064, 0, 0, 0, 'Warlock - Shadowflame(rank 1, DD)'), + (61291, 0, 0.0667, 0, 0, 'Warlock - Shadowflame(rank 2, DOT)'), + (61295, 0.402, 0.188, 0, 0, 'Shaman - Riptide'), + (61299, 0.402, 0.188, 0, 0, 'Shaman - Riptide'), + (61300, 0.402, 0.188, 0, 0, 'Shaman - Riptide'), + (61301, 0.402, 0.188, 0, 0, 'Shaman - Riptide'), + (61387, 0.193, 0, 0, 0, 'Druid - Typhoon'), + (61388, 0.193, 0, 0, 0, 'Druid - Typhoon'), + (61390, 0.193, 0, 0, 0, 'Druid - Typhoon'), + (61391, 0.193, 0, 0, 0, 'Druid - Typhoon'), + (61491, 0, 0, 0.12, 0, 'Warrior - Intercept'), + (61650, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (61654, 0.214, 0, 0, 0, 'Shaman - Fire Nova Totem'), + (63668, 0, 0, 0, 0.02, 'Hunter - Black Arrow($RAP*0.1 / number of ticks)'), + (63669, 0, 0, 0, 0.02, 'Hunter - Black Arrow($RAP*0.1 / number of ticks)'), + (63670, 0, 0, 0, 0.02, 'Hunter - Black Arrow($RAP*0.1 / number of ticks)'), + (63671, 0, 0, 0, 0.02, 'Hunter - Black Arrow($RAP*0.1 / number of ticks)'), + (63672, 0, 0, 0, 0.02, 'Hunter - Black Arrow($RAP*0.1 / number of ticks)'), + (63900, 0.119658, 0, 0.07, 0, 'Pet Skills - Thunderstomp'), + (64085, 1.2, 0, 0, 0, 'Priest - Vampiric Touch backfire'), + (64382, 0, 0, 0.5, 0, 'Warrior - Shattering Throw'), + (64844, 0.5362, 0, 0, 0, 'Priest - Divine Hymn'), + (67485, 0, 0, 0.5, 0, 'Paladin - Hand of Reckoning'), + (71393, 1, 0, 0, 0, 'Blood Prince Council Ball of Falmes Explosion'), + (71757, 2.143, 0, 0, 0, 'Mage - Deep Freeze'), + (72789, 1, 0, 0, 0, 'Blood Prince Council Ball of Falmes Explosion'), + (72790, 1, 0, 0, 0, 'Blood Prince Council Ball of Falmes Explosion'), + (72791, 1, 0, 0, 0, 'Blood Prince Council Ball of Falmes Explosion'), + (72898, 0.83, 0, 0, 0, 'Pet Mage - Water Elemental Frostbolt'), + (18817, 1, 0, 0, 0, 'Skullflame Shield - Drain Life'), + (22009, 0, 0.2, 0, 0, 'Priest - Greater Heal - 8P T2'); From 34ca977f570dc290bd040bce3f8775e5d65d5554 Mon Sep 17 00:00:00 2001 From: neifion-00000000 <91289495+neifion-00000000@users.noreply.github.com> Date: Fri, 7 Oct 2022 17:36:37 -0500 Subject: [PATCH 05/66] fix(db/creature_loot_template): Item 21757 and 21771 rate corrections (#13328) --- .../updates/pending_db_world/rev_1665047704458371200.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665047704458371200.sql diff --git a/data/sql/updates/pending_db_world/rev_1665047704458371200.sql b/data/sql/updates/pending_db_world/rev_1665047704458371200.sql new file mode 100644 index 000000000..b4879829c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665047704458371200.sql @@ -0,0 +1,6 @@ +-- +-- Drop rate improvements over 1144 itterations: +-- ITEM Captain Kelisendra's Lost Rutters (21776) = Already Correct 10% +-- Other quest ITEMs Grimscale Murloc Head (21757), Captain Kelisendra's Cargo (21771) appear to be about 45% rate (it is possible the casters are higher rate, but unproven within margin of error) +UPDATE `creature_loot_template` SET `Chance`='45' WHERE `Item`=21757; +UPDATE `creature_loot_template` SET `Chance`='45' WHERE `Item`=21771; From 46892cb70dc8b36452f1fd5d995e759c91fe63c7 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 7 Oct 2022 22:38:47 +0000 Subject: [PATCH 06/66] chore(DB): import pending files Referenced commit(s): 34ca977f570dc290bd040bce3f8775e5d65d5554 --- .../rev_1662213489218975200.sql => db_world/2022_10_07_00.sql} | 1 + .../rev_1665047704458371200.sql => db_world/2022_10_07_01.sql} | 1 + .../rev_1665083915954697700.sql => db_world/2022_10_07_02.sql} | 1 + .../rev_1665108660264438400.sql => db_world/2022_10_07_03.sql} | 1 + .../rev_1665166481073025800.sql => db_world/2022_10_07_04.sql} | 1 + 5 files changed, 5 insertions(+) rename data/sql/updates/{pending_db_world/rev_1662213489218975200.sql => db_world/2022_10_07_00.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1665047704458371200.sql => db_world/2022_10_07_01.sql} (91%) rename data/sql/updates/{pending_db_world/rev_1665083915954697700.sql => db_world/2022_10_07_02.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1665108660264438400.sql => db_world/2022_10_07_03.sql} (71%) rename data/sql/updates/{pending_db_world/rev_1665166481073025800.sql => db_world/2022_10_07_04.sql} (92%) diff --git a/data/sql/updates/pending_db_world/rev_1662213489218975200.sql b/data/sql/updates/db_world/2022_10_07_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1662213489218975200.sql rename to data/sql/updates/db_world/2022_10_07_00.sql index abd73f441..3e5e15525 100644 --- a/data/sql/updates/pending_db_world/rev_1662213489218975200.sql +++ b/data/sql/updates/db_world/2022_10_07_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_06_05 -> 2022_10_07_00 -- Idols UPDATE `creature_loot_template` SET `Chance`=0.4 WHERE `Item` IN (20874, 20875, 20876, 20877, 20878, 20879, 20881, 20882); diff --git a/data/sql/updates/pending_db_world/rev_1665047704458371200.sql b/data/sql/updates/db_world/2022_10_07_01.sql similarity index 91% rename from data/sql/updates/pending_db_world/rev_1665047704458371200.sql rename to data/sql/updates/db_world/2022_10_07_01.sql index b4879829c..7afc94f6e 100644 --- a/data/sql/updates/pending_db_world/rev_1665047704458371200.sql +++ b/data/sql/updates/db_world/2022_10_07_01.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_00 -> 2022_10_07_01 -- -- Drop rate improvements over 1144 itterations: -- ITEM Captain Kelisendra's Lost Rutters (21776) = Already Correct 10% diff --git a/data/sql/updates/pending_db_world/rev_1665083915954697700.sql b/data/sql/updates/db_world/2022_10_07_02.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1665083915954697700.sql rename to data/sql/updates/db_world/2022_10_07_02.sql index b8ca9e0d8..a2eb4b76b 100644 --- a/data/sql/updates/pending_db_world/rev_1665083915954697700.sql +++ b/data/sql/updates/db_world/2022_10_07_02.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_01 -> 2022_10_07_02 -- DELETE FROM `spell_bonus_data` WHERE `entry` BETWEEN 116 AND 72898; INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`, `ap_bonus`, `ap_dot_bonus`, `comments`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1665108660264438400.sql b/data/sql/updates/db_world/2022_10_07_03.sql similarity index 71% rename from data/sql/updates/pending_db_world/rev_1665108660264438400.sql rename to data/sql/updates/db_world/2022_10_07_03.sql index 57a958400..1d88fa9d3 100644 --- a/data/sql/updates/pending_db_world/rev_1665108660264438400.sql +++ b/data/sql/updates/db_world/2022_10_07_03.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_02 -> 2022_10_07_03 -- UPDATE `creature` SET `id2`=15317 WHERE `id1`=15316; UPDATE `creature` SET `id2`=15316 WHERE `id1`=15317; diff --git a/data/sql/updates/pending_db_world/rev_1665166481073025800.sql b/data/sql/updates/db_world/2022_10_07_04.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1665166481073025800.sql rename to data/sql/updates/db_world/2022_10_07_04.sql index 8871e9c47..9bfef09bf 100644 --- a/data/sql/updates/pending_db_world/rev_1665166481073025800.sql +++ b/data/sql/updates/db_world/2022_10_07_04.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_03 -> 2022_10_07_04 UPDATE `creature_template` SET `detection_range` = 37.5 WHERE (`entry` IN (15262, 15312)); UPDATE `creature_template` SET `detection_range` = 38.5 WHERE (`entry` = 15263); UPDATE `creature_template` SET `detection_range` = 15 WHERE (`entry` = 15300); From e30f0ada163b712161d64ae4519d2a5f8edfbf5a Mon Sep 17 00:00:00 2001 From: neifion-00000000 <91289495+neifion-00000000@users.noreply.github.com> Date: Fri, 7 Oct 2022 17:39:13 -0500 Subject: [PATCH 07/66] fix(DB/gameobject): improve Captain Kelisendra's Cargo spawnpoints (#13317) --- .../rev_1664935330890249100.sql | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664935330890249100.sql diff --git a/data/sql/updates/pending_db_world/rev_1664935330890249100.sql b/data/sql/updates/pending_db_world/rev_1664935330890249100.sql new file mode 100644 index 000000000..1735aff68 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664935330890249100.sql @@ -0,0 +1,93 @@ +-- +-- Not every GAMEOBJECT Captain Kelisendra's Cargo (180917) will be spawned at the same time and object bunching is possible (1 pool). 6 can be up at time (confirmed twice) and thier respawn seem very fast. + +DELETE FROM `gameobject` WHERE `id`=180917; +SET @OGUID :=18017; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @GUID+39; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(@OGUID+0, 180917, 530, 3430, 3460, 1, 1, 8881.802734375, -5735.43359375, 0.117886997759342193, 4.607671737670898437, 0, 0, -0.74314403533935546, 0.669131457805633544, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+1, 180917, 530, 3430, 3460, 1, 1, 8742.2236328125, -5697.8486328125, 0.245764002203941345, 1.570795774459838867, 0, 0, 0.707106590270996093, 0.707106947898864746, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+2, 180917, 530, 3430, 3460, 1, 1, 8669.2470703125, -5689.86279296875, 0.885070979595184326, 4.206246376037597656, 0, 0, -0.86162853240966796, 0.50753939151763916, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+3, 180917, 530, 3430, 3460, 1, 1, 8788.962890625, -5753.9541015625, 0.154392004013061523, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+4, 180917, 530, 3430, 3460, 1, 1, 8783.94140625, -5685.76123046875, 0.243977993726730346, 4.049167633056640625, 0, 0, -0.89879322052001953, 0.438372820615768432, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+5, 180917, 530, 3430, 3460, 1, 1, 8883.78515625, -5733.18310546875, -0.07398299872875213, 5.235987663269042968, 0, 0, -0.5, 0.866025388240814208, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+6, 180917, 530, 3430, 3460, 1, 1, 8670.87109375, -5685.01611328125, 0.471585988998413085, 5.218535900115966796, 0, 0, -0.507537841796875, 0.861629426479339599, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+7, 180917, 530, 3430, 3460, 1, 1, 8885.13671875, -5736.46484375, -0.12266399711370468, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+8, 180917, 530, 3430, 3460, 1, 1, 8741.5673828125, -5694.47509765625, -0.00841099955141544, 4.48549652099609375, 0, 0, -0.7826080322265625, 0.622514784336090087, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+9, 180917, 530, 3430, 3460, 1, 1, 8784.1865234375, -5743.7666015625, 0.156876996159553527, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+10, 180917, 530, 3430, 3460, 1, 1, 8621.2236328125, -5671.03857421875, 0.184166997671127319, 4.991643905639648437, 0, 0, -0.60181427001953125, 0.798636078834533691, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+11, 180917, 530, 3430, 3460, 1, 1, 8776.1357421875, -5688.74462890625, 0.475109994411468505, 4.555310726165771484, 0, 0, -0.76040554046630859, 0.649448513984680175, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+12, 180917, 530, 3430, 3460, 1, 1, 8842.1884765625, -5712.59619140625, 0.680698990821838378, 4.956737518310546875, 0, 0, -0.61566066741943359, 0.788011372089385986, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+13, 180917, 530, 3430, 3460, 1, 1, 8787.708984375, -5750.0869140625, 0.045983001589775085, 5.742135047912597656, 0, 0, -0.26723766326904296, 0.96363067626953125, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+14, 180917, 530, 3430, 3460, 1, 1, 8880.1494140625, -5730.4921875, 0.130083993077278137, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+15, 180917, 530, 3430, 3460, 1, 1, 8881.9365234375, -5731.9072265625, 0.042814001441001892, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+16, 180917, 530, 3430, 3460, 1, 1, 8783.9892578125, -5738.68359375, 0.175551995635032653, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+17, 180917, 530, 3430, 3460, 1, 1, 8849.580078125, -5712.47509765625, 0.612582981586456298, 5.393068790435791015, 0, 0, -0.43051052093505859, 0.902585566043853759, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+18, 180917, 530, 3430, 3460, 1, 1, 8747.5849609375, -5693.92626953125, 0.521658003330230712, 4.276057243347167968, 0, 0, -0.84339141845703125, 0.537299633026123046, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+19, 180917, 530, 3430, 3460, 1, 1, 8781.12109375, -5683, 0.007420999929308891, 4.206246376037597656, 0, 0, -0.86162853240966796, 0.50753939151763916, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+20, 180917, 530, 3430, 3460, 1, 1, 8783.9892578125, -5738.68359375, 0.175551995635032653, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+21, 180917, 530, 3430, 3460, 1, 1, 8843.9755859375, -5715.81982421875, 0.690900027751922607, 3.263772249221801757, 0, 0, -0.99813460303710937, 0.061051756143569946, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+22, 180917, 530, 3430, 3460, 1, 1, 8846.53125, -5711.57421875, 0.612381994724273681, 3.52557229995727539, 0, 0, -0.98162651062011718, 0.190812408924102783, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+23, 180917, 530, 3430, 3460, 1, 1, 8845.7255859375, -5713.32763671875, 0.679681003093719482, 3.333590030670166015, 0, 0, -0.99539566040039062, 0.095851235091686248, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+24, 180917, 530, 3430, 3460, 1, 1, 8680.0771484375, -5693.79736328125, 0.269024014472961425, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+25, 180917, 530, 3430, 3460, 1, 1, 8624.8623046875, -5674.0302734375, 0.550777018070220947, 1.221729278564453125, 0, 0, 0.573575973510742187, 0.819152355194091796, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+26, 180917, 530, 3430, 3460, 1, 1, 8618.5126953125, -5674.203125, 0.306627005338668823, 1.099556446075439453, 0, 0, 0.522498130798339843, 0.852640450000762939, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+27, 180917, 530, 3430, 3460, 1, 1, 8621.2236328125, -5671.03857421875, 0.184166997671127319, 4.991643905639648437, 0, 0, -0.60181427001953125, 0.798636078834533691, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+28, 180917, 530, 3430, 3460, 1, 1, 8775.6767578125, -5683.384765625, 0.09130900353193283, 4.520402908325195312, 0, 0, -0.77162456512451171, 0.636078238487243652, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+29, 180917, 530, 3430, 3460, 1, 1, 8777.2607421875, -5685.15576171875, 0.245699003338813781, 2.565631866455078125, 0, 0, 0.958819389343261718, 0.284016460180282592, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+30, 180917, 530, 3430, 3460, 1, 1, 8674.56640625, -5686.62744140625, 0.252530008554458618, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+31, 180917, 530, 3430, 3460, 1, 1, 8627.6865234375, -5674.00390625, 0.601273000240325927, 3.019413232803344726, 0, 0, 0.998134603037109375, 0.061051756143569946, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+32, 180917, 530, 3430, 3460, 1, 1, 8629.25, -5671.556640625, 0.449225008487701416, 4.468043327331542968, 0, 0, -0.7880105972290039, 0.615661680698394775, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+33, 180917, 530, 3430, 3460, 1, 1, 8626.0439453125, -5670.52734375, 0.292910009622573852, 2.495818138122558593, 0, 0, 0.948323249816894531, 0.317305892705917358, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+34, 180917, 530, 3430, 3460, 1, 1, 8883.1611328125, -5737.95166015625, 0.075424000620841979, 2.234017848968505859, 0, 0, 0.898793220520019531, 0.438372820615768432, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+35, 180917, 530, 3430, 3460, 1, 1, 8746.26171875, -5691.97216796875, 0.339785993099212646, 5.061456203460693359, 0, 0, -0.57357597351074218, 0.819152355194091796, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+36, 180917, 530, 3430, 3460, 1, 1, 8784.421875, -5747.7373046875, 0.232134997844696044, 1.396261811256408691, 0, 0, 0.642786979675292968, 0.766044974327087402, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+37, 180917, 530, 3430, 3460, 1, 1, 8673.607421875, -5689.6552734375, 0.596818983554840087, 2.338739633560180664, 0, 0, 0.920504570007324218, 0.3907318115234375, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+38, 180917, 530, 3430, 3460, 1, 1, 8848.1298828125, -5716.017578125, 0.576173007488250732, 3.001946926116943359, 0, 0, 0.997563362121582031, 0.069766148924827575, 30, 255, 1, 0), -- 180917 (Area: 3460 - Difficulty: 0) +(@OGUID+39, 180917, 530, 3430, 3460, 1, 1, 8743.2236328125, -5693.51123046875, 0.123534001410007476, 5.864306926727294921, 0, 0, -0.20791149139404296, 0.978147625923156738, 30, 255, 1, 0); + +DELETE FROM `pool_template` WHERE `entry`=505; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(505, 6, 'Captain Kelisendra\'s Cargo (6 spawns)'); +DELETE FROM `pool_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+39; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(@OGUID+0, 505, 0, 'Captain Kelisendra\'s Cargo 1 of 40'), +(@OGUID+1, 505, 0, 'Captain Kelisendra\'s Cargo 2 of 40'), +(@OGUID+2, 505, 0, 'Captain Kelisendra\'s Cargo 3 of 40'), +(@OGUID+3, 505, 0, 'Captain Kelisendra\'s Cargo 4 of 40'), +(@OGUID+4, 505, 0, 'Captain Kelisendra\'s Cargo 5 of 40'), +(@OGUID+5, 505, 0, 'Captain Kelisendra\'s Cargo 6 of 40'), +(@OGUID+6, 505, 0, 'Captain Kelisendra\'s Cargo 7 of 40'), +(@OGUID+7, 505, 0, 'Captain Kelisendra\'s Cargo 8 of 40'), +(@OGUID+8, 505, 0, 'Captain Kelisendra\'s Cargo 9 of 40'), +(@OGUID+9, 505, 0, 'Captain Kelisendra\'s Cargo 10 of 40'), +(@OGUID+10, 505, 0, 'Captain Kelisendra\'s Cargo 11 of 40'), +(@OGUID+11, 505, 0, 'Captain Kelisendra\'s Cargo 12 of 40'), +(@OGUID+12, 505, 0, 'Captain Kelisendra\'s Cargo 13 of 40'), +(@OGUID+13, 505, 0, 'Captain Kelisendra\'s Cargo 14 of 40'), +(@OGUID+14, 505, 0, 'Captain Kelisendra\'s Cargo 15 of 40'), +(@OGUID+15, 505, 0, 'Captain Kelisendra\'s Cargo 16 of 40'), +(@OGUID+16, 505, 0, 'Captain Kelisendra\'s Cargo 17 of 40'), +(@OGUID+17, 505, 0, 'Captain Kelisendra\'s Cargo 18 of 40'), +(@OGUID+18, 505, 0, 'Captain Kelisendra\'s Cargo 19 of 40'), +(@OGUID+19, 505, 0, 'Captain Kelisendra\'s Cargo 20 of 40'), +(@OGUID+20, 505, 0, 'Captain Kelisendra\'s Cargo 21 of 40'), +(@OGUID+21, 505, 0, 'Captain Kelisendra\'s Cargo 22 of 40'), +(@OGUID+22, 505, 0, 'Captain Kelisendra\'s Cargo 23 of 40'), +(@OGUID+23, 505, 0, 'Captain Kelisendra\'s Cargo 24 of 40'), +(@OGUID+24, 505, 0, 'Captain Kelisendra\'s Cargo 25 of 40'), +(@OGUID+25, 505, 0, 'Captain Kelisendra\'s Cargo 26 of 40'), +(@OGUID+26, 505, 0, 'Captain Kelisendra\'s Cargo 27 of 40'), +(@OGUID+27, 505, 0, 'Captain Kelisendra\'s Cargo 28 of 40'), +(@OGUID+28, 505, 0, 'Captain Kelisendra\'s Cargo 29 of 40'), +(@OGUID+29, 505, 0, 'Captain Kelisendra\'s Cargo 30 of 40'), +(@OGUID+30, 505, 0, 'Captain Kelisendra\'s Cargo 31 of 40'), +(@OGUID+31, 505, 0, 'Captain Kelisendra\'s Cargo 32 of 40'), +(@OGUID+32, 505, 0, 'Captain Kelisendra\'s Cargo 33 of 40'), +(@OGUID+33, 505, 0, 'Captain Kelisendra\'s Cargo 34 of 40'), +(@OGUID+34, 505, 0, 'Captain Kelisendra\'s Cargo 35 of 40'), +(@OGUID+35, 505, 0, 'Captain Kelisendra\'s Cargo 36 of 40'), +(@OGUID+36, 505, 0, 'Captain Kelisendra\'s Cargo 37 of 40'), +(@OGUID+37, 505, 0, 'Captain Kelisendra\'s Cargo 38 of 40'), +(@OGUID+38, 505, 0, 'Captain Kelisendra\'s Cargo 39 of 40'), +(@OGUID+39, 505, 0, 'Captain Kelisendra\'s Cargo 40 of 40'); From a4ddc22a9afafae9f60131d17784e6b8a3b47ac5 Mon Sep 17 00:00:00 2001 From: neifion-00000000 <91289495+neifion-00000000@users.noreply.github.com> Date: Fri, 7 Oct 2022 17:41:12 -0500 Subject: [PATCH 08/66] fix(DB/creature): Grimscale Murloc improvements in Eversong Woods (#13315) --- .../updates/pending_db_world/rev_1664929532434519400.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664929532434519400.sql diff --git a/data/sql/updates/pending_db_world/rev_1664929532434519400.sql b/data/sql/updates/pending_db_world/rev_1664929532434519400.sql new file mode 100644 index 000000000..561031b9e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664929532434519400.sql @@ -0,0 +1,7 @@ +-- +-- There are twice as many NPC Grimscale Forager (15670) as NPC Grimscale Seer (15950) and twice as many NPC Grimscale Murloc (15668) as NPC Grimscale Oracle (15669) +UPDATE `creature` SET `id1`=15670, `id2`=15670, `id3`=15950 WHERE `id1` IN (15670, 15950); +UPDATE `creature` SET `id1`=15668, `id2`=15668, `id3`=15669 WHERE `id1` IN (15668, 15669); + +-- NPC Mmmrrrggglll (15937)'s spawn timer is just over 2 mins +UPDATE `creature` SET `spawntimesecs`=130 WHERE `guid`=41792; From 9cb978fab1b9c9a6040800abbed3e803a6e049e9 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 7 Oct 2022 22:43:18 +0000 Subject: [PATCH 09/66] chore(DB): import pending files Referenced commit(s): a4ddc22a9afafae9f60131d17784e6b8a3b47ac5 --- .../rev_1664929532434519400.sql => db_world/2022_10_07_05.sql} | 1 + .../rev_1664935330890249100.sql => db_world/2022_10_07_06.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1664929532434519400.sql => db_world/2022_10_07_05.sql} (91%) rename data/sql/updates/{pending_db_world/rev_1664935330890249100.sql => db_world/2022_10_07_06.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1664929532434519400.sql b/data/sql/updates/db_world/2022_10_07_05.sql similarity index 91% rename from data/sql/updates/pending_db_world/rev_1664929532434519400.sql rename to data/sql/updates/db_world/2022_10_07_05.sql index 561031b9e..7a6786847 100644 --- a/data/sql/updates/pending_db_world/rev_1664929532434519400.sql +++ b/data/sql/updates/db_world/2022_10_07_05.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_04 -> 2022_10_07_05 -- -- There are twice as many NPC Grimscale Forager (15670) as NPC Grimscale Seer (15950) and twice as many NPC Grimscale Murloc (15668) as NPC Grimscale Oracle (15669) UPDATE `creature` SET `id1`=15670, `id2`=15670, `id3`=15950 WHERE `id1` IN (15670, 15950); diff --git a/data/sql/updates/pending_db_world/rev_1664935330890249100.sql b/data/sql/updates/db_world/2022_10_07_06.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1664935330890249100.sql rename to data/sql/updates/db_world/2022_10_07_06.sql index 1735aff68..21adc7189 100644 --- a/data/sql/updates/pending_db_world/rev_1664935330890249100.sql +++ b/data/sql/updates/db_world/2022_10_07_06.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_05 -> 2022_10_07_06 -- -- Not every GAMEOBJECT Captain Kelisendra's Cargo (180917) will be spawned at the same time and object bunching is possible (1 pool). 6 can be up at time (confirmed twice) and thier respawn seem very fast. From 811ef478f89a70dfb0a640f16629ef88c7378c4f Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 8 Oct 2022 13:24:40 -0300 Subject: [PATCH 10/66] =?UTF-8?q?fix(Scripts/TempleOfAhnQiraj):=20Despawn?= =?UTF-8?q?=20Eye=20of=20Cthun=20once=20encounter=20is=E2=80=A6=20(#13336)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...done --- .../scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 21e6faab3..6ae7c72bf 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -314,6 +314,7 @@ struct boss_eye_of_cthun : public BossAI } DoCastSelf(SPELL_DARK_GLARE); + ++DarkGlareTick; if (tasker.GetRepeatCounter() >= 35) @@ -534,6 +535,11 @@ struct boss_cthun : public BossAI { pPortal->DespawnOrUnsummon(); } + + if (Creature* eye = instance->GetCreature(DATA_EYE_OF_CTHUN)) + { + eye->DespawnOrUnsummon(); + } } void SummonedCreatureDies(Creature* creature, Unit* /*killer*/) override @@ -560,7 +566,7 @@ struct boss_cthun : public BossAI ScheduleTasks(); //Remove purple coloration me->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION); - + DoCastSelf(SPELL_CARAPACE_CTHUN, true); //Spawn flesh tentacle for (uint8 i = 0; i < 2; i++) { From 49ee806584f28f6d437f42239e317bedb2ab44b5 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sat, 8 Oct 2022 18:28:30 +0200 Subject: [PATCH 11/66] fix(Scripts/MoltenCore): Added loot recipient to Cache of the Firelord. (#13209) --- .../BlackrockMountain/MoltenCore/instance_molten_core.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp index e5896a335..6465de471 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp @@ -250,7 +250,11 @@ public: if (bossId == DATA_MAJORDOMO_EXECUTUS && state == DONE) { - DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY); + if (GameObject* cache = instance->GetGameObject(_cacheOfTheFirelordGUID)) + { + cache->SetRespawnTime(7 * DAY); + cache->SetLootRecipient(instance); + } } else if (bossId == DATA_GOLEMAGG) { From 14b1efefd975afd51610ef301c1ab3d67d643cd3 Mon Sep 17 00:00:00 2001 From: Grimgravy Date: Sat, 8 Oct 2022 13:28:50 -0300 Subject: [PATCH 12/66] fix(DB/Quest): Morganth (#13206) --- data/sql/updates/pending_db_world/rev_1664717737363595400.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664717737363595400.sql diff --git a/data/sql/updates/pending_db_world/rev_1664717737363595400.sql b/data/sql/updates/pending_db_world/rev_1664717737363595400.sql new file mode 100644 index 000000000..c1cadfaf6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664717737363595400.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `creature_queststarter` WHERE (`quest` = 249); +INSERT INTO `creature_queststarter` (`id`, `quest`) VALUES +(313, 249); From 02b3f74d6dad398c24153388671fac002862be33 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 8 Oct 2022 16:30:58 +0000 Subject: [PATCH 13/66] chore(DB): import pending files Referenced commit(s): 14b1efefd975afd51610ef301c1ab3d67d643cd3 --- .../rev_1664717737363595400.sql => db_world/2022_10_08_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1664717737363595400.sql => db_world/2022_10_08_00.sql} (75%) diff --git a/data/sql/updates/pending_db_world/rev_1664717737363595400.sql b/data/sql/updates/db_world/2022_10_08_00.sql similarity index 75% rename from data/sql/updates/pending_db_world/rev_1664717737363595400.sql rename to data/sql/updates/db_world/2022_10_08_00.sql index c1cadfaf6..40fe86017 100644 --- a/data/sql/updates/pending_db_world/rev_1664717737363595400.sql +++ b/data/sql/updates/db_world/2022_10_08_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_07_06 -> 2022_10_08_00 -- DELETE FROM `creature_queststarter` WHERE (`quest` = 249); INSERT INTO `creature_queststarter` (`id`, `quest`) VALUES From e390087efd6b04a3583012df03781e57fef8a128 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sat, 8 Oct 2022 19:34:52 +0200 Subject: [PATCH 14/66] =?UTF-8?q?feat(Core/Items):=20Implemented=20element?= =?UTF-8?q?al=20weapon=20damage.=20Source:=20Trinit=E2=80=A6=20(#13050)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...yCore. --- .../game/Entities/Creature/Creature.cpp | 4 +- src/server/game/Entities/Creature/Creature.h | 6 +- src/server/game/Entities/Player/Player.cpp | 99 ++- src/server/game/Entities/Player/Player.h | 4 +- src/server/game/Entities/Unit/StatSystem.cpp | 51 +- src/server/game/Entities/Unit/Unit.cpp | 750 +++++++++++++----- src/server/game/Entities/Unit/Unit.h | 60 +- src/server/game/Spells/Spell.cpp | 10 +- src/server/game/Spells/Spell.h | 2 + src/server/game/Spells/SpellEffects.cpp | 28 +- .../TempleOfAhnQiraj/boss_viscidus.cpp | 32 +- src/server/scripts/Spells/spell_dk.cpp | 9 +- src/server/scripts/Spells/spell_warrior.cpp | 10 +- 13 files changed, 778 insertions(+), 287 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 4fbf74345..de275c56c 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2156,7 +2156,7 @@ void Creature::LoadSpellTemplateImmunity() } } -bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) +bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell) { if (!spellInfo) return false; @@ -2178,7 +2178,7 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) if (immunedToAllEffects) return true; - return Unit::IsImmunedToSpell(spellInfo); + return Unit::IsImmunedToSpell(spellInfo, spell); } bool Creature::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 0dbc3fb04..d56dd88e4 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -96,7 +96,7 @@ public: [[nodiscard]] bool IsValidTrainerForPlayer(Player* player, uint32* npcFlags = nullptr) const; bool CanCreatureAttack(Unit const* victim, bool skipDistCheck = false) const; void LoadSpellTemplateImmunity(); - bool IsImmunedToSpell(SpellInfo const* spellInfo) override; + bool IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell = nullptr) override; [[nodiscard]] bool HasMechanicTemplateImmunity(uint32 mask) const; // redefine Unit::IsImmunedToSpell @@ -155,7 +155,7 @@ public: return (getLevel() / 2 + uint32(GetStat(STAT_STRENGTH) / 20)); } - [[nodiscard]] SpellSchoolMask GetMeleeDamageSchoolMask() const override { return m_meleeDamageSchoolMask; } + [[nodiscard]] SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType /*attackType*/ = BASE_ATTACK, uint8 /*damageIndex*/ = 0) const override { return m_meleeDamageSchoolMask; } void SetMeleeDamageSchool(SpellSchools school) { m_meleeDamageSchoolMask = SpellSchoolMask(1 << school); } void _AddCreatureSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 end_time); @@ -178,7 +178,7 @@ public: void UpdateMaxHealth() override; void UpdateMaxPower(Powers power) override; void UpdateAttackPowerAndDamage(bool ranged = false) override; - void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) override; + void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex) override; void SetCanDualWield(bool value) override; [[nodiscard]] int8 GetOriginalEquipmentId() const { return m_originalEquipmentId; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 79d8565cd..118d83669 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6740,21 +6740,11 @@ void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply if (proto->ArcaneRes) HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply); - WeaponAttackType attType = BASE_ATTACK; - - if (slot == EQUIPMENT_SLOT_RANGED && ( - proto->InventoryType == INVTYPE_RANGED || proto->InventoryType == INVTYPE_THROWN || - proto->InventoryType == INVTYPE_RANGEDRIGHT)) + uint8 attType = Player::GetAttackBySlot(slot); + if (attType != MAX_ATTACK) { - attType = RANGED_ATTACK; - } - else if (slot == EQUIPMENT_SLOT_OFFHAND) - { - attType = OFF_ATTACK; - } - - if (CanUseAttackType(attType)) _ApplyWeaponDamage(slot, proto, ssv, apply); + } // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue) if (getClass() == CLASS_DRUID) @@ -6797,45 +6787,56 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr; } - WeaponAttackType attType = BASE_ATTACK; - float damage = 0.0f; - - if (slot == EQUIPMENT_SLOT_RANGED && ( - proto->InventoryType == INVTYPE_RANGED || proto->InventoryType == INVTYPE_THROWN || - proto->InventoryType == INVTYPE_RANGEDRIGHT)) + uint8 attType = Player::GetAttackBySlot(slot); + if (!IsInFeralForm() && apply && !CanUseAttackType(attType)) { - attType = RANGED_ATTACK; - } - else if (slot == EQUIPMENT_SLOT_OFFHAND) - { - attType = OFF_ATTACK; + return; } - float minDamage = proto->Damage[0].DamageMin; - float maxDamage = proto->Damage[0].DamageMax; - - // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage - if (ssv) + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - int32 extraDPS = ssv->getDPSMod(ScalingStatValue); - if (extraDPS) + float minDamage = proto->Damage[i].DamageMin; + float maxDamage = proto->Damage[i].DamageMax; + + // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage + if (ssv) { - float average = extraDPS * proto->Delay / 1000.0f; - minDamage = 0.7f * average; - maxDamage = 1.3f * average; + int32 extraDPS = ssv->getDPSMod(ScalingStatValue); + if (extraDPS) + { + float average = extraDPS * proto->Delay / 1000.0f; + minDamage = 0.7f * average; + maxDamage = 1.3f * average; + } + } + + if (apply) + { + if (minDamage > 0.f) + { + SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, minDamage, i); + } + + if (maxDamage > 0.f) + { + SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, maxDamage, i); + } } } - if (minDamage > 0) + if (!apply) { - damage = apply ? minDamage : BASE_MINDAMAGE; - SetBaseWeaponDamage(attType, MINDAMAGE, damage); - } + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + SetBaseWeaponDamage(WeaponAttackType(attType), MINDAMAGE, 0.f, i); + SetBaseWeaponDamage(WeaponAttackType(attType), MAXDAMAGE, 0.f, i); + } - if (maxDamage > 0) - { - damage = apply ? maxDamage : BASE_MAXDAMAGE; - SetBaseWeaponDamage(attType, MAXDAMAGE, damage); + if (attType == BASE_ATTACK) + { + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, BASE_MINDAMAGE); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, BASE_MAXDAMAGE); + } } if (proto->Delay && !IsInFeralForm()) @@ -6852,8 +6853,18 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt if (IsInFeralForm()) return; - if (CanModifyStats() && (damage || proto->Delay)) - UpdateDamagePhysical(attType); + if (CanModifyStats() && (GetWeaponDamageRange(WeaponAttackType(attType), MAXDAMAGE) || proto->Delay)) + UpdateDamagePhysical(WeaponAttackType(attType)); +} + +SpellSchoolMask Player::GetMeleeDamageSchoolMask(WeaponAttackType attackType /*= BASE_ATTACK*/, uint8 damageIndex /*= 0*/) const +{ + if (Item const* weapon = GetWeaponForAttack(attackType, true)) + { + return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType); + } + + return SPELL_SCHOOL_MASK_NORMAL; } void Player::_ApplyWeaponDependentAuraMods(Item* item, WeaponAttackType attackType, bool apply) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 73a652459..6cb60dbec 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1905,7 +1905,7 @@ public: void UpdateRating(CombatRating cr); void UpdateAllRatings(); - void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) override; + void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex) override; void UpdateDefenseBonusesMod(); inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} @@ -2147,6 +2147,8 @@ public: void ResetAllPowers(); + SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType = BASE_ATTACK, uint8 damageIndex = 0) const override; + void _ApplyWeaponDependentAuraMods(Item* item, WeaponAttackType attackType, bool apply); void _ApplyWeaponDependentAuraCritMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply); void _ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index e0064bb88..30d24d1ff 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -59,25 +59,31 @@ void Unit::UpdateAllResistances() void Unit::UpdateDamagePhysical(WeaponAttackType attType) { - float minDamage = 0.0f; - float maxDamage = 0.0f; + float totalMin = 0.f; + float totalMax = 0.f; - CalculateMinMaxDamage(attType, false, true, minDamage, maxDamage); + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + float tmpMin, tmpMax; + CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i); + totalMin += tmpMin; + totalMax += tmpMax; + } switch (attType) { case BASE_ATTACK: default: - SetStatFloatValue(UNIT_FIELD_MINDAMAGE, minDamage); - SetStatFloatValue(UNIT_FIELD_MAXDAMAGE, maxDamage); + SetStatFloatValue(UNIT_FIELD_MINDAMAGE, totalMin); + SetStatFloatValue(UNIT_FIELD_MAXDAMAGE, totalMax); break; case OFF_ATTACK: - SetStatFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, minDamage); - SetStatFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, maxDamage); + SetStatFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, totalMin); + SetStatFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, totalMax); break; case RANGED_ATTACK: - SetStatFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, minDamage); - SetStatFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, maxDamage); + SetStatFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, totalMin); + SetStatFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, totalMax); break; } } @@ -525,8 +531,23 @@ void Player::UpdateShieldBlockValue() SetUInt32Value(PLAYER_SHIELD_BLOCK, GetShieldBlockValue()); } -void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) +void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex) { + // Only proto damage, not affected by any mods + if (damageIndex != 0) + { + minDamage = 0.0f; + maxDamage = 0.0f; + + if (!IsInFeralForm() && CanUseAttackType(attType)) + { + minDamage = GetWeaponDamageRange(attType, MINDAMAGE, damageIndex); + maxDamage = GetWeaponDamageRange(attType, MAXDAMAGE, damageIndex); + } + + return; + } + UnitMods unitMod; switch (attType) @@ -1075,8 +1096,16 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged) } } -void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) +void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex /*= 0*/) { + // creatures only have one damage + if (damageIndex != 0) + { + minDamage = 0.f; + maxDamage = 0.f; + return; + } + UnitMods unitMod; float variance = 1.0f; switch (attType) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 230e256a3..3809bf048 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -118,9 +118,19 @@ DamageInfo::DamageInfo(Unit* _attacker, Unit* _victim, uint32 _damage, SpellInfo m_block = 0; } -DamageInfo::DamageInfo(CalcDamageInfo& dmgInfo) - : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)), - m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType), m_absorb(dmgInfo.absorb), m_resist(dmgInfo.resist), m_block(dmgInfo.blocked_amount), +DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo) : DamageInfo(DamageInfo(dmgInfo, 0), DamageInfo(dmgInfo, 1)) +{ +} + +DamageInfo::DamageInfo(DamageInfo const& dmg1, DamageInfo const& dmg2) + : m_attacker(dmg1.m_attacker), m_victim(dmg1.m_victim), m_damage(dmg1.m_damage + dmg2.m_damage), m_spellInfo(dmg1.m_spellInfo), m_schoolMask(SpellSchoolMask(dmg1.m_schoolMask | dmg2.m_schoolMask)), + m_damageType(dmg1.m_damageType), m_attackType(dmg1.m_attackType), m_absorb(dmg1.m_absorb + dmg2.m_absorb), m_resist(dmg1.m_resist + dmg2.m_resist), m_block(dmg1.m_block) +{ +} + +DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo, uint8 damageIndex) + : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damages[damageIndex].damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damages[damageIndex].damageSchoolMask)), + m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType), m_absorb(dmgInfo.damages[damageIndex].absorb), m_resist(dmgInfo.damages[damageIndex].resist), m_block(dmgInfo.blocked_amount), m_cleanDamage(dmgInfo.cleanDamage) { } @@ -268,8 +278,11 @@ Unit::Unit(bool isWorldObject) : WorldObject(isWorldObject), for (uint8 i = 0; i < MAX_ATTACK; ++i) { - m_weaponDamage[i][MINDAMAGE] = BASE_MINDAMAGE; - m_weaponDamage[i][MAXDAMAGE] = BASE_MAXDAMAGE; + m_weaponDamage[i][MINDAMAGE][0] = BASE_MINDAMAGE; + m_weaponDamage[i][MAXDAMAGE][0] = BASE_MAXDAMAGE; + + m_weaponDamage[i][MINDAMAGE][1] = 0.f; + m_weaponDamage[i][MAXDAMAGE][1] = 0.f; } for (uint8 i = 0; i < MAX_STATS; ++i) @@ -1437,16 +1450,21 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss, } // TODO for melee need create structure as in -void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* damageInfo, WeaponAttackType attackType, const bool sittingVictim) +void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, WeaponAttackType attackType, const bool sittingVictim) { damageInfo->attacker = this; damageInfo->target = victim; - damageInfo->damageSchoolMask = GetMeleeDamageSchoolMask(); + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i); + damageInfo->damages[i].damage = 0; + damageInfo->damages[i].absorb = 0; + damageInfo->damages[i].resist = 0; + } + damageInfo->attackType = attackType; - damageInfo->damage = 0; damageInfo->cleanDamage = 0; - damageInfo->absorb = 0; - damageInfo->resist = 0; damageInfo->blocked_amount = 0; damageInfo->TargetState = 0; @@ -1478,32 +1496,72 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam return; } - // Physical Immune check - if (damageInfo->target->IsImmunedToDamageOrSchool(SpellSchoolMask(damageInfo->damageSchoolMask))) + // School Immune check + uint8 immunedMask = 0; + bool hasNonPhysicalSchoolMask = false; + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - damageInfo->HitInfo |= HITINFO_NORMALSWING; - damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE; - - damageInfo->procEx |= PROC_EX_IMMUNE; - return; + if (damageInfo->target->IsImmunedToDamageOrSchool(SpellSchoolMask(damageInfo->damages[i].damageSchoolMask))) + { + immunedMask |= (1 << i); + if (damageInfo->damages[i].damageSchoolMask != SPELL_SCHOOL_MASK_NORMAL) + { + hasNonPhysicalSchoolMask = true; + } + } } - damage += CalculateDamage(damageInfo->attackType, false, true); - // Add melee damage bonus - damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType); - damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType); - - // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations - sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage); - - // Calculate armor reduction - if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damageSchoolMask))) + // School Immune check + if (immunedMask & ((1 << 0) | (1 << 1))) { - damageInfo->damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType); - damageInfo->cleanDamage += damage - damageInfo->damage; + if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1))) + { + damageInfo->HitInfo |= HITINFO_NORMALSWING; + damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE; + + damageInfo->procEx |= PROC_EX_IMMUNE; + return; + } + } + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + // only players have secondary weapon damage + if (i > 0 && GetTypeId() != TYPEID_PLAYER) + { + break; + } + + if (immunedMask & (1 << i)) + { + continue; + } + + SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask); + bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL); + + uint32 damage = 0; + uint8 itemDamagesMask = (GetTypeId() == TYPEID_PLAYER) ? (1 << i) : 0; + + damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask); + // Add melee damage bonus + damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask); + damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask); + + // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations + sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage); + + // Calculate armor reduction + if (IsDamageReducedByArmor((SpellSchoolMask)(damageInfo->damages[i].damageSchoolMask))) + { + damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType); + damageInfo->cleanDamage += damage - damageInfo->damages[i].damage; + } + else + { + damageInfo->damages[i].damage = damage; + } } - else - damageInfo->damage = damage; damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType); @@ -1518,14 +1576,23 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damageInfo->HitInfo |= HITINFO_MISS | HITINFO_SWINGNOHITSOUND; damageInfo->TargetState = VICTIMSTATE_EVADES; damageInfo->procEx |= PROC_EX_EVADE; - damageInfo->damage = 0; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + damageInfo->damages[i].damage = 0; + } + damageInfo->cleanDamage = 0; return; case MELEE_HIT_MISS: damageInfo->HitInfo |= HITINFO_MISS; damageInfo->TargetState = VICTIMSTATE_INTACT; damageInfo->procEx |= PROC_EX_MISS; - damageInfo->damage = 0; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + damageInfo->damages[i].damage = 0; + } damageInfo->cleanDamage = 0; break; case MELEE_HIT_NORMAL: @@ -1539,77 +1606,123 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damageInfo->procEx |= PROC_EX_CRITICAL_HIT; // Crit bonus calc - damageInfo->damage += damageInfo->damage; - float mod = 0.0f; - // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE - if (damageInfo->attackType == RANGED_ATTACK) - mod += damageInfo->target->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE); - else + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - mod += damageInfo->target->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE); + damageInfo->damages[i].damage *= 2; - // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS - mod += (GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, damageInfo->damageSchoolMask) - 1.0f) * 100; + float mod = 0.0f; + // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE + if (damageInfo->attackType == RANGED_ATTACK) + { + mod += damageInfo->target->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE); + } + else + { + mod += damageInfo->target->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE); + + // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS + mod += (GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, damageInfo->damages[i].damageSchoolMask) - 1.0f) * 100; + } + + uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask(); + + // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS + mod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, crTypeMask); + if (mod != 0) + { + AddPct(damageInfo->damages[i].damage, mod); + } } - - uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask(); - - // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS - mod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, crTypeMask); - if (mod != 0) - AddPct(damageInfo->damage, mod); break; } case MELEE_HIT_PARRY: damageInfo->TargetState = VICTIMSTATE_PARRY; damageInfo->procEx |= PROC_EX_PARRY; - damageInfo->cleanDamage += damageInfo->damage; - damageInfo->damage = 0; + damageInfo->cleanDamage = 0; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + damageInfo->cleanDamage += damageInfo->damages[i].damage; + damageInfo->damages[i].damage = 0; + } break; case MELEE_HIT_DODGE: damageInfo->TargetState = VICTIMSTATE_DODGE; damageInfo->procEx |= PROC_EX_DODGE; - damageInfo->cleanDamage += damageInfo->damage; - damageInfo->damage = 0; + damageInfo->cleanDamage = 0; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + damageInfo->cleanDamage += damageInfo->damages[i].damage; + damageInfo->damages[i].damage = 0; + } break; case MELEE_HIT_BLOCK: + { damageInfo->TargetState = VICTIMSTATE_HIT; - damageInfo->HitInfo |= HITINFO_BLOCK; - damageInfo->procEx |= PROC_EX_BLOCK; + damageInfo->HitInfo |= HITINFO_BLOCK; + damageInfo->procEx |= PROC_EX_BLOCK; damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue(); // double blocked amount if block is critical if (damageInfo->target->isBlockCritical()) damageInfo->blocked_amount += damageInfo->blocked_amount; - if (damageInfo->blocked_amount >= damageInfo->damage) + + uint32 remainingBlock = damageInfo->blocked_amount; + uint8 fullBlockMask = 0; + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage) + { + fullBlockMask |= (1 << i); + + remainingBlock -= damageInfo->damages[i].damage; + damageInfo->cleanDamage += damageInfo->damages[i].damage; + damageInfo->damages[i].damage = 0; + } + else + { + damageInfo->cleanDamage += remainingBlock; + damageInfo->damages[i].damage -= remainingBlock; + remainingBlock = 0; + } + } + + // full block + if (fullBlockMask == ((1 << 0) | (1 << 1))) { damageInfo->TargetState = VICTIMSTATE_BLOCKS; - damageInfo->blocked_amount = damageInfo->damage; - damageInfo->procEx |= PROC_EX_FULL_BLOCK; + damageInfo->blocked_amount -= remainingBlock; } - else - damageInfo->procEx |= PROC_EX_NORMAL_HIT; - damageInfo->damage -= damageInfo->blocked_amount; - damageInfo->cleanDamage += damageInfo->blocked_amount; break; + } case MELEE_HIT_GLANCING: + { + damageInfo->HitInfo |= HITINFO_GLANCING; + damageInfo->TargetState = VICTIMSTATE_HIT; + damageInfo->procEx |= PROC_EX_NORMAL_HIT; + int32 leveldif = int32(victim->getLevel()) - int32(getLevel()); + if (leveldif > 3) + leveldif = 3; + float reducePercent = 1 - leveldif * 0.1f; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - damageInfo->HitInfo |= HITINFO_GLANCING; - damageInfo->TargetState = VICTIMSTATE_HIT; - damageInfo->procEx |= PROC_EX_NORMAL_HIT; - int32 leveldif = int32(victim->getLevel()) - int32(getLevel()); - if (leveldif > 3) - leveldif = 3; - float reducePercent = 1 - leveldif * 0.1f; - damageInfo->cleanDamage += damageInfo->damage - uint32(reducePercent * damageInfo->damage); - damageInfo->damage = uint32(reducePercent * damageInfo->damage); - break; + uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage); + damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage; + damageInfo->damages[i].damage = reducedDamage; } + break; + } case MELEE_HIT_CRUSHING: damageInfo->HitInfo |= HITINFO_CRUSHING; damageInfo->TargetState = VICTIMSTATE_HIT; damageInfo->procEx |= PROC_EX_NORMAL_HIT; + // 150% normal damage - damageInfo->damage += (damageInfo->damage / 2); + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2); + } break; default: break; @@ -1619,43 +1732,70 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam if (!(damageInfo->HitInfo & HITINFO_MISS)) damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM; - // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here - int32 dmg = damageInfo->damage; - int32 cleanDamage = damageInfo->cleanDamage; - if (CanApplyResilience()) + uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { }; + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - int32 resilienceReduction = dmg; - Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE); - - resilienceReduction = dmg - resilienceReduction; - dmg -= resilienceReduction; - cleanDamage += resilienceReduction; - } - - damageInfo->damage = std::max(0, dmg); - damageInfo->cleanDamage = std::max(0, cleanDamage); - - // Calculate absorb resist - if (damageInfo->damage > 0) - { - damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE; - // Calculate absorb & resists - - DamageInfo dmgInfo(*damageInfo); - Unit::CalcAbsorbResist(dmgInfo); - damageInfo->absorb = dmgInfo.GetAbsorb(); - damageInfo->resist = dmgInfo.GetResist(); - - if (damageInfo->absorb) + int32 dmg = damageInfo->damages[i].damage; + int32 cleanDamage = damageInfo->cleanDamage; + // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here + if (CanApplyResilience()) { - damageInfo->HitInfo |= (damageInfo->damage - damageInfo->absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB); - damageInfo->procEx |= PROC_EX_ABSORB; + int32 resilienceReduction = damageInfo->damages[i].damage; + Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE); + + resilienceReduction = damageInfo->damages[i].damage - resilienceReduction; + dmg -= resilienceReduction; + cleanDamage += resilienceReduction; } - if (damageInfo->resist) - damageInfo->HitInfo |= (damageInfo->damage - damageInfo->resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST); + damageInfo->damages[i].damage = std::max(0, dmg); + damageInfo->cleanDamage = std::max(0, cleanDamage); - damageInfo->damage = dmgInfo.GetDamage(); + // Calculate absorb resist + if (damageInfo->damages[i].damage > 0) + { + damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE; + + // Calculate absorb & resists + DamageInfo dmgInfo(*damageInfo, i); + Unit::CalcAbsorbResist(dmgInfo); + damageInfo->damages[i].absorb = dmgInfo.GetAbsorb(); + damageInfo->damages[i].resist = dmgInfo.GetResist(); + + if (damageInfo->damages[i].absorb) + { + tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB); + } + + if (damageInfo->damages[i].resist) + { + tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST); + } + + damageInfo->damages[i].damage = dmgInfo.GetDamage(); + } + } + + // set proper HitInfo flags + if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0) + { + // set partial absorb when secondary damage isn't full absorbed + damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB; + } + else + { + damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB); + } + + if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0) + { + // set partial resist when secondary damage isn't full resisted + damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST; + } + else + { + damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST); } } @@ -1663,8 +1803,15 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) { Unit* victim = damageInfo->target; - if (!victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())) + auto canTakeMeleeDamage = [&]() + { + return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (victim->GetTypeId() != TYPEID_UNIT || !victim->ToCreature()->IsEvadingAttacks()); + }; + + if (!canTakeMeleeDamage()) + { return; + } // Hmmmm dont like this emotes client must by self do all animations if (damageInfo->HitInfo & HITINFO_CRITICALHIT) @@ -1704,12 +1851,20 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) } } - // Call default DealDamage - CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, damageInfo->attackType, damageInfo->hitOutCome); - Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damageSchoolMask), nullptr, durabilityLoss); + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist)) + { + continue; + } + + // Call default DealDamage + CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome); + Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss); + } // If this is a creature and it attacks from behind it has a probability to daze it's victim - if (damageInfo->damage && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) && + if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) && GetTypeId() != TYPEID_PLAYER && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this) && (victim->GetTypeId() == TYPEID_PLAYER || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle())) { @@ -1738,7 +1893,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx); // Do effect if any damage done to target - if (damageInfo->damage) + if (damageInfo->damages[0].damage + damageInfo->damages[1].damage) { // We're going to call functions which can modify content of the list during iteration over it's elements // Let's copy the list so we can prevent iterator invalidation @@ -1826,7 +1981,6 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s uint32 Unit::CalcArmorReducedDamage(Unit const* attacker, Unit const* victim, const uint32 damage, SpellInfo const* spellInfo, uint8 attackerLevel, WeaponAttackType /*attackType*/) { - uint32 newdamage = 0; float armor = float(victim->GetArmor()); // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura @@ -1904,9 +2058,7 @@ uint32 Unit::CalcArmorReducedDamage(Unit const* attacker, Unit const* victim, co if (tmpvalue > 0.75f) tmpvalue = 0.75f; - newdamage = uint32(damage - (damage * tmpvalue)); - - return (newdamage > 1) ? newdamage : 1; + return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f))); } float Unit::GetEffectiveResistChance(Unit const* owner, SpellSchoolMask schoolMask, Unit const* victim) @@ -2414,10 +2566,14 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BASE_A // attack can be redirected to another target victim = GetMeleeHitRedirectTarget(victim); CalcDamageInfo damageInfo; - CalculateMeleeDamage(victim, 0, &damageInfo, attType, sittingVictim); + CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim); // Send log damage message to client - Unit::DealDamageMods(victim, damageInfo.damage, &damageInfo.absorb); + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb); + } + SendAttackStateUpdate(&damageInfo); //TriggerAurasProcOnEvent(damageInfo); @@ -2427,15 +2583,15 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BASE_A DealMeleeDamage(&damageInfo, true); DamageInfo dmgInfo(damageInfo); - Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, damageInfo.damage, + Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(), damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo); if (GetTypeId() == TYPEID_PLAYER) LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.", - GetGUID().ToString(), victim->GetGUID().ToString(), damageInfo.damage, damageInfo.absorb, damageInfo.blocked_amount, damageInfo.resist); + GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist()); else LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.", - GetGUID().ToString(), victim->GetGUID().ToString(), damageInfo.damage, damageInfo.absorb, damageInfo.blocked_amount, damageInfo.resist); + GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist()); // Let the pet know we've started attacking someting. Handles melee attacks only // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode @@ -2764,13 +2920,30 @@ MeleeHitOutcome Unit::RollMeleeOutcomeAgainst(Unit const* victim, WeaponAttackTy return MELEE_HIT_NORMAL; } -uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct) +uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask /*= 0*/) { float minDamage = 0.0f; float maxDamage = 0.0f; - if (normalized || !addTotalPct) - CalculateMinMaxDamage(attType, normalized, addTotalPct, minDamage, maxDamage); + if (normalized || !addTotalPct || itemDamagesMask) + { + // get both by default + if (!itemDamagesMask) + { + itemDamagesMask = (1 << 0) | (1 << 1); + } + + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + if (itemDamagesMask & (1 << i)) + { + float minTmp, maxTmp; + CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i); + minDamage += minTmp; + maxDamage += maxTmp; + } + } + } else { switch (attType) @@ -2790,14 +2963,15 @@ uint32 Unit::CalculateDamage(WeaponAttackType attType, bool normalized, bool add default: break; } - - // pussywizard: this check only in "else" section, proper check is also in CalculateMinMaxDamage - if (minDamage > maxDamage) - minDamage = maxDamage; } - if (maxDamage == 0.0f) - maxDamage = 5.0f; + minDamage = std::max(0.f, minDamage); + maxDamage = std::max(0.f, maxDamage); + + if (minDamage > maxDamage) + { + std::swap(minDamage, maxDamage); + } return urand(uint32(minDamage), uint32(maxDamage)); } @@ -3290,6 +3464,96 @@ SpellMissInfo Unit::SpellHitResult(Unit* victim, SpellInfo const* spell, bool Ca return SPELL_MISS_NONE; } +SpellMissInfo Unit::SpellHitResult(Unit* victim, Spell const* spell, bool CanReflect) +{ + SpellInfo const* spellInfo = spell->GetSpellInfo(); + + // Check for immune + if (victim->IsImmunedToSpell(spellInfo, spell)) + { + return SPELL_MISS_IMMUNE; + } + + // All positive spells can`t miss + // TODO: client not show miss log for this spells - so need find info for this in dbc and use it! + if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL)) + && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell + { + return SPELL_MISS_NONE; + } + + // Check for immune + // xinef: check for school immunity only + if (victim->IsImmunedToSchool(spell)) + { + return SPELL_MISS_IMMUNE; + } + + if (this == victim) + { + return SPELL_MISS_NONE; + } + + // Return evade for units in evade mode + if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && + !spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE)) + { + return SPELL_MISS_EVADE; + } + + // Try victim reflect spell + if (CanReflect) + { + int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS); + Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL); + for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i) + { + if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask()) + { + reflectchance += (*i)->GetAmount(); + } + } + + if (reflectchance > 0 && roll_chance_i(reflectchance)) + { + // Start triggers for remove charges if need (trigger only for victim, and mark as active spell) + //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell); + return SPELL_MISS_REFLECT; + } + } + + switch (spellInfo->DmgClass) + { + case SPELL_DAMAGE_CLASS_RANGED: + case SPELL_DAMAGE_CLASS_MELEE: + return MeleeSpellHitResult(victim, spellInfo); + case SPELL_DAMAGE_CLASS_NONE: + { + if (spellInfo->SpellFamilyName) + { + return SPELL_MISS_NONE; + } + + // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells + for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i) + { + if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE) + { + if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE) + { + return SPELL_MISS_NONE; + } + } + } + [[fallthrough]]; + } + case SPELL_DAMAGE_CLASS_MAGIC: + return MagicSpellHitResult(victim, spellInfo); + } + + return SPELL_MISS_NONE; +} + uint32 Unit::GetDefenseSkillValue(Unit const* target) const { if (GetTypeId() == TYPEID_PLAYER) @@ -6078,43 +6342,57 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) { LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE"); - //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop - uint32 damage = damageInfo->damage; - uint32 absorb = damageInfo->absorb; - if (damageInfo->target->GetTypeId() == TYPEID_PLAYER && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD)) + uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { }; + uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { }; + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) { - absorb = damage; - damage = 0; + //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop + tmpDamage[i] = damageInfo->damages[i].damage; + tmpAbsorb[i] = damageInfo->damages[i].absorb; + if (damageInfo->target->GetTypeId() == TYPEID_PLAYER && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD)) + { + tmpAbsorb[i] = tmpDamage[i]; + tmpDamage[i] = 0; + } } uint32 count = 1; - size_t maxsize = 4 + 5 + 5 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 * 12; - WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size + if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist) + { + ++count; + } + + size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12; + WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size data << uint32(damageInfo->HitInfo); data << damageInfo->attacker->GetPackGUID(); data << damageInfo->target->GetPackGUID(); - data << uint32(damage); // Full damage - int32 overkill = damage - damageInfo->target->GetHealth(); - data << uint32(overkill < 0 ? 0 : overkill); // Overkill - data << uint8(count); // Sub damage count + data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage + int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth(); + data << uint32(overkill < 0 ? 0 : overkill); // Overkill + data << uint8(count); // Sub damage count for (uint32 i = 0; i < count; ++i) { - data << uint32(damageInfo->damageSchoolMask); // School of sub damage - data << float(damage); // sub damage - data << uint32(damage); // Sub Damage + data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage + data << float(tmpDamage[i]); // sub damage + data << uint32(tmpDamage[i]); // Sub Damage } if (damageInfo->HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) { for (uint32 i = 0; i < count; ++i) - data << uint32(absorb); // Absorb + { + data << uint32(tmpAbsorb[i]); // Absorb + } } if (damageInfo->HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) { for (uint32 i = 0; i < count; ++i) - data << uint32(damageInfo->resist); // Resist + { + data << uint32(damageInfo->damages[i].resist); // Resist + } } data << uint8(damageInfo->TargetState); @@ -6153,10 +6431,17 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType dmgInfo.HitInfo = HitInfo; dmgInfo.attacker = this; dmgInfo.target = target; - dmgInfo.damage = Damage - AbsorbDamage - Resist - BlockedAmount; - dmgInfo.damageSchoolMask = damageSchoolMask; - dmgInfo.absorb = AbsorbDamage; - dmgInfo.resist = Resist; + + dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount; + dmgInfo.damages[0].damageSchoolMask = damageSchoolMask; + dmgInfo.damages[0].absorb = AbsorbDamage; + dmgInfo.damages[0].resist = Resist; + + dmgInfo.damages[1].damage = 0; + dmgInfo.damages[1].damageSchoolMask = 0; + dmgInfo.damages[1].absorb = 0; + dmgInfo.damages[1].resist = 0; + dmgInfo.TargetState = TargetState; dmgInfo.blocked_amount = BlockedAmount; SendAttackStateUpdate(&dmgInfo); @@ -12327,6 +12612,11 @@ int32 Unit::SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask) bool Unit::IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const { + if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + // If m_immuneToDamage type contain magic, IMMUNE damage. SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE]; for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr) @@ -12354,6 +12644,11 @@ bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) const } uint32 schoolMask = spellInfo->GetSchoolMask(); + if (schoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + // If m_immuneToDamage type contain magic, IMMUNE damage. SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE]; for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr) @@ -12363,8 +12658,50 @@ bool Unit::IsImmunedToDamage(SpellInfo const* spellInfo) const return false; } +bool Unit::IsImmunedToDamage(Spell const* spell) const +{ + SpellInfo const* spellInfo = spell->GetSpellInfo(); + if (!spellInfo) + { + return false; + } + + if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) + { + return false; + } + + if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES)) + { + return false; + } + + uint32 schoolMask = spell->GetSpellSchoolMask(); + if (schoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + + // If m_immuneToDamage type contain magic, IMMUNE damage. + SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE]; + for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr) + { + if ((itr->type & schoolMask) == schoolMask) + { + return true; + } + } + + return false; +} + bool Unit::IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const { + if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + // If m_immuneToSchool type contain this school type, IMMUNE damage. SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr) @@ -12380,6 +12717,11 @@ bool Unit::IsImmunedToSchool(SpellInfo const* spellInfo) const return false; uint32 schoolMask = spellInfo->GetSchoolMask(); + if (schoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471) { // If m_immuneToSchool type contain this school type, IMMUNE damage. @@ -12392,8 +12734,43 @@ bool Unit::IsImmunedToSchool(SpellInfo const* spellInfo) const return false; } +bool Unit::IsImmunedToSchool(Spell const* spell) const +{ + SpellInfo const* spellInfo = spell->GetSpellInfo(); + if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) + { + return false; + } + + uint32 schoolMask = spell->GetSpellSchoolMask(); + if (schoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + + if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471) + { + // If m_immuneToSchool type contain this school type, IMMUNE damage. + SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; + for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr) + { + if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId))) + { + return true; + } + } + } + + return false; +} + bool Unit::IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const { + if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE) + { + return false; + } + return IsImmunedToDamage(meleeSchoolMask) || IsImmunedToSchool(meleeSchoolMask); } @@ -12402,7 +12779,7 @@ bool Unit::IsImmunedToDamageOrSchool(SpellInfo const* spellInfo) const return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo); } -bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) +bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell) { if (!spellInfo) return false; @@ -12467,14 +12844,25 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471) { - SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; - for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr) + SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask(); + if (spell) { - SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId); - if (((itr->type & spellInfo->GetSchoolMask()) == spellInfo->GetSchoolMask()) + spellSchoolMask = spell->GetSpellSchoolMask(); + } + + if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE) + { + SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; + for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr) + { + SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId); + if (((itr->type & spellSchoolMask) == spellSchoolMask) && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive() && !spellInfo->CanPierceImmuneAura(immuneSpellInfo)) - return true; + { + return true; + } + } } } @@ -12549,7 +12937,7 @@ bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) cons return false; } -uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto) +uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto, SpellSchoolMask damageSchoolMask /*= SPELL_SCHOOL_MASK_NORMAL*/) { if (!victim || pdamage == 0) return 0; @@ -12560,7 +12948,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType if (GetEntry() == 27893) { if (Unit* owner = GetOwner()) - return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto) / 2; + return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2; } } @@ -12618,26 +13006,25 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType // Done total percent damage auras float DoneTotalMod = 1.0f; - // Some spells don't benefit from pct done mods - if (spellProto) + // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation + if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)) { + // Some spells don't benefit from pct done mods AuraEffectList const& mModDamagePercentDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i) { - if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, false)) - continue; - - if (!sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)) - continue; - - if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()) && !((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)) + if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) && + sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto))) { - if ((*i)->GetSpellInfo()->EquippedItemClass == -1) - AddPct(DoneTotalMod, (*i)->GetAmount()); - else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) - AddPct(DoneTotalMod, (*i)->GetAmount()); - else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) - AddPct(DoneTotalMod, (*i)->GetAmount()); + if (((*i)->GetMiscValue() & damageSchoolMask)) + { + if ((*i)->GetSpellInfo()->EquippedItemClass == -1) + AddPct(DoneTotalMod, (*i)->GetAmount()); + else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0)) + AddPct(DoneTotalMod, (*i)->GetAmount()); + else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo())) + AddPct(DoneTotalMod, (*i)->GetAmount()); + } } } } @@ -12752,7 +13139,7 @@ uint32 Unit::MeleeDamageBonusDone(Unit* victim, uint32 pdamage, WeaponAttackType return uint32(std::max(tmpDamage, 0.0f)); } -uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto) +uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto/*= nullptr*/, SpellSchoolMask damageSchoolMask /*= SPELL_SCHOOL_MASK_NORMAL*/) { if (pdamage == 0) return 0; @@ -12762,7 +13149,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT // ..taken AuraEffectList const& mDamageTaken = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_TAKEN); for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i) - if ((*i)->GetMiscValue() & (spellProto ? spellProto->GetSchoolMask() : attacker->GetMeleeDamageSchoolMask())) + if ((*i)->GetMiscValue() & damageSchoolMask) TakenFlatBenefit += (*i)->GetAmount(); if (attType != RANGED_ATTACK) @@ -12773,7 +13160,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT // Taken total percent damage auras float TakenTotalMod = 1.0f; - TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, spellProto ? spellProto->GetSchoolMask() : attacker->GetMeleeDamageSchoolMask()); + TakenTotalMod *= GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, damageSchoolMask); // .. taken pct (special attacks) if (spellProto) @@ -12839,7 +13226,7 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT bool addModifier = false; AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j) - if ((*j)->GetMiscValue() & (spellProto ? spellProto->GetSchoolMask() : SPELL_SCHOOL_MASK_NORMAL)) + if ((*j)->GetMiscValue() & damageSchoolMask) { ApplyPct(ignoreModifier, (*j)->GetAmount()); addModifier = true; @@ -14881,12 +15268,12 @@ float Unit::GetTotalAttackPowerValue(WeaponAttackType attType, Unit* victim) con } } -float Unit::GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type) const +float Unit::GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex /*= 0*/) const { if (attType == OFF_ATTACK && !haveOffhandWeapon()) return 0.0f; - return m_weaponDamage[attType][type]; + return m_weaponDamage[attType][type][damageIndex]; } void Unit::SetLevel(uint8 lvl, bool showLevelChange) @@ -16253,11 +16640,6 @@ void Unit::TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, std::list(this)->ToPlayer()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 383b45247..4ad050e63 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -23,6 +23,7 @@ #include "FollowerRefMgr.h" #include "FollowerReference.h" #include "HostileRefMgr.h" +#include "ItemTemplate.h" #include "MotionMaster.h" #include "Object.h" #include "Optional.h" @@ -251,7 +252,9 @@ enum UnitModifierType enum WeaponDamageRange { MINDAMAGE, - MAXDAMAGE + MAXDAMAGE, + + MAX_WEAPON_DAMAGE_RANGE }; enum UnitMods @@ -762,9 +765,14 @@ private: uint32 m_resist; uint32 m_block; uint32 m_cleanDamage; + + // amalgamation constructor (used for proc) + DamageInfo(DamageInfo const& dmg1, DamageInfo const& dmg2); + public: explicit DamageInfo(Unit* _attacker, Unit* _victim, uint32 _damage, SpellInfo const* _spellInfo, SpellSchoolMask _schoolMask, DamageEffectType _damageType, uint32 cleanDamage = 0); - explicit DamageInfo(CalcDamageInfo& dmgInfo); + explicit DamageInfo(CalcDamageInfo const& dmgInfo); // amalgamation wrapper + DamageInfo(CalcDamageInfo const& dmgInfo, uint8 damageIndex); DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEffectType damageType); void ModifyDamage(int32 amount); @@ -868,10 +876,15 @@ struct CalcDamageInfo { Unit* attacker; // Attacker Unit* target; // Target for damage - uint32 damageSchoolMask; - uint32 damage; - uint32 absorb; - uint32 resist; + + struct + { + uint32 damageSchoolMask; + uint32 damage; + uint32 absorb; + uint32 resist; + } damages[MAX_ITEM_PROTO_DAMAGES]; + uint32 blocked_amount; uint32 HitInfo; uint32 TargetState; @@ -1331,7 +1344,7 @@ public: bool IsWithinCombatRange(Unit const* obj, float dist2compare) const; bool IsWithinMeleeRange(Unit const* obj, float dist = 0.f) const; float GetMeleeRange(Unit const* target) const; - [[nodiscard]] virtual SpellSchoolMask GetMeleeDamageSchoolMask() const; + virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType = BASE_ATTACK, uint8 damageIndex = 0) const = 0; bool GetRandomContactPoint(Unit const* target, float& x, float& y, float& z, bool force = false) const; uint32 m_extraAttacks; bool m_canDualWield; @@ -1540,7 +1553,7 @@ public: void HandleEmoteCommand(uint32 emoteId); void AttackerStateUpdate (Unit* victim, WeaponAttackType attType = BASE_ATTACK, bool extra = false, bool ignoreCasting = false); - void CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* damageInfo, WeaponAttackType attackType = BASE_ATTACK, const bool sittingVictim = false); + void CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, WeaponAttackType attackType = BASE_ATTACK, const bool sittingVictim = false); void DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss); void HandleProcExtraAttackFor(Unit* victim, uint32 count); @@ -1570,10 +1583,11 @@ public: static void ApplyResilience(Unit const* victim, float* crit, int32* damage, bool isCrit, CombatRating type); - float MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const; - SpellMissInfo MeleeSpellHitResult(Unit* victim, SpellInfo const* spell); - SpellMissInfo MagicSpellHitResult(Unit* victim, SpellInfo const* spell); - SpellMissInfo SpellHitResult(Unit* victim, SpellInfo const* spell, bool canReflect = false); + [[nodiscard]] float MeleeSpellMissChance(Unit const* victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const; + [[nodiscard]] SpellMissInfo MeleeSpellHitResult(Unit* victim, SpellInfo const* spell); + [[nodiscard]] SpellMissInfo MagicSpellHitResult(Unit* victim, SpellInfo const* spell); + [[nodiscard]] SpellMissInfo SpellHitResult(Unit* victim, SpellInfo const* spell, bool canReflect = false); + [[nodiscard]] SpellMissInfo SpellHitResult(Unit* victim, Spell const* spell, bool canReflect = false); [[nodiscard]] float GetUnitDodgeChance() const; [[nodiscard]] float GetUnitParryChance() const; @@ -2091,10 +2105,10 @@ public: virtual void UpdateAttackPowerAndDamage(bool ranged = false) = 0; virtual void UpdateDamagePhysical(WeaponAttackType attType); float GetTotalAttackPowerValue(WeaponAttackType attType, Unit* pVictim = nullptr) const; - [[nodiscard]] float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type) const; - void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value) { m_weaponDamage[attType][damageRange] = value; } - virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) = 0; - uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct); + [[nodiscard]] float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex = 0) const; + void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex = 0) { m_weaponDamage[attType][damageRange][damageIndex] = value; } + virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex = 0) = 0; + uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask = 0); float GetAPMultiplier(WeaponAttackType attType, bool normalized); bool isInFrontInMap(Unit const* target, float distance, float arc = M_PI) const; @@ -2179,8 +2193,8 @@ public: 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); - uint32 MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto = nullptr); + uint32 MeleeDamageBonusDone(Unit* pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const* spellProto = nullptr, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL); + uint32 MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const* spellProto = nullptr, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL); bool isSpellBlocked(Unit* victim, SpellInfo const* spellProto, WeaponAttackType attackType = BASE_ATTACK); bool isBlockCritical(); @@ -2201,12 +2215,14 @@ public: void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType = SPELL_BLOCK_TYPE_ALL); void ApplySpellDispelImmunity(SpellInfo const* spellProto, DispelType type, bool apply); - virtual bool IsImmunedToSpell(SpellInfo const* spellInfo); + virtual bool IsImmunedToSpell(SpellInfo const* spellInfo, Spell const* spell = nullptr); // redefined in Creature [[nodiscard]] bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const; - bool IsImmunedToDamage(SpellInfo const* spellInfo) const; + [[nodiscard]] bool IsImmunedToDamage(SpellInfo const* spellInfo) const; + [[nodiscard]] bool IsImmunedToDamage(Spell const* spell) const; [[nodiscard]] bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const; - bool IsImmunedToSchool(SpellInfo const* spellInfo) const; + [[nodiscard]] bool IsImmunedToSchool(SpellInfo const* spellInfo) const; + [[nodiscard]] bool IsImmunedToSchool(Spell const* spell) const; [[nodiscard]] bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const; bool IsImmunedToDamageOrSchool(SpellInfo const* spellInfo) const; virtual bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const; @@ -2484,7 +2500,7 @@ protected: uint32 m_interruptMask; float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]; - float m_weaponDamage[MAX_ATTACK][2]; + float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]; bool m_canModifyStats; VisibleAuraMap m_visibleAuras; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 813ef0dbe..4f8089aed 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2428,9 +2428,11 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= // Calculate hit result if (m_originalCaster) { - targetInfo.missCondition = m_originalCaster->SpellHitResult(target, m_spellInfo, m_canReflect); + targetInfo.missCondition = m_originalCaster->SpellHitResult(target, this, m_canReflect); if (m_skipCheck && targetInfo.missCondition != SPELL_MISS_IMMUNE) + { targetInfo.missCondition = SPELL_MISS_NONE; + } } else targetInfo.missCondition = SPELL_MISS_EVADE; //SPELL_MISS_NONE; @@ -2458,7 +2460,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*= if (targetInfo.missCondition == SPELL_MISS_REFLECT) { // Calculate reflected spell result on caster - targetInfo.reflectResult = m_caster->SpellHitResult(m_caster, m_spellInfo, m_canReflect); + targetInfo.reflectResult = m_caster->SpellHitResult(m_caster, this, m_canReflect); if (targetInfo.reflectResult == SPELL_MISS_REFLECT) // Impossible reflect again, so simply deflect spell targetInfo.reflectResult = SPELL_MISS_PARRY; @@ -2971,8 +2973,10 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA return SPELL_MISS_EVADE; // For delayed spells immunity may be applied between missile launch and hit - check immunity for that case - if (m_spellInfo->Speed && ((m_damage > 0 && unit->IsImmunedToDamage(m_spellInfo)) || unit->IsImmunedToSchool(m_spellInfo) || unit->IsImmunedToSpell(m_spellInfo))) + if (m_spellInfo->Speed && ((m_damage > 0 && unit->IsImmunedToDamage(this)) || unit->IsImmunedToSchool(this) || unit->IsImmunedToSpell(m_spellInfo, this))) + { return SPELL_MISS_IMMUNE; + } // disable effects to which unit is immune SpellMissInfo returnVal = SPELL_MISS_IMMUNE; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index f6e3e646f..f28361b88 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -589,6 +589,8 @@ public: [[nodiscard]] TriggerCastFlags GetTriggeredCastFlags() const { return _triggeredCastFlags; } + [[nodiscard]] SpellSchoolMask GetSpellSchoolMask() const { return m_spellSchoolMask; } + protected: bool HasGlobalCooldown() const; void TriggerGlobalCooldown(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 87dbb64a6..cf4868eef 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -593,8 +593,14 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (Player* caster = m_caster->ToPlayer()) { // Add Ammo and Weapon damage plus RAP * 0.1 - float dmg_min = caster->GetWeaponDamageRange(RANGED_ATTACK, MINDAMAGE); - float dmg_max = caster->GetWeaponDamageRange(RANGED_ATTACK, MAXDAMAGE); + float dmg_min = 0.f; + float dmg_max = 0.f; + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + dmg_min += caster->GetWeaponDamageRange(RANGED_ATTACK, MINDAMAGE, i); + dmg_max += caster->GetWeaponDamageRange(RANGED_ATTACK, MAXDAMAGE, i); + } + if (dmg_max == 0.0f && dmg_min > dmg_max) { damage += int32(dmg_min); @@ -616,9 +622,17 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) // Add main hand dps * effect[2] amount if (Player* player = m_caster->ToPlayer()) { - float mindamage, maxdamage; - player->CalculateMinMaxDamage(BASE_ATTACK, false, false, mindamage, maxdamage); - float average = (mindamage + maxdamage) / 2; + float minTotal = 0.f; + float maxTotal = 0.f; + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + float tmpMin, tmpMax; + player->CalculateMinMaxDamage(BASE_ATTACK, false, false, tmpMin, tmpMax, i); + minTotal += tmpMin; + maxTotal += tmpMax; + } + + float average = (minTotal + maxTotal) / 2; int32 count = m_caster->CalculateSpellDamage(unitTarget, m_spellInfo, EFFECT_2); damage += count * int32(average * IN_MILLISECONDS) / m_caster->GetAttackTime(BASE_ATTACK); } @@ -3644,8 +3658,8 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) uint32 eff_damage(std::max(weaponDamage, 0)); // Add melee damage bonuses (also check for negative) - eff_damage = m_caster->MeleeDamageBonusDone(unitTarget, eff_damage, m_attackType, m_spellInfo); - eff_damage = unitTarget->MeleeDamageBonusTaken(m_caster, eff_damage, m_attackType, m_spellInfo); + eff_damage = m_caster->MeleeDamageBonusDone(unitTarget, eff_damage, m_attackType, m_spellInfo, m_spellSchoolMask); + eff_damage = unitTarget->MeleeDamageBonusTaken(m_caster, eff_damage, m_attackType, m_spellInfo, m_spellSchoolMask); // Meteor like spells (divided damage to targets) if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_SHARE_DAMAGE)) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index 857b41192..cadc329c4 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" @@ -131,13 +132,25 @@ struct boss_viscidus : public BossAI me->RemoveAurasDueToSpell(SPELL_INVIS_SELF); } - void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType effType, SpellSchoolMask) override + void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType effType, SpellSchoolMask spellSchoolMask) override { if (me->HealthBelowPct(5)) damage = 0; - if (!attacker || _phase != PHASE_MELEE) + if (!attacker) + { return; + } + + if (_phase != PHASE_MELEE) + { + if (_phase == PHASE_FROST && effType == DIRECT_DAMAGE && (spellSchoolMask & SPELL_SCHOOL_MASK_FROST) != 0) + { + ++_hitcounter; + } + + return; + } if (effType == DIRECT_DAMAGE) ++_hitcounter; @@ -183,14 +196,23 @@ struct boss_viscidus : public BossAI Talk(EMOTE_CRACK); } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + void SpellHit(Unit* caster, SpellInfo const* spellInfo) override { - if (spell->Id == SPELL_REJOIN_VISCIDUS) + if (spellInfo->Id == SPELL_REJOIN_VISCIDUS) { me->RemoveAuraFromStack(SPELL_VISCIDUS_SHRINKS); } - if ((spell->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && _phase == PHASE_FROST) + SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask(); + if (spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON && spellInfo->EquippedItemSubClassMask & (1 << ITEM_SUBCLASS_WEAPON_WAND)) + { + if (Item* pItem = caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK)) + { + spellSchoolMask = SpellSchoolMask(1 << pItem->GetTemplate()->Damage[0].DamageType); + } + } + + if ((spellSchoolMask & SPELL_SCHOOL_MASK_FROST) && _phase == PHASE_FROST) { ++_hitcounter; diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 88ed7bec2..69bb30523 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -648,10 +648,13 @@ class spell_dk_dancing_rune_weapon : public AuraScript { target = player->GetMeleeHitRedirectTarget(target); CalcDamageInfo damageInfo; - player->CalculateMeleeDamage(target, 0, &damageInfo, eventInfo.GetDamageInfo()->GetAttackType()); - Unit::DealDamageMods(target, damageInfo.damage, &damageInfo.absorb); + player->CalculateMeleeDamage(target, &damageInfo, eventInfo.GetDamageInfo()->GetAttackType()); + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + Unit::DealDamageMods(target, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb); + damageInfo.damages[i].damage /= 2.0f; + } damageInfo.attacker = dancingRuneWeapon; - damageInfo.damage /= 2.0f; dancingRuneWeapon->SendAttackStateUpdate(&damageInfo); dancingRuneWeapon->DealMeleeDamage(&damageInfo, true); } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 77108ca9a..35aec6db2 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -567,8 +567,14 @@ class spell_warr_rend : public AuraScript // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); int32 mws = caster->GetAttackTime(BASE_ATTACK); - float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); - float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); + float mwbMin = 0.f; + float mwbMax = 0.f; + for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i) + { + mwbMin += caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE, i); + mwbMax += caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE, i); + } + float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f; amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb)); From f5c7883d4142f0b52bbff934036083a429c44adb Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 8 Oct 2022 21:51:59 -0300 Subject: [PATCH 15/66] fix(Scripts/TempleOfAhnQiraj): Correct Dark Glare's radius (#13350) --- .../rev_1665274040139039300.sql | 4 +++ .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 26 +++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1665274040139039300.sql diff --git a/data/sql/updates/pending_db_world/rev_1665274040139039300.sql b/data/sql/updates/pending_db_world/rev_1665274040139039300.sql new file mode 100644 index 000000000..eab898bd5 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665274040139039300.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_cthun_dark_glare'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(26029, 'spell_cthun_dark_glare'); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 6ae7c72bf..0a5bba9e7 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -25,6 +25,7 @@ EndScriptData */ #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" #include "TaskScheduler.h" #include "temple_of_ahnqiraj.h" @@ -273,6 +274,9 @@ struct boss_eye_of_cthun : public BossAI me->InterruptNonMeleeSpells(false); me->SetTarget(ObjectGuid::Empty); + //Freeze animation + DoCast(me, SPELL_FREEZE_ANIM, true); + _scheduler.Schedule(1s, [this](TaskContext /*task*/) { //Select random target for dark beam to start on @@ -283,14 +287,9 @@ struct boss_eye_of_cthun : public BossAI DarkGlareTick = 0; ClockWise = RAND(true, false); - me->SetTarget(target->GetGUID()); - //Add red coloration to C'thun DoCast(me, SPELL_RED_COLORATION, true); - //Freeze animation - DoCast(me, SPELL_FREEZE_ANIM, true); - me->StopMoving(); me->SetFacingToObject(target); me->SetOrientation(DarkGlareAngle); @@ -927,6 +926,22 @@ private: ObjectGuid _portalGUID; }; +class spell_cthun_dark_glare : public SpellScript +{ + PrepareSpellScript(spell_cthun_dark_glare); + + void FilterTargets(std::list& targets) + { + Unit* caster = GetCaster(); + targets.remove_if([caster](WorldObject const* target) { return !caster->HasInLine(target, 5.0f); }); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_cthun_dark_glare::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ENEMY_24); + } +}; + // 4033 - At C'thun's stomach class at_cthun_stomach_exit : public AreaTriggerScript { @@ -997,6 +1012,7 @@ void AddSC_boss_cthun() RegisterTempleOfAhnQirajCreatureAI(npc_claw_tentacle); RegisterTempleOfAhnQirajCreatureAI(npc_giant_claw_tentacle); RegisterTempleOfAhnQirajCreatureAI(npc_giant_eye_tentacle); + RegisterSpellScript(spell_cthun_dark_glare); new at_cthun_stomach_exit(); new at_cthun_center(); } From 667e584041c79c514591776bd34c5cc6e4d7755d Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 9 Oct 2022 00:54:17 +0000 Subject: [PATCH 16/66] chore(DB): import pending files Referenced commit(s): f5c7883d4142f0b52bbff934036083a429c44adb --- .../rev_1665274040139039300.sql => db_world/2022_10_09_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1665274040139039300.sql => db_world/2022_10_09_00.sql} (80%) diff --git a/data/sql/updates/pending_db_world/rev_1665274040139039300.sql b/data/sql/updates/db_world/2022_10_09_00.sql similarity index 80% rename from data/sql/updates/pending_db_world/rev_1665274040139039300.sql rename to data/sql/updates/db_world/2022_10_09_00.sql index eab898bd5..12e6dfd79 100644 --- a/data/sql/updates/pending_db_world/rev_1665274040139039300.sql +++ b/data/sql/updates/db_world/2022_10_09_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_08_00 -> 2022_10_09_00 -- DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_cthun_dark_glare'; INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From 092710ff191d428e8fb1c4eccf0730eca7f37cca Mon Sep 17 00:00:00 2001 From: Kargatum Date: Sun, 9 Oct 2022 15:59:31 +0300 Subject: [PATCH 17/66] chore(Gitignore): add ignore all folders `cmake-build-*` for Clion (#13353) --- .gitignore | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8d0d4fcfb..a6cbe335a 100644 --- a/.gitignore +++ b/.gitignore @@ -66,9 +66,7 @@ nbproject/ *.kate-swp .browse.VC* .idea -cmake-build-debug/* -cmake-build-debug-coverage/* -cmake-build-debug-event-trace/* +cmake-build-*/* coverage-report/ # From 8a334e821099af7415fa58c65503273d31726093 Mon Sep 17 00:00:00 2001 From: Kargatum Date: Sun, 9 Oct 2022 22:46:48 +0300 Subject: [PATCH 18/66] feat(Core/DB): add support range loop for mysql result (#13355) --- .../apps/authserver/Server/AuthSession.cpp | 9 ++++--- src/server/database/Database/QueryResult.h | 27 +++++++++++++++++++ src/server/shared/Realms/RealmList.cpp | 12 ++++----- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/server/apps/authserver/Server/AuthSession.cpp b/src/server/apps/authserver/Server/AuthSession.cpp index ca411fa29..b2ae2cab3 100644 --- a/src/server/apps/authserver/Server/AuthSession.cpp +++ b/src/server/apps/authserver/Server/AuthSession.cpp @@ -195,13 +195,14 @@ void AuthSession::CheckIpCallback(PreparedQueryResult result) { bool banned = false; - do + for (auto const& fields : *result) { - Field* fields = result->Fetch(); if (fields[0].Get() != 0) + { banned = true; - - } while (result->NextRow()); + break; + } + } if (banned) { diff --git a/src/server/database/Database/QueryResult.h b/src/server/database/Database/QueryResult.h index b64966e0e..f0cf4e9b5 100644 --- a/src/server/database/Database/QueryResult.h +++ b/src/server/database/Database/QueryResult.h @@ -24,6 +24,27 @@ #include #include +template +struct ResultIterator +{ + using iterator_category = std::forward_iterator_tag; + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = T*; + using reference = T&; + + explicit ResultIterator(pointer ptr) : _ptr(ptr) { } + + reference operator*() const { return *_ptr; } + pointer operator->() { return _ptr; } + ResultIterator& operator++() { if (!_ptr->NextRow()) _ptr = nullptr; return *this; } + + bool operator!=(const ResultIterator& right) { return _ptr != right._ptr; } + +private: + pointer _ptr; +}; + class AC_DATABASE_API ResultSet { public: @@ -54,6 +75,9 @@ public: return theTuple; } + auto begin() { return ResultIterator(this); } + static auto end() { return ResultIterator(nullptr); } + protected: std::vector _fieldMetadata; uint64 _rowCount; @@ -100,6 +124,9 @@ public: return theTuple; } + auto begin() { return ResultIterator(this); } + static auto end() { return ResultIterator(nullptr); } + protected: std::vector m_fieldMetadata; std::vector m_rows; diff --git a/src/server/shared/Realms/RealmList.cpp b/src/server/shared/Realms/RealmList.cpp index 8a07b710b..9b991d864 100644 --- a/src/server/shared/Realms/RealmList.cpp +++ b/src/server/shared/Realms/RealmList.cpp @@ -53,11 +53,10 @@ void RealmList::Close() void RealmList::LoadBuildInfo() { // 0 1 2 3 4 5 6 - if (QueryResult result = LoginDatabase.Query("SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build, winChecksumSeed, macChecksumSeed FROM build_info ORDER BY build ASC")) + if (auto result = LoginDatabase.Query("SELECT majorVersion, minorVersion, bugfixVersion, hotfixVersion, build, winChecksumSeed, macChecksumSeed FROM build_info ORDER BY build ASC")) { - do + for (auto const& fields : *result) { - Field* fields = result->Fetch(); RealmBuildInfo& build = _builds.emplace_back(); build.MajorVersion = fields[0].Get(); build.MinorVersion = fields[1].Get(); @@ -87,7 +86,7 @@ void RealmList::LoadBuildInfo() { HexStrToByteArray(macHash, build.MacHash); } - } while (result->NextRow()); + } } } @@ -149,11 +148,10 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) // Circle through results and add them to the realm map if (result) { - do + for (auto const& fields : *result) { try { - Field* fields = result->Fetch(); uint32 realmId = fields[0].Get(); std::string name = fields[1].Get(); std::string externalAddressString = fields[2].Get(); @@ -221,7 +219,7 @@ void RealmList::UpdateRealms(boost::system::error_code const& error) LOG_ERROR("server.authserver", "Realmlist::UpdateRealms has thrown an exception: {}", ex.what()); ABORT(); } - } while (result->NextRow()); + } } for (auto itr = existingRealms.begin(); itr != existingRealms.end(); ++itr) From 7d6bcf1b507d9434004cf8bb963ce4ba6fc4d6c8 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:38:54 -0300 Subject: [PATCH 19/66] fix(Scripts/TempleofAhnQiraj): Obsidian Eradicator Shock Blast now consume mana (#13356) --- .../scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp index c971e331e..d694e96c9 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp @@ -273,7 +273,7 @@ struct npc_obsidian_eradicator : public ScriptedAI if (me->GetPowerPct(POWER_MANA) >= 100.f) { - DoCastAOE(SPELL_SHOCK_BLAST, true); + DoCastAOE(SPELL_SHOCK_BLAST); } context.Repeat(3500ms); From 349bc72f6072ed6fb7c2827b07f34328cc1f5afc Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:40:32 -0300 Subject: [PATCH 20/66] fix(DB/creature_addon): Add Frenzy Aura to Vekniss Soldier (#13346) --- data/sql/updates/pending_db_world/rev_1665246218923522400.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665246218923522400.sql diff --git a/data/sql/updates/pending_db_world/rev_1665246218923522400.sql b/data/sql/updates/pending_db_world/rev_1665246218923522400.sql new file mode 100644 index 000000000..dd164c293 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665246218923522400.sql @@ -0,0 +1,3 @@ +-- +UPDATE `creature_template_addon` SET `auras` = '25801' WHERE (`entry` = 15229); +UPDATE `creature_addon` SET `auras` = '25801' WHERE `guid` BETWEEN 87901 AND 87906; From a11417d3bdc833faf1ae6e033457c7a763fbe988 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:41:03 -0300 Subject: [PATCH 21/66] fix(DB/loot): Remove AQ20 Idols from AQ40 mobs (#13359) --- data/sql/updates/pending_db_world/rev_1665328169532042800.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665328169532042800.sql diff --git a/data/sql/updates/pending_db_world/rev_1665328169532042800.sql b/data/sql/updates/pending_db_world/rev_1665328169532042800.sql new file mode 100644 index 000000000..6521916fa --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665328169532042800.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `creature_loot_template` WHERE `entry` IN (15229, 15230, 15233, 15235, 15236, 15240, 15246, 15247, 15249, 15250, 15252, 15262, 15264, 15277, 15311, 15312) AND `Item` BETWEEN 20866 AND 20873; From 436d7afdaf84a328da62f5b3285866c7f510d5ae Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:42:59 -0300 Subject: [PATCH 22/66] fix(Scripts/TempleOfAnhQiraj): Fix Digestive Acid not stacking (#13361) --- .../rev_1665344142978704300.sql | 4 +++ .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665344142978704300.sql diff --git a/data/sql/updates/pending_db_world/rev_1665344142978704300.sql b/data/sql/updates/pending_db_world/rev_1665344142978704300.sql new file mode 100644 index 000000000..f2bdd7924 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665344142978704300.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_cthun_digestive_acid'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(26476, 'spell_cthun_digestive_acid'); diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index 0a5bba9e7..b0e57f64d 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -219,6 +219,16 @@ struct boss_eye_of_cthun : public BossAI } } + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + + if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + { + cthun->AI()->JustSummoned(summon); + } + } + void ScheduleTasks() { _scheduler. @@ -942,6 +952,27 @@ class spell_cthun_dark_glare : public SpellScript } }; +class spell_cthun_digestive_acid : public AuraScript +{ + PrepareAuraScript(spell_cthun_digestive_acid); + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript()) + { + if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + { + cthun->CastSpell(GetUnitOwner(), SPELL_DIGESTIVE_ACID, true); + } + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_cthun_digestive_acid::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +}; + // 4033 - At C'thun's stomach class at_cthun_stomach_exit : public AreaTriggerScript { @@ -1013,6 +1044,7 @@ void AddSC_boss_cthun() RegisterTempleOfAhnQirajCreatureAI(npc_giant_claw_tentacle); RegisterTempleOfAhnQirajCreatureAI(npc_giant_eye_tentacle); RegisterSpellScript(spell_cthun_dark_glare); + RegisterSpellScript(spell_cthun_digestive_acid); new at_cthun_stomach_exit(); new at_cthun_center(); } From 4e3207db7f7185094c467c67d5e653349745fbf1 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:43:44 -0300 Subject: [PATCH 23/66] fix(Scripts/TempleOfAhnQiraj): Allow Anubisath Sentinels to all pull together (#13362) --- .../Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp index 6d1e21635..f7a9ae516 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp @@ -179,7 +179,7 @@ public: void AddSentinelsNear(Unit* /*nears*/) { std::list assistList; - me->GetCreatureListWithEntryInGrid(assistList, 15264, 70.0f); + me->GetCreatureListWithEntryInGrid(assistList, 15264, 100.0f); if (assistList.empty()) return; From e5d4a835a542e68e3c2dd933e8b6e6358c555d95 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 11 Oct 2022 17:45:51 +0000 Subject: [PATCH 24/66] chore(DB): import pending files Referenced commit(s): 4e3207db7f7185094c467c67d5e653349745fbf1 --- .../rev_1665246218923522400.sql => db_world/2022_10_11_00.sql} | 1 + .../rev_1665328169532042800.sql => db_world/2022_10_11_01.sql} | 1 + .../rev_1665344142978704300.sql => db_world/2022_10_11_02.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/rev_1665246218923522400.sql => db_world/2022_10_11_00.sql} (79%) rename data/sql/updates/{pending_db_world/rev_1665328169532042800.sql => db_world/2022_10_11_01.sql} (82%) rename data/sql/updates/{pending_db_world/rev_1665344142978704300.sql => db_world/2022_10_11_02.sql} (81%) diff --git a/data/sql/updates/pending_db_world/rev_1665246218923522400.sql b/data/sql/updates/db_world/2022_10_11_00.sql similarity index 79% rename from data/sql/updates/pending_db_world/rev_1665246218923522400.sql rename to data/sql/updates/db_world/2022_10_11_00.sql index dd164c293..ec094bc8f 100644 --- a/data/sql/updates/pending_db_world/rev_1665246218923522400.sql +++ b/data/sql/updates/db_world/2022_10_11_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_09_00 -> 2022_10_11_00 -- UPDATE `creature_template_addon` SET `auras` = '25801' WHERE (`entry` = 15229); UPDATE `creature_addon` SET `auras` = '25801' WHERE `guid` BETWEEN 87901 AND 87906; diff --git a/data/sql/updates/pending_db_world/rev_1665328169532042800.sql b/data/sql/updates/db_world/2022_10_11_01.sql similarity index 82% rename from data/sql/updates/pending_db_world/rev_1665328169532042800.sql rename to data/sql/updates/db_world/2022_10_11_01.sql index 6521916fa..a3fd52e89 100644 --- a/data/sql/updates/pending_db_world/rev_1665328169532042800.sql +++ b/data/sql/updates/db_world/2022_10_11_01.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_11_00 -> 2022_10_11_01 -- DELETE FROM `creature_loot_template` WHERE `entry` IN (15229, 15230, 15233, 15235, 15236, 15240, 15246, 15247, 15249, 15250, 15252, 15262, 15264, 15277, 15311, 15312) AND `Item` BETWEEN 20866 AND 20873; diff --git a/data/sql/updates/pending_db_world/rev_1665344142978704300.sql b/data/sql/updates/db_world/2022_10_11_02.sql similarity index 81% rename from data/sql/updates/pending_db_world/rev_1665344142978704300.sql rename to data/sql/updates/db_world/2022_10_11_02.sql index f2bdd7924..91cdd13c3 100644 --- a/data/sql/updates/pending_db_world/rev_1665344142978704300.sql +++ b/data/sql/updates/db_world/2022_10_11_02.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_11_01 -> 2022_10_11_02 -- DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_cthun_digestive_acid'; INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From 4e69f8e199bb957dc6edc515ad7b322923816b29 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:47:46 -0300 Subject: [PATCH 25/66] fix(DB/Creature): Set STATE_MELEE to Twin Emperors (#13366) --- data/sql/updates/pending_db_world/rev_1665354750522312300.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665354750522312300.sql diff --git a/data/sql/updates/pending_db_world/rev_1665354750522312300.sql b/data/sql/updates/pending_db_world/rev_1665354750522312300.sql new file mode 100644 index 000000000..ee3993d68 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665354750522312300.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE `entry` IN (15275, 15276); From 9983c5a685a3d9f4cb881ea27745fde21484111b Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Tue, 11 Oct 2022 14:48:46 -0300 Subject: [PATCH 26/66] =?UTF-8?q?fix(Scripts/TempleOfAhnQiraj):=20Don't=20?= =?UTF-8?q?submerge=20Ouro=20if=20it's=20already=20en=E2=80=A6=20(#13363)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...raged --- src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index a19ea1eae..126f76c4b 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -129,6 +129,9 @@ struct boss_ouro : public BossAI void Submerge() { + if (_enraged) + return; + me->AttackStop(); me->SetReactState(REACT_PASSIVE); me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); From d60842a13edaee2fc29cca971c1332ffd52f8227 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 14:49:41 -0300 Subject: [PATCH 27/66] fix(DB/pool): Pool Spawn of Hakkar to avoid double spawns (#13344) --- .../updates/pending_db_world/rev_1665240765400094500.sql | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665240765400094500.sql diff --git a/data/sql/updates/pending_db_world/rev_1665240765400094500.sql b/data/sql/updates/pending_db_world/rev_1665240765400094500.sql new file mode 100644 index 000000000..51a1bfab9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665240765400094500.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `pool_creature` WHERE `pool_entry`=1004 AND `guid` IN (33621, 34520); +INSERT INTO `pool_creature` (`guid`, `pool_entry`, `description`) VALUES +(33621, 1004, 'Spawn of Hakkar (5708) - Spawn 1'), +(34520, 1004, 'Spawn of Hakkar (5708) - Spawn 2'); + +DELETE FROM `pool_template` WHERE `entry`=1004; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(1004, 1, 'Spawn of Hakkar (5708)'); From 2955757be2201305781552135804c7ca0bc0e0d4 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 11 Oct 2022 17:51:45 +0000 Subject: [PATCH 28/66] chore(DB): import pending files Referenced commit(s): d60842a13edaee2fc29cca971c1332ffd52f8227 --- .../rev_1665240765400094500.sql => db_world/2022_10_11_03.sql} | 1 + .../rev_1665354750522312300.sql => db_world/2022_10_11_04.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1665240765400094500.sql => db_world/2022_10_11_03.sql} (90%) rename data/sql/updates/{pending_db_world/rev_1665354750522312300.sql => db_world/2022_10_11_04.sql} (66%) diff --git a/data/sql/updates/pending_db_world/rev_1665240765400094500.sql b/data/sql/updates/db_world/2022_10_11_03.sql similarity index 90% rename from data/sql/updates/pending_db_world/rev_1665240765400094500.sql rename to data/sql/updates/db_world/2022_10_11_03.sql index 51a1bfab9..d385ad096 100644 --- a/data/sql/updates/pending_db_world/rev_1665240765400094500.sql +++ b/data/sql/updates/db_world/2022_10_11_03.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_11_02 -> 2022_10_11_03 -- DELETE FROM `pool_creature` WHERE `pool_entry`=1004 AND `guid` IN (33621, 34520); INSERT INTO `pool_creature` (`guid`, `pool_entry`, `description`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1665354750522312300.sql b/data/sql/updates/db_world/2022_10_11_04.sql similarity index 66% rename from data/sql/updates/pending_db_world/rev_1665354750522312300.sql rename to data/sql/updates/db_world/2022_10_11_04.sql index ee3993d68..d75d231a4 100644 --- a/data/sql/updates/pending_db_world/rev_1665354750522312300.sql +++ b/data/sql/updates/db_world/2022_10_11_04.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_11_03 -> 2022_10_11_04 -- UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE `entry` IN (15275, 15276); From 4523ba6b9b5f735fe49e237421250e0bd21a4316 Mon Sep 17 00:00:00 2001 From: temperrr Date: Tue, 11 Oct 2022 19:59:51 +0200 Subject: [PATCH 29/66] fix(DB/Creature): Springpaw pelt should drop less (#13383) --- data/sql/updates/pending_db_world/springpawpelt.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/springpawpelt.sql diff --git a/data/sql/updates/pending_db_world/springpawpelt.sql b/data/sql/updates/pending_db_world/springpawpelt.sql new file mode 100644 index 000000000..d6da35243 --- /dev/null +++ b/data/sql/updates/pending_db_world/springpawpelt.sql @@ -0,0 +1,2 @@ +-- Springpaw Stalker 213/445 Elder Springpaw 112/238 drop rate of Springpaw Pelt (~47.5% 325/683) +UPDATE `creature_loot_template` SET `Chance`='45' WHERE `Item`=20772; From 904c469a8b14f3f3ba067853738267b69fd7b3e5 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 11 Oct 2022 18:02:07 +0000 Subject: [PATCH 30/66] chore(DB): import pending files Referenced commit(s): 4523ba6b9b5f735fe49e237421250e0bd21a4316 --- .../springpawpelt.sql => db_world/2022_10_11_05.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/springpawpelt.sql => db_world/2022_10_11_05.sql} (79%) diff --git a/data/sql/updates/pending_db_world/springpawpelt.sql b/data/sql/updates/db_world/2022_10_11_05.sql similarity index 79% rename from data/sql/updates/pending_db_world/springpawpelt.sql rename to data/sql/updates/db_world/2022_10_11_05.sql index d6da35243..2877accb3 100644 --- a/data/sql/updates/pending_db_world/springpawpelt.sql +++ b/data/sql/updates/db_world/2022_10_11_05.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_11_04 -> 2022_10_11_05 -- Springpaw Stalker 213/445 Elder Springpaw 112/238 drop rate of Springpaw Pelt (~47.5% 325/683) UPDATE `creature_loot_template` SET `Chance`='45' WHERE `Item`=20772; From 8021623cfb4240380264dfafaf34f887560619f4 Mon Sep 17 00:00:00 2001 From: neifion-00000000 <91289495+neifion-00000000@users.noreply.github.com> Date: Tue, 11 Oct 2022 13:09:28 -0500 Subject: [PATCH 31/66] fix(DB/creature_loot): Corrects all incorrect quest rates in Ammen Vale (#13167) --- .../updates/pending_db_world/rev_1664322385002360300.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664322385002360300.sql diff --git a/data/sql/updates/pending_db_world/rev_1664322385002360300.sql b/data/sql/updates/pending_db_world/rev_1664322385002360300.sql new file mode 100644 index 000000000..0b79089e4 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664322385002360300.sql @@ -0,0 +1,8 @@ +-- +-- Replenishing the Healing Crystals (9280 Draenei Version) (DROP QUEST) +-- Vial of Moth Blood (item 22889): 50/50 +UPDATE `creature_loot_template` SET `Chance`=100 WHERE `Entry`=16517 AND `Item`=22934 AND `Reference`=0 AND `GroupId`=0; + +-- What Must Be Done... (9293) (DROP QUEST) (DONE) +-- Lasher Sample (item 16517): 50/50 +UPDATE `creature_loot_template` SET `Chance`=100 WHERE `Entry`=16520 AND `Item`=22889 AND `Reference`=0 AND `GroupId`=0; From 077fbaeed10e7273bb80eb7b0e3627fc3489dff8 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Tue, 11 Oct 2022 12:10:52 -0600 Subject: [PATCH 32/66] fix(DB/Creature): Add Horizon crew (#13165) --- .../updates/pending_db_world/rev_1664317277371782800.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664317277371782800.sql diff --git a/data/sql/updates/pending_db_world/rev_1664317277371782800.sql b/data/sql/updates/pending_db_world/rev_1664317277371782800.sql new file mode 100644 index 000000000..0467b8ff9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664317277371782800.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `creature` WHERE `guid` BETWEEN 160359 AND 160363; +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`) VALUES +(160359, 8387, 0, 0, 1, 1747.24, -5859.6, -90.3817, 3.98543, 300, 0, 0), +(160360, 8388, 0, 0, 1, 1747.62, -5862.27, -90.9249, 3.17332, 300, 0, 0), +(160361, 8389, 0, 0, 1, 1748.87, -5863.46, -90.2665, 2.83088, 300, 0, 0), +(160362, 8394, 0, 0, 1, 1746.45, -5861.29, -91.4165, 3.20841, 300, 0, 0), +(160363, 8478, 0, 0, 1, 1916.44, -5733.37, 10.1936, 4.10397, 300, 0, 0); From 97fa4d931c525e3d287d179923249e5dc2e3caaf Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 11 Oct 2022 18:13:06 +0000 Subject: [PATCH 33/66] chore(DB): import pending files Referenced commit(s): 077fbaeed10e7273bb80eb7b0e3627fc3489dff8 --- .../rev_1664317277371782800.sql => db_world/2022_10_11_06.sql} | 1 + .../rev_1664322385002360300.sql => db_world/2022_10_11_07.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1664317277371782800.sql => db_world/2022_10_11_06.sql} (93%) rename data/sql/updates/{pending_db_world/rev_1664322385002360300.sql => db_world/2022_10_11_07.sql} (91%) diff --git a/data/sql/updates/pending_db_world/rev_1664317277371782800.sql b/data/sql/updates/db_world/2022_10_11_06.sql similarity index 93% rename from data/sql/updates/pending_db_world/rev_1664317277371782800.sql rename to data/sql/updates/db_world/2022_10_11_06.sql index 0467b8ff9..6b554a338 100644 --- a/data/sql/updates/pending_db_world/rev_1664317277371782800.sql +++ b/data/sql/updates/db_world/2022_10_11_06.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_11_05 -> 2022_10_11_06 -- DELETE FROM `creature` WHERE `guid` BETWEEN 160359 AND 160363; INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1664322385002360300.sql b/data/sql/updates/db_world/2022_10_11_07.sql similarity index 91% rename from data/sql/updates/pending_db_world/rev_1664322385002360300.sql rename to data/sql/updates/db_world/2022_10_11_07.sql index 0b79089e4..4f4c7d9b3 100644 --- a/data/sql/updates/pending_db_world/rev_1664322385002360300.sql +++ b/data/sql/updates/db_world/2022_10_11_07.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_11_06 -> 2022_10_11_07 -- -- Replenishing the Healing Crystals (9280 Draenei Version) (DROP QUEST) -- Vial of Moth Blood (item 22889): 50/50 From 171d5d4b11131b791951ffa6876bcfc129646329 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 11 Oct 2022 15:20:42 -0300 Subject: [PATCH 34/66] fix(DB/creature_addon): Add missing auras to creature_addon (#13352) --- .../rev_1665277966394437000.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665277966394437000.sql diff --git a/data/sql/updates/pending_db_world/rev_1665277966394437000.sql b/data/sql/updates/pending_db_world/rev_1665277966394437000.sql new file mode 100644 index 000000000..7ac0e1e92 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665277966394437000.sql @@ -0,0 +1,20 @@ +-- +UPDATE `creature_addon` SET `auras`='18950' WHERE `guid` IN (79927, 79929, 79930, 79931, 79932, 79948, 53290, 53299, 53594, 53601, 53650, 53674, 53675, 53676, 46483, 46484, 46485, 46486, 46487, 46488, 46490, 46491, 46492, 46493, 46494, 46495, 46496, 46497, 46498, 46499, 46500, 78725, 78726, 78727, 78728, 78729, 126935, 126938); +UPDATE `creature_addon` SET `auras`='14111' WHERE `guid` IN (23967); +UPDATE `creature_addon` SET `auras`='11838' WHERE `guid` IN (49766, 49763, 49762, 49202, 49201, 49767, 49195); +UPDATE `creature_addon` SET `auras`='53668' WHERE `guid` IN (127907, 127908, 127909, 127910, 127911, 127912, 127913, 127914, 127915, 127916, 127917, 127918, 127919, 127920, 127921, 127922, 127923, 127924, 127925, 127926, 127927, 127928, 127929, 127930, 127963, 127964, 127965, 127966, 127967, 127968, 127969, 127970, 127971, 127972, 127973, 127974, 127975, 127976, 127977, 127978); +UPDATE `creature_addon` SET `auras`='28362' WHERE `guid` IN (97718, 97724, 97736, 97747, 128136); +UPDATE `creature_addon` SET `auras`='12550' WHERE `guid` IN (81845, 60642, 60649, 60650, 60652, 60654, 60655, 60656); +UPDATE `creature_addon` SET `auras`='29152' WHERE `guid` IN (75958, 75959, 75960, 75961); +UPDATE `creature_addon` SET `auras`='39936' WHERE `guid` IN (12481); +UPDATE `creature_addon` SET `auras`='32566 46967' WHERE `guid` IN (117136, 117140); +UPDATE `creature_addon` SET `auras`='47015' WHERE `guid` IN (101131, 101132, 101135, 101138, 101142, 101157, 101171, 133248, 133249); +UPDATE `creature_addon` SET `auras`='16345' WHERE `guid` IN (127403, 127404); +UPDATE `creature_addon` SET `auras`='17327' WHERE `guid` IN (86438, 86437); +UPDATE `creature_addon` SET `auras`='48154' WHERE `guid` IN (102075, 102082, 102083, 102084, 102085, 102086, 102087, 102088, 102089, 102090, 102091, 102092, 102093, 102094, 102097, 105717); +UPDATE `creature_addon` SET `auras`='48602' WHERE `guid` IN (110538); +UPDATE `creature_addon` SET `auras`='54608' WHERE `guid` IN (83027, 88732); +UPDATE `creature_addon` SET `auras`='52530' WHERE `guid` IN (126954); +UPDATE `creature_addon` SET `auras`='4368' WHERE `guid` IN (112957, 113436, 113438); +UPDATE `creature_addon` SET `auras`='63007' WHERE `guid` IN (136604, 136606, 136608); +UPDATE `creature_addon` SET `auras`='64644' WHERE `guid` IN (136272, 136273, 136282); From 4cf0906a91647e11111c4b38c996a865c2fd9761 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 11 Oct 2022 18:23:02 +0000 Subject: [PATCH 35/66] chore(DB): import pending files Referenced commit(s): 171d5d4b11131b791951ffa6876bcfc129646329 --- .../rev_1665277966394437000.sql => db_world/2022_10_11_08.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1665277966394437000.sql => db_world/2022_10_11_08.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1665277966394437000.sql b/data/sql/updates/db_world/2022_10_11_08.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1665277966394437000.sql rename to data/sql/updates/db_world/2022_10_11_08.sql index 7ac0e1e92..0ae463d4a 100644 --- a/data/sql/updates/pending_db_world/rev_1665277966394437000.sql +++ b/data/sql/updates/db_world/2022_10_11_08.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_11_07 -> 2022_10_11_08 -- UPDATE `creature_addon` SET `auras`='18950' WHERE `guid` IN (79927, 79929, 79930, 79931, 79932, 79948, 53290, 53299, 53594, 53601, 53650, 53674, 53675, 53676, 46483, 46484, 46485, 46486, 46487, 46488, 46490, 46491, 46492, 46493, 46494, 46495, 46496, 46497, 46498, 46499, 46500, 78725, 78726, 78727, 78728, 78729, 126935, 126938); UPDATE `creature_addon` SET `auras`='14111' WHERE `guid` IN (23967); From 0cb13b124234e9e6fb587f3db34013854a7f48de Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:03:39 -0300 Subject: [PATCH 36/66] =?UTF-8?q?fix(Scripts/TempleOfAhnQiraj):=20Fix=20Tw?= =?UTF-8?q?in=20Emperor's=20critters=20aggroing=20p=E2=80=A6=20(#13365)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …layers randomly --- .../TempleOfAhnQiraj/temple_of_ahnqiraj.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp index d694e96c9..7e1dbf5cd 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp @@ -445,6 +445,19 @@ struct npc_ahnqiraji_critter : public ScriptedAI me->RestoreFaction(); _scheduler.CancelAll(); + + // Don't attack nearby players randomly if they are the Twin's pet bugs. + if (CreatureData const* crData = me->GetCreatureData()) + { + ObjectGuid dbtableHighGuid = ObjectGuid::Create(crData->id1, me->GetSpawnId()); + ObjectGuid targetGuid = sObjectMgr->GetLinkedRespawnGuid(dbtableHighGuid); + + if (targetGuid.GetEntry() == NPC_VEKLOR) + { + return; + } + } + _scheduler.Schedule(100ms, [this](TaskContext context) { if (Player* player = me->SelectNearestPlayer(10.f)) From 7eb096ae0b8fecdb7feeac56992fb14278b22a55 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:03:56 -0300 Subject: [PATCH 37/66] fix(Core/Creature): Fix LinkedRespawn not working with id2, etc. (#13367) --- src/server/game/Entities/Creature/Creature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index de275c56c..a2a3b48e1 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -646,7 +646,7 @@ void Creature::Update(uint32 diff) if (!allowed) // Will be rechecked on next Update call break; - ObjectGuid dbtableHighGuid = ObjectGuid::Create(GetEntry(), m_spawnId); + ObjectGuid dbtableHighGuid = ObjectGuid::Create(m_creatureData ? m_creatureData->id1 : GetEntry(), m_spawnId); time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid); if (!linkedRespawntime) // Can respawn Respawn(); From 2e6f6e26da8f01cd67bbb56e0e7aa961ffd5f51f Mon Sep 17 00:00:00 2001 From: M'Dic Date: Wed, 12 Oct 2022 14:39:02 -0400 Subject: [PATCH 38/66] Add (core\db): Support for Homebind Orientation (#13389) Add (core\db) Support for Homebind Orientation --- .../db_characters/Homebind_Orientation.sql | 4 +++ .../Implementation/CharacterDatabase.cpp | 8 ++--- src/server/game/DungeonFinding/LFGScripts.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 9 +++--- src/server/game/Entities/Player/Player.h | 1 + .../game/Entities/Player/PlayerStorage.cpp | 31 ++++++++++--------- .../game/Entities/Player/PlayerUpdates.cpp | 2 +- src/server/game/Handlers/CharacterHandler.cpp | 3 +- src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/game/Handlers/MovementHandler.cpp | 4 +-- src/server/game/Maps/Map.cpp | 2 +- src/server/game/Spells/Spell.cpp | 2 +- src/server/scripts/Commands/cs_misc.cpp | 2 +- src/server/scripts/Commands/cs_tele.cpp | 2 +- .../instance_vault_of_archavon.cpp | 2 +- 15 files changed, 43 insertions(+), 33 deletions(-) create mode 100644 data/sql/updates/db_characters/Homebind_Orientation.sql diff --git a/data/sql/updates/db_characters/Homebind_Orientation.sql b/data/sql/updates/db_characters/Homebind_Orientation.sql new file mode 100644 index 000000000..c975bbd36 --- /dev/null +++ b/data/sql/updates/db_characters/Homebind_Orientation.sql @@ -0,0 +1,4 @@ +-- + +ALTER TABLE `character_homebind` + ADD COLUMN `posO` FLOAT NOT NULL DEFAULT '0' AFTER `posZ`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index dd44d437a..3e537d2da 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -95,7 +95,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_SERVER_CHARACTER, "SELECT mailId from mail_server_character WHERE guid = ? and mailId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_MAIL_SERVER_CHARACTER, "REPLACE INTO mail_server_character (guid, mailId) values (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SOCIALLIST, "SELECT friend, flags, note FROM character_social JOIN characters ON characters.guid = character_social.friend WHERE character_social.guid = ? AND deleteinfos_name IS NULL LIMIT 255", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, posO FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SPELLCOOLDOWNS, "SELECT spell, category, item, time, needSend FROM character_spell_cooldown WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_DECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_ACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC); @@ -290,8 +290,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PLAYER_ENTRY_POINT, "DELETE FROM character_entry_point WHERE guid = ?", CONNECTION_ASYNC); // Character homebind - PrepareStatement(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_PLAYER_HOMEBIND, "UPDATE character_homebind SET mapId = ?, zoneId = ?, posX = ?, posY = ?, posZ = ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_PLAYER_HOMEBIND, "INSERT INTO character_homebind (guid, mapId, zoneId, posX, posY, posZ, posO) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_PLAYER_HOMEBIND, "UPDATE character_homebind SET mapId = ?, zoneId = ?, posX = ?, posY = ?, posZ = ?, posO = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC); // Corpse @@ -407,7 +407,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PINFO_MAILS, "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PINFO_XP, "SELECT a.xp, b.guid FROM characters a LEFT JOIN guild_member b ON a.guid = b.guid WHERE a.guid = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_CHAR_HOMEBIND, "SELECT mapId, zoneId, posX, posY, posZ, posO FROM character_homebind WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_GUID_NAME_BY_ACC, "SELECT guid, name FROM characters WHERE account = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_POOL_QUEST_SAVE, "SELECT quest_id FROM pool_quest_save WHERE pool_id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHARACTER_AT_LOGIN, "SELECT at_login FROM characters WHERE guid = ?", CONNECTION_SYNCH); diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp index 4120c8aff..dbf725f8b 100644 --- a/src/server/game/DungeonFinding/LFGScripts.cpp +++ b/src/server/game/DungeonFinding/LFGScripts.cpp @@ -105,7 +105,7 @@ namespace lfg sLFGMgr->LeaveLfg(player->GetGUID()); sLFGMgr->LeaveAllLfgQueues(player->GetGUID(), true); player->RemoveAurasDueToSpell(LFG_SPELL_LUCK_OF_THE_DRAW); - player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, 0.0f); + player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->m_homebindO); LOG_DEBUG("lfg", "LFGPlayerScript::OnMapChanged, Player {} ({}) is in LFG dungeon map but does not have a valid group! Teleporting to homebind.", player->GetName(), player->GetGUID().ToString()); return; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 118d83669..4ea55fd56 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -349,6 +349,7 @@ Player::Player(WorldSession* session): Unit(true), m_mover(this) m_homebindX = 0; m_homebindY = 0; m_homebindZ = 0; + m_homebindO = 0; m_contestedPvPTimer = 0; @@ -1585,7 +1586,7 @@ bool Player::TeleportToEntryPoint() if (loc.m_mapId == MAPID_INVALID) { - return TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation()); + return TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_homebindO); } return TeleportTo(loc); @@ -4851,7 +4852,7 @@ void Player::RepopAtGraveyard() } } else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY())) - TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation()); + TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_homebindO); RemovePlayerFlag(PLAYER_FLAGS_IS_OUT_OF_BOUNDS); } @@ -11054,7 +11055,7 @@ void Player::SetEntryPoint() } if (m_entryPointData.joinPos.m_mapId == MAPID_INVALID) - m_entryPointData.joinPos = WorldLocation(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, 0.0f); + m_entryPointData.joinPos = WorldLocation(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_homebindO); } void Player::LeaveBattleground(Battleground* bg) @@ -11293,7 +11294,7 @@ void Player::SendInitialPacketsBeforeAddToMap() // Homebind WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4); - data << m_homebindX << m_homebindY << m_homebindZ; + data << m_homebindX << m_homebindY << m_homebindZ << m_homebindO; data << (uint32) m_homebindMapId; data << (uint32) m_homebindAreaId; GetSession()->SendPacket(&data); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 6cb60dbec..b31139f5c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2319,6 +2319,7 @@ public: float m_homebindX; float m_homebindY; float m_homebindZ; + float m_homebindO; [[nodiscard]] WorldLocation GetStartPosition() const; diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 1b615fe65..8be05f0cb 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -4922,7 +4922,7 @@ bool Player::LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, flo void Player::SetHomebind(WorldLocation const& loc, uint32 areaId) { - loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ); + loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ, m_homebindO); m_homebindMapId = loc.GetMapId(); m_homebindAreaId = areaId; @@ -4930,10 +4930,11 @@ void Player::SetHomebind(WorldLocation const& loc, uint32 areaId) CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_PLAYER_HOMEBIND); stmt->SetData(0, m_homebindMapId); stmt->SetData(1, m_homebindAreaId); - stmt->SetData (2, m_homebindX); - stmt->SetData (3, m_homebindY); - stmt->SetData (4, m_homebindZ); - stmt->SetData(5, GetGUID().GetCounter()); + stmt->SetData(2, m_homebindX); + stmt->SetData(3, m_homebindY); + stmt->SetData(4, m_homebindZ); + stmt->SetData(5, m_homebindO); + stmt->SetData(6, GetGUID().GetCounter()); CharacterDatabase.Execute(stmt); } @@ -5104,7 +5105,7 @@ bool Player::LoadFromDB(ObjectGuid playerGuid, CharacterDatabaseQueryHolder cons std::string taxi_nodes = fields[42].Get(); - auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); }; + auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ, m_homebindO); }; _LoadGroup(); @@ -7004,7 +7005,7 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) } bool ok = false; - // SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ? + // SELECT mapId, zoneId, posX, posY, posZ, pozO FROM character_homebind WHERE guid = ? if (result) { Field* fields = result->Fetch(); @@ -7014,11 +7015,12 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) m_homebindX = fields[2].Get(); m_homebindY = fields[3].Get(); m_homebindZ = fields[4].Get(); + m_homebindO = fields[5].Get(); MapEntry const* bindMapEntry = sMapStore.LookupEntry(m_homebindMapId); // accept saved data only for valid position (and non instanceable), and accessable - if (MapMgr::IsValidMapCoord(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ) && + if (MapMgr::IsValidMapCoord(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_homebindO) && !bindMapEntry->Instanceable() && GetSession()->Expansion() >= bindMapEntry->Expansion()) ok = true; else @@ -7036,19 +7038,20 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) m_homebindX = info->positionX; m_homebindY = info->positionY; m_homebindZ = info->positionZ; - + m_homebindO = info->orientation; CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_HOMEBIND); stmt->SetData(0, GetGUID().GetCounter()); stmt->SetData(1, m_homebindMapId); stmt->SetData(2, m_homebindAreaId); - stmt->SetData (3, m_homebindX); - stmt->SetData (4, m_homebindY); - stmt->SetData (5, m_homebindZ); + stmt->SetData(3, m_homebindX); + stmt->SetData(4, m_homebindY); + stmt->SetData(5, m_homebindZ); + stmt->SetData(6, m_homebindO); CharacterDatabase.Execute(stmt); } - LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}", - m_homebindMapId, m_homebindAreaId, m_homebindX, m_homebindY, m_homebindZ); + LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}, O: {}", + m_homebindMapId, m_homebindAreaId, m_homebindX, m_homebindY, m_homebindZ, m_homebindO); return true; } diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 2993b7d58..06f20494a 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1017,7 +1017,7 @@ void Player::UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool def chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1% - LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}\%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance); + LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance); if (roll_chance_f(chance)) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 70eb6ef98..0f3cd2b29 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -893,7 +893,7 @@ void WorldSession::HandlePlayerLoginFromDB(LoginQueryHolder const& holder) if (at) pCurrChar->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, pCurrChar->GetOrientation()); else - pCurrChar->TeleportTo(pCurrChar->m_homebindMapId, pCurrChar->m_homebindX, pCurrChar->m_homebindY, pCurrChar->m_homebindZ, pCurrChar->GetOrientation()); + pCurrChar->TeleportTo(pCurrChar->m_homebindMapId, pCurrChar->m_homebindX, pCurrChar->m_homebindY, pCurrChar->m_homebindZ, pCurrChar->m_homebindO); } pCurrChar->SendInitialPacketsAfterAddToMap(); @@ -2344,6 +2344,7 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptrSetData(3, loc.GetPositionX()); stmt->SetData(4, loc.GetPositionY()); stmt->SetData(5, loc.GetPositionZ()); + stmt->SetData(6, loc.GetOrientation()); trans->Append(stmt); Player::SavePositionInDB(loc, zoneId, factionChangeInfo->Guid, trans); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index ed96dfd1a..35d9dc542 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1702,7 +1702,7 @@ void WorldSession::HandleHearthAndResurrect(WorldPacket& /*recv_data*/) _player->BuildPlayerRepop(); _player->ResurrectPlayer(1.0f); _player->SpawnCorpseBones(); - _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->GetOrientation()); + _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->m_homebindO); } void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 8c9523f00..73d98d3e1 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -92,7 +92,7 @@ void WorldSession::HandleMoveWorldportAck() if (!newMap || newMap->CannotEnter(GetPlayer(), false)) { LOG_ERROR("network.opcode", "Map {} could not be created for player {}, porting player to homebind", loc.GetMapId(), GetPlayer()->GetGUID().ToString()); - GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); + GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->m_homebindO); return; } @@ -111,7 +111,7 @@ void WorldSession::HandleMoveWorldportAck() GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString(), loc.GetMapId()); GetPlayer()->ResetMap(); GetPlayer()->SetMap(oldMap); - GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->GetOrientation()); + GetPlayer()->TeleportTo(GetPlayer()->m_homebindMapId, GetPlayer()->m_homebindX, GetPlayer()->m_homebindY, GetPlayer()->m_homebindZ, GetPlayer()->m_homebindO); return; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index b592f32dd..e85049ec5 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1269,7 +1269,7 @@ void Map::RemoveAllPlayers() { // this is happening for bg LOG_ERROR("maps", "Map::UnloadAll: player {} is still in map {} during unload, this should not happen!", player->GetName(), GetId()); - player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation()); + player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->m_homebindO); } } } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 4f8089aed..5accfd393 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1344,7 +1344,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici break; case TARGET_DEST_HOME: if (Player* playerCaster = m_caster->ToPlayer()) - dest = SpellDestination(playerCaster->m_homebindX, playerCaster->m_homebindY, playerCaster->m_homebindZ, playerCaster->GetOrientation(), playerCaster->m_homebindMapId); + dest = SpellDestination(playerCaster->m_homebindX, playerCaster->m_homebindY, playerCaster->m_homebindZ, playerCaster->m_homebindO, playerCaster->m_homebindMapId); break; case TARGET_DEST_DB: if (SpellTargetPosition const* st = sSpellMgr->GetSpellTargetPosition(m_spellInfo->Id, effIndex)) diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index d281236e9..523409f38 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1399,7 +1399,7 @@ public: if (location->empty() || *location == "inn") { - player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation()); + player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->m_homebindO); return true; } diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index fb29793eb..cf0e14e22 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -182,7 +182,7 @@ public: if (where.index() == 1) // References target's homebind { if (Player* target = player->GetConnectedPlayer()) - target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation()); + target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->m_homebindO); else { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND); diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp index ee6c391a6..8937a3a61 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp @@ -119,7 +119,7 @@ public: if (!PlayerList.IsEmpty()) for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (Player* player = i->GetSource()) - player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation()); + player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->m_homebindO); } } } From f6b8840e3458daa51b4606438f71164ddff7dd05 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Thu, 13 Oct 2022 14:04:55 -0300 Subject: [PATCH 39/66] refactor: rename spell_proc fields (#13334) Co-authored-by: Shauren --- .../rev_1665085095263613800.sql | 18 +++ src/server/game/Spells/Auras/SpellAuras.cpp | 14 +- src/server/game/Spells/Auras/SpellAuras.h | 2 +- src/server/game/Spells/SpellMgr.cpp | 128 +++++++++--------- src/server/game/Spells/SpellMgr.h | 26 ++-- 5 files changed, 100 insertions(+), 88 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1665085095263613800.sql diff --git a/data/sql/updates/pending_db_world/rev_1665085095263613800.sql b/data/sql/updates/pending_db_world/rev_1665085095263613800.sql new file mode 100644 index 000000000..71737bdfc --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665085095263613800.sql @@ -0,0 +1,18 @@ +-- +ALTER TABLE `spell_proc` + CHANGE `spellId` `SpellId` INT(11) NOT NULL DEFAULT 0 FIRST, + CHANGE `schoolMask` `SchoolMask` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellId`, + CHANGE `spellFamilyName` `SpellFamilyName` SMALLINT(5) UNSIGNED NOT NULL DEFAULT 0 AFTER `SchoolMask`, + CHANGE `spellFamilyMask0` `SpellFamilyMask0` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellFamilyName`, + CHANGE `spellFamilyMask1` `SpellFamilyMask1` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellFamilyMask0`, + CHANGE `spellFamilyMask2` `SpellFamilyMask2` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellFamilyMask1`, + CHANGE `typeMask` `ProcFlags` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellFamilyMask2`, + CHANGE `spellTypeMask` `SpellTypeMask` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `ProcFlags`, + CHANGE `spellPhaseMask` `SpellPhaseMask` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellTypeMask`, + CHANGE `hitMask` `HitMask` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellPhaseMask`, + CHANGE `attributesMask` `AttributesMask` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `HitMask`, + CHANGE `ratePerMinute` `ProcsPerMinute` FLOAT NOT NULL DEFAULT 0 AFTER `AttributesMask`, + CHANGE `chance` `Chance` FLOAT NOT NULL DEFAULT 0 AFTER `ProcsPerMinute`, + CHANGE `cooldown` `Cooldown` INT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `Chance`, + CHANGE `charges` `Charges` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0 AFTER `Cooldown`; + \ No newline at end of file diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 8d2add5c3..e13872796 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -976,7 +976,7 @@ uint8 Aura::CalcMaxCharges(Unit* caster) const { uint32 maxProcCharges = m_spellInfo->ProcCharges; if (SpellProcEntry const* procEntry = sSpellMgr->GetSpellProcEntry(GetId())) - maxProcCharges = procEntry->charges; + maxProcCharges = procEntry->Charges; if (caster) if (Player* modOwner = caster->GetSpellModOwner()) @@ -2202,9 +2202,9 @@ bool Aura::IsProcOnCooldown() const return false; } -void Aura::AddProcCooldown(uint32 /*msec*/) +void Aura::AddProcCooldown(Milliseconds /*msec*/) { - //m_procCooldown = GameTime::GetGameTime().count() + msec; + //m_procCooldown = std:chrono::steady_clock::now() + msec; } void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo) @@ -2225,7 +2225,7 @@ void Aura::PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInf ASSERT(procEntry); // cooldowns should be added to the whole aura (see 51698 area aura) - AddProcCooldown(procEntry->cooldown); + AddProcCooldown(procEntry->Cooldown); } bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventInfo) const @@ -2314,16 +2314,16 @@ bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventI float Aura::CalcProcChance(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const { - float chance = procEntry.chance; + float chance = procEntry.Chance; // calculate chances depending on unit with caster's data // so talents modifying chances and judgements will have properly calculated proc chance if (Unit* caster = GetCaster()) { // calculate ppm chance if present and we're using weapon - if (eventInfo.GetDamageInfo() && procEntry.ratePerMinute != 0) + if (eventInfo.GetDamageInfo() && procEntry.ProcsPerMinute != 0) { uint32 WeaponSpeed = caster->GetAttackTime(eventInfo.GetDamageInfo()->GetAttackType()); - chance = caster->GetPPMProcChance(WeaponSpeed, procEntry.ratePerMinute, GetSpellInfo()); + chance = caster->GetPPMProcChance(WeaponSpeed, procEntry.ProcsPerMinute, GetSpellInfo()); } // apply chance modifer aura, applies also to ppm chance (see improved judgement of light spell) if (Player* modOwner = caster->GetSpellModOwner()) diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index d98f391dc..172be1314 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -196,7 +196,7 @@ public: // and some dependant problems fixed before it can replace old proc system (for example cooldown handling) // currently proc system functionality is implemented in Unit::ProcDamageAndSpell bool IsProcOnCooldown() const; - void AddProcCooldown(uint32 msec); + void AddProcCooldown(Milliseconds msec); bool IsUsingCharges() const { return m_isUsingCharges; } void SetUsingCharges(bool val) { m_isUsingCharges = val; } void PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 8d9524bf5..eb474c22c 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -898,11 +898,11 @@ SpellProcEntry const* SpellMgr::GetSpellProcEntry(uint32 spellId) const bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const { // proc type doesn't match - if (!(eventInfo.GetTypeMask() & procEntry.typeMask)) + if (!(eventInfo.GetTypeMask() & procEntry.ProcFlags)) return false; // check XP or honor target requirement - if (procEntry.attributesMask & PROC_ATTR_REQ_EXP_OR_HONOR) + if (procEntry.AttributesMask & PROC_ATTR_REQ_EXP_OR_HONOR) if (Player* actor = eventInfo.GetActor()->ToPlayer()) if (eventInfo.GetActionTarget() && !actor->isHonorOrXPTarget(eventInfo.GetActionTarget())) return false; @@ -912,37 +912,37 @@ bool SpellMgr::CanSpellTriggerProcOnEvent(SpellProcEntry const& procEntry, ProcE return true; // check school mask (if set) for other trigger types - if (procEntry.schoolMask && !(eventInfo.GetSchoolMask() & procEntry.schoolMask)) + if (procEntry.SchoolMask && !(eventInfo.GetSchoolMask() & procEntry.SchoolMask)) return false; // check spell family name/flags (if set) for spells if (eventInfo.GetTypeMask() & (PERIODIC_PROC_FLAG_MASK | SPELL_PROC_FLAG_MASK | PROC_FLAG_DONE_TRAP_ACTIVATION)) { - if (procEntry.spellFamilyName && (procEntry.spellFamilyName != eventInfo.GetSpellInfo()->SpellFamilyName)) + if (procEntry.SpellFamilyName && (procEntry.SpellFamilyName != eventInfo.GetSpellInfo()->SpellFamilyName)) return false; - if (procEntry.spellFamilyMask && !(procEntry.spellFamilyMask & eventInfo.GetSpellInfo()->SpellFamilyFlags)) + if (procEntry.SpellFamilyMask && !(procEntry.SpellFamilyMask & eventInfo.GetSpellInfo()->SpellFamilyFlags)) return false; } // check spell type mask (if set) if (eventInfo.GetTypeMask() & (SPELL_PROC_FLAG_MASK | PERIODIC_PROC_FLAG_MASK)) { - if (procEntry.spellTypeMask && !(eventInfo.GetSpellTypeMask() & procEntry.spellTypeMask)) + if (procEntry.SpellTypeMask && !(eventInfo.GetSpellTypeMask() & procEntry.SpellTypeMask)) return false; } // check spell phase mask if (eventInfo.GetTypeMask() & REQ_SPELL_PHASE_PROC_FLAG_MASK) { - if (!(eventInfo.GetSpellPhaseMask() & procEntry.spellPhaseMask)) + if (!(eventInfo.GetSpellPhaseMask() & procEntry.SpellPhaseMask)) return false; } // check hit mask (on taken hit or on done hit, but not on spell cast phase) if ((eventInfo.GetTypeMask() & TAKEN_HIT_PROC_FLAG_MASK) || ((eventInfo.GetTypeMask() & DONE_HIT_PROC_FLAG_MASK) && !(eventInfo.GetSpellPhaseMask() & PROC_SPELL_PHASE_CAST))) { - uint32 hitMask = procEntry.hitMask; + uint32 hitMask = procEntry.HitMask; // get default values if hit mask not set if (!hitMask) { @@ -1833,8 +1833,8 @@ void SpellMgr::LoadSpellProcs() mSpellProcMap.clear(); // need for reload case - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 - QueryResult result = WorldDatabase.Query("SELECT spellId, schoolMask, spellFamilyName, spellFamilyMask0, spellFamilyMask1, spellFamilyMask2, typeMask, spellTypeMask, spellPhaseMask, hitMask, attributesMask, ratePerMinute, chance, cooldown, charges FROM spell_proc"); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + QueryResult result = WorldDatabase.Query("SELECT SpellId, SchoolMask, SpellFamilyName, SpellFamilyMask0, SpellFamilyMask1, SpellFamilyMask2, ProcFlags, SpellTypeMask, SpellPhaseMask, HitMask, AttributesMask, ProcsPerMinute, Chance, Cooldown, Charges FROM spell_proc"); if (!result) { LOG_WARN("server.loading", ">> Loaded 0 Spell Proc Conditions And Data. DB table `spell_proc` Is Empty."); @@ -1874,21 +1874,20 @@ void SpellMgr::LoadSpellProcs() SpellProcEntry baseProcEntry; - baseProcEntry.schoolMask = fields[1].Get(); - baseProcEntry.spellFamilyName = fields[2].Get(); - baseProcEntry.spellFamilyMask[0] = fields[3].Get(); - baseProcEntry.spellFamilyMask[1] = fields[4].Get(); - baseProcEntry.spellFamilyMask[2] = fields[5].Get(); - baseProcEntry.typeMask = fields[6].Get(); - baseProcEntry.spellTypeMask = fields[7].Get(); - baseProcEntry.spellPhaseMask = fields[8].Get(); - baseProcEntry.hitMask = fields[9].Get(); - baseProcEntry.attributesMask = fields[10].Get(); - baseProcEntry.ratePerMinute = fields[11].Get(); - baseProcEntry.chance = fields[12].Get(); - float cooldown = fields[13].Get(); - baseProcEntry.cooldown = uint32(cooldown); - baseProcEntry.charges = fields[14].Get(); + baseProcEntry.SchoolMask = fields[1].Get(); + baseProcEntry.SpellFamilyName = fields[2].Get(); + baseProcEntry.SpellFamilyMask[0] = fields[3].Get(); + baseProcEntry.SpellFamilyMask[1] = fields[4].Get(); + baseProcEntry.SpellFamilyMask[2] = fields[5].Get(); + baseProcEntry.ProcFlags = fields[6].Get(); + baseProcEntry.SpellTypeMask = fields[7].Get(); + baseProcEntry.SpellPhaseMask = fields[8].Get(); + baseProcEntry.HitMask = fields[9].Get(); + baseProcEntry.AttributesMask = fields[10].Get(); + baseProcEntry.ProcsPerMinute = fields[11].Get(); + baseProcEntry.Chance = fields[12].Get(); + baseProcEntry.Cooldown = Milliseconds(fields[13].Get()); + baseProcEntry.Charges = fields[14].Get(); while (spellInfo) { @@ -1900,56 +1899,51 @@ void SpellMgr::LoadSpellProcs() SpellProcEntry procEntry = SpellProcEntry(baseProcEntry); // take defaults from dbcs - if (!procEntry.typeMask) - procEntry.typeMask = spellInfo->ProcFlags; - if (!procEntry.charges) - procEntry.charges = spellInfo->ProcCharges; - if (!procEntry.chance && !procEntry.ratePerMinute) - procEntry.chance = float(spellInfo->ProcChance); + if (!procEntry.ProcFlags) + procEntry.ProcFlags = spellInfo->ProcFlags; + if (!procEntry.Charges) + procEntry.Charges = spellInfo->ProcCharges; + if (!procEntry.Chance && !procEntry.ProcsPerMinute) + procEntry.Chance = float(spellInfo->ProcChance); // validate data - if (procEntry.schoolMask & ~SPELL_SCHOOL_MASK_ALL) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has wrong `schoolMask` set: {}", spellId, procEntry.schoolMask); - if (procEntry.spellFamilyName && (procEntry.spellFamilyName < 3 || procEntry.spellFamilyName > 17 || procEntry.spellFamilyName == 14 || procEntry.spellFamilyName == 16)) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has wrong `spellFamilyName` set: {}", spellId, procEntry.spellFamilyName); - if (procEntry.chance < 0) + if (procEntry.SchoolMask & ~SPELL_SCHOOL_MASK_ALL) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has wrong `SchoolMask` set: {}", spellId, procEntry.SchoolMask); + if (procEntry.SpellFamilyName && (procEntry.SpellFamilyName < 3 || procEntry.SpellFamilyName > 17 || procEntry.SpellFamilyName == 14 || procEntry.SpellFamilyName == 16)) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has wrong `SpellFamilyName` set: {}", spellId, procEntry.SpellFamilyName); + if (procEntry.Chance < 0) { - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has negative value in `chance` field", spellId); - procEntry.chance = 0; + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has negative value in `Chance` field", spellId); + procEntry.Chance = 0; } - if (procEntry.ratePerMinute < 0) + if (procEntry.ProcsPerMinute < 0) { - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has negative value in `ratePerMinute` field", spellId); - procEntry.ratePerMinute = 0; + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has negative value in `ProcsPerMinute` field", spellId); + procEntry.ProcsPerMinute = 0; } - if (cooldown < 0) + if (procEntry.Chance == 0 && procEntry.ProcsPerMinute == 0) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} doesn't have `Chance` and `ProcsPerMinute` values defined, proc will not be triggered", spellId); + if (procEntry.Charges > 99) { - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has negative value in `cooldown` field", spellId); - procEntry.cooldown = 0; + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has too big value in `Charges` field", spellId); + procEntry.Charges = 99; } - if (procEntry.chance == 0 && procEntry.ratePerMinute == 0) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} doesn't have `chance` and `ratePerMinute` values defined, proc will not be triggered", spellId); - if (procEntry.charges > 99) - { - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has too big value in `charges` field", spellId); - procEntry.charges = 99; - } - if (!procEntry.typeMask) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} doesn't have `typeMask` value defined, proc will not be triggered", spellId); - if (procEntry.spellTypeMask & ~PROC_SPELL_TYPE_MASK_ALL) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has wrong `spellTypeMask` set: {}", spellId, procEntry.spellTypeMask); - if (procEntry.spellTypeMask && !(procEntry.typeMask & (SPELL_PROC_FLAG_MASK | PERIODIC_PROC_FLAG_MASK))) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has `spellTypeMask` value defined, but it won't be used for defined `typeMask` value", spellId); - if (!procEntry.spellPhaseMask && procEntry.typeMask & REQ_SPELL_PHASE_PROC_FLAG_MASK) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} doesn't have `spellPhaseMask` value defined, but it's required for defined `typeMask` value, proc will not be triggered", spellId); - if (procEntry.spellPhaseMask & ~PROC_SPELL_PHASE_MASK_ALL) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has wrong `spellPhaseMask` set: {}", spellId, procEntry.spellPhaseMask); - if (procEntry.spellPhaseMask && !(procEntry.typeMask & REQ_SPELL_PHASE_PROC_FLAG_MASK)) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has `spellPhaseMask` value defined, but it won't be used for defined `typeMask` value", spellId); - if (procEntry.hitMask & ~PROC_HIT_MASK_ALL) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has wrong `hitMask` set: {}", spellId, procEntry.hitMask); - if (procEntry.hitMask && !(procEntry.typeMask & TAKEN_HIT_PROC_FLAG_MASK || (procEntry.typeMask & DONE_HIT_PROC_FLAG_MASK && (!procEntry.spellPhaseMask || procEntry.spellPhaseMask & (PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH))))) - LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId {} has `hitMask` value defined, but it won't be used for defined `typeMask` and `spellPhaseMask` values", spellId); + if (!procEntry.ProcFlags) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} doesn't have `ProcFlags` value defined, proc will not be triggered", spellId); + if (procEntry.SpellTypeMask & ~PROC_SPELL_TYPE_MASK_ALL) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has wrong `SpellTypeMask` set: {}", spellId, procEntry.SpellTypeMask); + if (procEntry.SpellTypeMask && !(procEntry.ProcFlags & (SPELL_PROC_FLAG_MASK | PERIODIC_PROC_FLAG_MASK))) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has `SpellTypeMask` value defined, but it won't be used for defined `ProcFlags` value", spellId); + if (!procEntry.SpellPhaseMask && procEntry.ProcFlags & REQ_SPELL_PHASE_PROC_FLAG_MASK) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} doesn't have `SpellPhaseMask` value defined, but it's required for defined `ProcFlags` value, proc will not be triggered", spellId); + if (procEntry.SpellPhaseMask & ~PROC_SPELL_PHASE_MASK_ALL) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has wrong `SpellPhaseMask` set: {}", spellId, procEntry.SpellPhaseMask); + if (procEntry.SpellPhaseMask && !(procEntry.ProcFlags & REQ_SPELL_PHASE_PROC_FLAG_MASK)) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has `SpellPhaseMask` value defined, but it won't be used for defined `ProcFlags` value", spellId); + if (procEntry.HitMask & ~PROC_HIT_MASK_ALL) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has wrong `HitMask` set: {}", spellId, procEntry.HitMask); + if (procEntry.HitMask && !(procEntry.ProcFlags & TAKEN_HIT_PROC_FLAG_MASK || (procEntry.ProcFlags & DONE_HIT_PROC_FLAG_MASK && (!procEntry.SpellPhaseMask || procEntry.SpellPhaseMask & (PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH))))) + LOG_ERROR("sql.sql", "`spell_proc` table entry for SpellId {} has `HitMask` value defined, but it won't be used for defined `ProcFlags` and `SpellPhaseMask` values", spellId); mSpellProcMap[spellInfo->Id] = procEntry; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index d02342f11..aa548a4d5 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -263,7 +263,7 @@ enum ProcFlagsHit PROC_HIT_REFLECT = 0x0000800, PROC_HIT_INTERRUPT = 0x0001000, // (not used atm) PROC_HIT_FULL_BLOCK = 0x0002000, - PROC_HIT_MASK_ALL = 0x2FFF, + PROC_HIT_MASK_ALL = 0x0002FFF, }; enum ProcAttributes @@ -288,18 +288,18 @@ typedef std::unordered_map SpellProcEventMap; struct SpellProcEntry { - uint32 schoolMask; // if nonzero - bitmask for matching proc condition based on spell's school - uint32 spellFamilyName; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyName - flag96 spellFamilyMask; // if nonzero - bitmask for matching proc condition based on candidate spell's SpellFamilyFlags - uint32 typeMask; // if nonzero - owerwrite procFlags field for given Spell.dbc entry, bitmask for matching proc condition, see enum ProcFlags - uint32 spellTypeMask; // if nonzero - bitmask for matching proc condition based on candidate spell's damage/heal effects, see enum ProcFlagsSpellType - uint32 spellPhaseMask; // if nonzero - bitmask for matching phase of a spellcast on which proc occurs, see enum ProcFlagsSpellPhase - uint32 hitMask; // if nonzero - bitmask for matching proc condition based on hit result, see enum ProcFlagsHit - uint32 attributesMask; // bitmask, see ProcAttributes - float ratePerMinute; // if nonzero - chance to proc is equal to value * aura caster's weapon speed / 60 - float chance; // if nonzero - owerwrite procChance field for given Spell.dbc entry, defines chance of proc to occur, not used if perMinuteRate set - uint32 cooldown; // if nonzero - cooldown in secs for aura proc, applied to aura - uint32 charges; // if nonzero - owerwrite procCharges field for given Spell.dbc entry, defines how many times proc can occur before aura remove, 0 - infinite + uint32 SchoolMask; // if nonzero - bitmask for matching proc condition based on spell's school + uint32 SpellFamilyName; // if nonzero - for matching proc condition based on candidate spell's SpellFamilyName + flag96 SpellFamilyMask; // if nonzero - bitmask for matching proc condition based on candidate spell's SpellFamilyFlags + uint32 ProcFlags; // if nonzero - owerwrite procFlags field for given Spell.dbc entry, bitmask for matching proc condition, see enum ProcFlags + uint32 SpellTypeMask; // if nonzero - bitmask for matching proc condition based on candidate spell's damage/heal effects, see enum ProcFlagsSpellType + uint32 SpellPhaseMask; // if nonzero - bitmask for matching phase of a spellcast on which proc occurs, see enum ProcFlagsSpellPhase + uint32 HitMask; // if nonzero - bitmask for matching proc condition based on hit result, see enum ProcFlagsHit + uint32 AttributesMask; // bitmask, see ProcAttributes + float ProcsPerMinute; // if nonzero - chance to proc is equal to value * aura caster's weapon speed / 60 + float Chance; // if nonzero - owerwrite procChance field for given Spell.dbc entry, defines chance of proc to occur, not used if ProcsPerMinute set + Milliseconds Cooldown; // if nonzero - cooldown in secs for aura proc, applied to aura + uint32 Charges; // if nonzero - owerwrite procCharges field for given Spell.dbc entry, defines how many times proc can occur before aura remove, 0 - infinite }; typedef std::unordered_map SpellProcMap; From c59f6be0575f8aedc63c75f08ef3115b4c0be663 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Thu, 13 Oct 2022 17:07:18 +0000 Subject: [PATCH 40/66] chore(DB): import pending files Referenced commit(s): f6b8840e3458daa51b4606438f71164ddff7dd05 --- .../rev_1665085095263613800.sql => db_world/2022_10_13_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1665085095263613800.sql => db_world/2022_10_13_00.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1665085095263613800.sql b/data/sql/updates/db_world/2022_10_13_00.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1665085095263613800.sql rename to data/sql/updates/db_world/2022_10_13_00.sql index 71737bdfc..b928900e0 100644 --- a/data/sql/updates/pending_db_world/rev_1665085095263613800.sql +++ b/data/sql/updates/db_world/2022_10_13_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_11_08 -> 2022_10_13_00 -- ALTER TABLE `spell_proc` CHANGE `spellId` `SpellId` INT(11) NOT NULL DEFAULT 0 FIRST, From 08d74c5d1c92cb780329522b1eae73532ea769db Mon Sep 17 00:00:00 2001 From: M'Dic Date: Thu, 13 Oct 2022 15:09:04 -0400 Subject: [PATCH 41/66] fix (updates\sql): Move orientation to pending (#13399) --- .../Homebind_Orientation.sql | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{db_characters => pending_db_characters}/Homebind_Orientation.sql (60%) diff --git a/data/sql/updates/db_characters/Homebind_Orientation.sql b/data/sql/updates/pending_db_characters/Homebind_Orientation.sql similarity index 60% rename from data/sql/updates/db_characters/Homebind_Orientation.sql rename to data/sql/updates/pending_db_characters/Homebind_Orientation.sql index c975bbd36..7cb578843 100644 --- a/data/sql/updates/db_characters/Homebind_Orientation.sql +++ b/data/sql/updates/pending_db_characters/Homebind_Orientation.sql @@ -1,4 +1,5 @@ -- +DELETE FROM `updates` WHERE `name`='Homebind_Orientation.sql'; ALTER TABLE `character_homebind` ADD COLUMN `posO` FLOAT NOT NULL DEFAULT '0' AFTER `posZ`; From 7ee14d44bf2384960edbcd05afaee30af345f0f1 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Thu, 13 Oct 2022 19:11:12 +0000 Subject: [PATCH 42/66] chore(DB): import pending files Referenced commit(s): 08d74c5d1c92cb780329522b1eae73532ea769db --- .../Homebind_Orientation.sql => db_characters/2022_10_13_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_characters/Homebind_Orientation.sql => db_characters/2022_10_13_00.sql} (78%) diff --git a/data/sql/updates/pending_db_characters/Homebind_Orientation.sql b/data/sql/updates/db_characters/2022_10_13_00.sql similarity index 78% rename from data/sql/updates/pending_db_characters/Homebind_Orientation.sql rename to data/sql/updates/db_characters/2022_10_13_00.sql index 7cb578843..e462c529f 100644 --- a/data/sql/updates/pending_db_characters/Homebind_Orientation.sql +++ b/data/sql/updates/db_characters/2022_10_13_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_08_21_00 -> 2022_10_13_00 -- DELETE FROM `updates` WHERE `name`='Homebind_Orientation.sql'; From b4419512a379b23ed72b801a571e46f613c4452c Mon Sep 17 00:00:00 2001 From: Walter Pagani Date: Fri, 14 Oct 2022 12:35:06 -0300 Subject: [PATCH 43/66] fix(Scripts/ICC): gossip in boss Deathbringer Saurfang (#12381) --- .../pending_db_world/rev_1657762683954396900.sql | 12 ++++++++++++ .../IcecrownCitadel/boss_deathbringer_saurfang.cpp | 8 ++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1657762683954396900.sql diff --git a/data/sql/updates/pending_db_world/rev_1657762683954396900.sql b/data/sql/updates/pending_db_world/rev_1657762683954396900.sql new file mode 100644 index 000000000..6d03d78d9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1657762683954396900.sql @@ -0,0 +1,12 @@ +UPDATE `broadcast_text_locale` SET `MaleText`="Esta es nuestra batalla final. El paso del tiempo se hará eco de lo que aquí ocurra. Sin importar el resultado, sabrán que luchamos con honor. ¡Que luchamos por la libertad y la seguridad de nuestro pueblo!" WHERE `ID`=36923 AND `locale` IN ('esEs', 'esMX'); + +UPDATE `creature_text` SET `BroadcastTextId`=37037 WHERE `CreatureID`=38607 AND `GroupID`=13 AND `ID`=0; +UPDATE `creature_text` SET `BroadcastTextId`=37043 WHERE `CreatureID`=38607 AND `GroupID`=14 AND `ID`=0; +UPDATE `creature_text` SET `BroadcastTextId`=37046 WHERE `CreatureID`=38607 AND `GroupID`=15 AND `ID`=0; + +UPDATE `creature_template` SET `gossip_menu_id`=10953, `npcflag`=`npcflag`|1 WHERE `entry`=37187; + +DELETE FROM `gossip_menu` WHERE `MenuID`=10953; + +INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES +(10953, 15217); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 86bc01d41..2615b8957 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -750,8 +750,8 @@ public: InstanceScript* instance = creature->GetInstanceScript(); if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, "We are ready to go, High Overlord. The Lich King must fall!", 631, -ACTION_START_EVENT); - SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); + AddGossipItemFor(player, 10953, 0, GOSSIP_SENDER_INFO, -ACTION_START_EVENT); + SendGossipMenuFor(player, player->GetGossipTextId(10953, creature), creature->GetGUID()); } return true; @@ -964,8 +964,8 @@ public: InstanceScript* instance = creature->GetInstanceScript(); if (instance && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE && instance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != IN_PROGRESS) { - AddGossipItemFor(player, 0, "Let it begin...", 631, -ACTION_START_EVENT + 1); - SendGossipMenuFor(player, DEFAULT_GOSSIP_MESSAGE, creature->GetGUID()); + AddGossipItemFor(player, 10933, 0, GOSSIP_SENDER_INFO, -ACTION_START_EVENT + 1); + SendGossipMenuFor(player, player->GetGossipTextId(10933, creature), creature->GetGUID()); } return true; From 11bb94dcb05194ac1c73e0ff47349d6a1a733e73 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 14 Oct 2022 15:37:16 +0000 Subject: [PATCH 44/66] chore(DB): import pending files Referenced commit(s): b4419512a379b23ed72b801a571e46f613c4452c --- .../rev_1657762683954396900.sql => db_world/2022_10_14_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1657762683954396900.sql => db_world/2022_10_14_00.sql} (95%) diff --git a/data/sql/updates/pending_db_world/rev_1657762683954396900.sql b/data/sql/updates/db_world/2022_10_14_00.sql similarity index 95% rename from data/sql/updates/pending_db_world/rev_1657762683954396900.sql rename to data/sql/updates/db_world/2022_10_14_00.sql index 6d03d78d9..817d86abe 100644 --- a/data/sql/updates/pending_db_world/rev_1657762683954396900.sql +++ b/data/sql/updates/db_world/2022_10_14_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_13_00 -> 2022_10_14_00 UPDATE `broadcast_text_locale` SET `MaleText`="Esta es nuestra batalla final. El paso del tiempo se hará eco de lo que aquí ocurra. Sin importar el resultado, sabrán que luchamos con honor. ¡Que luchamos por la libertad y la seguridad de nuestro pueblo!" WHERE `ID`=36923 AND `locale` IN ('esEs', 'esMX'); UPDATE `creature_text` SET `BroadcastTextId`=37037 WHERE `CreatureID`=38607 AND `GroupID`=13 AND `ID`=0; From 562835686a712df033ef4ba1a24d0df2ec1f29c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Fri, 14 Oct 2022 21:08:22 +0200 Subject: [PATCH 45/66] chore(bash/db_assembler): show deprecation warning (#13410) --- apps/db_assembler/db_assembler.sh | 4 ++++ 1 file changed, 4 insertions(+) mode change 100644 => 100755 apps/db_assembler/db_assembler.sh diff --git a/apps/db_assembler/db_assembler.sh b/apps/db_assembler/db_assembler.sh old mode 100644 new mode 100755 index eaa6b1678..ba4e15e6a --- a/apps/db_assembler/db_assembler.sh +++ b/apps/db_assembler/db_assembler.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash +echo ----------------------------------------------------------------------------------------------- >&2 +echo ATTENTION: This tool is DEPRECATED. To assemble or update your DB, use the worldserver instead. >&2 +echo ----------------------------------------------------------------------------------------------- >&2 + set -e CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" From 108ebeae846dea7c1dad6c62cae7b306e6db0254 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 14 Oct 2022 16:27:22 -0300 Subject: [PATCH 46/66] fix(DB/creature_template): Add IGNORE_ASSISTANCE_CALL to Anubisath Sentinel (#13406) --- data/sql/updates/pending_db_world/rev_1665712907402997300.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665712907402997300.sql diff --git a/data/sql/updates/pending_db_world/rev_1665712907402997300.sql b/data/sql/updates/pending_db_world/rev_1665712907402997300.sql new file mode 100644 index 000000000..7a66e301a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665712907402997300.sql @@ -0,0 +1,3 @@ +-- +UPDATE `creature_template` SET `flags_extra` = 0 WHERE `entry` IN (14882, 14883, 14825, 13996); +UPDATE `creature_template` SET `flags_extra` = 33554432 WHERE (`entry` = 15264); From b3e20ea7ef001af8420dd63c0b51bd85404c8667 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Fri, 14 Oct 2022 16:27:52 -0300 Subject: [PATCH 47/66] fix(Scripts/TempleOfAhnQiraj): Make Nullify consume mana (#13403) --- .../scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp index 7e1dbf5cd..08a51d129 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp @@ -406,7 +406,7 @@ struct npc_obsidian_nullifier : public ScriptedAI if (me->GetPowerPct(POWER_MANA) >= 100.f) { - DoCastAOE(SPELL_NULLIFY, true); + DoCastAOE(SPELL_NULLIFY); } context.Repeat(6s); From 96ff75995355dffb25825e066b7fba124a5344dd Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Fri, 14 Oct 2022 16:28:03 -0300 Subject: [PATCH 48/66] fix(Scripts/TempleOfAhnQiraj): Change spawn mode for Spawn of Fankriss (#13408) --- 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 d113409af..f5058dac5 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4415,6 +4415,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AuraInterruptFlags &= ~AURA_INTERRUPT_FLAG_NOT_ABOVEWATER; }); + // Summon Worm + ApplySpellFix({ 518, 25831, 25832 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].MiscValueB = 64; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 2bc6a81457bb5476d27c6a852ce8e0ad160cb2d6 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Fri, 14 Oct 2022 16:28:14 -0300 Subject: [PATCH 49/66] fix(Scripts/TempleOfAhnQiraj): Huhuran and Viscidus combat range (#13407) --- .../scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp | 5 ++++- .../scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp index c8e5c69e8..882ccb7e9 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp @@ -49,7 +49,10 @@ enum Events struct boss_huhuran : public BossAI { - boss_huhuran(Creature* creature) : BossAI(creature, DATA_HUHURAN) { } + boss_huhuran(Creature* creature) : BossAI(creature, DATA_HUHURAN) + { + me->m_CombatDistance = 90.f; + } void Reset() override { diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index cadc329c4..49be214e0 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -101,6 +101,7 @@ struct boss_viscidus : public BossAI boss_viscidus(Creature* creature) : BossAI(creature, DATA_VISCIDUS) { me->LowerPlayerDamageReq(me->GetMaxHealth()); + me->m_CombatDistance = 60.f; } bool CheckInRoom() override From 2c426829890d248cbbe1face6afe3e0084797a2d Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Fri, 14 Oct 2022 16:28:30 -0300 Subject: [PATCH 50/66] fix(Scripts/TempleOfAhnQiraj): Ouro double spawn in 3rd phase, interrupt immunity (#13405) --- .../rev_1665712684667487900.sql | 2 ++ .../Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp | 19 ++++++++++++++----- .../instance_temple_of_ahnqiraj.cpp | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1665712684667487900.sql diff --git a/data/sql/updates/pending_db_world/rev_1665712684667487900.sql b/data/sql/updates/pending_db_world/rev_1665712684667487900.sql new file mode 100644 index 000000000..ab7cefca1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665712684667487900.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`|33554432 WHERE `entry` = 15517; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp index 126f76c4b..1355b52d1 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp @@ -78,8 +78,15 @@ struct npc_ouro_spawner : public ScriptedAI // Spawn Ouro on LoS check if (!hasSummoned && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 40.0f) && !who->ToPlayer()->IsGameMaster()) { - DoCastSelf(SPELL_SUMMON_OURO); - hasSummoned = true; + if (InstanceScript* instance = me->GetInstanceScript()) + { + Creature* ouro = instance->GetCreature(DATA_OURO); + if (instance->GetBossState(DATA_OURO) != IN_PROGRESS && !ouro) + { + DoCastSelf(SPELL_SUMMON_OURO); + hasSummoned = true; + } + } } ScriptedAI::MoveInLineOfSight(who); @@ -129,7 +136,7 @@ struct boss_ouro : public BossAI void Submerge() { - if (_enraged) + if (_enraged || _submerged) return; me->AttackStop(); @@ -209,6 +216,9 @@ struct boss_ouro : public BossAI }) .Schedule(3s, GROUP_PHASE_TRANSITION, [this](TaskContext context) { + if (_enraged) + return; + if (!IsPlayerWithinMeleeRange() && !_submerged) { if (_submergeMelee < 10) @@ -217,8 +227,7 @@ struct boss_ouro : public BossAI } else { - if (!_enraged) - Submerge(); + Submerge(); _submergeMelee = 0; } } 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 281d5f53b..749a11e43 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp @@ -30,6 +30,7 @@ ObjectData const creatureData[] = { NPC_SARTURA, DATA_SARTURA }, { NPC_CTHUN, DATA_CTHUN }, { NPC_EYE_OF_CTHUN, DATA_EYE_OF_CTHUN }, + { NPC_OURO, DATA_OURO }, { NPC_OURO_SPAWNER, DATA_OURO_SPAWNER }, { NPC_MASTERS_EYE, DATA_MASTERS_EYE }, { NPC_VEKLOR, DATA_VEKLOR }, From ca2dcf11869fbc64f6cac08f1ea0e3a695519e30 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 14 Oct 2022 19:30:34 +0000 Subject: [PATCH 51/66] chore(DB): import pending files Referenced commit(s): 2c426829890d248cbbe1face6afe3e0084797a2d --- .../rev_1665712684667487900.sql => db_world/2022_10_14_01.sql} | 1 + .../rev_1665712907402997300.sql => db_world/2022_10_14_02.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1665712684667487900.sql => db_world/2022_10_14_01.sql} (72%) rename data/sql/updates/{pending_db_world/rev_1665712907402997300.sql => db_world/2022_10_14_02.sql} (80%) diff --git a/data/sql/updates/pending_db_world/rev_1665712684667487900.sql b/data/sql/updates/db_world/2022_10_14_01.sql similarity index 72% rename from data/sql/updates/pending_db_world/rev_1665712684667487900.sql rename to data/sql/updates/db_world/2022_10_14_01.sql index ab7cefca1..27746d734 100644 --- a/data/sql/updates/pending_db_world/rev_1665712684667487900.sql +++ b/data/sql/updates/db_world/2022_10_14_01.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_14_00 -> 2022_10_14_01 -- UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`|33554432 WHERE `entry` = 15517; diff --git a/data/sql/updates/pending_db_world/rev_1665712907402997300.sql b/data/sql/updates/db_world/2022_10_14_02.sql similarity index 80% rename from data/sql/updates/pending_db_world/rev_1665712907402997300.sql rename to data/sql/updates/db_world/2022_10_14_02.sql index 7a66e301a..6547670cb 100644 --- a/data/sql/updates/pending_db_world/rev_1665712907402997300.sql +++ b/data/sql/updates/db_world/2022_10_14_02.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_14_01 -> 2022_10_14_02 -- UPDATE `creature_template` SET `flags_extra` = 0 WHERE `entry` IN (14882, 14883, 14825, 13996); UPDATE `creature_template` SET `flags_extra` = 33554432 WHERE (`entry` = 15264); From 068a4fcfa3f1ccae7610c1fc0ee66708e175abc6 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Sat, 15 Oct 2022 09:00:19 -0600 Subject: [PATCH 52/66] fix(DB): Add sharks (#13162) * fix(DB): Add sharks * Correctly delete all waypoint paths before re-adding --- .../rev_1664310727301327900.sql | 892 ++++++++++++++++++ 1 file changed, 892 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664310727301327900.sql diff --git a/data/sql/updates/pending_db_world/rev_1664310727301327900.sql b/data/sql/updates/pending_db_world/rev_1664310727301327900.sql new file mode 100644 index 000000000..054d8e42f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664310727301327900.sql @@ -0,0 +1,892 @@ +-- +SET @GUID := 1976934; + +DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+26; +DELETE FROM `creature` WHERE `guid` = 43494; # There is one existing shark that we are updating +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`) VALUES +(@GUID+0, 5434, 0, 0, 0, -9540.26, -4662.27, -48.3184, 0.902437, 900, 0, 2), +(@GUID+1, 5434, 0, 0, 0, -10034.9, -4648.66, -49.2208, 0.0410688, 900, 0, 2), +(@GUID+2, 5434, 0, 0, 1, -4158.29, -4547.67, -6.97583, 5.22403, 900, 0, 2), +(@GUID+3, 5434, 0, 0, 0, -11170, -4093.91, -5.86852, 4.3931, 900, 0, 2), +(@GUID+4, 5434, 0, 0, 1, -3030.62, -4244.16, -11.4944, 3.28582, 900, 0, 2), +(@GUID+5, 5434, 0, 0, 1, -4102.56, -4588.74, -53.1956, 2.30332, 900, 0, 2), +(@GUID+6, 5434, 0, 0, 1, -3993.77, -4745.56, -29.1755, 0.219198, 900, 0, 2), +(@GUID+7, 12125, 0, 0, 1, 2247.58, -7314.71, -32.7716, 5.07837, 900, 10, 1), +(@GUID+8, 12125, 0, 0, 1, 5164.87, -6681.64, -30.195, 5.30724, 900, 10, 1), +(@GUID+9, 12125, 0, 0, 1, 2807.91, -7145.15, -24.6603, 1.25786, 900, 10, 1), +(@GUID+10, 12125, 0, 0, 1, 4029.04, -6521.56, -11.6539, 2.93048, 900, 10, 1), +(@GUID+11, 12125, 0, 0, 1, 4146.76, -6796.36, -12.9569, 1.08111, 900, 10, 1), +(@GUID+12, 12125, 0, 0, 1, 2787.04, -7286.35, -13.3887, 2.88011, 900, 10, 1), +(@GUID+13, 12125, 0, 0, 1, 5107.84, -6557.01, -22.213, 5.69849, 900, 10, 1), +(@GUID+14, 12125, 0, 0, 1, 3575.07, -6375.8, -33.5823, 4.58606, 900, 10, 1), +(@GUID+15, 12125, 0, 0, 1, 2141.54, -7237.98, -32.0054, 1.83467, 900, 10, 1), +(@GUID+16, 5435, 0, 0, 0, 3221.9, 1710.47, -49.2366, 0.715585, 300, 0, 2), +(@GUID+17, 5435, 0, 0, 0, 3234.78, 1040.16, -49.0336, 2.08338, 300, 0, 2), +(@GUID+18, 5435, 0, 0, 0, 3221.29, 530.995, -49.0322, 6.16568, 300, 0, 2), +(@GUID+19, 5435, 0, 0, 1, 1550.59, -5378.97, -32.535, 3.28073, 300, 0, 2), +(@GUID+20, 5435, 0, 0, 1, 1284, -5408.57, -50.3039, 3.49243, 300, 0, 2), +(@GUID+21, 5435, 0, 0, 1, 912.371, -5415.92, -55.1195, 0, 300, 0, 2), +(@GUID+22, 5435, 0, 0, 1, 493.326, -5371.27, -49.8881, 0, 300, 0, 2), +(@GUID+23, 5435, 0, 0, 1, -326.584, -5558.28, -32.5737, 3.88357, 300, 0, 2), +(@GUID+24, 5435, 0, 0, 1, -576.123, -5817.38, -32.5473, 3.15728, 300, 0, 2), +(@GUID+25, 5435, 0, 0, 1, -1385.02, -5779.74, -18.0079, 3.34814, 300, 0, 2), +(@GUID+26, 5435, 0, 0, 1, -1753.7, -5591.55, -33.6493, 3.02857, 300, 0, 2), +(43494, 5435, 0, 0, 1, -1115.53, -4306.33, -7.68768, 3.67432, 300, 0, 2); + + +SET @PATH0 := (@GUID+0) * 10; +SET @PATH1 := (@GUID+1) * 10; +SET @PATH2 := (@GUID+2) * 10; +SET @PATH3 := (@GUID+3) * 10; +SET @PATH4 := (@GUID+4) * 10; +SET @PATH5 := (@GUID+5) * 10; +SET @PATH6 := (@GUID+6) * 10; +SET @PATH16 := (@GUID+16) * 10; +SET @PATH17 := (@GUID+17) * 10; +SET @PATH18 := (@GUID+18) * 10; +SET @PATH19 := (@GUID+19) * 10; +SET @PATH20 := (@GUID+20) * 10; +SET @PATH21 := (@GUID+21) * 10; +SET @PATH22 := (@GUID+22) * 10; +SET @PATH23 := (@GUID+23) * 10; +SET @PATH24 := (@GUID+24) * 10; +SET @PATH25 := (@GUID+25) * 10; +SET @PATH26 := (@GUID+26) * 10; +SET @PATH27 := (43494) * 10; + +DELETE FROM `creature_addon` WHERE `guid` BETWEEN @GUID AND @GUID+26; +DELETE FROM `creature_addon` WHERE `guid` = 43494; +INSERT INTO `creature_addon` (`guid`, `path_id`) VALUES +(@GUID+0, @PATH0), +(@GUID+1, @PATH1), +(@GUID+2, @PATH2), +(@GUID+3, @PATH3), +(@GUID+4, @PATH4), +(@GUID+5, @PATH5), +(@GUID+6, @PATH6), +(@GUID+16, @PATH16), +(@GUID+17, @PATH17), +(@GUID+18, @PATH18), +(@GUID+19, @PATH19), +(@GUID+20, @PATH20), +(@GUID+21, @PATH21), +(@GUID+22, @PATH22), +(@GUID+23, @PATH23), +(@GUID+24, @PATH24), +(@GUID+25, @PATH25), +(@GUID+26, @PATH26), +(43494, @PATH27); + + +DELETE FROM `waypoint_data` WHERE `id` IN (@PATH0, @PATH1, @PATH2, @PATH3, @PATH4, @PATH5, @PATH6, @PATH16, @PATH17, +@PATH18, @PATH19, @PATH20, @PATH21, @PATH22, @PATH23, @PATH24, @PATH25, @PATH26, @PATH27); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`) VALUES +(@PATH0, 1, -9540.26, -4662.27, -48.3184, 100, 0), +(@PATH0, 2, -9510.95, -4663.54, -49.0854, 100, 0), +(@PATH0, 3, -9502.68, -4656.36, -49.2182, 100, 0), +(@PATH0, 4, -9484.78, -4625.73, -48.3606, 100, 0), +(@PATH0, 5, -9474.86, -4617.87, -48.6155, 100, 0), +(@PATH0, 6, -9453.22, -4604.26, -45.4023, 100, 0), +(@PATH0, 7, -9448.9, -4584.55, -38.8605, 100, 0), +(@PATH0, 8, -9450.66, -4599.8, -44.0295, 100, 0), +(@PATH0, 9, -9468.34, -4614.03, -48.1234, 100, 0), +(@PATH0, 10, -9478.85, -4620, -48.5316, 100, 0), +(@PATH0, 11, -9501.04, -4653.21, -49.1719, 100, 0), +(@PATH0, 12, -9504.49, -4660.54, -49.2182, 100, 0), +(@PATH0, 13, -9534.63, -4662.53, -48.3441, 100, 0), +(@PATH0, 14, -9549.95, -4674.56, -48.0882, 100, 0), +(@PATH0, 15, -9567.66, -4705.63, -46.2169, 100, 0), +(@PATH0, 16, -9565.93, -4723.82, -48.5166, 100, 0), +(@PATH0, 17, -9574.32, -4754.11, -45.157, 100, 0), +(@PATH0, 18, -9573.15, -4773.85, -45.3085, 100, 0), +(@PATH0, 19, -9570.63, -4793.9, -46.0685, 100, 0), +(@PATH0, 20, -9568.1, -4809.89, -47.1271, 100, 0), +(@PATH0, 21, -9566.79, -4822.01, -47.9993, 100, 0), +(@PATH0, 22, -9570.67, -4837.49, -48.782, 100, 0), +(@PATH0, 23, -9579.77, -4850.71, -49.511, 100, 0), +(@PATH0, 24, -9595.7, -4862.64, -48.9848, 100, 0), +(@PATH0, 25, -9610.89, -4861.85, -47.8268, 100, 0), +(@PATH0, 26, -9628.04, -4851.81, -49.0654, 100, 0), +(@PATH0, 27, -9636.57, -4843.27, -49.518, 100, 0), +(@PATH0, 28, -9641.53, -4823.97, -49.4116, 100, 0), +(@PATH0, 29, -9642.23, -4819.99, -49.3534, 100, 0), +(@PATH0, 30, -9660.74, -4805.98, -49.3035, 100, 0), +(@PATH0, 31, -9680.09, -4800.96, -49.088, 100, 0), +(@PATH0, 32, -9699.87, -4802.75, -47.314, 100, 0), +(@PATH0, 33, -9719.02, -4798.74, -49.1158, 100, 0), +(@PATH0, 34, -9733.33, -4791.37, -49.3066, 100, 0), +(@PATH0, 35, -9741.43, -4778.42, -49.2858, 100, 0), +(@PATH0, 36, -9750.4, -4755.83, -49.3115, 100, 0), +(@PATH0, 37, -9751.78, -4752.03, -49.3166, 100, 0), +(@PATH0, 38, -9774.5, -4735.79, -49.3036, 100, 0), +(@PATH0, 39, -9780.61, -4732.24, -49.2607, 100, 0), +(@PATH0, 40, -9798.13, -4722.02, -49.221, 100, 0), +(@PATH0, 41, -9809.75, -4706.02, -49.2488, 100, 0), +(@PATH0, 42, -9829.85, -4685.8, -49.2461, 100, 0), +(@PATH0, 43, -9814.75, -4699.31, -49.2565, 100, 0), +(@PATH0, 44, -9803.68, -4716.14, -49.2294, 100, 0), +(@PATH0, 45, -9787.81, -4727.92, -49.2189, 100, 0), +(@PATH0, 46, -9780.87, -4732.07, -49.2576, 100, 0), +(@PATH0, 47, -9755.89, -4745.45, -49.3151, 100, 0), +(@PATH0, 48, -9751.84, -4751.82, -49.3166, 100, 0), +(@PATH0, 49, -9744.44, -4770.55, -49.2736, 100, 0), +(@PATH0, 50, -9738.76, -4785.71, -49.3193, 100, 0), +(@PATH0, 51, -9722.9, -4797.03, -49.2363, 100, 0), +(@PATH0, 52, -9707.77, -4802.65, -48.2808, 100, 0), +(@PATH0, 53, -9688.55, -4800.59, -48.6172, 100, 0), +(@PATH0, 54, -9668.74, -4803.05, -49.2412, 100, 0), +(@PATH0, 55, -9647.46, -4814.13, -49.3035, 100, 0), +(@PATH0, 56, -9642.3, -4819.55, -49.346, 100, 0), +(@PATH0, 57, -9639.36, -4835.5, -49.5477, 100, 0), +(@PATH0, 58, -9634.19, -4845.99, -49.3801, 100, 0), +(@PATH0, 59, -9618.6, -4858.64, -48.6574, 100, 0), +(@PATH0, 60, -9603.6, -4863.34, -48.2259, 100, 0), +(@PATH0, 61, -9586.09, -4856.18, -48.7782, 100, 0), +(@PATH0, 62, -9572.62, -4841.47, -48.9365, 100, 0), +(@PATH0, 63, -9567.14, -4826.14, -48.0559, 100, 0), +(@PATH0, 64, -9567.54, -4814.27, -47.4214, 100, 0), +(@PATH0, 65, -9570, -4798.32, -46.2289, 100, 0), +(@PATH0, 66, -9572.12, -4781.29, -45.4475, 100, 0), +(@PATH0, 67, -9574.88, -4762.27, -45.1159, 100, 0), +(@PATH0, 68, -9566.63, -4731.69, -48.2965, 100, 0), +(@PATH0, 69, -9568.63, -4712.32, -47.3648, 100, 0), +(@PATH0, 70, -9554.24, -4681.05, -46.6029, 100, 0), +(@PATH0, 71, -9542.46, -4665.06, -48.1912, 100, 0), +(@PATH1, 1, -10017.7, -4647.95, -49.2208, 100, 0), +(@PATH1, 2, -10003.8, -4654.64, -49.2208, 100, 0), +(@PATH1, 3, -9981.58, -4663.93, -49.1897, 100, 0), +(@PATH1, 4, -9950.29, -4671.73, -48.1528, 100, 0), +(@PATH1, 5, -9929.52, -4683.88, -48.958, 100, 0), +(@PATH1, 6, -9912.66, -4695.18, -49.1841, 100, 0), +(@PATH1, 7, -9898.56, -4702.3, -46.6121, 100, 0), +(@PATH1, 8, -9872.57, -4694.8, -49.0019, 100, 0), +(@PATH1, 9, -9854.3, -4686.15, -49.2403, 100, 0), +(@PATH1, 10, -9838.53, -4682.98, -49.2461, 100, 0), +(@PATH1, 11, -9814.08, -4695.94, -49.2461, 100, 0), +(@PATH1, 12, -9796.85, -4706.59, -49.2858, 100, 0), +(@PATH1, 13, -9791.76, -4729.25, -49.2182, 100, 0), +(@PATH1, 14, -9794.23, -4713.25, -49.2718, 100, 0), +(@PATH1, 15, -9807.46, -4700.01, -49.2571, 100, 0), +(@PATH1, 16, -9831.67, -4685.29, -49.2461, 100, 0), +(@PATH1, 17, -9846.91, -4684.28, -49.2461, 100, 0), +(@PATH1, 18, -9865.59, -4691.63, -49.2103, 100, 0), +(@PATH1, 19, -9893.55, -4703.19, -47.4117, 100, 0), +(@PATH1, 20, -9908, -4697.79, -48.5825, 100, 0), +(@PATH1, 21, -9924.93, -4686.92, -49.0918, 100, 0), +(@PATH1, 22, -9945.25, -4673.66, -48.0806, 100, 0), +(@PATH1, 23, -9976.33, -4665.55, -49.0996, 100, 0), +(@PATH1, 24, -9995.42, -4658.87, -49.2119, 100, 0), +(@PATH1, 25, -10009.2, -4650.6, -49.2208, 100, 0), +(@PATH1, 26, -10032.4, -4648.55, -49.2208, 100, 0), +(@PATH1, 27, -10053.4, -4659.28, -49.2208, 100, 0), +(@PATH1, 28, -10088.8, -4662.19, -49.2092, 100, 0), +(@PATH1, 29, -10113.1, -4674.93, -49.2373, 100, 0), +(@PATH1, 30, -10131.5, -4683.07, -49.2763, 100, 0), +(@PATH1, 31, -10151.2, -4681.23, -49.2851, 100, 0), +(@PATH1, 32, -10179.1, -4682.72, -49.3038, 100, 0), +(@PATH1, 33, -10196.7, -4691.4, -49.3079, 100, 0), +(@PATH1, 34, -10211.6, -4705.12, -49.232, 100, 0), +(@PATH1, 35, -10242.4, -4709.6, -48.4739, 100, 0), +(@PATH1, 36, -10266.2, -4705.85, -48.4166, 100, 0), +(@PATH1, 37, -10293.8, -4699, -48.427, 100, 0), +(@PATH1, 38, -10321.1, -4694.15, -48.7954, 100, 0), +(@PATH1, 39, -10301.1, -4697.56, -48.5059, 100, 0), +(@PATH1, 40, -10273.6, -4704.28, -48.3851, 100, 0), +(@PATH1, 41, -10249.8, -4708.83, -48.4055, 100, 0), +(@PATH1, 42, -10217.4, -4708.94, -49.1525, 100, 0), +(@PATH1, 43, -10202.5, -4696.22, -49.2906, 100, 0), +(@PATH1, 44, -10189.7, -4686.48, -49.3079, 100, 0), +(@PATH1, 45, -10158.4, -4681.18, -49.2888, 100, 0), +(@PATH1, 46, -10138.5, -4683.87, -49.2851, 100, 0), +(@PATH1, 47, -10119.4, -4678.61, -49.2487, 100, 0), +(@PATH1, 48, -10099.2, -4665.41, -49.2148, 100, 0), +(@PATH1, 49, -10063.9, -4662.4, -49.2186, 100, 0), +(@PATH1, 50, -10039.5, -4649.85, -49.2208, 100, 0), +(@PATH2, 1, -4187.63, -4614.2, -8.1346, 4.30119, 0), +(@PATH2, 2, -4185.98, -4695.78, -8.45387, 4.76064, 0), +(@PATH2, 3, -4205.68, -4740.42, -7.87031, 4.04987, 0), +(@PATH2, 4, -4216.77, -4776.76, -10.4417, 4.65855, 0), +(@PATH2, 5, -4296.55, -4834.03, -4.87228, 2.45552, 0), +(@PATH2, 6, -4237.93, -4790.58, -10.9209, 0.857235, 0), +(@PATH2, 7, -4188.01, -4689.84, -10.2558, 1.54053, 0), +(@PATH3, 1, -11175.4, -4102.79, -9.10943, 4.32634, 0), +(@PATH3, 2, -11181.6, -4131.85, -8.30176, 4.49914, 0), +(@PATH3, 3, -11190.3, -4184.73, -8.7279, 4.60516, 0), +(@PATH4, 1, -3030.62, -4244.16, -11.4944, 100, 0), +(@PATH4, 2, -3055.55, -4253.96, -10.8136, 100, 0), +(@PATH4, 3, -3074.29, -4263.33, -11.1107, 100, 0), +(@PATH4, 4, -3089.33, -4261.75, -9.56308, 100, 0), +(@PATH4, 5, -3108.22, -4257.35, -7.88015, 100, 0), +(@PATH4, 6, -3131.18, -4264.88, -11.2028, 100, 0), +(@PATH4, 7, -3138.6, -4279.61, -14.8934, 100, 0), +(@PATH4, 8, -3142.43, -4298.23, -19.011, 100, 0), +(@PATH4, 9, -3136.88, -4332.61, -17.0448, 100, 0), +(@PATH4, 10, -3123.3, -4363.71, -12.0653, 100, 0), +(@PATH4, 11, -3118.96, -4379.8, -14.0912, 100, 0), +(@PATH4, 12, -3110.22, -4401.15, -15.6736, 100, 0), +(@PATH4, 13, -3090.6, -4419.03, -13.2305, 100, 0), +(@PATH4, 14, -3063.29, -4428.8, -15.5224, 100, 0), +(@PATH4, 15, -3042.32, -4435.48, -14.76, 100, 0), +(@PATH4, 16, -3028.11, -4446.66, -15.6206, 100, 0), +(@PATH4, 17, -3013.37, -4453, -18.9248, 100, 0), +(@PATH4, 18, -2982.82, -4462.25, -18.0416, 100, 0), +(@PATH4, 19, -2958.38, -4472.72, -16.8835, 100, 0), +(@PATH4, 20, -2926.12, -4479.41, -18.2759, 100, 0), +(@PATH4, 21, -2897.41, -4475.57, -17.7025, 100, 0), +(@PATH4, 22, -2860.94, -4466.87, -18.2782, 100, 0), +(@PATH4, 23, -2826.48, -4457.91, -16.5921, 100, 0), +(@PATH4, 24, -2800.69, -4437.85, -12.1828, 100, 0), +(@PATH4, 25, -2802.66, -4411.02, -8.17544, 100, 0), +(@PATH4, 26, -2812.55, -4389.85, -10.6167, 100, 0), +(@PATH4, 27, -2832.89, -4364.63, -15.046, 100, 0), +(@PATH4, 28, -2862.55, -4326.08, -9.47994, 100, 0), +(@PATH4, 29, -2881, -4302.39, -13.1053, 100, 0), +(@PATH4, 30, -2906.11, -4272.7, -6.36328, 100, 0), +(@PATH4, 31, -2940.94, -4260.35, -5.70127, 100, 0), +(@PATH4, 32, -2972.85, -4253.79, -6.9984, 100, 0), +(@PATH4, 33, -3005.32, -4247.76, -7.4105, 100, 0), +(@PATH5, 1, -4102.56, -4588.74, -53.1956, 100, 0), +(@PATH5, 2, -4112.05, -4575.82, -52.5505, 100, 0), +(@PATH5, 3, -4114.17, -4560.13, -48.6823, 100, 0), +(@PATH5, 4, -4108.5, -4537.78, -39.9451, 100, 0), +(@PATH5, 5, -4117.58, -4509.19, -36.3802, 100, 0), +(@PATH5, 6, -4140.31, -4512.26, -31.8574, 100, 0), +(@PATH5, 7, -4152.69, -4521.02, -34.3289, 100, 0), +(@PATH5, 8, -4156.88, -4535.06, -38.3804, 100, 0), +(@PATH5, 9, -4157.71, -4551.9, -36.9737, 100, 0), +(@PATH5, 10, -4155.46, -4573.13, -35.5532, 100, 0), +(@PATH5, 11, -4153.25, -4591.41, -31.0155, 100, 0), +(@PATH5, 12, -4138.95, -4604.08, -35.8834, 100, 0), +(@PATH5, 13, -4119.61, -4620.42, -41.622, 100, 0), +(@PATH5, 14, -4094.42, -4620.28, -42.2264, 100, 0), +(@PATH5, 15, -4070.56, -4625.54, -34.091, 100, 0), +(@PATH5, 16, -4054.21, -4633.18, -33.5871, 100, 0), +(@PATH5, 17, -4034.17, -4641.97, -34.0616, 100, 0), +(@PATH5, 18, -4026.06, -4646.81, -37.4944, 100, 0), +(@PATH5, 19, -4006.6, -4655.28, -31.8536, 100, 0), +(@PATH5, 20, -3993.96, -4660.93, -24.2768, 100, 0), +(@PATH5, 21, -3982.08, -4654.01, -17.2645, 100, 0), +(@PATH5, 22, -3975, -4640.6, -15.0961, 100, 0), +(@PATH5, 23, -3980.59, -4620.78, -15.5821, 100, 0), +(@PATH5, 24, -3988.32, -4610.43, -15.2164, 100, 0), +(@PATH5, 25, -4011.74, -4601.65, -22.6568, 100, 0), +(@PATH5, 26, -4029.15, -4611.47, -28.8181, 100, 0), +(@PATH5, 27, -4053.27, -4624.59, -32.5492, 100, 0), +(@PATH5, 28, -4077.43, -4634.86, -34.3769, 100, 0), +(@PATH5, 29, -4101.83, -4648.47, -33.3999, 100, 0), +(@PATH5, 30, -4117.03, -4658.54, -32.539, 100, 0), +(@PATH5, 31, -4132.58, -4672.59, -33.3039, 100, 0), +(@PATH5, 32, -4157.07, -4685.91, -39.8625, 100, 0), +(@PATH5, 33, -4165.17, -4689.03, -41.6243, 100, 0), +(@PATH5, 34, -4177.13, -4675.8, -38.3298, 100, 0), +(@PATH5, 35, -4177.54, -4649.28, -32.7652, 100, 0), +(@PATH5, 36, -4167.21, -4642.11, -28.9048, 100, 0), +(@PATH5, 37, -4154.33, -4628.05, -29.0151, 100, 0), +(@PATH5, 38, -4147.43, -4620.21, -30.9359, 100, 0), +(@PATH5, 39, -4133.35, -4619.86, -34.7052, 100, 0), +(@PATH5, 40, -4119.14, -4619.5, -40.6336, 100, 0), +(@PATH5, 41, -4111.3, -4629.78, -39.1487, 100, 0), +(@PATH5, 42, -4104.19, -4641.1, -35.5348, 100, 0), +(@PATH5, 43, -4094.39, -4652.71, -35.0967, 100, 0), +(@PATH5, 44, -4082.17, -4671.8, -37.4537, 100, 0), +(@PATH5, 45, -4066.37, -4689.31, -48.5693, 100, 0), +(@PATH5, 46, -4046.24, -4690.54, -50.8448, 100, 0), +(@PATH5, 47, -4035.83, -4682.47, -45.8101, 100, 0), +(@PATH5, 48, -4027.91, -4676.69, -44.4083, 100, 0), +(@PATH5, 49, -4016.99, -4662.36, -40.466, 100, 0), +(@PATH5, 50, -4016.13, -4644.71, -30.9278, 100, 0), +(@PATH5, 51, -4025.79, -4626.72, -29.84, 100, 0), +(@PATH5, 52, -4034.8, -4612.16, -30.1531, 100, 0), +(@PATH5, 53, -4042.38, -4599.75, -34.1753, 100, 0), +(@PATH5, 54, -4050.77, -4587.42, -39.1146, 100, 0), +(@PATH5, 55, -4062.23, -4568.8, -48.1368, 100, 0), +(@PATH5, 56, -4079.14, -4554.61, -44.9805, 100, 0), +(@PATH5, 57, -4086.3, -4549.44, -41.8286, 100, 0), +(@PATH5, 58, -4088.82, -4537.58, -39.5754, 100, 0), +(@PATH5, 59, -4091.87, -4519.87, -35.8824, 100, 0), +(@PATH5, 60, -4099.53, -4510.1, -35.2466, 100, 0), +(@PATH5, 61, -4096.88, -4503.23, -32.0652, 100, 0), +(@PATH5, 62, -4090.74, -4498.44, -31.4301, 100, 0), +(@PATH5, 63, -4072.95, -4492.27, -30.8572, 100, 0), +(@PATH5, 64, -4052.12, -4487.44, -26.0852, 100, 0), +(@PATH5, 65, -4039.23, -4494.65, -26.6981, 100, 0), +(@PATH5, 66, -4038.89, -4506.44, -28.8954, 100, 0), +(@PATH5, 67, -4047.26, -4524.1, -34.5523, 100, 0), +(@PATH5, 68, -4052.13, -4539, -40.8629, 100, 0), +(@PATH5, 69, -4062.55, -4546.17, -43.1663, 100, 0), +(@PATH5, 70, -4073.86, -4559.18, -45.1477, 100, 0), +(@PATH5, 71, -4065.4, -4575.65, -45.0676, 100, 0), +(@PATH5, 72, -4065, -4592.56, -41.9831, 100, 0), +(@PATH5, 73, -4067.98, -4603.35, -42.4004, 100, 0), +(@PATH5, 74, -4087.05, -4608.21, -47.3923, 100, 0), +(@PATH5, 75, -4096.04, -4598.11, -50.857, 100, 0), +(@PATH6, 1, -3993.77, -4745.56, -29.1755, 100, 0), +(@PATH6, 2, -3985.37, -4743, -26.4626, 100, 0), +(@PATH6, 3, -3976.09, -4734.27, -25.523, 100, 0), +(@PATH6, 4, -3968.47, -4728.48, -25.0439, 100, 0), +(@PATH6, 5, -3962.43, -4723.76, -24.2794, 100, 0), +(@PATH6, 6, -3945.25, -4731.82, -21.7509, 100, 0), +(@PATH6, 7, -3928.51, -4745.69, -19.8885, 100, 0), +(@PATH6, 8, -3920.13, -4750.62, -20.1839, 100, 0), +(@PATH6, 9, -3917.12, -4761.02, -23.9517, 100, 0), +(@PATH6, 10, -3914.34, -4777.19, -28.7826, 100, 0), +(@PATH6, 11, -3908.21, -4786.5, -32.1492, 100, 0), +(@PATH6, 12, -3891.94, -4791.36, -38.9642, 100, 0), +(@PATH6, 13, -3877.35, -4792.78, -41.746, 100, 0), +(@PATH6, 14, -3852.21, -4777.36, -40.3801, 100, 0), +(@PATH6, 15, -3839.8, -4769.47, -35.9343, 100, 0), +(@PATH6, 16, -3829.1, -4762.66, -34.7203, 100, 0), +(@PATH6, 17, -3821, -4746.53, -30.0452, 100, 0), +(@PATH6, 18, -3813.05, -4734.29, -25.6092, 100, 0), +(@PATH6, 19, -3821.02, -4720.48, -19.2793, 100, 0), +(@PATH6, 20, -3836.9, -4723.6, -19.042, 100, 0), +(@PATH6, 21, -3850.66, -4733.58, -21.9891, 100, 0), +(@PATH6, 22, -3858.81, -4740.94, -22.8184, 100, 0), +(@PATH6, 23, -3867.43, -4747.03, -24.1883, 100, 0), +(@PATH6, 24, -3878.85, -4752.68, -24.8994, 100, 0), +(@PATH6, 25, -3892.97, -4760.37, -26.2831, 100, 0), +(@PATH6, 26, -3911.25, -4768.12, -25.824, 100, 0), +(@PATH6, 27, -3921.43, -4769.59, -25.9358, 100, 0), +(@PATH6, 28, -3942.06, -4767.52, -29.2243, 100, 0), +(@PATH6, 29, -3951.98, -4763.25, -27.2036, 100, 0), +(@PATH6, 30, -3951.73, -4748.25, -24.5187, 100, 0), +(@PATH6, 31, -3951.68, -4731.77, -23.5419, 100, 0), +(@PATH6, 32, -3947.06, -4717.95, -18.8374, 100, 0), +(@PATH6, 33, -3933.56, -4706.95, -14.6858, 100, 0), +(@PATH6, 34, -3914.81, -4711.37, -9.35688, 100, 0), +(@PATH6, 35, -3901.29, -4706.21, -10.1683, 100, 0), +(@PATH6, 36, -3890.38, -4697.49, -11.4398, 100, 0), +(@PATH6, 37, -3894.93, -4683.9, -9.58825, 100, 0), +(@PATH6, 38, -3913.73, -4670.61, -7.47174, 100, 0), +(@PATH6, 39, -3928.54, -4660.59, -8.97345, 100, 0), +(@PATH6, 40, -3944.46, -4665.39, -9.24581, 100, 0), +(@PATH6, 41, -3958.25, -4679.84, -15.6683, 100, 0), +(@PATH6, 42, -3970.06, -4693.55, -20.5917, 100, 0), +(@PATH6, 43, -3983.8, -4693.41, -22.2712, 100, 0), +(@PATH6, 44, -3996.07, -4683.95, -25.4687, 100, 0), +(@PATH6, 45, -4005.23, -4677.4, -31.6823, 100, 0), +(@PATH6, 46, -4022.95, -4667.63, -42.7108, 100, 0), +(@PATH6, 47, -4034.24, -4677.5, -45.2883, 100, 0), +(@PATH6, 48, -4047.06, -4690.78, -51.4895, 100, 0), +(@PATH6, 49, -4052.75, -4710.03, -47.8305, 100, 0), +(@PATH6, 50, -4046.91, -4719.08, -39.714, 100, 0), +(@PATH6, 51, -4036.04, -4731.03, -34.1886, 100, 0), +(@PATH6, 52, -4019.94, -4741.63, -33.081, 100, 0), +(@PATH6, 53, -4001.05, -4745.26, -30.7453, 100, 0), +(@PATH16, 1, 3195.66, 1723.26, -48.0417, 0, 0), +(@PATH16, 2, 3172.18, 1728.67, -46.7351, 0, 0), +(@PATH16, 3, 3159.84, 1742.1, -47.1164, 0, 0), +(@PATH16, 4, 3150.54, 1759.82, -48.9894, 0, 0), +(@PATH16, 5, 3145.21, 1780, -48.5501, 0, 0), +(@PATH16, 6, 3150.68, 1795.5, -43.965, 0, 0), +(@PATH16, 7, 3159.02, 1808.92, -46.8611, 0, 0), +(@PATH16, 8, 3147.04, 1829.82, -48.9126, 0, 0), +(@PATH16, 9, 3124.38, 1836.32, -49.3035, 0, 0), +(@PATH16, 10, 3110.18, 1853.61, -49.3035, 0, 0), +(@PATH16, 11, 3098.96, 1879.04, -49.1987, 0, 0), +(@PATH16, 12, 3099.79, 1899.64, -45.145, 0, 0), +(@PATH16, 13, 3093.3, 1918.57, -48.7809, 0, 0), +(@PATH16, 14, 3074.24, 1939.81, -49.2098, 0, 0), +(@PATH16, 15, 3047.84, 1955.77, -49.3166, 0, 0), +(@PATH16, 16, 3028.47, 1970.39, -49.2451, 0, 0), +(@PATH16, 17, 3019.16, 1982.83, -48.9951, 0, 0), +(@PATH16, 18, 2988.32, 1998.35, -49.1403, 0, 0), +(@PATH16, 19, 2980.85, 2004.86, -48.0391, 0, 0), +(@PATH16, 20, 2954.49, 2018.02, -47.8042, 0, 0), +(@PATH16, 21, 2925.33, 2045.1, -49.2827, 0, 0), +(@PATH16, 22, 2893.02, 2053.51, -49.1987, 0, 0), +(@PATH16, 23, 2865.85, 2054.29, -48.9753, 0, 0), +(@PATH16, 24, 2843.77, 2055.25, -49.09, 0, 0), +(@PATH16, 25, 2822.48, 2054.12, -48.8547, 0, 0), +(@PATH16, 26, 2788.7, 2062.92, -48.8734, 0, 0), +(@PATH16, 27, 2765.5, 2066.17, -48.0693, 0, 0), +(@PATH16, 28, 2788.7, 2062.92, -48.8734, 0, 0), +(@PATH16, 29, 2822.48, 2054.12, -48.8547, 0, 0), +(@PATH16, 30, 2843.77, 2055.25, -49.09, 0, 0), +(@PATH16, 31, 2865.85, 2054.29, -48.9753, 0, 0), +(@PATH16, 32, 2893.02, 2053.51, -49.1987, 0, 0), +(@PATH16, 33, 2925.33, 2045.1, -49.2827, 0, 0), +(@PATH16, 34, 2954.49, 2018.02, -47.8042, 0, 0), +(@PATH16, 35, 2980.85, 2004.86, -48.0391, 0, 0), +(@PATH16, 36, 2988.32, 1998.35, -49.1403, 0, 0), +(@PATH16, 37, 3019.16, 1982.83, -48.9951, 0, 0), +(@PATH16, 38, 3028.47, 1970.39, -49.2451, 0, 0), +(@PATH16, 39, 3047.84, 1955.77, -49.3166, 0, 0), +(@PATH16, 40, 3074.24, 1939.81, -49.2098, 0, 0), +(@PATH16, 41, 3093.3, 1918.57, -48.7809, 0, 0), +(@PATH16, 42, 3099.79, 1899.64, -45.145, 0, 0), +(@PATH16, 43, 3098.96, 1879.04, -49.1987, 0, 0), +(@PATH16, 44, 3110.18, 1853.61, -49.3035, 0, 0), +(@PATH16, 45, 3124.38, 1836.32, -49.3035, 0, 0), +(@PATH16, 46, 3147.04, 1829.82, -48.9126, 0, 0), +(@PATH16, 47, 3159.02, 1808.92, -46.8611, 0, 0), +(@PATH16, 48, 3150.68, 1795.5, -43.965, 0, 0), +(@PATH16, 49, 3145.21, 1780, -48.5501, 0, 0), +(@PATH16, 50, 3150.5, 1759.88, -48.9967, 0, 0), +(@PATH16, 51, 3159.84, 1742.1, -47.1164, 0, 0), +(@PATH16, 52, 3172.18, 1728.67, -46.7351, 0, 0), +(@PATH16, 53, 3195.66, 1723.26, -48.0417, 0, 0), +(@PATH16, 54, 3222.93, 1722.39, -49.2639, 0, 0), +(@PATH17, 1, 3219.86, 1066.66, -48.8948, 0, 0), +(@PATH17, 2, 3207.93, 1090.38, -47.2766, 0, 0), +(@PATH17, 3, 3194.55, 1111.68, -46.8454, 0, 0), +(@PATH17, 4, 3181.08, 1131.85, -44.6933, 0, 0), +(@PATH17, 5, 3178.32, 1156.42, -45.4785, 0, 0), +(@PATH17, 6, 3176.88, 1185.59, -45.4368, 0, 0), +(@PATH17, 7, 3180.24, 1206.31, -43.9424, 0, 0), +(@PATH17, 8, 3190.4, 1227.34, -48.0622, 0, 0), +(@PATH17, 9, 3193.39, 1253.55, -49.5105, 0, 0), +(@PATH17, 10, 3191.81, 1284.17, -48.9205, 0, 0), +(@PATH17, 11, 3213.59, 1302.7, -49.3019, 0, 0), +(@PATH17, 12, 3226.42, 1327.89, -49.3019, 0, 0), +(@PATH17, 13, 3227.66, 1352.52, -49.283, 0, 0), +(@PATH17, 14, 3220.75, 1378.08, -49.2146, 0, 0), +(@PATH17, 15, 3223.33, 1416.28, -49.1856, 0, 0), +(@PATH17, 16, 3237.03, 1444.51, -49.2355, 0, 0), +(@PATH17, 17, 3225.31, 1473.26, -49.2002, 0, 0), +(@PATH17, 18, 3215.7, 1516.21, -49.288, 0, 0), +(@PATH17, 19, 3199.54, 1542.93, -49.2687, 0, 0), +(@PATH17, 20, 3186.1, 1575.29, -49.2389, 0, 0), +(@PATH17, 21, 3189.74, 1608.76, -49.3011, 0, 0), +(@PATH17, 22, 3207.19, 1630.43, -49.3062, 0, 0), +(@PATH17, 23, 3223.05, 1654.72, -49.3094, 0, 0), +(@PATH17, 24, 3245.56, 1679.74, -49.3899, 0, 0), +(@PATH17, 25, 3242.98, 1723.86, -49.3418, 0, 0), +(@PATH17, 26, 3245.56, 1679.74, -49.3899, 0, 0), +(@PATH17, 27, 3223.05, 1654.72, -49.3094, 0, 0), +(@PATH17, 28, 3207.19, 1630.43, -49.3062, 0, 0), +(@PATH17, 29, 3189.74, 1608.76, -49.3011, 0, 0), +(@PATH17, 30, 3186.1, 1575.29, -49.2389, 0, 0), +(@PATH17, 31, 3199.54, 1542.93, -49.2687, 0, 0), +(@PATH17, 32, 3215.7, 1516.21, -49.288, 0, 0), +(@PATH17, 33, 3225.31, 1473.26, -49.2002, 0, 0), +(@PATH17, 34, 3237.03, 1444.51, -49.2355, 0, 0), +(@PATH17, 35, 3223.33, 1416.28, -49.1856, 0, 0), +(@PATH17, 36, 3220.75, 1378.08, -49.2146, 0, 0), +(@PATH17, 37, 3227.66, 1352.52, -49.283, 0, 0), +(@PATH17, 38, 3226.42, 1327.89, -49.3019, 0, 0), +(@PATH17, 39, 3213.59, 1302.7, -49.3019, 0, 0), +(@PATH17, 40, 3191.81, 1284.17, -48.9205, 0, 0), +(@PATH17, 41, 3193.39, 1253.55, -49.5105, 0, 0), +(@PATH17, 42, 3190.4, 1227.34, -48.0622, 0, 0), +(@PATH17, 43, 3180.24, 1206.31, -43.9424, 0, 0), +(@PATH17, 44, 3176.88, 1185.59, -45.4368, 0, 0), +(@PATH17, 45, 3178.32, 1156.42, -45.4785, 0, 0), +(@PATH17, 46, 3181.08, 1131.85, -44.6933, 0, 0), +(@PATH17, 47, 3194.55, 1111.68, -46.8454, 0, 0), +(@PATH17, 48, 3207.86, 1090.51, -47.1577, 0, 0), +(@PATH17, 49, 3219.86, 1066.66, -48.8948, 0, 0), +(@PATH17, 50, 3229.62, 1042.29, -48.938, 0, 0), +(@PATH18, 1, 3237.64, 529.066, -49.161, 0, 0), +(@PATH18, 2, 3245.98, 509.615, -49.2072, 0, 0), +(@PATH18, 3, 3244.24, 480.189, -48.5247, 0, 0), +(@PATH18, 4, 3236.81, 451.482, -47.3299, 0, 0), +(@PATH18, 5, 3229.51, 421.778, -46.6712, 0, 0), +(@PATH18, 6, 3232.34, 398.549, -48.8765, 0, 0), +(@PATH18, 7, 3232.09, 378.384, -47.2272, 0, 0), +(@PATH18, 8, 3236.05, 354.162, -47.1681, 0, 0), +(@PATH18, 9, 3225.4, 330.035, -46.4199, 0, 0), +(@PATH18, 10, 3209.58, 308.727, -45.1829, 0, 0), +(@PATH18, 11, 3194.01, 282.987, -44.1269, 0, 0), +(@PATH18, 12, 3184.9, 250.452, -42.8944, 0, 0), +(@PATH18, 13, 3180.68, 215.665, -43.4813, 0, 0), +(@PATH18, 14, 3190.05, 191.407, -47.2638, 0, 0), +(@PATH18, 15, 3202.46, 172.926, -49.1386, 0, 0), +(@PATH18, 16, 3198.71, 154.542, -47.6138, 0, 0), +(@PATH18, 17, 3191.65, 129.38, -46.3875, 0, 0), +(@PATH18, 18, 3199.24, 111.015, -47.9738, 0, 0), +(@PATH18, 19, 3215.44, 80.8268, -49.3019, 0, 0), +(@PATH18, 20, 3225.97, 70.9052, -49.3019, 0, 0), +(@PATH18, 21, 3215.46, 39.4659, -49.283, 0, 0), +(@PATH18, 22, 3218.06, 14.8127, -47.4764, 0, 0), +(@PATH18, 23, 3232.95, 2.20247, -47.6778, 0, 0), +(@PATH18, 24, 3241.45, -16.7218, -48.2038, 0, 0), +(@PATH18, 25, 3240.34, -45.9271, -45.0433, 0, 0), +(@PATH18, 26, 3236.31, -72.9149, -46.0238, 0, 0), +(@PATH18, 27, 3225.42, -94.1089, -46.0986, 0, 0), +(@PATH18, 28, 3215.18, -125.027, -47.4287, 0, 0), +(@PATH18, 29, 3198.15, -144.379, -48.9029, 0, 0), +(@PATH18, 30, 3195.2, -160.021, -48.6686, 0, 0), +(@PATH18, 31, 3190.23, -188.384, -46.621, 0, 0), +(@PATH18, 32, 3194.87, -215.717, -49.6974, 0, 0), +(@PATH18, 33, 3213.64, -245.577, -49.1524, 0, 0), +(@PATH18, 34, 3233.05, -275.715, -49.2094, 0, 0), +(@PATH18, 35, 3234.99, -304.343, -49.2168, 0, 0), +(@PATH18, 36, 3220.77, -329.858, -49.3934, 0, 0), +(@PATH18, 37, 3197.92, -345.281, -48.1115, 0, 0), +(@PATH18, 38, 3181.14, -362.376, -44.0617, 0, 0), +(@PATH18, 39, 3170.62, -379.924, -32.2668, 0, 0), +(@PATH18, 40, 3167.32, -395.326, -21.2015, 0, 0), +(@PATH18, 41, 3162.11, -435.289, -17.73, 0, 0), +(@PATH18, 42, 3167.32, -395.326, -21.2015, 0, 0), +(@PATH18, 43, 3170.62, -379.924, -32.2668, 0, 0), +(@PATH18, 44, 3181.14, -362.376, -44.0617, 0, 0), +(@PATH18, 45, 3197.92, -345.281, -48.1115, 0, 0), +(@PATH18, 46, 3220.77, -329.858, -49.3934, 0, 0), +(@PATH18, 47, 3234.99, -304.343, -49.2168, 0, 0), +(@PATH18, 48, 3233.05, -275.715, -49.2094, 0, 0), +(@PATH18, 49, 3213.64, -245.577, -49.1524, 0, 0), +(@PATH18, 50, 3194.87, -215.717, -49.6974, 0, 0), +(@PATH18, 51, 3190.23, -188.384, -46.621, 0, 0), +(@PATH18, 52, 3195.2, -160.021, -48.6686, 0, 0), +(@PATH18, 53, 3198.15, -144.379, -48.9029, 0, 0), +(@PATH18, 54, 3215.18, -125.027, -47.4287, 0, 0), +(@PATH18, 55, 3225.42, -94.1089, -46.0986, 0, 0), +(@PATH18, 56, 3236.31, -72.9149, -46.0238, 0, 0), +(@PATH18, 57, 3240.34, -45.9271, -45.0433, 0, 0), +(@PATH18, 58, 3241.45, -16.7218, -48.2038, 0, 0), +(@PATH18, 59, 3232.95, 2.20247, -47.6778, 0, 0), +(@PATH18, 60, 3218.06, 14.8127, -47.4764, 0, 0), +(@PATH18, 61, 3215.46, 39.4659, -49.283, 0, 0), +(@PATH18, 62, 3225.97, 70.9052, -49.3019, 0, 0), +(@PATH18, 63, 3215.44, 80.8268, -49.3019, 0, 0), +(@PATH18, 64, 3199.24, 111.015, -47.9738, 0, 0), +(@PATH18, 65, 3191.65, 129.38, -46.3875, 0, 0), +(@PATH18, 66, 3198.71, 154.542, -47.6138, 0, 0), +(@PATH18, 67, 3202.46, 172.926, -49.1386, 0, 0), +(@PATH18, 68, 3190.05, 191.407, -47.2638, 0, 0), +(@PATH18, 69, 3180.68, 215.665, -43.4813, 0, 0), +(@PATH18, 70, 3184.9, 250.452, -42.8944, 0, 0), +(@PATH18, 71, 3194.01, 282.987, -44.1269, 0, 0), +(@PATH18, 72, 3209.58, 308.727, -45.1829, 0, 0), +(@PATH18, 73, 3225.4, 330.035, -46.4199, 0, 0), +(@PATH18, 74, 3236.05, 354.162, -47.1681, 0, 0), +(@PATH18, 75, 3232.09, 378.384, -47.2272, 0, 0), +(@PATH18, 76, 3232.34, 398.549, -48.8765, 0, 0), +(@PATH18, 77, 3229.51, 421.778, -46.6712, 0, 0), +(@PATH18, 78, 3236.81, 451.482, -47.3299, 0, 0), +(@PATH18, 79, 3244.24, 480.189, -48.5247, 0, 0), +(@PATH18, 80, 3245.98, 509.615, -49.2072, 0, 0), +(@PATH18, 81, 3237.64, 529.066, -49.161, 0, 0), +(@PATH18, 82, 3222.14, 543.139, -49.3217, 0, 0), +(@PATH19, 1, 1516.82, -5383.69, -28.8906, 0, 0), +(@PATH19, 2, 1474.84, -5385.46, -29.2864, 0, 0), +(@PATH19, 3, 1447.96, -5383.48, -25.5438, 0, 0), +(@PATH19, 4, 1412.76, -5384.64, -29.4294, 0, 0), +(@PATH19, 5, 1382.15, -5391.2, -28.4388, 0, 0), +(@PATH19, 6, 1354.78, -5391.48, -28.6763, 0, 0), +(@PATH19, 7, 1334.22, -5378.4, -28.8418, 0, 0), +(@PATH19, 8, 1335.49, -5355.21, -28.7994, 0, 0), +(@PATH19, 9, 1344.53, -5325.68, -28.0713, 0, 0), +(@PATH19, 10, 1328.27, -5309.04, -31.7749, 0, 0), +(@PATH19, 11, 1304.01, -5312.75, -31.2355, 0, 0), +(@PATH19, 12, 1284.62, -5347.43, -37.3962, 0, 0), +(@PATH19, 13, 1286.44, -5381.06, -48.0423, 0, 0), +(@PATH19, 14, 1284.71, -5401.73, -48.8887, 0, 0), +(@PATH19, 15, 1287.05, -5438.85, -54.8639, 0, 0), +(@PATH19, 16, 1305.02, -5456.57, -56.5516, 0, 0), +(@PATH19, 17, 1317.34, -5496.39, -55.8837, 0, 0), +(@PATH19, 18, 1305.02, -5456.57, -56.5516, 0, 0), +(@PATH19, 19, 1287.05, -5438.85, -54.8639, 0, 0), +(@PATH19, 20, 1284.74, -5401.92, -48.8684, 0, 0), +(@PATH19, 21, 1286.44, -5381.06, -48.0423, 0, 0), +(@PATH19, 22, 1284.62, -5347.43, -37.3962, 0, 0), +(@PATH19, 23, 1304.01, -5312.75, -31.2355, 0, 0), +(@PATH19, 24, 1328.27, -5309.04, -31.7749, 0, 0), +(@PATH19, 25, 1344.53, -5325.68, -28.0713, 0, 0), +(@PATH19, 26, 1335.49, -5355.21, -28.7994, 0, 0), +(@PATH19, 27, 1334.22, -5378.4, -28.8418, 0, 0), +(@PATH19, 28, 1354.78, -5391.48, -28.6763, 0, 0), +(@PATH19, 29, 1382.15, -5391.2, -28.4388, 0, 0), +(@PATH19, 30, 1412.76, -5384.64, -29.4294, 0, 0), +(@PATH19, 31, 1447.96, -5383.48, -25.5438, 0, 0), +(@PATH19, 32, 1474.84, -5385.46, -29.2864, 0, 0), +(@PATH19, 33, 1516.82, -5383.69, -28.8906, 0, 0), +(@PATH19, 34, 1546.04, -5379.32, -32.5986, 0, 0), +(@PATH20, 1, 1254.18, -5419.49, -52.4718, 0, 0), +(@PATH20, 2, 1229.28, -5435.86, -56.9902, 0, 0), +(@PATH20, 3, 1208.77, -5447.44, -59.6652, 0, 0), +(@PATH20, 4, 1187.96, -5453.08, -61.9978, 0, 0), +(@PATH20, 5, 1153.77, -5448.21, -64.5154, 0, 0), +(@PATH20, 6, 1124.3, -5439.63, -63.204, 0, 0), +(@PATH20, 7, 1100.61, -5425.71, -61.8492, 0, 0), +(@PATH20, 8, 1080.52, -5423.09, -60.7825, 0, 0), +(@PATH20, 9, 1055.61, -5418.48, -58.5112, 0, 0), +(@PATH20, 10, 1026.96, -5411.6, -55.9621, 0, 0), +(@PATH20, 11, 1002.2, -5421.31, -52.5091, 0, 0), +(@PATH20, 12, 978.418, -5425.1, -52.5559, 0, 0), +(@PATH20, 13, 959.892, -5425.46, -49.9403, 0, 0), +(@PATH20, 14, 939.542, -5439.23, -53.9722, 0, 0), +(@PATH20, 15, 924.992, -5446.01, -55.8501, 0, 0), +(@PATH20, 16, 902.285, -5443.91, -58.5748, 0, 0), +(@PATH20, 17, 880.687, -5439.05, -59.7106, 0, 0), +(@PATH20, 18, 850.202, -5453.35, -60.1957, 0, 0), +(@PATH20, 19, 880.687, -5439.05, -59.7106, 0, 0), +(@PATH20, 20, 902.285, -5443.91, -58.5748, 0, 0), +(@PATH20, 21, 924.992, -5446.01, -55.8501, 0, 0), +(@PATH20, 22, 939.542, -5439.23, -53.9722, 0, 0), +(@PATH20, 23, 959.892, -5425.46, -49.9403, 0, 0), +(@PATH20, 24, 978.418, -5425.1, -52.5559, 0, 0), +(@PATH20, 25, 1002.2, -5421.31, -52.5091, 0, 0), +(@PATH20, 26, 1026.96, -5411.6, -55.9621, 0, 0), +(@PATH20, 27, 1055.61, -5418.48, -58.5112, 0, 0), +(@PATH20, 28, 1080.52, -5423.09, -60.7825, 0, 0), +(@PATH20, 29, 1100.61, -5425.71, -61.8492, 0, 0), +(@PATH20, 30, 1124.3, -5439.63, -63.204, 0, 0), +(@PATH20, 31, 1153.77, -5448.21, -64.5154, 0, 0), +(@PATH20, 32, 1187.96, -5453.08, -61.9978, 0, 0), +(@PATH20, 33, 1208.77, -5447.44, -59.6652, 0, 0), +(@PATH20, 34, 1229.28, -5435.86, -56.9902, 0, 0), +(@PATH20, 35, 1254.18, -5419.49, -52.4718, 0, 0), +(@PATH20, 36, 1284.58, -5416.16, -50.2873, 0, 0), +(@PATH21, 1, 884.764, -5424.27, -58.0952, 0, 0), +(@PATH21, 2, 860.038, -5429.36, -58.3245, 0, 0), +(@PATH21, 3, 840.054, -5447.57, -59.1454, 0, 0), +(@PATH21, 4, 808.626, -5450.2, -55.6828, 0, 0), +(@PATH21, 5, 785.226, -5449.35, -55.0896, 0, 0), +(@PATH21, 6, 752.365, -5448.88, -57.3383, 0, 0), +(@PATH21, 7, 710.335, -5452.75, -57.6953, 0, 0), +(@PATH21, 8, 683.327, -5449.81, -59.3469, 0, 0), +(@PATH21, 9, 655.47, -5444.36, -59.5234, 0, 0), +(@PATH21, 10, 651.573, -5424.52, -58.0701, 0, 0), +(@PATH21, 11, 618.405, -5414.9, -62.8057, 0, 0), +(@PATH21, 12, 588.85, -5403.26, -64.4017, 0, 0), +(@PATH21, 13, 542.927, -5406.28, -62.6428, 0, 0), +(@PATH21, 14, 511.854, -5405.75, -58.5615, 0, 0), +(@PATH21, 15, 482.236, -5413.69, -57.8578, 0, 0), +(@PATH21, 16, 445.743, -5419.08, -58.4638, 0, 0), +(@PATH21, 17, 482.236, -5413.69, -57.8578, 0, 0), +(@PATH21, 18, 511.854, -5405.75, -58.5615, 0, 0), +(@PATH21, 19, 542.927, -5406.28, -62.6428, 0, 0), +(@PATH21, 20, 588.85, -5403.26, -64.4017, 0, 0), +(@PATH21, 21, 618.405, -5414.9, -62.8057, 0, 0), +(@PATH21, 22, 651.573, -5424.52, -58.0701, 0, 0), +(@PATH21, 23, 655.47, -5444.36, -59.5234, 0, 0), +(@PATH21, 24, 683.327, -5449.81, -59.3469, 0, 0), +(@PATH21, 25, 710.335, -5452.75, -57.6953, 0, 0), +(@PATH21, 26, 752.365, -5448.88, -57.3383, 0, 0), +(@PATH21, 27, 785.226, -5449.35, -55.0896, 0, 0), +(@PATH21, 28, 808.626, -5450.2, -55.6828, 0, 0), +(@PATH21, 29, 840.054, -5447.57, -59.1454, 0, 0), +(@PATH21, 30, 860.038, -5429.36, -58.3245, 0, 0), +(@PATH21, 31, 884.764, -5424.27, -58.0952, 0, 0), +(@PATH21, 32, 910.851, -5418.02, -54.3127, 0, 0), +(@PATH22, 1, 478.163, -5354.21, -43.7743, 0, 0), +(@PATH22, 2, 449.288, -5339.32, -39.4666, 0, 0), +(@PATH22, 3, 417.396, -5331.68, -27.1596, 0, 0), +(@PATH22, 4, 401.883, -5346.24, -24.6042, 0, 0), +(@PATH22, 5, 384.33, -5356.52, -22.0758, 0, 0), +(@PATH22, 6, 365.925, -5363.74, -21.1654, 0, 0), +(@PATH22, 7, 359.145, -5389.11, -23.3096, 0, 0), +(@PATH22, 8, 351.778, -5414.2, -22.672, 0, 0), +(@PATH22, 9, 336.771, -5442.29, -26.5356, 0, 0), +(@PATH22, 10, 336.753, -5463.58, -28.1553, 0, 0), +(@PATH22, 11, 326.522, -5489.89, -32.6077, 0, 0), +(@PATH22, 12, 297.979, -5504.62, -32.2698, 0, 0), +(@PATH22, 13, 266.13, -5515.1, -32.1059, 0, 0), +(@PATH22, 14, 239.612, -5514.21, -31.999, 0, 0), +(@PATH22, 15, 209.377, -5516.51, -31.5502, 0, 0), +(@PATH22, 16, 181.916, -5520, -31.0444, 0, 0), +(@PATH22, 17, 152.516, -5519.96, -29.2918, 0, 0), +(@PATH22, 18, 112.342, -5522.8, -32.6255, 0, 0), +(@PATH22, 19, 71.7514, -5513.65, -32.5661, 0, 0), +(@PATH22, 20, 42.7414, -5516.01, -32.6023, 0, 0), +(@PATH22, 21, 71.7514, -5513.65, -32.5661, 0, 0), +(@PATH22, 22, 112.342, -5522.8, -32.6255, 0, 0), +(@PATH22, 23, 152.516, -5519.96, -29.2918, 0, 0), +(@PATH22, 24, 181.916, -5520, -31.0444, 0, 0), +(@PATH22, 25, 209.377, -5516.51, -31.5502, 0, 0), +(@PATH22, 26, 239.612, -5514.21, -31.999, 0, 0), +(@PATH22, 27, 266.13, -5515.1, -32.1059, 0, 0), +(@PATH22, 28, 297.979, -5504.62, -32.2698, 0, 0), +(@PATH22, 29, 326.522, -5489.89, -32.6077, 0, 0), +(@PATH22, 30, 336.753, -5463.58, -28.1553, 0, 0), +(@PATH22, 31, 336.771, -5442.29, -26.5356, 0, 0), +(@PATH22, 32, 351.778, -5414.2, -22.672, 0, 0), +(@PATH22, 33, 359.145, -5389.11, -23.3096, 0, 0), +(@PATH22, 34, 365.925, -5363.74, -21.1654, 0, 0), +(@PATH22, 35, 384.33, -5356.52, -22.0758, 0, 0), +(@PATH22, 36, 401.883, -5346.24, -24.6042, 0, 0), +(@PATH22, 37, 417.182, -5331.88, -27.1095, 0, 0), +(@PATH22, 38, 449.288, -5339.32, -39.4666, 0, 0), +(@PATH22, 39, 478.163, -5354.21, -43.7743, 0, 0), +(@PATH22, 40, 483.273, -5373.55, -49.2484, 0, 0), +(@PATH23, 1, -348.067, -5577.97, -32.65, 0, 0), +(@PATH23, 2, -357.549, -5604.61, -32.5432, 0, 0), +(@PATH23, 3, -380.199, -5623.58, -31.4737, 0, 0), +(@PATH23, 4, -412.232, -5631.5, -31.9731, 0, 0), +(@PATH23, 5, -438.914, -5638.84, -33.1976, 0, 0), +(@PATH23, 6, -459.091, -5648.77, -34.1012, 0, 0), +(@PATH23, 7, -471.591, -5669.52, -33.2584, 0, 0), +(@PATH23, 8, -490.046, -5686.99, -32.2633, 0, 0), +(@PATH23, 9, -512.865, -5686.81, -36.9606, 0, 0), +(@PATH23, 10, -530.814, -5673.19, -35.9577, 0, 0), +(@PATH23, 11, -545.807, -5669.22, -31.6047, 0, 0), +(@PATH23, 12, -554.349, -5676.35, -26.0957, 0, 0), +(@PATH23, 13, -548.392, -5686.53, -26.0327, 0, 0), +(@PATH23, 14, -545.629, -5697.58, -25.7446, 0, 0), +(@PATH23, 15, -558.881, -5718.68, -23.5747, 0, 0), +(@PATH23, 16, -555.439, -5742.34, -26.5172, 0, 0), +(@PATH23, 17, -543.636, -5759.58, -33.2977, 0, 0), +(@PATH23, 18, -545.659, -5779.45, -32.5208, 0, 0), +(@PATH23, 19, -565.719, -5811.16, -34.1039, 0, 0), +(@PATH23, 20, -584.56, -5824.54, -32.4604, 0, 0), +(@PATH23, 21, -614.898, -5821.75, -32.8638, 0, 0), +(@PATH23, 22, -584.56, -5824.54, -32.4604, 0, 0), +(@PATH23, 23, -565.719, -5811.16, -34.1039, 0, 0), +(@PATH23, 24, -545.659, -5779.45, -32.5208, 0, 0), +(@PATH23, 25, -543.636, -5759.58, -33.2977, 0, 0), +(@PATH23, 26, -555.439, -5742.34, -26.5172, 0, 0), +(@PATH23, 27, -558.881, -5718.68, -23.5747, 0, 0), +(@PATH23, 28, -545.629, -5697.58, -25.7446, 0, 0), +(@PATH23, 29, -548.392, -5686.53, -26.0327, 0, 0), +(@PATH23, 30, -554.349, -5676.35, -26.0957, 0, 0), +(@PATH23, 31, -545.807, -5669.22, -31.6047, 0, 0), +(@PATH23, 32, -530.814, -5673.19, -35.9577, 0, 0), +(@PATH23, 33, -512.865, -5686.81, -36.9606, 0, 0), +(@PATH23, 34, -490.046, -5686.99, -32.2633, 0, 0), +(@PATH23, 35, -471.591, -5669.52, -33.2584, 0, 0), +(@PATH23, 36, -459.091, -5648.77, -34.1012, 0, 0), +(@PATH23, 37, -438.914, -5638.84, -33.1976, 0, 0), +(@PATH23, 38, -412.466, -5631.58, -32.0903, 0, 0), +(@PATH23, 39, -380.199, -5623.58, -31.4737, 0, 0), +(@PATH23, 40, -357.549, -5604.61, -32.5432, 0, 0), +(@PATH23, 41, -348.067, -5577.97, -32.65, 0, 0), +(@PATH23, 42, -318.713, -5564.04, -32.5515, 0, 0), +(@PATH24, 1, -608.189, -5817.86, -33.709, 0, 0), +(@PATH24, 2, -636.505, -5820.9, -28.4536, 0, 0), +(@PATH24, 3, -659.174, -5823.26, -19.3774, 0, 0), +(@PATH24, 4, -691.712, -5820.37, -20.5041, 0, 0), +(@PATH24, 5, -713.348, -5823.96, -20.3692, 0, 0), +(@PATH24, 6, -751.252, -5827.44, -21.7339, 0, 0), +(@PATH24, 7, -783.621, -5825.68, -22.7967, 0, 0), +(@PATH24, 8, -808.286, -5822.93, -29.9531, 0, 0), +(@PATH24, 9, -845.253, -5820.43, -16.3681, 0, 0), +(@PATH24, 10, -875.673, -5822.89, -12.8224, 0, 0), +(@PATH24, 11, -909.937, -5825.71, -12.1481, 0, 0), +(@PATH24, 12, -942.422, -5823.41, -20.2785, 0, 0), +(@PATH24, 13, -980.966, -5821.28, -22.5778, 0, 0), +(@PATH24, 14, -1015.38, -5815.63, -30.7905, 0, 0), +(@PATH24, 15, -1034.81, -5795.98, -28.1028, 0, 0), +(@PATH24, 16, -1056.59, -5790.92, -26.0222, 0, 0), +(@PATH24, 17, -1070.57, -5793.05, -25.0055, 0, 0), +(@PATH24, 18, -1094.36, -5787.65, -27.308, 0, 0), +(@PATH24, 19, -1114.45, -5780.14, -27.8109, 0, 0), +(@PATH24, 20, -1128.8, -5771.17, -18.6337, 0, 0), +(@PATH24, 21, -1147.59, -5766.96, -13.6918, 0, 0), +(@PATH24, 22, -1179.73, -5766.32, -14.8849, 0, 0), +(@PATH24, 23, -1207.66, -5765.58, -13.849, 0, 0), +(@PATH24, 24, -1232.48, -5768.13, -17.9423, 0, 0), +(@PATH24, 25, -1249.48, -5772.08, -21.2213, 0, 0), +(@PATH24, 26, -1232.48, -5768.13, -17.9423, 0, 0), +(@PATH24, 27, -1207.66, -5765.58, -13.849, 0, 0), +(@PATH24, 28, -1179.73, -5766.32, -14.8849, 0, 0), +(@PATH24, 29, -1147.59, -5766.96, -13.6918, 0, 0), +(@PATH24, 30, -1128.8, -5771.17, -18.6337, 0, 0), +(@PATH24, 31, -1114.45, -5780.14, -27.8109, 0, 0), +(@PATH24, 32, -1094.36, -5787.65, -27.308, 0, 0), +(@PATH24, 33, -1070.57, -5793.05, -25.0055, 0, 0), +(@PATH24, 34, -1056.59, -5790.92, -26.0222, 0, 0), +(@PATH24, 35, -1034.81, -5795.98, -28.1028, 0, 0), +(@PATH24, 36, -1015.38, -5815.63, -30.7905, 0, 0), +(@PATH24, 37, -980.966, -5821.28, -22.5778, 0, 0), +(@PATH24, 38, -942.422, -5823.41, -20.2785, 0, 0), +(@PATH24, 39, -909.937, -5825.71, -12.1481, 0, 0), +(@PATH24, 40, -875.673, -5822.89, -12.8224, 0, 0), +(@PATH24, 41, -845.253, -5820.43, -16.3681, 0, 0), +(@PATH24, 42, -808.286, -5822.93, -29.9531, 0, 0), +(@PATH24, 43, -783.621, -5825.68, -22.7967, 0, 0), +(@PATH24, 44, -751.252, -5827.44, -21.7339, 0, 0), +(@PATH24, 45, -713.348, -5823.96, -20.3692, 0, 0), +(@PATH24, 46, -691.712, -5820.37, -20.5041, 0, 0), +(@PATH24, 47, -659.174, -5823.26, -19.3774, 0, 0), +(@PATH24, 48, -636.505, -5820.9, -28.4536, 0, 0), +(@PATH24, 49, -608.189, -5817.86, -33.709, 0, 0), +(@PATH24, 50, -581.407, -5813.84, -31.5447, 0, 0), +(@PATH25, 1, -1414.72, -5785.94, -18.2885, 0, 0), +(@PATH25, 2, -1429.12, -5803.25, -21.4268, 0, 0), +(@PATH25, 3, -1440.07, -5818.4, -23.6505, 0, 0), +(@PATH25, 4, -1473.32, -5817.65, -28.5233, 0, 0), +(@PATH25, 5, -1493.11, -5817.8, -30.5536, 0, 0), +(@PATH25, 6, -1515.08, -5820.92, -30.8291, 0, 0), +(@PATH25, 7, -1546.92, -5824.5, -30.4198, 0, 0), +(@PATH25, 8, -1576.58, -5830.68, -26.9595, 0, 0), +(@PATH25, 9, -1609.99, -5827.75, -22.2551, 0, 0), +(@PATH25, 10, -1649.51, -5819.8, -18.2337, 0, 0), +(@PATH25, 11, -1656.18, -5794.95, -11.2324, 0, 0), +(@PATH25, 12, -1638.66, -5767.85, -23.0969, 0, 0), +(@PATH25, 13, -1641.79, -5751.14, -26.1178, 0, 0), +(@PATH25, 14, -1618.05, -5731.53, -29.6055, 0, 0), +(@PATH25, 15, -1600.35, -5710.07, -28.909, 0, 0), +(@PATH25, 16, -1617.42, -5693.51, -23.3433, 0, 0), +(@PATH25, 17, -1640.38, -5682.3, -22.6561, 0, 0), +(@PATH25, 18, -1660.63, -5671.53, -26.1769, 0, 0), +(@PATH25, 19, -1686.91, -5662.64, -27.366, 0, 0), +(@PATH25, 20, -1698.24, -5629.52, -27.0792, 0, 0), +(@PATH25, 21, -1712.57, -5613.55, -27.7746, 0, 0), +(@PATH25, 22, -1728, -5592.73, -26.9465, 0, 0), +(@PATH25, 23, -1744.33, -5587.04, -30.407, 0, 0), +(@PATH25, 24, -1728, -5592.73, -26.9465, 0, 0), +(@PATH25, 25, -1712.57, -5613.55, -27.7746, 0, 0), +(@PATH25, 26, -1698.24, -5629.52, -27.0792, 0, 0), +(@PATH25, 27, -1686.91, -5662.64, -27.366, 0, 0), +(@PATH25, 28, -1660.63, -5671.53, -26.1769, 0, 0), +(@PATH25, 29, -1640.38, -5682.3, -22.6561, 0, 0), +(@PATH25, 30, -1617.42, -5693.51, -23.3433, 0, 0), +(@PATH25, 31, -1600.35, -5710.07, -28.909, 0, 0), +(@PATH25, 32, -1618.05, -5731.53, -29.6055, 0, 0), +(@PATH25, 33, -1641.79, -5751.14, -26.1178, 0, 0), +(@PATH25, 34, -1638.66, -5767.85, -23.0969, 0, 0), +(@PATH25, 35, -1656.18, -5794.95, -11.2324, 0, 0), +(@PATH25, 36, -1649.51, -5819.8, -18.2337, 0, 0), +(@PATH25, 37, -1609.99, -5827.75, -22.2551, 0, 0), +(@PATH25, 38, -1576.58, -5830.68, -26.9595, 0, 0), +(@PATH25, 39, -1546.92, -5824.5, -30.4198, 0, 0), +(@PATH25, 40, -1515.08, -5820.92, -30.8291, 0, 0), +(@PATH25, 41, -1493.11, -5817.8, -30.5536, 0, 0), +(@PATH25, 42, -1473.32, -5817.65, -28.5233, 0, 0), +(@PATH25, 43, -1440.07, -5818.4, -23.6505, 0, 0), +(@PATH25, 44, -1429.12, -5803.25, -21.4268, 0, 0), +(@PATH25, 45, -1414.72, -5785.94, -18.2885, 0, 0), +(@PATH25, 46, -1368.82, -5777.98, -19.775, 0, 0), +(@PATH26, 1, -1776.08, -5589.01, -34.1817, 0, 0), +(@PATH26, 2, -1803.56, -5594.41, -34.1236, 0, 0), +(@PATH26, 3, -1823.1, -5600.48, -33.4813, 0, 0), +(@PATH26, 4, -1856.05, -5605.8, -33.9261, 0, 0), +(@PATH26, 5, -1873.25, -5594.56, -36.2275, 0, 0), +(@PATH26, 6, -1884.44, -5579.1, -39.404, 0, 0), +(@PATH26, 7, -1896.79, -5559.88, -39.6055, 0, 0), +(@PATH26, 8, -1889.67, -5539.57, -37.1367, 0, 0), +(@PATH26, 9, -1871.8, -5526.5, -38.0821, 0, 0), +(@PATH26, 10, -1846.05, -5521.63, -40.426, 0, 0), +(@PATH26, 11, -1827.92, -5477.87, -35.5678, 0, 0), +(@PATH26, 12, -1820.32, -5455.87, -30.8618, 0, 0), +(@PATH26, 13, -1804.97, -5430.85, -35.1741, 0, 0), +(@PATH26, 14, -1779.96, -5415.25, -34.3368, 0, 0), +(@PATH26, 15, -1766.38, -5396.98, -33.1941, 0, 0), +(@PATH26, 16, -1779.96, -5415.25, -34.3368, 0, 0), +(@PATH26, 17, -1804.97, -5430.85, -35.1741, 0, 0), +(@PATH26, 18, -1820.32, -5455.87, -30.8618, 0, 0), +(@PATH26, 19, -1827.92, -5477.87, -35.5678, 0, 0), +(@PATH26, 20, -1846.05, -5521.63, -40.426, 0, 0), +(@PATH26, 21, -1871.8, -5526.5, -38.0821, 0, 0), +(@PATH26, 22, -1889.67, -5539.57, -37.1367, 0, 0), +(@PATH26, 23, -1896.79, -5559.88, -39.6055, 0, 0), +(@PATH26, 24, -1884.44, -5579.1, -39.404, 0, 0), +(@PATH26, 25, -1873.25, -5594.56, -36.2275, 0, 0), +(@PATH26, 26, -1856.05, -5605.8, -33.9261, 0, 0), +(@PATH26, 27, -1823.1, -5600.48, -33.4813, 0, 0), +(@PATH26, 28, -1803.56, -5594.41, -34.1236, 0, 0), +(@PATH26, 29, -1776.08, -5589.01, -34.1817, 0, 0), +(@PATH26, 30, -1755.5, -5592.2, -32.9915, 0, 0), +(@PATH27, 1, -1142.71, -4322.34, -7.51439, 0, 0), +(@PATH27, 2, -1145.22, -4345, -9.04151, 0, 0), +(@PATH27, 3, -1160.35, -4357.77, -12.1184, 0, 0), +(@PATH27, 4, -1176.23, -4369.2, -13.3569, 0, 0), +(@PATH27, 5, -1169.89, -4381.36, -14.9885, 0, 0), +(@PATH27, 6, -1166.83, -4391.78, -13.7736, 0, 0), +(@PATH27, 7, -1184.73, -4412.31, -13.0552, 0, 0), +(@PATH27, 8, -1183.19, -4430.99, -10.8047, 0, 0), +(@PATH27, 9, -1202.45, -4460.21, -6.74833, 0, 0), +(@PATH27, 10, -1215.99, -4472.52, -8.58044, 0, 0), +(@PATH27, 11, -1208.83, -4488.69, -6.47131, 0, 0), +(@PATH27, 12, -1188.06, -4498.22, -4.53936, 0, 0), +(@PATH27, 13, -1169.26, -4479.33, -4.28472, 0, 0), +(@PATH27, 14, -1162.07, -4452.04, -4.66485, 0, 0), +(@PATH27, 15, -1155.31, -4427.7, -7.9868, 0, 0), +(@PATH27, 16, -1165.52, -4412.07, -11.3374, 0, 0), +(@PATH27, 17, -1159.32, -4392.17, -11.8421, 0, 0), +(@PATH27, 18, -1144.14, -4381.1, -9.75907, 0, 0), +(@PATH27, 19, -1133.1, -4355.53, -8.96437, 0, 0), +(@PATH27, 20, -1120.31, -4335.31, -8.06143, 0, 0), +(@PATH27, 21, -1119.31, -4321.89, -7.84806, 0, 0); From d4030db568bc68d3ba5ef71263cb3807d4d5f798 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 15 Oct 2022 12:02:22 -0300 Subject: [PATCH 53/66] fix(DB/creature_template): Import Vmangos values for Dragons of Nightmare and Azuregos (#13199) --- .../rev_1664655909869728000.sql | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664655909869728000.sql diff --git a/data/sql/updates/pending_db_world/rev_1664655909869728000.sql b/data/sql/updates/pending_db_world/rev_1664655909869728000.sql new file mode 100644 index 000000000..9d0b4a7b9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664655909869728000.sql @@ -0,0 +1,68 @@ +-- Shade of Taerar +UPDATE `creature_template` SET `DamageModifier` = 12.65, `ArmorModifier` = 1.05 WHERE (`entry` = 15302); + +DELETE FROM `creature_template_resistance` WHERE (`CreatureID` = 15302) AND (`School` IN (2, 3, 4, 5, 6)); +INSERT INTO `creature_template_resistance` (`CreatureID`, `School`, `Resistance`, `VerifiedBuild`) VALUES +(15302, 2, 15, 0), +(15302, 3, 15, 0), +(15302, 4, 15, 0), +(15302, 5, 15, 0), +(15302, 6, 15, 0); + +-- Taerar +UPDATE `creature_template` SET `DamageModifier` = 12.65, `ArmorModifier` = 1.3 WHERE (`entry` = 14890); + +DELETE FROM `creature_template_resistance` WHERE (`CreatureID` = 14890) AND (`School` IN (2, 3, 4, 5, 6)); +INSERT INTO `creature_template_resistance` (`CreatureID`, `School`, `Resistance`, `VerifiedBuild`) VALUES +(14890, 2, 126, 0), +(14890, 3, 126, 0), +(14890, 4, 126, 0), +(14890, 5, 126, 0), +(14890, 6, 126, 0); + +-- Emeriss +UPDATE `creature_template` SET `DamageModifier` = 10.3, `ArmorModifier` = 1.3 WHERE (`entry` = 14889); + +DELETE FROM `creature_template_resistance` WHERE (`CreatureID` = 14889) AND (`School` IN (2, 3, 4, 5, 6)); +INSERT INTO `creature_template_resistance` (`CreatureID`, `School`, `Resistance`, `VerifiedBuild`) VALUES +(14889, 2, 126, 0), +(14889, 3, 126, 0), +(14889, 4, 126, 0), +(14889, 5, 126, 0), +(14889, 6, 126, 0); + +-- Lethon +UPDATE `creature_template` SET `DamageModifier` = 19.55, `ArmorModifier` = 1.3 WHERE (`entry` = 14888); + +DELETE FROM `creature_template_resistance` WHERE (`CreatureID` = 14888) AND (`School` IN (2, 3, 4, 5, 6)); +INSERT INTO `creature_template_resistance` (`CreatureID`, `School`, `Resistance`, `VerifiedBuild`) VALUES +(14888, 2, 126, 0), +(14888, 3, 126, 0), +(14888, 4, 126, 0), +(14888, 5, 126, 0), +(14888, 6, 126, 0); + +-- Ysondre +UPDATE `creature_template` SET `DamageModifier` = 12.55, `ArmorModifier` = 1.3 WHERE (`entry` = 14887); + +DELETE FROM `creature_template_resistance` WHERE (`CreatureID` = 14887) AND (`School` IN (2, 3, 4, 5, 6)); +INSERT INTO `creature_template_resistance` (`CreatureID`, `School`, `Resistance`, `VerifiedBuild`) VALUES +(14887, 2, 126, 0), +(14887, 3, 126, 0), +(14887, 4, 126, 0), +(14887, 5, 126, 0), +(14887, 6, 126, 0); + +-- Demented Druid Spirit +UPDATE `creature_template` SET `DamageModifier` = 3.55, `BaseAttackTime` = 1410, `RangeAttackTime` = 1551, `ArmorModifier` = 0.35 WHERE (`entry` = 15260); + +-- Azuregos +UPDATE `creature_template` SET `DamageModifier` = 20.45, `ArmorModifier` = 1.3 WHERE (`entry` = 6109); + +DELETE FROM `creature_template_resistance` WHERE (`CreatureID` = 6109) AND (`School` IN (2, 3, 4, 5, 6)); +INSERT INTO `creature_template_resistance` (`CreatureID`, `School`, `Resistance`, `VerifiedBuild`) VALUES +(6109, 2, 126, 0), +(6109, 3, 126, 0), +(6109, 4, 300, 0), +(6109, 5, 126, 0), +(6109, 6, 300, 0); From 9ac3b52d4434ab6e0c27bd8686f1b059ebaa4b1a Mon Sep 17 00:00:00 2001 From: Grimgravy Date: Sat, 15 Oct 2022 12:03:23 -0300 Subject: [PATCH 54/66] fix(Scripts/NPC): Arcanite Dragonling (#13233) * fix(Scripts/NPC): Arcanite Dragonling * update --- .../rev_1664763129717947000.sql | 2 + src/server/scripts/World/npcs_special.cpp | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664763129717947000.sql diff --git a/data/sql/updates/pending_db_world/rev_1664763129717947000.sql b/data/sql/updates/pending_db_world/rev_1664763129717947000.sql new file mode 100644 index 000000000..11b450560 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664763129717947000.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `ScriptName`='npc_arcanite_dragonling' WHERE `entry`=12473; diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 059b232e6..d06e81b68 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2542,6 +2542,64 @@ public: } }; +enum ArcaniteDragonling +{ + SPELL_FLAME_BUFFET = 9658, + SPELL_FLAME_BREATH = 8873, + + EVENT_FLAME_BUFFET = 1, + EVENT_FLAME_BREATH = 2 +}; + +struct npc_arcanite_dragonling : public ScriptedAI +{ +public: + npc_arcanite_dragonling(Creature* creature) : ScriptedAI(creature) + { + creature->SetCanModifyStats(true); + creature->SetReactState(REACT_AGGRESSIVE); + } + + void Reset() override + { + me->SetPvP(true); + events.Reset(); + } + + void EnterCombat(Unit* /*who*/) override + { + events.ScheduleEvent(EVENT_FLAME_BUFFET, 4s); + events.ScheduleEvent(EVENT_FLAME_BREATH, 12s); + } + + void IsSummonedBy(Unit* summoner) override + { + me->GetMotionMaster()->MoveFollow(summoner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + switch (events.ExecuteEvent()) + { + case EVENT_FLAME_BUFFET: + DoCastVictim(SPELL_FLAME_BUFFET); + events.Repeat(12s); + break; + case EVENT_FLAME_BREATH: + DoCastVictim(SPELL_FLAME_BREATH); + events.Repeat(24s); + break; + } + + DoMeleeAttackIfReady(); + } +}; + void AddSC_npcs_special() { // Ours @@ -2568,4 +2626,5 @@ void AddSC_npcs_special() new npc_firework(); new npc_spring_rabbit(); new npc_stable_master(); + RegisterCreatureAI(npc_arcanite_dragonling); } From 491aef9eea91e1437f26d4e7f04f98097411bd63 Mon Sep 17 00:00:00 2001 From: M'Dic Date: Sat, 15 Oct 2022 11:03:59 -0400 Subject: [PATCH 55/66] fix (core): Header consistency (#13303) --- src/common/Banner.cpp | 15 ++++++++++++++- src/common/Banner.h | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/common/Banner.cpp b/src/common/Banner.cpp index 9f7eb8c0f..f77c9abee 100644 --- a/src/common/Banner.cpp +++ b/src/common/Banner.cpp @@ -1,5 +1,18 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v3 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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 . */ #include "Banner.h" diff --git a/src/common/Banner.h b/src/common/Banner.h index 2a4ba19fe..5c1b9fe0b 100644 --- a/src/common/Banner.h +++ b/src/common/Banner.h @@ -1,5 +1,18 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v3 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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 . */ #ifndef AZEROTHCORE_BANNER_H From fdad79f775f89e30d948bd6fd1ee37d9958a4164 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 15 Oct 2022 12:04:36 -0300 Subject: [PATCH 56/66] fix(DB/pools): Update herb pooling in TBC starter zones (#13319) * Create rev_1664939937236076100.sql * Update rev_1664939937236076100.sql * added Wyrmscar Isle * newline * done --- .../rev_1664939937236076100.sql | 825 ++++++++++++++++++ 1 file changed, 825 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1664939937236076100.sql diff --git a/data/sql/updates/pending_db_world/rev_1664939937236076100.sql b/data/sql/updates/pending_db_world/rev_1664939937236076100.sql new file mode 100644 index 000000000..8c0b3da90 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664939937236076100.sql @@ -0,0 +1,825 @@ +-- Eversong Woods +UPDATE `gameobject` SET `ZoneId`=3430 WHERE `guid` IN (1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1292,1293,1294,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,33888,33889,33893,33896,33897,33900,33901,33908,33909,33910,33912,33914,33915,33916,33917,33918,33927,33930,33931,33933,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33946,33949,33950,33952,33954,33955,64924,64925,64926,64927,64929,64935,64937,64938,64939,64940,64947,64948,64958,64959,64960,64961,64962,64963,64969,64970,64971,64977,64978,64992,64993,64994,64996,64997,64998,65124,65125,65126,65127,65128,65129,65130,65131,65132,65133,65134,65135,87202); + +-- Duskwither Grounds: +UPDATE `gameobject` SET `AreaId`=3480 WHERE `guid` IN (33942, 65126, 33946, 21309, 21306, 65125, 33940, 65124, 33939, 21307, 33937, 21308, 21305, 33938, 21304); + +-- Stillwhisper Pond +UPDATE `gameobject` SET `AreaId`=3470 WHERE `guid` IN (33908, 21303); + +-- Saltheril's Haven +UPDATE `gameobject` SET `AreaId`=3468 WHERE `guid` IN (65134); + +-- North Sanctum +UPDATE `gameobject` SET `AreaId`=3465 WHERE `guid` IN (21302, 21301, 21297, 65127); + +-- West Sanctum +UPDATE `gameobject` SET `AreaId`=3466 WHERE `guid` IN (65128, 21298, 21300, 33931, 21299); + +-- The Scorched Grove +UPDATE `gameobject` SET `AreaId`=3474 WHERE `guid` IN (65132, 21310, 21311, 65129); + +-- Runestone Falithas +UPDATE `gameobject` SET `AreaId`=3913 WHERE `guid` IN (21312, 65130, 21313, 65131); + +-- Runestone Shan'dor +UPDATE `gameobject` SET `AreaId`=3914 WHERE `guid` IN (21320, 21318, 21319, 65133); + +-- East Sanctum +UPDATE `gameobject` SET `AreaId`=3467 WHERE `guid` IN (21316, 33900, 33896, 21314, 65135, 33897, 21317, 21315); + +DELETE FROM `pool_template` WHERE `entry`=970; +DELETE FROM `pool_gameobject` WHERE `pool_entry`=970; + +DELETE FROM `pool_template` WHERE `entry` BETWEEN 717 AND 727; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(717, 25, 'Peacebloom in Eversong Woods'), +(718, 25, 'Silverleaf in Eversong Woods'), +(719, 15, 'Earthroot in Eversong Woods'), +(720, 3, 'Bloodthistle in West Sanctum'), +(721, 2, 'Bloodthistle in The Scorched Grove'), +(722, 3, 'Bloodthistle in Runestone Falithas'), +(723, 2, 'Bloodthistle in Runestone Shan\'dor'), +(724, 3, 'Bloodthistle in East Sanctum'), +(725, 1, 'Bloodthistle in Stillwhisper Pond/Saltheril\'s Haven'), +(726, 3, 'Bloodthistle in North Sanctum'), +(727, 6, 'Bloodthistle in Duskwither Grounds'); + +DELETE FROM `pool_gameobject` WHERE `pool_entry` BETWEEN 717 AND 727; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(1308, 717, 0, 'Peacebloom'), +(1309, 717, 0, 'Peacebloom'), +(1310, 717, 0, 'Peacebloom'), +(1311, 717, 0, 'Peacebloom'), +(1312, 717, 0, 'Peacebloom'), +(1313, 717, 0, 'Peacebloom'), +(1314, 717, 0, 'Peacebloom'), +(1315, 717, 0, 'Peacebloom'), +(1316, 717, 0, 'Peacebloom'), +(1317, 717, 0, 'Peacebloom'), +(1318, 717, 0, 'Peacebloom'), +(1319, 717, 0, 'Peacebloom'), +(1320, 717, 0, 'Peacebloom'), +(1321, 717, 0, 'Peacebloom'), +(1322, 717, 0, 'Peacebloom'), +(1323, 717, 0, 'Peacebloom'), +(1324, 717, 0, 'Peacebloom'), +(1325, 717, 0, 'Peacebloom'), +(1326, 717, 0, 'Peacebloom'), +(1327, 717, 0, 'Peacebloom'), +(1328, 717, 0, 'Peacebloom'), +(33889, 717, 0, 'Peacebloom'), +(33893, 717, 0, 'Peacebloom'), +(33910, 717, 0, 'Peacebloom'), +(33912, 717, 0, 'Peacebloom'), +(33914, 717, 0, 'Peacebloom'), +(33930, 717, 0, 'Peacebloom'), +(33933, 717, 0, 'Peacebloom'), +(33935, 717, 0, 'Peacebloom'), +(33943, 717, 0, 'Peacebloom'), +(33954, 717, 0, 'Peacebloom'), +(64947, 717, 0, 'Peacebloom'), +(64948, 717, 0, 'Peacebloom'), +(64958, 717, 0, 'Peacebloom'), +(64959, 717, 0, 'Peacebloom'), +(64960, 717, 0, 'Peacebloom'), +(64961, 717, 0, 'Peacebloom'), +(64962, 717, 0, 'Peacebloom'), +(64963, 717, 0, 'Peacebloom'), +(64969, 717, 0, 'Peacebloom'), +(64970, 717, 0, 'Peacebloom'), +(64971, 717, 0, 'Peacebloom'), + +(1268, 718, 0, 'Silverleaf'), +(1269, 718, 0, 'Silverleaf'), +(1270, 718, 0, 'Silverleaf'), +(1271, 718, 0, 'Silverleaf'), +(1272, 718, 0, 'Silverleaf'), +(1273, 718, 0, 'Silverleaf'), +(1274, 718, 0, 'Silverleaf'), +(1275, 718, 0, 'Silverleaf'), +(1276, 718, 0, 'Silverleaf'), +(1277, 718, 0, 'Silverleaf'), +(1278, 718, 0, 'Silverleaf'), +(1279, 718, 0, 'Silverleaf'), +(1280, 718, 0, 'Silverleaf'), +(1281, 718, 0, 'Silverleaf'), +(1282, 718, 0, 'Silverleaf'), +(1283, 718, 0, 'Silverleaf'), +(1284, 718, 0, 'Silverleaf'), +(1285, 718, 0, 'Silverleaf'), +(1286, 718, 0, 'Silverleaf'), +(1287, 718, 0, 'Silverleaf'), +(1288, 718, 0, 'Silverleaf'), +(1289, 718, 0, 'Silverleaf'), +(1290, 718, 0, 'Silverleaf'), +(1292, 718, 0, 'Silverleaf'), +(1293, 718, 0, 'Silverleaf'), +(1294, 718, 0, 'Silverleaf'), +(33888, 718, 0, 'Silverleaf'), +(33909, 718, 0, 'Silverleaf'), +(33915, 718, 0, 'Silverleaf'), +(33916, 718, 0, 'Silverleaf'), +(33917, 718, 0, 'Silverleaf'), +(33918, 718, 0, 'Silverleaf'), +(33936, 718, 0, 'Silverleaf'), +(33941, 718, 0, 'Silverleaf'), +(33944, 718, 0, 'Silverleaf'), +(33950, 718, 0, 'Silverleaf'), +(33952, 718, 0, 'Silverleaf'), +(33955, 718, 0, 'Silverleaf'), +(64924, 718, 0, 'Silverleaf'), +(64925, 718, 0, 'Silverleaf'), +(64926, 718, 0, 'Silverleaf'), +(64927, 718, 0, 'Silverleaf'), +(64929, 718, 0, 'Silverleaf'), +(64935, 718, 0, 'Silverleaf'), +(64937, 718, 0, 'Silverleaf'), +(64938, 718, 0, 'Silverleaf'), +(64939, 718, 0, 'Silverleaf'), +(64940, 718, 0, 'Silverleaf'), +(87202, 718, 0, 'Silverleaf'), + +(1872, 719, 0, 'Earthroot'), +(1873, 719, 0, 'Earthroot'), +(1874, 719, 0, 'Earthroot'), +(1875, 719, 0, 'Earthroot'), +(1876, 719, 0, 'Earthroot'), +(1877, 719, 0, 'Earthroot'), +(1878, 719, 0, 'Earthroot'), +(1879, 719, 0, 'Earthroot'), +(1880, 719, 0, 'Earthroot'), +(1881, 719, 0, 'Earthroot'), +(33901, 719, 0, 'Earthroot'), +(33927, 719, 0, 'Earthroot'), +(33949, 719, 0, 'Earthroot'), +(64977, 719, 0, 'Earthroot'), +(64978, 719, 0, 'Earthroot'), +(64992, 719, 0, 'Earthroot'), +(64993, 719, 0, 'Earthroot'), +(64994, 719, 0, 'Earthroot'), +(64996, 719, 0, 'Earthroot'), +(64997, 719, 0, 'Earthroot'), +(64998, 719, 0, 'Earthroot'), + +(21298, 720, 0, 'Bloodthistle'), +(21299, 720, 0, 'Bloodthistle'), +(21300, 720, 0, 'Bloodthistle'), +(33931, 720, 0, 'Bloodthistle'), +(65128, 720, 0, 'Bloodthistle'), + +(21310, 721, 0, 'Bloodthistle'), +(21311, 721, 0, 'Bloodthistle'), +(65129, 721, 0, 'Bloodthistle'), +(65132, 721, 0, 'Bloodthistle'), + +(21312, 722, 0, 'Bloodthistle'), +(21313, 722, 0, 'Bloodthistle'), +(65130, 722, 0, 'Bloodthistle'), +(65131, 722, 0, 'Bloodthistle'), + +(21318, 723, 0, 'Bloodthistle'), +(21319, 723, 0, 'Bloodthistle'), +(21320, 723, 0, 'Bloodthistle'), +(65133, 723, 0, 'Bloodthistle'), + +(21314, 724, 0, 'Bloodthistle'), +(21315, 724, 0, 'Bloodthistle'), +(21316, 724, 0, 'Bloodthistle'), +(21317, 724, 0, 'Bloodthistle'), +(33896, 724, 0, 'Bloodthistle'), +(33897, 724, 0, 'Bloodthistle'), +(33900, 724, 0, 'Bloodthistle'), +(65135, 724, 0, 'Bloodthistle'), + +(21303, 725, 0, 'Bloodthistle'), +(33908, 725, 0, 'Bloodthistle'), +(65134, 725, 0, 'Bloodthistle'), + +(21297, 726, 0, 'Bloodthistle'), +(21301, 726, 0, 'Bloodthistle'), +(21302, 726, 0, 'Bloodthistle'), +(65127, 726, 0, 'Bloodthistle'), + +(21304, 727, 0, 'Bloodthistle'), +(21305, 727, 0, 'Bloodthistle'), +(21306, 727, 0, 'Bloodthistle'), +(21307, 727, 0, 'Bloodthistle'), +(21308, 727, 0, 'Bloodthistle'), +(21309, 727, 0, 'Bloodthistle'), +(33937, 727, 0, 'Bloodthistle'), +(33938, 727, 0, 'Bloodthistle'), +(33939, 727, 0, 'Bloodthistle'), +(33940, 727, 0, 'Bloodthistle'), +(33942, 727, 0, 'Bloodthistle'), +(33946, 727, 0, 'Bloodthistle'), +(65124, 727, 0, 'Bloodthistle'), +(65125, 727, 0, 'Bloodthistle'), +(65126, 727, 0, 'Bloodthistle'); + +-- Azuremyst Isle +UPDATE `gameobject` SET `ZoneId`=3524 WHERE `guid` IN (1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,30446,30447,30454,30461,30464,30469,30471,30477,30480,30482,30495,30499,30500,30501,30506,30518,30526,30527,30530,30532,39946,39947,85302,85303,85304,85305,85306,85308,85309,85310,85311,85312,85313,85314,85315,85316,85317,85318,85319,85320,85321,85323,85324,85325,85326,85329,85332,85333,85338,85348,85352,85356,85364,85369,85372,85387,85388,86161,86173,86180,86191,86193,86194,86197,86218,86221,86242,86243,86244,87059); + +DELETE FROM `pool_template` WHERE `entry`=971; +DELETE FROM `pool_gameobject` WHERE `pool_entry`=971; + +DELETE FROM `pool_template` WHERE `entry` BETWEEN 728 AND 730; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(728, 23, 'Peacebloom in Azuremyst Isle'), +(729, 23, 'Silverleaf in Azuremyst Isle'), +(730, 12, 'Earthroot in Azuremyst Isle'); + +DELETE FROM `pool_gameobject` WHERE `pool_entry` BETWEEN 728 AND 730; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(85387, 730, 0, 'Earthroot'), +(85388, 730, 0, 'Earthroot'), +(86221, 730, 0, 'Earthroot'), +(86242, 730, 0, 'Earthroot'), +(86243, 730, 0, 'Earthroot'), +(86244, 730, 0, 'Earthroot'), +(87059, 730, 0, 'Earthroot'), +(1882, 730, 0, 'Earthroot'), +(1883, 730, 0, 'Earthroot'), +(1884, 730, 0, 'Earthroot'), +(1885, 730, 0, 'Earthroot'), +(1886, 730, 0, 'Earthroot'), +(1891, 730, 0, 'Earthroot'), +(1892, 730, 0, 'Earthroot'), +(1893, 730, 0, 'Earthroot'), +(1894, 730, 0, 'Earthroot'), +(30471, 730, 0, 'Earthroot'), +(30527, 730, 0, 'Earthroot'), +(85320, 730, 0, 'Earthroot'), +(85321, 730, 0, 'Earthroot'), +(85323, 730, 0, 'Earthroot'), +(85324, 730, 0, 'Earthroot'), +(85326, 730, 0, 'Earthroot'), + +(86197, 728, 0, 'Peacebloom'), +(86218, 728, 0, 'Peacebloom'), +(1329, 728, 0, 'Peacebloom'), +(1330, 728, 0, 'Peacebloom'), +(1331, 728, 0, 'Peacebloom'), +(1332, 728, 0, 'Peacebloom'), +(1333, 728, 0, 'Peacebloom'), +(1334, 728, 0, 'Peacebloom'), +(1335, 728, 0, 'Peacebloom'), +(1336, 728, 0, 'Peacebloom'), +(1337, 728, 0, 'Peacebloom'), +(1342, 728, 0, 'Peacebloom'), +(1343, 728, 0, 'Peacebloom'), +(1344, 728, 0, 'Peacebloom'), +(30447, 728, 0, 'Peacebloom'), +(30454, 728, 0, 'Peacebloom'), +(30464, 728, 0, 'Peacebloom'), +(30480, 728, 0, 'Peacebloom'), +(30495, 728, 0, 'Peacebloom'), +(30500, 728, 0, 'Peacebloom'), +(30506, 728, 0, 'Peacebloom'), +(30530, 728, 0, 'Peacebloom'), +(30532, 728, 0, 'Peacebloom'), +(85312, 728, 0, 'Peacebloom'), +(85313, 728, 0, 'Peacebloom'), +(85314, 728, 0, 'Peacebloom'), +(85315, 728, 0, 'Peacebloom'), +(85316, 728, 0, 'Peacebloom'), +(85317, 728, 0, 'Peacebloom'), +(85318, 728, 0, 'Peacebloom'), +(85364, 728, 0, 'Peacebloom'), +(85369, 728, 0, 'Peacebloom'), +(85372, 728, 0, 'Peacebloom'), + +(1295, 729, 0, 'Silverleaf'), +(86161, 729, 0, 'Silverleaf'), +(86173, 729, 0, 'Silverleaf'), +(86180, 729, 0, 'Silverleaf'), +(86191, 729, 0, 'Silverleaf'), +(86193, 729, 0, 'Silverleaf'), +(86194, 729, 0, 'Silverleaf'), +(1305, 729, 0, 'Silverleaf'), +(1306, 729, 0, 'Silverleaf'), +(1307, 729, 0, 'Silverleaf'), +(1296, 729, 0, 'Silverleaf'), +(1297, 729, 0, 'Silverleaf'), +(1298, 729, 0, 'Silverleaf'), +(30446, 729, 0, 'Silverleaf'), +(30461, 729, 0, 'Silverleaf'), +(30469, 729, 0, 'Silverleaf'), +(1299, 729, 0, 'Silverleaf'), +(30477, 729, 0, 'Silverleaf'), +(30482, 729, 0, 'Silverleaf'), +(30499, 729, 0, 'Silverleaf'), +(30501, 729, 0, 'Silverleaf'), +(30518, 729, 0, 'Silverleaf'), +(1300, 729, 0, 'Silverleaf'), +(30526, 729, 0, 'Silverleaf'), +(39946, 729, 0, 'Silverleaf'), +(39947, 729, 0, 'Silverleaf'), +(85302, 729, 0, 'Silverleaf'), +(85303, 729, 0, 'Silverleaf'), +(85304, 729, 0, 'Silverleaf'), +(85305, 729, 0, 'Silverleaf'), +(1301, 729, 0, 'Silverleaf'), +(85306, 729, 0, 'Silverleaf'), +(85308, 729, 0, 'Silverleaf'), +(85309, 729, 0, 'Silverleaf'), +(85310, 729, 0, 'Silverleaf'), +(1302, 729, 0, 'Silverleaf'), +(85329, 729, 0, 'Silverleaf'), +(85332, 729, 0, 'Silverleaf'), +(85333, 729, 0, 'Silverleaf'), +(85338, 729, 0, 'Silverleaf'), +(85348, 729, 0, 'Silverleaf'), +(85352, 729, 0, 'Silverleaf'), +(85356, 729, 0, 'Silverleaf'); + +-- Silvermyst Isle, it's the isle southwest of Azuremyst +DELETE FROM `pool_template` WHERE `entry` BETWEEN 731 AND 733; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(731, 2, 'Peacebloom in Silvermyst Isle'), +(732, 2, 'Silverleaf in Silvermyst Isle'), +(733, 3, 'Earthroot in Silvermyst Isle'); + +DELETE FROM `pool_gameobject` WHERE `pool_entry` BETWEEN 731 AND 733; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(1338, 731, 0, 'Peacebloom'), +(1339, 731, 0, 'Peacebloom'), +(1340, 731, 0, 'Peacebloom'), +(1341, 731, 0, 'Peacebloom'), + +(1303, 732, 0, 'Silverleaf'), +(1304, 732, 0, 'Silverleaf'), +(85311, 732, 0, 'Silverleaf'), + +(85325, 733, 0, 'Earthroot'), +(1887, 733, 0, 'Earthroot'), +(1888, 733, 0, 'Earthroot'), +(1889, 733, 0, 'Earthroot'), +(1890, 733, 0, 'Earthroot'), +(85319, 733, 0, 'Earthroot'); + +-- Ghostlands Old Pool 969 +UPDATE `gameobject` SET `ZoneId`=3433 WHERE `guid` IN (1291,27209,27233,27237,27242,27253,27269,27270,27271,27273,27275,27294,27300,27302,27303,27308,27309,27310,27323,27369,27380,27386,27387,27390,27423,27426,27427,27430,27433,27434,27440,27450,27451,27456,27457,27458,27459,27460,27461,27466,27468,27491,27492,27494,27495,27496,27513,27526,27527,27528,27529,27531,27535,27537,27538,27539,27540,33289,33295,33296,33297,33298,33299,33885,33956,33957,33958,33960,33961,33962,33963,33965,33973,33975,33978,33982,33983,33985,33986,33988,33990,33991,33993,33994,33995,33996,34005,34013,34014,34015,34021,34022,64908,64918,64923,64928,64931,64933,64934,64936,64949,64950,64965,64966,64967,64968,64984,64991,64995,65006,65015,65021,65024,65025,65045,65064); + +DELETE FROM `pool_template` WHERE `entry`=969; +DELETE FROM `pool_gameobject` WHERE `pool_entry`=969; + +DELETE FROM `pool_template` WHERE `entry` BETWEEN 734 AND 740; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(734, 22, 'Silverleaf in Ghostlands'), +(735, 14, 'Peacebloom in Ghostlands'), +(736, 11, 'Earthroot in Ghostlands'), +(737, 8, 'Mageroyal in Ghostlands'), +(738, 8, 'Briarthorn in Ghostlands'), +(739, 6, 'Stranglekelp in Ghostlands'), +(740, 6, 'Bruiseweed in Ghostlands'); + +DELETE FROM `pool_gameobject` WHERE `pool_entry` BETWEEN 734 AND 740; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(1291, 734, 0, 'Silverleaf'), +(64936, 734, 0, 'Silverleaf'), +(27300, 734, 0, 'Silverleaf'), +(27303, 734, 0, 'Silverleaf'), +(27369, 734, 0, 'Silverleaf'), +(27380, 734, 0, 'Silverleaf'), +(27390, 734, 0, 'Silverleaf'), +(27423, 734, 0, 'Silverleaf'), +(27440, 734, 0, 'Silverleaf'), +(27450, 734, 0, 'Silverleaf'), +(27459, 734, 0, 'Silverleaf'), +(27461, 734, 0, 'Silverleaf'), +(27237, 734, 0, 'Silverleaf'), +(27468, 734, 0, 'Silverleaf'), +(27495, 734, 0, 'Silverleaf'), +(27242, 734, 0, 'Silverleaf'), +(27528, 734, 0, 'Silverleaf'), +(27531, 734, 0, 'Silverleaf'), +(27538, 734, 0, 'Silverleaf'), +(33295, 734, 0, 'Silverleaf'), +(27253, 734, 0, 'Silverleaf'), +(33299, 734, 0, 'Silverleaf'), +(33957, 734, 0, 'Silverleaf'), +(33958, 734, 0, 'Silverleaf'), +(33961, 734, 0, 'Silverleaf'), +(33978, 734, 0, 'Silverleaf'), +(33983, 734, 0, 'Silverleaf'), +(27270, 734, 0, 'Silverleaf'), +(33990, 734, 0, 'Silverleaf'), +(33996, 734, 0, 'Silverleaf'), +(64908, 734, 0, 'Silverleaf'), +(64918, 734, 0, 'Silverleaf'), +(64923, 734, 0, 'Silverleaf'), +(64928, 734, 0, 'Silverleaf'), +(64931, 734, 0, 'Silverleaf'), +(64933, 734, 0, 'Silverleaf'), +(64934, 734, 0, 'Silverleaf'), + +(64949, 735, 0, 'Peacebloom'), +(64950, 735, 0, 'Peacebloom'), +(64965, 735, 0, 'Peacebloom'), +(64966, 735, 0, 'Peacebloom'), +(64967, 735, 0, 'Peacebloom'), +(64968, 735, 0, 'Peacebloom'), +(27275, 735, 0, 'Peacebloom'), +(27387, 735, 0, 'Peacebloom'), +(27460, 735, 0, 'Peacebloom'), +(27466, 735, 0, 'Peacebloom'), +(27491, 735, 0, 'Peacebloom'), +(27492, 735, 0, 'Peacebloom'), +(27529, 735, 0, 'Peacebloom'), +(33296, 735, 0, 'Peacebloom'), +(33298, 735, 0, 'Peacebloom'), +(33885, 735, 0, 'Peacebloom'), +(33962, 735, 0, 'Peacebloom'), +(33988, 735, 0, 'Peacebloom'), +(33994, 735, 0, 'Peacebloom'), +(27271, 735, 0, 'Peacebloom'), +(34022, 735, 0, 'Peacebloom'), + +(27273, 736, 0, 'Earthroot'), +(64984, 736, 0, 'Earthroot'), +(64991, 736, 0, 'Earthroot'), +(64995, 736, 0, 'Earthroot'), +(27310, 736, 0, 'Earthroot'), +(27209, 736, 0, 'Earthroot'), +(27426, 736, 0, 'Earthroot'), +(27430, 736, 0, 'Earthroot'), +(27456, 736, 0, 'Earthroot'), +(27496, 736, 0, 'Earthroot'), +(33956, 736, 0, 'Earthroot'), +(33973, 736, 0, 'Earthroot'), +(33995, 736, 0, 'Earthroot'), +(34021, 736, 0, 'Earthroot'), + +(65006, 737, 0, 'Mageroyal'), +(65015, 737, 0, 'Mageroyal'), +(65021, 737, 0, 'Mageroyal'), +(27323, 737, 0, 'Mageroyal'), +(27427, 737, 0, 'Mageroyal'), +(27233, 737, 0, 'Mageroyal'), +(27513, 737, 0, 'Mageroyal'), +(27526, 737, 0, 'Mageroyal'), +(27527, 737, 0, 'Mageroyal'), +(27537, 737, 0, 'Mageroyal'), +(33963, 737, 0, 'Mageroyal'), +(33975, 737, 0, 'Mageroyal'), +(33985, 737, 0, 'Mageroyal'), +(33993, 737, 0, 'Mageroyal'), +(34015, 737, 0, 'Mageroyal'), + +(65024, 738, 0, 'Briarthorn'), +(65025, 738, 0, 'Briarthorn'), +(65045, 738, 0, 'Briarthorn'), +(27294, 738, 0, 'Briarthorn'), +(27308, 738, 0, 'Briarthorn'), +(27386, 738, 0, 'Briarthorn'), +(27458, 738, 0, 'Briarthorn'), +(27535, 738, 0, 'Briarthorn'), +(33297, 738, 0, 'Briarthorn'), +(27269, 738, 0, 'Briarthorn'), +(33965, 738, 0, 'Briarthorn'), +(33982, 738, 0, 'Briarthorn'), +(33986, 738, 0, 'Briarthorn'), +(33991, 738, 0, 'Briarthorn'), + +(27433, 739, 0, 'Stranglekelp'), +(27434, 739, 0, 'Stranglekelp'), +(27457, 739, 0, 'Stranglekelp'), +(27494, 739, 0, 'Stranglekelp'), +(34005, 739, 0, 'Stranglekelp'), +(34014, 739, 0, 'Stranglekelp'), + +(65064, 740, 0, 'Bruiseweed'), +(27302, 740, 0, 'Bruiseweed'), +(27309, 740, 0, 'Bruiseweed'), +(27451, 740, 0, 'Bruiseweed'), +(27539, 740, 0, 'Bruiseweed'), +(27540, 740, 0, 'Bruiseweed'), +(33289, 740, 0, 'Bruiseweed'), +(33960, 740, 0, 'Bruiseweed'), +(34013, 740, 0, 'Bruiseweed'); + +-- Bloodmyst Isle Old Pool 11648 +UPDATE `gameobject` SET `ZoneId`=3525 WHERE `guid` IN (86179,86192,86213,86237,86252,86267,86931,87058,2134867,2134967,2134968,2134969,2134970,2134971,2134972,2134973,2134974,2134975,2134976,2134977,2134978,2134980,2134981,2134982,2134983,2134984,2134985,2134986,2134987,2134988,2134989,2134990,2134991,2134992,2134993,2134994,2134995,2134996,2134997,2134998,2134999,2135000,2135001,2135002,2135003,2135004,2135005,2135006,2135007,2135008,2135009,2135010,2135011,2135012,2135013,2135014,2135015,2135016,2135017,2135018,2135019,2135020,2135021,2135022,2135023,2135024,2135025,2135026,2135027,2135028,2135029,2135030,2135031,2135032,2135033,2135034,2135035,2135036,2135037,2135038,2135039,2135040,2135041,2135042,2135043,2135044,2135045,2135046,2135047,2135048,2135049,2135050,2135051,2135052,2135053,2135054,2135055,2135056,2135057,2135058,2135059,2135060,2135061,2135062,2135063,2135064,2135065,2135066,2135067,2135068,2135069,2135070,2135071,2135072,2135073,2135074,2135075,2135076,2135077,2135078,2135079,2135080,2135081,2135082,2135083,2135084,2135085,2135086,2135087,2135088,2135089,2135090,2135091,2135092,2135093,2135094,2135095,2135096,2135097,2135098,2135099,2135100,2135101,2135102,2135103,2135104,2135105,2135106,2135107,2135108,2135109,2135110,2135111,2135112,2135113,2135114,2135115,2135116,2135117,2135118,2135119,2135120,2135121,2135122,2135123,2135124,2135125,2135126,2135127,2135128,2135129,2135130,2135131,2135132,2135133,2135134,2135135,2135136,2135137,2135138,2135139,2135140,2135141,2135142,2135143,2135144,2135145,2135146,2135147,2135148,2135149,2135150,2135151,2135152,2135153,2135154,2135155,2135156,2135157,2135158,2135159,2135160,2135161,2135162,2135164,2135165,2135166,2135167,2135168,2135169,2135170,2135171,2135172,2135173,2135174,2135175,2135176,2135177,2135178,2135179,2135180,2135181,2135182,2135183,2135184,2135185,2135186,2135187,2135188,2135189,2135190,2135191,2135192,2135193,2135194,2135195,2135196,2135197,2135198,2135199,2135200,2135201,2135202,2135203,2135204,2135205,2135206,2135207,2135208,2135209,2135210,2135211,2135212,2135213,2135214,2135215,2135216,2135217,2135218,2135219,2135220,2135221,2135222,2135223,2135224,2135225,2135226,2135227,2135228,2135229,2135230,2135231,2135232,2135233,2135234,2135235,2135236,2135237,2135238,2135239,2135240,2135241,2135242,2135243,2135253); + +DELETE FROM `pool_template` WHERE `entry`=11648; +DELETE FROM `pool_gameobject` WHERE `pool_entry`=11648; + +DELETE FROM `pool_template` WHERE `entry` BETWEEN 741 AND 747; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(741, 22, 'Silverleaf in Bloodmyst Isle'), +(742, 16, 'Peacebloom in Bloodmyst Isle'), +(743, 12, 'Earthroot in Bloodmyst Isle'), +(744, 8, 'Mageroyal in Bloodmyst Isle'), +(745, 9, 'Briarthorn in Bloodmyst Isle'), +(746, 5, 'Bruiseweed in Bloodmyst Isle'), +(747, 8, 'Stranglekelp in Bloodmyst Isle'); + +DELETE FROM `pool_gameobject` WHERE `pool_entry` BETWEEN 741 AND 747; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(86213, 741, 0, 'Silverleaf'), +(86267, 741, 0, 'Silverleaf'), +(2134967, 741, 0, 'Silverleaf'), +(2134970, 741, 0, 'Silverleaf'), +(2134975, 741, 0, 'Silverleaf'), +(2134976, 741, 0, 'Silverleaf'), +(2134977, 741, 0, 'Silverleaf'), +(2134987, 741, 0, 'Silverleaf'), +(2134988, 741, 0, 'Silverleaf'), +(2134990, 741, 0, 'Silverleaf'), +(2134997, 741, 0, 'Silverleaf'), +(2135002, 741, 0, 'Silverleaf'), +(2135005, 741, 0, 'Silverleaf'), +(2135013, 741, 0, 'Silverleaf'), +(2135017, 741, 0, 'Silverleaf'), +(2135022, 741, 0, 'Silverleaf'), +(2135024, 741, 0, 'Silverleaf'), +(2135030, 741, 0, 'Silverleaf'), +(2135039, 741, 0, 'Silverleaf'), +(2135042, 741, 0, 'Silverleaf'), +(2135045, 741, 0, 'Silverleaf'), +(2135054, 741, 0, 'Silverleaf'), +(2135055, 741, 0, 'Silverleaf'), +(2135057, 741, 0, 'Silverleaf'), +(2135058, 741, 0, 'Silverleaf'), +(2135059, 741, 0, 'Silverleaf'), +(2135068, 741, 0, 'Silverleaf'), +(2135070, 741, 0, 'Silverleaf'), +(2135071, 741, 0, 'Silverleaf'), +(2135072, 741, 0, 'Silverleaf'), +(2135080, 741, 0, 'Silverleaf'), +(2135088, 741, 0, 'Silverleaf'), +(2135090, 741, 0, 'Silverleaf'), +(2135092, 741, 0, 'Silverleaf'), +(2135093, 741, 0, 'Silverleaf'), +(2135095, 741, 0, 'Silverleaf'), +(2135096, 741, 0, 'Silverleaf'), +(2135102, 741, 0, 'Silverleaf'), +(2135116, 741, 0, 'Silverleaf'), +(2135117, 741, 0, 'Silverleaf'), +(2135120, 741, 0, 'Silverleaf'), +(2135130, 741, 0, 'Silverleaf'), +(2135131, 741, 0, 'Silverleaf'), +(2135137, 741, 0, 'Silverleaf'), +(2135147, 741, 0, 'Silverleaf'), +(2135152, 741, 0, 'Silverleaf'), +(2135153, 741, 0, 'Silverleaf'), +(2135158, 741, 0, 'Silverleaf'), +(2135159, 741, 0, 'Silverleaf'), +(2135164, 741, 0, 'Silverleaf'), +(2135166, 741, 0, 'Silverleaf'), +(2135176, 741, 0, 'Silverleaf'), +(2135180, 741, 0, 'Silverleaf'), +(2135187, 741, 0, 'Silverleaf'), +(2135206, 741, 0, 'Silverleaf'), +(2135207, 741, 0, 'Silverleaf'), +(2135208, 741, 0, 'Silverleaf'), +(2135211, 741, 0, 'Silverleaf'), +(2135224, 741, 0, 'Silverleaf'), +(2135234, 741, 0, 'Silverleaf'), +(2135235, 741, 0, 'Silverleaf'), +(2135236, 741, 0, 'Silverleaf'), + +(86192, 742, 0, 'Peacebloom'), +(2134989, 742, 0, 'Peacebloom'), +(2134996, 742, 0, 'Peacebloom'), +(2134998, 742, 0, 'Peacebloom'), +(2135003, 742, 0, 'Peacebloom'), +(2135008, 742, 0, 'Peacebloom'), +(2135011, 742, 0, 'Peacebloom'), +(2135012, 742, 0, 'Peacebloom'), +(2135016, 742, 0, 'Peacebloom'), +(2135019, 742, 0, 'Peacebloom'), +(2135044, 742, 0, 'Peacebloom'), +(2135046, 742, 0, 'Peacebloom'), +(2135051, 742, 0, 'Peacebloom'), +(2135053, 742, 0, 'Peacebloom'), +(2135062, 742, 0, 'Peacebloom'), +(2135063, 742, 0, 'Peacebloom'), + +(2135078, 742, 0, 'Peacebloom'), +(2135079, 742, 0, 'Peacebloom'), +(2135083, 742, 0, 'Peacebloom'), +(2135084, 742, 0, 'Peacebloom'), +(2135101, 742, 0, 'Peacebloom'), +(2135103, 742, 0, 'Peacebloom'), +(2135108, 742, 0, 'Peacebloom'), +(2135115, 742, 0, 'Peacebloom'), +(2135118, 742, 0, 'Peacebloom'), +(2135128, 742, 0, 'Peacebloom'), +(2135132, 742, 0, 'Peacebloom'), +(2135138, 742, 0, 'Peacebloom'), +(2135140, 742, 0, 'Peacebloom'), +(2135141, 742, 0, 'Peacebloom'), +(2135142, 742, 0, 'Peacebloom'), +(2135146, 742, 0, 'Peacebloom'), +(2135150, 742, 0, 'Peacebloom'), +(2135151, 742, 0, 'Peacebloom'), +(2135161, 742, 0, 'Peacebloom'), +(2135165, 742, 0, 'Peacebloom'), +(2135167, 742, 0, 'Peacebloom'), +(2135179, 742, 0, 'Peacebloom'), +(2135184, 742, 0, 'Peacebloom'), +(2135195, 742, 0, 'Peacebloom'), +(2135203, 742, 0, 'Peacebloom'), +(2135204, 742, 0, 'Peacebloom'), +(2135217, 742, 0, 'Peacebloom'), +(2135223, 742, 0, 'Peacebloom'), +(2135230, 742, 0, 'Peacebloom'), +(2135240, 742, 0, 'Peacebloom'), + +(2134867, 743, 0, 'Earthroot'), +(2134973, 743, 0, 'Earthroot'), +(2134974, 743, 0, 'Earthroot'), +(2134981, 743, 0, 'Earthroot'), +(2134985, 743, 0, 'Earthroot'), +(2134986, 743, 0, 'Earthroot'), +(2134995, 743, 0, 'Earthroot'), +(2135000, 743, 0, 'Earthroot'), +(2135001, 743, 0, 'Earthroot'), +(2135009, 743, 0, 'Earthroot'), +(2135014, 743, 0, 'Earthroot'), +(2135015, 743, 0, 'Earthroot'), +(2135021, 743, 0, 'Earthroot'), +(2135029, 743, 0, 'Earthroot'), +(2135031, 743, 0, 'Earthroot'), +(2135040, 743, 0, 'Earthroot'), +(2135041, 743, 0, 'Earthroot'), +(2135050, 743, 0, 'Earthroot'), +(2135065, 743, 0, 'Earthroot'), +(2135066, 743, 0, 'Earthroot'), +(2135098, 743, 0, 'Earthroot'), +(2135122, 743, 0, 'Earthroot'), +(2135126, 743, 0, 'Earthroot'), +(2135127, 743, 0, 'Earthroot'), +(2135143, 743, 0, 'Earthroot'), +(2135170, 743, 0, 'Earthroot'), +(2135178, 743, 0, 'Earthroot'), +(2135186, 743, 0, 'Earthroot'), +(2135191, 743, 0, 'Earthroot'), +(2135192, 743, 0, 'Earthroot'), +(2135201, 743, 0, 'Earthroot'), +(2135210, 743, 0, 'Earthroot'), +(2135220, 743, 0, 'Earthroot'), +(2135221, 743, 0, 'Earthroot'), +(2135227, 743, 0, 'Earthroot'), + +(2134971, 744, 0, 'Mageroyal'), +(2134982, 744, 0, 'Mageroyal'), +(2135004, 744, 0, 'Mageroyal'), +(2135007, 744, 0, 'Mageroyal'), +(2135018, 744, 0, 'Mageroyal'), +(2135028, 744, 0, 'Mageroyal'), +(2135036, 744, 0, 'Mageroyal'), +(2135043, 744, 0, 'Mageroyal'), +(2135052, 744, 0, 'Mageroyal'), +(2135064, 744, 0, 'Mageroyal'), +(2135085, 744, 0, 'Mageroyal'), +(2135089, 744, 0, 'Mageroyal'), +(2135091, 744, 0, 'Mageroyal'), +(2135094, 744, 0, 'Mageroyal'), +(2135104, 744, 0, 'Mageroyal'), +(2135109, 744, 0, 'Mageroyal'), +(2135124, 744, 0, 'Mageroyal'), +(2135129, 744, 0, 'Mageroyal'), +(2135133, 744, 0, 'Mageroyal'), +(2135144, 744, 0, 'Mageroyal'), +(2135148, 744, 0, 'Mageroyal'), +(2135149, 744, 0, 'Mageroyal'), +(2135157, 744, 0, 'Mageroyal'), +(2135168, 744, 0, 'Mageroyal'), +(2135171, 744, 0, 'Mageroyal'), +(2135174, 744, 0, 'Mageroyal'), +(2135200, 744, 0, 'Mageroyal'), +(2135214, 744, 0, 'Mageroyal'), +(2135216, 744, 0, 'Mageroyal'), +(2135222, 744, 0, 'Mageroyal'), +(2135226, 744, 0, 'Mageroyal'), +(2135231, 744, 0, 'Mageroyal'), + +(86179, 745, 0, 'Briarthorn'), +(86252, 745, 0, 'Briarthorn'), +(87058, 745, 0, 'Briarthorn'), +(2134968, 745, 0, 'Briarthorn'), +(2134969, 745, 0, 'Briarthorn'), +(2134972, 745, 0, 'Briarthorn'), +(2134978, 745, 0, 'Briarthorn'), +(2134980, 745, 0, 'Briarthorn'), +(2134984, 745, 0, 'Briarthorn'), +(2134992, 745, 0, 'Briarthorn'), +(2134993, 745, 0, 'Briarthorn'), +(2134994, 745, 0, 'Briarthorn'), +(2134999, 745, 0, 'Briarthorn'), +(2135006, 745, 0, 'Briarthorn'), +(2135025, 745, 0, 'Briarthorn'), +(2135026, 745, 0, 'Briarthorn'), +(2135033, 745, 0, 'Briarthorn'), +(2135034, 745, 0, 'Briarthorn'), +(2135037, 745, 0, 'Briarthorn'), +(2135048, 745, 0, 'Briarthorn'), +(2135049, 745, 0, 'Briarthorn'), +(2135060, 745, 0, 'Briarthorn'), +(2135073, 745, 0, 'Briarthorn'), +(2135074, 745, 0, 'Briarthorn'), +(2135081, 745, 0, 'Briarthorn'), +(2135082, 745, 0, 'Briarthorn'), +(2135086, 745, 0, 'Briarthorn'), +(2135110, 745, 0, 'Briarthorn'), +(2135111, 745, 0, 'Briarthorn'), +(2135112, 745, 0, 'Briarthorn'), +(2135113, 745, 0, 'Briarthorn'), +(2135121, 745, 0, 'Briarthorn'), +(2135134, 745, 0, 'Briarthorn'), +(2135135, 745, 0, 'Briarthorn'), +(2135175, 745, 0, 'Briarthorn'), +(2135182, 745, 0, 'Briarthorn'), +(2135185, 745, 0, 'Briarthorn'), +(2135189, 745, 0, 'Briarthorn'), +(2135190, 745, 0, 'Briarthorn'), +(2135194, 745, 0, 'Briarthorn'), +(2135196, 745, 0, 'Briarthorn'), +(2135197, 745, 0, 'Briarthorn'), +(2135205, 745, 0, 'Briarthorn'), +(2135219, 745, 0, 'Briarthorn'), +(2135242, 745, 0, 'Briarthorn'), +(2135243, 745, 0, 'Briarthorn'), + +(86931, 746, 0, 'Bruiseweed'), +(2134983, 746, 0, 'Bruiseweed'), +(2134991, 746, 0, 'Bruiseweed'), +(2135047, 746, 0, 'Bruiseweed'), +(2135097, 746, 0, 'Bruiseweed'), +(2135105, 746, 0, 'Bruiseweed'), +(2135145, 746, 0, 'Bruiseweed'), +(2135154, 746, 0, 'Bruiseweed'), +(2135155, 746, 0, 'Bruiseweed'), +(2135169, 746, 0, 'Bruiseweed'), +(2135173, 746, 0, 'Bruiseweed'), +(2135181, 746, 0, 'Bruiseweed'), +(2135199, 746, 0, 'Bruiseweed'), +(2135212, 746, 0, 'Bruiseweed'), +(2135213, 746, 0, 'Bruiseweed'), +(2135237, 746, 0, 'Bruiseweed'), +(2135241, 746, 0, 'Bruiseweed'), + +(86237, 747, 0, 'Stranglekelp'), +(2135010, 747, 0, 'Stranglekelp'), +(2135027, 747, 0, 'Stranglekelp'), +(2135032, 747, 0, 'Stranglekelp'), +(2135035, 747, 0, 'Stranglekelp'), +(2135061, 747, 0, 'Stranglekelp'), +(2135067, 747, 0, 'Stranglekelp'), +(2135075, 747, 0, 'Stranglekelp'), +(2135076, 747, 0, 'Stranglekelp'), +(2135087, 747, 0, 'Stranglekelp'), +(2135099, 747, 0, 'Stranglekelp'), +(2135100, 747, 0, 'Stranglekelp'), +(2135106, 747, 0, 'Stranglekelp'), +(2135107, 747, 0, 'Stranglekelp'), +(2135114, 747, 0, 'Stranglekelp'), +(2135123, 747, 0, 'Stranglekelp'), +(2135139, 747, 0, 'Stranglekelp'), +(2135156, 747, 0, 'Stranglekelp'), +(2135160, 747, 0, 'Stranglekelp'), +(2135183, 747, 0, 'Stranglekelp'), +(2135193, 747, 0, 'Stranglekelp'), +(2135202, 747, 0, 'Stranglekelp'), +(2135228, 747, 0, 'Stranglekelp'), +(2135233, 747, 0, 'Stranglekelp'), +(2135238, 747, 0, 'Stranglekelp'), +(2135239, 747, 0, 'Stranglekelp'); + +-- Wyrmscar Isle +DELETE FROM `pool_template` WHERE `entry` BETWEEN 748 AND 751; +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(748, 2, 'Peacebloom in Wyrmscar Isle'), +(749, 2, 'Silverleaf in Wyrmscar Isle'), +(750, 1, 'Mageroyal in Wyrmscar Isle'), +(751, 1, 'Bruiseweed in Wyrmscar Isle'); + +DELETE FROM `pool_gameobject` WHERE `pool_entry` BETWEEN 748 AND 751; +INSERT INTO `pool_gameobject` (`guid`, `pool_entry`, `chance`, `description`) VALUES +(2135069, 748, 0, 'Peacebloom'), +(2135020, 748, 0, 'Peacebloom'), +(2135038, 748, 0, 'Peacebloom'), +(2135077, 748, 0, 'Peacebloom'), +(2135215, 748, 0, 'Peacebloom'), + +(2135177, 749, 0, 'Silverleaf'), +(2135225, 749, 0, 'Silverleaf'), +(2135136, 749, 0, 'Silverleaf'), +(2135056, 749, 0, 'Silverleaf'), +(2135188, 749, 0, 'Silverleaf'), + +(2135229, 750, 0, 'Mageroyal'), +(2135162, 750, 0, 'Mageroyal'), +(2135198, 750, 0, 'Mageroyal'), +(2135125, 750, 0, 'Mageroyal'), +(2135023, 750, 0, 'Mageroyal'), +(2135209, 750, 0, 'Mageroyal'), + +(2135172, 751, 0, 'Bruiseweed'), +(2135232, 751, 0, 'Bruiseweed'), +(2135253, 751, 0, 'Bruiseweed'), +(2135218, 751, 0, 'Bruiseweed'), +(2135119, 751, 0, 'Bruiseweed'); From 8d7370decf100aa78b91e501d0f4d20de87a83f8 Mon Sep 17 00:00:00 2001 From: Droz Date: Sat, 15 Oct 2022 11:05:00 -0400 Subject: [PATCH 57/66] Fix(core/scripts): issue 13325 - reset talents command (#13326) Fix issue 13325 - reset talents command does not set offline player at_login flag to reset talents. --- src/server/scripts/Commands/cs_reset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 31a597517..c189b009d 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -252,7 +252,7 @@ public: else if (targetGuid) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); - stmt->SetData(0, uint16(AT_LOGIN_NONE | AT_LOGIN_RESET_PET_TALENTS)); + stmt->SetData(0, uint16(AT_LOGIN_RESET_TALENTS | AT_LOGIN_RESET_PET_TALENTS)); stmt->SetData(1, targetGuid.GetCounter()); CharacterDatabase.Execute(stmt); From 414546aecab7bfc78a68ec1d291eb4723f5c1f43 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Sat, 15 Oct 2022 09:06:09 -0600 Subject: [PATCH 58/66] fix(Core): Fix PlayerSettingVectors (#13338) * fix(Core): Fix PlayerSettingVectors * Fix compile warning --- src/server/game/Entities/Player/PlayerSettings.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/server/game/Entities/Player/PlayerSettings.cpp b/src/server/game/Entities/Player/PlayerSettings.cpp index f81bfe9a9..19f161987 100644 --- a/src/server/game/Entities/Player/PlayerSettings.cpp +++ b/src/server/game/Entities/Player/PlayerSettings.cpp @@ -78,6 +78,13 @@ PlayerSetting Player::GetPlayerSetting(std::string source, uint8 index) return GetPlayerSetting(source, index); } + PlayerSettingVector settingVector = itr->second; + if (settingVector.size() < (uint8)(index + 1)) + { + UpdatePlayerSetting(source, index, 0); + return GetPlayerSetting(source, index); + } + return itr->second[index]; } From bee7740bab7ac90facfaa05186a5ea747c7a7079 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 15 Oct 2022 12:06:38 -0300 Subject: [PATCH 59/66] fix(DB/loot): Remove skinning loot from creatures that shouldn't be skinnable (#13348) * Create rev_1665250992619716400.sql * Update rev_1665250992619716400.sql --- .../updates/pending_db_world/rev_1665250992619716400.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665250992619716400.sql diff --git a/data/sql/updates/pending_db_world/rev_1665250992619716400.sql b/data/sql/updates/pending_db_world/rev_1665250992619716400.sql new file mode 100644 index 000000000..6ea4cd1f6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665250992619716400.sql @@ -0,0 +1,7 @@ +-- Rookery Whelp (10161) +DELETE FROM `creature_loot_template` WHERE `Entry` = 10161; +UPDATE `creature_template` SET `lootid` = 0, `skinloot` = 0 WHERE (`entry` = 10161); +-- Broodlord Lashlayer (12017), Death Talon Dragonspawn (12422), Razorgore the Untamed (12435), Vaelastrasz the Corrupt (13020), Corrupted Whelps (14022 to 14025), Ohgan (14988) +UPDATE `creature_template` SET `skinloot` = 0 WHERE (`entry` IN (12017, 12422, 12435, 13020, 14022, 14023, 14024, 14025, 14988)); +-- Remove gold drops from Razorgore adds +UPDATE `creature_template` SET `mingold` = 0, `maxgold` = 0 WHERE `entry` IN (12416, 12420, 12422); From 9e1ed276fc25eed04003a8e0e3ba04554860fdf0 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 15 Oct 2022 12:07:43 -0300 Subject: [PATCH 60/66] fix(DB/creature): Adjust Shatterspear respawn timer (#13349) Create rev_1665269180018074500.sql --- data/sql/updates/pending_db_world/rev_1665269180018074500.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665269180018074500.sql diff --git a/data/sql/updates/pending_db_world/rev_1665269180018074500.sql b/data/sql/updates/pending_db_world/rev_1665269180018074500.sql new file mode 100644 index 000000000..690f950c3 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665269180018074500.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature` SET `spawntimesecs`=180 WHERE `id1`=10919; From 32f94f2798d50c5e7498c30b49dadbe894e60429 Mon Sep 17 00:00:00 2001 From: Droz Date: Sat, 15 Oct 2022 11:08:58 -0400 Subject: [PATCH 61/66] fix(core): Horde Warsong Gulch gates dont despawn (#13381) fix(core): issue 13375 - Horde Warsong Gulch gates dont despawn --- src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp | 5 +++++ src/server/game/Battlegrounds/Zones/BattlegroundWS.h | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index a6c519202..64b4619f4 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -101,6 +101,10 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) player->CastSpell(player, BG_WS_SPELL_BRUTAL_ASSAULT, true); } break; + case BG_WS_EVENT_DESPAWN_DOORS: + SpawnBGObject(BG_WS_OBJECT_DOOR_H_1, RESPAWN_ONE_DAY); + SpawnBGObject(BG_WS_OBJECT_DOOR_H_2, RESPAWN_ONE_DAY); + break; } } } @@ -135,6 +139,7 @@ void BattlegroundWS::StartingEventOpenDoors() UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 1); _bgEvents.ScheduleEvent(BG_WS_EVENT_UPDATE_GAME_TIME, 0); _bgEvents.ScheduleEvent(BG_WS_EVENT_NO_TIME_LEFT, BG_WS_TOTAL_GAME_TIME - 2 * MINUTE * IN_MILLISECONDS); // 27 - 2 = 25 minutes + _bgEvents.ScheduleEvent(BG_WS_EVENT_DESPAWN_DOORS, BG_WS_DOOR_DESPAWN_TIME); } void BattlegroundWS::AddPlayer(Player* player) diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index a2b5df6b1..1620ca1fd 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -30,7 +30,8 @@ enum BG_WS_Events BG_WS_EVENT_ALLIANCE_DROP_FLAG = 4, BG_WS_EVENT_HORDE_DROP_FLAG = 5, BG_WS_EVENT_BOTH_FLAGS_KEPT10 = 6, - BG_WS_EVENT_BOTH_FLAGS_KEPT15 = 7 + BG_WS_EVENT_BOTH_FLAGS_KEPT15 = 7, + BG_WS_EVENT_DESPAWN_DOORS = 8 }; enum BG_WS_TimerOrScore @@ -41,7 +42,8 @@ enum BG_WS_TimerOrScore BG_WS_FLAG_RESPAWN_TIME = 23 * IN_MILLISECONDS, BG_WS_FLAG_DROP_TIME = 10 * IN_MILLISECONDS, BG_WS_SPELL_FORCE_TIME = 10 * MINUTE * IN_MILLISECONDS, - BG_WS_SPELL_BRUTAL_TIME = 15 * MINUTE * IN_MILLISECONDS + BG_WS_SPELL_BRUTAL_TIME = 15 * MINUTE * IN_MILLISECONDS, + BG_WS_DOOR_DESPAWN_TIME = 5 * IN_MILLISECONDS }; enum BG_WS_BroadcastTexts From 2769e0decc0c884527a977e36db2fe1c7b5a69b9 Mon Sep 17 00:00:00 2001 From: ZhengPeiRu21 <98835050+ZhengPeiRu21@users.noreply.github.com> Date: Sat, 15 Oct 2022 09:10:43 -0600 Subject: [PATCH 62/66] fix(DB): Remove Skinning loot from Giant Buzzard (#13392) --- data/sql/updates/pending_db_world/rev_1665525266543513900.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665525266543513900.sql diff --git a/data/sql/updates/pending_db_world/rev_1665525266543513900.sql b/data/sql/updates/pending_db_world/rev_1665525266543513900.sql new file mode 100644 index 000000000..2308fb3fc --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665525266543513900.sql @@ -0,0 +1,4 @@ +-- +-- Remove skinning loot from Giant Buzzard +UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` = 2831; +DELETE FROM `skinning_loot_template` WHERE `Entry` = 2831; From fc51e19bb64dfa89067d6ac467a41a4f4e2412c9 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 15 Oct 2022 15:12:42 +0000 Subject: [PATCH 63/66] chore(DB): import pending files Referenced commit(s): 2769e0decc0c884527a977e36db2fe1c7b5a69b9 --- .../rev_1664310727301327900.sql => db_world/2022_10_15_00.sql} | 1 + .../rev_1664655909869728000.sql => db_world/2022_10_15_01.sql} | 1 + .../rev_1664763129717947000.sql => db_world/2022_10_15_02.sql} | 1 + .../rev_1664939937236076100.sql => db_world/2022_10_15_03.sql} | 1 + .../rev_1665250992619716400.sql => db_world/2022_10_15_04.sql} | 1 + .../rev_1665269180018074500.sql => db_world/2022_10_15_05.sql} | 1 + .../rev_1665525266543513900.sql => db_world/2022_10_15_06.sql} | 1 + 7 files changed, 7 insertions(+) rename data/sql/updates/{pending_db_world/rev_1664310727301327900.sql => db_world/2022_10_15_00.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1664655909869728000.sql => db_world/2022_10_15_01.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1664763129717947000.sql => db_world/2022_10_15_02.sql} (68%) rename data/sql/updates/{pending_db_world/rev_1664939937236076100.sql => db_world/2022_10_15_03.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1665250992619716400.sql => db_world/2022_10_15_04.sql} (93%) rename data/sql/updates/{pending_db_world/rev_1665269180018074500.sql => db_world/2022_10_15_05.sql} (59%) rename data/sql/updates/{pending_db_world/rev_1665525266543513900.sql => db_world/2022_10_15_06.sql} (79%) diff --git a/data/sql/updates/pending_db_world/rev_1664310727301327900.sql b/data/sql/updates/db_world/2022_10_15_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1664310727301327900.sql rename to data/sql/updates/db_world/2022_10_15_00.sql index 054d8e42f..599d479f3 100644 --- a/data/sql/updates/pending_db_world/rev_1664310727301327900.sql +++ b/data/sql/updates/db_world/2022_10_15_00.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_14_02 -> 2022_10_15_00 -- SET @GUID := 1976934; diff --git a/data/sql/updates/pending_db_world/rev_1664655909869728000.sql b/data/sql/updates/db_world/2022_10_15_01.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1664655909869728000.sql rename to data/sql/updates/db_world/2022_10_15_01.sql index 9d0b4a7b9..a19ee895b 100644 --- a/data/sql/updates/pending_db_world/rev_1664655909869728000.sql +++ b/data/sql/updates/db_world/2022_10_15_01.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_15_00 -> 2022_10_15_01 -- Shade of Taerar UPDATE `creature_template` SET `DamageModifier` = 12.65, `ArmorModifier` = 1.05 WHERE (`entry` = 15302); diff --git a/data/sql/updates/pending_db_world/rev_1664763129717947000.sql b/data/sql/updates/db_world/2022_10_15_02.sql similarity index 68% rename from data/sql/updates/pending_db_world/rev_1664763129717947000.sql rename to data/sql/updates/db_world/2022_10_15_02.sql index 11b450560..b94f53f4a 100644 --- a/data/sql/updates/pending_db_world/rev_1664763129717947000.sql +++ b/data/sql/updates/db_world/2022_10_15_02.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_15_01 -> 2022_10_15_02 -- UPDATE `creature_template` SET `ScriptName`='npc_arcanite_dragonling' WHERE `entry`=12473; diff --git a/data/sql/updates/pending_db_world/rev_1664939937236076100.sql b/data/sql/updates/db_world/2022_10_15_03.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1664939937236076100.sql rename to data/sql/updates/db_world/2022_10_15_03.sql index 8c0b3da90..adf2d5a53 100644 --- a/data/sql/updates/pending_db_world/rev_1664939937236076100.sql +++ b/data/sql/updates/db_world/2022_10_15_03.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_15_02 -> 2022_10_15_03 -- Eversong Woods UPDATE `gameobject` SET `ZoneId`=3430 WHERE `guid` IN (1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1292,1293,1294,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,33888,33889,33893,33896,33897,33900,33901,33908,33909,33910,33912,33914,33915,33916,33917,33918,33927,33930,33931,33933,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33946,33949,33950,33952,33954,33955,64924,64925,64926,64927,64929,64935,64937,64938,64939,64940,64947,64948,64958,64959,64960,64961,64962,64963,64969,64970,64971,64977,64978,64992,64993,64994,64996,64997,64998,65124,65125,65126,65127,65128,65129,65130,65131,65132,65133,65134,65135,87202); diff --git a/data/sql/updates/pending_db_world/rev_1665250992619716400.sql b/data/sql/updates/db_world/2022_10_15_04.sql similarity index 93% rename from data/sql/updates/pending_db_world/rev_1665250992619716400.sql rename to data/sql/updates/db_world/2022_10_15_04.sql index 6ea4cd1f6..07e950258 100644 --- a/data/sql/updates/pending_db_world/rev_1665250992619716400.sql +++ b/data/sql/updates/db_world/2022_10_15_04.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_15_03 -> 2022_10_15_04 -- Rookery Whelp (10161) DELETE FROM `creature_loot_template` WHERE `Entry` = 10161; UPDATE `creature_template` SET `lootid` = 0, `skinloot` = 0 WHERE (`entry` = 10161); diff --git a/data/sql/updates/pending_db_world/rev_1665269180018074500.sql b/data/sql/updates/db_world/2022_10_15_05.sql similarity index 59% rename from data/sql/updates/pending_db_world/rev_1665269180018074500.sql rename to data/sql/updates/db_world/2022_10_15_05.sql index 690f950c3..0885f553c 100644 --- a/data/sql/updates/pending_db_world/rev_1665269180018074500.sql +++ b/data/sql/updates/db_world/2022_10_15_05.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_15_04 -> 2022_10_15_05 -- UPDATE `creature` SET `spawntimesecs`=180 WHERE `id1`=10919; diff --git a/data/sql/updates/pending_db_world/rev_1665525266543513900.sql b/data/sql/updates/db_world/2022_10_15_06.sql similarity index 79% rename from data/sql/updates/pending_db_world/rev_1665525266543513900.sql rename to data/sql/updates/db_world/2022_10_15_06.sql index 2308fb3fc..ab767a301 100644 --- a/data/sql/updates/pending_db_world/rev_1665525266543513900.sql +++ b/data/sql/updates/db_world/2022_10_15_06.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_15_05 -> 2022_10_15_06 -- -- Remove skinning loot from Giant Buzzard UPDATE `creature_template` SET `skinloot` = 0 WHERE `entry` = 2831; From 6263a0a8a56b7b65de6a788e02cb41a2b095b280 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 15 Oct 2022 12:14:57 -0300 Subject: [PATCH 64/66] fix(Scripts/TempleOfAhnQiraj): Fix double spawns during Cthun phase 2 and several other fixes (#13413) * fix(Scripts/TempleOfAhnQiraj): Fix double spawns during Cthun phase 2 * Update boss_cthun.cpp * dont teleport if you move away from the teleport pad * clear events * prevent portals from chasing pets * fix the jump tele timer * update eye combat reach * delay the transition slightly * Update boss_cthun.cpp * Update boss_cthun.cpp * make exit trigger cast rubble rocky * Update boss_cthun.cpp * fix tentacle animations * Update rev_1665784753998414100.sql * eye tentacle animations * only spit out if alive * Update rev_1665784753998414100.sql * Update rev_1665784753998414100.sql --- .../rev_1665784753998414100.sql | 4 + .../Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp | 78 ++++++++++--------- 2 files changed, 46 insertions(+), 36 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1665784753998414100.sql diff --git a/data/sql/updates/pending_db_world/rev_1665784753998414100.sql b/data/sql/updates/pending_db_world/rev_1665784753998414100.sql new file mode 100644 index 000000000..c5a9fcbb8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665784753998414100.sql @@ -0,0 +1,4 @@ +-- +UPDATE `creature_template` SET `unit_flags` = `unit_flags` |256|512 WHERE `entry` IN (15910, 15904, 15896); +UPDATE `creature_model_info` SET `CombatReach` = 15 WHERE `displayID` IN (15556, 15790, 15793); +UPDATE `creature_summon_groups` SET `summonType` = 6, `summonTime` = 500 WHERE `summonerId` = 15589 AND `summonerType` = 0; diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp index b0e57f64d..a5e3efe93 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp @@ -102,6 +102,7 @@ enum Misc { MAX_TENTACLE_GROUPS = 5, NPC_TRIGGER = 15384, + NPC_EXIT_TRIGGER = 15800 }; enum Yells @@ -260,7 +261,7 @@ struct boss_eye_of_cthun : public BossAI { if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) { - if (Creature* tentacle = me->SummonCreature(NPC_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 1000)) + if (Creature* tentacle = me->SummonCreature(NPC_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) { tentacle->AI()->AttackStart(target); } @@ -310,17 +311,9 @@ struct boss_eye_of_cthun : public BossAI me->SetTarget(ObjectGuid::Empty); me->StopMoving(); - if (ClockWise) - { - me->SetFacingTo(DarkGlareAngle + DarkGlareTick * float(M_PI) / 35); - me->SetOrientation(DarkGlareAngle + DarkGlareTick * float(M_PI) / 35); - - } - else - { - me->SetFacingTo(DarkGlareAngle - DarkGlareTick * float(M_PI) / 35); - me->SetOrientation(DarkGlareAngle - DarkGlareTick * float(M_PI) / 35); - } + float angle = ClockWise ? DarkGlareAngle + DarkGlareTick * float(M_PI) / 35 : DarkGlareAngle - DarkGlareTick * float(M_PI) / 35; + me->SetFacingTo(angle); + me->SetOrientation(angle); DoCastSelf(SPELL_DARK_GLARE); @@ -354,7 +347,7 @@ struct boss_eye_of_cthun : public BossAI void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override { //Only if it will kill - if (damage < me->GetHealth()) + if (damage < me->GetHealth() || !me->GetHealth()) return; //Fake death in phase 0 or 1 (green beam or dark glare phase) @@ -376,10 +369,13 @@ struct boss_eye_of_cthun : public BossAI me->RemoveAllAuras(); _scheduler.CancelAll(); - if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + me->m_Events.AddEventAtOffset([this]() { - cthun->AI()->DoAction(ACTION_START_PHASE_TWO); - } + if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) + { + cthun->AI()->DoAction(ACTION_START_PHASE_TWO); + } + }, 3s); } private: @@ -476,7 +472,7 @@ struct boss_cthun : public BossAI 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 (Creature* spawned = me->SummonCreature(NPC_GIANT_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) { spawned->AI()->AttackStart(target); } @@ -488,7 +484,7 @@ struct boss_cthun : public BossAI 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 (Creature* spawned = me->SummonCreature(NPC_GIANT_EYE_TENTACLE, *target, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) { spawned->AI()->AttackStart(target); } @@ -579,7 +575,7 @@ struct boss_cthun : public BossAI //Spawn flesh tentacle for (uint8 i = 0; i < 2; i++) { - me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000); } }); } @@ -985,30 +981,37 @@ public: { 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)) { - if (Creature* trigger = player->FindNearestCreature(NPC_TRIGGER, 15.0f)) + trigger->CastSpell(player, SPELL_EXIT_STOMACH, true); + + if (Creature* exittrigger = player->FindNearestCreature(NPC_EXIT_TRIGGER, 15.0f)) { - trigger->CastSpell(player, SPELL_EXIT_STOMACH, true); + exittrigger->CastSpell(player, SPELL_RUBBLE_ROCKY, true); } - }, 3s); - - player->m_Events.AddEventAtOffset([player]() - { - player->JumpTo(0.0f, 80.0f, false); - }, 5s); + } player->m_Events.AddEventAtOffset([player, cthun]() { - if (cthun) + if (Creature* trigger = player->FindNearestCreature(NPC_EXIT_TRIGGER, 10.0f)) { - player->NearTeleportTo(cthun->GetPositionX(), cthun->GetPositionY(), cthun->GetPositionZ() + 10, float(rand32() % 6)); - } + player->JumpTo(0.0f, 80.0f, false); - player->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); - }, 6s); + 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); + }, 1s); + } + else + { + player->m_Events.KillAllEvents(false); + } + }, 3s); } } @@ -1027,7 +1030,10 @@ public: { if (Creature* cthun = instance->GetCreature(DATA_CTHUN)) { - cthun->CastSpell(player, SPELL_SPIT_OUT, true); + if (cthun->IsAlive()) + { + cthun->CastSpell(player, SPELL_SPIT_OUT, true); + } } } From 3a1bfe6e90d0f1e61f25cbcfb8e04a6ecea9a968 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 15 Oct 2022 12:15:39 -0300 Subject: [PATCH 65/66] fix(DB/creature_template): Remove gold from Giant Eye Tentacle (#13414) Create rev_1665799472044108200.sql --- data/sql/updates/pending_db_world/rev_1665799472044108200.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1665799472044108200.sql diff --git a/data/sql/updates/pending_db_world/rev_1665799472044108200.sql b/data/sql/updates/pending_db_world/rev_1665799472044108200.sql new file mode 100644 index 000000000..daa0d6338 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1665799472044108200.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `mingold` = 0, `maxgold` = 0 WHERE (`entry` = 15334); From d68c5f9b652004253b527bafb4e3967bc472058a Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 15 Oct 2022 15:17:56 +0000 Subject: [PATCH 66/66] chore(DB): import pending files Referenced commit(s): 3a1bfe6e90d0f1e61f25cbcfb8e04a6ecea9a968 --- .../rev_1665784753998414100.sql => db_world/2022_10_15_07.sql} | 1 + .../rev_1665799472044108200.sql => db_world/2022_10_15_08.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1665784753998414100.sql => db_world/2022_10_15_07.sql} (88%) rename data/sql/updates/{pending_db_world/rev_1665799472044108200.sql => db_world/2022_10_15_08.sql} (66%) diff --git a/data/sql/updates/pending_db_world/rev_1665784753998414100.sql b/data/sql/updates/db_world/2022_10_15_07.sql similarity index 88% rename from data/sql/updates/pending_db_world/rev_1665784753998414100.sql rename to data/sql/updates/db_world/2022_10_15_07.sql index c5a9fcbb8..56bf55c43 100644 --- a/data/sql/updates/pending_db_world/rev_1665784753998414100.sql +++ b/data/sql/updates/db_world/2022_10_15_07.sql @@ -1,3 +1,4 @@ +-- DB update 2022_10_15_06 -> 2022_10_15_07 -- UPDATE `creature_template` SET `unit_flags` = `unit_flags` |256|512 WHERE `entry` IN (15910, 15904, 15896); UPDATE `creature_model_info` SET `CombatReach` = 15 WHERE `displayID` IN (15556, 15790, 15793); diff --git a/data/sql/updates/pending_db_world/rev_1665799472044108200.sql b/data/sql/updates/db_world/2022_10_15_08.sql similarity index 66% rename from data/sql/updates/pending_db_world/rev_1665799472044108200.sql rename to data/sql/updates/db_world/2022_10_15_08.sql index daa0d6338..fb943501f 100644 --- a/data/sql/updates/pending_db_world/rev_1665799472044108200.sql +++ b/data/sql/updates/db_world/2022_10_15_08.sql @@ -1,2 +1,3 @@ +-- DB update 2022_10_15_07 -> 2022_10_15_08 -- UPDATE `creature_template` SET `mingold` = 0, `maxgold` = 0 WHERE (`entry` = 15334);