From bb6009adf0bf0832acfbc8a0cea97b4bc9efe9a0 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 3 May 2023 06:10:05 -0300 Subject: [PATCH 001/107] fix(DB/SAI): Rework Trash SAI for The Botanica (#16135) --- .../rev_1682710323496877200.sql | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682710323496877200.sql diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql new file mode 100644 index 000000000..ed0afe0d9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql @@ -0,0 +1,95 @@ +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (34798, 34797, 34644, 34359, 34358, 27637, 34254, 34642, 34641); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(34798, 34798, 39121), +(34797, 34797, 39120), +(34644, 34644, 39122), +(34359, 34359, 39128), +(34358, 34358, 39127), +(27637, 27637, 39125), +(34254, 34254, 39126), +(34642, 34642, 39347), +(34641, 34641, 39129); + +-- Small Updates +UPDATE `smart_scripts` SET `event_param1` = 7300, `event_param2` = 15350, `event_param3` = 18200, `event_param4` = 25700 WHERE (`entryorguid` = 19505) AND (`source_type` = 0) AND (`id` IN (1)); -- Sunseeker Channeler + +-- Complete Rewrites +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (18419, 17993, 18405, 19633, 18404, 19608, 19486, 18422, 19507, 18421, 19557, 19508, 19509, 19512, 19598, 20078, 20083, 19958, 19843, 25354)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18419, 0, 0, 0, 0, 0, 100, 0, 8550, 20050, 13200, 20050, 0, 11, 34800, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Greenkeeper - In Combat - Cast \'Impending Coma\''), +(18419, 0, 1, 0, 0, 0, 100, 0, 1200, 2400, 2400, 3600, 0, 11, 34798, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Greenkeeper - In Combat - Cast \'Greenkeeper`s Fury\''), +(18419, 0, 2, 0, 0, 0, 100, 0, 8550, 15200, 7250, 17000, 0, 11, 34797, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Greenkeeper - In Combat - Cast \'Nature Shock\''), +(17993, 0, 0, 0, 74, 0, 100, 1, 0, 50, 0, 0, 25, 11, 34784, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Protector - On Friendly Between 0-50% Health - Cast \'Intervene\' (No Repeat)'), +(17993, 0, 1, 0, 0, 0, 100, 0, 5250, 17800, 1200, 21200, 0, 11, 29765, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Protector - In Combat - Cast \'Crystal Strike\''), +(17993, 0, 2, 0, 2, 0, 100, 1, 0, 20, 0, 0, 0, 11, 35399, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Protector - Between 0-20% Health - Cast \'Spell Reflection\' (No Repeat)'), +(18405, 0, 0, 0, 0, 0, 100, 0, 7600, 16400, 15700, 25300, 0, 11, 34793, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Tempest-Forge Peacekeeper - In Combat - Cast \'Arcane Blast\''), +(18405, 0, 1, 0, 0, 0, 100, 0, 9700, 16200, 7300, 19400, 0, 11, 34791, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tempest-Forge Peacekeeper - In Combat - Cast \'Arcane Explosion\''), +(18405, 0, 2, 0, 0, 0, 100, 0, 6050, 15000, 18250, 26700, 0, 11, 34785, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Tempest-Forge Peacekeeper - In Combat - Cast \'Arcane Volley\''), +(19633, 0, 0, 0, 0, 0, 100, 2, 7350, 13950, 12150, 15750, 0, 11, 17194, 0, 0, 0, 0, 0, 5, 25, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Mender - In Combat - Cast \'Mind Blast\' (Normal Dungeon)'), +(19633, 0, 1, 0, 0, 0, 100, 4, 0, 0, 2000, 3000, 0, 11, 17287, 64, 0, 0, 0, 0, 5, 25, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Mender - In Combat - Cast \'Mind Blast\' (Heroic Dungeon)'), +(19633, 0, 2, 0, 74, 0, 100, 0, 0, 75, 10000, 10000, 40, 11, 35096, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Mender - On Friendly Between 0-75% Health - Cast \'Greater Heal\''), +(19633, 0, 3, 0, 23, 0, 100, 0, 34809, 0, 3600, 3600, 0, 11, 34809, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Mender - On Aura \'Holy Fury\' Missing - Cast \'Holy Fury\''), +(19633, 0, 4, 0, 16, 0, 100, 0, 34809, 30, 12150, 15750, 1, 11, 34809, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Mender - On Friendly Unit Missing Buff \'Holy Fury\' - Cast \'Holy Fury\''), +(18404, 0, 0, 0, 0, 0, 100, 0, 14350, 23050, 17000, 29150, 0, 11, 34821, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Steward - In Combat - Cast \'Arcane Flurry\''), +(19608, 0, 0, 0, 0, 0, 100, 0, 3850, 11250, 1050, 14350, 0, 11, 34644, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Frayer Wildling - In Combat - Cast \'Lash\''), +(19486, 0, 0, 0, 0, 0, 100, 0, 12150, 28750, 12150, 28750, 0, 11, 34359, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Chemist - In Combat - Cast \'Fire Breath Potion\''), +(19486, 0, 1, 0, 0, 0, 100, 0, 6900, 15800, 18250, 29650, 0, 11, 34358, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Chemist - In Combat - Cast \'Vial of Poison\''), +(18422, 0, 0, 0, 74, 0, 100, 0, 0, 60, 13300, 35100, 40, 11, 34361, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Botanist - On Friendly Between 0-60% Health - Cast \'Regrowth\''), +(18422, 0, 1, 0, 0, 0, 100, 0, 8500, 20600, 15800, 20600, 0, 11, 34350, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Botanist - In Combat - Cast \'Nature`s Rage\''), +(19507, 0, 0, 0, 0, 0, 100, 0, 8500, 13350, 19350, 27650, 0, 11, 34642, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Gene-Splicer - In Combat - Cast \'Death & Decay\''), +(19507, 0, 1, 0, 0, 0, 100, 0, 21850, 25500, 35000, 35000, 0, 11, 34247, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Gene-Splicer - In Combat - Cast \'Summon Lasher Beast\''), +(18421, 0, 0, 0, 0, 0, 100, 0, 14200, 27900, 120300, 125150, 0, 11, 34355, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Researcher - In Combat - Cast \'Poison Shield\''), +(18421, 0, 1, 0, 0, 0, 100, 0, 6050, 15750, 6050, 15750, 0, 87, 1842101, 1842102, 1842103, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Researcher - In Combat - Cast Random Spell'), +(19557, 0, 0, 0, 0, 0, 100, 0, 3950, 12050, 1200, 13600, 0, 11, 34644, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Greater Frayer - In Combat - Cast \'Lash\''), +(19508, 0, 0, 0, 0, 0, 50, 0, 0, 0, 2200, 3800, 0, 11, 34641, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Herbalist - In Combat - Cast \'Spade Toss\''), +(19508, 0, 1, 0, 0, 0, 100, 0, 8350, 12150, 13350, 26750, 0, 11, 22127, 0, 0, 0, 0, 0, 6, 30, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Herbalist - In Combat - Cast \'Entangling Roots\''), +(19509, 0, 0, 0, 0, 0, 100, 0, 6050, 19500, 7300, 23100, 0, 11, 34640, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Harvester - In Combat - Cast \'Wilting Touch\''), +(19509, 0, 1, 0, 0, 0, 100, 0, 6100, 14450, 16950, 46200, 0, 11, 34639, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Harvester - In Combat - Cast \'Polymorph\''), +(19512, 0, 0, 0, 0, 0, 100, 0, 6100, 13350, 1200, 22300, 0, 11, 15284, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Reaper - In Combat - Cast \'Cleave\''), +(19512, 0, 1, 0, 0, 0, 100, 4, 17200, 22600, 21200, 26400, 0, 11, 34626, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Reaper - In Combat - Cast \'Pale Death\' (Heroic Dungeon)'), +(19512, 0, 2, 0, 8, 0, 100, 0, 34222, 0, 1200, 1200, 0, 11, 34173, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Reaper - On Spellhit \'Sunseeker Blessing\' - Cast \'Sunseeker Blessing\''), +(19512, 0, 3, 0, 8, 0, 100, 0, 34200, 0, 1200, 1200, 0, 11, 34173, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Reaper - On Spellhit \'Crystal Channel\' - Cast \'Sunseeker Blessing\''), +(19598, 0, 0, 0, 0, 0, 100, 0, 4850, 13350, 1100, 17900, 0, 11, 34351, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Mutate Fleshlasher - In Combat - Cast \'Vicious Bite\''), +(20078, 0, 0, 0, 0, 0, 100, 0, 10100, 14900, 1200, 23100, 0, 11, 34820, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Summoned Bloodwarder Reservist - In Combat - Cast \'Arcane Strike\''), +(20083, 0, 0, 0, 23, 0, 100, 0, 34809, 0, 3600, 3600, 0, 11, 34809, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Summoned Bloodwarder Mender - On Aura \'Holy Fury\' Missing - Cast \'Holy Fury\''), +(20083, 0, 1, 0, 0, 0, 100, 2, 12100, 16200, 15750, 18450, 0, 11, 17194, 0, 0, 0, 0, 0, 5, 25, 0, 0, 0, 0, 0, 0, 0, 'Summoned Bloodwarder Mender - In Combat - Cast \'Mind Blast\' (Normal Dungeon)'), +(20083, 0, 2, 0, 0, 0, 100, 4, 12100, 16200, 2000, 3000, 0, 11, 17287, 0, 0, 0, 0, 0, 5, 25, 0, 0, 0, 0, 0, 0, 0, 'Summoned Bloodwarder Mender - In Combat - Cast \'Mind Blast\' (Heroic Dungeon)'), +(20083, 0, 3, 0, 74, 0, 100, 0, 0, 75, 10000, 10000, 40, 11, 35096, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Summoned Bloodwarder Mender - On Friendly Between 0-75% Health - Cast \'Greater Heal\''), +(20083, 0, 4, 0, 16, 0, 100, 0, 34809, 30, 13300, 18200, 1, 11, 34809, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Summoned Bloodwarder Mender - On Friendly Unit Missing Buff \'Holy Fury\' - Cast \'Holy Fury\''), +(19958, 0, 0, 0, 0, 0, 100, 0, 5750, 7000, 4550, 13150, 0, 11, 34752, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'White Seedling - In Combat - Cast \'Freezing Touch\''), +(19958, 0, 1, 0, 37, 0, 100, 0, 0, 0, 0, 0, 0, 11, 34770, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'White Seedling - On Initialize - Cast \'Plant Spawn Effect\''), +(19843, 0, 0, 0, 67, 0, 100, 0, 1150, 13350, 0, 0, 0, 11, 34614, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Trickster - On Behind Target - Cast \'Backstab\''), +(25354, 0, 0, 0, 0, 0, 100, 0, 4700, 13100, 1150, 17250, 0, 11, 34351, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Mutate Fleshlasher - In Combat - Cast \'Vicious Bite\''); + +-- Partial Rewrites +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17994) AND (`source_type` = 0) AND (`id` IN (2)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17994, 0, 2, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Falconer - In Combat - Say Line 1'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17994) AND (`source_type` = 0) AND (`id` IN (0, 2, 5)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17994, 0, 0, 1, 0, 0, 100, 512, 12150, 12150, 6050, 15750, 0, 64, 1, 0, 0, 0, 0, 0, 5, 40, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Falconer - In Combat - Store Targetlist'), +(17994, 0, 2, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Falconer - In Combat - Say Line 1'), +(17994, 0, 5, 0, 0, 0, 100, 0, 8500, 10900, 14150, 21850, 0, 11, 32908, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bloodwarder Falconer - In Combat - Cast \'Wing Clip\''); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` IN (1842101, 1842102, 1842103)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1842101, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 11, 34352, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Researcher - Actionlist Random Cast - Cast \'Mind Shock\''), +(1842102, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 11, 34353, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Researcher - Actionlist Random Cast - Cast \'Frost Shock\''), +(1842103, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 11, 34354, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunseeker Researcher - Actionlist Random Cast - Cast \'Flame Shock\''); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 19511) AND (`source_type` = 0) AND (`id` IN (0, 1, 2)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(19511, 0, 0, 0, 0, 0, 100, 0, 6100, 19900, 20000, 24000, 0, 11, 34616, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Inciter - In Combat - Cast \'Deadly Poison\''), +(19511, 0, 1, 0, 0, 0, 100, 0, 4300, 9700, 21700, 38600, 0, 11, 34615, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Inciter - In Combat - Cast \'Mind-numbing Poison\''), +(19511, 0, 2, 0, 0, 0, 100, 0, 13400, 20600, 20600, 29000, 0, 11, 30621, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nethervine Inciter - In Combat - Cast \'Kidney Shot\''); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 19513; +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 19513); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(19513, 0, 0, 0, 0, 0, 100, 0, 8000, 24000, 28000, 36000, 0, 11, 30584, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Mutate Fear-Shrieker - In Combat - Cast \'Fear\''); + +DELETE FROM `creature_template_addon` WHERE (`entry` IN (19843, 21565)); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(19843, 0, 0, 0, 1, 0, 0, '30991'), +(21565, 0, 0, 0, 1, 0, 0, '30991'); From eea71a415e15c954837d30d5eaf5c0cb6d86386d Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 3 May 2023 09:12:22 +0000 Subject: [PATCH 002/107] chore(DB): import pending files Referenced commit(s): bb6009adf0bf0832acfbc8a0cea97b4bc9efe9a0 --- .../rev_1682710323496877200.sql => db_world/2023_05_03_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1682710323496877200.sql => db_world/2023_05_03_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/db_world/2023_05_03_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682710323496877200.sql rename to data/sql/updates/db_world/2023_05_03_00.sql index ed0afe0d9..cd895ea6d 100644 --- a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql +++ b/data/sql/updates/db_world/2023_05_03_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_01_00 -> 2023_05_03_00 DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (34798, 34797, 34644, 34359, 34358, 27637, 34254, 34642, 34641); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES (34798, 34798, 39121), From 3dbdea5e2853399d9b62989a279e562ce966cdd4 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Wed, 3 May 2023 06:27:44 -0300 Subject: [PATCH 003/107] fix: Crash on ProcessDelayedDamages (#16166) --- src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/World/World.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5c68703c6..219a1e274 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -814,7 +814,7 @@ void Unit::DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb) uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, bool /*allowGM*/, Spell const* damageSpell /*= nullptr*/, bool delayed) { - if (delayed && attacker->GetTypeId() == TYPEID_PLAYER && attacker->GetGUID() != victim->GetGUID()) + if (delayed && attacker && attacker->GetTypeId() == TYPEID_PLAYER && attacker->GetGUID() != victim->GetGUID()) { sWorld->AddDelayedDamage(attacker, victim, damage, cleanDamage, damagetype, damageSchoolMask, spellProto, durabilityLoss); return 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 4cf9e8bc1..1488c39d5 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -3357,6 +3357,11 @@ void World::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanD void World::ProcessDelayedDamages() { for (auto& damage : _delayedDamages) + { + if (!damage.victim) + continue; + Unit::DealDamage(damage.attacker, damage.victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss); + } _delayedDamages.clear(); } From a957445ba84273c5330286f7fc3d1f5c9e1290d7 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 3 May 2023 14:47:14 -0300 Subject: [PATCH 004/107] fix(DB/Event): Correct Orphan Matron Mercy item restoration gossip (#16159) * Create rev_1683034504648319100.sql * Update rev_1683034504648319100.sql --- .../rev_1683034504648319100.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683034504648319100.sql diff --git a/data/sql/updates/pending_db_world/rev_1683034504648319100.sql b/data/sql/updates/pending_db_world/rev_1683034504648319100.sql new file mode 100644 index 000000000..45c7594a0 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683034504648319100.sql @@ -0,0 +1,20 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 8568; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 8568, 1, 0, 0, 2, 0, 31880, 1, 0, 1, 0, 0, '', 'Must not have item 31880'), +(15, 8568, 1, 0, 0, 8, 0, 10942, 0, 0, 0, 0, 0, '', 'Quest 10942 must be rewarded'), +(15, 8568, 1, 0, 0, 12, 0, 10, 0, 0, 0, 0, 0, '', 'Children\'s Week must be active'), +(15, 8568, 2, 0, 0, 2, 0, 31881, 1, 0, 1, 0, 0, '', 'Must not have item 31881'), +(15, 8568, 2, 0, 0, 8, 0, 10943, 0, 0, 0, 0, 0, '', 'Quest 10943 must be rewarded'), +(15, 8568, 2, 0, 0, 12, 0, 10, 0, 0, 0, 0, 0, '', 'Children\'s Week must be active'); + +DELETE FROM `gossip_menu_option` WHERE (`MenuID` = 8568); +INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES +(8568, 1, 0, 'I need a new Blood Elf Orphan Whistle.', 20452, 1, 1, 0, 0, 0, 0, NULL, 0, 0), +(8568, 2, 0, 'I need a new Draenei Orphan Whistle.', 20453, 1, 1, 0, 0, 0, 0, NULL, 0, 0); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 22819); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22819, 0, 1, 3, 62, 0, 100, 0, 8568, 1, 0, 0, 0, 11, 39512, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Orphan Matron Mercy - On Gossip Option 1 Selected - Cast \'OCW Create Blood Elf Orphan Whistle\''), +(22819, 0, 2, 3, 62, 0, 100, 0, 8568, 2, 0, 0, 0, 11, 39513, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Orphan Matron Mercy - On Gossip Option 2 Selected - Cast \'OCW Create Draenei Orphan Whistle\''), +(22819, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Orphan Matron Mercy - Linked - Close Gossip'); From 3a7cf2a28722ae5959f5605f36a4059115aea15c Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 3 May 2023 14:47:57 -0300 Subject: [PATCH 005/107] fix(DB/Creature): Add Namdo Bizzfizzle (#16153) Create rev_1682964437089894300.sql --- .../updates/pending_db_world/rev_1682964437089894300.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682964437089894300.sql diff --git a/data/sql/updates/pending_db_world/rev_1682964437089894300.sql b/data/sql/updates/pending_db_world/rev_1682964437089894300.sql new file mode 100644 index 000000000..4ef91a30d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682964437089894300.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `creature` WHERE `guid`=87022 AND `id1` = 2683; +INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`) VALUES +(87022, 2683, 0, 1, 1, -4923.1, 725.529, 253.1, 6.21499, 300); + +UPDATE `creature_template` SET `npcflag` = `npcflag`&~2 WHERE (`entry` = 2683); From d0ad320a358e7cdc948467e1348aa181dfa55d7e Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 3 May 2023 14:48:12 -0300 Subject: [PATCH 006/107] fix(DB/Creature): Add missing pathing to Exodar Peacekeeper (#16152) Create rev_1682962686229106300.sql Co-authored-by: Rushor --- .../rev_1682962686229106300.sql | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682962686229106300.sql diff --git a/data/sql/updates/pending_db_world/rev_1682962686229106300.sql b/data/sql/updates/pending_db_world/rev_1682962686229106300.sql new file mode 100644 index 000000000..2c0d5e790 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682962686229106300.sql @@ -0,0 +1,189 @@ +-- +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id1` = 16733); + +DELETE FROM `creature_template_addon` WHERE (`entry` = 16733); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(16733, 0, 0, 0, 1, 0, 0, NULL); + +DELETE FROM `creature_addon` WHERE `guid` IN (57721,57722,57731,57732,57733,57735); +INSERT INTO `creature_addon` (`guid`, `path_id`, `bytes2`) VALUES +(57721, 577210, 1), +(57722, 577220, 1), +(57731, 577310, 1), +(57732, 577320, 1), +(57733, 577330, 1), +(57735, 577350, 1); + +UPDATE `creature` SET `position_x` = -3964.55, `position_y` = -11530.3, `position_z` = -136.986, `MovementType` = 2, `wander_distance` = 0 WHERE `id1` = 16733 AND `guid` = 57721; +UPDATE `creature` SET `position_x` = -4000.26, `position_y` = -11597.4, `position_z` = -134.749, `MovementType` = 2, `wander_distance` = 0 WHERE `id1` = 16733 AND `guid` = 57722; +UPDATE `creature` SET `position_x` = -4123.97, `position_y` = -11734.4, `position_z` = -136.587, `MovementType` = 2, `wander_distance` = 0 WHERE `id1` = 16733 AND `guid` = 57731; +UPDATE `creature` SET `position_x` = -4160.04, `position_y` = -11635.9, `position_z` = -98.2858, `MovementType` = 2, `wander_distance` = 0 WHERE `id1` = 16733 AND `guid` = 57732; +UPDATE `creature` SET `position_x` = -4168.59, `position_y` = -11726.2, `position_z` = -137.085, `MovementType` = 2, `wander_distance` = 0 WHERE `id1` = 16733 AND `guid` = 57733; +UPDATE `creature` SET `position_x` = -4278.27, `position_y` = -11825 , `position_z` = -100.07 , `MovementType` = 2, `wander_distance` = 0 WHERE `id1` = 16733 AND `guid` = 57735; + +DELETE FROM `waypoint_data` WHERE `id` IN (577210,577220,577310,577320,577330,577350); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(577210,1,-3964.55,-11530.3,-136.986,NULL,0,0,0,100,0), +(577210,2,-3985.86,-11501.2,-137.15,NULL,0,0,0,100,0), +(577210,3,-4005.68,-11475.4,-137.284,NULL,0,0,0,100,0), +(577210,4,-4001.85,-11468.3,-137.213,NULL,0,0,0,100,0), +(577210,5,-3973.46,-11441.5,-136.78,NULL,0,0,0,100,0), +(577210,6,-3966.69,-11439.8,-136.706,NULL,20000,0,0,100,0), +(577210,7,-3971.33,-11437.9,-136.746,NULL,0,0,0,100,0), +(577210,8,-3991.26,-11453.1,-137.029,NULL,0,0,0,100,0), +(577210,9,-4005.16,-11471,-137.261,NULL,0,0,0,100,0), +(577210,10,-4006.18,-11477.8,-137.298,NULL,0,0,0,100,0), +(577210,11,-3989.38,-11505.2,-137.206,NULL,0,0,0,100,0), +(577210,12,-3966.39,-11531.2,-136.995,NULL,0,0,0,100,0), +(577210,13,-3961.64,-11544.2,-134.231,NULL,0,0,0,100,0), +(577210,14,-3952.14,-11563.7,-134.043,NULL,0,0,0,100,0), +(577210,15,-3952.28,-11567.8,-134.007,NULL,20000,0,0,100,0), +(577210,16,-3951.26,-11564.1,-134.015,NULL,0,0,0,100,0), +(577210,17,-3957.38,-11547.9,-134.2,NULL,0,0,0,100,0), +(577220,1,-4000.26,-11597.4,-134.749,NULL,0,0,0,100,0), +(577220,2,-4005.16,-11594.7,-134.805,NULL,0,0,0,100,0), +(577220,3,-4013.7,-11585.9,-138.178,NULL,0,0,0,100,0), +(577220,4,-4024.65,-11567.3,-138.212,NULL,0,0,0,100,0), +(577220,5,-4037.64,-11538.8,-138.257,NULL,0,0,0,100,0), +(577220,6,-4041.97,-11534.4,-138.292,NULL,0,0,0,100,0), +(577220,7,-4063.44,-11530.5,-138.529,NULL,0,0,0,100,0), +(577220,8,-4069.51,-11525.9,-135.289,NULL,0,0,0,100,0), +(577220,9,-4076.41,-11518.8,-135.343,NULL,0,0,0,100,0), +(577220,10,-4074.87,-11507.5,-135.282,NULL,18000,0,0,100,0), +(577220,11,-4083.81,-11512.3,-135.406,NULL,0,0,0,100,0), +(577220,12,-4121.6,-11506.2,-135.827,NULL,0,0,0,100,0), +(577220,13,-4133.15,-11500.3,-130.172,NULL,0,0,0,100,0), +(577220,14,-4138.62,-11491.4,-130.857,NULL,0,0,0,100,0), +(577220,15,-4141.32,-11477.4,-130.622,NULL,0,0,0,100,0), +(577220,16,-4141.89,-11460.9,-130.799,NULL,0,0,0,100,0), +(577220,17,-4138.4,-11435.6,-130.672,NULL,0,0,0,100,0), +(577220,18,-4133.74,-11427,-125.835,NULL,0,0,0,100,0), +(577220,19,-4119.66,-11414.2,-115.783,NULL,0,0,0,100,0), +(577220,20,-4105.34,-11407.9,-107.238,NULL,0,0,0,100,0), +(577220,21,-4091.21,-11404.7,-99.2669,NULL,0,0,0,100,0), +(577220,22,-4074.7,-11406,-90.345,NULL,0,0,0,100,0), +(577220,23,-4056.44,-11414.2,-79.7705,NULL,0,0,0,100,0), +(577220,24,-4043.48,-11426,-70.746,NULL,0,0,0,100,0), +(577220,25,-4036.4,-11436.7,-64.2262,NULL,0,0,0,100,0), +(577220,26,-4030.01,-11458.3,-52.8119,NULL,18000,0,0,100,0), +(577220,27,-4033.16,-11456.2,-53.8434,NULL,0,0,0,100,0), +(577220,28,-4038.72,-11441.7,-62.5133,NULL,0,0,0,100,0), +(577220,29,-4049.57,-11427.6,-72.6746,NULL,0,0,0,100,0), +(577220,30,-4062.21,-11417,-82.2978,NULL,0,0,0,100,0), +(577220,31,-4079.56,-11411.4,-93.0459,NULL,0,0,0,100,0), +(577220,32,-4097.99,-11411.9,-104.024,NULL,0,0,0,100,0), +(577220,33,-4115.84,-11418.2,-115.242,NULL,0,0,0,100,0), +(577220,34,-4129.49,-11429.9,-125.645,NULL,0,0,0,100,0), +(577220,35,-4134,-11437.2,-130.575,NULL,0,0,0,100,0), +(577220,36,-4137.21,-11473.6,-130.49,NULL,0,0,0,100,0), +(577220,37,-4129.6,-11494.8,-130.07,NULL,0,0,0,100,0), +(577220,38,-4122.3,-11506.6,-135.837,NULL,0,0,0,100,0), +(577220,39,-4116.53,-11541.2,-135.902,NULL,18000,0,0,100,0), +(577220,40,-4113.37,-11535.9,-135.844,NULL,0,0,0,100,0), +(577220,41,-4101.57,-11531.9,-135.691,NULL,0,0,0,100,0), +(577220,42,-4073.59,-11529.4,-135.353,NULL,0,0,0,100,0), +(577220,43,-4062.81,-11529.1,-138.373,NULL,0,0,0,100,0), +(577220,44,-4043.52,-11530.3,-138.297,NULL,0,0,0,100,0), +(577220,45,-4036.65,-11533.7,-138.232,NULL,0,0,0,100,0), +(577220,46,-4030.36,-11544.8,-138.198,NULL,0,0,0,100,0), +(577220,47,-4021.4,-11564.1,-138.165,NULL,0,0,0,100,0), +(577220,48,-4010.53,-11582.4,-138.128,NULL,0,0,0,100,0), +(577220,49,-4002.86,-11592,-134.79,NULL,0,0,0,100,0), +(577220,50,-3997.03,-11595.9,-134.729,NULL,18000,0,0,100,0), +(577310,1,-4123.97,-11734.4,-136.587,NULL,0,0,0,100,0), +(577310,2,-4118.29,-11732.3,-136.517,NULL,0,0,0,100,0), +(577310,3,-4111.5,-11729.9,-139.731,NULL,0,0,0,100,0), +(577310,4,-4096.03,-11722.5,-139.604,NULL,0,0,0,100,0), +(577310,5,-4079.79,-11728.4,-138.844,NULL,0,0,0,100,0), +(577310,6,-4041.34,-11714.8,-138.861,NULL,0,0,0,100,0), +(577310,7,-4079.35,-11728.5,-138.846,NULL,0,0,0,100,0), +(577310,8,-4095.51,-11722.4,-139.599,NULL,0,0,0,100,0), +(577310,9,-4110.96,-11729.7,-139.726,NULL,0,0,0,100,0), +(577310,10,-4118.13,-11732.1,-136.515,NULL,0,0,0,100,0), +(577310,11,-4123.49,-11734.5,-136.58,NULL,0,0,0,100,0), +(577310,12,-4145.98,-11718.9,-136.639,NULL,0,0,0,100,0), +(577320,1,-4160.04,-11635.9,-98.2858,NULL,0,0,0,100,0), +(577320,2,-4160.11,-11642,-98.3087,NULL,0,0,0,100,0), +(577320,3,-4166.08,-11649.5,-98.4071,NULL,10000,0,0,100,0), +(577320,4,-4160.61,-11642.6,-98.3158,NULL,0,0,0,100,0), +(577320,5,-4159.96,-11636,-98.2838,NULL,0,0,0,100,0), +(577320,6,-4168.66,-11621.9,-110.935,NULL,0,0,0,100,0), +(577320,7,-4175.58,-11610.6,-119.556,NULL,0,0,0,100,0), +(577320,8,-4185.24,-11597.1,-124.755,NULL,0,0,0,100,0), +(577320,9,-4205.55,-11587.2,-125.821,NULL,0,0,0,100,0), +(577320,10,-4216.28,-11590.4,-126.035,NULL,0,0,0,100,0), +(577320,11,-4217.73,-11604.7,-125.98,NULL,10000,0,0,100,0), +(577320,12,-4216.95,-11621.4,-132.225,NULL,0,0,0,100,0), +(577320,13,-4215.58,-11645.5,-143.779,NULL,10000,0,0,100,0), +(577320,14,-4217.59,-11627.7,-135.046,NULL,0,0,0,100,0), +(577320,15,-4217.79,-11604.8,-125.983,NULL,10000,0,0,100,0), +(577320,16,-4210.91,-11589.2,-125.943,NULL,0,0,0,100,0), +(577320,17,-4196.69,-11587.8,-125.459,NULL,0,0,0,100,0), +(577320,18,-4185.23,-11597.1,-124.754,NULL,0,0,0,100,0), +(577320,19,-4175.89,-11610.2,-119.694,NULL,0,0,0,100,0), +(577320,20,-4170.21,-11619.4,-112.954,NULL,0,0,0,100,0), +(577320,21,-4162.16,-11632.4,-101.657,NULL,0,0,0,100,0), +(577330,1,-4168.59,-11726.2,-137.085,NULL,0,0,0,100,0), +(577330,2,-4166.14,-11755.3,-137.167,NULL,0,0,0,100,0), +(577330,3,-4179.52,-11763.3,-132.268,NULL,0,0,0,100,0), +(577330,4,-4202.16,-11771.8,-132.429,NULL,0,0,0,100,0), +(577330,5,-4240.82,-11769.1,-131.957,NULL,0,0,0,100,0), +(577330,6,-4264.25,-11738.5,-133.145,NULL,0,0,0,100,0), +(577330,7,-4241.2,-11769,-131.969,NULL,0,0,0,100,0), +(577330,8,-4202.75,-11772.1,-132.402,NULL,0,0,0,100,0), +(577330,9,-4179.05,-11763,-132.259,NULL,0,0,0,100,0), +(577330,10,-4166.3,-11755.7,-137.17,NULL,0,0,0,100,0), +(577330,11,-4166.3,-11736.9,-137.093,NULL,0,0,0,100,0), +(577350,1,-4278.27,-11825,-100.07,NULL,0,0,0,100,0), +(577350,2,-4281.03,-11820.5,-99.9662,NULL,0,0,0,100,0), +(577350,3,-4249.65,-11808.6,-99.4714,NULL,0,0,0,100,0), +(577350,4,-4242,-11807.3,-95.9034,NULL,0,0,0,100,0), +(577350,5,-4233.29,-11805.7,-95.7966,NULL,0,0,0,100,0), +(577350,6,-4230.58,-11803.7,-95.7576,NULL,0,0,0,100,0), +(577350,7,-4232.84,-11797.8,-95.7615,NULL,0,0,0,100,0), +(577350,8,-4237.37,-11793.6,-95.7966,NULL,0,0,0,100,0), +(577350,9,-4241.7,-11794.3,-95.8514,NULL,0,0,0,100,0), +(577350,10,-4246.89,-11798.7,-95.929,NULL,0,0,0,100,0), +(577350,11,-4252.53,-11802.4,-99.481,NULL,0,0,0,100,0), +(577350,12,-4268.98,-11813,-99.7224,NULL,0,0,0,100,0), +(577350,13,-4280.46,-11819.9,-99.9448,NULL,0,0,0,100,0), +(577350,14,-4283.71,-11815.7,-100.099,NULL,0,0,0,100,0), +(577350,15,-4292,-11802,-94.2238,NULL,0,0,0,100,0), +(577350,16,-4296.17,-11795.3,-94.2179,NULL,0,0,0,100,0), +(577350,17,-4277.99,-11792.6,-93.9812,NULL,0,0,0,100,0), +(577350,18,-4257.68,-11777.5,-93.6819,NULL,0,0,0,100,0), +(577350,19,-4251.47,-11767.4,-93.8869,NULL,2000,0,0,100,0), +(577350,20,-4257.47,-11777.3,-93.6774,NULL,0,0,0,100,0), +(577350,21,-4277.78,-11792.4,-93.975,NULL,0,0,0,100,0), +(577350,22,-4295.47,-11795,-94.2096,NULL,0,0,0,100,0), +(577350,23,-4292.53,-11801.4,-94.1985,NULL,0,0,0,100,0), +(577350,24,-4283.88,-11815.7,-100.1,NULL,0,0,0,100,0), +(577350,25,-4281.04,-11819.4,-99.9637,NULL,0,0,0,100,0), +(577350,26,-4252.5,-11802.4,-99.4826,NULL,0,0,0,100,0), +(577350,27,-4246.9,-11798.8,-95.9295,NULL,0,0,0,100,0), +(577350,28,-4242.35,-11794.7,-95.8622,NULL,0,0,0,100,0), +(577350,29,-4237.81,-11793.6,-95.8048,NULL,0,0,0,100,0), +(577350,30,-4233.05,-11797.6,-95.7627,NULL,0,0,0,100,0), +(577350,31,-4230.78,-11803,-95.7548,NULL,0,0,0,100,0), +(577350,32,-4233.12,-11805.6,-95.7916,NULL,0,0,0,100,0), +(577350,33,-4241.47,-11807.3,-95.8974,NULL,0,0,0,100,0), +(577350,34,-4249.19,-11808.5,-99.464,NULL,0,0,0,100,0), +(577350,35,-4269.34,-11813.2,-99.7266,NULL,0,0,0,100,0), +(577350,36,-4280.23,-11819.6,-99.9359,NULL,0,0,0,100,0), +(577350,37,-4278.39,-11825.1,-100.071,NULL,0,0,0,100,0), +(577350,38,-4267.25,-11843,-112.684,NULL,0,0,0,100,0), +(577350,39,-4263.5,-11847.6,-112.621,NULL,0,0,0,100,0), +(577350,40,-4255.47,-11844.2,-112.458,NULL,0,0,0,100,0), +(577350,41,-4249.01,-11840,-116.194,NULL,0,0,0,100,0), +(577350,42,-4222.99,-11823.7,-115.987,NULL,0,0,0,100,0), +(577350,43,-4211.1,-11814.9,-122.457,NULL,0,0,0,100,0), +(577350,44,-4203.26,-11806.5,-127.263,NULL,0,0,0,100,0), +(577350,45,-4196.55,-11794.9,-133.039,NULL,2000,0,0,100,0), +(577350,46,-4202.9,-11805.7,-127.673,NULL,0,0,0,100,0), +(577350,47,-4210.56,-11814.3,-122.803,NULL,0,0,0,100,0), +(577350,48,-4222.96,-11823.5,-116.05,NULL,0,0,0,100,0), +(577350,49,-4248.52,-11839.5,-116.186,NULL,0,0,0,100,0), +(577350,50,-4255.33,-11844.1,-112.454,NULL,0,0,0,100,0), +(577350,51,-4262.23,-11847.2,-112.591,NULL,0,0,0,100,0), +(577350,52,-4266.7,-11843.8,-112.679,NULL,0,0,0,100,0), +(577350,53,-4272.93,-11833.5,-106.236,NULL,0,0,0,100,0); From d7190451cf1d33e78fb55959b921c92a99f8d8e5 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 3 May 2023 17:50:14 +0000 Subject: [PATCH 007/107] chore(DB): import pending files Referenced commit(s): d0ad320a358e7cdc948467e1348aa181dfa55d7e --- .../rev_1682962686229106300.sql => db_world/2023_05_03_01.sql} | 1 + .../rev_1682964437089894300.sql => db_world/2023_05_03_02.sql} | 1 + .../rev_1683034504648319100.sql => db_world/2023_05_03_03.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/rev_1682962686229106300.sql => db_world/2023_05_03_01.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1682964437089894300.sql => db_world/2023_05_03_02.sql} (89%) rename data/sql/updates/{pending_db_world/rev_1683034504648319100.sql => db_world/2023_05_03_03.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1682962686229106300.sql b/data/sql/updates/db_world/2023_05_03_01.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682962686229106300.sql rename to data/sql/updates/db_world/2023_05_03_01.sql index 2c0d5e790..060413509 100644 --- a/data/sql/updates/pending_db_world/rev_1682962686229106300.sql +++ b/data/sql/updates/db_world/2023_05_03_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_03_00 -> 2023_05_03_01 -- DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id1` = 16733); diff --git a/data/sql/updates/pending_db_world/rev_1682964437089894300.sql b/data/sql/updates/db_world/2023_05_03_02.sql similarity index 89% rename from data/sql/updates/pending_db_world/rev_1682964437089894300.sql rename to data/sql/updates/db_world/2023_05_03_02.sql index 4ef91a30d..1e8de1835 100644 --- a/data/sql/updates/pending_db_world/rev_1682964437089894300.sql +++ b/data/sql/updates/db_world/2023_05_03_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_03_01 -> 2023_05_03_02 -- DELETE FROM `creature` WHERE `guid`=87022 AND `id1` = 2683; INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1683034504648319100.sql b/data/sql/updates/db_world/2023_05_03_03.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1683034504648319100.sql rename to data/sql/updates/db_world/2023_05_03_03.sql index 45c7594a0..cc98f964f 100644 --- a/data/sql/updates/pending_db_world/rev_1683034504648319100.sql +++ b/data/sql/updates/db_world/2023_05_03_03.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_03_02 -> 2023_05_03_03 -- DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 8568; INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES From 444793346de74d54a7b0b5cb9d9fc62be5772076 Mon Sep 17 00:00:00 2001 From: AnchyDev <35346484+AnchyDev@users.noreply.github.com> Date: Sat, 6 May 2023 11:39:36 +1000 Subject: [PATCH 008/107] feat(Core/Hooks): Add parameter to detect XP origin for OnGiveXP hook. (#16109) Added enum parameter to detect where XP originated from. --- src/server/game/Entities/Player/KillRewarder.cpp | 1 + src/server/game/Entities/Player/Player.cpp | 9 ++++++--- src/server/game/Entities/Player/Player.h | 10 ++++++++++ src/server/game/Entities/Player/PlayerQuest.cpp | 1 + .../game/Scripting/ScriptDefines/PlayerScript.cpp | 4 ++-- src/server/game/Scripting/ScriptMgr.h | 4 ++-- 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 7ea1c821d..e73930602 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -166,6 +166,7 @@ void KillRewarder::_RewardXP(Player* player, float rate) AddPct(xp, (*i)->GetAmount()); // 4.2.3. Give XP to player. + sScriptMgr->OnGivePlayerXP(player, xp, _victim, PlayerXPSource::XPSOURCE_KILL); player->GiveXP(xp, _victim, _groupRate); if (Pet* pet = player->GetPet()) // 4.2.4. If player has pet, reward pet with XP (100% for single player, 50% for group case). diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index af3df4f38..a8925a7b6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2372,8 +2372,6 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) uint8 level = GetLevel(); - sScriptMgr->OnGivePlayerXP(this, xp, victim); - // Favored experience increase START uint32 zone = GetZoneId(); float favored_exp_mult = 0; @@ -5730,6 +5728,7 @@ void Player::CheckAreaExploreAndOutdoor() XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE)); } + sScriptMgr->OnGivePlayerXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE); GiveXP(XP, nullptr); SendExplorationExperience(areaId, XP); } @@ -6119,7 +6118,11 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping // Xinef: Only for BG activities if (!uVictim) - GiveXP(uint32(honor * (3 + GetLevel() * 0.30f)), nullptr); + { + uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f)); + sScriptMgr->OnGivePlayerXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND); + GiveXP(xp, nullptr); + } } if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ead737bce..1185f058b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -995,6 +995,16 @@ enum PlayerCommandStates CHEAT_WATERWALK = 0x10 }; +// Used for OnGiveXP PlayerScript hook +enum PlayerXPSource +{ + XPSOURCE_KILL = 0, + XPSOURCE_QUEST = 1, + XPSOURCE_QUEST_DF = 2, + XPSOURCE_EXPLORE = 3, + XPSOURCE_BATTLEGROUND = 4 +}; + enum InstantFlightGossipAction { GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT = 500 diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index a7793122e..4056534a7 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -756,6 +756,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, } else { + sScriptMgr->OnGivePlayerXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST); GiveXP(XP, nullptr, isLFGReward); } diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 03254d66c..6b7be2ca5 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -154,11 +154,11 @@ void ScriptMgr::OnBeforeLootMoney(Player* player, Loot* loot) }); } -void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim) +void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource) { ExecuteScript([&](PlayerScript* script) { - script->OnGiveXP(player, amount, victim); + script->OnGiveXP(player, amount, victim, xpSource); }); } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 103553217..241e54991 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -1035,7 +1035,7 @@ public: virtual void OnBeforeLootMoney(Player* /*player*/, Loot* /*loot*/) {} // Called when a player gains XP (before anything is given) - virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/) { } + virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/, uint8 /*xpSource*/) { } // Called when a player's reputation changes (before it is actually changed) virtual bool OnReputationChange(Player* /*player*/, uint32 /*factionID*/, int32& /*standing*/, bool /*incremental*/) { return true; } @@ -2240,7 +2240,7 @@ public: /* PlayerScript */ void OnPlayerTalentsReset(Player* player, bool noCost); void OnPlayerMoneyChanged(Player* player, int32& amount); void OnBeforeLootMoney(Player* player, Loot* loot); - void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim); + void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource); bool OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental); void OnPlayerReputationRankChange(Player* player, uint32 factionID, ReputationRank newRank, ReputationRank oldRank, bool increased); void OnPlayerLearnSpell(Player* player, uint32 spellID); From d282cce4af69110fa035954b3c81258a1e560b5e Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Sun, 7 May 2023 08:58:38 -0300 Subject: [PATCH 009/107] fix(Core/Spells): Delayed Damage system (#16183) --- src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Entities/Unit/Unit.h | 6 ++++-- src/server/game/Globals/ObjectAccessor.cpp | 11 +++++++++++ src/server/game/Globals/ObjectAccessor.h | 1 + src/server/game/World/IWorld.cpp | 4 +++- src/server/game/World/IWorld.h | 2 +- src/server/game/World/World.cpp | 16 +++++++++++++--- src/server/game/World/World.h | 2 +- 8 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 219a1e274..b3d7086e9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -816,7 +816,7 @@ uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage { if (delayed && attacker && attacker->GetTypeId() == TYPEID_PLAYER && attacker->GetGUID() != victim->GetGUID()) { - sWorld->AddDelayedDamage(attacker, victim, damage, cleanDamage, damagetype, damageSchoolMask, spellProto, durabilityLoss); + sWorld->AddDelayedDamage(attacker->GetGUID(), victim->GetGUID(), damage, cleanDamage, damagetype, damageSchoolMask, spellProto, durabilityLoss, attacker->GetMapId(), attacker->GetInstanceId()); return 0; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 3213c01b9..430029611 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -759,14 +759,16 @@ struct SpellNonMeleeDamage; struct DelayedDamage { - Unit* attacker; - Unit* victim; + ObjectGuid attacker; + ObjectGuid victim; uint32 damage; CleanDamage const* cleanDamage; DamageEffectType damagetype; SpellSchoolMask damageSchoolMask; SpellInfo const* spellProto; bool durabilityLoss; + uint32 mapId; + uint32 instanceId; }; class DamageInfo diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index a529e4e00..f2ef95526 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -212,6 +212,17 @@ Unit* ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid const guid) return GetCreature(u, guid); } +Unit* ObjectAccessor::GetUnit(Map const* map, ObjectGuid const guid) +{ + if (guid.IsPlayer()) + return GetPlayer(map, guid); + + if (guid.IsPet()) + return const_cast(map)->GetPet(guid); + + return const_cast(map)->GetCreature(guid); +} + Creature* ObjectAccessor::GetCreature(WorldObject const& u, ObjectGuid const guid) { return u.GetMap()->GetCreature(guid); diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 7c6c003f5..8532dba74 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -71,6 +71,7 @@ namespace ObjectAccessor Transport* GetTransport(WorldObject const& u, ObjectGuid const guid); DynamicObject* GetDynamicObject(WorldObject const& u, ObjectGuid const guid); Unit* GetUnit(WorldObject const&, ObjectGuid const guid); + Unit* GetUnit(Map const* map, ObjectGuid const guid); Creature* GetCreature(WorldObject const& u, ObjectGuid const guid); Pet* GetPet(WorldObject const&, ObjectGuid const guid); Player* GetPlayer(Map const*, ObjectGuid const guid); diff --git a/src/server/game/World/IWorld.cpp b/src/server/game/World/IWorld.cpp index c29b2729d..ae421903a 100644 --- a/src/server/game/World/IWorld.cpp +++ b/src/server/game/World/IWorld.cpp @@ -20,7 +20,7 @@ class Unit; class IWorld; -void IWorld::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) +void IWorld::AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) { DelayedDamage delayedDamage; delayedDamage.attacker = attacker; @@ -31,5 +31,7 @@ void IWorld::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, Clean delayedDamage.damageSchoolMask = damageSchoolMask; delayedDamage.spellProto = spellProto; delayedDamage.durabilityLoss = durabilityLoss; + delayedDamage.mapId = mapId; + delayedDamage.instanceId = instanceId; _delayedDamages.push_back(delayedDamage); } diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 236051d15..1d4a6f0fe 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -524,7 +524,7 @@ public: [[nodiscard]] virtual WorldSession* FindSession(uint32 id) const = 0; [[nodiscard]] virtual WorldSession* FindOfflineSession(uint32 id) const = 0; [[nodiscard]] virtual WorldSession* FindOfflineSessionForCharacterGUID(ObjectGuid::LowType guidLow) const = 0; - virtual void AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss); + virtual void AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId); virtual void AddSession(WorldSession* s) = 0; virtual bool KickSession(uint32 id) = 0; virtual void UpdateMaxSessionCounters() = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 1488c39d5..621cfc056 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -3340,7 +3340,7 @@ CliCommandHolder::~CliCommandHolder() free(m_command); } -void World::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) +void World::AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) { DelayedDamage delayedDamage; delayedDamage.attacker = attacker; @@ -3351,6 +3351,8 @@ void World::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanD delayedDamage.damageSchoolMask = damageSchoolMask; delayedDamage.spellProto = spellProto; delayedDamage.durabilityLoss = durabilityLoss; + delayedDamage.mapId = mapId; + delayedDamage.instanceId = instanceId; _delayedDamages.push_back(delayedDamage); } @@ -3358,10 +3360,18 @@ void World::ProcessDelayedDamages() { for (auto& damage : _delayedDamages) { - if (!damage.victim) + // Get map first + Map* map = sMapMgr->FindMap(damage.mapId, damage.instanceId); + if (!map) continue; - Unit::DealDamage(damage.attacker, damage.victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss); + // Now we get both, attacker and victim, but attacker can be null (although attacker is always a player). + Unit* attacker = ObjectAccessor::GetUnit(map, damage.attacker); + Unit* victim = ObjectAccessor::GetUnit(map, damage.victim); + if (!victim) + continue; + + Unit::DealDamage(attacker, victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss); } _delayedDamages.clear(); } diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 222a5586f..590d85161 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -355,7 +355,7 @@ public: void RemoveOldCorpses() override; - void AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) override; + void AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) override; void ProcessDelayedDamages(); From a82065c317fa594365a43ac9b3d483a13e8e27e0 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 9 May 2023 20:20:55 -0300 Subject: [PATCH 010/107] fix(DB/MagtheridonLair): Revamp Magtheridon's Lair spawns (#16174) Create rev_1683251018722971200.sql --- .../rev_1683251018722971200.sql | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683251018722971200.sql diff --git a/data/sql/updates/pending_db_world/rev_1683251018722971200.sql b/data/sql/updates/pending_db_world/rev_1683251018722971200.sql new file mode 100644 index 000000000..e346f59c8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683251018722971200.sql @@ -0,0 +1,88 @@ +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|67108864 WHERE (`entry` = 18829); + +DELETE FROM `creature_addon` WHERE (`guid` IN (90985, 90986, 90987, 90988, 90989, 90990, 90991, 90992, 90993, 91247, 91248, 91249)); +DELETE FROM `waypoint_data` WHERE `id` IN (909910, 909920, 909930); +UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE (`entry` = 18829); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 18829) AND (`source_type` = 0) AND (`id` IN (7, 8)); +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-91247,-91248,-91249,-90985,-90986,-90987)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-91247, 0, 1000, 0, 1, 0, 100, 1, 3600, 3600, 0, 0, 0, 11, 33346, 0, 0, 0, 0, 0, 10, 90984, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Warder - On Reset - Cast Green Beam'), +(-91248, 0, 1000, 0, 1, 0, 100, 1, 3600, 3600, 0, 0, 0, 11, 33346, 0, 0, 0, 0, 0, 10, 90984, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Warder - On Reset - Cast Green Beam'), +(-91249, 0, 1000, 0, 1, 0, 100, 1, 3600, 3600, 0, 0, 0, 11, 33346, 0, 0, 0, 0, 0, 10, 90984, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Warder - On Reset - Cast Green Beam'), +(-90985, 0, 1000, 0, 1, 0, 100, 1, 3600, 3600, 0, 0, 0, 11, 33827, 0, 0, 0, 0, 0, 10, 91250, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Warder - On Reset - Cast Hellfire Warder Channel Visual'), +(-90986, 0, 1000, 0, 1, 0, 100, 1, 3600, 3600, 0, 0, 0, 11, 33827, 0, 0, 0, 0, 0, 10, 91250, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Warder - On Reset - Cast Hellfire Warder Channel Visual'), +(-90987, 0, 1000, 0, 1, 0, 100, 1, 3600, 3600, 0, 0, 0, 11, 33827, 0, 0, 0, 0, 0, 10, 91250, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Warder - On Reset - Cast Hellfire Warder Channel Visual'); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceEntry` = 18829); + +SET @NPC := 90991; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-73.72693,`position_y`=47.355293,`position_z`=-0.38537598 WHERE `guid`=@NPC; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=0,`position_x`=-73.72693,`position_y`=47.355293,`position_z`=-0.38537598 WHERE `guid` IN (90992, 90993) AND `id1` = 18829; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,-73.72693,47.355293,-0.38537598,NULL,0,0,0,100,0), +(@PATH,2,-53.951275,58.999866,3.1846943,NULL,0,0,0,100,0), +(@PATH,3,-28.083755,65.604164,15.94728,NULL,0,0,0,100,0), +(@PATH,4,-3.498642,66.86735,22.654028,NULL,0,0,0,100,0), +(@PATH,5,14.21773,57.512276,22.968313,NULL,0,0,0,100,0), +(@PATH,6,29.301313,40.577045,33.289814,NULL,0,0,0,100,0), +(@PATH,7,44.670013,16.09524,45.009865,NULL,0,0,0,100,0), +(@PATH,8,44.010056,-11.347733,45.010532,NULL,0,0,0,100,0), +(@PATH,9,33.572083,-28.368456,37.985077,NULL,0,0,0,100,0), +(@PATH,10,14.805847,-53.501915,22.991356,NULL,0,0,0,100,0), +(@PATH,11,-11.261587,-62.130146,22.562366,NULL,0,0,0,100,0), +(@PATH,12,-37.538406,-59.60784,11.227191,NULL,0,0,0,100,0), +(@PATH,13,-70.55042,-44.39177,-0.3772414,NULL,0,0,0,100,0), +(@PATH,14,-37.538406,-59.60784,11.227191,NULL,0,0,0,100,0), +(@PATH,15,-11.261587,-62.130146,22.562366,NULL,0,0,0,100,0), +(@PATH,16,14.805847,-53.501915,22.991356,NULL,0,0,0,100,0), +(@PATH,17,33.572083,-28.368456,37.985077,NULL,0,0,0,100,0), +(@PATH,18,44.010056,-11.347733,45.010532,NULL,0,0,0,100,0), +(@PATH,19,44.670013,16.09524,45.009865,NULL,0,0,0,100,0), +(@PATH,20,29.301313,40.577045,33.289814,NULL,0,0,0,100,0), +(@PATH,21,14.21773,57.512276,22.968313,NULL,0,0,0,100,0), +(@PATH,22,-3.498642,66.86735,22.654028,NULL,0,0,0,100,0), +(@PATH,23,-28.083755,65.604164,15.94728,NULL,0,0,0,100,0), +(@PATH,24,-53.951275,58.999866,3.1846943,NULL,0,0,0,100,0); + +DELETE FROM `creature_formations` WHERE `memberGUID` IN (90991, 90992, 90993); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES +(90991, 90991, 0, 0, 515), +(90991, 90992, 4, 90, 515), +(90991, 90993, 4, 270, 515); + +DELETE FROM `creature_formations` WHERE `memberGUID` IN (91247,91248,91249,90985,90986,90987,90988,90989,90990); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES +(91247, 91247, 3), +(91247, 91248, 3), +(91247, 91249, 3), +(90985, 90985, 3), +(90985, 90986, 3), +(90985, 90987, 3), +(90988, 90988, 3), +(90988, 90989, 3), +(90988, 90990, 3); + +UPDATE `creature` SET `id1` = 15384 WHERE `guid` = 91250 AND `id1` = 19871; + +SET @CGUID := 99126; + +DELETE FROM `creature` WHERE `id1` = 17474 AND `map` = 544; +INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `VerifiedBuild`) VALUES +(@CGUID+0 , 17474, 544, 3836, 3836, 12.277288, 1.4221332, -0.41251224, 0, 7200, 17.5, 1, 49444), +(@CGUID+1 , 17474, 544, 3836, 3836, 12.209613, -1.6456745, -0.4125001, 0, 7200, 15, 1, 49444), +(@CGUID+2 , 17474, 544, 3836, 3836, -41.256805, -18.75815, -0.41244552, 0, 7200, 15.5, 1, 49444), +(@CGUID+3 , 17474, 544, 3836, 3836, -36.77449, -18.470839, -0.41244859, 0, 7200, 14.5, 1, 49444), +(@CGUID+4 , 17474, 544, 3836, 3836, -39.86548, 23.40396, -0.41246653, 0, 7200, 15, 1, 49444), +(@CGUID+5 , 17474, 544, 3836, 3836, -39.30522, 22.472437, -0.41246665, 0, 7200, 18, 1, 49444), +(@CGUID+6 , 17474, 544, 3836, 3836, -10.57025, -36.72588, -0.412454, 0, 7200, 14, 1, 49444), +(@CGUID+7 , 17474, 544, 3836, 3836, -23.366783, -28.944124, -0.41246164, 0, 7200, 14.5, 1, 49444), +(@CGUID+8 , 17474, 544, 3836, 3836, -5.876664, 30.14057, -0.412483, 0, 7200, 16, 1, 49444), +(@CGUID+9 , 17474, 544, 3836, 3836, -12.428505, 38.717083, -0.1680651, 0, 7200, 16.5, 1, 49444), +(@CGUID+10, 17474, 544, 3836, 3836, -15.282015, -1.4561253, -0.4121307, 0, 7200, 10.8, 1, 49444), +(@CGUID+11, 17474, 544, 3836, 3836, -15.024544, 0.8793583, -0.41213986, 0, 7200, 11.5, 1, 49444); From a34a942ebcf136f83cd6657cff61db06dbc7072e Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 9 May 2023 20:21:59 -0300 Subject: [PATCH 011/107] fix(DB/SAI): Rework The Slave Pens Trash SAI (#16130) * Create rev_1682710323496877200.sql * Update rev_1682710323496877200.sql * Update rev_1682710323496877200.sql --- .../rev_1682710323496877200.sql | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682710323496877200.sql diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql new file mode 100644 index 000000000..739f8b3ea --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql @@ -0,0 +1,74 @@ +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32191, 32193, 15234, 34944, 17139, 34945); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(32191, 32191, 37666), +(32193, 32193, 37665), +(15234, 15234, 37664), +(34944, 34944, 37669), +(17139, 17139, 36052), +(34945, 34945, 39378); + +-- Small Updates +UPDATE `smart_scripts` SET `event_param1` = 3600, `event_param2` = 9750, `event_param3` = 6050, `event_param4` = 9750 WHERE (`entryorguid` = 17964) AND (`source_type` = 0) AND (`id` IN (0, 1)); -- Wastewalker Worker +UPDATE `smart_scripts` SET `event_param1` = 6150, `event_param2` = 15800, `event_param3` = 19400, `event_param4` = 25500 WHERE (`entryorguid` = 17959) AND (`source_type` = 0) AND (`id` IN (1)); -- Coilfang Slavehandler +UPDATE `smart_scripts` SET `event_param1` = 12150, `event_param2` = 24250, `event_param3` = 24250, `event_param4` = 27900 WHERE (`entryorguid` = 17959) AND (`source_type` = 0) AND (`id` IN (2)); -- Coilfang Slavehandler + +-- Complete Rewrites +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (17816, 17940, 17817, 17960, 17938, 17958, 17962, 21128, 17961, 21126, 21127)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17816, 0, 0, 0, 0, 0, 100, 0, 6100, 18100, 1200, 24250, 0, 11, 31551, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Bogstrok - In Combat - Cast \'Piercing Jab\''), +(17940, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - On Aggro - Say Line 0'), +(17940, 0, 1, 0, 0, 0, 100, 2, 10750, 26500, 10750, 26500, 0, 87, 1794000, 1794001, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - In Combat - Cast Random Spell (Normal Dungeon)'), +(17940, 0, 2, 0, 0, 0, 100, 4, 10750, 26500, 10750, 26500, 0, 87, 1794002, 1794003, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - In Combat - Cast Random Spell (Heroic Dungeon)'), +(17817, 0, 0, 0, 0, 0, 100, 0, 6150, 15750, 10950, 21750, 0, 11, 35760, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Greater Bogstrok - In Combat - Cast \'Decayed Strength\''), +(17960, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Soothsayer - On Aggro - Say Line 0'), +(17960, 0, 1, 0, 0, 0, 100, 0, 9950, 12150, 23100, 24300, 0, 11, 15790, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Soothsayer - In Combat - Cast \'Arcane Missiles\''), +(17960, 0, 2, 0, 0, 0, 100, 0, 19400, 27600, 26500, 42300, 0, 11, 31555, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Soothsayer - In Combat - Cast \'Decayed Intellect\''), +(17960, 0, 3, 0, 0, 0, 100, 0, 20650, 25500, 23100, 24300, 0, 11, 30923, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Soothsayer - In Combat - Cast \'Domination\''), +(17938, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Observer - On Aggro - Say Line 0'), +(17938, 0, 1, 0, 0, 0, 100, 2, 11750, 16350, 7300, 12150, 0, 11, 32191, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Observer - In Combat - Cast \'Heavy Dynamite\' (Normal Dungeon)'), +(17938, 0, 2, 0, 0, 0, 100, 2, 11250, 15400, 25500, 26750, 0, 11, 17883, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Observer - In Combat - Cast \'Immolate\' (Normal Dungeon)'), +(17938, 0, 3, 0, 0, 0, 100, 4, 11250, 15400, 25500, 26750, 0, 11, 37668, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Observer - In Combat - Cast \'Immolate\' (Heroic Dungeon)'), +(17958, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Defender - On Aggro - Say Line 0'), +(17958, 0, 1, 0, 0, 0, 100, 0, 7300, 13350, 10900, 21850, 0, 11, 15655, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Defender - In Combat - Cast \'Shield Slam\''), +(17958, 0, 2, 0, 0, 0, 100, 0, 13000, 17000, 18200, 29100, 0, 11, 31554, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Defender - In Combat - Cast \'Spell Reflection\''), +(17962, 0, 0, 0, 0, 0, 100, 0, 12100, 19350, 13350, 19700, 0, 11, 33787, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Collaborator - In Combat - Cast \'Cripple\''), +(17962, 0, 1, 0, 0, 0, 100, 0, 20100, 26200, 20000, 26000, 0, 11, 19130, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Collaborator - In Combat - Cast \'Revenge\''), +(17962, 0, 2, 3, 2, 0, 100, 1, 0, 30, 0, 0, 0, 11, 8269, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Collaborator - Between 0-30% Health - Cast \'Frenzy\''), +(17962, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Collaborator - Linked - Say Line 0'), +(21128, 0, 0, 0, 0, 0, 100, 0, 4900, 11750, 12150, 25750, 0, 11, 34984, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Ray - In Combat - Cast \'Psychic Horror\''), +(17961, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Enchantress - On Aggro - Say Line 0'), +(17961, 0, 1, 0, 0, 0, 100, 0, 13350, 19700, 19450, 27900, 0, 11, 32173, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Enchantress - In Combat - Cast \'Entangling Roots\''), +(17961, 0, 2, 0, 0, 0, 100, 0, 7300, 12150, 21450, 31600, 0, 11, 15234, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Enchantress - In Combat - Cast \'Lightning Bolt\''), +(17961, 0, 4, 0, 0, 0, 100, 0, 14850, 21200, 19450, 27900, 0, 11, 32193, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Enchantress - In Combat - Cast \'Lightning Cloud\''), +(21126, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Scale-Healer - On Aggro - Say Line 0'), +(21126, 0, 1, 0, 74, 0, 100, 0, 0, 65, 12000, 16000, 40, 11, 34945, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Scale-Healer - On Friendly Between 0-65% Health - Cast \'Heal\''), +(21126, 0, 2, 0, 0, 0, 100, 0, 4250, 8850, 13400, 21900, 0, 11, 34944, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Scale-Healer - In Combat - Cast \'Holy Nova\''), +(21126, 0, 3, 0, 16, 0, 100, 0, 17139, 40, 7200, 13300, 1, 11, 17139, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Scale-Healer - On Friendly Unit Missing Buff \'Power Word: Shield\' - Cast \'Power Word: Shield\''), +(21127, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Tempest - On Aggro - Say Line 0'), +(21127, 0, 1, 0, 0, 0, 100, 0, 10550, 22950, 8500, 17400, 0, 11, 15667, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Tempest - In Combat - Cast \'Sinister Strike\''), +(21127, 0, 2, 0, 0, 0, 100, 0, 10800, 22900, 26900, 44600, 0, 11, 36872, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Tempest - In Combat - Cast \'Deadly Poison\''); + +-- Partial Rewrites +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17963) AND (`source_type` = 0) AND (`id` IN (1, 2, 3, 4)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17963, 0, 1, 0, 9, 0, 100, 2, 0, 10, 6000, 7700, 1, 11, 32192, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wastewalker Slave - In Combat - Cast Frost Nova'), +(17963, 0, 2, 0, 9, 0, 100, 4, 0, 10, 6000, 7700, 1, 11, 15531, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wastewalker Slave - In Combat - Cast Frost Nova'), +(17963, 0, 3, 0, 0, 0, 100, 2, 400, 4950, 3300, 4950, 0, 11, 15497, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wastewalker Slave - In Combat - Cast Frostbolt'), +(17963, 0, 4, 0, 0, 0, 100, 4, 400, 4950, 3300, 4950, 0, 11, 12675, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wastewalker Slave - In Combat - Cast Frostbolt'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17957) AND (`source_type` = 0) AND (`id` IN (1, 2, 3)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17957, 0, 1, 0, 0, 0, 100, 0, 15700, 29100, 21900, 30200, 0, 11, 19134, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Champion - In Combat - Cast \'Frightening Shout\''), +(17957, 0, 2, 0, 0, 0, 100, 0, 7400, 15750, 1200, 28600, 0, 11, 15284, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Champion - In Combat - Cast \'Cleave\''), +(17957, 0, 3, 0, 0, 0, 100, 0, 10950, 26050, 10950, 26050, 0, 11, 16145, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Champion - In Combat - Cast \'Sunder Armor\''); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` IN (1794000, 1794001, 1794002, 1794003)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1794000, 9, 0, 0, 0, 0, 100, 2, 0, 0, 0, 0, 0, 11, 16005, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - Actionlist for Random Cast - Cast \'Rain of Fire\' (Normal Dungeon)'), +(1794001, 9, 0, 0, 0, 0, 100, 2, 0, 0, 0, 0, 0, 11, 21096, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - Actionlist for Random Cast - Cast \'Blizzard\' (Normal Dungeon)'), +(1794002, 9, 0, 0, 0, 0, 100, 4, 0, 0, 0, 0, 0, 11, 39376, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - Actionlist for Random Cast - Cast \'Rain of Fire\' (Heroic Dungeon)'), +(1794003, 9, 0, 0, 0, 0, 100, 4, 0, 0, 0, 0, 0, 11, 37671, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Technician - Actionlist for Random Cast - Cast \'Blizzard\' (Heroic Dungeon)'); + +DELETE FROM `creature_text` WHERE `CreatureID` = 17962; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17962, 0, 0, '%s goes into a frenzy!', 16, 0, 100, 0, 0, 0, 38630, 0, 'Coilfang Collaborator'); From 4226e40a633fcbc3ea36dedbacb5dd67fc168963 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 9 May 2023 23:24:45 +0000 Subject: [PATCH 012/107] chore(DB): import pending files Referenced commit(s): a34a942ebcf136f83cd6657cff61db06dbc7072e --- .../rev_1682710323496877200.sql => db_world/2023_05_09_00.sql} | 1 + .../rev_1683251018722971200.sql => db_world/2023_05_09_01.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1682710323496877200.sql => db_world/2023_05_09_00.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1683251018722971200.sql => db_world/2023_05_09_01.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/db_world/2023_05_09_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682710323496877200.sql rename to data/sql/updates/db_world/2023_05_09_00.sql index 739f8b3ea..308c71f1a 100644 --- a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql +++ b/data/sql/updates/db_world/2023_05_09_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_03_03 -> 2023_05_09_00 DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32191, 32193, 15234, 34944, 17139, 34945); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES (32191, 32191, 37666), diff --git a/data/sql/updates/pending_db_world/rev_1683251018722971200.sql b/data/sql/updates/db_world/2023_05_09_01.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1683251018722971200.sql rename to data/sql/updates/db_world/2023_05_09_01.sql index e346f59c8..43d815284 100644 --- a/data/sql/updates/pending_db_world/rev_1683251018722971200.sql +++ b/data/sql/updates/db_world/2023_05_09_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_09_00 -> 2023_05_09_01 -- UPDATE `creature_template` SET `flags_extra` = `flags_extra`|67108864 WHERE (`entry` = 18829); From 68b1e993e81cc4934d0dfce56eb4bda4aa18d730 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Tue, 9 May 2023 20:45:42 -0300 Subject: [PATCH 013/107] fix(DB/Creature): Implement Antonio Perelli script (#16156) Create rev_1682972046295168400.sql Co-authored-by: Carlos Morales --- .../rev_1682972046295168400.sql | 499 ++++++++++++++++++ 1 file changed, 499 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682972046295168400.sql diff --git a/data/sql/updates/pending_db_world/rev_1682972046295168400.sql b/data/sql/updates/pending_db_world/rev_1682972046295168400.sql new file mode 100644 index 000000000..34520c2f1 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682972046295168400.sql @@ -0,0 +1,499 @@ +-- Antonio Perelli +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=844; +DELETE FROM `smart_scripts` WHERE `entryorguid`=844 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (84400,84401,84402,84403,84404,84405,84406,84407,84408,84409,84410,84411,84412,84413,84414,84415,84416) AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(844,0,0 ,0,58,0,100,0,0,84400,0,0,0,80,84400,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,1 ,0,58,0,100,0,0,84401,0,0,0,80,84401,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,2 ,0,58,0,100,0,0,84402,0,0,0,80,84402,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,3 ,0,58,0,100,0,0,84403,0,0,0,80,84403,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,4 ,0,58,0,100,0,0,84404,0,0,0,80,84404,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,5 ,0,58,0,100,0,0,84405,0,0,0,80,84405,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,6 ,0,58,0,100,0,0,84406,0,0,0,80,84406,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,7 ,0,58,0,100,0,0,84407,0,0,0,80,84407,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,8 ,0,58,0,100,0,0,84408,0,0,0,80,84408,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,9 ,0,58,0,100,0,0,84409,0,0,0,80,84409,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,10,0,58,0,100,0,0,84410,0,0,0,80,84410,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,11,0,58,0,100,0,0,84411,0,0,0,80,84411,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,12,0,58,0,100,0,0,84412,0,0,0,80,84412,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,13,0,58,0,100,0,0,84413,0,0,0,80,84413,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,14,0,34,0,100,0,11,84414,0,0,0,80,84414,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Reached Point - Run Script'), +(844,0,15,0,58,0,100,0,0,84414,0,0,0,80,84415,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Finished All Scripts - Set Active and Start Movement'), +(844,0,16,0,11,0,100,0,0,0,0,0,0,80,84415,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - On Respawn - Set Active and Start Movement'), +(84400,9,0,0,0,0,100,0,0,0,0,0,0,1,13,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 13'), +(84400,9,1,0,0,0,100,0,6000,6000,0,0,0,1,0,0,0,0,0,0,19,1423,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 0 (Stormwind Guard)'), +(84400,9,2,0,0,0,100,0,5000,5000,0,0,0,1,14,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 14'), +(84400,9,3,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,19,1423,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 1 (Stormwind Guard)'), +(84400,9,4,0,0,0,100,0,2000,2000,0,0,0,1,15,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 15'), +(84400,9,5,0,0,0,100,0,15000,15000,0,0,0,53,0,84401,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84401,9,0,0,0,0,100,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 0'), +(84401,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84402,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84402,9,0,0,0,0,100,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 1'), +(84402,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84403,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84403,9,0,0,0,0,100,0,0,0,0,0,0,1,16,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 16'), +(84403,9,1,0,0,0,100,0,5000,5000,0,0,0,53,0,84404,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84404,9,0,0,0,0,100,0,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 2'), +(84404,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84405,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84405,9,0,0,0,0,100,0,0,0,0,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 3'), +(84405,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84406,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84406,9,0,0,0,0,100,0,0,0,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 4'), +(84406,9,1,0,0,0,100,0,5000,5000,0,0,0,53,0,84407,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84406,9,2,0,0,0,100,0,0,0,0,0,0,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 5'), +(84407,9,0,0,0,0,100,0,0,0,0,0,0,1,6,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 6'), +(84407,9,1,0,0,0,100,0,5000,5000,0,0,0,53,0,84408,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84408,9,0,0,0,0,100,0,0,0,0,0,0,1,7,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 7'), +(84408,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84409,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84409,9,0,0,0,0,100,0,0,0,0,0,0,1,16,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 16'), +(84409,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84410,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84410,9,0,0,0,0,100,0,0,0,0,0,0,1,8,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 8'), +(84410,9,1,0,0,0,100,0,5000,5000,0,0,0,53,0,84411,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84411,9,0,0,0,0,100,0,0,0,0,0,0,1,9,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 9'), +(84411,9,1,0,0,0,100,0,5000,5000,0,0,0,53,0,84412,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84412,9,0,0,0,0,100,0,0,0,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Set Orientation'), +(84412,9,1,0,0,0,100,0,500,500,0,0,0,1,10,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 10'), +(84412,9,2,0,0,0,100,0,5000,5000,0,0,0,1,0,0,0,0,0,0,19,777,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 0 (Amy Davenport)'), +(84412,9,3,0,0,0,100,0,5000,5000,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0,3.10625,'Antonio Perelli - Actionlist - Set Orientation'), +(84412,9,4,0,0,0,100,0,500,500,0,0,0,1,11,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 11'), +(84412,9,5,0,0,0,100,0,5000,5000,0,0,0,53,0,84413,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84413,9,0,0,0,0,100,0,0,0,0,0,0,1,16,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 16'), +(84413,9,1,0,0,0,100,0,30000,30000,0,0,0,53,0,84414,0,0,0,2,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'), +(84414,9,0,0,0,0,100,0,0,0,0,0,0,1,12,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 12'), +(84414,9,1,0,0,0,100,0,4000,4000,0,0,0,1,1,0,0,0,0,0,19,777,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Say Line 1 (Amy Davenport)'), +(84415,9,0,0,0,0,100,0,0,0,0,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Set Active On'), +(84415,9,1,0,0,0,100,0,0,0,0,0,0,53,0,84400,0,0,0,2,0,0,0,0,0,0,0,0,0,'Antonio Perelli - Actionlist - Start Waypoint'); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (844,777,1423); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(844,0 ,0,'Wares for sale! Wares for sale! Come browse Antonio\'s wares before I must take my leave, citizens of Goldshire.',12,7,100,22,0,0,721,0,'Antonio Perelli'), +(844,0 ,1,'Come one, come all! Antonio\'s wares are for sale. I may not return for a great deal of time, so come one, come all.',12,7,100,22,0,0,722,0,'Antonio Perelli'), +(844,0 ,2,'Good people of Goldshire, come take advantage of my incredible prices on rare goods. I shall not return for some time!',12,7,100,22,0,0,723,0,'Antonio Perelli'), +(844,1 ,0,'Good bye, Goldshire. I\'ll be back soon enough-- perhaps a week\'s time.',12,7,100,3,0,0,724,0,'Antonio Perelli'), +(844,2 ,0,'Known throughout the lands, Antonio Perelli\'s goods now for sale near Sentinel Hill! I must move on soon, so make haste.',12,7,100,22,0,0,726,0,'Antonio Perelli'), +(844,2 ,1,'Long-lasting, well-crafted items for sale near the Hill! Come one, come all! Time is short, so make haste.',12,7,100,22,0,0,727,0,'Antonio Perelli'), +(844,2 ,2,'The time has come for me to once again make my wares available to all who travel near Sentinel Hill! Come one, come all!',12,7,100,22,0,0,728,0,'Antonio Perelli'), +(844,3 ,0,'Thank you, all. I shall return again in about a week.',12,7,100,3,0,0,729,0,'Antonio Perelli'), +(844,4 ,0,'Off to Darkshire then, I suppose.',12,7,100,0,0,0,730,0,'Antonio Perelli'), +(844,5 ,0,'%s lets out a deep sigh.',16,0,100,0,0,0,683,0,'Antonio Perelli'), +(844,6 ,0,'I hate this part of my job. Oh Duskwood, be gentle with poor Antonio.',12,7,100,0,0,0,684,0,'Antonio Perelli'), +(844,7 ,0,'Travelers and adventurers make haste to the town circle and take advantage of Antonio\'s wonderful prices! Come one, come all!',12,7,100,22,0,0,688,0,'Antonio Perelli'), +(844,7 ,1,'Well met, travelers of Duskwood! My incredible wares are on sale for a short time in Darkshire. Make haste!',12,7,100,22,0,0,689,0,'Antonio Perelli'), +(844,7 ,2,'Leave your battles or errands, and browse my incredible wares! Only in Darkshire for a short time... praise the Light for that.',12,7,100,22,0,0,690,0,'Antonio Perelli'), +(844,8 ,0,'Farewell, citizens of Darkshire. Until next time...',12,7,100,3,0,0,691,0,'Antonio Perelli'), +(844,9 ,0,'Finally, Redridge. A pleasant change from the dark, cold fog of Duskwood.',12,7,100,0,0,0,692,0,'Antonio Perelli'), +(844,10,0,'Hello, hello, Amy. It\'s good to be back in Lakeshire and to see you, milady.',12,7,100,3,0,0,702,0,'Antonio Perelli'), +(844,11,0,'I\'ve finally reached Lakeshire-- come one, come all, and take advantage of Antonio Perelli\'s wonderful deals.',12,7,100,22,0,0,712,0,'Antonio Perelli'), +(844,11,1,'Items powerful enough to help make the journey through Duskwood, Antonio Perelli\'s goods are now for sale here in Lakeshire.',12,7,100,22,0,0,713,0,'Antonio Perelli'), +(844,11,2,'Hear ye, hear ye! I\'ll pause to sell my wares for only a short time here in Lakeshire. Come to the town hall with haste!',12,7,100,22,0,0,704,0,'Antonio Perelli'), +(844,12,0,'Good to see you again, Amy. Be safe, luv. I\'m off to Goldshire now.',12,7,100,0,0,0,714,0,'Antonio Perelli'), +(844,13,0,'Hello, my friends. It is good to see you again. Still keeping our borders free I see. Antonio appreciates your hard work.',12,7,100,3,0,0,716,0,'Antonio Perelli'), +(844,14,0,'You\'re very welcome! I must be on my way... be safe, all of you.',12,7,100,1,0,0,717,0,'Antonio Perelli'), +(844,15,0,'Oh, I will, my friend. I will indeed. You, too, be safe.',12,7,100,0,0,0,720,0,'Antonio Perelli'), +(844,16,0,'Items of antiquity, weapons of war, armor or rarity. Who knows what Antonio will be carrying this week if you do not come look.',12,7,100,22,0,0,685,0,'Antonio Perelli'), +(844,16,1,'This week it could be eye of newt, or perhaps a treasure map. You\'ll never know unless you look. What could Antonio have?',12,7,100,22,0,0,686,0,'Antonio Perelli'), +(844,16,2,'Adventurers from all over sell things to Antonio-- come look for yourselves what little treasures he has for you this week.',12,7,100,22,0,0,687,0,'Antonio Perelli'), +(777,0,0,'Hello, Antonio. It\'s good to see you safely made it here again. Let me know if you need anything.',12,7,100,1,0,0,703,0,'Amy Davenport'), +(777,1,0,'Take care of yourself, Antonio. I\'ll see you in another week.',12,7,100,3,0,0,715,0,'Amy Davenport'), +(1423,0,0,'Hello again, Antonio. Thank you again for the hat for my wife. She adored it.',12,7,100,0,0,0,718,0,'Stormwind Guard'), +(1423,1,0,'Be safe, Antonio.',12,7,100,0,0,0,719,0,'Stormwind Guard'); + +DELETE FROM `creature_addon` WHERE (`guid` IN (81181)); +DELETE FROM `waypoint_data` WHERE `id` = 811810; + +DELETE FROM `creature` WHERE `id1`=844 AND `guid`=81181; +INSERT INTO `creature` (`guid`, `id1`, `map`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`) VALUES +(81181, 844, 0, 1, -9628.33, -1176.14, 39.9827, 0.992539, 300); + +DELETE FROM `creature_addon` WHERE `guid`=81181; +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(81181, 811810, 0, 0, 1, 0, 0, NULL); + +DELETE FROM `waypoints` WHERE `entry` BETWEEN 84400 AND 84414; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(84400,1 ,-9628.33,-1176.14,39.9827,'AntonioPerelli'), +(84400,2 ,-9622.15,-1162.8,41.844,'AntonioPerelli'), +(84400,3 ,-9615.5,-1130.42,42.5478,'AntonioPerelli'), +(84400,4 ,-9613.92,-1085.01,39.9107,'AntonioPerelli'), +(84400,5 ,-9616.21,-1059.83,39.8157,'AntonioPerelli'), +(84400,6 ,-9616.79,-1054.03,40.3707,'AntonioPerelli'), +(84400,7 ,-9617.74,-1044.5,39.6632,'AntonioPerelli'), +(84401,1 ,-9619.11,-1030.77,39.7045,'AntonioPerelli'), +(84401,2 ,-9621.47,-1005.62,42.0004,'AntonioPerelli'), +(84401,3 ,-9620.81,-985.471,43.2713,'AntonioPerelli'), +(84401,4 ,-9613.09,-966.993,43.8261,'AntonioPerelli'), +(84401,5 ,-9585.3,-926.916,43.2905,'AntonioPerelli'), +(84401,6 ,-9580.38,-890.055,43.568,'AntonioPerelli'), +(84401,7 ,-9589.39,-864.283,43.7264,'AntonioPerelli'), +(84401,8 ,-9624.39,-825.177,43.7025,'AntonioPerelli'), +(84401,9 ,-9647.81,-795.14,43.6049,'AntonioPerelli'), +(84401,10,-9650.68,-783.491,44.2108,'AntonioPerelli'), +(84401,11,-9654.59,-741.551,44.5521,'AntonioPerelli'), +(84401,12,-9653.75,-724.91,44.3631,'AntonioPerelli'), +(84401,13,-9643.18,-675.147,48.7801,'AntonioPerelli'), +(84401,14,-9637.25,-656.76,49.563,'AntonioPerelli'), +(84401,15,-9628.46,-641.716,50.8846,'AntonioPerelli'), +(84401,16,-9622.21,-623.616,51.8867,'AntonioPerelli'), +(84401,17,-9620.62,-585.027,53.9861,'AntonioPerelli'), +(84401,18,-9615.58,-547.328,54.3829,'AntonioPerelli'), +(84401,19,-9599.33,-514.005,57.2836,'AntonioPerelli'), +(84401,20,-9589.68,-491.036,57.6179,'AntonioPerelli'), +(84401,21,-9590.01,-471.08,57.7791,'AntonioPerelli'), +(84401,22,-9610.27,-429.397,57.4384,'AntonioPerelli'), +(84401,23,-9617.12,-403.695,57.4755,'AntonioPerelli'), +(84401,24,-9620.8,-350.287,57.0423,'AntonioPerelli'), +(84401,25,-9619.14,-304.976,57.3787,'AntonioPerelli'), +(84401,26,-9616.08,-289.846,57.3036,'AntonioPerelli'), +(84401,27,-9611.01,-267.445,57.2309,'AntonioPerelli'), +(84401,28,-9600.99,-233.906,57.4913,'AntonioPerelli'), +(84401,29,-9593.56,-210.251,57.474,'AntonioPerelli'), +(84401,30,-9572.9,-162.912,57.7034,'AntonioPerelli'), +(84401,31,-9556.06,-140.039,57.3349,'AntonioPerelli'), +(84401,32,-9550.49,-119.764,57.5015,'AntonioPerelli'), +(84401,33,-9547.76,-72.0136,57.4263,'AntonioPerelli'), +(84401,34,-9539.41,-36.6336,56.4481,'AntonioPerelli'), +(84401,35,-9516.71,7.89289,56.0952,'AntonioPerelli'), +(84401,36,-9500.4,44.1439,55.9721,'AntonioPerelli'), +(84401,37,-9490.19,57.6428,56.0117,'AntonioPerelli'), +(84401,38,-9478.19,63.1176,56.1707,'AntonioPerelli'), +(84401,39,-9463.42,61.0766,55.9612,'AntonioPerelli'), +(84402,1 ,-9458.63,53.1014,56.2968,'AntonioPerelli'), +(84402,2 ,-9460.45,36.4152,56.9501,'AntonioPerelli'), +(84402,3 ,-9467.21,36.6259,56.9649,'AntonioPerelli'), +(84402,4 ,-9467.52,30.389,56.9649,'AntonioPerelli'), +(84402,5 ,-9467.76,25.4583,56.3399,'AntonioPerelli'), +(84402,6 ,-9468.54,19.2089,56.9634,'AntonioPerelli'), +(84402,7 ,-9466.51,15.5142,56.9634,'AntonioPerelli'), +(84403,1 ,-9468.78,18.7939,56.9634,'AntonioPerelli'), +(84403,2 ,-9467.97,23.838,56.3397,'AntonioPerelli'), +(84403,3 ,-9467.33,30.1063,56.9664,'AntonioPerelli'), +(84403,4 ,-9468.05,36.1106,56.9664,'AntonioPerelli'), +(84403,5 ,-9460.5,36.2366,56.9516,'AntonioPerelli'), +(84403,6 ,-9458.51,50.9179,56.5144,'AntonioPerelli'), +(84403,7 ,-9461.25,60.427,55.9169,'AntonioPerelli'), +(84403,8 ,-9484.57,68.9656,56.3056,'AntonioPerelli'), +(84403,9 ,-9487.32,79.8572,56.0447,'AntonioPerelli'), +(84403,10,-9481.79,116.391,56.5505,'AntonioPerelli'), +(84403,11,-9481.69,158.113,56.0987,'AntonioPerelli'), +(84403,12,-9484.71,182.812,55.2594,'AntonioPerelli'), +(84403,13,-9502.95,212.588,53.3357,'AntonioPerelli'), +(84403,14,-9523.8,235.689,51.3777,'AntonioPerelli'), +(84403,15,-9542.6,247.273,50.4008,'AntonioPerelli'), +(84403,16,-9600.25,250.499,47.5452,'AntonioPerelli'), +(84403,17,-9650.26,256.059,46.5437,'AntonioPerelli'), +(84403,18,-9674.3,270.692,46.438,'AntonioPerelli'), +(84403,19,-9694.47,290.452,46.2332,'AntonioPerelli'), +(84403,20,-9716.93,321.307,44.5799,'AntonioPerelli'), +(84403,21,-9736.52,357.126,42.2989,'AntonioPerelli'), +(84403,22,-9752.82,403.584,38.9407,'AntonioPerelli'), +(84403,23,-9756.66,441.174,36.1087,'AntonioPerelli'), +(84403,24,-9749.32,484.488,33.1644,'AntonioPerelli'), +(84403,25,-9745.53,514.2,35.3443,'AntonioPerelli'), +(84403,26,-9743.16,539.005,36.2891,'AntonioPerelli'), +(84403,27,-9741.47,554.714,35.3796,'AntonioPerelli'), +(84404,1 ,-9739.33,603.519,30.7252,'AntonioPerelli'), +(84404,2 ,-9756.05,661.766,27.8879,'AntonioPerelli'), +(84404,3 ,-9759.65,679.766,26.9697,'AntonioPerelli'), +(84404,4 ,-9757.05,708.034,25.3081,'AntonioPerelli'), +(84404,5 ,-9752.14,727.79,25.022,'AntonioPerelli'), +(84404,6 ,-9753.91,755.734,25.0339,'AntonioPerelli'), +(84404,7 ,-9768.33,792.769,24.9121,'AntonioPerelli'), +(84404,8 ,-9784.38,813.988,25.8176,'AntonioPerelli'), +(84404,9 ,-9803.34,835.94,29.1361,'AntonioPerelli'), +(84404,10,-9825.83,862.56,25.7335,'AntonioPerelli'), +(84404,11,-9839.8,887.068,27.6202,'AntonioPerelli'), +(84404,12,-9849.03,905.659,29.7641,'AntonioPerelli'), +(84404,13,-9870.31,929.747,30.2423,'AntonioPerelli'), +(84404,14,-9872.99,944.904,31.0865,'AntonioPerelli'), +(84404,15,-9873.91,963.221,31.0943,'AntonioPerelli'), +(84404,16,-9890.21,983.668,31.2368,'AntonioPerelli'), +(84404,17,-9902.32,986.682,31.0078,'AntonioPerelli'), +(84404,18,-9915.92,987.012,31.3307,'AntonioPerelli'), +(84404,19,-9942.53,997.533,31.5275,'AntonioPerelli'), +(84404,20,-9950.35,1002.6,31.493,'AntonioPerelli'), +(84404,21,-9966.25,1004.62,31.4426,'AntonioPerelli'), +(84404,22,-9984.12,999.33,31.4995,'AntonioPerelli'), +(84404,23,-10012.4,986.375,32.1868,'AntonioPerelli'), +(84404,24,-10032,981.591,32.7979,'AntonioPerelli'), +(84404,25,-10048.4,991.613,33,'AntonioPerelli'), +(84404,26,-10065.8,1004.01,32.9621,'AntonioPerelli'), +(84404,27,-10077.8,1008.09,33.6352,'AntonioPerelli'), +(84404,28,-10091.5,1004.08,35.0322,'AntonioPerelli'), +(84404,29,-10102.5,997.143,37.8542,'AntonioPerelli'), +(84404,30,-10115,990.143,38.1126,'AntonioPerelli'), +(84404,31,-10138.8,989.662,35.4399,'AntonioPerelli'), +(84404,32,-10173.1,986.229,34.3853,'AntonioPerelli'), +(84404,33,-10193.3,986.28,33.3909,'AntonioPerelli'), +(84404,34,-10218.7,993.943,32.4148,'AntonioPerelli'), +(84404,35,-10249.6,993.797,31.1323,'AntonioPerelli'), +(84404,36,-10261.1,988.929,31.2717,'AntonioPerelli'), +(84404,37,-10274.5,972.885,31.1455,'AntonioPerelli'), +(84404,38,-10286.7,964.385,31.1283,'AntonioPerelli'), +(84404,39,-10308.6,967.897,31.1276,'AntonioPerelli'), +(84404,40,-10331.8,978.769,31.1307,'AntonioPerelli'), +(84404,41,-10376.4,981.008,31.127,'AntonioPerelli'), +(84404,42,-10402,993.461,31.6223,'AntonioPerelli'), +(84404,43,-10414.9,992.967,32.4952,'AntonioPerelli'), +(84404,44,-10431.7,983.544,34.3848,'AntonioPerelli'), +(84404,45,-10472.1,953.672,36.1688,'AntonioPerelli'), +(84404,46,-10509.5,954.609,40.461,'AntonioPerelli'), +(84404,47,-10549.2,968.808,41.3401,'AntonioPerelli'), +(84404,48,-10572.3,980.064,39.3883,'AntonioPerelli'), +(84404,49,-10622,1002.8,32.7905,'AntonioPerelli'), +(84404,50,-10637.5,1006.52,32.1902,'AntonioPerelli'), +(84404,51,-10651.9,1000.25,32.8541,'AntonioPerelli'), +(84405,1 ,-10656.5,1000.94,32.8737,'AntonioPerelli'), +(84405,2 ,-10659.1,1010.24,32.7264,'AntonioPerelli'), +(84405,3 ,-10661,1026.66,32.4494,'AntonioPerelli'), +(84405,4 ,-10653.9,1038.76,33.4565,'AntonioPerelli'), +(84405,5 ,-10634.4,1065.4,33.7203,'AntonioPerelli'), +(84405,6 ,-10631.8,1091.59,33.7009,'AntonioPerelli'), +(84405,7 ,-10623.4,1102.74,33.8455,'AntonioPerelli'), +(84405,8 ,-10633.6,1144.49,33.7048,'AntonioPerelli'), +(84405,9 ,-10641.8,1158.94,33.267,'AntonioPerelli'), +(84405,10,-10645.1,1161.78,34.3724,'AntonioPerelli'), +(84405,11,-10649.1,1165.21,34.4199,'AntonioPerelli'), +(84406,1 ,-10645,1161.65,34.3691,'AntonioPerelli'), +(84406,2 ,-10643,1159.89,33.2028,'AntonioPerelli'), +(84406,3 ,-10633.6,1143.93,33.7027,'AntonioPerelli'), +(84406,4 ,-10623.7,1104.62,33.8957,'AntonioPerelli'), +(84406,5 ,-10632.2,1090.97,33.6979,'AntonioPerelli'), +(84406,6 ,-10634.9,1066.3,33.7195,'AntonioPerelli'), +(84406,7 ,-10660.9,1030.7,32.7179,'AntonioPerelli'), +(84406,8 ,-10708,1035.17,33.1656,'AntonioPerelli'), +(84406,9 ,-10737.1,1024.19,33.3604,'AntonioPerelli'), +(84406,10,-10752.4,1017.56,32.9291,'AntonioPerelli'), +(84406,11,-10807.3,1017.29,32.3752,'AntonioPerelli'), +(84406,12,-10830.3,1008.83,32.8154,'AntonioPerelli'), +(84406,13,-10863.8,1006.08,31.5577,'AntonioPerelli'), +(84406,14,-10885.7,1004.49,33.5879,'AntonioPerelli'), +(84406,15,-10903,998.288,35.9247,'AntonioPerelli'), +(84406,16,-10919,993.385,35.4282,'AntonioPerelli'), +(84406,17,-10939.6,970.662,32.9806,'AntonioPerelli'), +(84406,18,-10948.4,948.316,31.5386,'AntonioPerelli'), +(84406,19,-10948.7,936.686,31.5056,'AntonioPerelli'), +(84406,20,-10937.6,924.241,31.5289,'AntonioPerelli'), +(84406,21,-10916.5,906.374,32.0018,'AntonioPerelli'), +(84406,22,-10912.9,888.234,31.6858,'AntonioPerelli'), +(84406,23,-10917.6,866.612,32.7737,'AntonioPerelli'), +(84406,24,-10926.5,850.413,32.6872,'AntonioPerelli'), +(84406,25,-10928.5,830.748,32.2528,'AntonioPerelli'), +(84406,26,-10925.4,814.334,31.1569,'AntonioPerelli'), +(84406,27,-10914.5,793.723,30.8363,'AntonioPerelli'), +(84406,28,-10892.5,767.105,30.8183,'AntonioPerelli'), +(84406,29,-10878.6,746.377,30.9966,'AntonioPerelli'), +(84406,30,-10866.5,668.83,30.9623,'AntonioPerelli'), +(84406,31,-10865.2,628.683,31.3461,'AntonioPerelli'), +(84406,32,-10864.3,591.272,31.2185,'AntonioPerelli'), +(84407,1 ,-10856.1,551.661,30.4888,'AntonioPerelli'), +(84407,2 ,-10840.7,500.676,30.1222,'AntonioPerelli'), +(84407,3 ,-10826.9,461.017,29.5704,'AntonioPerelli'), +(84407,4 ,-10819.2,410.919,29.3886,'AntonioPerelli'), +(84407,5 ,-10815.2,359.497,29.8396,'AntonioPerelli'), +(84407,6 ,-10812.8,319.354,30.5916,'AntonioPerelli'), +(84407,7 ,-10806.3,293.866,30.9536,'AntonioPerelli'), +(84407,8 ,-10801.2,258.47,30.4944,'AntonioPerelli'), +(84407,9 ,-10790.2,209.737,30.6327,'AntonioPerelli'), +(84407,10,-10783,190.387,30.4605,'AntonioPerelli'), +(84407,11,-10771.8,166.37,29.5841,'AntonioPerelli'), +(84407,12,-10756.5,137.889,29.068,'AntonioPerelli'), +(84407,13,-10753.5,122.478,28.8978,'AntonioPerelli'), +(84407,14,-10753.6,89.1802,28.6112,'AntonioPerelli'), +(84407,15,-10755.3,74.5614,28.8126,'AntonioPerelli'), +(84407,16,-10766.1,42.4699,28.6458,'AntonioPerelli'), +(84407,17,-10782.7,2.99363,29.7558,'AntonioPerelli'), +(84407,18,-10792.1,-29.9934,29.5786,'AntonioPerelli'), +(84407,19,-10803.5,-68.2885,29.3413,'AntonioPerelli'), +(84407,20,-10821.4,-116.01,29.8458,'AntonioPerelli'), +(84407,21,-10826.2,-131.192,31.6586,'AntonioPerelli'), +(84407,22,-10832.4,-150.146,31.8923,'AntonioPerelli'), +(84407,23,-10836.1,-162.59,33.7404,'AntonioPerelli'), +(84407,24,-10841.6,-182.408,34.0842,'AntonioPerelli'), +(84407,25,-10849.9,-215.655,37.76,'AntonioPerelli'), +(84407,26,-10856.5,-250.779,38.2612,'AntonioPerelli'), +(84407,27,-10863.9,-280.892,38.1165,'AntonioPerelli'), +(84407,28,-10874.5,-308.623,38.1986,'AntonioPerelli'), +(84407,29,-10884,-331.111,37.805,'AntonioPerelli'), +(84407,30,-10888.1,-341.543,39.0654,'AntonioPerelli'), +(84407,31,-10903,-370.581,39.76,'AntonioPerelli'), +(84408,1 ,-10904.4,-405.245,41.2241,'AntonioPerelli'), +(84408,2 ,-10905.1,-432.23,42.7922,'AntonioPerelli'), +(84408,3 ,-10909.6,-459.797,46.3385,'AntonioPerelli'), +(84408,4 ,-10911.1,-502.158,51.4105,'AntonioPerelli'), +(84408,5 ,-10914,-522.442,53.6616,'AntonioPerelli'), +(84408,6 ,-10920.2,-547.238,53.9669,'AntonioPerelli'), +(84408,7 ,-10931.7,-571.487,54.0921,'AntonioPerelli'), +(84408,8 ,-10950.1,-595.917,55.1088,'AntonioPerelli'), +(84408,9 ,-10959.2,-624.837,55.1194,'AntonioPerelli'), +(84408,10,-10957,-647.869,55.2668,'AntonioPerelli'), +(84408,11,-10936,-679.029,55.6427,'AntonioPerelli'), +(84408,12,-10916,-714.118,55.4351,'AntonioPerelli'), +(84408,13,-10898.5,-740.506,55.3497,'AntonioPerelli'), +(84408,14,-10854.3,-785.637,56.3527,'AntonioPerelli'), +(84408,15,-10835.1,-815.404,56.3257,'AntonioPerelli'), +(84408,16,-10822.1,-842.365,55.9302,'AntonioPerelli'), +(84408,17,-10809.8,-872.74,56.0415,'AntonioPerelli'), +(84408,18,-10798,-913.796,55.8565,'AntonioPerelli'), +(84408,19,-10798.2,-938.984,56.4856,'AntonioPerelli'), +(84408,20,-10807.4,-967.996,56.3382,'AntonioPerelli'), +(84408,21,-10807.7,-993.592,53.6461,'AntonioPerelli'), +(84408,22,-10806.2,-1029.44,47.2018,'AntonioPerelli'), +(84408,23,-10799.9,-1051.36,43.2364,'AntonioPerelli'), +(84408,24,-10789,-1072.29,38.2623,'AntonioPerelli'), +(84408,25,-10780.4,-1115.51,29.916,'AntonioPerelli'), +(84408,26,-10764.5,-1139.13,27.0996,'AntonioPerelli'), +(84408,27,-10732,-1164.75,26.7837,'AntonioPerelli'), +(84408,28,-10695.2,-1185.92,27.1067,'AntonioPerelli'), +(84408,29,-10670.9,-1193.4,27.689,'AntonioPerelli'), +(84408,30,-10650.7,-1192.44,28.6031,'AntonioPerelli'), +(84408,31,-10603,-1180.95,27.9157,'AntonioPerelli'), +(84408,32,-10584.2,-1177.57,28.4772,'AntonioPerelli'), +(84408,33,-10574.1,-1168.87,28.1413,'AntonioPerelli'), +(84408,34,-10562.8,-1159.1,27.7368,'AntonioPerelli'), +(84408,35,-10546.8,-1160.06,27.9203,'AntonioPerelli'), +(84408,36,-10536.7,-1159.85,28.0874,'AntonioPerelli'), +(84408,37,-10534.9,-1167.4,28.1015,'AntonioPerelli'), +(84408,38,-10529.1,-1165.16,28.1015,'AntonioPerelli'), +(84408,39,-10524.3,-1164.95,27.4773,'AntonioPerelli'), +(84408,40,-10517.7,-1164.14,28.0999,'AntonioPerelli'), +(84409,1,-10522,-1164.37,27.4774,'AntonioPerelli'), +(84409,2,-10529,-1165.1,28.1041,'AntonioPerelli'), +(84409,3,-10535.1,-1167.3,28.1041,'AntonioPerelli'), +(84409,4,-10536.2,-1159.53,28.087,'AntonioPerelli'), +(84409,5,-10548.2,-1160.22,27.895,'AntonioPerelli'), +(84409,6,-10557.5,-1177.22,27.886,'AntonioPerelli'), +(84410,1 ,-10552.4,-1188.08,27.9772,'AntonioPerelli'), +(84410,2 ,-10518.6,-1186.6,28.0283,'AntonioPerelli'), +(84410,3 ,-10467.6,-1181.5,27.6555,'AntonioPerelli'), +(84410,4 ,-10437.5,-1168.98,27.7682,'AntonioPerelli'), +(84410,5 ,-10427.1,-1157.17,27.0882,'AntonioPerelli'), +(84410,6 ,-10415,-1133.61,23.9848,'AntonioPerelli'), +(84410,7 ,-10402.6,-1122.88,22.7764,'AntonioPerelli'), +(84410,8 ,-10388.1,-1116.72,22.1176,'AntonioPerelli'), +(84410,9 ,-10354.2,-1116.12,21.3784,'AntonioPerelli'), +(84410,10,-10327.7,-1124.59,21.8065,'AntonioPerelli'), +(84410,11,-10301.1,-1145.42,22.9181,'AntonioPerelli'), +(84410,12,-10278.5,-1153.88,22.7547,'AntonioPerelli'), +(84410,13,-10241.4,-1155.13,21.4632,'AntonioPerelli'), +(84410,14,-10224.4,-1153.29,22.4328,'AntonioPerelli'), +(84410,15,-10197.7,-1146.48,23.5344,'AntonioPerelli'), +(84410,16,-10167.9,-1148.3,25.0296,'AntonioPerelli'), +(84410,17,-10145.2,-1158.71,24.5414,'AntonioPerelli'), +(84410,18,-10129.1,-1175.12,25.6453,'AntonioPerelli'), +(84410,19,-10124.2,-1191.5,26.0067,'AntonioPerelli'), +(84410,20,-10109.8,-1215.03,26.2236,'AntonioPerelli'), +(84410,21,-10088.6,-1266.55,30.8014,'AntonioPerelli'), +(84410,22,-10085,-1288.02,31.8366,'AntonioPerelli'), +(84410,23,-10082.7,-1316.64,31.8256,'AntonioPerelli'), +(84410,24,-10076.5,-1370.3,30.644,'AntonioPerelli'), +(84411,1 ,-10082.9,-1391.74,29.7196,'AntonioPerelli'), +(84411,2 ,-10084,-1418.02,28.7734,'AntonioPerelli'), +(84411,3 ,-10082.2,-1470.18,28.2155,'AntonioPerelli'), +(84411,4 ,-10074.2,-1487.92,29.2079,'AntonioPerelli'), +(84411,5 ,-10065.7,-1506.51,28.6594,'AntonioPerelli'), +(84411,6 ,-10041.6,-1532.86,28.5861,'AntonioPerelli'), +(84411,7 ,-10022.5,-1548.55,28.1352,'AntonioPerelli'), +(84411,8 ,-10005,-1581.7,26.4701,'AntonioPerelli'), +(84411,9 ,-9984.98,-1619.1,27.4708,'AntonioPerelli'), +(84411,10,-9951.41,-1667.43,25.4245,'AntonioPerelli'), +(84411,11,-9925.78,-1696.36,22.9439,'AntonioPerelli'), +(84411,12,-9897.08,-1710.83,26.0868,'AntonioPerelli'), +(84411,13,-9869.15,-1725.69,23.2218,'AntonioPerelli'), +(84411,14,-9852.03,-1752.42,22.4103,'AntonioPerelli'), +(84411,15,-9826.76,-1782.1,23.1369,'AntonioPerelli'), +(84411,16,-9790.31,-1802.4,27.6857,'AntonioPerelli'), +(84411,17,-9755.52,-1831.02,38.4034,'AntonioPerelli'), +(84411,18,-9734.99,-1860.02,45.889,'AntonioPerelli'), +(84411,19,-9719.51,-1879.1,49.2752,'AntonioPerelli'), +(84411,20,-9696.05,-1891.74,51.9546,'AntonioPerelli'), +(84411,21,-9660.99,-1899.52,55.5988,'AntonioPerelli'), +(84411,22,-9623.98,-1907.1,59.5171,'AntonioPerelli'), +(84412,1 ,-9596.44,-1932.23,63.2302,'AntonioPerelli'), +(84412,2 ,-9577.14,-1957.51,67.1923,'AntonioPerelli'), +(84412,3 ,-9579.4,-1981.08,66.6988,'AntonioPerelli'), +(84412,4 ,-9590.23,-2008.11,65.5707,'AntonioPerelli'), +(84412,5 ,-9587.03,-2057.37,65.0636,'AntonioPerelli'), +(84412,6 ,-9593.27,-2065.16,64.0651,'AntonioPerelli'), +(84412,7 ,-9619.08,-2072.71,61.2767,'AntonioPerelli'), +(84412,8 ,-9629.9,-2085.51,61.2144,'AntonioPerelli'), +(84412,9 ,-9623.13,-2102.23,61.8005,'AntonioPerelli'), +(84412,10,-9585.37,-2139.41,70.6677,'AntonioPerelli'), +(84412,11,-9572.79,-2161.46,78.4667,'AntonioPerelli'), +(84412,12,-9559.86,-2193.73,91.9311,'AntonioPerelli'), +(84412,13,-9553.54,-2204.55,93.4205,'AntonioPerelli'), +(84412,14,-9545.26,-2216.21,90.1241,'AntonioPerelli'), +(84412,15,-9515.68,-2246.76,78.2549,'AntonioPerelli'), +(84412,16,-9495.2,-2259.02,75.7786,'AntonioPerelli'), +(84412,17,-9436.89,-2273.81,70.5468,'AntonioPerelli'), +(84412,18,-9404.95,-2275.21,67.5449,'AntonioPerelli'), +(84412,19,-9367.3,-2278.23,71.3703,'AntonioPerelli'), +(84412,20,-9323.04,-2280.83,71.2278,'AntonioPerelli'), +(84412,21,-9290.92,-2282.85,67.5443,'AntonioPerelli'), +(84412,22,-9275.53,-2278.49,67.6409,'AntonioPerelli'), +(84412,23,-9271.57,-2253.45,64.5705,'AntonioPerelli'), +(84412,24,-9271.4,-2243.12,64.0434,'AntonioPerelli'), +(84412,25,-9270.34,-2208.37,64.058,'AntonioPerelli'), +(84412,26,-9264.62,-2202.9,64.058,'AntonioPerelli'), +(84413,1,-9264.48,-2191.18,64.0898,'AntonioPerelli'), +(84413,2,-9255.26,-2174.39,64.0583,'AntonioPerelli'), +(84413,3,-9255.02,-2153.34,64.0497,'AntonioPerelli'), +(84413,4,-9247.16,-2148.63,64.056,'AntonioPerelli'), +(84413,5,-9238.09,-2148.74,64.3415,'AntonioPerelli'), +(84413,6,-9237.44,-2156.86,64.3561,'AntonioPerelli'), +(84413,7,-9231.55,-2155.36,64.3575,'AntonioPerelli'), +(84413,8,-9226.45,-2155.2,63.7312,'AntonioPerelli'), +(84414,1 ,-9220.1,-2155,64.354,'AntonioPerelli'), +(84414,2 ,-9216.06,-2153.68,64.354,'AntonioPerelli'), +(84414,3 ,-9219.77,-2155.01,64.354,'AntonioPerelli'), +(84414,4 ,-9225.41,-2155.13,63.7311,'AntonioPerelli'), +(84414,5 ,-9231.15,-2155.25,64.3584,'AntonioPerelli'), +(84414,6 ,-9237.31,-2156.77,64.3584,'AntonioPerelli'), +(84414,7 ,-9238.18,-2148.76,64.3411,'AntonioPerelli'), +(84414,8 ,-9249.15,-2148.55,63.9338,'AntonioPerelli'), +(84414,9 ,-9257.67,-2157.13,64.0348,'AntonioPerelli'), +(84414,10,-9258.62,-2177.93,64.0579,'AntonioPerelli'), +(84414,11,-9264.72,-2191.18,64.0894,'AntonioPerelli'), +(84414,12,-9271.9,-2241.98,63.9644,'AntonioPerelli'), +(84414,13,-9272.98,-2264.72,66.2602,'AntonioPerelli'), +(84414,14,-9274.58,-2277.91,67.6425,'AntonioPerelli'), +(84414,15,-9290.22,-2283.7,67.545,'AntonioPerelli'), +(84414,16,-9322.94,-2280.98,71.2242,'AntonioPerelli'), +(84414,17,-9363.92,-2277.63,71.4815,'AntonioPerelli'), +(84414,18,-9403.79,-2274.33,67.5443,'AntonioPerelli'), +(84414,19,-9436.23,-2270.65,70.3375,'AntonioPerelli'), +(84414,20,-9475.93,-2262.14,74.7237,'AntonioPerelli'), +(84414,21,-9511.57,-2246.59,77.7952,'AntonioPerelli'), +(84414,22,-9545.38,-2211.74,91.4116,'AntonioPerelli'), +(84414,23,-9549.87,-2205.41,93.3445,'AntonioPerelli'), +(84414,24,-9555.7,-2195.05,92.6847,'AntonioPerelli'), +(84414,25,-9575.72,-2149.26,74.493,'AntonioPerelli'), +(84414,26,-9591.27,-2129.96,68.2226,'AntonioPerelli'), +(84414,27,-9624.54,-2096.38,61.4732,'AntonioPerelli'), +(84414,28,-9625.97,-2086,61.2153,'AntonioPerelli'), +(84414,29,-9620.49,-2078.53,61.2296,'AntonioPerelli'), +(84414,30,-9592.6,-2066.87,64.0926,'AntonioPerelli'), +(84414,31,-9584.56,-2056.78,65.3276,'AntonioPerelli'), +(84414,32,-9587.18,-2008.69,65.6429,'AntonioPerelli'), +(84414,33,-9575.86,-1973.91,66.8863,'AntonioPerelli'), +(84414,34,-9575.3,-1954.08,67.2295,'AntonioPerelli'), +(84414,35,-9583.7,-1911.68,62.5275,'AntonioPerelli'), +(84414,36,-9603.92,-1856.1,55.9317,'AntonioPerelli'), +(84414,37,-9614.42,-1830.99,52.7644,'AntonioPerelli'), +(84414,38,-9616.79,-1795.19,51.7746,'AntonioPerelli'), +(84414,39,-9612.04,-1757.8,54.948,'AntonioPerelli'), +(84414,40,-9611.03,-1741.91,56.7328,'AntonioPerelli'), +(84414,41,-9609.26,-1710.11,56.0571,'AntonioPerelli'), +(84414,42,-9621.76,-1660.48,56.1158,'AntonioPerelli'), +(84414,43,-9640.89,-1631.56,55.4084,'AntonioPerelli'), +(84414,44,-9646,-1615.21,55.9785,'AntonioPerelli'), +(84414,45,-9645.07,-1576.13,54.7603,'AntonioPerelli'), +(84414,46,-9646.25,-1548.95,53.9303,'AntonioPerelli'), +(84414,47,-9650.61,-1504.22,57.7693,'AntonioPerelli'), +(84414,48,-9653.71,-1479.23,55.5134,'AntonioPerelli'), +(84414,49,-9649.77,-1440.24,54.0637,'AntonioPerelli'), +(84414,50,-9659.08,-1402.37,53.0432,'AntonioPerelli'), +(84414,51,-9662.95,-1367.72,49.5712,'AntonioPerelli'), +(84414,52,-9658.17,-1333,48.4348,'AntonioPerelli'), +(84414,53,-9649.57,-1298.14,46.0543,'AntonioPerelli'), +(84414,54,-9648.9,-1267.82,42.7859,'AntonioPerelli'), +(84414,55,-9651.33,-1232.16,36.8859,'AntonioPerelli'), +(84414,56,-9649.54,-1211.18,36.187,'AntonioPerelli'), +(84414,57,-9642.71,-1195.66,37.1652,'AntonioPerelli'); From 0b29c079d71a3670399274ecef1a1cd7be3921db Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 9 May 2023 23:48:16 +0000 Subject: [PATCH 014/107] chore(DB): import pending files Referenced commit(s): 68b1e993e81cc4934d0dfce56eb4bda4aa18d730 --- .../rev_1682972046295168400.sql => db_world/2023_05_09_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1682972046295168400.sql => db_world/2023_05_09_02.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1682972046295168400.sql b/data/sql/updates/db_world/2023_05_09_02.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682972046295168400.sql rename to data/sql/updates/db_world/2023_05_09_02.sql index 34520c2f1..cadb82de8 100644 --- a/data/sql/updates/pending_db_world/rev_1682972046295168400.sql +++ b/data/sql/updates/db_world/2023_05_09_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_09_01 -> 2023_05_09_02 -- Antonio Perelli UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=844; DELETE FROM `smart_scripts` WHERE `entryorguid`=844 AND `source_type`=0; From da2dafa64b0a1fc2897eeb3b5fc7cd5a5c520fd5 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 10 May 2023 06:23:37 -0300 Subject: [PATCH 015/107] fix(Scripts/ShadowLabyrinth): Improve Grandmaster Vorpil script (#16126) fixed boss moving after teleporting and interrupting fire storm void travelers will cast empowering shadow on vorpil shadow nova animation now works fixed spell cast order as described in the vorpil issue [Shadow Labyrinth] Grandmaster Vorpil #15928 vorpil will use draw shadows to summon players instead of having them manually summoned --- .../rev_1682776739497561100.sql | 10 ++ .../boss_grandmaster_vorpil.cpp | 104 +++++++++--------- 2 files changed, 62 insertions(+), 52 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1682776739497561100.sql diff --git a/data/sql/updates/pending_db_world/rev_1682776739497561100.sql b/data/sql/updates/pending_db_world/rev_1682776739497561100.sql new file mode 100644 index 000000000..9343d7b3b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682776739497561100.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (33617, 33783); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(33617, 33617, 39363), +(33783, 33783, 39364); + +DELETE FROM `spell_custom_attr` WHERE `spell_id` IN (33783, 39364); +INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES +(33783, 4194304), +(39364, 4194304); diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp index c666b1fe0..bb7769ed2 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp @@ -28,8 +28,7 @@ enum GrandmasterVorpil SAY_SLAY = 3, SAY_DEATH = 4, - SPELL_RAIN_OF_FIRE_N = 33617, - SPELL_RAIN_OF_FIRE_H = 39363, + SPELL_RAIN_OF_FIRE = 33617, SPELL_DRAW_SHADOWS = 33563, SPELL_SHADOWBOLT_VOLLEY = 33841, @@ -38,8 +37,7 @@ enum GrandmasterVorpil NPC_VOID_TRAVELER = 19226, SPELL_SACRIFICE = 33587, SPELL_SHADOW_NOVA = 33846, - SPELL_EMPOWERING_SHADOWS_N = 33783, - SPELL_EMPOWERING_SHADOWS_H = 39364, + SPELL_EMPOWERING_SHADOWS = 33783, NPC_VOID_PORTAL = 19224, SPELL_VOID_PORTAL_VISUAL = 33569, @@ -155,22 +153,17 @@ struct boss_grandmaster_vorpil : public BossAI context.Repeat(); }).Schedule(36400ms, [this](TaskContext context) { - DoCastSelf(SPELL_DRAW_SHADOWS, true); + DoCastAOE(SPELL_DRAW_SHADOWS, true); - me->GetMap()->DoForAllPlayers([&](Player* player) - { - if (player->IsAlive() && !player->HasAura(SPELL_BANISH)) - { - player->TeleportTo(me->GetMapId(), VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0, TELE_TO_NOT_LEAVE_COMBAT); - } - }); + me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); + me->GetMotionMaster()->Clear(); scheduler.Schedule(1s, [this](TaskContext /*context*/) { - DoCastSelf(DUNGEON_MODE(SPELL_RAIN_OF_FIRE_N, SPELL_RAIN_OF_FIRE_H)); + DoCastSelf(SPELL_RAIN_OF_FIRE); + me->ResumeChasingVictim(); }); - me->NearTeleportTo(VorpilPosition[0], VorpilPosition[1], VorpilPosition[2], 0.0f); context.Repeat(36400ms, 44950ms); }).Schedule(10900ms, [this](TaskContext context) { @@ -203,52 +196,59 @@ struct npc_voidtraveler : public ScriptedAI { npc_voidtraveler(Creature* creature) : ScriptedAI(creature) {} - ObjectGuid VorpilGUID; - uint32 moveTimer; - bool sacrificed; - void Reset() override { - moveTimer = 1000; - sacrificed = false; - } + if (TempSummon* summon = me->ToTempSummon()) + { + if (Unit* vorpil = summon->GetSummonerUnit()) + { + me->GetMotionMaster()->MoveFollow(vorpil, 0.0f, 0.0f); + } + } - void SetGUID(ObjectGuid guid, int32) override - { - VorpilGUID = guid; + _scheduler.Schedule(1s, [this](TaskContext context) + { + if (TempSummon* summon = me->ToTempSummon()) + { + if (Unit* vorpil = summon->GetSummonerUnit()) + { + if (me->IsWithinMeleeRange(vorpil)) + { + DoCastSelf(SPELL_SACRIFICE); + _scheduler.Schedule(1200ms, [this](TaskContext /*context*/) + { + if (TempSummon* summon = me->ToTempSummon()) + { + if (Unit* vorpil = summon->GetSummonerUnit()) + { + DoCastAOE(SPELL_SHADOW_NOVA, true); + me->CastSpell(vorpil, SPELL_EMPOWERING_SHADOWS, true, nullptr, nullptr, vorpil->GetGUID()); + vorpil->ModifyHealth(int32(vorpil->CountPctFromMaxHealth(4))); + } + } + + _scheduler.Schedule(100ms, [this](TaskContext /*context*/) + { + me->KillSelf(); + }); + }); + } + else + { + context.Repeat(); + } + } + } + }); } void UpdateAI(uint32 diff) override { - moveTimer += diff; - if (moveTimer >= 1000) - { - moveTimer = 0; - Creature* Vorpil = ObjectAccessor::GetCreature(*me, VorpilGUID); - if (!Vorpil) - { - me->DespawnOrUnsummon(); - return; - } - me->GetMotionMaster()->MoveFollow(Vorpil, 0.0f, 0.0f); - - if (sacrificed) - { - Vorpil->AddAura(DUNGEON_MODE(SPELL_EMPOWERING_SHADOWS_N, SPELL_EMPOWERING_SHADOWS_H), Vorpil); - Vorpil->ModifyHealth(int32(Vorpil->CountPctFromMaxHealth(4))); - DoCastAOE(SPELL_SHADOW_NOVA, true); - me->KillSelf(); - return; - } - - if (me->IsWithinDist(Vorpil, 3.0f)) - { - DoCastSelf(SPELL_SACRIFICE); - sacrificed = true; - moveTimer = 500; - } - } + _scheduler.Update(diff); } + +private: + TaskScheduler _scheduler; }; void AddSC_boss_grandmaster_vorpil() From 4665398f990104dbf4439145578d8decbb49100c Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 10 May 2023 06:24:43 -0300 Subject: [PATCH 016/107] fix(DB/Quest): Correct quest progression in Children's Week Alliance Side (#16173) Create rev_1683046565991365200.sql --- data/sql/updates/pending_db_world/rev_1683046565991365200.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683046565991365200.sql diff --git a/data/sql/updates/pending_db_world/rev_1683046565991365200.sql b/data/sql/updates/pending_db_world/rev_1683046565991365200.sql new file mode 100644 index 000000000..f519cbe80 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683046565991365200.sql @@ -0,0 +1,3 @@ +-- +UPDATE `quest_template_addon` SET `ExclusiveGroup` = -10962 WHERE (`ID` IN (10962, 10968)); +UPDATE `quest_template_addon` SET `ExclusiveGroup` = 0 WHERE (`ID` = 10956); From 4e39626fede3e5058c1ed74126274ed4e4a8310e Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 10 May 2023 06:24:56 -0300 Subject: [PATCH 017/107] fix(DB/Creature): Add pathing to Zandras (#16175) Create rev_1683258798551630600.sql --- .../rev_1683258798551630600.sql | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683258798551630600.sql diff --git a/data/sql/updates/pending_db_world/rev_1683258798551630600.sql b/data/sql/updates/pending_db_world/rev_1683258798551630600.sql new file mode 100644 index 000000000..e34f491fa --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683258798551630600.sql @@ -0,0 +1,48 @@ +-- +SET @NPC := 76415; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-3749.31,`position_y`=1033.3,`position_z`=89.7322 WHERE `guid`=@NPC; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=0,`position_x`=-3749.31,`position_y`=1033.3,`position_z`=89.7322 WHERE `guid` IN (70887, 70888) AND `id1` = 19801; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`) VALUES +(@PATH, 1, -3757.53, 1029.77, 90.9887), +(@PATH, 2, -3775.93, 1032.31, 94.4492), +(@PATH, 3, -3799.31, 1053.31, 93.5239), +(@PATH, 4, -3773.25, 1031.12, 94.2648), +(@PATH, 5, -3755.86, 1031.77, 90.2802), +(@PATH, 6, -3740.91, 1039.71, 88.719), +(@PATH, 7, -3733.53, 1049.68, 87.3525), +(@PATH, 8, -3733.34, 1054.4, 86.5162), +(@PATH, 9, -3733.61, 1069.99, 87.8559), +(@PATH, 10, -3733.91, 1091.72, 85.9495), +(@PATH, 11, -3741.86, 1107.72, 84.366), +(@PATH, 12, -3744.4, 1111.01, 81.5303), +(@PATH, 13, -3752.36, 1119.98, 78.0073), +(@PATH, 14, -3759.7, 1124.51, 78.7782), +(@PATH, 15, -3770.4, 1127.24, 81.069), +(@PATH, 16, -3779.04, 1124.86, 83.6984), +(@PATH, 17, -3784.03, 1121.51, 84.4721), +(@PATH, 18, -3802.33, 1102.43, 84.2911), +(@PATH, 19, -3778.69, 1126.16, 83.4765), +(@PATH, 20, -3761.36, 1125.7, 79.0511), +(@PATH, 21, -3751.51, 1120.88, 77.9496), +(@PATH, 22, -3744.7, 1112.58, 81.0952), +(@PATH, 23, -3741.91, 1107.71, 84.3617), +(@PATH, 24, -3738.71, 1101.87, 85.9315), +(@PATH, 25, -3733.65, 1083.04, 86.6572), +(@PATH, 26, -3733.3, 1069.77, 87.8538), +(@PATH, 27, -3733.15, 1054.19, 86.5299), +(@PATH, 28, -3737.15, 1042.46, 88.3021), +(@PATH, 29, -3748.86, 1033.82, 89.6873); + +DELETE FROM `creature_formations` WHERE `memberGUID` IN (76415, 70887, 70888); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES +(76415, 76415, 0, 0, 515), +(76415, 70887, 4, 135, 515), +(76415, 70888, 4, 225, 515); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 21827); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(21827, 0, 0, 0, 9, 0, 100, 0, 0, 30, 14300, 28200, 0, 11, 38051, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Zandras - Within 0-30 Range - Cast \'Fel Shackles\''); From af738961a59a49677fce32aa318151d081da5dcf Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 10 May 2023 06:25:22 -0300 Subject: [PATCH 018/107] fix(DB/Creature): Correct Cleric and Ghostrider of Karabor factions (#16170) Create rev_1683170469129035500.sql --- data/sql/updates/pending_db_world/rev_1683170469129035500.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683170469129035500.sql diff --git a/data/sql/updates/pending_db_world/rev_1683170469129035500.sql b/data/sql/updates/pending_db_world/rev_1683170469129035500.sql new file mode 100644 index 000000000..6333589e9 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683170469129035500.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `faction` = 1822 WHERE (`entry` IN (21815, 21784)); From df4dd14b7bcc120713ef9a5b0caf3cbe0b2fbaf7 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 10 May 2023 06:25:41 -0300 Subject: [PATCH 019/107] fix(DB/SAI): Revamp Underbog Trash SAI (#16129) * Create rev_1682710323496877200.sql * Update rev_1682710323496877200.sql * Update rev_1682710323496877200.sql * Update rev_1682710323496877200.sql * Update rev_1682710323496877200.sql * Update rev_1682710323496877200.sql --- .../rev_1682710323496877200.sql | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682710323496877200.sql diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql new file mode 100644 index 000000000..b0b787f63 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql @@ -0,0 +1,82 @@ +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32329, 34163, 34171, 31410, 31407, 22887); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(32329, 32329, 37965), +(34163, 34163, 37967), +(34171, 34171, 37956), +(31410, 31410, 37973), +(31407, 31407, 39413), +(22887, 22887, 40317); + +-- Complete Rewrites +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (17871, 17723, 17724, 17731, 17732, 20465, 19632, 17726, 17728, 17771, 17735, 17727, 17729, 17734)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17871, 0, 0, 0, 0, 0, 100, 0, 5600, 6100, 13350, 17000, 0, 11, 32329, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Shambler - In Combat - Cast \'Itchy Spores\''), +(17871, 0, 1, 0, 2, 0, 100, 0, 0, 75, 25000, 30000, 0, 11, 34163, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Shambler - Between 0-75% Health - Cast \'Fungal Regrowth\''), +(17871, 0, 2, 0, 0, 0, 100, 0, 1200, 8700, 16000, 22000, 0, 11, 31427, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Shambler - In Combat - Cast \'Allergies\''), +(17723, 0, 0, 0, 0, 0, 100, 0, 7100, 9700, 21850, 29250, 0, 11, 32065, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Giant - In Combat - Cast \'Fungal Decay\''), +(17723, 0, 1, 0, 0, 0, 100, 4, 10000, 10000, 10000, 10000, 0, 11, 40318, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Giant - In Combat - Cast \'Growth\' (Heroic Dungeon)'), +(17723, 0, 2, 0, 0, 0, 100, 0, 4500, 9600, 18200, 27100, 0, 11, 15550, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Giant - In Combat - Cast \'Trample\''), +(17723, 0, 3, 4, 2, 0, 100, 3, 0, 30, 0, 0, 0, 11, 8599, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Giant - Between 0-30% Health - Cast \'Enrage\' (Normal Dungeon)'), +(17723, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bog Giant - Between 0-30% Health - Say Line 0 (Normal Dungeon)'), +(17724, 0, 0, 0, 67, 0, 100, 0, 1200, 12500, 0, 0, 0, 11, 34171, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbat - On Behind Target - Cast \'Tentacle Lash\''), +(17731, 0, 0, 0, 0, 0, 100, 0, 5800, 11850, 16300, 21500, 0, 11, 34984, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Fen Ray - In Combat - Cast \'Psychic Horror\''), +(17732, 0, 0, 0, 0, 0, 100, 0, 1600, 3200, 2850, 4900, 0, 11, 32330, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Lykul Wasp - In Combat - Cast \'Poison Spit\''), +(17732, 0, 1, 2, 2, 0, 100, 1, 0, 30, 0, 0, 0, 11, 8599, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lykul Wasp - Between 0-30% Health - Cast \'Enrage\''), +(17732, 0, 2, 0, 61, 0, 100, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lykul Wasp - Linked - Say Line 0'), +(17732, 0, 3, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 3, 0, 18722, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hack: Lykul Wasp - On Respawn - Morph To Model 18722'), +(20465, 0, 0, 0, 0, 0, 100, 0, 1200, 9600, 15350, 17000, 0, 11, 12097, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Frenzy - In Combat - Cast \'Pierce Armor\''), +(20465, 0, 1, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Frenzy - On Reset - Set Run On'), +(19632, 0, 0, 1, 2, 0, 100, 0, 0, 50, 14000, 18000, 0, 11, 34392, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lykul Stinger - Between 0-50% Health - Cast \'Stinger Rage\''), +(19632, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lykul Stinger - Between 0-50% Health - Say Line 0'), +(19632, 0, 2, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 3, 0, 19367, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hack: Lykul Stinger - On Reset - Morph To Model 19367'), +(17726, 0, 0, 0, 4, 0, 50, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Myrmidon - On Aggro - Say Line 0'), +(17726, 0, 1, 0, 0, 0, 100, 0, 4050, 16450, 10900, 21300, 0, 11, 31410, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Myrmidon - In Combat - Cast \'Coral Cut\''), +(17728, 0, 0, 0, 0, 0, 100, 0, 3650, 8700, 1200, 18250, 0, 11, 12057, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Tribesman - In Combat - Cast \'Strike\''), +(17728, 0, 1, 0, 2, 0, 100, 1, 0, 30, 0, 0, 0, 11, 8599, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Tribesman - Between 0-30% Health - Cast \'Enrage\' (No Repeat)'), +(17771, 0, 0, 0, 1, 0, 100, 0, 1000, 1000, 900000, 900000, 0, 11, 34880, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - Out of Combat - Cast \'Elemental Armor\''), +(17771, 0, 1, 0, 0, 0, 100, 1, 0, 0, 0, 0, 0, 31, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Set Random Phase (1-3) (No Repeat)'), +(17771, 0, 2, 0, 0, 1, 100, 2, 0, 0, 3200, 4800, 0, 11, 15497, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat CMC - Cast \'Frostbolt\' (Phase 1) (Normal Dungeon)'), +(17771, 0, 3, 0, 0, 1, 100, 4, 0, 0, 3200, 4800, 0, 11, 12675, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat CMC - Cast \'Frostbolt\' (Phase 1) (Heroic Dungeon)'), +(17771, 0, 4, 0, 0, 1, 100, 2, 8700, 8700, 19000, 19000, 0, 11, 32192, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Frost Nova\' (Phase 1) (Normal Dungeon)'), +(17771, 0, 5, 0, 0, 1, 100, 4, 8700, 8700, 19000, 19000, 0, 11, 15531, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Frost Nova\' (Phase 1) (Heroic Dungeon)'), +(17771, 0, 6, 0, 0, 2, 100, 2, 0, 0, 2400, 3800, 0, 11, 14034, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat CMC - Cast \'Fireball\' (Phase 2) (Normal Dungeon)'), +(17771, 0, 7, 0, 0, 2, 100, 4, 0, 0, 2400, 3800, 0, 11, 15228, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat CMC - Cast \'Fireball\' (Phase 2) (Heroic Dungeon)'), +(17771, 0, 8, 0, 0, 2, 100, 2, 3600, 3600, 12000, 15000, 0, 11, 15241, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Scorch\' (Phase 2) (Normal Dungeon)'), +(17771, 0, 9, 0, 0, 2, 100, 4, 3600, 3600, 9000, 12000, 0, 11, 36807, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Scorch\' (Phase 2) (Heroic Dungeon)'), +(17771, 0, 10, 0, 0, 4, 100, 2, 0, 0, 3100, 4700, 0, 11, 12471, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat CMC - Cast \'Shadow Bolt\' (Phase 3) (Normal Dungeon)'), +(17771, 0, 11, 0, 0, 4, 100, 4, 0, 0, 3100, 4700, 0, 11, 15232, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat CMC - Cast \'Shadow Bolt\' (Phase 3) (Heroic Dungeon)'), +(17771, 0, 12, 0, 0, 4, 100, 2, 7600, 7600, 3600, 10100, 0, 11, 31405, 32, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Corruption\' (Phase 3) (Normal Dungeon)'), +(17771, 0, 13, 0, 0, 4, 100, 4, 7600, 7600, 6700, 6700, 0, 11, 37113, 32, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Corruption\' (Phase 3) (Heroic Dungeon)'), +(17771, 0, 14, 0, 0, 0, 100, 0, 3000, 9000, 15000, 250000, 0, 11, 34880, 32, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - In Combat - Cast \'Elemental Armor\''), +(17771, 0, 15, 0, 2, 0, 100, 1, 0, 15, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Oracle - Between 0-15% Health - Flee For Assist (No Repeat)'), +(17735, 0, 0, 0, 4, 0, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Warrior - On Aggro - Say Line 0'), +(17735, 0, 1, 0, 0, 0, 100, 0, 4850, 9400, 1200, 24250, 0, 11, 11976, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Warrior - In Combat - Cast \'Strike\''), +(17735, 0, 2, 0, 13, 0, 100, 0, 4600, 4600, 0, 0, 0, 11, 11972, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Warrior - On Victim Casting - Cast \'Shield Bash\''), +(17735, 0, 3, 4, 2, 0, 100, 1, 0, 20, 0, 0, 0, 11, 8599, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Warrior - Between 0-20% Health - Cast \'Enrage\''), +(17735, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Warrior - Between 0-20% Health - Say Line 1'), +(17727, 0, 0, 0, 4, 0, 50, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Sentry - On Aggro - Say Line 0'), +(17727, 0, 1, 0, 0, 0, 100, 0, 6050, 13750, 1200, 16200, 0, 11, 11976, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Sentry - In Combat - Cast \'Strike\''), +(17727, 0, 2, 0, 0, 0, 100, 0, 12000, 15000, 17000, 22000, 0, 11, 11972, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Wrathfin Sentry - In Combat - Cast \'Shield Bash\''), +(17729, 0, 0, 0, 0, 0, 100, 0, 850, 1600, 2400, 3600, 0, 11, 22887, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Spearman - In Combat - Cast \'Throw\''), +(17729, 0, 1, 0, 0, 0, 100, 0, 8800, 13600, 8200, 13300, 0, 11, 31407, 0, 0, 0, 0, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 'Murkblood Spearman - In Combat - Cast \'Viper Sting\''), +(17729, 0, 2, 3, 2, 0, 100, 1, 0, 30, 0, 0, 0, 11, 8599, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Spearman - Between 0-30% Health - Cast \'Enrage\''), +(17729, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Murkblood Spearman - Linked - Say Line 0'), +(17734, 0, 0, 0, 0, 0, 100, 4, 10000, 10000, 10000, 10000, 0, 11, 40318, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Lord - In Combat - Cast \'Growth\' (Heroic Dungeon)'), +(17734, 0, 1, 2, 2, 0, 100, 3, 0, 30, 0, 0, 0, 11, 8599, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Lord - Between 0-30% Health - Cast \'Enrage\' (No Repeat) (Normal Dungeon)'), +(17734, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Underbog Lord - Between 0-30% Health - Say Line 0 (No Repeat) (Normal Dungeon)'), +(17734, 0, 3, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 3, 0, 17758, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hack: Underbog Lord - On Respawn - Morph To Model 17758'); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (17723, 17729, 17734); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17723, 0, 0, '%s becomes enraged!', 16, 0, 100, 0, 0, 0, 24144, 0, 'Bog Giant'), +(17729, 0, 0, '%s goes into a frenzy!', 16, 0, 100, 0, 0, 0, 38630, 0, 'Murkblood Spearman'), +(17734, 0, 0, '%s goes into a frenzy!', 16, 0, 100, 0, 0, 0, 38630, 0, 'Underbog Lord'); + +DELETE FROM `creature_text` WHERE `CreatureID` = 17735 AND `GroupID` = 1; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17735, 1, 0, '%s becomes enraged!', 16, 0, 100, 0, 0, 0, 24144, 0, 'Wrathfin Warrior'); + +DELETE FROM `creature_template_addon` WHERE (`entry` IN (17734, 20187)); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(17734, 0, 0, 0, 1, 0, 0, '21737 32066'), +(20187, 0, 0, 0, 1, 0, 0, '21737 32066'); From 453bd777d75be787b027e5368a7d3e83ea8e9509 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 10 May 2023 06:26:01 -0300 Subject: [PATCH 020/107] fix(DB/BloodmystIsle): Add Tzerak Pathing and missing Nazzivius gameobjects (#16151) * Create rev_1682962366213388000.sql Co-Authored-By: Rushor * buildfix --------- Co-authored-by: Rushor --- .../rev_1682962366213388000.sql | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682962366213388000.sql diff --git a/data/sql/updates/pending_db_world/rev_1682962366213388000.sql b/data/sql/updates/pending_db_world/rev_1682962366213388000.sql new file mode 100644 index 000000000..4c9149f10 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682962366213388000.sql @@ -0,0 +1,199 @@ +-- Update spawnposition +UPDATE `creature` SET `position_x` = -2347.824219, `position_y` = -11363.384766, `position_z` = 27.942247, `orientation` = 1.895, `wander_distance` = 0, `MovementType` = 0 WHERE `guid` = 62369 AND `id1` = 17337; +UPDATE `creature` SET `position_x` = -2571.970459, `position_y` = -11343.209961, `position_z` = 25.304287, `wander_distance` = 10, `MovementType` = 1 WHERE `guid` = 62370 AND `id1` = 17338; +UPDATE `creature` SET `position_x` = -2551.867188, `position_y` = -11275.340820, `position_z` = 36.856060, `wander_distance` = 10, `MovementType` = 1 WHERE `guid` = 62391 AND `id1` = 17339; +UPDATE `creature` SET `position_x` = -2442.700684, `position_y` = -11346.622070, `position_z` = 30.975761, `wander_distance` = 10, `MovementType` = 1 WHERE `guid` = 62356 AND `id1` = 17337; +UPDATE `creature` SET `position_x` = -2331.138184, `position_y` = -11346.259766, `position_z` = 30.188799, `wander_distance` = 10, `MovementType` = 1 WHERE `guid` = 62388 AND `id1` = 17338; +UPDATE `creature` SET `position_x` = -2394.431396, `position_y` = -11369.132813, `position_z` = 30.477755, `wander_distance` = 10, `MovementType` = 1 WHERE `guid` = 62387 AND `id1` = 17338; +UPDATE `creature` SET `position_x` = -2418.719727, `position_y` = -11211.605469, `position_z` = 24.287613, `wander_distance` = 0, `MovementType` = 0 WHERE `guid` = 62399 AND `id1` = 17339; +UPDATE `creature` SET `position_x` = -2476.131348, `position_y` = -11252.391602, `position_z` = 28.754663 WHERE `guid` = 62358 AND `id1` = 17337; +UPDATE `creature` SET `position_x` = -2510.596924, `position_y` = -11405.423828, `position_z` = 39.383987 WHERE `guid` = 62371 AND `id1` = 17338; +UPDATE `creature` SET `position_x` = -2474.837158, `position_y` = -11339.492188, `position_z` = 33.152016 WHERE `guid` = 62390 AND `id1` = 17339; +UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 0 WHERE `guid` IN (62394,62357,62404,62368,62403,62397,62396,62365,62366,62372,62389,62355,62378,62382,62373,62379); + +-- Waypoints & Text for Boss +UPDATE `creature` SET `position_x` = -2542.234375, `position_y` = -11328.796875, `position_z` = 22.867491, `orientation` = 0.662011, `wander_distance` = 0, `MovementType` = 0, `spawntimesecs` = 120 WHERE `guid` = 84399 AND `id1` = 17528; + +-- Tzerak SAI +SET @ENTRY := 17528; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,11,0,100,0,0,0,0,0,53,0,1752800,0,0,0,2,1,0,0,0,0,0,0,0,'Tzerak - On Respawn - Start Waypoint Aggressive'), +(@ENTRY,0,1,2,40,0,100,0,15,1752800,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,3.01264,'Tzerak - On Waypoint 15 Reached - Set Orientation 3.01264'), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,41,120000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tzerak - On Waypoint 15 Reached - Despawn In 120000 ms'), +(@ENTRY,0,3,4,40,0,100,0,1,1752800,0,0,54,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tzerak - On Waypoint 1 Reached - Pause Waypoint'), +(@ENTRY,0,4,0,61,0,100,0,0,0,0,0,1,0,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Tzerak - On Waypoint 1 Reached - Say Line 0'); + +DELETE FROM `waypoints` WHERE `entry` = 1752800; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `point_comment`) VALUES +(1752800, 1, -2542.23, -11328.8, 22.8675, NULL, 0, 'Tzerak'), +(1752800, 2, -2524.86, -11312.4, 25.5424, NULL, 0, 'Tzerak'), +(1752800, 3, -2516.88, -11305, 29.4704, NULL, 0, 'Tzerak'), +(1752800, 4, -2504.32, -11295.3, 32.0184, NULL, 0, 'Tzerak'), +(1752800, 5, -2484.1, -11275.5, 33.354, NULL, 0, 'Tzerak'), +(1752800, 6, -2470.59, -11269.7, 30.1162, NULL, 0, 'Tzerak'), +(1752800, 7, -2434.22, -11274.3, 30.9809, NULL, 0, 'Tzerak'), +(1752800, 8, -2417.37, -11278, 30.3146, NULL, 0, 'Tzerak'), +(1752800, 9, -2407.49, -11286, 33.2194, NULL, 0, 'Tzerak'), +(1752800, 10, -2395.33, -11298.7, 29.1992, NULL, 0, 'Tzerak'), +(1752800, 11, -2384.19, -11290, 31.0475, NULL, 0, 'Tzerak'), +(1752800, 12, -2359.67, -11270.9, 28.8272, NULL, 0, 'Tzerak'), +(1752800, 13, -2347.69, -11268.9, 30.022, NULL, 0, 'Tzerak'), +(1752800, 14, -2315.89, -11266.3, 35.8439, NULL, 0, 'Tzerak'), +(1752800, 15, -2315.89, -11266.3, 35.8439, NULL, 0, 'Tzerak'); + +DELETE FROM `creature_text` WHERE `CreatureID`=17528; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(17528, 0, 0, 'Fools! Weaklings! Tzerak has no need of your assistance!', 14, 0, 100, 0, 0, 0, 14070, 0, 'Tzerak'); + +-- Waypoints for Trashspawn +SET @NPC := 62392; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2521.73,-11261.4,36.1656,30000,0,1.7332), +(@PATH,2,-2522.38,-11282,36.231,300000,0,1.13446); + +SET @NPC := 62361; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2380.99,-11345,28.0672,150000,0,6.26573), +(@PATH,2,-2360.98,-11344.1,27.9434,30000,0,6.18013), +(@PATH,3,-2380.99,-11345,28.0672,150000,0,6.26573); + +SET @NPC := 62395; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2448.85,-11322.6,30.4971,50000,0,0.907571), +(@PATH,2,-2436.76,-11310.8,28.9112,30000,0,0.686272), +(@PATH,3,-2448.85,-11322.6,30.4971,250000,0,0.907571); + +SET @NPC := 62398; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2461.01,-11392.8,37.3679,60000,0,4.08407), +(@PATH,2,-2471.12,-11398,37.3497,30000,0,3.41946), +(@PATH,3,-2461.01,-11392.8,37.3679,240000,0,4.08407); + +SET @NPC := 62385; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2519.93,-11124.8,16.9338,100000,0,4.79965), +(@PATH,2,-2523.45,-11140,16.8102,30000,0,4.45305), +(@PATH,3,-2519.93,-11124.8,16.9338,180000,0,4.79965); + +SET @NPC := 62384; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2314.89,-11196.5,14.0951,180000,0,2.09439), +(@PATH,2,-2322.53,-11181.1,13.9421,30000,0,2.20995), +(@PATH,3,-2314.89,-11196.5,14.0951,120000,0,2.09439); + +SET @NPC := 62400; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2346.76,-11178.5,14.0671,160000,0,5.70723), +(@PATH,2,-2328.47,-11177.5,13.9423,50000,0,6.18407), +(@PATH,3,-2346.76,-11178.5,14.0671,140000,0,5.70723); + +SET @NPC := 62374; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2425.44,-11239.8,24.389,40000,0,2.33874), +(@PATH,2,-2430.69,-11227.7,23.4846,30000,0,2.01753), +(@PATH,3,-2425.44,-11239.8,24.389,260000,0,2.33874); + +SET @NPC := 62363; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2417.53,-11219.3,24.298,0,0,3.83202), +(@PATH,2,-2420.09,-11224.6,24.2207,0,0,4.58285), +(@PATH,3,-2417.4,-11234.2,24.287,0,0,5.35254), +(@PATH,4,-2407.2,-11243.3,25.2017,0,0,5.6392), +(@PATH,5,-2384.96,-11255.4,28.4475,0,0,5.79235), +(@PATH,6,-2365.68,-11262.6,28.6973,0,0,6.03975), +(@PATH,7,-2350.64,-11264.9,29.9547,0,0,6.2361), +(@PATH,8,-2327.79,-11264.1,34.9404,10000,0,0.0864284), +(@PATH,9,-2349.93,-11264.9,30.0943,0,0,3.14163), +(@PATH,10,-2365.42,-11262.5,28.7001,0,0,2.85496), +(@PATH,11,-2384.81,-11255.5,28.4646,0,0,2.71751), +(@PATH,12,-2406.78,-11243.7,25.2684,0,0,2.56436), +(@PATH,13,-2417.21,-11234.5,24.289,0,0,2.3523), +(@PATH,14,-2420.1,-11225.2,24.2164,0,0,1.70435), +(@PATH,15,-2418.02,-11219.3,24.2921,0,0,0.344823), +(@PATH,16,-2413.14,-11217.1,24.4672,300000,0,3.40339); + +SET @NPC := 62393; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`, `delay`, `action`, `orientation`) VALUES +(@PATH,1,-2525.62,-11248.4,36.167,0,0,5.98869), +(@PATH,2,-2516.71,-11251.2,36.167,0,0,5.89052), +(@PATH,3,-2504.22,-11260.2,36.167,0,0,5.65097), +(@PATH,4,-2487.4,-11265.7,33.7935,0,0,6.03189), +(@PATH,5,-2473.42,-11269.1,30.2829,0,0,6.05938), +(@PATH,6,-2448.13,-11275.2,29.8481,0,0,6.10257), +(@PATH,7,-2422.05,-11279.3,29.9044,0,0,6.13791), +(@PATH,8,-2406.46,-11281.8,32.759,0,0,2.6226), +(@PATH,9,-2380.68,-11277.7,29.0944,0,0,0.212084), +(@PATH,10,-2357.97,-11269.4,28.8948,0,0,0.116265), +(@PATH,11,-2329.64,-11267.7,34.2848,15000,0,0.0769952), +(@PATH,12,-2358.23,-11269.7,28.8781,0,0,3.35996), +(@PATH,13,-2380.33,-11277.9,29.0908,0,0,3.37959), +(@PATH,14,-2395.13,-11282,30.7833,0,0,3.08507), +(@PATH,15,-2406.13,-11281.8,32.7515,0,0,2.99868), +(@PATH,16,-2417.89,-11280.1,30.0178,0,0,2.99868), +(@PATH,17,-2446.36,-11275.3,29.9164,0,0,2.95941), +(@PATH,18,-2470.62,-11269.9,30.1313,0,0,2.9759), +(@PATH,19,-2485.65,-11266.4,33.2662,0,0,2.85338), +(@PATH,20,-2503.47,-11260.9,36.1658,0,0,2.62797), +(@PATH,21,-2517.11,-11250.9,36.1658,0,0,2.77327), +(@PATH,22,-2527.37,-11249.6,36.1658,0,0,3.32697), +(@PATH,23,-2542.37,-11253,36.2131,300000,0,6.14356); + +-- Gameobjects +DELETE FROM `gameobject` WHERE `guid` IN (21191,21202,21203,21237) AND `id` IN (185047,185046,185045,181806); +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 +(21191, 185047, 530, 3525, 3592, 1, 1, -2546.796142578125, -11313.705078125, 23.08652687072753906, 6.224953651428222656, 0, 0, -0.02911186218261718, 0.999576151371002197, 120, 255, 1, 49343), +(21202, 185046, 530, 3525, 3592, 1, 1, -2522.584228515625, -11257.0703125, 36.05535888671875, 0.355989396572113037, 0, 0, 0.177056312561035156, 0.984200716018676757, 120, 255, 1, 49343), +(21203, 185045, 530, 3525, 3592, 1, 1, -2474.967529296875, -11399.513671875, 37.10285568237304687, 0.355989396572113037, 0, 0, 0.177056312561035156, 0.984200716018676757, 120, 255, 1, 49343), +(21237, 181806, 530, 3525, 3592, 1, 1, -2542.06787109375, -11328.0830078125, 22.86698150634765625, 3.90954136848449707, 0, 0, -0.92718315124511718, 0.37460830807685852, 120, 255, 1, 49343); From 65cd928d9bce0cf7d95eb4b68c4fffb44de6ddb9 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 10 May 2023 09:28:37 +0000 Subject: [PATCH 021/107] chore(DB): import pending files Referenced commit(s): 453bd777d75be787b027e5368a7d3e83ea8e9509 --- .../rev_1682710323496877200.sql => db_world/2023_05_10_00.sql} | 1 + .../rev_1682776739497561100.sql => db_world/2023_05_10_01.sql} | 1 + .../rev_1682962366213388000.sql => db_world/2023_05_10_02.sql} | 1 + .../rev_1683046565991365200.sql => db_world/2023_05_10_03.sql} | 1 + .../rev_1683170469129035500.sql => db_world/2023_05_10_04.sql} | 1 + .../rev_1683258798551630600.sql => db_world/2023_05_10_05.sql} | 1 + 6 files changed, 6 insertions(+) rename data/sql/updates/{pending_db_world/rev_1682710323496877200.sql => db_world/2023_05_10_00.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1682776739497561100.sql => db_world/2023_05_10_01.sql} (89%) rename data/sql/updates/{pending_db_world/rev_1682962366213388000.sql => db_world/2023_05_10_02.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1683046565991365200.sql => db_world/2023_05_10_03.sql} (79%) rename data/sql/updates/{pending_db_world/rev_1683170469129035500.sql => db_world/2023_05_10_04.sql} (66%) rename data/sql/updates/{pending_db_world/rev_1683258798551630600.sql => db_world/2023_05_10_05.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/db_world/2023_05_10_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682710323496877200.sql rename to data/sql/updates/db_world/2023_05_10_00.sql index b0b787f63..fd5b4dd58 100644 --- a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql +++ b/data/sql/updates/db_world/2023_05_10_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_09_02 -> 2023_05_10_00 DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32329, 34163, 34171, 31410, 31407, 22887); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES (32329, 32329, 37965), diff --git a/data/sql/updates/pending_db_world/rev_1682776739497561100.sql b/data/sql/updates/db_world/2023_05_10_01.sql similarity index 89% rename from data/sql/updates/pending_db_world/rev_1682776739497561100.sql rename to data/sql/updates/db_world/2023_05_10_01.sql index 9343d7b3b..e90c3d21e 100644 --- a/data/sql/updates/pending_db_world/rev_1682776739497561100.sql +++ b/data/sql/updates/db_world/2023_05_10_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_00 -> 2023_05_10_01 -- DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (33617, 33783); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1682962366213388000.sql b/data/sql/updates/db_world/2023_05_10_02.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682962366213388000.sql rename to data/sql/updates/db_world/2023_05_10_02.sql index 4c9149f10..d1654110c 100644 --- a/data/sql/updates/pending_db_world/rev_1682962366213388000.sql +++ b/data/sql/updates/db_world/2023_05_10_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_01 -> 2023_05_10_02 -- Update spawnposition UPDATE `creature` SET `position_x` = -2347.824219, `position_y` = -11363.384766, `position_z` = 27.942247, `orientation` = 1.895, `wander_distance` = 0, `MovementType` = 0 WHERE `guid` = 62369 AND `id1` = 17337; UPDATE `creature` SET `position_x` = -2571.970459, `position_y` = -11343.209961, `position_z` = 25.304287, `wander_distance` = 10, `MovementType` = 1 WHERE `guid` = 62370 AND `id1` = 17338; diff --git a/data/sql/updates/pending_db_world/rev_1683046565991365200.sql b/data/sql/updates/db_world/2023_05_10_03.sql similarity index 79% rename from data/sql/updates/pending_db_world/rev_1683046565991365200.sql rename to data/sql/updates/db_world/2023_05_10_03.sql index f519cbe80..eddd66259 100644 --- a/data/sql/updates/pending_db_world/rev_1683046565991365200.sql +++ b/data/sql/updates/db_world/2023_05_10_03.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_02 -> 2023_05_10_03 -- UPDATE `quest_template_addon` SET `ExclusiveGroup` = -10962 WHERE (`ID` IN (10962, 10968)); UPDATE `quest_template_addon` SET `ExclusiveGroup` = 0 WHERE (`ID` = 10956); diff --git a/data/sql/updates/pending_db_world/rev_1683170469129035500.sql b/data/sql/updates/db_world/2023_05_10_04.sql similarity index 66% rename from data/sql/updates/pending_db_world/rev_1683170469129035500.sql rename to data/sql/updates/db_world/2023_05_10_04.sql index 6333589e9..ece367eb4 100644 --- a/data/sql/updates/pending_db_world/rev_1683170469129035500.sql +++ b/data/sql/updates/db_world/2023_05_10_04.sql @@ -1,2 +1,3 @@ +-- DB update 2023_05_10_03 -> 2023_05_10_04 -- UPDATE `creature_template` SET `faction` = 1822 WHERE (`entry` IN (21815, 21784)); diff --git a/data/sql/updates/pending_db_world/rev_1683258798551630600.sql b/data/sql/updates/db_world/2023_05_10_05.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1683258798551630600.sql rename to data/sql/updates/db_world/2023_05_10_05.sql index e34f491fa..1845ef2b1 100644 --- a/data/sql/updates/pending_db_world/rev_1683258798551630600.sql +++ b/data/sql/updates/db_world/2023_05_10_05.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_04 -> 2023_05_10_05 -- SET @NPC := 76415; SET @PATH := @NPC * 10; From fec169271664925d3df5f07c8c0d42d19dd55735 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 10 May 2023 06:29:01 -0300 Subject: [PATCH 022/107] fix(DB/SAI): Rework Trash SAI for Blood Furnace (#16123) * init * Update rev_1682710323496877200.sql --- .../rev_1682710323496877200.sql | 73 +++++++++++++++++++ .../BloodFurnace/boss_kelidan_the_breaker.cpp | 4 +- 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1682710323496877200.sql diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql new file mode 100644 index 000000000..5959a55aa --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682710323496877200.sql @@ -0,0 +1,73 @@ +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32197, 40062, 30846); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(32197, 32197, 37113), +(40062, 40062, 40064), +(30846, 30846, 32784); + +-- Small Updates +UPDATE `smart_scripts` SET `event_param1` = 9300, `event_param2` = 18200, `event_param3` = 10950, `event_param4` = 23100 WHERE (`entryorguid` = 17626) AND (`source_type` = 0) AND (`id` = 1); -- Laughing Skull Legionnaire +UPDATE `smart_scripts` SET `event_param1` = 8100, `event_param2` = 10100 WHERE (`entryorguid` = 17624) AND (`source_type` = 0) AND (`id` = 1); -- Laughing Skull Warden + +-- Complete Rewrites +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (17370, 17491, 17371, 17395, 17400, 17414, 19016, 18894, 17398, 17429, 17397)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17370, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Enforcer - On Aggro - Say Line 0'), +(17370, 0, 1, 0, 0, 0, 100, 0, 4850, 12150, 8500, 18400, 0, 11, 15655, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Enforcer - In Combat - Cast \'Shield Slam\''), +(17370, 0, 2, 0, 0, 0, 100, 0, 1200, 15300, 1200, 21000, 0, 11, 14516, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Enforcer - In Combat - Cast \'Strike\''), +(17491, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Rogue - On Aggro - Say Line 0'), +(17491, 0, 1, 0, 0, 0, 100, 0, 1200, 9800, 400, 15800, 0, 11, 34969, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Rogue - In Combat - Cast \'Poison\''), +(17491, 0, 2, 0, 0, 0, 100, 0, 4800, 4800, 60000, 60000, 0, 11, 6434, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Rogue - In Combat - Cast \'Slice and Dice\''), +(17491, 0, 3, 0, 0, 0, 100, 0, 13750, 29150, 13750, 29150, 0, 11, 30832, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Laughing Skull Rogue - In Combat - Cast \'Kidney Shot\''), +(17371, 0, 0, 0, 0, 0, 100, 2, 400, 4750, 3600, 6300, 0, 11, 12739, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Warlock - In Combat - Cast \'Shadow Bolt\' (Normal Dungeon)'), +(17371, 0, 1, 0, 0, 0, 100, 4, 400, 4750, 3600, 6300, 0, 11, 15472, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Warlock - In Combat - Cast \'Shadow Bolt\' (Heroic Dungeon)'), +(17371, 0, 2, 0, 0, 0, 100, 0, 600, 8500, 12150, 21750, 0, 11, 32197, 32, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Warlock - In Combat - Cast \'Corruption\''), +(17371, 0, 3, 0, 0, 0, 100, 0, 6600, 10700, 14900, 14900, 0, 11, 13338, 32, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Warlock - In Combat - Cast \'Curse of Tongues\''), +(17371, 0, 4, 0, 0, 0, 100, 4, 2300, 16600, 21850, 43750, 0, 11, 32863, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Warlock - In Combat - Cast \'Seed of Corruption\' (Heroic Dungeon)'), +(17371, 0, 5, 0, 1, 0, 100, 0, 12600, 13700, 21900, 24900, 0, 11, 33111, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Warlock - Out of Combat - Cast \'Fel Power\''), +(17395, 0, 0, 0, 0, 0, 100, 2, 0, 0, 3600, 6050, 0, 11, 15242, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Summoner - In Combat - Cast \'Fireball\' (Normal Dungeon)'), +(17395, 0, 1, 0, 0, 0, 100, 4, 0, 0, 3600, 6050, 0, 11, 17290, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Summoner - In Combat - Cast \'Fireball\' (Heroic Dungeon)'), +(17395, 0, 2, 0, 0, 0, 100, 2, 7250, 29200, 14600, 29200, 0, 11, 18399, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Summoner - In Combat - Cast \'Flamestrike\' (Normal Dungeon)'), +(17395, 0, 3, 0, 0, 0, 100, 4, 7250, 29200, 14600, 29200, 0, 11, 16102, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Summoner - In Combat - Cast \'Flamestrike\' (Heroic Dungeon)'), +(17395, 0, 4, 0, 0, 0, 100, 1, 300, 9000, 0, 0, 0, 11, 30853, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Summoner - In Combat - Cast \'Summon Seductress\''), +(17395, 0, 5, 0, 0, 0, 100, 1, 300, 9000, 0, 0, 0, 11, 30851, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Summoner - In Combat - Cast \'Summon Felhound Manastalker\''), +(17400, 0, 0, 0, 9, 0, 100, 4, 8, 25, 8700, 14700, 1, 11, 27577, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Felguard Annihilator - Within 8-25 Range - Cast \'Intercept\' (Heroic Dungeon)'), +(17400, 0, 1, 0, 0, 0, 100, 0, 3000, 10950, 8500, 20650, 0, 11, 18072, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Felguard Annihilator - In Combat - Cast \'Uppercut\''), +(17400, 0, 2, 0, 13, 0, 100, 0, 6900, 9500, 0, 0, 0, 11, 15615, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Felguard Annihilator - On Victim Casting - Cast \'Pummel\''), +(17400, 0, 3, 0, 0, 0, 100, 0, 12000, 12000, 12000, 12000, 0, 14, 0, 100, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Felguard Annihilator - In Combat - Reset All Threat'), +(17414, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Technician - On Aggro - Say Line 0'), +(17414, 0, 1, 0, 0, 0, 100, 0, 1000, 8700, 15800, 25500, 0, 11, 30846, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Technician - In Combat - Cast \'Throw Proximity Bomb\''), +(17414, 0, 2, 0, 0, 0, 100, 0, 300, 8100, 1200, 6600, 0, 11, 40062, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Technician - In Combat - Cast \'Throw Dynamite\''), +(17414, 0, 3, 0, 0, 0, 100, 0, 5400, 11600, 24300, 24300, 0, 11, 6726, 32, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Technician - In Combat - Cast \'Silence\''), +(19016, 0, 0, 0, 0, 0, 100, 2, 0, 0, 2900, 4800, 0, 11, 11921, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Familiar - In Combat - Cast \'Fireball\' (Normal Dungeon)'), +(19016, 0, 1, 0, 0, 0, 100, 4, 0, 0, 2900, 4800, 0, 11, 14034, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Familiar - In Combat - Cast \'Fireball\' (Heroic Dungeon)'), +(18894, 0, 0, 0, 0, 0, 100, 0, 1050, 3550, 13700, 19400, 0, 11, 18072, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Felguard Brute - In Combat - Cast \'Uppercut\''), +(18894, 0, 1, 0, 13, 0, 100, 0, 6900, 9500, 0, 0, 0, 11, 15615, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Felguard Brute - On Victim Casting - Cast \'Pummel\''), +(17398, 0, 1, 0, 0, 0, 100, 0, 6000, 18500, 1200, 27950, 0, 11, 22427, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nascent Fel Orc - In Combat - Cast \'Concussion Blow\''), +(17398, 0, 2, 0, 0, 0, 100, 0, 1200, 12150, 12150, 27950, 0, 11, 31900, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Nascent Fel Orc - In Combat - Cast \'Stomp\''), +(17429, 0, 0, 0, 0, 0, 100, 0, 3000, 6000, 20500, 20500, 0, 11, 22120, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Fel Orc Neophyte - In Combat - Cast \'Charge\''), +(17429, 0, 1, 0, 0, 0, 100, 0, 1200, 7300, 120000, 120000, 0, 11, 8269, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Fel Orc Neophyte - In Combat - Cast \'Frenzy\''), +(17397, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Adept - On Aggro - Say Line 0'), +(17397, 0, 1, 0, 0, 0, 100, 0, 5600, 12300, 9600, 11400, 0, 11, 11978, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Adept - In Combat - Cast Kick'), +(17397, 0, 2, 0, 2, 0, 100, 1, 0, 15, 0, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Adept - At 15% HP - Flee For Assist'), +(17397, 0, 3, 0, 1, 0, 100, 1, 1000, 1000, 0, 0, 0, 11, 31059, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Adept - Out Of Combat - Cast Hellfire Channeling'); + +-- Partial Rewrites +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17477) AND (`source_type` = 0) AND (`id` IN (2, 3, 4)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17477, 0, 2, 0, 0, 0, 100, 2, 200, 2400, 3600, 4800, 0, 11, 15242, 64, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Imp - In Combat - Cast \'Fireball\' (Normal Dungeon)'), +(17477, 0, 3, 0, 0, 0, 100, 4, 200, 2400, 3600, 4800, 0, 11, 17290, 64, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Imp - In Combat - Cast \'Fireball\' (Heroic Dungeon)'), +(17477, 0, 4, 0, 0, 0, 100, 4, 8500, 14800, 6050, 17750, 0, 11, 16144, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Hellfire Imp - In Combat - Cast \'Fire Blast\' (Heroic Dungeon)'); + +UPDATE `conditions` SET `SourceGroup` = 4 WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 6) AND (`SourceEntry` = 17397) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 29) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 17477) AND (`ConditionValue2` = 10) AND (`ConditionValue3` = 0); + +DELETE FROM `creature_template_addon` WHERE (`entry` IN (17491, 18610, 18615)); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(17491, 0, 0, 0, 1, 0, 0, '30991'), +(18610, 0, 0, 0, 1, 0, 0, '30991'), +(18615, 0, 0, 0, 1, 0, 0, '8876'); + +UPDATE `creature_template_addon` SET `auras` = '8876' WHERE (`entry` = 17397); + +UPDATE `creature_addon` SET `auras` = '30991' WHERE (`guid` IN (138193, 138237)); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` IN (1739500, 1739501)); diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index f844aa727..ce06c53d6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -313,7 +313,7 @@ public: kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED); me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1500, 3500)); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1200, 2400)); events.ScheduleEvent(EVENT_SPELL_MARK, urand(5000, 6500)); } @@ -336,7 +336,7 @@ public: { case EVENT_SPELL_SHADOW_BOLT: me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_H : SPELL_SHADOW_BOLT, false); - events.RepeatEvent(urand(6000, 7500)); + events.RepeatEvent(urand(6000, 7200)); break; case EVENT_SPELL_MARK: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) From 3aedf2fbf8b12a1e14d79d8236f5f8cd6f9bfb0d Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Wed, 10 May 2023 12:29:51 +0300 Subject: [PATCH 023/107] fix(DB/SAI): Void Baron Galaxis encounter. (#15312) * fix(DB/SAI): Void Baron Galaxis encounter. * remove item cast + add void storm cloud --- .../rev_1678298704175831000.sql | 19 +++++++++++++++++++ .../game/Spells/SpellInfoCorrections.cpp | 12 ++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1678298704175831000.sql diff --git a/data/sql/updates/pending_db_world/rev_1678298704175831000.sql b/data/sql/updates/pending_db_world/rev_1678298704175831000.sql new file mode 100644 index 000000000..7b5a674cb --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1678298704175831000.sql @@ -0,0 +1,19 @@ +-- Void Baron Galaxi +DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 16939); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(16939, 0, 0, 1, 0, 0, 0, 0); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 16939); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16939, 0, 0, 1, 54, 0, 100, 257, 0, 0, 0, 0, 0, 11, 34302, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Void Baron Galaxis - On Just Summoned - Cast \'Coalesce\' (No Repeat/Reset)'), +(16939, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 12, 22146, 3, 30000, 0, 0, 0, 8, 0, 0, 0, 0, -1243.23, 1312.41, -1, 0, 'Void Baron Galaxis - On Just Summoned - Summon Creature \'Summoning Voidstorm\' (No Repeat/Reset)'), +(16939, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 0, 9, 22146, 0, 5, 0, 0, 0, 0, 0, 'Void Baron Galaxis - On Just Summoned - Set Fly On (No Repeat/Reset)'), +(16939, 0, 3, 4, 60, 0, 100, 257, 2000, 2000, 0, 0, 0, 69, 1, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, -1232.9, 1355.96, 5.23, 1, 'Void Baron Galaxis - On Update - Move To Position (No Repeat/Reset)'), +(16939, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, -1232.9, 1355.96, 5.23, 1, 'Void Baron Galaxis - On Update - Set Home Position (No Repeat/Reset)'), +(16939, 0, 5, 0, 60, 0, 100, 257, 8500, 8500, 0, 0, 0, 11, 34236, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Void Baron Galaxis - On Update - Cast \'Baron`s Summons\' (No Repeat/Reset)'), +(16939, 0, 6, 0, 0, 0, 100, 0, 12000, 15000, 15000, 20000, 0, 11, 34239, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Void Baron Galaxis - In Combat - Cast \'Absorb Life\''); + +-- Summoning Voidstorm +DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 22146); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(22146, 0, 0, 1, 0, 0, 0, 0); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index f31cd691c..e8f602e2b 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4500,6 +4500,18 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx3 |= SPELL_ATTR3_DOT_STACKING_RULE; }); + // Absorb Life + ApplySpellFix({ 34239 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].ValueMultiplier = 1; + }); + + // Summon a Warp Rift in Void Ridge + ApplySpellFix({ 35036 }, [](SpellInfo* spellInfo) + { + spellInfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); // 0s + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 8224a90a99cc40ff9a7a9a3ab4d7aecc40aacd3d Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 10 May 2023 09:32:37 +0000 Subject: [PATCH 024/107] chore(DB): import pending files Referenced commit(s): 3aedf2fbf8b12a1e14d79d8236f5f8cd6f9bfb0d --- .../rev_1678298704175831000.sql => db_world/2023_05_10_06.sql} | 1 + .../rev_1682710323496877200.sql => db_world/2023_05_10_07.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1678298704175831000.sql => db_world/2023_05_10_06.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1682710323496877200.sql => db_world/2023_05_10_07.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1678298704175831000.sql b/data/sql/updates/db_world/2023_05_10_06.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1678298704175831000.sql rename to data/sql/updates/db_world/2023_05_10_06.sql index 7b5a674cb..2676cbb7b 100644 --- a/data/sql/updates/pending_db_world/rev_1678298704175831000.sql +++ b/data/sql/updates/db_world/2023_05_10_06.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_05 -> 2023_05_10_06 -- Void Baron Galaxi DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 16939); INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql b/data/sql/updates/db_world/2023_05_10_07.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1682710323496877200.sql rename to data/sql/updates/db_world/2023_05_10_07.sql index 5959a55aa..fcc41bd9c 100644 --- a/data/sql/updates/pending_db_world/rev_1682710323496877200.sql +++ b/data/sql/updates/db_world/2023_05_10_07.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_06 -> 2023_05_10_07 DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32197, 40062, 30846); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES (32197, 32197, 37113), From d7bdf5f71733e8033a1bc3878cd6101a76afad47 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Wed, 10 May 2023 10:32:15 -0300 Subject: [PATCH 025/107] fix(Vehicle): Crash (#16184) --- src/server/game/Entities/Unit/Unit.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b3d7086e9..ec241467f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -20050,6 +20050,9 @@ void Unit::_ExitVehicle(Position const* exitPosition) Unit* vehicleBase = m_vehicle->GetBase(); m_vehicle = nullptr; + if (!vehicleBase) + return; + SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT Position pos; From 236c9fb6c912292d47913545d9f6775de9066331 Mon Sep 17 00:00:00 2001 From: neifion-00000000 <91289495+neifion-00000000@users.noreply.github.com> Date: Wed, 10 May 2023 10:39:09 -0500 Subject: [PATCH 026/107] fix(DB/Creature): Remove Creature Entry 621 (#16182) --- data/sql/updates/pending_db_world/rev_1683303351155130800.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683303351155130800.sql diff --git a/data/sql/updates/pending_db_world/rev_1683303351155130800.sql b/data/sql/updates/pending_db_world/rev_1683303351155130800.sql new file mode 100644 index 000000000..7cd7f9058 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683303351155130800.sql @@ -0,0 +1,3 @@ +-- +-- Removes a unused and incorrect creature (not found in brute force) +DELETE FROM `creature_template` WHERE `entry`=621; From 288b3ecc319080b56fa56b4b2c2f1fbbbbc8914a Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 10 May 2023 15:44:46 +0000 Subject: [PATCH 027/107] chore(DB): import pending files Referenced commit(s): 236c9fb6c912292d47913545d9f6775de9066331 --- .../rev_1683303351155130800.sql => db_world/2023_05_10_08.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1683303351155130800.sql => db_world/2023_05_10_08.sql} (73%) diff --git a/data/sql/updates/pending_db_world/rev_1683303351155130800.sql b/data/sql/updates/db_world/2023_05_10_08.sql similarity index 73% rename from data/sql/updates/pending_db_world/rev_1683303351155130800.sql rename to data/sql/updates/db_world/2023_05_10_08.sql index 7cd7f9058..c39e39844 100644 --- a/data/sql/updates/pending_db_world/rev_1683303351155130800.sql +++ b/data/sql/updates/db_world/2023_05_10_08.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_07 -> 2023_05_10_08 -- -- Removes a unused and incorrect creature (not found in brute force) DELETE FROM `creature_template` WHERE `entry`=621; From 5bdea17e126ff5b04e03c66da2c98f39780c330d Mon Sep 17 00:00:00 2001 From: neifion-00000000 <91289495+neifion-00000000@users.noreply.github.com> Date: Wed, 10 May 2023 10:50:12 -0500 Subject: [PATCH 028/107] fix(DB/Creature): Remove Erroneous Mind Control Spell from Creature 601 (#16181) --- data/sql/updates/pending_db_world/rev_1683303106134626500.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683303106134626500.sql diff --git a/data/sql/updates/pending_db_world/rev_1683303106134626500.sql b/data/sql/updates/pending_db_world/rev_1683303106134626500.sql new file mode 100644 index 000000000..d88e16930 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683303106134626500.sql @@ -0,0 +1,3 @@ +-- +-- Remove ability from creature that doesn't exist +DELETE FROM `creature_template_spell` WHERE `CreatureID`=601 AND `Index`=0; From 361f96a13283c3b2eaa22b5eb06c493f19c880ec Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 10 May 2023 15:54:44 +0000 Subject: [PATCH 029/107] chore(DB): import pending files Referenced commit(s): 5bdea17e126ff5b04e03c66da2c98f39780c330d --- .../rev_1683303106134626500.sql => db_world/2023_05_10_09.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1683303106134626500.sql => db_world/2023_05_10_09.sql} (74%) diff --git a/data/sql/updates/pending_db_world/rev_1683303106134626500.sql b/data/sql/updates/db_world/2023_05_10_09.sql similarity index 74% rename from data/sql/updates/pending_db_world/rev_1683303106134626500.sql rename to data/sql/updates/db_world/2023_05_10_09.sql index d88e16930..33dd419ba 100644 --- a/data/sql/updates/pending_db_world/rev_1683303106134626500.sql +++ b/data/sql/updates/db_world/2023_05_10_09.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_08 -> 2023_05_10_09 -- -- Remove ability from creature that doesn't exist DELETE FROM `creature_template_spell` WHERE `CreatureID`=601 AND `Index`=0; From 580c1451d60f608c12db5d54f7d9660575ed4c94 Mon Sep 17 00:00:00 2001 From: Tereneckla <50233983+Tereneckla@users.noreply.github.com> Date: Wed, 10 May 2023 15:57:24 +0000 Subject: [PATCH 030/107] fix(DB/Creature): Reduce HP of unit_class paladin level 66 to 4892 (#16147) Create rev_1682890425657710000.sql --- data/sql/updates/pending_db_world/rev_1682890425657710000.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682890425657710000.sql diff --git a/data/sql/updates/pending_db_world/rev_1682890425657710000.sql b/data/sql/updates/pending_db_world/rev_1682890425657710000.sql new file mode 100644 index 000000000..dbf8c1dc2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682890425657710000.sql @@ -0,0 +1 @@ +UPDATE `creature_classlevelstats` SET `basehp1` = 4892 WHERE `class` = 2 and `level` = 66; From 51cdc52f0dfcf216a33d69e2b89b740f605fa747 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 10 May 2023 16:00:45 +0000 Subject: [PATCH 031/107] chore(DB): import pending files Referenced commit(s): 580c1451d60f608c12db5d54f7d9660575ed4c94 --- .../rev_1682890425657710000.sql => db_world/2023_05_10_10.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1682890425657710000.sql => db_world/2023_05_10_10.sql} (67%) diff --git a/data/sql/updates/pending_db_world/rev_1682890425657710000.sql b/data/sql/updates/db_world/2023_05_10_10.sql similarity index 67% rename from data/sql/updates/pending_db_world/rev_1682890425657710000.sql rename to data/sql/updates/db_world/2023_05_10_10.sql index dbf8c1dc2..647c930ee 100644 --- a/data/sql/updates/pending_db_world/rev_1682890425657710000.sql +++ b/data/sql/updates/db_world/2023_05_10_10.sql @@ -1 +1,2 @@ +-- DB update 2023_05_10_09 -> 2023_05_10_10 UPDATE `creature_classlevelstats` SET `basehp1` = 4892 WHERE `class` = 2 and `level` = 66; From 11eab9c3a68a3691597e9b1b5dbbf2654f358410 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Fri, 12 May 2023 13:20:31 +0200 Subject: [PATCH 032/107] fix(Scripts/TheSlavePens): port SAI from bosses to C++ (#16169) * fix * add sql 1 * add sql 2 * remove extra lines * remove dumb stuff keywords in "comment" were messing up the statement * same story todo: get better at SQL * better formatting + two sql statements together * remove old sql query * last fix * fixes to header enum * fix sql to have a more universal format * E e * final sql fix --- .../add_scriptnames_to_bosses.sql | 6 ++ .../SlavePens/boss_mennu_the_betrayer.cpp | 101 ++++++++++++++++++ .../SlavePens/boss_quagmirran.cpp | 73 +++++++++++++ .../SlavePens/boss_rokmar_the_crackler.cpp | 73 +++++++++++++ .../SlavePens/the_slave_pens.h | 13 ++- .../scripts/Outland/outland_script_loader.cpp | 10 +- 6 files changed, 270 insertions(+), 6 deletions(-) create mode 100644 data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql create mode 100644 src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_mennu_the_betrayer.cpp create mode 100644 src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_quagmirran.cpp create mode 100644 src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp diff --git a/data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql b/data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql new file mode 100644 index 000000000..5f7b4fbab --- /dev/null +++ b/data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql @@ -0,0 +1,6 @@ +-- +UPDATE `creature_template` SET `ScriptName` = 'boss_mennu_the_betrayer', `AIName` = '' WHERE `entry` = 17941; +UPDATE `creature_template` SET `ScriptName` = 'boss_quagmirran', `AIName` = '' WHERE `entry` = 17942; +UPDATE `creature_template` SET `ScriptName` = 'boss_rokmar_the_crackler', `AIName` = '' WHERE `entry` = 17991; + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (17941, 17942, 17991) AND `source_type` = 0; diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_mennu_the_betrayer.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_mennu_the_betrayer.cpp new file mode 100644 index 000000000..42b3d63e4 --- /dev/null +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_mennu_the_betrayer.cpp @@ -0,0 +1,101 @@ +/* + * 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 "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "the_slave_pens.h" + +enum Spells +{ + SPELL_LIGHTNING_BOLT = 35010, + SPELL_HEALING_WARD = 34980, + SPELL_EARTHGRAB_TOTEM = 31981, + SPELL_STONESKIN_TOTEM = 31985, + SPELL_NOVA_TOTEM = 31991 +}; + +enum Text +{ + SAY_AGGRO = 1, + SAY_KILL = 2, + SAY_JUST_DIED = 3 +}; + +struct boss_mennu_the_betrayer : public BossAI +{ + boss_mennu_the_betrayer(Creature* creature) : BossAI(creature, DATA_MENNU_THE_BETRAYER) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + _Reset(); + + ScheduleHealthCheckEvent(60, [&] { + DoCastSelf(SPELL_HEALING_WARD); + }); + } + + void JustSummoned(Creature* summon) override + { + summon->GetMotionMaster()->Clear(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + + scheduler.Schedule(5s, 8s, [this](TaskContext context) + { + DoCastVictim(SPELL_LIGHTNING_BOLT); + context.Repeat(7s, 10s); + }).Schedule(20s, [this](TaskContext context) + { + DoCastSelf(SPELL_NOVA_TOTEM); + context.Repeat(26s); + }).Schedule(19200ms, [this](TaskContext context) + { + DoCastSelf(SPELL_EARTHGRAB_TOTEM); + context.Repeat(26s); + }).Schedule(18s, [this](TaskContext context) + { + DoCastSelf(SPELL_STONESKIN_TOTEM); + context.Repeat(26s); + }); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_JUST_DIED); + } + + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_KILL); + } +}; + +void AddSC_boss_mennu_the_betrayer() +{ + RegisterTheSlavePensCreatureAI(boss_mennu_the_betrayer); +} diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_quagmirran.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_quagmirran.cpp new file mode 100644 index 000000000..105b17616 --- /dev/null +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_quagmirran.cpp @@ -0,0 +1,73 @@ +/* + * 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 "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "the_slave_pens.h" + +enum Spells +{ + SPELL_ACID_SPRAY = 38153, + SPELL_CLEAVE = 40504, + SPELL_POISON_BOLT_VOLLEY_N = 34780, + SPELL_POISON_BOLT_VOLLEY_H = 39340, + SPELL_UPPERCUT = 32055 +}; + +struct boss_quagmirran : public BossAI +{ + boss_quagmirran(Creature* creature) : BossAI(creature, DATA_QUAGMIRRAN) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + _Reset(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + + scheduler.Schedule(9100ms, [this](TaskContext context) + { + DoCastVictim(SPELL_CLEAVE); + context.Repeat(18800ms, 24800ms); + }).Schedule(20300ms, [this](TaskContext context) + { + DoCastVictim(SPELL_UPPERCUT); + context.Repeat(21800ms); + }).Schedule(25200ms, [this](TaskContext context) + { + DoCastVictim(SPELL_ACID_SPRAY); + context.Repeat(25s); + }).Schedule(31800ms, [this](TaskContext context) + { + DoCastSelf(DUNGEON_MODE(SPELL_POISON_BOLT_VOLLEY_N, SPELL_POISON_BOLT_VOLLEY_H)); + context.Repeat(24400ms); + }); + } +}; + +void AddSC_boss_quagmirran() +{ + RegisterTheSlavePensCreatureAI(boss_quagmirran); +} \ No newline at end of file diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp new file mode 100644 index 000000000..04253f8d4 --- /dev/null +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/boss_rokmar_the_crackler.cpp @@ -0,0 +1,73 @@ +/* + * 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 "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "the_slave_pens.h" + +enum Spells +{ + SPELL_ENSNARING_MOSS = 31948, + SPELL_FRENZY = 34970, + SPELL_GRIEVOUS_WOUND_N = 31956, + SPELL_GRIEVOUS_WOUND_H = 38801, + SPELL_WATER_SPIT = 35008 +}; + +struct boss_rokmar_the_crackler : public BossAI +{ + boss_rokmar_the_crackler(Creature* creature) : BossAI(creature, DATA_ROKMAR_THE_CRACKLER) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + _Reset(); + + ScheduleHealthCheckEvent(20, [&] { + DoCastSelf(SPELL_FRENZY); + }); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + + scheduler.Schedule(8s, [this] (TaskContext context) + { + DoCastVictim(DUNGEON_MODE(SPELL_GRIEVOUS_WOUND_N, SPELL_GRIEVOUS_WOUND_H)); + context.Repeat(20700ms); + }).Schedule(15300ms, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_ENSNARING_MOSS); + context.Repeat(26s); + }).Schedule(10700ms, [this](TaskContext context) + { + DoCastSelf(SPELL_WATER_SPIT); + context.Repeat(19s); + }); + } +}; + +void AddSC_boss_rokmar_the_crackler() +{ + RegisterTheSlavePensCreatureAI(boss_rokmar_the_crackler); +} diff --git a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.h index e467bcbc0..d54aa1c72 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.h +++ b/src/server/scripts/Outland/CoilfangReservoir/SlavePens/the_slave_pens.h @@ -27,10 +27,11 @@ uint32 const EncounterCount = 3; enum SPDataTypes { - DATA_MENNU_THE_BETRAYER = 1, - DATA_ROKMAR_THE_CRACKLER = 2, - DATA_QUAGMIRRAN = 3, - DATA_AHUNE = 4, + DATA_MENNU_THE_BETRAYER = 0, + DATA_ROKMAR_THE_CRACKLER = 1, + DATA_QUAGMIRRAN = 2, + DATA_AHUNE = 3, + MAX_ENCOUNTER = 4, DATA_AHUNE_BUNNY = 5, DATA_FROZEN_CORE = 6, DATA_FLAMECALLER_000 = 7, @@ -65,6 +66,8 @@ enum SPCreaturesIds NPC_SHAMAN_BEAM_BUNNY_002 = 25966, NPC_WHISP_DEST_BUNNY = 26120, NPC_WHISP_SOURCE_BUNNY = 26121, + NPC_MENNU_THE_BETRAYER = 17941, + NPC_ROKMAR_THE_CRACKLER = 17991, NPC_QUAGMIRRAN = 17942 }; @@ -80,4 +83,6 @@ inline AI* GetTheSlavePensAI(T* obj) return GetInstanceAI(obj, SPScriptName); } +#define RegisterTheSlavePensCreatureAI(ai_name) RegisterCreatureAIWithFactory (ai_name, GetTheSlavePensAI) + #endif // SLAVE_PENS_H diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp index 272a0c317..aa72e7127 100644 --- a/src/server/scripts/Outland/outland_script_loader.cpp +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -58,6 +58,9 @@ void AddSC_boss_the_black_stalker(); void AddSC_instance_the_underbog(); void AddSC_the_slave_pens(); // The Slave Pens void AddSC_boss_ahune(); +void AddSC_boss_mennu_the_betrayer(); +void AddSC_boss_rokmar_the_crackler(); +void AddSC_boss_quagmirran(); void AddSC_instance_the_slave_pens(); void AddSC_boss_gruul(); //Gruul's Lair void AddSC_boss_high_king_maulgar(); @@ -154,8 +157,11 @@ void AddOutlandScripts() AddSC_boss_ghazan(); AddSC_boss_the_black_stalker(); AddSC_instance_the_underbog(); - AddSC_the_slave_pens(); // The Slave Pens + AddSC_the_slave_pens(); //CR The Slave Pens AddSC_boss_ahune(); + AddSC_boss_mennu_the_betrayer(); + AddSC_boss_rokmar_the_crackler(); + AddSC_boss_quagmirran(); AddSC_instance_the_slave_pens(); AddSC_boss_gruul(); //Gruul's Lair AddSC_boss_high_king_maulgar(); @@ -207,4 +213,4 @@ void AddOutlandScripts() AddSC_shattrath_city(); AddSC_terokkar_forest(); //AddSC_zangarmarsh(); -} +} \ No newline at end of file From 4afe8fef2c46aa97279586b8ce2b852ff6dbf3fe Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 12 May 2023 11:23:05 +0000 Subject: [PATCH 033/107] chore(DB): import pending files Referenced commit(s): 11eab9c3a68a3691597e9b1b5dbbf2654f358410 --- .../add_scriptnames_to_bosses.sql => db_world/2023_05_12_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/add_scriptnames_to_bosses.sql => db_world/2023_05_12_00.sql} (90%) diff --git a/data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql b/data/sql/updates/db_world/2023_05_12_00.sql similarity index 90% rename from data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql rename to data/sql/updates/db_world/2023_05_12_00.sql index 5f7b4fbab..dd0b3750a 100644 --- a/data/sql/updates/pending_db_world/add_scriptnames_to_bosses.sql +++ b/data/sql/updates/db_world/2023_05_12_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_10_10 -> 2023_05_12_00 -- UPDATE `creature_template` SET `ScriptName` = 'boss_mennu_the_betrayer', `AIName` = '' WHERE `entry` = 17941; UPDATE `creature_template` SET `ScriptName` = 'boss_quagmirran', `AIName` = '' WHERE `entry` = 17942; From 79954c34d43722a292270d6ca90a7962615f73e6 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Fri, 12 May 2023 13:23:56 +0200 Subject: [PATCH 034/107] fix(Scripts/Outland): add missing C++ code and remove SAI scripts from Tavarok and Darkweaver Syth (#16178) * initial * whitespace1 * Update tavarok_darkweaver_sai_removal.sql fix sql --- .../tavarok_darkweaver_sai_removal.sql | 5 + .../Auchindoun/ManaTombs/boss_tavarok.cpp | 77 ++++++++++++ .../Outland/Auchindoun/ManaTombs/mana_tombs.h | 2 + .../SethekkHalls/boss_darkweaver_syth.cpp | 115 ++++++++++++++++++ .../scripts/Outland/outland_script_loader.cpp | 4 + 5 files changed, 203 insertions(+) create mode 100644 data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql create mode 100644 src/server/scripts/Outland/Auchindoun/ManaTombs/boss_tavarok.cpp create mode 100644 src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp diff --git a/data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql b/data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql new file mode 100644 index 000000000..7145c3b87 --- /dev/null +++ b/data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql @@ -0,0 +1,5 @@ +-- +UPDATE `creature_template` SET `ScriptName` = 'boss_tavarok', `AIName` = '' WHERE `entry` = 18343; +UPDATE `creature_template` SET `ScriptName` = 'boss_darkweaver_syth', `AIName` = '' WHERE `entry` = 18472; + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (18343, 18472, 1847200) AND (`source_type` = 0 OR `source_type` = 9); diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_tavarok.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_tavarok.cpp new file mode 100644 index 000000000..ce0c30e62 --- /dev/null +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_tavarok.cpp @@ -0,0 +1,77 @@ +/* + * 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 "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "mana_tombs.h" + +enum Spells +{ + SPELL_EARTHQUAKE = 33919, + SPELL_CRYSTAL_PRISON = 32361, + SPELL_ARCING_SMASH_N = 8374, + SPELL_ARCING_SMASH_H = 38761 +}; + +struct boss_tavarok : public BossAI +{ + boss_tavarok(Creature* creature) : BossAI(creature, DATA_TAVAROK) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + _Reset(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + + scheduler.Schedule(10s, 14200ms, [this](TaskContext context) + { + DoCastSelf(SPELL_EARTHQUAKE); + context.Repeat(20s, 31s); + }).Schedule(12s, 22s, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_CRYSTAL_PRISON); + context.Repeat(15s, 22s); + }).Schedule(5900ms, [this](TaskContext context) + { + DoCastVictim(DUNGEON_MODE(SPELL_ARCING_SMASH_N, SPELL_ARCING_SMASH_H)); + context.Repeat(8s, 12s); + }); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + } + + void KilledUnit(Unit* /*victim*/) override + { + } +}; + +void AddSC_boss_tavarok() +{ + RegisterManaTombsCreatureAI(boss_tavarok); +} \ No newline at end of file diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h index 8ed9d3ce8..5db1dc75d 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h @@ -40,4 +40,6 @@ inline AI* GetManaTombsAI(T* obj) return GetInstanceAI(obj, MTScriptName); } +#define RegisterManaTombsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetManaTombsAI) + #endif // MANA_TOMBS_H_ diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp new file mode 100644 index 000000000..45267f342 --- /dev/null +++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp @@ -0,0 +1,115 @@ +/* + * 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 "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "sethekk_halls.h" + +enum Spells +{ + SPELL_FLAME_SHOCK_N = 15039, + SPELL_FLAME_SHOCK_H = 15616, + SPELL_ARCANE_SHOCK_N = 33534, + SPELL_ARCANE_SHOCK_H = 38135, + SPELL_FROST_SHOCK_N = 12548, + SPELL_FROST_SHOCK_H = 21401, + SPELL_SHADOW_SHOCK_N = 33620, + SPELL_SHADOW_SHOCK_H = 38137, + SPELL_CHAIN_LIGHTNING_N = 15659, + SPELL_CHAIN_LIGHTNING_H = 15305, + SPELL_SUMMON_ARC_ELE = 33538, + SPELL_SUMMON_FIRE_ELE = 33537, + SPELL_SUMMON_FROST_ELE = 33539, + SPELL_SUMMON_SHADOW_ELE = 33540 +}; + +enum Text +{ + SAY_SUMMON = 0, + SAY_AGGRO = 1, + SAY_SLAY = 2, + SAY_DEATH = 3 +}; + +struct boss_darkweaver_syth : public BossAI +{ + boss_darkweaver_syth(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + _Reset(); + + ScheduleHealthCheckEvent({90, 50, 10}, [&] { + Talk(SAY_SUMMON); + DoCastSelf(SPELL_SUMMON_ARC_ELE); + DoCastSelf(SPELL_SUMMON_FIRE_ELE); + DoCastSelf(SPELL_SUMMON_FROST_ELE); + DoCastSelf(SPELL_SUMMON_SHADOW_ELE); + }); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + + scheduler.Schedule(2s, [this](TaskContext context) + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_FLAME_SHOCK_N, SPELL_FLAME_SHOCK_H)); + context.Repeat(10s, 15s); + }).Schedule(4s, [this](TaskContext context) + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H)); + context.Repeat(10s, 15s); + }).Schedule(6s, [this](TaskContext context) + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_FROST_SHOCK_N, SPELL_FROST_SHOCK_H)); + context.Repeat(10s, 15s); + }).Schedule(8s, [this](TaskContext context) + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_SHADOW_SHOCK_N, SPELL_SHADOW_SHOCK_H)); + context.Repeat(10s, 15s); + }).Schedule(15s, [this](TaskContext context) + { + DoCastRandomTarget(DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H)); + context.Repeat(10s, 15s); + }); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } +}; + +void AddSC_boss_darkweaver_syth() +{ + RegisterSethekkHallsCreatureAI(boss_darkweaver_syth); +} \ No newline at end of file diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp index aa72e7127..4600cd559 100644 --- a/src/server/scripts/Outland/outland_script_loader.cpp +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -21,9 +21,11 @@ void AddSC_instance_auchenai_crypts(); void AddSC_boss_shirrak_the_dead_watcher(); void AddSC_boss_nexusprince_shaffar(); //Auchindoun Mana Tombs void AddSC_boss_pandemonius(); +void AddSC_boss_tavarok(); void AddSC_instance_mana_tombs(); void AddSC_boss_talon_king_ikiss(); //Auchindoun Sekketh Halls void AddSC_boss_anzu(); +void AddSC_boss_darkweaver_syth(); void AddSC_instance_sethekk_halls(); void AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth void AddSC_boss_ambassador_hellmaw(); @@ -122,9 +124,11 @@ void AddOutlandScripts() AddSC_boss_shirrak_the_dead_watcher(); AddSC_boss_nexusprince_shaffar(); //Auchindoun Mana Tombs AddSC_boss_pandemonius(); + AddSC_boss_tavarok(); AddSC_instance_mana_tombs(); AddSC_boss_talon_king_ikiss(); //Auchindoun Sekketh Halls AddSC_boss_anzu(); + AddSC_boss_darkweaver_syth(); AddSC_instance_sethekk_halls(); AddSC_instance_shadow_labyrinth(); //Auchindoun Shadow Labyrinth AddSC_boss_ambassador_hellmaw(); From 3937de30f31f63387f780d1f2a8bdf3ecad1f8c1 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 12 May 2023 11:26:30 +0000 Subject: [PATCH 035/107] chore(DB): import pending files Referenced commit(s): 79954c34d43722a292270d6ca90a7962615f73e6 --- .../2023_05_12_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/tavarok_darkweaver_sai_removal.sql => db_world/2023_05_12_01.sql} (88%) diff --git a/data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql b/data/sql/updates/db_world/2023_05_12_01.sql similarity index 88% rename from data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql rename to data/sql/updates/db_world/2023_05_12_01.sql index 7145c3b87..d714b5eb9 100644 --- a/data/sql/updates/pending_db_world/tavarok_darkweaver_sai_removal.sql +++ b/data/sql/updates/db_world/2023_05_12_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_12_00 -> 2023_05_12_01 -- UPDATE `creature_template` SET `ScriptName` = 'boss_tavarok', `AIName` = '' WHERE `entry` = 18343; UPDATE `creature_template` SET `ScriptName` = 'boss_darkweaver_syth', `AIName` = '' WHERE `entry` = 18472; From 602cfcf4f1adc12d8120f36ac3b2f2cee468f217 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Fri, 12 May 2023 14:10:31 +0200 Subject: [PATCH 036/107] fix(DB/SAI): add RP event for Lieutenant Gravelhammer and Captain Auric Sunchaser in Allerian Stronghold (port from TC) (#16196) * initial * add co-authors add authors Co-authored-by: <40151102+Jonne733@users.noreply.github.com> Co-authored-by: Eridium <6587064+Killyana@users.noreply.github.com> * revert add authors Co-authored-by: Jonne733 <40151102+Jonne733@users.noreply.github.com> Co-authored-by: Eridium <6587064+Killyana@users.noreply.github.com> * fix formatting Co-authored-by: Jonne733 <40151102+Jonne733@users.noreply.github.com> Co-authored-by: Eridium <6587064+Killyana@users.noreply.github.com> * flipped Co-authored-by: Jonne733 <40151102+Jonne733@users.noreply.github.com> Co-authored-by: Eridium <6587064+Killyana@users.noreply.github.com> --------- Co-authored-by: Eridium <6587064+Killyana@users.noreply.github.com> Co-authored-by: Jonne733 <40151102+Jonne733@users.noreply.github.com> --- ...ravelhammer-auric-sunchaser-rp-sai-fix.sql | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql diff --git a/data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql b/data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql new file mode 100644 index 000000000..674333403 --- /dev/null +++ b/data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql @@ -0,0 +1,64 @@ +-- +-- Captain Auric Sunchaser +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=18745; +DELETE FROM `smart_scripts` WHERE `entryorguid`=18745 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18745,0,0,0,38,0,100,0,1,1,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,3.58753,'Captain Auric Sunchaser - On Data Set - Set Orientation'), +(18745,0,1,0,38,0,100,0,2,2,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,4.53786,'Captain Auric Sunchaser - On Data Set - Set Orientation'); + +-- Lieutenant Gravelhammer +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=18713; +DELETE FROM `smart_scripts` WHERE `entryorguid`=18713 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (1871300,1871301,1871302) AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18713,0,0,0,1,0,100,0,5000,15000,300000,900000,80,1871300,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - OOC - Run Script'), +(18713,0,1,0,40,0,100,0,4,1871300,0,0,80,1871301,2,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Waypoint 4 Reached - Run Script'), +(18713,0,2,0,40,0,100,0,7,1871300,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,4.153880,'Lieutenant Gravelhammer - On Waypoint 7 Reached - Set Orientation'), +(1871300,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 0'), +(1871300,9,1,0,0,0,100,0,11000,11000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 1'), +(1871300,9,2,0,0,0,100,0,5000,5000,0,0,53,0,1871300,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Start Waypoint'), +(1871301,9,0,0,0,0,100,0,0,0,0,0,54,35000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Pause Waypoint'), +(1871301,9,1,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0.259758,'Lieutenant Gravelhammer - On Script - Set Orientation'), +(1871301,9,2,0,0,0,100,0,200,200,0,0,45,1,1,0,0,0,0,19,18745,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Set Data to Captain Auric Sunchaser'), +(1871301,9,3,0,0,0,100,0,200,200,0,0,5,66,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Play Emote \'Salute\''), +(1871301,9,4,0,0,0,100,0,3000,3000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 2'), +(1871301,9,5,0,0,0,100,0,5000,5000,0,0,1,5,0,0,0,0,0,19,18745,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 5 (Captain Auric Sunchaser)'), +(1871301,9,6,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 3'), +(1871301,9,7,0,0,0,100,0,8000,8000,0,0,1,6,0,0,0,0,0,19,18745,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 6 (Captain Auric Sunchaser)'), +(1871301,9,8,0,0,0,100,0,8000,8000,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Say Line 4'), +(1871301,9,9,0,0,0,100,0,3000,3000,0,0,45,2,2,0,0,0,0,19,18745,0,0,0,0,0,0,'Lieutenant Gravelhammer - On Script - Set Data to Captain Auric Sunchaser'); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (18713,18745); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(18713,0,0,'Rifling through the stacks of books and scrolls on the table, Lieutenant Gravelhammer begins to examine one in particular with interest.',16,0,100,0,0,0,15827,0,'Lieutenant Gravelhammer'), +(18713,1,0,'What? What\'s this?!',12,7,100,5,0,0,15829,0,'Lieutenant Gravelhammer'), +(18713,1,1,'That is not even remotely imaginable!',12,7,100,5,0,0,15830,0,'Lieutenant Gravelhammer'), +(18713,1,2,'Looks like I picked a bad day to stop drinking.',12,7,100,5,0,0,15831,0,'Lieutenant Gravelhammer'), +(18713,1,3,'How did this get missed?!',12,7,100,5,0,0,15832,0,'Lieutenant Gravelhammer'), +(18713,2,0,'Cap\'n, sir, we have a slight problem.',12,7,100,1,0,0,15833,0,'Lieutenant Gravelhammer'), +(18713,3,0,'As you say, sir. It would appear that someone failed to mention to me that the druids at the Cenarion Thicket have been wiped out!',12,7,100,1,0,0,15838,0,'Lieutenant Gravelhammer'), +(18713,3,1,'Bad news. We\'ve been hit again. They\'re gone, but the front sentry tower is on fire.',12,7,100,1,0,0,15839,0,'Lieutenant Gravelhammer'), +(18713,3,2,'One of our merchants has gone missing!',12,7,100,1,0,0,15840,0,'Lieutenant Gravelhammer'), +(18713,3,3,'That group that recently arrived from Honor Hold -- they\'re mercs! They\'re starting to stir up trouble. Maybe I should have a talk with them?',12,7,100,1,0,0,15842,0,'Lieutenant Gravelhammer'), +(18713,3,4,'One of our scouts is reporting that a shadowy group has moved into the ruins of Grangol\'var Village. Oops, this report is over a week old.',12,7,100,1,0,0,15843,0,'Lieutenant Gravelhammer'), +(18713,3,5,'We have reports from a scout in the field that one of the Cenarion druids has been taken captive up at Firewing Point.',12,7,100,1,0,0,15844,0,'Lieutenant Gravelhammer'), +(18713,4,0,'Aye, aye, sir. Right away!',12,7,100,66,0,0,15853,0,'Lieutenant Gravelhammer'), +(18745,5,0,'At ease, lieutenant. Go on.',12,7,100,66,0,0,15834,0,'Captain Auric Sunchaser'), +(18745,5,1,'What is it now, Gravel?',12,7,100,6,0,0,15835,0,'Captain Auric Sunchaser'), +(18745,5,2,'What else could possibly go wrong?',12,7,100,6,0,0,15836,0,'Captain Auric Sunchaser'), +(18745,5,3,'Yes, lieutenant? Report.',12,7,100,1,0,0,15837,0,'Captain Auric Sunchaser'), +(18745,6,0,'That\'s troubling news indeed. See to it that it\'s taken care of immediately!',12,7,100,1,0,0,15849,0,'Captain Auric Sunchaser'), +(18745,6,1,'I don\'t have time for this, lieutenant. Make sure that you handle it.',12,7,100,1,0,0,15850,0,'Captain Auric Sunchaser'), +(18745,6,2,'If we\'re to help with that in any way we\'ll need more people. Call some of the scouts in to help with that.',12,7,100,1,0,0,15851,0,'Captain Auric Sunchaser'), +(18745,6,3,'Lieutenant, I want you to make that your top priority. Notify anyone that you think can help.',12,7,100,1,0,0,15852,0,'Captain Auric Sunchaser'); + +-- WP +DELETE FROM `waypoints` WHERE `entry`=1871300; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(1871300,1,-3012.45019,3983.69726,3.10552,'Lieutenant Gravelhammer'), +(1871300,2,-3011.6,3991.66,3.43526,'Lieutenant Gravelhammer'), +(1871300,3,-3011.15,3993.25,4.07544,'Lieutenant Gravelhammer'), +(1871300,4,-3010.1184,3994.7478,4.46475,'Lieutenant Gravelhammer'), +(1871300,5,-3010.28,3994.08,4.46465,'Lieutenant Gravelhammer'), +(1871300,6,-3012.069,3984.185,3.10552,'Lieutenant Gravelhammer'), +(1871300,7,-3007.9,3978.22,3.10527,'Lieutenant Gravelhammer'); From 81fb1e60b7c25bfb0ffdff05530386858b80f949 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 12 May 2023 12:12:51 +0000 Subject: [PATCH 037/107] chore(DB): import pending files Referenced commit(s): 602cfcf4f1adc12d8120f36ac3b2f2cee468f217 --- .../2023_05_12_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql => db_world/2023_05_12_02.sql} (99%) diff --git a/data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql b/data/sql/updates/db_world/2023_05_12_02.sql similarity index 99% rename from data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql rename to data/sql/updates/db_world/2023_05_12_02.sql index 674333403..d43ac2150 100644 --- a/data/sql/updates/pending_db_world/tc-gravelhammer-auric-sunchaser-rp-sai-fix.sql +++ b/data/sql/updates/db_world/2023_05_12_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_12_01 -> 2023_05_12_02 -- -- Captain Auric Sunchaser UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=18745; From 2a1d706a2f11bf307cfb5ae84afbcd4418393ca2 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Fri, 12 May 2023 14:15:02 +0200 Subject: [PATCH 038/107] =?UTF-8?q?fix(Scripts/Underbog):=20Underbat's=20T?= =?UTF-8?q?entacle=20Lash=20should=20be=20casted=20only=20=E2=80=A6=20(#14?= =?UTF-8?q?566)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Scripts/Underbog: Underbat's Tentacle Lash should be casted only on targets behind the bat. Fixes #13972 * buildfix. --- .../rev_1673176236867407100.sql | 7 +++ .../CoilfangReservoir/underbog/underbog.cpp | 47 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1673176236867407100.sql diff --git a/data/sql/updates/pending_db_world/rev_1673176236867407100.sql b/data/sql/updates/pending_db_world/rev_1673176236867407100.sql new file mode 100644 index 000000000..73a95444b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1673176236867407100.sql @@ -0,0 +1,7 @@ +-- +UPDATE `creature_template` SET `AiName`='', `ScriptName`='npc_underbat' WHERE `entry`=17724; +DELETE FROM `smart_scripts` WHERE `entryorguid`=17724 AND `source_type`=0; + +DELETE FROM `spelldifficulty_dbc` WHERE `ID`=34171; +INSERT INTO `spelldifficulty_dbc` VALUES +(34171,34171,37956,0,0); diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/underbog.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/underbog.cpp index 6f68fcd74..04880735e 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/underbog/underbog.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/underbog.cpp @@ -16,9 +16,55 @@ */ #include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "SpellScript.h" +#include "TaskScheduler.h" #include "the_underbog.h" +enum UnderbatSpells +{ + SPELL_TENTACLE_LASH = 34171 +}; + +struct npc_underbat : public ScriptedAI +{ + npc_underbat(Creature* c) : ScriptedAI(c) {} + + void Reset() override + { + _scheduler.CancelAll(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _scheduler.Schedule(2200ms, 6900ms, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, [&](Unit* u) + { + return u->IsAlive() && !u->IsPet() && me->IsWithinCombatRange(u, 20.f) && !me->HasInArc(M_PI, u); + })) + { + DoCast(target, SPELL_TENTACLE_LASH); + } + context.Repeat(5700ms, 9700ms); + }); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _scheduler.Update(diff, [this] + { + DoMeleeAttackIfReady(); + }); + } + +private: + TaskScheduler _scheduler; +}; + class spell_fungal_decay : public AuraScript { PrepareAuraScript(spell_fungal_decay); @@ -72,6 +118,7 @@ class spell_allergies : public AuraScript void AddSC_underbog() { + RegisterUnderbogCreatureAI(npc_underbat); RegisterSpellScript(spell_fungal_decay); RegisterSpellScript(spell_allergies); } From f2e01028cf4d3977b4e1c5a821f44097ec032975 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Fri, 12 May 2023 12:17:20 +0000 Subject: [PATCH 039/107] chore(DB): import pending files Referenced commit(s): 2a1d706a2f11bf307cfb5ae84afbcd4418393ca2 --- .../rev_1673176236867407100.sql => db_world/2023_05_12_03.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1673176236867407100.sql => db_world/2023_05_12_03.sql} (86%) diff --git a/data/sql/updates/pending_db_world/rev_1673176236867407100.sql b/data/sql/updates/db_world/2023_05_12_03.sql similarity index 86% rename from data/sql/updates/pending_db_world/rev_1673176236867407100.sql rename to data/sql/updates/db_world/2023_05_12_03.sql index 73a95444b..9d792aeb9 100644 --- a/data/sql/updates/pending_db_world/rev_1673176236867407100.sql +++ b/data/sql/updates/db_world/2023_05_12_03.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_12_02 -> 2023_05_12_03 -- UPDATE `creature_template` SET `AiName`='', `ScriptName`='npc_underbat' WHERE `entry`=17724; DELETE FROM `smart_scripts` WHERE `entryorguid`=17724 AND `source_type`=0; From 64c7c99bda36e503c8057dd4d8802082202d6844 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 13 May 2023 13:50:27 -0300 Subject: [PATCH 040/107] revert(Core/Player): Revert Delayed Damage System (#16246) * Revert "fix(Core/Spells): Delayed Damage system (#16183)" This reverts commit d282cce4af69110fa035954b3c81258a1e560b5e. * Revert "fix: Crash on ProcessDelayedDamages (#16166)" This reverts commit 3dbdea5e2853399d9b62989a279e562ce966cdd4. * Revert "fix(core\player): Missing combat animation (#14199)" This reverts commit a238e5e27bfa7b0fd2f6aab19d0722c61eaf81c5. --- src/server/game/Entities/Unit/Unit.cpp | 10 +---- src/server/game/Entities/Unit/Unit.h | 16 +------ src/server/game/Globals/ObjectAccessor.cpp | 11 ----- src/server/game/Globals/ObjectAccessor.h | 1 - .../game/Spells/Auras/SpellAuraEffects.cpp | 2 +- src/server/game/World/IWorld.cpp | 37 ---------------- src/server/game/World/IWorld.h | 7 +-- src/server/game/World/World.cpp | 44 ------------------- src/server/game/World/World.h | 8 ---- 9 files changed, 5 insertions(+), 131 deletions(-) delete mode 100644 src/server/game/World/IWorld.cpp diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ec241467f..f1620fb81 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -812,14 +812,8 @@ void Unit::DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb) } } -uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, bool /*allowGM*/, Spell const* damageSpell /*= nullptr*/, bool delayed) +uint32 Unit::DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, bool /*allowGM*/, Spell const* damageSpell /*= nullptr*/) { - if (delayed && attacker && attacker->GetTypeId() == TYPEID_PLAYER && attacker->GetGUID() != victim->GetGUID()) - { - sWorld->AddDelayedDamage(attacker->GetGUID(), victim->GetGUID(), damage, cleanDamage, damagetype, damageSchoolMask, spellProto, durabilityLoss, attacker->GetMapId(), attacker->GetInstanceId()); - return 0; - } - // Xinef: initialize damage done for rage calculations // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0); @@ -1460,7 +1454,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss, // Call default DealDamage CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL); - Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell, true); + Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell); } // @todo for melee need create structure as in diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 430029611..87cfccca0 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -757,20 +757,6 @@ struct CleanDamage struct CalcDamageInfo; struct SpellNonMeleeDamage; -struct DelayedDamage -{ - ObjectGuid attacker; - ObjectGuid victim; - uint32 damage; - CleanDamage const* cleanDamage; - DamageEffectType damagetype; - SpellSchoolMask damageSchoolMask; - SpellInfo const* spellProto; - bool durabilityLoss; - uint32 mapId; - uint32 instanceId; -}; - class DamageInfo { private: @@ -1572,7 +1558,7 @@ public: uint16 GetMaxSkillValueForLevel(Unit const* target = nullptr) const { return (target ? getLevelForTarget(target) : GetLevel()) * 5; } static void DealDamageMods(Unit const* victim, uint32& damage, uint32* absorb); - static uint32 DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage = nullptr, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = nullptr, bool durabilityLoss = true, bool allowGM = false, Spell const* spell = nullptr, bool delayed = false); + static uint32 DealDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage = nullptr, DamageEffectType damagetype = DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellInfo const* spellProto = nullptr, bool durabilityLoss = true, bool allowGM = false, Spell const* spell = nullptr); static void Kill(Unit* killer, Unit* victim, bool durabilityLoss = true, WeaponAttackType attackType = BASE_ATTACK, SpellInfo const* spellProto = nullptr, Spell const* spell = nullptr); void KillSelf(bool durabilityLoss = true, WeaponAttackType attackType = BASE_ATTACK, SpellInfo const* spellProto = nullptr, Spell const* spell = nullptr) { Kill(this, this, durabilityLoss, attackType, spellProto, spell); }; static int32 DealHeal(Unit* healer, Unit* victim, uint32 addhealth); diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index f2ef95526..a529e4e00 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -212,17 +212,6 @@ Unit* ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid const guid) return GetCreature(u, guid); } -Unit* ObjectAccessor::GetUnit(Map const* map, ObjectGuid const guid) -{ - if (guid.IsPlayer()) - return GetPlayer(map, guid); - - if (guid.IsPet()) - return const_cast(map)->GetPet(guid); - - return const_cast(map)->GetCreature(guid); -} - Creature* ObjectAccessor::GetCreature(WorldObject const& u, ObjectGuid const guid) { return u.GetMap()->GetCreature(guid); diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 8532dba74..7c6c003f5 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -71,7 +71,6 @@ namespace ObjectAccessor Transport* GetTransport(WorldObject const& u, ObjectGuid const guid); DynamicObject* GetDynamicObject(WorldObject const& u, ObjectGuid const guid); Unit* GetUnit(WorldObject const&, ObjectGuid const guid); - Unit* GetUnit(Map const* map, ObjectGuid const guid); Creature* GetCreature(WorldObject const& u, ObjectGuid const guid); Pet* GetPet(WorldObject const&, ObjectGuid const guid); Player* GetPlayer(Map const*, ObjectGuid const guid); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b811441bf..069b75086 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6387,7 +6387,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const SpellPeriodicAuraLogInfo pInfo(this, damage, overkill, absorb, resist, 0.0f, crit); target->SendPeriodicAuraLog(&pInfo); - Unit::DealDamage(caster, target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true, false); + Unit::DealDamage(caster, target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); Unit::ProcDamageAndSpell(caster, target, caster ? procAttacker : 0, procVictim, procEx, damage, BASE_ATTACK, GetSpellInfo(), nullptr, GetEffIndex(), nullptr, &dmgInfo); } diff --git a/src/server/game/World/IWorld.cpp b/src/server/game/World/IWorld.cpp deleted file mode 100644 index ae421903a..000000000 --- a/src/server/game/World/IWorld.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 "IWorld.h" - -class Unit; -class IWorld; - -void IWorld::AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) -{ - DelayedDamage delayedDamage; - delayedDamage.attacker = attacker; - delayedDamage.victim = victim; - delayedDamage.damage = damage; - delayedDamage.cleanDamage = cleanDamage; - delayedDamage.damagetype = damagetype; - delayedDamage.damageSchoolMask = damageSchoolMask; - delayedDamage.spellProto = spellProto; - delayedDamage.durabilityLoss = durabilityLoss; - delayedDamage.mapId = mapId; - delayedDamage.instanceId = instanceId; - _delayedDamages.push_back(delayedDamage); -} diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 1d4a6f0fe..c5fff797b 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -24,17 +24,15 @@ #include "ObjectGuid.h" #include "QueryResult.h" #include "SharedDefines.h" -#include "Unit.h" #include #include #include #include #include -class IWorld; -class Player; class WorldPacket; class WorldSession; +class Player; /// Storage class for commands issued for delayed execution struct AC_GAME_API CliCommandHolder @@ -518,13 +516,10 @@ enum Rates class IWorld { public: - std::list _delayedDamages; - virtual ~IWorld() = default; [[nodiscard]] virtual WorldSession* FindSession(uint32 id) const = 0; [[nodiscard]] virtual WorldSession* FindOfflineSession(uint32 id) const = 0; [[nodiscard]] virtual WorldSession* FindOfflineSessionForCharacterGUID(ObjectGuid::LowType guidLow) const = 0; - virtual void AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId); virtual void AddSession(WorldSession* s) = 0; virtual bool KickSession(uint32 id) = 0; virtual void UpdateMaxSessionCounters() = 0; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 621cfc056..b53515b1e 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2064,8 +2064,6 @@ void World::SetInitialWorldSettings() _mail_expire_check_timer = GameTime::GetGameTime() + 6h; - _timers[WUPDATE_DELAYED_DAMAGES].SetInterval(400); - ///- Initialize MapMgr LOG_INFO("server.loading", "Starting Map System"); LOG_INFO("server.loading", " "); @@ -2312,12 +2310,6 @@ void World::Update(uint32 diff) { METRIC_TIMER("world_update_time", METRIC_TAG("type", "Check quest reset times")); - if (_timers[WUPDATE_DELAYED_DAMAGES].Passed()) - { - _timers[WUPDATE_DELAYED_DAMAGES].Reset(); - ProcessDelayedDamages(); - } - /// Handle daily quests reset time if (currentGameTime > _nextDailyQuestReset) { @@ -3339,39 +3331,3 @@ CliCommandHolder::~CliCommandHolder() { free(m_command); } - -void World::AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) -{ - DelayedDamage delayedDamage; - delayedDamage.attacker = attacker; - delayedDamage.victim = victim; - delayedDamage.damage = damage; - delayedDamage.cleanDamage = cleanDamage; - delayedDamage.damagetype = damagetype; - delayedDamage.damageSchoolMask = damageSchoolMask; - delayedDamage.spellProto = spellProto; - delayedDamage.durabilityLoss = durabilityLoss; - delayedDamage.mapId = mapId; - delayedDamage.instanceId = instanceId; - _delayedDamages.push_back(delayedDamage); -} - -void World::ProcessDelayedDamages() -{ - for (auto& damage : _delayedDamages) - { - // Get map first - Map* map = sMapMgr->FindMap(damage.mapId, damage.instanceId); - if (!map) - continue; - - // Now we get both, attacker and victim, but attacker can be null (although attacker is always a player). - Unit* attacker = ObjectAccessor::GetUnit(map, damage.attacker); - Unit* victim = ObjectAccessor::GetUnit(map, damage.victim); - if (!victim) - continue; - - Unit::DealDamage(attacker, victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss); - } - _delayedDamages.clear(); -} diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 590d85161..f8e0de9b8 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -28,7 +28,6 @@ #include "QueryResult.h" #include "SharedDefines.h" #include "Timer.h" -#include "Unit.h" #include #include #include @@ -71,7 +70,6 @@ enum WorldTimers WUPDATE_PINGDB, WUPDATE_5_SECS, WUPDATE_WHO_LIST, - WUPDATE_DELAYED_DAMAGES, WUPDATE_COUNT }; @@ -155,8 +153,6 @@ public: World(); ~World() override; - std::list _delayedDamages; - static World* instance(); static uint32 m_worldLoopCounter; @@ -355,10 +351,6 @@ public: void RemoveOldCorpses() override; - void AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) override; - - void ProcessDelayedDamages(); - protected: void _UpdateGameTime(); // callback for UpdateRealmCharacters From 154fa624f0935dea94df444d41957052b976154e Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 13 May 2023 19:01:22 +0200 Subject: [PATCH 041/107] fix(Scripts/ShatteredHalls): fixes to Warbring O'mrogg combat scripts and timers (#16091) * initial attempt at combat fix with modernising * fixes to scheduler first Draft PR commit. Scheduler now works with boolean in capture list of lambda function. * whitespaces * debug * debug2 * debug3 * debug4 * add omrogg equip query and debug5 * remove tabs * Update data/sql/updates/pending_db_world/omroggequip.sql Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> * grouped taskscheduler * added more groups * adjust timer * better handling * v2 (too many commits) * fixed melee * clean up debug info removal of yells * more debug * attempt at fix * some changes to scheduling * final * whitespaces and extra lines * better formatting * final whitespace fix * context fix * dumb fix --------- Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- .../updates/pending_db_world/omroggequip.sql | 5 + .../ShatteredHalls/boss_warbringer_omrogg.cpp | 132 ++++++++++++------ 2 files changed, 91 insertions(+), 46 deletions(-) create mode 100644 data/sql/updates/pending_db_world/omroggequip.sql diff --git a/data/sql/updates/pending_db_world/omroggequip.sql b/data/sql/updates/pending_db_world/omroggequip.sql new file mode 100644 index 000000000..6dd76c187 --- /dev/null +++ b/data/sql/updates/pending_db_world/omroggequip.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `creature_equip_template` WHERE `CreatureID` = 16809 AND `ID` IN (1, 2); +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES +(16809, 1, 29484, 0, 0, 48999), +(16809, 2, 29479, 0, 0, 48999); diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index d71a2dad5..9f72931a6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -24,8 +24,11 @@ enum Spells SPELL_BLAST_WAVE = 30600, SPELL_FEAR = 30584, SPELL_THUNDERCLAP = 30633, + SPELL_BEATDOWN = 30618, SPELL_BURNING_MAUL_N = 30598, SPELL_BURNING_MAUL_H = 36056, + EQUIP_STANDARD = 1, + EQUIP_BURNING_MAUL = 2, }; enum Creatures @@ -57,12 +60,13 @@ enum Events EVENT_KILL_YELL_LEFT = 8, EVENT_KILL_YELL_RIGHT = 9, EVENT_DEATH_YELL = 10, +}; - EVENT_SPELL_FEAR = 20, - EVENT_SPELL_BURNING_MAUL = 21, - EVENT_SPELL_THUNDER_CLAP = 22, - EVENT_RESET_THREAT = 23, - EVENT_SPELL_BLAST_WAVE = 24 +enum Phase +{ + GROUP_NON_BURNING_PHASE = 0, + GROUP_BURNING_PHASE = 1, + GROUP_FULL_PHASE = 2 }; // ######################################################## @@ -78,6 +82,10 @@ public: { boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG) { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } EventMap events2; @@ -105,11 +113,79 @@ public: } _JustEngagedWith(); + scheduler.Schedule(500ms, GROUP_FULL_PHASE, [this](TaskContext context) + { + scheduler.Schedule(12100ms, 17300ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context) + { + DoCastAOE(SPELL_THUNDERCLAP); + context.Repeat(17200ms, 24200ms); + }).Schedule(20s, 30s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_BEATDOWN, false); + me->SetUnitFlag(UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_PASSIVE); + scheduler.Schedule(200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + { + uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); + if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) + head->AI()->Talk(threatYell - 1); + events.ScheduleEvent(threatYell, 3000); + DoResetThreatList(); + me->AddThreat(target, 2250.0f); + scheduler.Schedule(1200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + { + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + }); + } + }).Schedule(40s, 60s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + { + me->SetUnitFlag(UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_PASSIVE); + scheduler.Schedule(1200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_FEAR, false); + DoCastSelf(DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false); + me->LoadEquipment(EQUIP_BURNING_MAUL); + scheduler.CancelGroup(GROUP_NON_BURNING_PHASE); + scheduler.Schedule(200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + { + me->Yell("%s roars!", LANG_UNIVERSAL); + scheduler.Schedule(2200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + { + uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); + if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) + head->AI()->Talk(threatYell - 1); + events.ScheduleEvent(threatYell, 3000); - events.ScheduleEvent(EVENT_SPELL_FEAR, 8000); - events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 25000); - events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 15000); - events.ScheduleEvent(EVENT_RESET_THREAT, 30000); + DoResetThreatList(); + me->AddThreat(target, 2250.0f); + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + } + }); + }); + scheduler.Schedule(4850ms, 8500ms, GROUP_BURNING_PHASE, [this](TaskContext context) + { + DoCastAOE(SPELL_BLAST_WAVE, false); + context.Repeat(4850ms, 8500ms); + }).Schedule(45s, 60s, GROUP_BURNING_PHASE, [this](TaskContext context) + { + me->LoadEquipment(EQUIP_STANDARD); + context.CancelGroup(GROUP_BURNING_PHASE); + scheduler.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); + context.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); + context.RescheduleGroup(GROUP_FULL_PHASE, 1050ms); + }); + }); + }); + }); + context.Repeat(130s, 150s); + }); } void JustSummoned(Creature* summoned) override @@ -157,6 +233,7 @@ public: void UpdateAI(uint32 diff) override { events2.Update(diff); + scheduler.Update(diff); switch (uint32 eventId = events2.ExecuteEvent()) { case EVENT_AGGRO_YELL_1: @@ -179,45 +256,9 @@ public: if (!UpdateVictim()) return; - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_FEAR: - me->CastSpell(me, SPELL_FEAR, false); - events.ScheduleEvent(EVENT_SPELL_FEAR, 22000); - break; - case EVENT_SPELL_THUNDER_CLAP: - me->CastSpell(me, SPELL_THUNDERCLAP, false); - events.ScheduleEvent(EVENT_SPELL_THUNDER_CLAP, 25000); - break; - case EVENT_RESET_THREAT: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); - if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) - head->AI()->Talk(threatYell - 1); - events.ScheduleEvent(threatYell, 3000); - - DoResetThreatList(); - me->AddThreat(target, 10.0f); - } - events.ScheduleEvent(EVENT_RESET_THREAT, 30000); - break; - case EVENT_SPELL_BURNING_MAUL: - Talk(EMOTE_ENRAGE); - me->CastSpell(me, DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false); - events.ScheduleEvent(EVENT_SPELL_BURNING_MAUL, 40000); - events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 15000); - events.ScheduleEvent(EVENT_SPELL_BLAST_WAVE, 20000); - break; - case EVENT_SPELL_BLAST_WAVE: - me->CastSpell(me, SPELL_BLAST_WAVE, false); - break; - } - DoMeleeAttackIfReady(); } }; @@ -255,7 +296,6 @@ public: } } } - uint32 timer; }; From c99dd0704943874e2acddf5746ec8cc59bf6a1b2 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 13 May 2023 19:02:34 +0200 Subject: [PATCH 042/107] fix(DB/Creature): Update immunities to make Spectral Performers immune to CC (#16048) * first adds mechanic immunities to spectral performer that should make it immune to CC * formatting update n/a * add taunt immune * Update data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --------- Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- .../sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql diff --git a/data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql b/data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql new file mode 100644 index 000000000..257261043 --- /dev/null +++ b/data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`|2|16|64|256|512|1024|2048|4096|8192|131072|524288|4194304|8388608|33554432, `flags_extra` = `flags_extra`|256 WHERE `entry` = 16473; From 02b1e9f6476e0edefb5169c6b69d2e6ff573205e Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 13 May 2023 17:05:09 +0000 Subject: [PATCH 043/107] chore(DB): import pending files Referenced commit(s): c99dd0704943874e2acddf5746ec8cc59bf6a1b2 --- .../2023_05_13_00.sql} | 1 + .../omroggequip.sql => db_world/2023_05_13_01.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/fixmechimmunemaskspectperf.sql => db_world/2023_05_13_00.sql} (83%) rename data/sql/updates/{pending_db_world/omroggequip.sql => db_world/2023_05_13_01.sql} (85%) diff --git a/data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql b/data/sql/updates/db_world/2023_05_13_00.sql similarity index 83% rename from data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql rename to data/sql/updates/db_world/2023_05_13_00.sql index 257261043..3848c92b1 100644 --- a/data/sql/updates/pending_db_world/fixmechimmunemaskspectperf.sql +++ b/data/sql/updates/db_world/2023_05_13_00.sql @@ -1,2 +1,3 @@ +-- DB update 2023_05_12_03 -> 2023_05_13_00 -- UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`|2|16|64|256|512|1024|2048|4096|8192|131072|524288|4194304|8388608|33554432, `flags_extra` = `flags_extra`|256 WHERE `entry` = 16473; diff --git a/data/sql/updates/pending_db_world/omroggequip.sql b/data/sql/updates/db_world/2023_05_13_01.sql similarity index 85% rename from data/sql/updates/pending_db_world/omroggequip.sql rename to data/sql/updates/db_world/2023_05_13_01.sql index 6dd76c187..eb3fdb326 100644 --- a/data/sql/updates/pending_db_world/omroggequip.sql +++ b/data/sql/updates/db_world/2023_05_13_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_00 -> 2023_05_13_01 -- DELETE FROM `creature_equip_template` WHERE `CreatureID` = 16809 AND `ID` IN (1, 2); INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`, `VerifiedBuild`) VALUES From 38509d2b3a38cd8526e685ec5061ebdc1cdbabfb Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Sat, 13 May 2023 20:11:04 +0300 Subject: [PATCH 044/107] fix(Core/Spells): Apply AURA_STATE_FAERIE_FIRE to Lambent Blood. (#16103) --- src/server/game/Spells/SpellInfo.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 89629a44c..84e107db8 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2104,6 +2104,7 @@ AuraStateType SpellInfo::LoadAuraState() const case 35331: // Black Blood case 9806: // Phantom Strike case 35325: // Glowing Blood + case 35328: // Lambent Blood case 16498: // Faerie Fire case 6950: case 20656: From da101c26da87fec4b8fe6a7dcd504fa186dc2793 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 13 May 2023 14:40:17 -0300 Subject: [PATCH 045/107] fix(DB/SAI): Rework Auchenai Crypts trash SAI (#16186) Create rev_1683317616042194600.sql --- .../rev_1683317616042194600.sql | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683317616042194600.sql diff --git a/data/sql/updates/pending_db_world/rev_1683317616042194600.sql b/data/sql/updates/pending_db_world/rev_1683317616042194600.sql new file mode 100644 index 000000000..0d6750f56 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683317616042194600.sql @@ -0,0 +1,70 @@ +-- +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32860, 32858, 31975, 32861, 32863); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(32860, 32860, 38378), +(32858, 32858, 38377), +(31975, 31975, 35511), +(32861, 32861, 38379), +(32863, 32863, 38252); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (18558, 18497, 18493, 18559, 18495, 18499, 18498, 18501, 18700, 18702)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18558, 0, 0, 0, 0, 0, 100, 2, 0, 0, 2400, 3800, 0, 11, 12466, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Sorcerer - In Combat CMC - Cast \'Fireball\' (Normal Dungeon)'), +(18558, 0, 1, 0, 0, 0, 100, 4, 0, 0, 2400, 3800, 0, 11, 17290, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Sorcerer - In Combat CMC - Cast \'Fireball\' (Heroic Dungeon)'), +(18558, 0, 2, 0, 0, 0, 100, 2, 3600, 7800, 7800, 14500, 0, 11, 15043, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Sorcerer - In Combat - Cast \'Frostbolt\' (Normal Dungeon)'), +(18558, 0, 3, 0, 0, 0, 100, 4, 6000, 8000, 7800, 14500, 0, 11, 15530, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Sorcerer - In Combat - Cast \'Frostbolt\' (Heroic Dungeon)'), +(18558, 0, 4, 0, 0, 0, 100, 2, 10900, 16900, 9700, 15700, 0, 11, 15744, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Sorcerer - In Combat - Cast \'Blast Wave\' (Normal Dungeon)'), +(18558, 0, 5, 0, 0, 0, 100, 4, 10900, 16900, 7200, 10900, 0, 11, 22424, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Sorcerer - In Combat - Cast \'Blast Wave\' (Heroic Dungeon)'), +(18497, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Monk - On Aggro - Say Line 0'), +(18497, 0, 1, 0, 0, 0, 100, 0, 18100, 40400, 20500, 33700, 0, 11, 37321, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Monk - In Combat - Cast \'Overpower\''), +(18497, 0, 2, 0, 0, 0, 100, 0, 14650, 25150, 14150, 31350, 0, 11, 32849, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Monk - In Combat - Cast \'Cyclone Strike\''), +(18497, 0, 3, 0, 13, 0, 100, 0, 8400, 19300, 0, 0, 0, 11, 32846, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Monk - On Victim Casting - Cast \'Counter Kick\''), +(18497, 0, 4, 0, 23, 0, 100, 0, 38168, 0, 3600, 3600, 0, 11, 38168, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Monk - On Aura \'Spiritual Sight\' Missing - Cast \'Spiritual Sight\''), +(18497, 0, 5, 0, 0, 0, 100, 513, 2450, 5700, 0, 0, 0, 88, 1849700, 1849704, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Monk - In Combat - Run Random Script (No Repeat)'), +(18493, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Soulpriest - On Aggro - Say Line 0'), +(18493, 0, 1, 0, 0, 0, 100, 0, 400, 4650, 2850, 4650, 0, 11, 32860, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Soulpriest - In Combat - Cast \'Shadow Bolt\''), +(18493, 0, 2, 0, 0, 0, 100, 0, 13800, 31900, 13800, 31900, 0, 11, 32859, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Soulpriest - In Combat - Cast \'Falter\''), +(18493, 0, 3, 0, 0, 0, 100, 0, 3600, 6500, 16900, 33700, 0, 11, 32858, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Soulpriest - In Combat - Cast \'Touch of the Forgotten\''), +(18493, 0, 4, 0, 0, 0, 100, 513, 3450, 7300, 0, 0, 0, 88, 1849300, 1849304, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Soulpriest - In Combat - Run Random Script (No Repeat)'), +(18559, 0, 0, 0, 0, 0, 100, 2, 0, 0, 3650, 5250, 0, 11, 15547, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Stalker - In Combat CMC - Cast \'Shoot\' (Normal Dungeon)'), +(18559, 0, 1, 0, 0, 0, 100, 4, 0, 0, 3650, 5250, 0, 11, 16100, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Stalker - In Combat CMC - Cast \'Shoot\' (Heroic Dungeon)'), +(18559, 0, 2, 0, 0, 0, 100, 2, 8450, 14350, 13300, 22900, 0, 11, 31975, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Stalker - In Combat - Cast \'Serpent Sting\' (Normal Dungeon)'), +(18559, 0, 4, 0, 0, 0, 100, 4, 6000, 11000, 12000, 16000, 0, 11, 37551, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Stalker - In Combat - Cast \'Viper Sting\' (Heroic Dungeon)'), +(18559, 0, 5, 0, 0, 0, 100, 0, 9650, 25300, 11000, 11000, 0, 11, 32829, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Phasing Stalker - In Combat - Cast \'Spirit Vengeance\''), +(18495, 0, 0, 0, 4, 0, 15, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Vindicator - On Aggro - Say Line 0'), +(18495, 0, 1, 0, 23, 0, 100, 0, 32861, 0, 3100, 5300, 0, 11, 32861, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Vindicator - On Aura \'Shadowguard\' Missing - Cast \'Shadowguard\''), +(18495, 0, 2, 0, 0, 0, 100, 2, 6100, 15000, 15750, 25550, 0, 11, 17439, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Vindicator - In Combat - Cast \'Shadow Shock\' (Normal Dungeon)'), +(18495, 0, 3, 0, 0, 0, 100, 4, 6100, 15000, 15750, 25550, 0, 11, 17289, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Vindicator - In Combat - Cast \'Shadow Shock\' (Heroic Dungeon)'), +(18495, 0, 4, 0, 0, 0, 100, 1, 3450, 7300, 0, 0, 0, 88, 1849300, 1849304, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Vindicator - In Combat - Run Random Script (No Repeat)'), +(18499, 0, 0, 0, 0, 0, 100, 2, 3200, 4650, 3200, 4650, 0, 87, 1849900, 1849901, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - In Combat - Cast Random Spell (Normal Dungeon)'), +(18499, 0, 1, 0, 0, 0, 100, 4, 3200, 4650, 3200, 4650, 0, 87, 1849902, 1849903, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - In Combat - Cast Random Spell (Heroic Dungeon)'), +(18499, 0, 2, 0, 0, 0, 100, 3, 7300, 25200, 0, 0, 0, 11, 15744, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - In Combat - Cast \'Blast Wave\' (No Repeat) (Normal Dungeon)'), +(18499, 0, 3, 0, 0, 0, 100, 5, 7300, 25200, 0, 0, 0, 11, 22424, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - In Combat - Cast \'Blast Wave\' (No Repeat) (Heroic Dungeon)'), +(18499, 0, 4, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 11, 33422, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - On Just Summoned - Cast \'Phase In\''), +(18499, 0, 5, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - On Evade - Despawn Instant'), +(18498, 0, 0, 0, 23, 0, 100, 0, 32828, 0, 3650, 4850, 0, 11, 32828, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Soldier - On Aura \'Protection Aura\' Missing - Cast \'Protection Aura\''), +(18498, 0, 1, 0, 0, 0, 100, 0, 4800, 10900, 7200, 14500, 0, 11, 11972, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Soldier - In Combat - Cast \'Shield Bash\''), +(18498, 0, 2, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 11, 33422, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Soldier - On Just Summoned - Cast \'Phase In\''), +(18498, 0, 3, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Soldier - On Evade - Despawn Instant'), +(18501, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 11, 33422, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - On Just Summoned - Cast \'Phase In\''), +(18501, 0, 1, 0, 0, 0, 100, 2, 0, 0, 3650, 5250, 0, 11, 15547, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - In Combat CMC - Cast \'Shoot\' (Normal Dungeon)'), +(18501, 0, 2, 0, 0, 0, 100, 4, 0, 0, 3650, 5250, 0, 11, 16100, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - In Combat CMC - Cast \'Shoot\' (Heroic Dungeon)'), +(18501, 0, 3, 0, 0, 0, 100, 0, 8450, 14350, 13300, 22900, 0, 11, 31975, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - In Combat - Cast \'Serpent Sting\''), +(18501, 0, 4, 0, 0, 0, 100, 4, 6000, 11000, 12000, 16000, 0, 11, 37551, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - In Combat - Cast \'Viper Sting\' (Heroic Dungeon)'), +(18501, 0, 5, 0, 0, 0, 100, 0, 9650, 25300, 11000, 11000, 0, 11, 32829, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - In Combat - Cast \'Spirit Vengeance\''), +(18501, 0, 6, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Stalker - On Evade - Despawn Instant'), +(18700, 0, 0, 0, 0, 0, 100, 0, 2600, 13700, 1200, 20600, 0, 11, 13584, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Reanimated Bones - In Combat - Cast \'Strike\''), +(18700, 0, 1, 0, 0, 0, 100, 0, 3650, 22850, 7250, 21150, 0, 11, 13444, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Reanimated Bones - In Combat - Cast \'Sunder Armor\''), +(18702, 0, 0, 0, 4, 0, 40, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Necromancer - On Aggro - Say Line 0'), +(18702, 0, 1, 0, 0, 0, 100, 0, 1000, 15200, 4800, 15700, 0, 11, 35839, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Necromancer - In Combat - Cast \'Drain Soul\''), +(18702, 0, 2, 0, 0, 0, 100, 2, 12100, 29000, 22900, 35000, 0, 11, 32863, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Necromancer - In Combat - Cast \'Seed of Corruption\' (Normal Dungeon)'), +(18702, 0, 3, 0, 0, 0, 100, 4, 12100, 17500, 4800, 9600, 0, 11, 38252, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Necromancer - In Combat - Cast \'Seed of Corruption\' (Heroic Dungeon)'), +(18702, 0, 4, 0, 74, 0, 100, 2, 0, 70, 15700, 26500, 15, 11, 33325, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Necromancer - On Friendly Between 0-70% Health - Cast \'Shadow Mend\' (Normal Dungeon)'), +(18702, 0, 5, 0, 74, 0, 100, 4, 0, 70, 6100, 8400, 15, 11, 37367, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Auchenai Necromancer - On Friendly Between 0-70% Health - Cast \'Shadow Mend\' (Heroic Dungeon)'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` IN (1849900, 1849901, 1849902, 1849903)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1849900, 9, 0, 0, 0, 0, 100, 2, 0, 0, 0, 0, 0, 11, 12466, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - Actionlist for Random Cast - Cast \'Fireball\' (Normal Dungeon)'), +(1849901, 9, 0, 0, 0, 0, 100, 2, 0, 0, 0, 0, 0, 11, 15043, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - Actionlist for Random Cast - Cast \'Frostbolt\' (Normal Dungeon)'), +(1849902, 9, 0, 0, 0, 0, 100, 4, 0, 0, 0, 0, 0, 11, 17290, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - Actionlist for Random Cast - Cast \'Fireball\' (Heroic Dungeon)'), +(1849903, 9, 0, 0, 0, 0, 100, 4, 0, 0, 0, 0, 0, 11, 15530, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Unliving Sorcerer - Actionlist for Random Cast - Cast \'Frostbolt\' (Heroic Dungeon)'); From 64a7c59b576c45b9df3f6158c137522d489ef9d4 Mon Sep 17 00:00:00 2001 From: cTrinity <58204838+cTrinity@users.noreply.github.com> Date: Sun, 14 May 2023 01:40:46 +0800 Subject: [PATCH 046/107] fix(Core/ObjectMgr.cpp): Wrong format occurred (invalid format string) (#16168) * fix(Core/ObjectMgr.cpp): Wrong format occurred (invalid format string) Wrong format occurred (invalid format string) * fix(Core/ObjectMgr.cpp): Wrong format occurred (invalid format string) * fix(Core/ObjectMgr.cpp): Wrong format occurred (invalid format string) Co-authored-by: Angelo Venturini --------- Co-authored-by: Angelo Venturini --- src/server/game/Globals/ObjectMgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index c40591cfd..702f71441 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2885,7 +2885,7 @@ void ObjectMgr::LoadItemTemplates() } if (itemTemplate.Material != dbcitem->Material) { - LOG_ERROR("sql.sql", "Item (Entry: {%u}}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material); + LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct material ({}), must be {}.", entry, itemTemplate.Material, dbcitem->Material); if (enforceDBCAttributes) itemTemplate.Material = dbcitem->Material; } @@ -2897,7 +2897,7 @@ void ObjectMgr::LoadItemTemplates() } if (itemTemplate.DisplayInfoID != dbcitem->DisplayInfoID) { - LOG_ERROR("sql.sql", "Item (Entry: {%u}}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID); + LOG_ERROR("sql.sql", "Item (Entry: {}) does not have a correct display id ({}), must be {}.", entry, itemTemplate.DisplayInfoID, dbcitem->DisplayInfoID); if (enforceDBCAttributes) itemTemplate.DisplayInfoID = dbcitem->DisplayInfoID; } From 6fe6f891fcaeb0b674a911f32348b2d0f18922ff Mon Sep 17 00:00:00 2001 From: Tereneckla <50233983+Tereneckla@users.noreply.github.com> Date: Sat, 13 May 2023 17:41:27 +0000 Subject: [PATCH 047/107] =?UTF-8?q?Revert=20"fix(Core/Spells):=20Seal=20of?= =?UTF-8?q?=20Command,=20Seal=20of=20Vengeance=20and=20Seal=E2=80=A6=20(#1?= =?UTF-8?q?5938)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "fix(Core/Spells): Seal of Command, Seal of Vengeance and Seal of Corr… (#15193)" This reverts commit 88401360ab94d9d1704c928b0ed5edc8cef8caf9. * Keep Divine Storm in SPELLFAMILIY_PALADIN case * Update SpellEffects.cpp --- src/server/game/Spells/SpellEffects.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 2b3ad358c..594d5133d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3430,19 +3430,13 @@ void Spell::EffectWeaponDmg(SpellEffIndex effIndex) } case SPELLFAMILY_PALADIN: { - // Seal of Command Unleashed - if (m_spellInfo->Id == 20467) - { - spell_bonus += int32(0.08f * m_caster->GetTotalAttackPowerValue(BASE_ATTACK)); - spell_bonus += int32(0.13f * m_caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask())); - } - switch (m_spellInfo->Id) { - case 20424: // Seal of Command - case 42463: // Seal of Vengeance - case 53739: // Seal of Corruption - case 53385: // Divine Storm + case 20467: // Seal of Command Unleashed + spell_bonus += int32(0.08f * m_caster->GetTotalAttackPowerValue(BASE_ATTACK)); + spell_bonus += int32(0.13f * m_caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask())); + break; + case 53385: // Divine Storm deals normalized damage normalized = true; break; default: From cafa494308cf38a8a3b7c180c4124a01bca4e3ad Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 13 May 2023 17:43:46 +0000 Subject: [PATCH 048/107] chore(DB): import pending files Referenced commit(s): 6fe6f891fcaeb0b674a911f32348b2d0f18922ff --- .../rev_1683317616042194600.sql => db_world/2023_05_13_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1683317616042194600.sql => db_world/2023_05_13_02.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1683317616042194600.sql b/data/sql/updates/db_world/2023_05_13_02.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1683317616042194600.sql rename to data/sql/updates/db_world/2023_05_13_02.sql index 0d6750f56..611f5b6fe 100644 --- a/data/sql/updates/pending_db_world/rev_1683317616042194600.sql +++ b/data/sql/updates/db_world/2023_05_13_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_01 -> 2023_05_13_02 -- DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (32860, 32858, 31975, 32861, 32863); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES From 8d6392d60fba7ac83e49d10559c474d6c0517da6 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 13 May 2023 14:44:20 -0300 Subject: [PATCH 049/107] fix(Scripts/Underbog): Rework Swamplord Muselek (#14724) * fix(Scripts/Underbog): Rework Swamplord Muselek * Update boss_swamplord_muselek.cpp * update to bossai * Update outland_script_loader.cpp * Update boss_swamplord_muselek.cpp * Update boss_swamplord_muselek.cpp * prevent chase movement while walking backwards * Update boss_swamplord_muselek.cpp --- .../rev_1671902937557452500.sql | 3 + .../underbog/boss_swamplord_muselek.cpp | 178 ++++++++++++++++++ .../scripts/Outland/outland_script_loader.cpp | 2 + 3 files changed, 183 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1671902937557452500.sql create mode 100644 src/server/scripts/Outland/CoilfangReservoir/underbog/boss_swamplord_muselek.cpp diff --git a/data/sql/updates/pending_db_world/rev_1671902937557452500.sql b/data/sql/updates/pending_db_world/rev_1671902937557452500.sql new file mode 100644 index 000000000..8f50cd5ce --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1671902937557452500.sql @@ -0,0 +1,3 @@ +-- +UPDATE `creature_template` SET `ScriptName` = 'boss_swamplord_muselek', `AIName`= '' WHERE `entry` = 17826; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 17826 AND `source_type` = 0; diff --git a/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_swamplord_muselek.cpp b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_swamplord_muselek.cpp new file mode 100644 index 000000000..0d220613b --- /dev/null +++ b/src/server/scripts/Outland/CoilfangReservoir/underbog/boss_swamplord_muselek.cpp @@ -0,0 +1,178 @@ +/* + * 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 "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "the_underbog.h" + +enum Spells +{ + SPELL_SHOOT = 22907, + SPELL_KNOCKAWAY = 18813, + SPELL_RAPTOR_STRIKE = 31566, + SPELL_MULTISHOT = 34974, + SPELL_THROW_FREEZING_TRAP = 31946, + SPELL_AIMED_SHOT = 31623, + SPELL_HUNTERS_MARK = 31615 +}; + +enum Text +{ + SAY_AGGRO = 1, + SAY_KILL = 2, + SAY_JUST_DIED = 3 +}; + +enum Misc +{ + RANGED_GROUP = 1, + RANGE_CHECK = 2 +}; + +struct boss_swamplord_muselek : public BossAI +{ + boss_swamplord_muselek(Creature* creature) : BossAI(creature, DATA_MUSELEK) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + _Reset(); + _canChase = true; + } + + void AttackStart(Unit* victim) override + { + if (victim && me->Attack(victim, true) && me->IsWithinMeleeRange(victim)) + { + me->GetMotionMaster()->MoveChase(victim); + } + else + { + me->GetMotionMaster()->MoveIdle(); + } + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_JUST_DIED); + } + + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_KILL); + } + + bool CanShootVictim() + { + return me->GetVictim() && !me->IsWithinRange(me->GetVictim(), 10.0f) && me->IsWithinLOSInMap(me->GetVictim()); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + Talk(SAY_AGGRO); + + scheduler.Schedule(3s, [this](TaskContext context) + { + if (CanShootVictim()) + { + me->LoadEquipment(1, true); + DoCastVictim(SPELL_SHOOT); + me->GetMotionMaster()->Clear(); + } + else if (_canChase) + { + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } + + context.Repeat(); + }).Schedule(15s, 30s, [this](TaskContext context) + { + if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) + { + DoCastVictim(SPELL_KNOCKAWAY); + } + + context.Repeat(); + }).Schedule(10s, 15s, [this](TaskContext context) + { + DoCastVictim(SPELL_MULTISHOT); + context.Repeat(20s, 30s); + }).Schedule(30s, 40s, [this](TaskContext context) + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, false, true)) + { + _markTarget = target->GetGUID(); + _canChase = false; + DoCastVictim(SPELL_THROW_FREEZING_TRAP); + + scheduler.Schedule(3s, [this, target](TaskContext) + { + if (target && me->GetVictim()) + { + if (me->IsWithinMeleeRange(me->GetVictim())) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveBackwards(me->GetVictim(), 10.0f); + } + + me->m_Events.AddEventAtOffset([this]() + { + if (Unit* marktarget = ObjectAccessor::GetUnit(*me, _markTarget)) + { + DoCast(marktarget, SPELL_HUNTERS_MARK); + } + }, 3s); + } + }); + + scheduler.Schedule(5s, [this, target](TaskContext) + { + if (target) + { + me->m_Events.AddEventAtOffset([this]() + { + if (Unit* marktarget = ObjectAccessor::GetUnit(*me, _markTarget)) + { + scheduler.DelayAll(5s); + DoCast(marktarget, SPELL_AIMED_SHOT); + _canChase = true; + } + }, 3s); + } + }); + } + + context.Repeat(12s, 16s); + }); + } + +private: + ObjectGuid _markTarget; + bool _canChase; +}; + +void AddSC_boss_swamplord_muselek() +{ + RegisterUnderbogCreatureAI(boss_swamplord_muselek); +} diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp index 4600cd559..ced2b80f4 100644 --- a/src/server/scripts/Outland/outland_script_loader.cpp +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -56,6 +56,7 @@ void AddSC_instance_steam_vault(); void AddSC_underbog(); //CR Underbog void AddSC_boss_hungarfen(); void AddSC_boss_ghazan(); +void AddSC_boss_swamplord_muselek(); void AddSC_boss_the_black_stalker(); void AddSC_instance_the_underbog(); void AddSC_the_slave_pens(); // The Slave Pens @@ -159,6 +160,7 @@ void AddOutlandScripts() AddSC_underbog(); //CR Underbog AddSC_boss_hungarfen(); AddSC_boss_ghazan(); + AddSC_boss_swamplord_muselek(); AddSC_boss_the_black_stalker(); AddSC_instance_the_underbog(); AddSC_the_slave_pens(); //CR The Slave Pens From 2745a98ed1003da9141b93608cc57c249b5bb30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= Date: Sun, 14 May 2023 01:46:50 +0800 Subject: [PATCH 050/107] fix(Core/mail): letter paper (#15039) Mail paper --- src/server/game/Mails/Mail.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Mails/Mail.h b/src/server/game/Mails/Mail.h index c76bd6591..8bff3ebac 100644 --- a/src/server/game/Mails/Mail.h +++ b/src/server/game/Mails/Mail.h @@ -30,7 +30,7 @@ class Item; class Object; class Player; -#define MAIL_BODY_ITEM_TEMPLATE 8383 // - plain letter, A Dusty Unsent Letter: 889 +#define MAIL_BODY_ITEM_TEMPLATE 9311 // - plain letter, A Dusty Unsent Letter: 889 #define MAX_MAIL_ITEMS 12 enum MailMessageType From 83a53d0b2e104347b28d4cd67431b21090f2f0f9 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 13 May 2023 14:47:42 -0300 Subject: [PATCH 051/107] fix(DB/Creature): Root Ironhand Guardian (#13759) * Create rev_1668017149389906100.sql * Update rev_1668017149389906100.sql --- data/sql/updates/pending_db_world/rev_1668017149389906100.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1668017149389906100.sql diff --git a/data/sql/updates/pending_db_world/rev_1668017149389906100.sql b/data/sql/updates/pending_db_world/rev_1668017149389906100.sql new file mode 100644 index 000000000..b2b2a31ff --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1668017149389906100.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 8982); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(8982, 1, 0, 0, 1, 0, 0, 0); From 09c40a8cd31d9a828e869879c20c244ba9a7c3db Mon Sep 17 00:00:00 2001 From: Grimgravy Date: Sat, 13 May 2023 14:48:26 -0300 Subject: [PATCH 052/107] fix(Scripts/VioletHold): Activation Crystals (#13176) * fix(Scripts/Activation Crystals): Instance The Violet Hold * update * Update violet_hold.cpp --- .../rev_1664500389792248200.sql | 27 ++++++++++++++++ .../Northrend/VioletHold/violet_hold.cpp | 31 +++++++++++++++++++ .../Northrend/VioletHold/violet_hold.h | 21 ++++++++----- 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1664500389792248200.sql diff --git a/data/sql/updates/pending_db_world/rev_1664500389792248200.sql b/data/sql/updates/pending_db_world/rev_1664500389792248200.sql new file mode 100644 index 000000000..155250a7d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1664500389792248200.sql @@ -0,0 +1,27 @@ +-- +UPDATE `creature_template` SET `AIName`='', `ScriptName`='npc_violet_hold_defense_system' WHERE `entry`=30837; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 30837); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 and `SourceEntry` IN (57912, 57930, 58152); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,57912,0,0,31,0,3,29425,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,57930,0,0,31,0,3,30857,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,0,31,0,3,30661,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,1,31,0,3,30662,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,2,31,0,3,30663,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,3,31,0,3,30664,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,4,31,0,3,30665,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,5,31,0,3,30666,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,6,31,0,3,30667,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,7,31,0,3,30668,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,8,31,0,3,30918,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,9,31,0,3,30961,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,10,31,0,3,30962,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,11,31,0,3,30963,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,12,31,0,3,31007,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,13,31,0,3,31008,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,14,31,0,3,31009,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,15,31,0,3,31010,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,16,31,0,3,31118,0,0,0,0,'','Defense System - Arcane Lightning'), +(13,1,58152,0,17,31,0,3,32191,0,0,0,0,'','Defense System - Arcane Lightning'); diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 14c20d02f..72c88e7bc 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -1184,6 +1184,36 @@ public: } }; +struct npc_violet_hold_defense_system : public ScriptedAI +{ + npc_violet_hold_defense_system(Creature* creature) : ScriptedAI(creature) { } + + void Reset() override + { + DoCast(RAND(SPELL_DEFENSE_SYSTEM_SPAWN_EFFECT, SPELL_DEFENSE_SYSTEM_VISUAL)); + events.ScheduleEvent(EVENT_ARCANE_LIGHTNING, 4s); + events.ScheduleEvent(EVENT_ARCANE_LIGHTNING_INSTAKILL, 4s); + me->DespawnOrUnsummon(7s, 0s); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + switch (events.ExecuteEvent()) + { + case EVENT_ARCANE_LIGHTNING: + DoCastAOE(RAND(SPELL_ARCANE_LIGHTNING, SPELL_ARCANE_LIGHTNING_VISUAL)); + events.RepeatEvent(2000); + break; + case EVENT_ARCANE_LIGHTNING_INSTAKILL: + DoCastAOE(SPELL_ARCANE_LIGHTNING_INSTAKILL); + events.RepeatEvent(1000); + break; + } + } +}; + void AddSC_violet_hold() { new go_vh_activation_crystal(); @@ -1201,4 +1231,5 @@ void AddSC_violet_hold() new npc_azure_stalker(); new spell_destroy_door_seal(); + RegisterCreatureAI(npc_violet_hold_defense_system); } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 84d3baa14..65d0723d4 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -98,13 +98,16 @@ enum VHWorldStates enum Spells { - SPELL_CONTROL_CRYSTAL_ACTIVATION = 57804, - SPELL_ARCANE_LIGHTNING = 57912, - SPELL_ARCANE_LIGHTNING_VISUAL = 57930, - SPELL_PORTAL_CHANNEL = 58012, - SPELL_DESTROY_DOOR_SEAL = 58040, - SPELL_CYANIGOSA_TRANSFORM = 58668, - SPELL_CYANIGOSA_BLUE_AURA = 45870, + SPELL_CONTROL_CRYSTAL_ACTIVATION = 57804, + SPELL_DEFENSE_SYSTEM_SPAWN_EFFECT = 57886, + SPELL_DEFENSE_SYSTEM_VISUAL = 57887, + SPELL_ARCANE_LIGHTNING = 57912, + SPELL_ARCANE_LIGHTNING_VISUAL = 57930, + SPELL_ARCANE_LIGHTNING_INSTAKILL = 58152, + SPELL_PORTAL_CHANNEL = 58012, + SPELL_DESTROY_DOOR_SEAL = 58040, + SPELL_CYANIGOSA_TRANSFORM = 58668, + SPELL_CYANIGOSA_BLUE_AURA = 45870 }; enum Events @@ -117,6 +120,10 @@ enum Events EVENT_SUMMON_PORTAL, EVENT_CYANIGOSSA_TRANSFORM, EVENT_CYANIGOSA_ATTACK, + + // Event defense system + EVENT_ARCANE_LIGHTNING, + EVENT_ARCANE_LIGHTNING_INSTAKILL }; enum Data From 60adbf5b8273fa5a110fd3f06a3b659f63dcc805 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Sat, 13 May 2023 19:49:02 +0200 Subject: [PATCH 053/107] fix(DB/Creature): Several equipment fixes (#14929) * fix(DB/Creature): Several equipment fixes Co-Authored-By: Eridium <6587064+Killyana@users.noreply.github.com> * Update rev_1675983261651004100.sql Co-Authored-By: Eridium <6587064+Killyana@users.noreply.github.com> * Update rev_1675983261651004100.sql * Update rev_1675983261651004100.sql * cba --------- Co-authored-by: Eridium <6587064+Killyana@users.noreply.github.com> --- .../rev_1675983261651004100.sql | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1675983261651004100.sql diff --git a/data/sql/updates/pending_db_world/rev_1675983261651004100.sql b/data/sql/updates/pending_db_world/rev_1675983261651004100.sql new file mode 100644 index 000000000..701361487 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1675983261651004100.sql @@ -0,0 +1,166 @@ +-- + +DELETE FROM `creature_template_addon` WHERE `entry` IN (32838,34679,29945,29855,28857,27351,25196,37993, 37998, 1312, 4984, 5510, 5516, 12791, 13358, 13359, 14489, 25195,28049); +INSERT INTO `creature_template_addon` (`entry`, `bytes2`, `emote`) VALUES +(14489,2,0), +(13359,2,0), +(13358,2,0), +(12791,258,0), +(5516,2,0), +(5510,2,0), +(4984,2,0), +(1312,2,0), +(37993,2,0), +(37998,2,0), +(25195,2,0), +(25196,2,0), +(27351,2,214), +(28049,2,0), +(28857,2,0), +(29855,2,0), +(29945,2,0), +(32838,2,0), +(34679,2,0); + +UPDATE `creature_template_addon` SET `bytes2`=2 WHERE `entry` IN (18965,18970,31294,37144,37146,32710,32711); +UPDATE `creature` SET `equipment_id`=-1 WHERE `id1` IN (27553,27560,27557,31563,25242,25243,25275,19068,16582,16842,16580,18240,17138,25962,19048,19792,18489,20203,19610,19737,19995,19362,21742,21717,22016,22018); +UPDATE `creature` SET `equipment_id`=1 WHERE `id1` IN (27588,16842, 28596, 28569, 18301, 19147, 21114, 21254); +UPDATE `creature_equip_template` SET `ItemID1`=34681 WHERE `CreatureID` IN (27573) AND `ID`=1; +DELETE FROM `creature_equip_template` WHERE `CreatureID`IN (27588,27553,27560,27557,31563,25242,25243,25275,28596, 28569, 18301, 19147, 21114, 21254, 19068,16582,16842,16580,18240,17138,25962,19048,19792,18489,20203,19610,19737,19995,19362,21742,21717,25994,22016,22018); +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`) VALUES +(19068, 4, 14877, 14877, 5260), -- 19068 +(19068, 3, 18062, 0, 5260), -- 19068 +(19068, 2, 17383, 0, 5260), -- 19068 +(19068, 1, 10898, 12456, 5260), -- 19068 +(18489, 4, 14877, 14877, 5260), -- 18489 +(18489, 3, 18062, 0, 5260), -- 18489 +(18489, 2, 17383, 0, 5260), -- 18489 +(18489, 1, 10898, 12456, 5260), -- 18489 +(20203, 3, 1911, 0, 0), -- 20203 +(20203, 2, 2704, 0, 0), -- 20203 +(20203, 1, 1903, 0, 0), -- 20203 +(19610, 3, 1903, 0, 0), -- 19610 +(19610, 2, 4994, 0, 0), -- 19610 +(19610, 1, 1910, 0, 0), -- 19610 +(19737, 2, 4994, 0, 0), -- 19737 +(19737, 1, 1903, 0, 0), -- 19737 +(25994, 1, 1906, 2081, 0), -- 25994 +(25994, 2, 2200, 0, 0), -- 25994 +(19995, 3, 2703, 13407, 5870), -- 19995 +(19995, 2, 2703, 13406, 5870), -- 19995 +(19995, 1, 14874, 0, 5870), -- 19995 +(19362, 4, 30181, 21549, 2507), -- 19362 +(19362, 3, 30180, 30180, 2507), -- 19362 +(19362, 2, 30178, 0, 2507), -- 19362 +(19362, 1, 30179, 0, 2507), -- 1936 +(21742, 2, 5956, 24322, 0), -- 21742 +(21742, 1, 27405, 24322, 0), -- 21742 +(21717, 5, 5956, 0, 0), -- 21717 +(21717, 4, 31600, 31600, 0), -- 21717 +(21717, 3, 31601, 0, 0), -- 21717 +(21717, 2, 31603, 31603, 0), -- 21717 +(21717, 1, 31600, 31466, 0), -- 21717 +(22016, 4, 31206, 31466, 0), -- 22016 +(22016, 3, 31208, 0, 0), -- 22016 +(22016, 2, 31207, 0, 0), -- 22016 +(22016, 1, 31205, 31205, 0), -- 22016 +(22018, 4, 12403, 0, 0), -- 22018 +(22018, 3, 30636, 0, 0), -- 22018 +(22018, 2, 25758, 0, 0), -- 22018 +(22018, 1, 27405, 24328, 0), -- 22018 +(19792, 7, 30179, 21549, 0), -- 19792 +(19792, 6, 29417, 0, 0), -- 19792 +(19792, 5, 2028, 0, 0), -- 19792 +(19792, 4, 27405, 24328, 0), -- 19792 +(19792, 3, 25758, 0, 0), -- 19792 +(19792, 2, 30636, 0, 0), -- 19792 +(19792, 1, 23225, 0, 0), -- 19792 +(19048, 2, 1903, 0, 0), -- 19048 +(19048, 1, 1910, 0, 0), -- 19048 +(25962, 1, 2200, 0, 0), -- 25962 +(25962, 2, 1906, 2081, 0), -- 25962 +(17138, 5, 5289, 0, 0), -- 17138 +(17138, 4, 14475, 0, 0), -- 17138 +(17138, 3, 5287, 0, 0), -- 17138 +(17138, 2, 5288, 0, 0), -- 17138 +(17138, 1, 14643, 0, 0), -- 17138 +(18240, 6, 6233, 0, 0), -- 18240 +(18240, 5, 12868, 0, 0), -- 18240 +(18240, 4, 3362, 0, 0), -- 18240 +(18240, 3, 3351, 0, 0), -- 18240 +(18240, 2, 3346, 0, 0), -- 18240 +(18240, 1, 3367, 0, 0), -- 18240 +(16580, 1, 10898, 12456, 5260), -- 16580 +(16580, 2, 21465, 12452, 5260), -- 16580 +(16582, 2, 10898, 12456, 13924), -- 16582 +(16582, 1, 18062, 0, 13924), -- 16582 +(16842, 2, 1905, 2558, 0), -- 16842 +(16842, 1, 1901, 1901, 0), -- 16842 +(28596, 1, 5292, 0, 0), -- 28596 +(28569, 1, 5292, 0, 0), -- 28569 +(18301, 1, 3351, 0, 0), -- 18301 +(19147, 1, 2704, 0, 0), -- 19147 +(21114, 1, 1911, 0, 0), -- 21114 +(21254, 1, 3350, 0, 0), -- 21254 +(27588, 1, 21573, 21572, 21564), -- 27588 +(27553, 3, 34682, 12452, 0), -- 27553 +(27553, 2, 34681, 12452, 0), -- 27553 +(27553, 1, 30181, 12452, 0), -- 27553 +(27560, 4, 36790, 0, 0), -- 27560 +(27560, 3, 36791, 0, 0), -- 27560 +(27560, 2, 36792, 0, 0), -- 27560 +(27560, 1, 28914, 0, 0), -- 27560 +(27557, 2, 34682, 0, 0), -- 27557 +(27557, 1, 34681, 0, 0), -- 27557 +(31563, 3, 34637, 34637, 5260), -- 31563 +(31563, 2, 34639, 0, 5260), -- 31563 +(31563, 1, 34640, 21549, 5260), -- 31563 +(25242, 4, 34637, 34637, 42921), -- 25242 +(25242, 3, 34639, 0, 42921), -- 25242 +(25242, 2, 34640, 21549, 42921), -- 25242 +(25242, 1, 8178, 0, 42921), -- 25242 +(25243, 2, 34681, 0, 5260), -- 25243 +(25243, 1, 34682, 34682, 5260), -- 25243 +(25275, 2, 1903, 13611, 0), -- 25275 +(25275, 1, 35312, 9701, 0); -- 25275 + +DELETE FROM `creature_equip_template` WHERE `CreatureID`=38493; +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`) VALUES +(38493, 1, 40595, 49933, 0), -- 38493 +(38493, 2, 46107, 49933, 0); -- 38493 +UPDATE `creature` SET `equipment_id`=2 WHERE `guid` IN (246904,246905,246915); + +UPDATE `creature` SET `equipment_id`=-1 WHERE `id1` IN (1976, 14901, 23745, 24015, 24062, 24212, 28579, 32710, 32711, 34838); +DELETE FROM `creature_equip_template` WHERE `CreatureID` IN (1976, 14901, 23745, 24015, 24062, 24212, 28579, 32710, 32711, 34838); +INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `ItemID2`, `ItemID3`) VALUES +(1976, 1, 1899, 143, 0), +(1976, 2, 2715, 143, 0), +(14901, 1, 12629, 0, 0), +(14901, 2, 1910, 13605, 0), +(23745, 1, 6228, 0, 0), +(23745, 2, 2023, 0, 0), +(24015, 1, 34818, 0, 0), +(24015, 2, 34817, 0, 0), +(24015, 3, 34819, 0, 0), +(24015, 4, 34819, 33212, 0), +(24015, 5, 34820, 0, 0), +(24015, 6, 34816, 0, 0), +(24015, 7, 34821, 0, 0), +(24062, 1, 1910, 0, 0), +(24062, 2, 2704, 0, 0), +(24212, 1, 1983, 0, 0), +(24212, 2, 1910, 0, 0), +(28579, 1, 39359, 0, 0), +(28579, 2, 33594, 33594, 0), +(32710, 1, 0, 0, 44635), +(32710, 2, 0, 0, 44643), +(32711, 1, 0, 0, 44643), +(32711, 2, 0, 0, 44635), +(34838, 1, 34817, 0, 0), +(34838, 2, 40894, 13407, 0), +(34838, 3, 34816, 34819, 0), +(34838, 4, 34821, 34816, 0), +(34838, 5, 34819, 33212, 0), +(34838, 6, 34818, 0, 0); + +UPDATE `creature` SET `equipment_id` = 0 WHERE `id1` IN (6500,5405,6513,9600,4075,3819); From dfa5da00b1253a944884d86796577dddcc799255 Mon Sep 17 00:00:00 2001 From: NinjaPleezAC <121171014+NinjaPleezAC@users.noreply.github.com> Date: Sat, 13 May 2023 10:50:07 -0700 Subject: [PATCH 054/107] fix(Core/Player): Apply equip effect auras with -1 duration (#14809) Enforces a -1 duration value to auras applied from equip effects. Current reliance on the DurationEntry of the auras causes at least one aura to incorrectly expire. Closes AzerothCore issue #5649 Closes https://github.com/chromiecraft/chromiecraft/issues/531 --- src/server/game/Entities/Player/Player.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a8925a7b6..9a258bd7b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7075,7 +7075,8 @@ void Player::ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply, LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id); - CastSpell(this, spellInfo, true, item); + //Ignore spellInfo->DurationEntry, cast with -1 duration + CastCustomSpell(spellInfo->Id, SPELLVALUE_AURA_DURATION, -1, this, true, item); } else { From 8e28b64ccfcee8dd9fa0a8834a96f67d23d34982 Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 13 May 2023 19:50:46 +0200 Subject: [PATCH 055/107] fix(Scripts/HellfireRamparts): modernise boss scripts for Hellfire Ramparts (#16250) * first two bosses * add vazruden+nazan * dumb mistake fix * remove double summon say from Omor * new attempt at scheduling talking * fix boolean condition for speaking * debug * revert debug * initial * diff comment --- .../boss_omor_the_unscarred.cpp | 95 ++++++------- .../boss_vazruden_the_herald.cpp | 131 +++++++++--------- .../boss_watchkeeper_gargolmar.cpp | 105 +++++++------- 3 files changed, 161 insertions(+), 170 deletions(-) diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp index 84a017623..01f612a44 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp @@ -34,16 +34,7 @@ enum Spells SPELL_SHADOW_BOLT = 30686, SPELL_SUMMON_FIENDISH_HOUND = 30707, SPELL_TREACHEROUS_AURA = 30695, - SPELL_DEMONIC_SHIELD = 31901, -}; - -enum Misc -{ - EVENT_SUMMON1 = 1, - EVENT_SUMMON2 = 2, - EVENT_TREACHEROUS_AURA = 3, - EVENT_DEMONIC_SHIELD = 4, - EVENT_KILL_TALK = 5 + SPELL_DEMONIC_SHIELD = 31901 }; class boss_omor_the_unscarred : public CreatureScript @@ -56,33 +47,63 @@ public: boss_omor_the_unscarredAI(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED) { SetCombatMovement(false); + + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } void Reset() override { Talk(SAY_WIPE); - BossAI::Reset(); + _Reset(); _targetGUID.Clear(); + + ScheduleHealthCheckEvent(21, [&]{ + DoCastSelf(SPELL_DEMONIC_SHIELD); + scheduler.Schedule(15s, [this](TaskContext context) + { + DoCastSelf(SPELL_DEMONIC_SHIELD); + context.Repeat(15s); + }); + }); } - void JustEngagedWith(Unit* who) override + void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); + _JustEngagedWith(); - events.ScheduleEvent(EVENT_SUMMON1, 10000); - events.ScheduleEvent(EVENT_SUMMON2, 25000); - events.ScheduleEvent(EVENT_TREACHEROUS_AURA, 6000); - events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000); + scheduler.Schedule(6s, [this](TaskContext context) + { + if (roll_chance_i(33)) + { + Talk(SAY_CURSE); + } + DoCastRandomTarget(SPELL_TREACHEROUS_AURA); + context.Repeat(12s, 18s); + }).Schedule(10s, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_SUMMON_FIENDISH_HOUND); + }).Schedule(25s, [this](TaskContext context) + { + DoCastSelf(SPELL_SUMMON_FIENDISH_HOUND); + context.Repeat(15s); + }); } void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if(!_hasSpoken) { + _hasSpoken = true; Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + scheduler.Schedule(6s, [this](TaskContext /*context*/) + { + _hasSpoken = false; + }); } void JustSummoned(Creature* summon) override @@ -92,49 +113,20 @@ public: summon->SetInCombatWithZone(); } - void JustDied(Unit* killer) override + void JustDied(Unit* /*killer*/) override { Talk(SAY_DIE); - BossAI::JustDied(killer); + _JustDied(); } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 /*diff*/) override { if (!UpdateVictim()) return; - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_SUMMON1: - Talk(SAY_SUMMON); - me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false); - break; - case EVENT_SUMMON2: - me->CastSpell(me, SPELL_SUMMON_FIENDISH_HOUND, false); - events.ScheduleEvent(EVENT_SUMMON2, 15000); - break; - case EVENT_TREACHEROUS_AURA: - if (roll_chance_i(33)) - Talk(SAY_CURSE); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_TREACHEROUS_AURA, false); - events.ScheduleEvent(EVENT_TREACHEROUS_AURA, urand(12000, 18000)); - break; - case EVENT_DEMONIC_SHIELD: - if (me->HealthBelowPct(21)) - { - me->CastSpell(me, SPELL_DEMONIC_SHIELD, false); - events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 15000); - } - else - events.ScheduleEvent(EVENT_DEMONIC_SHIELD, 1000); - break; - } - if (!me->GetVictim() || !me->isAttackReady()) return; @@ -153,6 +145,7 @@ public: private: ObjectGuid _targetGUID; + bool _hasSpoken; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index 4ae4b5a96..f11b60189 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -43,18 +43,14 @@ enum Spells enum Misc { ACTION_FLY_DOWN = 0, - POINT_MIDDLE = 0, - POINT_FLIGHT = 1, + POINT_FLIGHT = 1 +}; - EVENT_SPELL_REVENGE = 1, - EVENT_KILL_TALK = 2, - EVENT_AGGRO_TALK = 3, - EVENT_SPELL_FIREBALL = 4, - EVENT_SPELL_CONE_OF_FIRE = 5, - EVENT_SPELL_BELLOWING_ROAR = 6, - EVENT_CHANGE_POS = 7, - EVENT_RESTORE_COMBAT = 8 +enum GroupPhase +{ + GROUP_PHASE_1 = 0, + GROUP_PHASE_2 = 1 }; const Position NazanPos[3] = @@ -158,10 +154,14 @@ class boss_nazan : public CreatureScript public: boss_nazan() : CreatureScript("boss_nazan") { } - struct boss_nazanAI : public ScriptedAI + struct boss_nazanAI : public BossAI { - boss_nazanAI(Creature* creature) : ScriptedAI(creature) + boss_nazanAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } void Reset() override @@ -178,8 +178,17 @@ public: void JustEngagedWith(Unit*) override { - events.ScheduleEvent(EVENT_CHANGE_POS, 0); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 5000); + scheduler.CancelGroup(GROUP_PHASE_2); + scheduler.Schedule(5ms, GROUP_PHASE_1, [this](TaskContext context) + { + me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false); + scheduler.DelayAll(7s); + context.Repeat(30s); + }).Schedule(5s, GROUP_PHASE_1, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_FIREBALL); + context.Repeat(4s, 6s); + }); } void AttackStart(Unit* who) override @@ -209,48 +218,37 @@ public: me->SetCanFly(false); me->SetDisableGravity(false); me->SetReactState(REACT_AGGRESSIVE); - events.ScheduleEvent(EVENT_RESTORE_COMBAT, 1); - events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 5000); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 6000); + scheduler.CancelGroup(GROUP_PHASE_1); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + + scheduler.Schedule(5s, GROUP_PHASE_2, [this](TaskContext context) + { + DoCastVictim(SPELL_CONE_OF_FIRE); + context.Repeat(12s); + }).Schedule(6s, GROUP_PHASE_2, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_FIREBALL); + context.Repeat(4s, 6s); + }); if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 10000); + { + scheduler.Schedule(10s, GROUP_PHASE_2, [this](TaskContext context) + { + DoCastSelf(SPELL_BELLOWING_ROAR); + context.Repeat(30s); + }); + } } } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 /*diff*/) override { if (!UpdateVictim()) return; - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_FIREBALL: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_FIREBALL, false); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(4000, 6000)); - break; - case EVENT_CHANGE_POS: - me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false); - events.DelayEvents(7000); - events.ScheduleEvent(EVENT_CHANGE_POS, 30000); - break; - case EVENT_RESTORE_COMBAT: - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - case EVENT_SPELL_CONE_OF_FIRE: - me->CastSpell(me->GetVictim(), SPELL_CONE_OF_FIRE, false); - events.ScheduleEvent(EVENT_SPELL_CONE_OF_FIRE, 12000); - break; - case EVENT_SPELL_BELLOWING_ROAR: - me->CastSpell(me, SPELL_BELLOWING_ROAR, false); - events.ScheduleEvent(EVENT_SPELL_BELLOWING_ROAR, 30000); - break; - } - if (!me->IsLevitating()) DoMeleeAttackIfReady(); } @@ -270,9 +268,15 @@ class boss_vazruden : public CreatureScript public: boss_vazruden() : CreatureScript("boss_vazruden") { } - struct boss_vazrudenAI : public ScriptedAI + struct boss_vazrudenAI : public BossAI { - boss_vazrudenAI(Creature* creature) : ScriptedAI(creature) { } + boss_vazrudenAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } void Reset() override { @@ -288,17 +292,27 @@ public: void JustEngagedWith(Unit*) override { - events.ScheduleEvent(EVENT_AGGRO_TALK, 5000); - events.ScheduleEvent(EVENT_SPELL_REVENGE, 4000); + scheduler.Schedule(5s, [this](TaskContext /*context*/) + { + Talk(SAY_AGGRO); + }).Schedule(4s, [this](TaskContext context) + { + DoCastVictim(DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H)); + context.Repeat(6s); + }); } void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!_hasSpoken) { + _hasSpoken = true; Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + scheduler.Schedule(6s, [this](TaskContext /*context*/) + { + _hasSpoken = false; + }); } void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override @@ -315,28 +329,17 @@ public: Talk(SAY_DIE); } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 /*diff*/) override { if (!UpdateVictim()) return; - events.Update(diff); - switch (events.ExecuteEvent()) - { - case EVENT_AGGRO_TALK: - Talk(SAY_AGGRO); - break; - case EVENT_SPELL_REVENGE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H), false); - events.ScheduleEvent(EVENT_SPELL_REVENGE, 6000); - break; - } - DoMeleeAttackIfReady(); } private: EventMap events; + bool _hasSpoken; bool _nazanCalled; }; diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp index 42e1c1519..bb3a374d3 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp @@ -38,13 +38,7 @@ enum Spells enum Misc { - NPC_HELLFIRE_WATCHER = 17309, - - EVENT_MORTAL_WOUND = 1, - EVENT_SURGE = 2, - EVENT_RETALIATION = 3, - EVENT_KILL_TALK = 4, - EVENT_CHECK_HEALTH = 5 + NPC_HELLFIRE_WATCHER = 17309 }; class boss_watchkeeper_gargolmar : public CreatureScript @@ -57,21 +51,53 @@ public: boss_watchkeeper_gargolmarAI(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR) { _taunted = false; + + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } void Reset() override { - BossAI::Reset(); + _Reset(); + + ScheduleHealthCheckEvent(50, [&]{ + Talk(SAY_HEAL); + std::list clist; + me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER); + for (std::list::const_iterator itr = clist.begin(); itr != clist.end(); ++itr) + (*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0); + }); + + ScheduleHealthCheckEvent(20, [&]{ + DoCastSelf(SPELL_RETALIATION); + scheduler.Schedule(30s, [this](TaskContext context) + { + DoCastSelf(SPELL_RETALIATION); + context.Repeat(30s); + }); + }); } - void JustEngagedWith(Unit* who) override + void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 5000); - events.ScheduleEvent(EVENT_SURGE, 3000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - events.ScheduleEvent(EVENT_RETALIATION, 1000); + _JustEngagedWith(); + + scheduler.Schedule(5s, [this] (TaskContext context) + { + DoCastVictim(SPELL_MORTAL_WOUND); + context.Repeat(8s); + }).Schedule(3s, [this](TaskContext context) + { + Talk(SAY_SURGE); + if(Unit* target = SelectTarget((SelectTargetMethod::MinDistance), 0)) + { + me->CastSpell(target, SPELL_SURGE); + } + context.Repeat(11s); + }); } void MoveInLineOfSight(Unit* who) override @@ -90,68 +116,37 @@ public: void KilledUnit(Unit*) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (!_hasSpoken) { + _hasSpoken = true; Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); } + scheduler.Schedule(6s, [this](TaskContext /*context*/) + { + _hasSpoken = false; + }); } - void JustDied(Unit* killer) override + void JustDied(Unit* /*killer*/) override { Talk(SAY_DIE); - BossAI::JustDied(killer); + _JustDied(); } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 /*diff*/) override { if (!UpdateVictim()) return; - events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_MORTAL_WOUND: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false); - events.ScheduleEvent(EVENT_MORTAL_WOUND, 8000); - break; - case EVENT_SURGE: - Talk(SAY_SURGE); - if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0)) - me->CastSpell(target, SPELL_SURGE, false); - events.ScheduleEvent(EVENT_SURGE, 11000); - break; - case EVENT_RETALIATION: - if (me->HealthBelowPct(20)) - { - me->CastSpell(me, SPELL_RETALIATION, false); - events.ScheduleEvent(EVENT_RETALIATION, 30000); - } - else - events.ScheduleEvent(EVENT_RETALIATION, 500); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(50)) - { - Talk(SAY_HEAL); - std::list clist; - me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER); - for (std::list::const_iterator itr = clist.begin(); itr != clist.end(); ++itr) - (*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); - break; - } - DoMeleeAttackIfReady(); } private: bool _taunted; + bool _hasSpoken; }; CreatureAI* GetAI(Creature* creature) const override From eca5f79d6fe7e3660cd950e1c74a7fed92c833e8 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Sat, 13 May 2023 11:51:33 -0600 Subject: [PATCH 056/107] fix(Scripts/Mechanar): Avoid Nether Charge despawn (#16190) init --- .../TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp index 87956f1f3..5638bcbb3 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp @@ -46,11 +46,6 @@ enum Yells SAY_DEATH = 4 }; -enum Creatures -{ - NPC_NETHER_CHARGE = 20405 -}; - struct boss_mechano_lord_capacitus : public BossAI { boss_mechano_lord_capacitus(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) @@ -127,7 +122,6 @@ struct boss_mechano_lord_capacitus : public BossAI void JustSummoned(Creature* summon) override { - summons.Summon(summon); summon->GetMotionMaster()->MoveRandom(30.0f); } }; From ea3e6e8f3b7710baeeb7e08a0ddd8053a449e008 Mon Sep 17 00:00:00 2001 From: Johaine <32821455+Johaine@users.noreply.github.com> Date: Sat, 13 May 2023 17:52:44 +0000 Subject: [PATCH 057/107] fix(Scripts/Deadmines): Fix Factory Door in Deadmines being closable (#15201) * fix(DB/SAI): Open Factory Door correctly (irreversibly) Activate the Factory Door after the boss' death to open it instead of changing gameobject state only which can be reversed by another activation. * fix(Script/Instance): Prevent Door being closed again after Server Restart * Drop database name from update SQL Other people might not use the standard database names Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --------- Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql | 1 + .../scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql diff --git a/data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql b/data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql new file mode 100644 index 000000000..5cc50ac84 --- /dev/null +++ b/data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `action_type`=9, `comment`='Rhahk\'Zor - On Just Died - Activate Gameobject' WHERE `entryorguid`=644 AND `source_type`=0 AND `id`=2 AND `link`=3; diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 0d92d33a6..27371a4b5 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -50,8 +50,9 @@ public: break; case GO_FACTORY_DOOR: gameobject->UpdateSaveToDb(true); + // GoState (Door opened) is restored during GO creation, but we need to set LootState to prevent Lever from closing it again if (_encounters[TYPE_RHAHK_ZOR] == DONE) - gameobject->SetGoState(GO_STATE_ACTIVE); + gameobject->SetLootState(GO_ACTIVATED); break; case GO_IRON_CLAD_DOOR: gameobject->UpdateSaveToDb(true); From 0e309173e4bb85fb79375a4bd438636755556659 Mon Sep 17 00:00:00 2001 From: "Julio A. Leyva Osorio" Date: Sat, 13 May 2023 13:54:29 -0400 Subject: [PATCH 058/107] fix(DB/Warden): New checks (Detects PQR) (#16163) * add(DB/Warden): New checks (Detects PQR) * Update warden_pqr.sql * Update ID.sql --- data/sql/updates/pending_db_world/warden_pqr.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/warden_pqr.sql diff --git a/data/sql/updates/pending_db_world/warden_pqr.sql b/data/sql/updates/pending_db_world/warden_pqr.sql new file mode 100644 index 000000000..a187764b1 --- /dev/null +++ b/data/sql/updates/pending_db_world/warden_pqr.sql @@ -0,0 +1,4 @@ +DELETE FROM `warden_checks` WHERE `id` IN (795,796); +INSERT INTO `warden_checks` (`id`, `type`, `data`, `str`, `address`, `length`, `result`, `comment`) VALUES +(795, 139, NULL, 'local f=DEFAULT_CHAT_FRAME for i=1,f:GetNumMessages() do if (f:GetMessageInfo(i)):find("Rotation Mode Disable") then return true end end', NULL, NULL, NULL, 'Detects PQR'), +(796, 139, NULL, 'local f=DEFAULT_CHAT_FRAME for i=1,f:GetNumMessages() do if (f:GetMessageInfo(i)):find("Rotation Mode Enable") then return true end end', NULL, NULL, NULL, 'Detects PQR'); From 692da9055ad257214f73b245d92a2b9440b9b2de Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 13 May 2023 19:56:14 +0200 Subject: [PATCH 059/107] fix(DB/Nagrand): add missing ability to Ravenous Windroc (#16195) * initial * comment fix * dumb error fixed * Update data/sql/updates/pending_db_world/ravenous_windroc.sql Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> * Update data/sql/updates/pending_db_world/ravenous_windroc.sql Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --------- Co-authored-by: Gultask <100873791+Gultask@users.noreply.github.com> --- data/sql/updates/pending_db_world/ravenous_windroc.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data/sql/updates/pending_db_world/ravenous_windroc.sql diff --git a/data/sql/updates/pending_db_world/ravenous_windroc.sql b/data/sql/updates/pending_db_world/ravenous_windroc.sql new file mode 100644 index 000000000..9932f7183 --- /dev/null +++ b/data/sql/updates/pending_db_world/ravenous_windroc.sql @@ -0,0 +1,7 @@ +-- +UPDATE `smart_scripts` SET `comment` = 'Windroc - In Combat - Cast \'Eagle Claw\'' WHERE `entryorguid` = 17128 AND `source_type` = 0 AND `id` = 0; +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `Entry` = 18220; + +DELETE FROM `smart_scripts` WHERE `entryorguid` = 18220 AND `source_type` = 0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18220, 0, 0, 0, 0, 0, 100, 0, 1000, 5000, 10000, 20000, 0, 11, 30285, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Ravenous Windroc - In Combat - Cast \'Eagle Claw\''); From 5c5c28c715eef7ca480b2e24f6c676444bef06c2 Mon Sep 17 00:00:00 2001 From: Benjamin Jackson <38561765+heyitsbench@users.noreply.github.com> Date: Sat, 13 May 2023 13:57:36 -0400 Subject: [PATCH 060/107] fix(DB/GameObject): Remove dynamically spawned necropoli gameobjects. (#16251) Remove offending necropoli. --- .../sql/updates/pending_db_world/correct-scourge-necropoli.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 data/sql/updates/pending_db_world/correct-scourge-necropoli.sql diff --git a/data/sql/updates/pending_db_world/correct-scourge-necropoli.sql b/data/sql/updates/pending_db_world/correct-scourge-necropoli.sql new file mode 100644 index 000000000..b03dff702 --- /dev/null +++ b/data/sql/updates/pending_db_world/correct-scourge-necropoli.sql @@ -0,0 +1,3 @@ +DELETE FROM `gameobject` WHERE `guid` IN (105000, 105001, 105002, 105003, 105004, 105005, 105014, 105015, 105016, 105017, 105018, 105019, 105020, 105021); + +DELETE FROM `game_event_gameobject` WHERE `guid` IN (105000, 105001, 105002, 105003, 105004, 105005, 105014, 105015, 105016, 105017, 105018, 105019, 105020, 105021); From ab7c12fe41dce8cffdc51f5f621df6007e7d100a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= Date: Sun, 14 May 2023 02:00:29 +0800 Subject: [PATCH 061/107] chore(core): Cleanup code p2 (#16041) * Update AchievementMgr.cpp * Update M2Stores.cpp * Update LFGHandler.cpp * Update PetHandler.cpp * Update WaypointMovementGenerator.cpp * Update ScriptMgr.cpp * Update SpellAuras.cpp * Update Spell.cpp * Update SecretMgr.cpp * Update SpellScript.cpp * Update SecretMgr.cpp * Update Spell.cpp * Update SpellAuras.cpp * Add files via upload * Update PetHandler.cpp * Update PetHandler.cpp * Update CalendarMgr.cpp * Update LFG.h * Update WaypointMovementGenerator.cpp * Update MapScripts.cpp * Update Unit.cpp * Update SmartScript.cpp --- src/server/game/AI/SmartScripts/SmartScript.cpp | 8 ++++---- src/server/game/Achievements/AchievementMgr.cpp | 2 +- src/server/game/Calendar/CalendarMgr.cpp | 2 +- src/server/game/DataStores/M2Stores.cpp | 8 ++++---- src/server/game/DungeonFinding/LFG.h | 2 +- src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Handlers/LFGHandler.cpp | 2 +- src/server/game/Handlers/PetHandler.cpp | 6 +++--- .../WaypointMovementGenerator.cpp | 6 +++--- src/server/game/Scripting/MapScripts.cpp | 14 +++++++------- src/server/game/Scripting/ScriptMgr.cpp | 2 +- 11 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index ffe8a03fd..60f3660db 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -640,12 +640,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlags); LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_CAST: Unit {} casts spell {} on target {} with castflags {}", - me->GetGUID().ToString().c_str(), e.action.cast.spell, target->GetGUID().ToString().c_str(), e.action.cast.castFlags); + me->GetGUID().ToString(), e.action.cast.spell, target->GetGUID().ToString(), e.action.cast.castFlags); } else { LOG_DEBUG("scripts.ai", "Spell {} not cast because it has flag SMARTCAST_AURA_NOT_PRESENT and the target {} already has the aura", - e.action.cast.spell, target->GetGUID().ToString().c_str()); + e.action.cast.spell, target->GetGUID().ToString()); } } break; @@ -729,12 +729,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u tempLastInvoker->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlags); LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_INVOKER_CAST: Invoker {} casts spell {} on target {} with castflags {}", - tempLastInvoker->GetGUID().ToString().c_str(), e.action.cast.spell, target->GetGUID().ToString().c_str(), e.action.cast.castFlags); + tempLastInvoker->GetGUID().ToString(), e.action.cast.spell, target->GetGUID().ToString(), e.action.cast.castFlags); } else { LOG_DEBUG("scripts.ai", "Spell {} not cast because it has flag SMARTCAST_AURA_NOT_PRESENT and the target {} already has the aura", - e.action.cast.spell, target->GetGUID().ToString().c_str()); + e.action.cast.spell, target->GetGUID().ToString()); } } break; diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 4b2e18d08..111f6a091 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2683,7 +2683,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has ScriptName set for non-scripted data type (Entry: {}, type {}), useless data.", criteria_id, dataType); else - scriptId = sObjectMgr->GetScriptId(scriptName.c_str()); + scriptId = sObjectMgr->GetScriptId(scriptName); } AchievementCriteriaData data(dataType, fields[2].Get(), fields[3].Get(), scriptId); diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index b59515570..6f2c14b46 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -459,7 +459,7 @@ uint32 CalendarMgr::GetPlayerNumPending(ObjectGuid guid) std::string CalendarEvent::BuildCalendarMailSubject(ObjectGuid remover) const { std::ostringstream strm; - strm << remover.ToString().c_str() << ':' << _title; + strm << remover.ToString() << ':' << _title; return strm.str(); } diff --git a/src/server/game/DataStores/M2Stores.cpp b/src/server/game/DataStores/M2Stores.cpp index da56f1ff3..16a7c9fa5 100644 --- a/src/server/game/DataStores/M2Stores.cpp +++ b/src/server/game/DataStores/M2Stores.cpp @@ -206,7 +206,7 @@ void LoadM2Cameras(std::string const& dataPath) // Reject if not at least the size of the header if (static_cast(fileSize) < sizeof(M2Header)) { - LOG_ERROR("server.loading", "Camera file {} is damaged. File is smaller than header size", filename.string().c_str()); + LOG_ERROR("server.loading", "Camera file {} is damaged. File is smaller than header size", filename.string()); m2file.close(); continue; } @@ -220,7 +220,7 @@ void LoadM2Cameras(std::string const& dataPath) // Check file has correct magic (MD20) if (strcmp(fileCheck, "MD20")) { - LOG_ERROR("server.loading", "Camera file {} is damaged. File identifier not found", filename.string().c_str()); + LOG_ERROR("server.loading", "Camera file {} is damaged. File identifier not found", filename.string()); m2file.close(); continue; } @@ -240,14 +240,14 @@ void LoadM2Cameras(std::string const& dataPath) if (header->ofsCameras + sizeof(M2Camera) > static_cast(fileSize)) { - LOG_ERROR("server.loading", "Camera file {} is damaged. Camera references position beyond file end", filename.string().c_str()); + LOG_ERROR("server.loading", "Camera file {} is damaged. Camera references position beyond file end", filename.string()); continue; } // Get camera(s) - Main header, then dump them. M2Camera const* cam = reinterpret_cast(buffer.data() + header->ofsCameras); if (!readCamera(cam, fileSize, header, dbcentry)) - LOG_ERROR("server.loading", "Camera file {} is damaged. Camera references position beyond file end", filename.string().c_str()); + LOG_ERROR("server.loading", "Camera file {} is damaged. Camera references position beyond file end", filename.string()); } LOG_INFO("server.loading", ">> Loaded {} Cinematic Waypoint Sets in {} ms", (uint32)sFlyByCameraStore.size(), GetMSTimeDiffToNow(oldMSTime)); diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 3e542ccc1..810ca2f30 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -484,7 +484,7 @@ namespace lfg [[nodiscard]] std::string toString() const // for debugging { std::ostringstream o; - o << guids[0].ToString().c_str() << "," << guids[1].ToString().c_str() << "," << guids[2].ToString().c_str() << "," << guids[3].ToString().c_str() << "," << guids[4].ToString().c_str() << ":" << (roles ? 1 : 0); + o << guids[0].ToString() << "," << guids[1].ToString() << "," << guids[2].ToString() << "," << guids[3].ToString() << "," << guids[4].ToString() << ":" << (roles ? 1 : 0); return o.str(); } }; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f1620fb81..e835febb3 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10369,7 +10369,7 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) creature->SendAIReaction(AI_REACTION_HOSTILE); /// @todo: Implement aggro range, detection range and assistance range templates - if (!(creature->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE)) + if (!(creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE)) { creature->CallAssistance(); } diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 6b4c74b76..8ebc0fd44 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -55,7 +55,7 @@ void WorldSession::HandleLfgJoinOpcode(WorldPackets::LFG::LFGJoin& packet) if (packet.Slots.empty()) { - LOG_DEBUG("lfg", "CMSG_LFG_JOIN {} no dungeons selected", GetPlayerInfo().c_str()); + LOG_DEBUG("lfg", "CMSG_LFG_JOIN {} no dungeons selected", GetPlayerInfo()); return; } diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 765c90f8c..f4b421369 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -953,21 +953,21 @@ void WorldSession::HandlePetSpellAutocastOpcode(WorldPackets::Pet::PetSpellAutoc Creature* checkPet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.PetGUID); if (!checkPet) { - LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcode: Pet {} not found.", packet.PetGUID.ToString().c_str()); + LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcode: Pet {} not found.", packet.PetGUID.ToString()); return; } SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(packet.SpellID); if (!spellInfo) { - LOG_ERROR("spells.pet", "WorldSession::HandlePetSpellAutocastOpcode: Unknown spell id {} used by {}.", packet.SpellID, packet.PetGUID.ToString().c_str()); + LOG_ERROR("spells.pet", "WorldSession::HandlePetSpellAutocastOpcode: Unknown spell id {} used by {}.", packet.SpellID, packet.PetGUID.ToString()); return; } if (checkPet != _player->GetGuardianPet() && checkPet != _player->GetCharm()) { LOG_ERROR("entities.pet", "WorldSession::HandlePetSpellAutocastOpcode: {} isn't pet of player {} ({}).", - packet.PetGUID.ToString().c_str(), GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str()); + packet.PetGUID.ToString(), GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString()); return; } diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index 0780866e8..f1da9bbb5 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -375,7 +375,7 @@ void FlightPathMovementGenerator::DoReset(Player* player) if (currentNodeId == end) { - LOG_DEBUG("movement.flightpath", "FlightPathMovementGenerator::DoReset: trying to start a flypath from the end point. {}", player->GetGUID().ToString().c_str()); + LOG_DEBUG("movement.flightpath", "FlightPathMovementGenerator::DoReset: trying to start a flypath from the end point. {}", player->GetGUID().ToString()); return; } @@ -406,7 +406,7 @@ bool FlightPathMovementGenerator::DoUpdate(Player* player, uint32 /*diff*/) bool departureEvent = true; do { - ASSERT(i_currentNode < i_path.size(), "Point Id: {}\n{}", pointId, player->GetGUID().ToString().c_str()); + ASSERT(i_currentNode < i_path.size(), "Point Id: {}\n{}", pointId, player->GetGUID().ToString()); DoEventIfAny(player, i_path[i_currentNode], departureEvent); while (!_pointsForPathSwitch.empty() && _pointsForPathSwitch.front().PathIndex <= i_currentNode) @@ -460,7 +460,7 @@ void FlightPathMovementGenerator::DoEventIfAny(Player* player, TaxiPathNodeEntry { if (uint32 eventid = departure ? node->departureEventID : node->arrivalEventID) { - LOG_DEBUG("maps.script", "Taxi {} event {} of node {} of path {} for player {}", departure ? "departure" : "arrival", eventid, node->index, node->path, player->GetName().c_str()); + LOG_DEBUG("maps.script", "Taxi {} event {} of node {} of path {} for player {}", departure ? "departure" : "arrival", eventid, node->index, node->path, player->GetName()); player->GetMap()->ScriptsStart(sEventScripts, eventid, player, player); } } diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index 1874dabef..40f86ae1a 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -113,9 +113,9 @@ inline Player* Map::_GetScriptPlayerSourceOrTarget(Object* source, Object* targe if (!player) LOG_ERROR("maps.script", "{} neither source nor target object is player (source: TypeId: {}, Entry: {}, GUID: {}; target: TypeId: {}, Entry: {}, GUID: {}), skipping.", - scriptInfo->GetDebugInfo().c_str(), - source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, source ? source->GetGUID().ToString().c_str() : "", - target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, target ? target->GetGUID().ToString().c_str() : ""); + scriptInfo->GetDebugInfo(), + source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, source ? source->GetGUID().ToString() : "", + target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, target ? target->GetGUID().ToString() : ""); } return player; } @@ -146,9 +146,9 @@ inline Creature* Map::_GetScriptCreatureSourceOrTarget(Object* source, Object* t if (!creature) LOG_ERROR("maps.script", "{} neither source nor target are creatures (source: TypeId: {}, Entry: {}, GUID: {}; target: TypeId: {}, Entry: {}, GUID: {}), skipping.", - scriptInfo->GetDebugInfo().c_str(), - source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, source ? source->GetGUID().ToString().c_str() : "", - target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, target ? target->GetGUID().ToString().c_str() : ""); + scriptInfo->GetDebugInfo(), + source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, source ? source->GetGUID().ToString() : "", + target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, target ? target->GetGUID().ToString() : ""); } return creature; } @@ -533,7 +533,7 @@ void Map::ScriptsProcess() else { LOG_ERROR("maps.script", "{} neither source nor target is player (source: {}; target: {}), skipping.", - step.script->GetDebugInfo().c_str(), source->GetGUID().ToString().c_str(), target->GetGUID().ToString().c_str()); + step.script->GetDebugInfo(), source->GetGUID().ToString(), target->GetGUID().ToString()); break; } } diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 244364cc3..2ddad5cf1 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -159,7 +159,7 @@ void ScriptMgr::CheckIfScriptsInDatabaseExist() { for (auto const& scriptName : sObjectMgr->GetScriptNames()) { - if (uint32 sid = sObjectMgr->GetScriptId(scriptName.c_str())) + if (uint32 sid = sObjectMgr->GetScriptId(scriptName)) { if (!ScriptRegistry::GetScriptById(sid) && !ScriptRegistry::GetScriptById(sid) && From ca1c6328e52dd9e6024e955a023902c198d334ee Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 13 May 2023 20:03:22 +0200 Subject: [PATCH 062/107] fix(DB/Loot): fix gold drops of ethereal mobs in Bash'ir Landing (#16118) initial --- data/sql/updates/pending_db_world/bashir_new_gold_rates.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 data/sql/updates/pending_db_world/bashir_new_gold_rates.sql diff --git a/data/sql/updates/pending_db_world/bashir_new_gold_rates.sql b/data/sql/updates/pending_db_world/bashir_new_gold_rates.sql new file mode 100644 index 000000000..7ea51d294 --- /dev/null +++ b/data/sql/updates/pending_db_world/bashir_new_gold_rates.sql @@ -0,0 +1,4 @@ +-- +UPDATE `creature_template` +SET `mingold` = 448, `maxgold` = 2520 +WHERE `entry` IN (22241, 22242, 22243) AND `lootid` IN (22241, 22242, 22243); From 3c401ad4adec01b351f73a4c9b5430361e858862 Mon Sep 17 00:00:00 2001 From: pedrohfm9 <122452427+Dr-Arayashiki@users.noreply.github.com> Date: Sat, 13 May 2023 15:25:53 -0300 Subject: [PATCH 063/107] fix(Scripts/HallsOfReflection): Improve Halls of Reflection Events (Horde) (#16165) * fix(DB/Creature): Grunda Bronzewing is now mounted Grunda Bronzewing is now mounted * Update Fix-Grunda Bronzewing in Honor Hold is not riding on a golden gryphon.sql Grunda Bronzewing is now mounted * Rename Fix-Grunda Bronzewing in Honor Hold is not riding on a golden gryphon.sql to Fix-Grunda.sql Grunda Bronzewing is now mounted * Delete Fix-Grunda.sql * Create Fix-NPCs_Halls_Off_Reflection.sql * Fix-events_Halls_of_Reflection(HORDE) * Rename Fix-NPCs_Halls_Off_Reflection.sql to Fix-NPCs_Halls_of_Reflection.sql * Rename halls_of_reflection.cpp to fix halls_of_reflection.cpp * Rename halls_of_reflection.h to fix halls_of_reflection.h * Rename instance_halls_of_reflection.cpp to fix instance_halls_of_reflection.cpp * Update fix halls_of_reflection.h * Update and rename fix halls_of_reflection.cpp to halls_of_reflection.cpp * Update and rename fix instance_halls_of_reflection.cpp to instance_halls_of_reflection.cpp * Update instance_halls_of_reflection.cpp * Update instance_halls_of_reflection.cpp * Update instance_halls_of_reflection.cpp * Update and rename fix halls_of_reflection.h to halls_of_reflection.h * Update instance_halls_of_reflection.cpp * Update halls_of_reflection.h * Update Fix-NPCs_Halls_of_Reflection.sql * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update instance_halls_of_reflection.cpp * Update halls_of_reflection.h * Update instance_halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update Fix-NPCs_Halls_of_Reflection.sql * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update and rename Fix-NPCs_Halls_of_Reflection.sql to Fix_NPCs_Halls_of_Reflection.sql * Update halls_of_reflection.cpp * Update halls_of_reflection.cpp * Update Fix_NPCs_Halls_of_Reflection.sql * Update Fix_NPCs_Halls_of_Reflection.sql * Update Fix_NPCs_Halls_of_Reflection.sql * Update Fix_NPCs_Halls_of_Reflection.sql * Update Fix_NPCs_Halls_of_Reflection.sql * Update Fix_NPCs_Halls_of_Reflection.sql * Update Fix_NPCs_Halls_of_Reflection.sql * Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp * Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp * Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp * Apply suggestions from code review * Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp * Update src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp --------- --- .../Fix_NPCs_Halls_of_Reflection.sql | 16 + .../HallsOfReflection/halls_of_reflection.cpp | 1003 +++++++++++------ .../HallsOfReflection/halls_of_reflection.h | 34 +- .../instance_halls_of_reflection.cpp | 37 +- 4 files changed, 692 insertions(+), 398 deletions(-) create mode 100644 data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql diff --git a/data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql b/data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql new file mode 100644 index 000000000..e48d12093 --- /dev/null +++ b/data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql @@ -0,0 +1,16 @@ + +-- SQL Dark Ranger Loralen emote +DELETE FROM `creature_template_addon` WHERE (`entry` = 37779); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(37779, 0, 0, 0, 2, 0, 0, ''); +-- SQL LK Boss final +DELETE FROM `creature` WHERE (`id1` = 36954); +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(1972025, 36954, 0, 0, 668, 0, 0, 3, 1, 1, 5552.77, 2262.57, 733.012, 4.15523, 86400, 0, 0, 27890000, 0, 0, 0, 0, 0, '', 48999); +-- SQL LK Sylvanas final +DELETE FROM `creature` WHERE (`id1` = 37554); +INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES +(1972026, 37554, 0, 0, 668, 0, 0, 3, 1, 1, 5549.51, 2257.59, 733.011, 0.99299, 86400, 0, 0, 5040000, 881400, 0, 0, 0, 0, '', 48999); +-- Add Gossip Sylvanas Final +DELETE FROM `gossip_menu` WHERE (`MenuID` = 10931); +INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES (10931, 15190); diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 5d24f7dd8..e45dd47fd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -26,8 +26,13 @@ enum Events EVENT_PRE_INTRO_2, EVENT_PRE_INTRO_3, + EVENT_TALK_LEADER_1, + EVENT_EMOTE_LEADER_1, + EVENT_START_INTRO, EVENT_SKIP_INTRO, + EVENT_LORALEN_MOVE_1, + EVENT_LORALEN_MOVE_2, EVENT_INTRO_A2_1, EVENT_INTRO_A2_2, @@ -51,7 +56,10 @@ enum Events EVENT_INTRO_H2_1, EVENT_INTRO_H2_2, + EVENT_INTRO_H2_2_1, EVENT_INTRO_H2_3, + EVENT_INTRO_H2_3_1, + EVENT_INTRO_H2_3_2, EVENT_INTRO_H2_4, EVENT_INTRO_H2_5, EVENT_INTRO_H2_6, @@ -65,20 +73,31 @@ enum Events EVENT_INTRO_H2_14, EVENT_INTRO_H2_15, + //BATTLE SYLVANAS X LK// + BATTLE_SYLVANAS_PART1, + EVENT_INTRO_LK_1, + EVENT_INTRO_LK_1_1, EVENT_INTRO_LK_1_2, EVENT_INTRO_LK_1_3, EVENT_INTRO_LK_2, + EVENT_INTRO_LK_2_1, EVENT_INTRO_LK_3, EVENT_INTRO_LK_4, EVENT_INTRO_LK_4_2, EVENT_INTRO_LK_4_3, EVENT_INTRO_LK_5, + EVENT_INTRO_LK_5_1, EVENT_INTRO_LK_5_2, + EVENT_INTRO_LK_5_3, EVENT_INTRO_LK_6, EVENT_INTRO_LK_7, EVENT_INTRO_LK_8, EVENT_INTRO_LK_9, + EVENT_INTRO_LK_10, + EVENT_INTRO_LK_11, + EVENT_INTRO_LK_12, + EVENT_INTRO_LK_13, EVENT_INTRO_END, EVENT_INTRO_END_SET, @@ -86,12 +105,24 @@ enum Events enum Gossips { - GOSSIP_MENU_SYLVANAS = 10950, - GOSISP_MENU_JAINA = 11031, + GOSSIP_MENU_SYLVANAS = 10950, + GOSISP_MENU_JAINA = 11031, GOSSIP_OPTION_START = 0, GOSSIP_OPTION_START_SKIP = 1, }; +Position const NpcJainaOrSylvanasEscapeRoute[] = +{ + { 5601.217285f, 2207.652832f, 731.541931f, 5.223304f }, // leave the throne room + { 5607.224375f, 2173.913330f, 731.126038f, 2.608723f }, // adjust route + { 5583.427246f, 2138.784180f, 731.150391f, 4.260901f }, // stop for talking + { 5560.281738f, 2104.025635f, 731.410889f, 4.058383f }, // attack the first icewall + { 5510.990723f, 2000.772217f, 734.716064f, 3.973213f }, // attack the second icewall + { 5452.641113f, 1905.762329f, 746.530579f, 4.118834f }, // attack the third icewall + { 5338.126953f, 1768.429810f, 767.237244f, 3.855189f }, // attack the fourth icewall + { 5259.06f, 1669.27f, 784.3008f, 0.0f }, // trap (sniffed) + { 5265.53f, 1681.6f, 784.2947f, 4.13643f } // final position (sniffed) +}; class npc_hor_leader : public CreatureScript { @@ -198,7 +229,9 @@ public: first = false; events.ScheduleEvent(EVENT_PRE_INTRO_1, 10s); events.ScheduleEvent(EVENT_PRE_INTRO_2, 11s); - events.ScheduleEvent(EVENT_PRE_INTRO_3, 17s); + events.ScheduleEvent(EVENT_EMOTE_LEADER_1, 16s); + events.ScheduleEvent(EVENT_TALK_LEADER_1, 16s); + events.ScheduleEvent(EVENT_PRE_INTRO_3, 19s); } } @@ -218,375 +251,565 @@ public: void UpdateAI(uint32 diff) override { events.Update(diff); - switch(events.ExecuteEvent()) + switch (events.ExecuteEvent()) { - case EVENT_PRE_INTRO_1: - if (pInstance) - { - me->SetVisible(true); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) - c->SetVisible(true); - } - break; - case EVENT_PRE_INTRO_2: - if (me->GetEntry() == NPC_JAINA_PART1) - Talk(SAY_JAINA_INTRO_1); - me->GetMotionMaster()->MovePoint(0, SpawnPos); - break; - case EVENT_PRE_INTRO_3: - me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); - Talk(me->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_INTRO_2 : SAY_SYLVANAS_INTRO_1); - me->SetFacingTo(0.89f); - break; + case EVENT_PRE_INTRO_1: + if (pInstance) + { - case EVENT_START_INTRO: - shortver = false; - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - me->GetMotionMaster()->MovePoint(0, MoveThronePos); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) - c->GetMotionMaster()->MovePoint(0, LoralenFollowPos); - // Begining of intro is differents between factions as the speech sequence and timers are differents. - if (me->GetEntry() == NPC_JAINA_PART1) - events.ScheduleEvent(EVENT_INTRO_A2_1, 10s); - else - events.ScheduleEvent(EVENT_INTRO_H2_2, 10s); - break; - case EVENT_SKIP_INTRO: - shortver = true; - me->SetUInt32Value(UNIT_NPC_EMOTESTATE, (me->GetEntry() == NPC_JAINA_PART1 ? EMOTE_STATE_READY2H : EMOTE_STATE_READY1H)); - me->GetMotionMaster()->MovePoint(0, MoveThronePos); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) - c->GetMotionMaster()->MovePoint(0, LoralenFollowPos); - events.ScheduleEvent(EVENT_INTRO_LK_1, 0ms); - break; + me->SetSheath(SHEATH_STATE_MELEE); + me->SetVisible(true); + + } + break; + case EVENT_PRE_INTRO_2: + if (me->GetEntry() == NPC_JAINA_PART1) + { + Talk(SAY_JAINA_INTRO_1); + } + me->GetMotionMaster()->MovePoint(0, SpawnPos); + break; + case EVENT_TALK_LEADER_1: + me->SetSheath(SHEATH_STATE_UNARMED); + Talk(me->GetEntry() == NPC_JAINA_PART1 ? SAY_JAINA_INTRO_2 : SAY_SYLVANAS_INTRO_1); + break; + case EVENT_EMOTE_LEADER_1: + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + case EVENT_PRE_INTRO_3: + me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); + me->SetSheath(SHEATH_STATE_MELEE); + break; + case EVENT_START_INTRO: + shortver = false; + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->GetMotionMaster()->MovePoint(0, MoveThronePos); + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->LoadEquipment(true); + pLoralen->SetVisible(true); + pLoralen->SetWalk(true); + pLoralen->GetMotionMaster()->MovePoint(0, LoralenMidleFollowPos); + + } + // Begining of intro is differents between factions as the speech sequence and timers are differents. + if (me->GetEntry() == NPC_JAINA_PART1) + { + events.ScheduleEvent(EVENT_INTRO_A2_1, 10s); + } + else + { + events.ScheduleEvent(EVENT_INTRO_H2_2, 9s); + events.ScheduleEvent(EVENT_LORALEN_MOVE_1, 24s); + events.ScheduleEvent(EVENT_LORALEN_MOVE_2, 32s); + } + break; + + case EVENT_SKIP_INTRO: + shortver = true; + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, (me->GetEntry() == NPC_JAINA_PART1 ? EMOTE_STATE_READY2H : EMOTE_STATE_READY1H)); + me->GetMotionMaster()->MovePoint(0, MoveThronePos); + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowPos); + } + events.ScheduleEvent(EVENT_INTRO_LK_1, 0ms); + break; // A2 Intro Events - case EVENT_INTRO_A2_1: - Talk(SAY_JAINA_INTRO_3); - events.ScheduleEvent(EVENT_INTRO_A2_2, 5s); - break; - case EVENT_INTRO_A2_2: - Talk(SAY_JAINA_INTRO_4); - events.ScheduleEvent(EVENT_INTRO_A2_3, 10s); - break; - case EVENT_INTRO_A2_3: - pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true); - me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, true); - me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false); - events.ScheduleEvent(EVENT_INTRO_A2_4, 10s); - break; - case EVENT_INTRO_A2_4: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - { - pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - pUther->SetVisible(true); - if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther)) - a->SetDuration(8000); - } - events.ScheduleEvent(EVENT_INTRO_A2_5, 2s); - break; - case EVENT_INTRO_A2_5: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_1); + case EVENT_INTRO_A2_1: + Talk(SAY_JAINA_INTRO_3); + events.ScheduleEvent(EVENT_INTRO_A2_2, 5s); + break; + case EVENT_INTRO_A2_2: + Talk(SAY_JAINA_INTRO_4); + events.ScheduleEvent(EVENT_INTRO_A2_3, 10s); + break; + case EVENT_INTRO_A2_3: + pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true); + me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, true); + //me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false);// the sniff is missing from the alliance + events.ScheduleEvent(EVENT_INTRO_A2_4, 10s); + break; + case EVENT_INTRO_A2_4: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + pUther->SetVisible(true); + if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther)) + a->SetDuration(8000); + } + events.ScheduleEvent(EVENT_INTRO_A2_5, 2s); + break; + case EVENT_INTRO_A2_5: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_1); events.ScheduleEvent(EVENT_INTRO_A2_6, 3s); - break; - case EVENT_INTRO_A2_6: - Talk(SAY_JAINA_INTRO_5); - events.ScheduleEvent(EVENT_INTRO_A2_7, 6s); - break; - case EVENT_INTRO_A2_7: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_2); - events.ScheduleEvent(EVENT_INTRO_A2_8, 6500ms); - break; - case EVENT_INTRO_A2_8: - Talk(SAY_JAINA_INTRO_6); - events.ScheduleEvent(EVENT_INTRO_A2_9, 2s); - break; - case EVENT_INTRO_A2_9: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_3); - events.ScheduleEvent(EVENT_INTRO_A2_10, 9s); - break; - case EVENT_INTRO_A2_10: - Talk(SAY_JAINA_INTRO_7); - events.ScheduleEvent(EVENT_INTRO_A2_11, 5s); - break; - case EVENT_INTRO_A2_11: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_4); - events.ScheduleEvent(EVENT_INTRO_A2_12, 11s); - break; - case EVENT_INTRO_A2_12: - Talk(SAY_JAINA_INTRO_8); - events.ScheduleEvent(EVENT_INTRO_A2_13, 4s); - break; - case EVENT_INTRO_A2_13: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_5); - events.ScheduleEvent(EVENT_INTRO_A2_14, 12s + 500ms); - break; - case EVENT_INTRO_A2_14: - Talk(SAY_JAINA_INTRO_9); - events.ScheduleEvent(EVENT_INTRO_A2_15, 10s); - break; - case EVENT_INTRO_A2_15: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_6); - events.ScheduleEvent(EVENT_INTRO_A2_16, 24s); - break; - case EVENT_INTRO_A2_16: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_7); - events.ScheduleEvent(EVENT_INTRO_A2_17, 4s); - break; - case EVENT_INTRO_A2_17: - Talk(SAY_JAINA_INTRO_10); - events.ScheduleEvent(EVENT_INTRO_A2_18, 2s); - break; - case EVENT_INTRO_A2_18: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - { - pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO); - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_8); - } - events.ScheduleEvent(EVENT_INTRO_A2_19, 11s); - break; - case EVENT_INTRO_A2_19: - Talk(SAY_JAINA_INTRO_11); - events.ScheduleEvent(EVENT_INTRO_LK_1, 2s); - break; + } + break; + case EVENT_INTRO_A2_6: + Talk(SAY_JAINA_INTRO_5); + events.ScheduleEvent(EVENT_INTRO_A2_7, 6s); + break; + case EVENT_INTRO_A2_7: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_2); + } + events.ScheduleEvent(EVENT_INTRO_A2_8, 6500ms); + break; + case EVENT_INTRO_A2_8: + Talk(SAY_JAINA_INTRO_6); + events.ScheduleEvent(EVENT_INTRO_A2_9, 2s); + break; + case EVENT_INTRO_A2_9: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_3); + } + events.ScheduleEvent(EVENT_INTRO_A2_10, 9s); + break; + case EVENT_INTRO_A2_10: + Talk(SAY_JAINA_INTRO_7); + events.ScheduleEvent(EVENT_INTRO_A2_11, 5s); + break; + case EVENT_INTRO_A2_11: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_4); + } + events.ScheduleEvent(EVENT_INTRO_A2_12, 11s); + break; + case EVENT_INTRO_A2_12: + Talk(SAY_JAINA_INTRO_8); + events.ScheduleEvent(EVENT_INTRO_A2_13, 4s); + break; + case EVENT_INTRO_A2_13: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_5); + } + events.ScheduleEvent(EVENT_INTRO_A2_14, 12s + 500ms); + break; + case EVENT_INTRO_A2_14: + Talk(SAY_JAINA_INTRO_9); + events.ScheduleEvent(EVENT_INTRO_A2_15, 10s); + break; + case EVENT_INTRO_A2_15: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_6); + } + events.ScheduleEvent(EVENT_INTRO_A2_16, 24s); + break; + case EVENT_INTRO_A2_16: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_7); + events.ScheduleEvent(EVENT_INTRO_A2_17, 4s); + break; + case EVENT_INTRO_A2_17: + Talk(SAY_JAINA_INTRO_10); + events.ScheduleEvent(EVENT_INTRO_A2_18, 2s); + break; + case EVENT_INTRO_A2_18: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_8); + } + events.ScheduleEvent(EVENT_INTRO_A2_19, 11s); + break; + case EVENT_INTRO_A2_19: + Talk(SAY_JAINA_INTRO_11); + events.ScheduleEvent(EVENT_INTRO_LK_1, 2s); + break; // H2 Intro Events - case EVENT_INTRO_H2_2: - Talk(SAY_SYLVANAS_INTRO_2); - events.ScheduleEvent(EVENT_INTRO_H2_3, 6s); - break; - case EVENT_INTRO_H2_3: - Talk(SAY_SYLVANAS_INTRO_3); - pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true); - me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, true); - me->CastSpell(me, SPELL_ARCANE_CAST_VISUAL, false); - events.ScheduleEvent(EVENT_INTRO_H2_4, 6s); - break; - case EVENT_INTRO_H2_4: - if (Creature* pUther = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_UTHER))) + case EVENT_LORALEN_MOVE_1: + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowPos); + } + break; + + case EVENT_LORALEN_MOVE_2: + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); + } + break; + + case EVENT_INTRO_H2_2: + me->SetSheath(SHEATH_STATE_UNARMED); + me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); + Talk(SAY_SYLVANAS_INTRO_2); + events.ScheduleEvent(EVENT_INTRO_H2_2_1, 7s + 500ms); + break; + + case EVENT_INTRO_H2_2_1: + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + Talk(SAY_SYLVANAS_INTRO_3); + events.ScheduleEvent(EVENT_INTRO_H2_3, 2s); + break; + + case EVENT_INTRO_H2_3: + me->CastSpell(me, SPELL_SUMMON_SOULS, false); + events.ScheduleEvent(EVENT_INTRO_H2_3_1, 5s); + break; + + case EVENT_INTRO_H2_3_1: + me->CastSpell(me, SPELL_FROSTMOURNE_SPAWN_SOUND, false); + pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), true); + events.ScheduleEvent(EVENT_INTRO_H2_3_2, 3s); + break; + + case EVENT_INTRO_H2_3_2: + me->RemoveAurasDueToSpell(SPELL_SUMMON_SOULS); + events.ScheduleEvent(EVENT_INTRO_H2_4, 2s); + break; + case EVENT_INTRO_H2_4: + if (Creature* pUther = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_UTHER))) + { + pUther->SetVisible(true); + if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther)) { - pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - pUther->SetVisible(true); - if (Aura* a = pUther->AddAura(SPELL_SHADOWMOURNE_VISUAL, pUther)) - a->SetDuration(8000); + a->SetDuration(8000); } - events.ScheduleEvent(EVENT_INTRO_H2_5, 2s); - break; - case EVENT_INTRO_H2_5: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_1); - events.ScheduleEvent(EVENT_INTRO_H2_6, 11s); - break; - case EVENT_INTRO_H2_6: - Talk(SAY_SYLVANAS_INTRO_4); - events.ScheduleEvent(EVENT_INTRO_H2_7, 3s); - break; - case EVENT_INTRO_H2_7: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_2); - events.ScheduleEvent(EVENT_INTRO_H2_8, 6s); - break; - case EVENT_INTRO_H2_8: - Talk(SAY_SYLVANAS_INTRO_5); - events.ScheduleEvent(EVENT_INTRO_H2_9, 5s); - break; - case EVENT_INTRO_H2_9: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_3); - events.ScheduleEvent(EVENT_INTRO_H2_10, 19s); - break; - case EVENT_INTRO_H2_10: - Talk(SAY_SYLVANAS_INTRO_6); - events.ScheduleEvent(EVENT_INTRO_H2_11, 1500ms); - break; - case EVENT_INTRO_H2_11: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_4); - events.ScheduleEvent(EVENT_INTRO_H2_12, 19s + 500ms); - break; - case EVENT_INTRO_H2_12: - Talk(SAY_SYLVANAS_INTRO_7); - events.ScheduleEvent(EVENT_INTRO_H2_13, 2s); - break; - case EVENT_INTRO_H2_13: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - { - pUther->HandleEmoteCommand(EMOTE_ONESHOT_NO); - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_5); - } - events.ScheduleEvent(EVENT_INTRO_H2_14, 12s); - break; - case EVENT_INTRO_H2_14: - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_6); - events.ScheduleEvent(EVENT_INTRO_H2_15, 8s); - break; - case EVENT_INTRO_H2_15: - Talk(SAY_SYLVANAS_INTRO_8); - events.ScheduleEvent(EVENT_INTRO_LK_1, 2s); - break; + } + events.ScheduleEvent(EVENT_INTRO_H2_5, 7s); + break; + + case EVENT_INTRO_H2_5: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_1); + } + events.ScheduleEvent(EVENT_INTRO_H2_6, 11s); + break; + case EVENT_INTRO_H2_6: + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + Talk(SAY_SYLVANAS_INTRO_4); + events.ScheduleEvent(EVENT_INTRO_H2_7, 2s + 500ms); + break; + case EVENT_INTRO_H2_7: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_2); + } + events.ScheduleEvent(EVENT_INTRO_H2_8, 9s);// + break; + case EVENT_INTRO_H2_8: + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + Talk(SAY_SYLVANAS_INTRO_5); + events.ScheduleEvent(EVENT_INTRO_H2_9, 5s); + break; + case EVENT_INTRO_H2_9: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_3); + } + events.ScheduleEvent(EVENT_INTRO_H2_10, 20s); + break; + case EVENT_INTRO_H2_10: + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + Talk(SAY_SYLVANAS_INTRO_6); + events.ScheduleEvent(EVENT_INTRO_H2_11, 3s); + break; + case EVENT_INTRO_H2_11: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_4); + } + events.ScheduleEvent(EVENT_INTRO_H2_12, 21s + 500ms); + break; + case EVENT_INTRO_H2_12: + me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); + Talk(SAY_SYLVANAS_INTRO_7); + events.ScheduleEvent(EVENT_INTRO_H2_13, 3s + 500ms); + break; + case EVENT_INTRO_H2_13: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_5); + + } + events.ScheduleEvent(EVENT_INTRO_H2_14, 12s + 500ms); + break; + case EVENT_INTRO_H2_14: + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_6); + } + events.ScheduleEvent(EVENT_INTRO_H2_15, 8s); + break; + case EVENT_INTRO_H2_15: + me->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); + Talk(SAY_SYLVANAS_INTRO_8); + events.ScheduleEvent(EVENT_INTRO_LK_1, 2s); + break; // Remaining Intro Events common for both faction - case EVENT_INTRO_LK_1: - if (Creature* pLichKing = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + case EVENT_INTRO_LK_1: + if (Creature* pLichKing = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + + pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true); + pLichKing->SetVisible(true); + + pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveMidlelThronePos, false); + + } + + if (!shortver) + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + if (me->GetEntry() == NPC_JAINA_PART1) + + pUther->AI()->Talk(SAY_UTHER_INTRO_A2_9); + else + pUther->AI()->Talk(SAY_UTHER_INTRO_H2_7); + + } + events.ScheduleEvent(EVENT_INTRO_LK_1_1, 9s); + events.ScheduleEvent(EVENT_INTRO_LK_1_2, 3s); + events.ScheduleEvent(EVENT_INTRO_LK_1_3, 6s); + events.ScheduleEvent(EVENT_INTRO_LK_2, 12s); + break; + + case EVENT_INTRO_LK_1_1: + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + pLichKing->AI()->Talk(SAY_LK_INTRO_1); + } + break; + + case EVENT_INTRO_LK_1_2: + if (!shortver) + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) + { + pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); + pUther->SetFacingTo(0.89f); + } + break; + + case EVENT_INTRO_LK_1_3: + pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), false); + break; + + case EVENT_INTRO_LK_2: + if (!shortver) + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) { - pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true); pLichKing->SetVisible(true); pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveThronePos, false); } + events.ScheduleEvent(EVENT_INTRO_LK_2_1, 1s); + break; - if (!shortver) - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - { - if (me->GetEntry() == NPC_JAINA_PART1) - pUther->AI()->Talk(SAY_UTHER_INTRO_A2_9); - else - pUther->AI()->Talk(SAY_UTHER_INTRO_H2_7); - } - - events.ScheduleEvent(EVENT_INTRO_LK_1_2, 2s); - events.ScheduleEvent(EVENT_INTRO_LK_1_3, 4s); - events.ScheduleEvent(EVENT_INTRO_LK_2, 11s); - break; - - case EVENT_INTRO_LK_1_2: - if (!shortver) - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_COWER); - break; - - case EVENT_INTRO_LK_1_3: - pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), false); - break; - - case EVENT_INTRO_LK_2: - if (!shortver) - if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) - pLichKing->AI()->Talk(SAY_LK_INTRO_1); - events.ScheduleEvent(EVENT_INTRO_LK_3, 2s); - break; - - case EVENT_INTRO_LK_3: - if (!shortver) - if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) - pUther->SetVisible(false); - events.ScheduleEvent(EVENT_INTRO_LK_4, 4s); - break; - - case EVENT_INTRO_LK_4: - if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) - pLichKing->AI()->Talk(SAY_LK_INTRO_2); - events.ScheduleEvent(EVENT_INTRO_LK_4_2, 10s); - break; - - case EVENT_INTRO_LK_4_2: - if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + case EVENT_INTRO_LK_2_1: + if (!shortver) + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) { - pLichKing->LoadEquipment(1, true); - pLichKing->SendMovementFlagUpdate(); - pLichKing->CastSpell(pLichKing, SPELL_FROSTMOURNE_EQUIP, false); - pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), false); - events.ScheduleEvent(EVENT_INTRO_LK_4_3, 1750); + pUther->SendPlaySpellVisual(SPELL_UTHER_DESPAWN); + pUther->CastSpell(pUther, SPELL_UTHER_DESPAWN, true); } - events.ScheduleEvent(EVENT_INTRO_LK_5, 6s); - break; + events.ScheduleEvent(EVENT_INTRO_LK_3, 2s); + break; - case EVENT_INTRO_LK_4_3: - if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_FROSTMOURNE))) - go->SetPhaseMask(2, true); - break; - case EVENT_INTRO_LK_5: - if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) + case EVENT_INTRO_LK_3: + if (!shortver) + if (Creature* pUther = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_UTHER))) { - pFalric->UpdatePosition(5274.9f, 2039.2f, 709.319f, 5.4619f, true); - pFalric->StopMovingOnCurrentPos(); - pFalric->SetVisible(true); - if (pFalric->IsAlive()) - { - pFalric->GetMotionMaster()->MovePoint(0, FalricMovePos); - if (Aura* a = pFalric->AddAura(SPELL_SHADOWMOURNE_VISUAL, pFalric)) - a->SetDuration(8000); - } + pUther->SetVisible(false); } - if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN))) + events.ScheduleEvent(EVENT_INTRO_LK_4, 6s); + break; + + case EVENT_INTRO_LK_4: + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); + pLichKing->AI()->Talk(SAY_LK_INTRO_2); + } + events.ScheduleEvent(EVENT_INTRO_LK_4_2, 10s); + break; + + case EVENT_INTRO_LK_4_2: + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + pLichKing->LoadEquipment(1, true); + pLichKing->SendMovementFlagUpdate(); + pLichKing->CastSpell(pLichKing, SPELL_FROSTMOURNE_EQUIP, false); + pInstance->HandleGameObject(pInstance->GetGuidData(GO_FROSTMOURNE), false); + events.ScheduleEvent(EVENT_INTRO_LK_4_3, 1750); + } + events.ScheduleEvent(EVENT_INTRO_LK_5, 6s); + break; + + case EVENT_INTRO_LK_4_3: + if (GameObject* go = pInstance->instance->GetGameObject(pInstance->GetGuidData(GO_FROSTMOURNE))) + go->SetPhaseMask(2, true); + break; + case EVENT_INTRO_LK_5: + if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) + { + pFalric->UpdatePosition(5274.9f, 2039.2f, 709.319f, 5.4619f, true); + pFalric->StopMovingOnCurrentPos(); + pFalric->SetVisible(true); + if (pFalric->IsAlive()) { - pMarwyn->UpdatePosition(5343.77f, 1973.86f, 709.319f, 2.35173f, true); - pMarwyn->StopMovingOnCurrentPos(); - pMarwyn->SetVisible(true); - if (pMarwyn->IsAlive()) - { - pMarwyn->GetMotionMaster()->MovePoint(0, MarwynMovePos); - if (Aura* a = pMarwyn->AddAura(SPELL_SHADOWMOURNE_VISUAL, pMarwyn)) - a->SetDuration(8000); - } + pFalric->GetMotionMaster()->MovePoint(0, FalricMovePos); + if (Aura* a = pFalric->AddAura(SPELL_SHADOWMOURNE_VISUAL, pFalric)) + a->SetDuration(8000); } + } + if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN))) + { + pMarwyn->UpdatePosition(5343.77f, 1973.86f, 709.319f, 2.35173f, true); + pMarwyn->StopMovingOnCurrentPos(); + pMarwyn->SetVisible(true); + if (pMarwyn->IsAlive()) + { + pMarwyn->GetMotionMaster()->MovePoint(0, MarwynMovePos); + if (Aura* a = pMarwyn->AddAura(SPELL_SHADOWMOURNE_VISUAL, pMarwyn)) + a->SetDuration(8000); + } + } + events.ScheduleEvent(EVENT_INTRO_LK_5_1, 0s); + events.ScheduleEvent(EVENT_INTRO_LK_5_2, 7s); + events.ScheduleEvent(EVENT_INTRO_LK_5_3, 0s); + events.ScheduleEvent(EVENT_INTRO_LK_6, 11s); + break; - if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) - pLichKing->AI()->Talk(SAY_LK_INTRO_3); + case EVENT_INTRO_LK_5_1: + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + pLichKing->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + pLichKing->AI()->Talk(SAY_LK_INTRO_3); + } + break; - events.ScheduleEvent(EVENT_INTRO_LK_5_2, 5s); - events.ScheduleEvent(EVENT_INTRO_LK_6, 8s); - break; + case EVENT_INTRO_LK_5_2: + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); + } + break; - case EVENT_INTRO_LK_5_2: - if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) - pLichKing->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); - break; + case EVENT_INTRO_LK_5_3: + me->SetSpeed(MOVE_RUN, 1.6); + me->SetSheath(SHEATH_STATE_MELEE); + me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_READY1H); + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->SetSheath(SHEATH_STATE_MELEE); + pLoralen->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_READY1H); + pLoralen->SetWalk(false); + pLoralen->LoadEquipment(true); + } + break; - case EVENT_INTRO_LK_6: - if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) - pFalric->AI()->Talk(SAY_FALRIC_INTRO_1); + case EVENT_INTRO_LK_6: + if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) + { + pFalric->HandleEmoteCommand(EMOTE_ONESHOT_BOW); + pFalric->AI()->Talk(SAY_FALRIC_INTRO_1); + } + events.ScheduleEvent(EVENT_INTRO_LK_7, 2s); + break; - events.ScheduleEvent(EVENT_INTRO_LK_7, 2s); - break; + case EVENT_INTRO_LK_7: + if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN))) + { + pMarwyn->HandleEmoteCommand(EMOTE_ONESHOT_BOW); + pMarwyn->AI()->Talk(SAY_MARWYN_INTRO_1); + } + events.ScheduleEvent(EVENT_INTRO_LK_8, 3s); + break; - case EVENT_INTRO_LK_7: - if (Creature* pMarwyn = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_MARWYN))) - pMarwyn->AI()->Talk(SAY_MARWYN_INTRO_1); - - events.ScheduleEvent(EVENT_INTRO_LK_8, 2s); - break; - - case EVENT_INTRO_LK_8: - if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) - pFalric->AI()->Talk(SAY_FALRIC_INTRO_2); + case EVENT_INTRO_LK_8: + if (Creature* pFalric = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(DATA_FALRIC))) + { + pFalric->AI()->Talk(SAY_FALRIC_INTRO_2); pInstance->SetData(ACTION_SHOW_TRASH, 1); - pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), true); + } + events.ScheduleEvent(EVENT_INTRO_LK_9, 6s); + break; - events.ScheduleEvent(EVENT_INTRO_LK_9, 5s); - break; - - case EVENT_INTRO_LK_9: - if (me->GetEntry() == NPC_JAINA_PART1) - Talk(SAY_JAINA_INTRO_END); - else - Talk(SAY_SYLVANAS_INTRO_END); - + case EVENT_INTRO_LK_9: + if (me->GetEntry() == NPC_JAINA_PART1) + { + Talk(SAY_JAINA_INTRO_END); + } + else + { + Talk(SAY_SYLVANAS_INTRO_END); + me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); me->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) - c->GetMotionMaster()->MovePoint(0, LichKingMoveAwayPos, false); - events.ScheduleEvent(EVENT_INTRO_END, 14s); + } + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk1, false); + } + events.ScheduleEvent(EVENT_INTRO_LK_10, 1s + 500ms); + break; + + case EVENT_INTRO_LK_10: + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk2, false); + + } + events.ScheduleEvent(EVENT_INTRO_LK_11, 2s); + break; + + case EVENT_INTRO_LK_11: + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLk3, false); + } + events.ScheduleEvent(EVENT_INTRO_LK_12, 5s + 500ms); + break; + + case EVENT_INTRO_LK_12: + if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) + { + pLichKing->SetVisible(false); + } + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->GetMotionMaster()->MovePoint(0, LoralenFollowLkFinal, false); + } + events.ScheduleEvent(EVENT_INTRO_LK_13, 2s); + break; + case EVENT_INTRO_LK_13: + me->SetVisible(false); + events.ScheduleEvent(EVENT_INTRO_END, 2s +500ms); break; case EVENT_INTRO_END: pInstance->HandleGameObject(pInstance->GetGuidData(GO_ARTHAS_DOOR), false); pInstance->HandleGameObject(pInstance->GetGuidData(GO_FRONT_DOOR), false); - events.ScheduleEvent(EVENT_INTRO_END_SET, 10s); + events.ScheduleEvent(EVENT_INTRO_END_SET, 3s); break; case EVENT_INTRO_END_SET: - if (Creature* pLichKing = ObjectAccessor::GetCreature(*me, pInstance->GetGuidData(NPC_LICH_KING_EVENT))) - pLichKing->SetVisible(false); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) - c->SetVisible(false); - me->SetVisible(false); + if (Creature* pLoralen = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_DARK_RANGER_LORALEN))) + { + pLoralen->UpdatePosition(5369.71289f, 2083.6330f, 707.695129f, 0.188739f, true); + pLoralen->StopMovingOnCurrentPos(); + pLoralen->SetVisible(true); + pLoralen->KillSelf(pLoralen); + } pInstance->SetData(DATA_INTRO, DONE); break; } @@ -1391,6 +1614,10 @@ enum eFightEvents { EVENT_EMPTY = 0, EVENT_LK_SAY_AGGRO, + EVENT_LK_BATTLE_1, + EVENT_LK_BATTLE_2, + EVENT_LK_BATTLE_3, + EVENT_LK_BATTLE_4, EVENT_JAINA_IMMOBILIZE_LK, EVENT_SYLVANAS_IMMOBILIZE_JUMP, EVENT_SYLVANAS_DARK_BINDING, @@ -1444,7 +1671,6 @@ public: events.Reset(); events.RescheduleEvent(EVENT_LK_CHECK_COMBAT, 1s); } - void DoAction(int32 a) override { if (a == ACTION_START_LK_FIGHT_REAL) @@ -1463,7 +1689,6 @@ public: } else me->RemoveAura(SPELL_REMORSELESS_WINTER); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_SYLVANAS_PART2))) c->AI()->DoAction(ACTION_INFORM_WALL_DESTROYED); } @@ -1480,9 +1705,10 @@ public: { Talk(SAY_LK_IW_1); me->SetOrientation(4.15f); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_ICE_WALL_TARGET))) + if (Creature* icewall = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_ICE_WALL_TARGET))) { - me->CastSpell(c, SPELL_SUMMON_ICE_WALL, false); + me->SetFacingToObject(icewall); + me->CastSpell(icewall, SPELL_SUMMON_ICE_WALL, false); events.ScheduleEvent(EVENT_LK_REMORSELESS_WINTER, 4s); } } @@ -1496,6 +1722,7 @@ public: void JustSummoned(Creature* s) override { + ++reqKillCount; if (events.GetNextEventTime(EVENT_DECREASE_REQ_COUNT_BY_100)) events.RescheduleEvent(EVENT_DECREASE_REQ_COUNT_BY_100, 10s); @@ -1583,7 +1810,7 @@ public: me->CastSpell((Unit*)nullptr, SPELL_FURY_OF_FROSTMOURNE, false); } break; - case EVENT_LK_START_FOLLOWING: /// @todo: LK Moves too fast at the begining and too slow after and the leaders (Sylvana/Jaina) should be running instead of walking. + case EVENT_LK_START_FOLLOWING: { me->SetSpeed(MOVE_RUN, 9.0f / 7.0f); Movement::PointsArray path; @@ -1703,6 +1930,7 @@ public: pInstance = me->GetInstanceScript(); if (!pInstance) me->IsAIEnabled = false; + } InstanceScript* pInstance; @@ -1714,13 +1942,16 @@ public: currentStopPoint = 0; events.Reset(); } - void DoAction(int32 actionId) override + { switch(actionId) { case ACTION_START_INTRO: events.ScheduleEvent(EVENT_LK_SAY_AGGRO, 0ms); + events.ScheduleEvent(EVENT_LK_BATTLE_1, 2s +500ms); + events.ScheduleEvent(EVENT_LK_BATTLE_2, 3s); + events.ScheduleEvent(me->GetEntry() == NPC_JAINA_PART2 ? EVENT_JAINA_IMMOBILIZE_LK : EVENT_SYLVANAS_IMMOBILIZE_JUMP, 9s); break; case ACTION_START_LK_FIGHT_REAL: events.ScheduleEvent(EVENT_START_RUN, 0ms); @@ -1741,8 +1972,11 @@ public: void MoveToNextStopPoint() { + me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); me->InterruptNonMeleeSpells(true); + me->SetSheath(SHEATH_STATE_MELEE); ++currentStopPoint; + me->SetWalk(false); Movement::PointsArray path; path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ())); for (uint8 i = WP_STOP[currentStopPoint - 1] + (currentStopPoint == 1 ? 0 : 1); i <= WP_STOP[currentStopPoint]; ++i) @@ -1762,43 +1996,72 @@ public: switch(events.ExecuteEvent()) { case EVENT_LK_SAY_AGGRO: - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) - c->AI()->Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_LK_AGGRO_ALLY : SAY_LK_AGGRO_HORDE); - events.ScheduleEvent(me->GetEntry() == NPC_JAINA_PART2 ? EVENT_JAINA_IMMOBILIZE_LK : EVENT_SYLVANAS_IMMOBILIZE_JUMP, 12s); + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + { + me->Attack(lkboss, true), + lkboss->AI()->Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_LK_AGGRO_ALLY : SAY_LK_AGGRO_HORDE); + } + break; + case EVENT_LK_BATTLE_1: + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + { + lkboss->CastSpell(lkboss, SPELL_SOUL_REAPER, false); + } + break; + case EVENT_LK_BATTLE_2: + //horda + if (Creature* leader = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_SYLVANAS_PART2))) + { + leader->CastSpell(leader, SPELL_EVASION, true); + } + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + { + lkboss->SetFacingToObject(me); + } + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + { + lkboss->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT); + me->SetFacingToObject(lkboss); + } break; case EVENT_JAINA_IMMOBILIZE_LK: - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) { - c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + lkboss->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY_SPELL_OMNI); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - me->CastSpell(c, SPELL_JAINA_ICE_PRISON, false); + me->CastSpell(lkboss, SPELL_JAINA_ICE_PRISON, false); events.ScheduleEvent(EVENT_SAY_LEAVE, 5s); } break; case EVENT_SYLVANAS_IMMOBILIZE_JUMP: - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) { - c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); + me->AttackStop(); + me->SetSheath(SHEATH_STATE_MELEE); + lkboss->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY_SPELL_OMNI); + lkboss->CastSpell(me, SPELL_BLIDING_RETREAT, false); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); - me->KnockbackFrom(c->GetPositionX(), c->GetPositionY(), 10.0f, 3.0f); - events.ScheduleEvent(EVENT_SYLVANAS_DARK_BINDING, 1500ms); + me->KnockbackFrom(lkboss->GetPositionX(), lkboss->GetPositionY(), 34.3f, 4.0f); + events.ScheduleEvent(EVENT_SYLVANAS_DARK_BINDING, 2s +500ms); } break; case EVENT_SYLVANAS_DARK_BINDING: - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) - me->CastSpell(c, SPELL_SYLVANAS_DARK_BINDING, false); - events.ScheduleEvent(EVENT_SAY_LEAVE, 3500ms); + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + me->CastSpell(lkboss, SPELL_SYLVANAS_DARK_BINDING, false); + events.ScheduleEvent(EVENT_SAY_LEAVE, 2s); break; case EVENT_SAY_LEAVE: { Map::PlayerList const& pl = pInstance->instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) if (Player* p = itr->GetSource()) - p->KilledMonsterCredit(me->GetEntry()); // for quest - + p->KilledMonsterCredit(me->GetEntry()); //for quest Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_AGGRO : SAY_SYLVANA_AGGRO); + me->SetSheath(SHEATH_STATE_MELEE); + me->SetWalk(false); + me->SetSpeed(MOVE_RUN, me->GetCreatureTemplate()->speed_run); me->GetMotionMaster()->MovePoint(0, LeaderEscapePos); - events.ScheduleEvent(EVENT_ADD_GOSSIP, 8s); + events.ScheduleEvent(EVENT_ADD_GOSSIP, 7s); } break; case EVENT_ADD_GOSSIP: @@ -1811,12 +2074,12 @@ public: pInstance->SetData(ACTION_START_LK_FIGHT, 1); me->setActive(true); MoveToNextStopPoint(); - if (Creature* c = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) { - c->setActive(true); - c->SetInCombatWithZone(); - c->RemoveAura(me->GetEntry() == NPC_JAINA_PART2 ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING); - c->AI()->DoAction(ACTION_START_LK_FIGHT_REAL); + lkboss->setActive(true); + lkboss->SetInCombatWithZone(); + lkboss->RemoveAura(me->GetEntry() == NPC_JAINA_PART2 ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING); + lkboss->AI()->DoAction(ACTION_START_LK_FIGHT_REAL); } } break; @@ -1855,6 +2118,7 @@ public: Talk(me->GetEntry() == NPC_JAINA_PART2 ? SAY_JAINA_ESCAPE_01 : SAY_SYLVANA_ESCAPE_01); break; } + DoMeleeAttackIfReady(); } }; }; @@ -1898,8 +2162,8 @@ public: { me->SetCorpseDelay(10); if (InstanceScript* pInstance = me->GetInstanceScript()) - if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) - lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED); + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED); } }; @@ -1967,8 +2231,10 @@ public: { me->SetCorpseDelay(10); if (InstanceScript* pInstance = me->GetInstanceScript()) - if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) - lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED); + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + { + lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED); + } } }; @@ -2023,8 +2289,9 @@ public: } if (me->GetVictim() && me->isAttackReady() && me->IsWithinMeleeRange(me->GetVictim()) && !me->HasUnitState(UNIT_STATE_CASTING)) + { me->CastSpell(me->GetVictim(), 40505, false); - + } DoMeleeAttackIfReady(); } @@ -2032,8 +2299,10 @@ public: { me->SetCorpseDelay(10); if (InstanceScript* pInstance = me->GetInstanceScript()) - if (Creature* lk = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) - lk->AI()->DoAction(ACTION_INFORM_TRASH_DIED); + if (Creature* lkboss = pInstance->instance->GetCreature(pInstance->GetGuidData(NPC_LICH_KING_BOSS))) + { + lkboss->AI()->DoAction(ACTION_INFORM_TRASH_DIED); + } } }; @@ -2057,7 +2326,9 @@ public: PreventDefaultAction(); if (Unit* caster = GetCaster()) if (Creature* c = caster->SummonCreature(WORLD_TRIGGER, CannonFirePos[caster->GetEntry() == NPC_JAINA_PART2 ? 0 : 1][urand(0, 2)], TEMPSUMMON_TIMED_DESPAWN, 1)) + { c->CastSpell((Unit*)nullptr, 70021, true); + } } void Register() override diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h index 55d9de53f..ee52a31a9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h @@ -50,6 +50,7 @@ enum Data ACTION_STOP_LK_FIGHT, ACTION_DELETE_ICE_WALL, DATA_WAVE_NUMBER, + DATA_LK_BATTLE,// in progress }; enum Creatures @@ -84,6 +85,7 @@ enum Creatures NPC_SKY_REAVER_KORM_BLACKSKAR = 30824, NPC_ALTAR_BUNNY = 37704, NPC_QUEL_DELAR = 37158, + }; enum GameObjects @@ -263,8 +265,14 @@ enum hMisc SPELL_HOR_START_QUEST_ALLY = 71351, SPELL_HOR_START_QUEST_HORDE = 71542, SPELL_SHADOWMOURNE_VISUAL = 72523, - SPELL_ARCANE_CAST_VISUAL = 65633, + SPELL_UTHER_DESPAWN = 70693, //Sniffed SPELL_WELL_OF_SOULS_VISUAL = 72630, + SPELL_SUMMON_SOULS = 72711, //Sniffed Sylvanas + + //Battle of LK + SPELL_BLIDING_RETREAT = 70199, //Sniffed LK + SPELL_SOUL_REAPER = 69410, //Sniffed LK + SPELL_EVASION = 70190, //Sniffed Sylvanas // Frostsworn General EVENT_ACTIVATE_REFLECTIONS = 1, @@ -310,18 +318,24 @@ const uint32 allowedCompositions[8][5] = {NPC_WAVE_MERCENARY, NPC_WAVE_MAGE, NPC_WAVE_PRIEST, NPC_WAVE_FOOTMAN, NPC_WAVE_FOOTMAN} }; -const Position CenterPos = {5309.459473f, 2006.478516f, 711.595459f, 0.0f}; -const Position SpawnPos = {5262.540527f, 1949.693726f, 707.695007f, 0.808736f}; // Jaina/Sylvanas Beginning Position -const Position LoralenFollowPos = {5283.234863f, 1990.946777f, 707.695679f, 0.929097f}; -const Position MoveThronePos = {5306.952148f, 1998.499023f, 709.341431f, 1.277278f}; // Jaina/Sylvanas walks to throne -const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f}; +const Position CenterPos = {5309.459473f, 2006.478516f, 711.595459f, 0.0f}; +const Position SpawnPos = {5263.22412f, 1950.95544f, 707.695862f, 0.808736f}; // Jaina/Sylvanas Beginning Position +const Position LoralenMidleFollowPos = {5274.25634f, 1976.04760f, 707.694763f, 0.929097f}; // Sniffed +const Position LoralenFollowPos = {5283.29296f, 1992.43078f, 707.694763f, 0.549238f}; // Sniffed +const Position LoralenFollowLk1 = {5292.94921f, 2008.25451f, 707.695801f, 1.047967f}; // Sniffed +const Position LoralenFollowLk2 = {5298.94335f, 2016.37097f, 707.695801f, 0.694538f}; // Sniffed +const Position LoralenFollowLk3 = {5336.94044f, 2040.21814f, 707.695801f, 0.439284f}; // Sniffed +const Position LoralenFollowLkFinal = {5361.96777f, 2065.68310f, 707.693848f, 0.831989f}; // Sniffed +const Position LoralenDeadPos = {5369.71289f, 2083.6330f, 707.695129f, 0.188739f}; // Sniffed +const Position MoveThronePos = {5306.98535f, 1998.10302f, 709.341187f, 1.277278f}; // Jaina/Sylvanas walks to throne +const Position UtherSpawnPos = {5308.310059f, 2003.857178f, 709.341431f, 4.650315f}; // Uther starting position const Position LichKingSpawnPos = {5362.917480f, 2062.307129f, 707.695374f, 3.945812f}; -const Position LichKingMoveThronePos = {5312.080566f, 2009.172119f, 709.341431f, 3.973301f}; // Lich King walks to throne -const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away +const Position LichKingMoveMidlelThronePos = {5333.48437f, 2032.02648f, 707.695679f, 3.973301f}; // Lich King moves and hits Uther [sniff] +const Position LichKingMoveThronePos = {5312.79638f, 2010.07141f, 709.3942183f, 3.973301f}; // Lich King walks to throne [sniff] +const Position LichKingMoveAwayPos = {5400.069824f, 2102.7131689f, 707.69525f, 0.843803f}; // Lich King walks away [sniff] const Position FalricMovePos = {5284.161133f, 2030.691650f, 709.319336f, 5.489386f}; const Position MarwynMovePos = {5335.330078f, 1982.376221f, 709.319580f, 2.339942f}; -const Position SylvanasFightPos = {5557.508301f, 2263.920654f, 733.011230f, 3.624075f}; -const Position LeaderEscapePos = {5577.654785f, 2235.347412f, 733.011230f, 2.359576f}; +const Position LeaderEscapePos = {5576.80566f, 2235.55004f, 733.012268f, 2.782125f}; //Sniff const Position ShipMasterSummonPos = {5262.773926f, 1669.980103f, 715.000000f, 0.000000f}; const Position WalkCaveInPos = {5267.594238f, 1678.750000f, 784.302856f, 1.041739f}; const Position AllyPortalPos = {5205.015625f, 1605.680298f, 806.444458f, 0.884375f}; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index 437351418..62bcd08af 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -230,6 +230,7 @@ public: { case NPC_SYLVANAS_PART1: creature->SetVisible(false); + creature->SetSpeed(MOVE_RUN, 1.1); NPC_LeaderIntroGUID = creature->GetGUID(); if (TeamIdInInstance == TEAM_ALLIANCE) creature->UpdateEntry(NPC_JAINA_PART1); @@ -296,12 +297,8 @@ public: creature->SetVisible(false); if (!(EncounterMask & (1 << DATA_LK_INTRO))) { - creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT); - if (TeamIdInInstance != TEAM_ALLIANCE) - { - creature->StopMoving(); - creature->SetFacingTo(creature->GetAngle(&SylvanasFightPos)); - } + creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACK2HTIGHT); //the fight cannot be in the form of an emote, it is causing bugs + creature->CastSpell(creature, SPELL_SOUL_REAPER, true); } else if (!(EncounterMask & (1 << DATA_LICH_KING))) creature->AddAura(TeamIdInInstance == TEAM_ALLIANCE ? SPELL_JAINA_ICE_PRISON : SPELL_SYLVANAS_DARK_BINDING, creature); @@ -316,22 +313,20 @@ public: if (!creature->IsAlive()) creature->Respawn(); NPC_LeaderGUID = creature->GetGUID(); + creature->SetWalk(false); + creature->SetSheath(SHEATH_STATE_MELEE); if (TeamIdInInstance == TEAM_ALLIANCE) creature->UpdateEntry(NPC_JAINA_PART2); + creature->SetWalk(false); creature->SetHealth(creature->GetMaxHealth() / 20); - if (!(EncounterMask & (1 << DATA_FROSTSWORN_GENERAL))) creature->SetVisible(false); if (!(EncounterMask & (1 << DATA_LK_INTRO))) { - creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, TeamIdInInstance == TEAM_ALLIANCE ? EMOTE_ONESHOT_ATTACK2HTIGHT : EMOTE_ONESHOT_ATTACK1H); + creature->SetSheath(SHEATH_STATE_MELEE); + creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, TeamIdInInstance == TEAM_ALLIANCE ? EMOTE_ONESHOT_ATTACK2HTIGHT : EMOTE_ONESHOT_ATTACK1H); //the fight cannot be in the form of an emote, it is causing bugs. creature->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); creature->CastSpell(creature, TeamIdInInstance == TEAM_ALLIANCE ? SPELL_JAINA_ICE_BARRIER : SPELL_SYLVANAS_CLOAK_OF_DARKNESS, true); - if (TeamIdInInstance != TEAM_ALLIANCE) - { - creature->UpdatePosition(SylvanasFightPos, true); - creature->StopMovingOnCurrentPos(); - } } else if (!(EncounterMask & (1 << DATA_LICH_KING))) { @@ -346,6 +341,7 @@ public: creature->UpdatePosition(PathWaypoints[PATH_WP_COUNT - 1], true); creature->StopMovingOnCurrentPos(); } + creature->SetSheath(SHEATH_STATE_MELEE); creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); break; case NPC_ICE_WALL_TARGET: @@ -444,8 +440,13 @@ public: if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID)) { c->SetVisible(true); + c->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE); c->SetReactState(REACT_AGGRESSIVE); } + if (Creature* c = instance->GetCreature(NPC_FrostswornGeneralGUID)) + { + c->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE); + } WaveNumber = 0; DoUpdateWorldState(WORLD_STATE_HOR_COUNTER, 0); @@ -712,7 +713,6 @@ public: case GO_FRONT_DOOR: return GO_FrontDoorGUID; } - return ObjectGuid::Empty; } @@ -772,7 +772,6 @@ public: ++ur; } } - if (bFinished5Waves) { for (; WaveNumber < 4; ++WaveNumber) @@ -860,9 +859,7 @@ public: num_to_activate = 3; else if (WaveNumber <= 4) num_to_activate = 4; - reqKillCount += num_to_activate; - for (uint8 i = 0; i < num_to_activate; ++i) { uint32 entry = chosenComposition[WaveNumber - (WaveNumber > 5 ? 2 : 1)][i]; @@ -910,7 +907,6 @@ public: c->StopMovingOnCurrentPos(); } memset(&TrashActive, 0, sizeof(TrashActive)); - if (Creature* falric = instance->GetCreature(NPC_FalricGUID)) falric->AI()->EnterEvadeMode(); if (Creature* marwyn = instance->GetCreature(NPC_MarwynGUID)) @@ -1014,7 +1010,6 @@ public: if (Aura* a = pMarwyn->AddAura(SPELL_SHADOWMOURNE_VISUAL, pMarwyn)) a->SetDuration(8000); } - pMarwyn->AI()->Talk(EMOTE_MARWYN_INTRO_SPIRIT); } ++ResumeFirstEventStep; @@ -1035,7 +1030,6 @@ public: } } } - SetData(ACTION_SHOW_TRASH, 1); ResumeFirstEventStep = 0; ResumeFirstEventTimer = 0; @@ -1057,7 +1051,6 @@ public: else ResumeFirstEventTimer -= diff; } - if (outroStep) { if (outroTimer <= diff) @@ -1153,7 +1146,6 @@ public: if (StairsPos[index][i].GetPositionX()) if (GameObject* go = leader->SummonGameObject(TeamIdInInstance == TEAM_ALLIANCE ? GO_STAIRS_ALLIANCE : GO_STAIRS_HORDE, StairsPos[index][i].GetPositionX(), StairsPos[index][i].GetPositionY(), StairsPos[index][i].GetPositionZ(), StairsPos[index][i].GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 86400, false)) go->SetGameObjectFlag(GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); - //Position pos = TeamIdInInstance == TEAM_ALLIANCE ? AllyPortalPos : HordePortalPos; //leader->SummonGameObject(GO_PORTAL_TO_DALARAN, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 86400); //pos = TeamIdInInstance == TEAM_ALLIANCE ? AllyChestPos : HordeChestPos; @@ -1169,6 +1161,7 @@ public: { c->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); c->GetMotionMaster()->MovePoint(0, WalkCaveInPos); + c->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); // need gossip ID 10931 } ++outroStep; outroTimer = 6000; From acc68ef1e23b9c926e98d77bcafb671646ef4e3c Mon Sep 17 00:00:00 2001 From: Tereneckla <50233983+Tereneckla@users.noreply.github.com> Date: Sat, 13 May 2023 18:26:43 +0000 Subject: [PATCH 064/107] fix(Core/Player): Double health regen from spirit (#15955) Update Player.cpp --- src/server/game/Entities/Player/Player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9a258bd7b..0e2b664c9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5143,7 +5143,7 @@ float Player::OCTRegenHPPerSpirit() if (baseSpirit > 50) baseSpirit = 50; float moreSpirit = spirit - baseSpirit; - float regen = baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio; + float regen = (baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio) * 2; return regen; } From 73e61e3234eb416852c38ea564555fb105ebd32a Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Sat, 13 May 2023 21:29:29 +0300 Subject: [PATCH 065/107] fix(DB/SAI): Move Floon,Raliq the Drunk and Sal'salabim to SAI. (#15505) * fix(DB/SAI): Move Floon,Raliq the Drunk and Sal'salabim to SAI. Co-authored-by: aletson * Update Sal * add ooc emote 92 * set SheatheState to 1 --------- Co-authored-by: aletson --- .../rev_1679319177066175200.sql | 53 +++++ .../scripts/Outland/zone_shattrath_city.cpp | 187 ------------------ .../scripts/Outland/zone_terokkar_forest.cpp | 126 ------------ 3 files changed, 53 insertions(+), 313 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1679319177066175200.sql diff --git a/data/sql/updates/pending_db_world/rev_1679319177066175200.sql b/data/sql/updates/pending_db_world/rev_1679319177066175200.sql new file mode 100644 index 000000000..3d0f764c0 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1679319177066175200.sql @@ -0,0 +1,53 @@ +-- Co-authored-by: aletson https://github.com/TrinityCore/TrinityCore/pull/20630 +-- Floon(18588) & Raliq the Drunk(18585) & Sal'salabim(18584) +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` IN (18588,18585,18584); + +-- Floon +DELETE FROM `smart_scripts` WHERE `entryorguid`=18588 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18588, 0, 0, 0, 0, 0, 100, 0, 2000, 2000, 30000, 30000, 0, 11, 6726, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - In Combat - Cast \'Silence\''), +(18588, 0, 1, 0, 0, 0, 100, 0, 4000, 4000, 5000, 5000, 0, 11, 9672, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - In Combat - Cast \'Frostbolt\''), +(18588, 0, 2, 0, 0, 0, 100, 0, 9000, 9000, 20000, 20000, 0, 11, 11831, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - In Combat - Cast \'Frost Nova\''), +(18588, 0, 3, 4, 62, 0, 100, 0, 7731, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - On Gossip Option 0 Selected - Close Gossip'), +(18588, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 2, 1738, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - On Gossip Option 0 Selected - Set Faction Arrakoa'), +(18588, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - On Gossip Option 0 Selected - Say Line 0'), +(18588, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - On Gossip Option 0 Selected - Start Attacking'), +(18588, 0, 7, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Floon - On Reset - Set Default Faction'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 7732; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 7732, 0, 0, 0, 9, 0, 10009, 0, 0, 0, 0, 0, '', 'Floon - Show gossip menu 7732 option id 0 if quest Crackin\' Some Skulls has been taken.'); + +-- Raliq the Drunk +UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE `entry` = 18585; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=18585 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18585, 0, 0, 0, 0, 0, 100, 0, 5000, 5000, 15000, 15000, 0, 11, 10966, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - In Combat - Cast \'Uppercut\''), +(18585, 0, 1, 2, 62, 0, 100, 0, 7729, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - On Gossip Option 0 Selected - Close Gossip'), +(18585, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 0, 2, 45, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - On Gossip Option 0 Selected - Set Faction Ogre'), +(18585, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - On Gossip Option 0 Selected - Say Line 0'), +(18585, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - On Gossip Option 0 Selected - Start Attacking'), +(18585, 0, 5, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - On Reset - Set Default Faction'), +(18585, 0, 6, 0, 1, 0, 100, 0, 0, 0, 3600, 5000, 0, 5, 92, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Raliq the Drunk - Out of Combat - Play Emote 92 (ONESHOT_EAT_NOSHEATHE)'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 7729; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 7729, 0, 0, 0, 9, 0, 10009, 0, 0, 0, 0, 0, '', 'Raliq the Drunk - Show gossip menu 7729 option id 0 if quest Crackin\' Some Skulls has been taken.'); + +-- Sal'salabim +DELETE FROM `smart_scripts` WHERE `entryorguid`=18584 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18584, 0, 0, 0, 9, 0, 100, 0, 8, 40, 15000, 15000, 0, 11, 31705, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - Within 8-40 Range - Cast \'Magnetic Pull\''), +(18584, 0, 1, 2, 62, 0, 100, 0, 7725, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Gossip Option 0 Selected - Close Gossip'), +(18584, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 0, 2, 90, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Gossip Option 0 Selected - Set Faction Demon'), +(18584, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Gossip Option 0 Selected - Say Line 0'), +(18584, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Gossip Option 0 Selected - Start Attacking'), +(18584, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 42, 0, 19, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Gossip Option 0 Selected - Set Invincibility Hp 19%'), +(18584, 0, 6, 7, 2, 0, 100, 1, 0, 20, 0, 0, 0, 15, 10004, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Health Below 20% - Quest Credit \'Patience and Understanding\''), +(18584, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Health Below 20% - Evade'), +(18584, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sal\'salabim - On Reset - Set Default Faction'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 7725; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 7725, 0, 0, 0, 9, 0, 10004, 0, 0, 0, 0, 0, '', 'Sal\'salabim - Show gossip menu 7725 option id 0 if quest Patience and Understanding has been taken.'); diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp index cc2475587..aacd828c1 100644 --- a/src/server/scripts/Outland/zone_shattrath_city.cpp +++ b/src/server/scripts/Outland/zone_shattrath_city.cpp @@ -15,21 +15,6 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Shattrath_City -SD%Complete: 100 -SDComment: Quest support: 10004, 10009, 10211. Flask vendors, Teleport to Caverns of Time -SDCategory: Shattrath City -EndScriptData */ - -/* ContentData -npc_raliq_the_drunk -npc_salsalabim -npc_shattrathflaskvendors -npc_zephyr -npc_kservant -EndContentData */ - #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" @@ -37,176 +22,6 @@ EndContentData */ #include "ScriptedGossip.h" #include "TaskScheduler.h" -/*###### -## npc_raliq_the_drunk -######*/ - -#define GOSSIP_RALIQ "You owe Sim'salabim money. Hand them over or die!" - -enum Raliq -{ - SPELL_UPPERCUT = 10966, - QUEST_CRACK_SKULLS = 10009, - EMOTE_DRINK = 7, -}; - -class npc_raliq_the_drunk : public CreatureScript -{ -public: - npc_raliq_the_drunk() : CreatureScript("npc_raliq_the_drunk") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_OGRE); - creature->AI()->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_RALIQ, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - - SendGossipMenuFor(player, 9440, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_raliq_the_drunkAI(creature); - } - - struct npc_raliq_the_drunkAI : public ScriptedAI - { - npc_raliq_the_drunkAI(Creature* creature) : ScriptedAI(creature) - { - m_uiNormFaction = creature->GetFaction(); - } - - uint32 m_uiNormFaction; - - void Reset() override - { - me->RestoreFaction(); - _scheduler.CancelAll(); - _scheduler.Schedule(5s, [this](TaskContext context) - { - me->HandleEmoteCommand(EMOTE_DRINK); - context.Repeat(5s); - }); - } - - void JustEngagedWith(Unit* /*who*/) override - { - _scheduler - .Schedule(5s, [this](TaskContext context) - { - DoCastVictim(SPELL_UPPERCUT); - context.Repeat(15s); - }); - }; - - void UpdateAI(uint32 diff) override - { - - _scheduler.Update(diff); - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - private: - TaskScheduler _scheduler; - }; -}; - -/*###### -# npc_salsalabim -######*/ - -enum Salsalabim -{ - // Quests - QUEST_10004 = 10004, - - // Spells - SPELL_MAGNETIC_PULL = 31705 -}; - -class npc_salsalabim : public CreatureScript -{ -public: - npc_salsalabim() : CreatureScript("npc_salsalabim") { } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_10004) == QUEST_STATUS_INCOMPLETE) - { - creature->SetFaction(FACTION_DEMON); - creature->AI()->AttackStart(player); - } - else - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); - } - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_salsalabimAI(creature); - } - - struct npc_salsalabimAI : public ScriptedAI - { - npc_salsalabimAI(Creature* creature) : ScriptedAI(creature) { } - - uint32 MagneticPull_Timer; - - void Reset() override - { - MagneticPull_Timer = 15000; - me->RestoreFaction(); - } - - void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType, SpellSchoolMask) override - { - // xinef: some corrections - if (done_by) - if (Player* player = done_by->GetCharmerOrOwnerPlayerOrPlayerItself()) - if (me->HealthBelowPctDamaged(20, damage)) - { - player->GroupEventHappens(QUEST_10004, me); - damage = 0; - EnterEvadeMode(); - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (MagneticPull_Timer <= diff) - { - DoCastVictim(SPELL_MAGNETIC_PULL); - MagneticPull_Timer = 15000; - } - else MagneticPull_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; -}; - /* ################################################## Shattrath City Flask Vendors provides flasks to people exalted with 3 fActions: @@ -436,8 +251,6 @@ public: void AddSC_shattrath_city() { - new npc_raliq_the_drunk(); - new npc_salsalabim(); new npc_shattrathflaskvendors(); new npc_zephyr(); new npc_kservant(); diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index 8e51648b6..bc9f2ca24 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -15,22 +15,6 @@ * with this program. If not, see . */ -/* ScriptData -SDName: Terokkar_Forest -SD%Complete: 85 -SDComment: Quest support: 9889, 10009, 10873, 10896, 10898, 11096, 10052, 10051. Skettis->Ogri'la Flight -SDCategory: Terokkar Forest -EndScriptData */ - -/* ContentData -npc_unkor_the_ruthless -npc_rotting_forest_rager -npc_netherweb_victim -npc_floon -npc_isla_starmane -npc_slim -EndContentData */ - #include "Group.h" #include "Player.h" #include "ScriptMgr.h" @@ -477,115 +461,6 @@ public: }; }; -/*###### -## npc_floon -######*/ - -#define GOSSIP_FLOON1 "You owe Sim'salabim money. Hand them over or die!" -#define GOSSIP_FLOON2 "Hand over the money or die...again!" - -enum Floon -{ - SAY_FLOON_ATTACK = 0, - - SPELL_SILENCE = 6726, - SPELL_FROSTBOLT = 9672, - SPELL_FROST_NOVA = 11831, - - QUEST_CRACK_SKULLS = 10009 -}; - -class npc_floon : public CreatureScript -{ -public: - npc_floon() : CreatureScript("npc_floon") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, 9443, creature->GetGUID()); - } - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - CloseGossipMenuFor(player); - creature->SetFaction(FACTION_ARAKKOA); - creature->AI()->Talk(SAY_FLOON_ATTACK, player); - creature->AI()->AttackStart(player); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_FLOON1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - SendGossipMenuFor(player, 9442, creature->GetGUID()); - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_floonAI(creature); - } - - struct npc_floonAI : public ScriptedAI - { - npc_floonAI(Creature* creature) : ScriptedAI(creature) - { - m_uiNormFaction = creature->GetFaction(); - } - - uint32 m_uiNormFaction; - uint32 Silence_Timer; - uint32 Frostbolt_Timer; - uint32 FrostNova_Timer; - - void Reset() override - { - Silence_Timer = 2000; - Frostbolt_Timer = 4000; - FrostNova_Timer = 9000; - if (me->GetFaction() != m_uiNormFaction) - me->SetFaction(m_uiNormFaction); - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (Silence_Timer <= diff) - { - DoCastVictim(SPELL_SILENCE); - Silence_Timer = 30000; - } - else Silence_Timer -= diff; - - if (FrostNova_Timer <= diff) - { - DoCast(me, SPELL_FROST_NOVA); - FrostNova_Timer = 20000; - } - else FrostNova_Timer -= diff; - - if (Frostbolt_Timer <= diff) - { - DoCastVictim(SPELL_FROSTBOLT); - Frostbolt_Timer = 5000; - } - else Frostbolt_Timer -= diff; - - DoMeleeAttackIfReady(); - } - }; -}; - /*###### ## npc_isla_starmane ######*/ @@ -840,7 +715,6 @@ void AddSC_terokkar_forest() // Theirs new npc_unkor_the_ruthless(); new npc_rotting_forest_rager(); - new npc_floon(); new npc_isla_starmane(); new go_skull_pile(); new npc_slim(); From 440e4baa271872ddfa6829b3057f86d2382480fc Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 13 May 2023 18:45:51 +0000 Subject: [PATCH 066/107] chore(DB): import pending files Referenced commit(s): 73e61e3234eb416852c38ea564555fb105ebd32a --- .../DM_FactoryDoor_Fix.sql => db_world/2023_05_13_03.sql} | 1 + .../2023_05_13_04.sql} | 1 + .../bashir_new_gold_rates.sql => db_world/2023_05_13_05.sql} | 1 + .../correct-scourge-necropoli.sql => db_world/2023_05_13_06.sql} | 1 + .../ravenous_windroc.sql => db_world/2023_05_13_07.sql} | 1 + .../rev_1664500389792248200.sql => db_world/2023_05_13_08.sql} | 1 + .../rev_1668017149389906100.sql => db_world/2023_05_13_09.sql} | 1 + .../rev_1671902937557452500.sql => db_world/2023_05_13_10.sql} | 1 + .../rev_1675983261651004100.sql => db_world/2023_05_13_11.sql} | 1 + .../rev_1679319177066175200.sql => db_world/2023_05_13_12.sql} | 1 + .../warden_pqr.sql => db_world/2023_05_13_13.sql} | 1 + 11 files changed, 11 insertions(+) rename data/sql/updates/{pending_db_world/DM_FactoryDoor_Fix.sql => db_world/2023_05_13_03.sql} (79%) rename data/sql/updates/{pending_db_world/Fix_NPCs_Halls_of_Reflection.sql => db_world/2023_05_13_04.sql} (97%) rename data/sql/updates/{pending_db_world/bashir_new_gold_rates.sql => db_world/2023_05_13_05.sql} (76%) rename data/sql/updates/{pending_db_world/correct-scourge-necropoli.sql => db_world/2023_05_13_06.sql} (87%) rename data/sql/updates/{pending_db_world/ravenous_windroc.sql => db_world/2023_05_13_07.sql} (95%) rename data/sql/updates/{pending_db_world/rev_1664500389792248200.sql => db_world/2023_05_13_08.sql} (97%) rename data/sql/updates/{pending_db_world/rev_1668017149389906100.sql => db_world/2023_05_13_09.sql} (84%) rename data/sql/updates/{pending_db_world/rev_1671902937557452500.sql => db_world/2023_05_13_10.sql} (81%) rename data/sql/updates/{pending_db_world/rev_1675983261651004100.sql => db_world/2023_05_13_11.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1679319177066175200.sql => db_world/2023_05_13_12.sql} (99%) rename data/sql/updates/{pending_db_world/warden_pqr.sql => db_world/2023_05_13_13.sql} (92%) diff --git a/data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql b/data/sql/updates/db_world/2023_05_13_03.sql similarity index 79% rename from data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql rename to data/sql/updates/db_world/2023_05_13_03.sql index 5cc50ac84..e89f8f553 100644 --- a/data/sql/updates/pending_db_world/DM_FactoryDoor_Fix.sql +++ b/data/sql/updates/db_world/2023_05_13_03.sql @@ -1 +1,2 @@ +-- DB update 2023_05_13_02 -> 2023_05_13_03 UPDATE `smart_scripts` SET `action_type`=9, `comment`='Rhahk\'Zor - On Just Died - Activate Gameobject' WHERE `entryorguid`=644 AND `source_type`=0 AND `id`=2 AND `link`=3; diff --git a/data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql b/data/sql/updates/db_world/2023_05_13_04.sql similarity index 97% rename from data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql rename to data/sql/updates/db_world/2023_05_13_04.sql index e48d12093..3a18cf3f9 100644 --- a/data/sql/updates/pending_db_world/Fix_NPCs_Halls_of_Reflection.sql +++ b/data/sql/updates/db_world/2023_05_13_04.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_03 -> 2023_05_13_04 -- SQL Dark Ranger Loralen emote DELETE FROM `creature_template_addon` WHERE (`entry` = 37779); diff --git a/data/sql/updates/pending_db_world/bashir_new_gold_rates.sql b/data/sql/updates/db_world/2023_05_13_05.sql similarity index 76% rename from data/sql/updates/pending_db_world/bashir_new_gold_rates.sql rename to data/sql/updates/db_world/2023_05_13_05.sql index 7ea51d294..f33b87277 100644 --- a/data/sql/updates/pending_db_world/bashir_new_gold_rates.sql +++ b/data/sql/updates/db_world/2023_05_13_05.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_04 -> 2023_05_13_05 -- UPDATE `creature_template` SET `mingold` = 448, `maxgold` = 2520 diff --git a/data/sql/updates/pending_db_world/correct-scourge-necropoli.sql b/data/sql/updates/db_world/2023_05_13_06.sql similarity index 87% rename from data/sql/updates/pending_db_world/correct-scourge-necropoli.sql rename to data/sql/updates/db_world/2023_05_13_06.sql index b03dff702..206c2970a 100644 --- a/data/sql/updates/pending_db_world/correct-scourge-necropoli.sql +++ b/data/sql/updates/db_world/2023_05_13_06.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_05 -> 2023_05_13_06 DELETE FROM `gameobject` WHERE `guid` IN (105000, 105001, 105002, 105003, 105004, 105005, 105014, 105015, 105016, 105017, 105018, 105019, 105020, 105021); DELETE FROM `game_event_gameobject` WHERE `guid` IN (105000, 105001, 105002, 105003, 105004, 105005, 105014, 105015, 105016, 105017, 105018, 105019, 105020, 105021); diff --git a/data/sql/updates/pending_db_world/ravenous_windroc.sql b/data/sql/updates/db_world/2023_05_13_07.sql similarity index 95% rename from data/sql/updates/pending_db_world/ravenous_windroc.sql rename to data/sql/updates/db_world/2023_05_13_07.sql index 9932f7183..c99ff158a 100644 --- a/data/sql/updates/pending_db_world/ravenous_windroc.sql +++ b/data/sql/updates/db_world/2023_05_13_07.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_06 -> 2023_05_13_07 -- UPDATE `smart_scripts` SET `comment` = 'Windroc - In Combat - Cast \'Eagle Claw\'' WHERE `entryorguid` = 17128 AND `source_type` = 0 AND `id` = 0; UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `Entry` = 18220; diff --git a/data/sql/updates/pending_db_world/rev_1664500389792248200.sql b/data/sql/updates/db_world/2023_05_13_08.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1664500389792248200.sql rename to data/sql/updates/db_world/2023_05_13_08.sql index 155250a7d..c936b03c0 100644 --- a/data/sql/updates/pending_db_world/rev_1664500389792248200.sql +++ b/data/sql/updates/db_world/2023_05_13_08.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_07 -> 2023_05_13_08 -- UPDATE `creature_template` SET `AIName`='', `ScriptName`='npc_violet_hold_defense_system' WHERE `entry`=30837; diff --git a/data/sql/updates/pending_db_world/rev_1668017149389906100.sql b/data/sql/updates/db_world/2023_05_13_09.sql similarity index 84% rename from data/sql/updates/pending_db_world/rev_1668017149389906100.sql rename to data/sql/updates/db_world/2023_05_13_09.sql index b2b2a31ff..cb4f59813 100644 --- a/data/sql/updates/pending_db_world/rev_1668017149389906100.sql +++ b/data/sql/updates/db_world/2023_05_13_09.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_08 -> 2023_05_13_09 -- DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 8982); INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES diff --git a/data/sql/updates/pending_db_world/rev_1671902937557452500.sql b/data/sql/updates/db_world/2023_05_13_10.sql similarity index 81% rename from data/sql/updates/pending_db_world/rev_1671902937557452500.sql rename to data/sql/updates/db_world/2023_05_13_10.sql index 8f50cd5ce..8f08ce1de 100644 --- a/data/sql/updates/pending_db_world/rev_1671902937557452500.sql +++ b/data/sql/updates/db_world/2023_05_13_10.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_09 -> 2023_05_13_10 -- UPDATE `creature_template` SET `ScriptName` = 'boss_swamplord_muselek', `AIName`= '' WHERE `entry` = 17826; DELETE FROM `smart_scripts` WHERE `entryorguid` = 17826 AND `source_type` = 0; diff --git a/data/sql/updates/pending_db_world/rev_1675983261651004100.sql b/data/sql/updates/db_world/2023_05_13_11.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1675983261651004100.sql rename to data/sql/updates/db_world/2023_05_13_11.sql index 701361487..3448ceedf 100644 --- a/data/sql/updates/pending_db_world/rev_1675983261651004100.sql +++ b/data/sql/updates/db_world/2023_05_13_11.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_10 -> 2023_05_13_11 -- DELETE FROM `creature_template_addon` WHERE `entry` IN (32838,34679,29945,29855,28857,27351,25196,37993, 37998, 1312, 4984, 5510, 5516, 12791, 13358, 13359, 14489, 25195,28049); diff --git a/data/sql/updates/pending_db_world/rev_1679319177066175200.sql b/data/sql/updates/db_world/2023_05_13_12.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1679319177066175200.sql rename to data/sql/updates/db_world/2023_05_13_12.sql index 3d0f764c0..e144803ba 100644 --- a/data/sql/updates/pending_db_world/rev_1679319177066175200.sql +++ b/data/sql/updates/db_world/2023_05_13_12.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_11 -> 2023_05_13_12 -- Co-authored-by: aletson https://github.com/TrinityCore/TrinityCore/pull/20630 -- Floon(18588) & Raliq the Drunk(18585) & Sal'salabim(18584) UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` IN (18588,18585,18584); diff --git a/data/sql/updates/pending_db_world/warden_pqr.sql b/data/sql/updates/db_world/2023_05_13_13.sql similarity index 92% rename from data/sql/updates/pending_db_world/warden_pqr.sql rename to data/sql/updates/db_world/2023_05_13_13.sql index a187764b1..f7e4402af 100644 --- a/data/sql/updates/pending_db_world/warden_pqr.sql +++ b/data/sql/updates/db_world/2023_05_13_13.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_12 -> 2023_05_13_13 DELETE FROM `warden_checks` WHERE `id` IN (795,796); INSERT INTO `warden_checks` (`id`, `type`, `data`, `str`, `address`, `length`, `result`, `comment`) VALUES (795, 139, NULL, 'local f=DEFAULT_CHAT_FRAME for i=1,f:GetNumMessages() do if (f:GetMessageInfo(i)):find("Rotation Mode Disable") then return true end end', NULL, NULL, NULL, 'Detects PQR'), From a5d334db8ba5bda37eeafdc034d47ad17e001815 Mon Sep 17 00:00:00 2001 From: Tereneckla <50233983+Tereneckla@users.noreply.github.com> Date: Sat, 13 May 2023 19:35:47 +0000 Subject: [PATCH 067/107] fix(Core/Spells): Seal of Command, Seal of Vengeance and Seal of Corruption do not benefit from percentage damage increases (#15940) * Update SpellInfoCorrections.cpp * Update SpellInfoCorrections.cpp --- src/server/game/Spells/SpellInfoCorrections.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index e8f602e2b..219a94846 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -213,6 +213,15 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->MaxAffectedTargets = 4; }); + ApplySpellFix({ + 20424, // Seal of Command + 42463, // Seal of Vengeance + 53739 // Seal of Corruption + }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx3 |= SPELL_ATTR3_IGNORE_CASTER_MODIFIERS; + }); + // Spitfire Totem ApplySpellFix({ 38296 }, [](SpellInfo* spellInfo) { From 7e258bbd28f3f4a932f37bbe9df62a0370196e2f Mon Sep 17 00:00:00 2001 From: Dan <83884799+elthehablo@users.noreply.github.com> Date: Sat, 13 May 2023 21:36:07 +0200 Subject: [PATCH 068/107] fix(Scripts/ShatteredHalls): fix some timers/mechanics of Grand Warlock Nethekurse (#16167) --- .../add_areatrigger_nethekurse.sql | 4 + .../gully_netherkurse_sql_lines.sql | 26 ++ .../ShatteredHalls/boss_nethekurse.cpp | 271 +++++++++++++----- .../instance_shattered_halls.cpp | 10 + 4 files changed, 237 insertions(+), 74 deletions(-) create mode 100644 data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql create mode 100644 data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql diff --git a/data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql b/data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql new file mode 100644 index 000000000..5a2cc0208 --- /dev/null +++ b/data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `areatrigger_scripts` WHERE `entry` = 4347 AND `ScriptName` = 'at_rp_nethekurse'; +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(4347, 'at_rp_nethekurse'); diff --git a/data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql b/data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql new file mode 100644 index 000000000..3e2638473 --- /dev/null +++ b/data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql @@ -0,0 +1,26 @@ +DELETE FROM `creature_text` WHERE `CreatureID` = 16807; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(16807, 0, 0, 'You wish to fight us all at once? This should be amusing!\n', 14, 0, 100, 0, 0, 10262, 15594, 0, 'Netherkurse AGGRO_1'), +(16807, 1, 0, 'Thank you for saving me the trouble. Now it\'s my turn to have some fun!\n', 14, 0, 100, 0, 0, 10270, 15589, 0, 'Netherkurse AGGRO_2'), +(16807, 2, 0, 'You can have that one, I no longer need him!', 14, 0, 100, 0, 0, 10263, 15569, 0, 'Netherkurse PEON_ATTACK_1'), +(16807, 2, 1, 'Yes, beat him mercilessly! His skull is as thick as an ogre\'s!\n', 14, 0, 100, 0, 0, 10264, 15575, 0, 'Netherkurse PEON_ATTACK_2'), +(16807, 2, 2, 'Don\'t waste your time on that one, he\'s weak!', 14, 0, 100, 0, 0, 10265, 15573, 0, 'Netherkurse PEON_ATTACK_3'), +(16807, 2, 3, 'You want him? Very well, take him!', 14, 0, 100, 0, 0, 10266, 15572, 0, 'Netherkurse PEON_ATTACK_4'), +(16807, 3, 0, 'One pitiful wretch down. Go on, take another one! ', 14, 0, 100, 0, 0, 10267, 15579, 0, 'Netherkurse PEON_DIE_1'), +(16807, 3, 1, 'Ah, what a waste... next!', 14, 0, 100, 0, 0, 10268, 15584, 0, 'Netherkurse PEON_DIE_2'), +(16807, 3, 2, 'I was going to kill him anyway!', 14, 0, 100, 0, 0, 10269, 15582, 0, 'Netherkurse PEON_DIE_3'), +(16807, 4, 0, 'Beg for your pitiful life!', 14, 0, 100, 0, 0, 10259, 14130, 0, 'Netherkurse SAY_SHADOW_SEAR'), +(16807, 5, 0, 'Your pain amuses me!', 14, 0, 100, 0, 0, 10261, 14148, 0, 'Netherkurse SAY_SHADOW_FISSURE'), +(16807, 6, 0, 'Run, coward, run! ', 14, 0, 100, 0, 0, 10260, 14132, 0, 'Netherkurse SAY_DEATH_COIL'), +(16807, 7, 0, 'I\'m already bored!', 14, 0, 100, 0, 0, 10271, 16864, 0, 'Netherkurse SAY_SLAY_1'), +(16807, 7, 1, 'Come on, show me a real fight!', 14, 0, 100, 0, 0, 10272, 15595, 0, 'Netherkurse SAY_SLAY_2'), +(16807, 7, 2, 'I had more fun torturing the peons!', 14, 0, 100, 0, 0, 10273, 16863, 0, 'Netherkurse SAY_SLAY_3'), +(16807, 7, 3, 'You lose.', 14, 0, 100, 0, 0, 10274, 16865, 0, 'Netherkurse SAY_SLAY_4'), +(16807, 7, 4, 'Oh, just die!', 14, 0, 100, 0, 0, 10275, 16866, 0, 'Netherkurse SAY_SLAY_5'), +(16807, 8, 0, 'What... a shame.', 14, 0, 100, 0, 0, 10276, 16862, 0, 'Netherkurse SAY_DIE'); + +-- Auras for Shadow Fissures +DELETE FROM `creature_template_addon` WHERE `entry` IN (18370, 20598); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(18370, 0, 0, 0, 0, 0, 0, '32250'), +(20598, 0, 0, 0, 0, 0, 0, '32250'); -- Same aura in heroic diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index f41f81900..f74bb1aa3 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -23,12 +23,14 @@ enum eGrandWarlockNethekurse { SAY_INTRO = 0, - SAY_PEON_ATTACKED = 1, - SAY_PEON_DIES = 2, - SAY_TAUNT = 3, - SAY_AGGRO = 4, - SAY_SLAY = 5, - SAY_DIE = 6, + SAY_INTRO_2 = 1, + SAY_PEON_ATTACKED = 2, + SAY_PEON_DIES = 3, + SAY_SHADOW_SEAR = 4, + SAY_SHADOW_FISSURE = 5, + SAY_DEATH_COIL = 6, + SAY_SLAY = 7, + SAY_DIE = 8, SPELL_DEATH_COIL_N = 30500, SPELL_DEATH_COIL_H = 35954, @@ -40,13 +42,10 @@ enum eGrandWarlockNethekurse // Spells used exclusively in RP SPELL_SHADOW_SEAR = 30735, SPELL_DEATH_COIL = 30741, + SPELL_SHADOW_FISSURE_RP = 30745, EVENT_INTRO = 1, - EVENT_SPELL_DEATH_COIL = 2, - EVENT_SPELL_SHADOW_FISSURE = 3, - EVENT_SPELL_CLEAVE = 4, - EVENT_CHECK_HEALTH = 5, - EVENT_START_ATTACK = 6, + EVENT_START_ATTACK = 2, EVENT_STAGE_NONE = 0, EVENT_STAGE_INTRO = 1, @@ -55,13 +54,38 @@ enum eGrandWarlockNethekurse SETDATA_DATA = 1, SETDATA_PEON_AGGRO = 1, - SETDATA_PEON_DEATH = 2 + SETDATA_PEON_DEATH = 2, +}; + +enum Creatures +{ + NPC_PEON = 17083 +}; + +enum Groups +{ + GROUP_RP = 0, +}; + +enum Actions +{ + ACTION_START_INTRO = 0, + ACTION_CANCEL_INTRO = 1, + ACTION_START_COMBAT = 2, }; // ######################################################## // Grand Warlock Nethekurse // ######################################################## +float NethekurseIntroPath[4][3] = +{ + {184.78966f, 290.3699f, -8.18139f}, + {178.51125f, 278.779022f, -8.183065f}, + {171.82281f, 289.97687f, -8.185595f}, + {178.51125f, 287.97794f, -8.183065f} +}; + class boss_grand_warlock_nethekurse : public CreatureScript { public: @@ -69,7 +93,13 @@ public: struct boss_grand_warlock_nethekurseAI : public BossAI { - boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { } + boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) + { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } EventMap events2; void Reset() override @@ -77,6 +107,10 @@ public: EventStage = EVENT_STAGE_NONE; _Reset(); events2.Reset(); + + ScheduleHealthCheckEvent(25, [&] { + DoCastSelf(SPELL_DARK_SPIN); + }); } void JustDied(Unit* /*killer*/) override @@ -97,21 +131,35 @@ public: return; if (EventStage < EVENT_STAGE_TAUNT) + { Talk(SAY_PEON_ATTACKED); + } break; case SETDATA_PEON_DEATH: if (PeonKilledCount >= 4) return; if (EventStage < EVENT_STAGE_TAUNT) - Talk(SAY_PEON_DIES); - + { + PeonDieRP(); + } if (++PeonKilledCount == 4) - events2.ScheduleEvent(EVENT_START_ATTACK, 5000); + DoAction(ACTION_CANCEL_INTRO); break; } } + void PeonDieRP() + { + me->GetMotionMaster()->Clear(); + me->SetFacingTo(4.572762489318847656f); + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) + { + me->HandleEmoteCommand(EMOTE_ONESHOT_APPLAUD); + Talk(SAY_PEON_DIES); + }); + } + void AttackStart(Unit* who) override { if (EventStage < EVENT_STAGE_MAIN) @@ -120,40 +168,87 @@ public: if (me->Attack(who, true)) { DoStartMovement(who); + CombatEventScheduler(); } } - void MoveInLineOfSight(Unit* who) override + void CombatEventScheduler() { - if (me->IsWithinDistInMap(who, 30.0f)) + scheduler.Schedule(12150ms, 19850ms, [this](TaskContext context) { - if (who->GetTypeId() != TYPEID_PLAYER) - return; - - if (EventStage == EVENT_STAGE_NONE && PeonKilledCount < 4) + if (me->HealthBelowPct(90)) { - events2.ScheduleEvent(EVENT_INTRO, 90000); - Talk(SAY_INTRO); - EventStage = EVENT_STAGE_INTRO; - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); - me->SetInCombatWithZone(); + DoCastRandomTarget(DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), 0, 30.0f, true); } - else if (PeonKilledCount >= 4) + context.Repeat(); + }).Schedule(8100ms, 17300ms, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_SHADOW_FISSURE, 0, 60.0f, true); + context.Repeat(8450ms, 9450ms); + }).Schedule(10950ms, 21850ms, [this](TaskContext context) + { + DoCastVictim(DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H)); + context.Repeat(1200ms, 23900ms); + }); + } + + void MoveInLineOfSight(Unit* /*who*/) override + { + if (EventStage == EVENT_STAGE_NONE) + { + if (me->SelectNearestPlayer(30.0f)) { - events2.ScheduleEvent(EVENT_START_ATTACK, 1000); - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); - me->SetInCombatWithZone(); + DoAction(ACTION_CANCEL_INTRO); } } + } - if (EventStage < EVENT_STAGE_MAIN) - return; - - ScriptedAI::MoveInLineOfSight(who); + void IntroRP() + { + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext context) + { + me->GetMotionMaster()->Clear(); + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) + { + uint32 choicelocation = urand(1, 3); + me->GetMotionMaster()->MoveIdle(); + me->GetMotionMaster()->MovePoint(0, NethekurseIntroPath[choicelocation][0], NethekurseIntroPath[choicelocation][1], NethekurseIntroPath[choicelocation][2]); + scheduler.Schedule(2500ms, GROUP_RP, [this, choicelocation](TaskContext /*context*/) + { + CastRandomPeonSpell(choicelocation); + }); + }); + context.Repeat(16400ms, 28500ms); + }); } void JustEngagedWith(Unit* /*who*/) override { + _JustEngagedWith(); + if (EventStage == EVENT_STAGE_NONE) + { + DoAction(ACTION_CANCEL_INTRO); + CombatEventScheduler(); + } + } + + void CastRandomPeonSpell(uint32 choice) + { + if (choice == 1) + { + Talk(SAY_DEATH_COIL); + me->CastSpell(me, SPELL_DEATH_COIL, false); + } + else if (choice == 2) + { + Talk(SAY_SHADOW_FISSURE); + me->CastSpell(me, SPELL_SHADOW_FISSURE_RP, false); + } + else if (choice == 3) + { + Talk(SAY_SHADOW_SEAR); + me->CastSpell(me, SPELL_SHADOW_SEAR, false); + } } void KilledUnit(Unit* /*victim*/) override @@ -161,29 +256,59 @@ public: Talk(SAY_SLAY); } + void DoAction(int32 action) override + { + if (action == ACTION_CANCEL_INTRO) + { + introDone = true; + scheduler.CancelGroup(GROUP_RP); + events2.ScheduleEvent(EVENT_START_ATTACK, 1000); + instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); + me->SetInCombatWithZone(); + Talk(SAY_INTRO_2); + me->SetHomePosition(NethekurseIntroPath[3][0], NethekurseIntroPath[3][1], NethekurseIntroPath[3][2], 4.572762489318847656f); + me->RemoveUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); + return; + } + + if (action != ACTION_START_INTRO) + { + return; + } + + if (ATreached == true) + { + return; + } + + ATreached = true; + me->SetUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); + events2.ScheduleEvent(EVENT_INTRO, 90000); + Talk(SAY_INTRO); + EventStage = EVENT_STAGE_INTRO; + instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); + me->SetInCombatWithZone(); + IntroRP(); + } + void UpdateAI(uint32 diff) override { events2.Update(diff); + scheduler.Update(diff); uint32 eventId = events2.ExecuteEvent(); if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) { if (eventId == EVENT_INTRO) { - Talk(SAY_TAUNT); EventStage = EVENT_STAGE_TAUNT; - me->CastSpell(me, SPELL_SHADOW_SEAR, false); } else if (eventId == EVENT_START_ATTACK) { - Talk(SAY_AGGRO); EventStage = EVENT_STAGE_MAIN; if (Unit* target = me->SelectNearestPlayer(50.0f)) AttackStart(target); - - events.ScheduleEvent(EVENT_SPELL_DEATH_COIL, 20000); - events.ScheduleEvent(EVENT_SPELL_SHADOW_FISSURE, 8000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + DoAction(ACTION_CANCEL_INTRO); return; } } @@ -191,40 +316,10 @@ public: if (!UpdateVictim()) return; - events.Update(diff); if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING)) return; - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_SHADOW_FISSURE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_SHADOW_FISSURE, false); - events.RescheduleEvent(EVENT_SPELL_SHADOW_FISSURE, urand(7500, 10000)); - break; - case EVENT_SPELL_DEATH_COIL: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), false); - events.RescheduleEvent(EVENT_SPELL_DEATH_COIL, urand(15000, 20000)); - break; - case EVENT_SPELL_CLEAVE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H), false); - events.RescheduleEvent(EVENT_SPELL_CLEAVE, urand(6000, 8000)); - break; - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(21)) - { - events.Reset(); - me->CastSpell(me, SPELL_DARK_SPIN, false); - } - else - { - events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000); - } - break; - } - - if (!me->HealthBelowPct(21)) + if (!me->HealthBelowPct(25)) DoMeleeAttackIfReady(); } @@ -232,6 +327,8 @@ public: uint8 PeonEngagedCount = 0; uint8 PeonKilledCount = 0; uint8 EventStage; + bool introDone; + bool ATreached = false; }; CreatureAI* GetAI(Creature* creature) const override @@ -251,7 +348,7 @@ public: void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - amount = 1000; + amount = 0; } void Register() override @@ -302,10 +399,36 @@ public: return new spell_tsh_shadow_bolt_SpellScript(); } }; +class at_rp_nethekurse : public AreaTriggerScript +{ +public: + at_rp_nethekurse() : AreaTriggerScript + ("at_rp_nethekurse") { } + + bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override + { + if (player->IsGameMaster()) + { + return false; + } + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (instance->GetBossState(DATA_NETHEKURSE) != DONE && instance->GetBossState(DATA_NETHEKURSE) != IN_PROGRESS) + { + if (Creature* nethekurse = instance->GetCreature(DATA_NETHEKURSE)) + { + nethekurse->AI()->DoAction(ACTION_START_INTRO); + } + } + } + return false; + } +}; void AddSC_boss_grand_warlock_nethekurse() { new boss_grand_warlock_nethekurse(); new spell_tsh_shadow_sear(); new spell_tsh_shadow_bolt(); + new at_rp_nethekurse(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index 161393275..4860b4207 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -20,6 +20,13 @@ #include "ScriptMgr.h" #include "shattered_halls.h" +ObjectData const creatureData[] = +{ + { NPC_GRAND_WARLOCK_NETHEKURSE , DATA_NETHEKURSE }, + { NPC_WARCHIEF_KARGATH , DATA_KARGATH }, + { 0, 0 } +}; + class instance_shattered_halls : public InstanceMapScript { public: @@ -37,6 +44,7 @@ public: void Initialize() override { SetBossNumber(ENCOUNTER_COUNT); + LoadObjectData(creatureData, nullptr); TeamIdInInstance = TEAM_NEUTRAL; RescueTimer = 100 * MINUTE * IN_MILLISECONDS; @@ -101,6 +109,7 @@ public: prisonerGUID[2] = creature->GetGUID(); break; } + InstanceScript::OnCreatureCreate(creature); } bool SetBossState(uint32 type, EncounterState state) override @@ -198,6 +207,7 @@ public: protected: ObjectGuid warchiefKargathGUID; + ObjectGuid grandWarlockNethekurseGUID; ObjectGuid nethekurseDoor1GUID; ObjectGuid nethekurseDoor2GUID; From 2399137f16a5fb938b95201cf32f506d38f211b4 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 13 May 2023 19:38:25 +0000 Subject: [PATCH 069/107] chore(DB): import pending files Referenced commit(s): 7e258bbd28f3f4a932f37bbe9df62a0370196e2f --- .../2023_05_13_14.sql} | 1 + .../2023_05_13_15.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/add_areatrigger_nethekurse.sql => db_world/2023_05_13_14.sql} (81%) rename data/sql/updates/{pending_db_world/gully_netherkurse_sql_lines.sql => db_world/2023_05_13_15.sql} (98%) diff --git a/data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql b/data/sql/updates/db_world/2023_05_13_14.sql similarity index 81% rename from data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql rename to data/sql/updates/db_world/2023_05_13_14.sql index 5a2cc0208..5083ad5d3 100644 --- a/data/sql/updates/pending_db_world/add_areatrigger_nethekurse.sql +++ b/data/sql/updates/db_world/2023_05_13_14.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_13 -> 2023_05_13_14 -- DELETE FROM `areatrigger_scripts` WHERE `entry` = 4347 AND `ScriptName` = 'at_rp_nethekurse'; INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES diff --git a/data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql b/data/sql/updates/db_world/2023_05_13_15.sql similarity index 98% rename from data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql rename to data/sql/updates/db_world/2023_05_13_15.sql index 3e2638473..2a7403240 100644 --- a/data/sql/updates/pending_db_world/gully_netherkurse_sql_lines.sql +++ b/data/sql/updates/db_world/2023_05_13_15.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_14 -> 2023_05_13_15 DELETE FROM `creature_text` WHERE `CreatureID` = 16807; INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES (16807, 0, 0, 'You wish to fight us all at once? This should be amusing!\n', 14, 0, 100, 0, 0, 10262, 15594, 0, 'Netherkurse AGGRO_1'), From 0ce44c3a929e13c847f9ad0f20d953946d089cbf Mon Sep 17 00:00:00 2001 From: Tereneckla <50233983+Tereneckla@users.noreply.github.com> Date: Sun, 14 May 2023 02:20:31 +0000 Subject: [PATCH 070/107] Revert "fix(DB/Conditions): Gordok Shackle Key should not be seen if you already have one. (#12792)" Create rev_1683957297429455600.sql --- data/sql/updates/pending_db_world/rev_1683957297429455600.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683957297429455600.sql diff --git a/data/sql/updates/pending_db_world/rev_1683957297429455600.sql b/data/sql/updates/pending_db_world/rev_1683957297429455600.sql new file mode 100644 index 000000000..2669c2364 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683957297429455600.sql @@ -0,0 +1 @@ +DELETE FROM `conditions` WHERE `SourceEntry` = 18250 AND `SourceTypeOrReferenceId` = 1 AND `ConditionTypeOrReference` = 2; From 3ae80f3db4d5407765c6377b79ce16e28f7ac2f3 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Sat, 13 May 2023 20:22:01 -0600 Subject: [PATCH 071/107] fix(DB/Creature): Adjust Flameshocker (#16194) * init * Update data/sql/updates/pending_db_world/rev_1683530792489127900.sql * Update data/sql/updates/pending_db_world/rev_1683530792489127900.sql --- .../pending_db_world/rev_1683530792489127900.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1683530792489127900.sql diff --git a/data/sql/updates/pending_db_world/rev_1683530792489127900.sql b/data/sql/updates/pending_db_world/rev_1683530792489127900.sql new file mode 100644 index 000000000..0459b918c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1683530792489127900.sql @@ -0,0 +1,10 @@ +-- +UPDATE `creature_template` SET `minlevel`=63, `maxlevel`=63, `AIName`='SmartAI' WHERE `entry`=16383; + +DELETE FROM `creature_template_addon` WHERE `entry`=16383; +INSERT INTO `creature_template_addon` (`entry`, `auras`) VALUES (16383, '28330'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 16383); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16383, 0, 0, 0, 0, 0, 100, 0, 5000, 10000, 10000, 20000, 0, 11, 28314, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Flameshocker - In Combat - Cast \'Flameshocker`s Touch\''), +(16383, 0, 1, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 11, 28323, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Flameshocker - On Just Died - Cast \'Flameshocker`s Revenge\''); From 3cf170a5ff763059bb4a5ad386abd1cf0f00a15a Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Sun, 14 May 2023 05:22:49 +0300 Subject: [PATCH 072/107] fix(DB/Quest): Add RP for Quest - `Strange Brew` completion. (#16098) --- .../pending_db_world/rev_1682576689740907500.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1682576689740907500.sql diff --git a/data/sql/updates/pending_db_world/rev_1682576689740907500.sql b/data/sql/updates/pending_db_world/rev_1682576689740907500.sql new file mode 100644 index 000000000..ea3a546ba --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1682576689740907500.sql @@ -0,0 +1,10 @@ +-- 21151 (Borgrim Stouthammer) +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 21151; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 21151); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(21151, 0, 0, 0, 20, 0, 100, 0, 10511, 0, 0, 0, 0, 80, 2115100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Borgrim Stouthammer - On Quest \'Strange Brew\' Finished - Run Script'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2115100); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(2115100, 9, 0, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Borgrim Stouthammer - Actionlist - Say Line 0'); From 89acad2145cb555148f01101001a9460b4066bef Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 14 May 2023 02:25:20 +0000 Subject: [PATCH 073/107] chore(DB): import pending files Referenced commit(s): 3cf170a5ff763059bb4a5ad386abd1cf0f00a15a --- .../rev_1682576689740907500.sql => db_world/2023_05_14_00.sql} | 1 + .../rev_1683530792489127900.sql => db_world/2023_05_14_01.sql} | 1 + .../rev_1683957297429455600.sql => db_world/2023_05_14_02.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/rev_1682576689740907500.sql => db_world/2023_05_14_00.sql} (97%) rename data/sql/updates/{pending_db_world/rev_1683530792489127900.sql => db_world/2023_05_14_01.sql} (96%) rename data/sql/updates/{pending_db_world/rev_1683957297429455600.sql => db_world/2023_05_14_02.sql} (73%) diff --git a/data/sql/updates/pending_db_world/rev_1682576689740907500.sql b/data/sql/updates/db_world/2023_05_14_00.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1682576689740907500.sql rename to data/sql/updates/db_world/2023_05_14_00.sql index ea3a546ba..91e19fbba 100644 --- a/data/sql/updates/pending_db_world/rev_1682576689740907500.sql +++ b/data/sql/updates/db_world/2023_05_14_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_13_15 -> 2023_05_14_00 -- 21151 (Borgrim Stouthammer) UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 21151; diff --git a/data/sql/updates/pending_db_world/rev_1683530792489127900.sql b/data/sql/updates/db_world/2023_05_14_01.sql similarity index 96% rename from data/sql/updates/pending_db_world/rev_1683530792489127900.sql rename to data/sql/updates/db_world/2023_05_14_01.sql index 0459b918c..f94a24969 100644 --- a/data/sql/updates/pending_db_world/rev_1683530792489127900.sql +++ b/data/sql/updates/db_world/2023_05_14_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_00 -> 2023_05_14_01 -- UPDATE `creature_template` SET `minlevel`=63, `maxlevel`=63, `AIName`='SmartAI' WHERE `entry`=16383; diff --git a/data/sql/updates/pending_db_world/rev_1683957297429455600.sql b/data/sql/updates/db_world/2023_05_14_02.sql similarity index 73% rename from data/sql/updates/pending_db_world/rev_1683957297429455600.sql rename to data/sql/updates/db_world/2023_05_14_02.sql index 2669c2364..0a45d0722 100644 --- a/data/sql/updates/pending_db_world/rev_1683957297429455600.sql +++ b/data/sql/updates/db_world/2023_05_14_02.sql @@ -1 +1,2 @@ +-- DB update 2023_05_14_01 -> 2023_05_14_02 DELETE FROM `conditions` WHERE `SourceEntry` = 18250 AND `SourceTypeOrReferenceId` = 1 AND `ConditionTypeOrReference` = 2; From 7fcb57e5ab4a42ad39305962d01e8ee914ef0dcc Mon Sep 17 00:00:00 2001 From: "Keller (KJack)" Date: Sun, 14 May 2023 06:26:12 -0400 Subject: [PATCH 074/107] feat(Core/Loot): Add `Rate.Drop.Item.GroupAmount` to increase loot generated from loot groups (#16220) * Adds the `Rate.Drop.Item.GroupAmount` setting to the world config. Causes top-level loot groups to drop multiple items. Does not affect references. * Don't multiply a group if a quest item gets selected. Avoids strange situations like Arcanist Doan having three hearts. * Resolve syntax error. * Fix whitespace * Fix code style issue --- .../apps/worldserver/worldserver.conf.dist | 22 +++++---- src/server/game/Loot/LootMgr.cpp | 47 +++++++++++++++---- src/server/game/Loot/LootMgr.h | 2 +- src/server/game/World/IWorld.h | 2 +- src/server/game/World/World.cpp | 2 + 5 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index ac3935a12..8f751fad4 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -2267,7 +2267,20 @@ Rate.Drop.Item.Artifact = 1 Rate.Drop.Item.Referenced = 1 Rate.Drop.Money = 1 -# RewardBonusMoney +# Rate.Drop.Item.ReferencedAmount +# Description: Multiplier for referenced loot amount. Makes many raid bosses (and others) drop additional loot. +# Default: 1 + +Rate.Drop.Item.ReferencedAmount = 1 + +# +# Rate.Drop.Item.GroupAmount +# Description: Multiplier for grouped items. Makes many dungeon bosses (and others) drop additional loot. +# Default: 1 + +Rate.Drop.Item.GroupAmount = 1 + +# Rate.RewardBonusMoney # Description: Allows to further tweak the amount of extra money rewarded by quests when the player # is at MaxPlayerLevel (this amount is specified in quest_template.RewardBonusMoney). # NOTE: the final amount will also affected by Rate.Drop.Money @@ -2331,13 +2344,6 @@ Rate.BuyValue.Item.Legendary = 1 Rate.BuyValue.Item.Artifact = 1 Rate.BuyValue.Item.Heirloom = 1 -# -# Rate.Drop.Item.ReferencedAmount -# Description: Multiplier for referenced loot amount. -# Default: 1 - -Rate.Drop.Item.ReferencedAmount = 1 - # # Rate.XP.Kill # Rate.XP.Quest diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 7d64fed6e..94d328dfe 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -100,7 +100,7 @@ public: bool HasQuestDrop(LootTemplateMap const& store) const; // True if group includes at least 1 quest drop entry bool HasQuestDropForPlayer(Player const* player, LootTemplateMap const& store) const; // The same for active quests of the player - void Process(Loot& loot, Player const* player, LootStore const& lootstore, uint16 lootMode) const; // Rolls an item from the group (if any) and adds the item to the loot + void Process(Loot& loot, Player const* player, LootStore const& lootstore, uint16 lootMode, uint16 nonRefIterationsLeft) const; // Rolls an item from the group (if any) and adds the item to the loot float RawTotalChance() const; // Overall chance for the group (without equal chanced items) float TotalChance() const; // Overall chance for the group @@ -570,7 +570,8 @@ bool Loot::FillLoot(uint32 lootId, LootStore const& store, Player* lootOwner, bo items.reserve(MAX_NR_LOOT_ITEMS); quest_items.reserve(MAX_NR_QUEST_ITEMS); - tab->Process(*this, store, lootMode, lootOwner); // Processing is done there, callback via Loot::AddItem() + // Initial group is 0, top level set to True + tab->Process(*this, store, lootMode, lootOwner, 0, true); // Processing is done there, callback via Loot::AddItem() sScriptMgr->OnAfterLootTemplateProcess(this, tab, store, lootOwner, personal, noEmptyError, lootMode); @@ -1413,7 +1414,7 @@ void LootTemplate::LootGroup::CopyConditions(ConditionList /*conditions*/) } // Rolls an item from the group (if any takes its chance) and adds the item to the loot -void LootTemplate::LootGroup::Process(Loot& loot, Player const* player, LootStore const& store, uint16 lootMode) const +void LootTemplate::LootGroup::Process(Loot& loot, Player const* player, LootStore const& store, uint16 lootMode, uint16 nonRefIterationsLeft) const { if (LootStoreItem const* item = Roll(loot, player, store, lootMode)) { @@ -1426,7 +1427,9 @@ void LootTemplate::LootGroup::Process(Loot& loot, Player const* player, LootStor uint32 maxcount = uint32(float(item->maxcount) * sWorld->getRate(RATE_DROP_ITEM_REFERENCED_AMOUNT)); sScriptMgr->OnAfterRefCount(player, loot, rate, lootMode, const_cast(item), maxcount, store); for (uint32 loop = 0; loop < maxcount; ++loop) // Ref multiplicator - Referenced->Process(loot, store, lootMode, player, item->groupid); + // This reference needs to be processed further, but it is marked isTopLevel=false so that any groups inside + // the reference are not multiplied by Rate.Drop.Item.GroupAmount + Referenced->Process(loot, store, lootMode, player, item->groupid, false); } } else @@ -1434,6 +1437,14 @@ void LootTemplate::LootGroup::Process(Loot& loot, Player const* player, LootStor // Plain entries (not a reference, not grouped) sScriptMgr->OnBeforeDropAddItem(player, loot, rate, lootMode, const_cast(item), store); loot.AddItem(*item); // Chance is already checked, just add + + // If we still have non-ref runs to do for this group AND this item wasn't a reference, + // recursively call this function to produce more items for this group. + // However, if this is a quest item we shouldn't multiply this group. + if (nonRefIterationsLeft > 1 && !item->needs_quest) + { + this->Process(loot, player, store, lootMode, nonRefIterationsLeft-1); + } } } } @@ -1665,7 +1676,7 @@ bool LootTemplate::CopyConditions(LootItem* li, uint32 conditionLootId) const } // Rolls for every item in the template and adds the rolled items the the loot -void LootTemplate::Process(Loot& loot, LootStore const& store, uint16 lootMode, Player const* player, uint8 groupId) const +void LootTemplate::Process(Loot& loot, LootStore const& store, uint16 lootMode, Player const* player, uint8 groupId, bool isTopLevel) const { bool rate = store.IsRatesAllowed(); @@ -1677,7 +1688,15 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint16 lootMode, if (!Groups[groupId - 1]) return; - Groups[groupId - 1]->Process(loot, player, store, lootMode); + // Rate.Drop.Item.GroupAmount is only in effect for the top loot template level + if (isTopLevel) + { + Groups[groupId - 1]->Process(loot, player, store, lootMode, sWorld->getRate(RATE_DROP_ITEM_GROUP_AMOUNT)); + } + else + { + Groups[groupId - 1]->Process(loot, player, store, lootMode, 0); + } return; } @@ -1687,7 +1706,6 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint16 lootMode, LootStoreItem* item = *i; if (!(item->lootmode & lootMode)) // Do not add if mode mismatch continue; - if (!item->Roll(rate, player, loot, store)) continue; // Bad luck for the entry @@ -1700,7 +1718,8 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint16 lootMode, uint32 maxcount = uint32(float(item->maxcount) * sWorld->getRate(RATE_DROP_ITEM_REFERENCED_AMOUNT)); sScriptMgr->OnAfterRefCount(player, loot, rate, lootMode, item, maxcount, store); for (uint32 loop = 0; loop < maxcount; ++loop) // Ref multiplicator - Referenced->Process(loot, store, lootMode, player, item->groupid); + // we're no longer in the top level, so isTopLevel is false + Referenced->Process(loot, store, lootMode, player, item->groupid, false); } else { @@ -1713,7 +1732,17 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint16 lootMode, // Now processing groups for (LootGroups::const_iterator i = Groups.begin(); i != Groups.end(); ++i) if (LootGroup* group = *i) - group->Process(loot, player, store, lootMode); + { + // Rate.Drop.Item.GroupAmount is only in effect for the top loot template level + if (isTopLevel) + { + group->Process(loot, player, store, lootMode, sWorld->getRate(RATE_DROP_ITEM_GROUP_AMOUNT)); + } + else + { + group->Process(loot, player, store, lootMode, 0); + } + } } // True if template includes at least 1 quest drop entry diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index b21cfcdbd..ee785e256 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -253,7 +253,7 @@ public: // Adds an entry to the group (at loading stage) void AddEntry(LootStoreItem* item); // Rolls for every item in the template and adds the rolled items the the loot - void Process(Loot& loot, LootStore const& store, uint16 lootMode, Player const* player, uint8 groupId = 0) const; + void Process(Loot& loot, LootStore const& store, uint16 lootMode, Player const* player, uint8 groupId = 0, bool isTopLevel = true) const; void CopyConditions(ConditionList conditions); bool CopyConditions(LootItem* li, uint32 conditionLootId = 0) const; diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index c5fff797b..689c62301 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -436,8 +436,8 @@ enum Rates RATE_DROP_ITEM_LEGENDARY, RATE_DROP_ITEM_ARTIFACT, RATE_DROP_ITEM_REFERENCED, - RATE_DROP_ITEM_REFERENCED_AMOUNT, + RATE_DROP_ITEM_GROUP_AMOUNT, RATE_SELLVALUE_ITEM_POOR, RATE_SELLVALUE_ITEM_NORMAL, RATE_SELLVALUE_ITEM_UNCOMMON, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b53515b1e..72a3bc19d 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -492,7 +492,9 @@ void World::LoadConfigSettings(bool reload) _rate_values[RATE_DROP_ITEM_ARTIFACT] = sConfigMgr->GetOption("Rate.Drop.Item.Artifact", 1.0f); _rate_values[RATE_DROP_ITEM_REFERENCED] = sConfigMgr->GetOption("Rate.Drop.Item.Referenced", 1.0f); _rate_values[RATE_DROP_ITEM_REFERENCED_AMOUNT] = sConfigMgr->GetOption("Rate.Drop.Item.ReferencedAmount", 1.0f); + _rate_values[RATE_DROP_ITEM_GROUP_AMOUNT] = sConfigMgr->GetOption("Rate.Drop.Item.GroupAmount", 1.0f); _rate_values[RATE_DROP_MONEY] = sConfigMgr->GetOption("Rate.Drop.Money", 1.0f); + _rate_values[RATE_REWARD_BONUS_MONEY] = sConfigMgr->GetOption("Rate.RewardBonusMoney", 1.0f); _rate_values[RATE_XP_KILL] = sConfigMgr->GetOption("Rate.XP.Kill", 1.0f); _rate_values[RATE_XP_BG_KILL_AV] = sConfigMgr->GetOption("Rate.XP.BattlegroundKillAV", 1.0f); From cdfaffc1e06d7dd00adb80f867589bd26aa4c741 Mon Sep 17 00:00:00 2001 From: "Julio A. Leyva Osorio" Date: Sun, 14 May 2023 10:29:06 -0400 Subject: [PATCH 075/107] fix(DB/Quest): Missing RP event after completing the quest "Deciphering the Book" (#16252) Co-authored-by: Rushor --- data/sql/updates/pending_db_world/quest9557.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 data/sql/updates/pending_db_world/quest9557.sql diff --git a/data/sql/updates/pending_db_world/quest9557.sql b/data/sql/updates/pending_db_world/quest9557.sql new file mode 100644 index 000000000..81477709f --- /dev/null +++ b/data/sql/updates/pending_db_world/quest9557.sql @@ -0,0 +1,17 @@ +-- [Q] Deciphering the Book -- http://wotlk.openwow.com/quest=9557 +-- Anchorite Paetheus SAI +SET @ENTRY := 17424; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,20,0,100,0,9557,0,0,0,80,@ENTRY*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Quest \'Deciphering the Book\' Finished - Run Script'); + +-- Actionlist SAI +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY*100 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Script - Remove Npc Flag Questgiver'), +(@ENTRY*100,9,1,0,0,0,100,0,1000,1000,0,0,1,0,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Script - Say Line 0'), +(@ENTRY*100,9,2,0,0,0,100,0,4000,4000,0,0,1,1,6000,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Script - Say Line 1'), +(@ENTRY*100,9,3,0,0,0,100,0,6000,6000,0,0,1,2,6000,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Script - Say Line 2'), +(@ENTRY*100,9,4,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Script - Say Line 3'), +(@ENTRY*100,9,5,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Anchorite Paetheus - On Script - Add Npc Flag Questgiver'); From 203e0b2d8dd3a8e19393e9297f1b7a8797f2c6b6 Mon Sep 17 00:00:00 2001 From: "Julio A. Leyva Osorio" Date: Sun, 14 May 2023 10:29:25 -0400 Subject: [PATCH 076/107] fix(DB/Creature): Jessera of Mac'Aree and Messenger Hermesius (#16253) Co-authored-by: Rushor --- .../pending_db_world/add-text-17663-17703.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 data/sql/updates/pending_db_world/add-text-17663-17703.sql diff --git a/data/sql/updates/pending_db_world/add-text-17663-17703.sql b/data/sql/updates/pending_db_world/add-text-17663-17703.sql new file mode 100644 index 000000000..8f788c6df --- /dev/null +++ b/data/sql/updates/pending_db_world/add-text-17663-17703.sql @@ -0,0 +1,13 @@ +-- Jessera of Mac'Aree SAI +SET @ENTRY := 17663; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,60000,60000,60000,60000,1,0,10000,0,0,0,0,1,0,0,0,0,0,0,0,'Jessera of Mac\'Aree - Out of Combat - Say Line 0'); + +-- Messenger Hermesius SAI +SET @ENTRY := 17703; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,1,0,100,0,20000,25000,20000,25000,1,0,5000,0,0,0,0,1,0,0,0,0,0,0,0,'Messenger Hermesius - Out of Combat - Say Line 0'); From 7e99adcb31701f337b6e7a7786b847ddb62ea493 Mon Sep 17 00:00:00 2001 From: "Julio A. Leyva Osorio" Date: Sun, 14 May 2023 10:29:57 -0400 Subject: [PATCH 077/107] fix(DB/Creature): NPC Harold Lane is not performing emotes (#16260) Co-authored-by: Carlos Morales --- data/sql/updates/pending_db_world/18218.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 data/sql/updates/pending_db_world/18218.sql diff --git a/data/sql/updates/pending_db_world/18218.sql b/data/sql/updates/pending_db_world/18218.sql new file mode 100644 index 000000000..862f6f29b --- /dev/null +++ b/data/sql/updates/pending_db_world/18218.sql @@ -0,0 +1,14 @@ +-- Harold Lane +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=18218; +DELETE FROM `smart_scripts` WHERE `entryorguid`=18218 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(18218,0,0,0,1,0,100,0,1000,15000,150000,180000,1,5,0,0,0,0,0,1,0,0,0,0,0,0,0,'Harold Lane - Out of Combat - Say Line 5'); + +DELETE FROM `creature_text` WHERE `CreatureID`=18218 AND `GroupID`=5; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(18218,5,0,'Shifting, %s moans from the pain of his thorn scratch.',16,0,100,0,0,0,15157,0,'Harold Lane'), +(18218,5,1,'%s groans in pain.',16,0,100,0,0,0,15158,0,'Harold Lane'), +(18218,5,2,'%s looks at his friends and then grunts painfully.',16,0,100,0,0,0,15159,0,'Harold Lane'), +(18218,5,3,'%s wakes himself up snoring.',16,0,100,0,0,0,15160,0,'Harold Lane'), +(18218,5,4,'%s winces when he touches the tender area around his scratch.',16,0,100,0,0,0,15161,0,'Harold Lane'), +(18218,5,5,'%s begins to whistle a tune, but then stops abruptly and moans.',16,0,100,0,0,0,15162,0,'Harold Lane'); From f59135ca4e6dbedb5529963bf8fa1a22a736096f Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 14 May 2023 14:32:32 +0000 Subject: [PATCH 078/107] chore(DB): import pending files Referenced commit(s): 7e99adcb31701f337b6e7a7786b847ddb62ea493 --- .../{pending_db_world/18218.sql => db_world/2023_05_14_03.sql} | 1 + .../add-text-17663-17703.sql => db_world/2023_05_14_04.sql} | 1 + .../quest9557.sql => db_world/2023_05_14_05.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/18218.sql => db_world/2023_05_14_03.sql} (97%) rename data/sql/updates/{pending_db_world/add-text-17663-17703.sql => db_world/2023_05_14_04.sql} (97%) rename data/sql/updates/{pending_db_world/quest9557.sql => db_world/2023_05_14_05.sql} (97%) diff --git a/data/sql/updates/pending_db_world/18218.sql b/data/sql/updates/db_world/2023_05_14_03.sql similarity index 97% rename from data/sql/updates/pending_db_world/18218.sql rename to data/sql/updates/db_world/2023_05_14_03.sql index 862f6f29b..101c5f4d7 100644 --- a/data/sql/updates/pending_db_world/18218.sql +++ b/data/sql/updates/db_world/2023_05_14_03.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_02 -> 2023_05_14_03 -- Harold Lane UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=18218; DELETE FROM `smart_scripts` WHERE `entryorguid`=18218 AND `source_type`=0; diff --git a/data/sql/updates/pending_db_world/add-text-17663-17703.sql b/data/sql/updates/db_world/2023_05_14_04.sql similarity index 97% rename from data/sql/updates/pending_db_world/add-text-17663-17703.sql rename to data/sql/updates/db_world/2023_05_14_04.sql index 8f788c6df..258954eed 100644 --- a/data/sql/updates/pending_db_world/add-text-17663-17703.sql +++ b/data/sql/updates/db_world/2023_05_14_04.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_03 -> 2023_05_14_04 -- Jessera of Mac'Aree SAI SET @ENTRY := 17663; UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; diff --git a/data/sql/updates/pending_db_world/quest9557.sql b/data/sql/updates/db_world/2023_05_14_05.sql similarity index 97% rename from data/sql/updates/pending_db_world/quest9557.sql rename to data/sql/updates/db_world/2023_05_14_05.sql index 81477709f..43ea98b01 100644 --- a/data/sql/updates/pending_db_world/quest9557.sql +++ b/data/sql/updates/db_world/2023_05_14_05.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_04 -> 2023_05_14_05 -- [Q] Deciphering the Book -- http://wotlk.openwow.com/quest=9557 -- Anchorite Paetheus SAI SET @ENTRY := 17424; From 0ff2b6e69093d35ccaa901a007b43118eeb5e0dc Mon Sep 17 00:00:00 2001 From: Synful-Syn Date: Sun, 14 May 2023 10:34:44 -0400 Subject: [PATCH 079/107] fix(DB/Loot): Orphic Bracers (#16188) * fix(DB/Loot): Orphic Bracers * Update data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql * Update data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql * Add the delete creature_loot_template line before inserting the orphic bracers --- .../updates/pending_db_world/fix-orphic-bracers-loot.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql diff --git a/data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql b/data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql new file mode 100644 index 000000000..ff9c70437 --- /dev/null +++ b/data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql @@ -0,0 +1,7 @@ +DELETE FROM `reference_loot_template` WHERE `Item` = 18337; +DELETE FROM `creature_loot_template` WHERE `Item` = 18337; +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(11480, 18337, 0, 0.7, 0, 1, 0, 1, 1, 'Arcane Aberration - Orphic Bracers'), +(14399, 18337, 0, 0.9, 0, 1, 0, 1, 1, 'Arcane Torrent - Orphic Bracers'), +(11483, 18337, 0, 0.8, 0, 1, 0, 1, 1, 'Mana Remnant - Orphic Bracers'), +(11484, 18337, 0, 0.9, 0, 1, 0, 1, 1, 'Residual Monstrosity - Orphic Bracers'); From 9c1e6ca954003d6ec08317b30b7df6beabf86aab Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 14 May 2023 14:37:06 +0000 Subject: [PATCH 080/107] chore(DB): import pending files Referenced commit(s): 0ff2b6e69093d35ccaa901a007b43118eeb5e0dc --- .../fix-orphic-bracers-loot.sql => db_world/2023_05_14_06.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/fix-orphic-bracers-loot.sql => db_world/2023_05_14_06.sql} (92%) diff --git a/data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql b/data/sql/updates/db_world/2023_05_14_06.sql similarity index 92% rename from data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql rename to data/sql/updates/db_world/2023_05_14_06.sql index ff9c70437..516268740 100644 --- a/data/sql/updates/pending_db_world/fix-orphic-bracers-loot.sql +++ b/data/sql/updates/db_world/2023_05_14_06.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_05 -> 2023_05_14_06 DELETE FROM `reference_loot_template` WHERE `Item` = 18337; DELETE FROM `creature_loot_template` WHERE `Item` = 18337; INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES From ff6d88f6de72b2cd518fef06d12588edf8fb2d9e Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Sun, 14 May 2023 17:37:50 +0300 Subject: [PATCH 081/107] fix(Core/Spells): Dungeon T3 2P Bonuses for Wastewalker & Doomplate. (#16076) --- src/server/game/Spells/SpellInfoCorrections.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 219a94846..9c51fe10f 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4521,6 +4521,13 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->CastTimeEntry = sSpellCastTimesStore.LookupEntry(1); // 0s }); + // Hit Rating (Dungeon T3 - 2P Bonus - Wastewalker, Doomplate) + ApplySpellFix({ 37608, 37610 }, [](SpellInfo* spellInfo) + { + spellInfo->DurationEntry = sSpellDurationStore.LookupEntry(0); + spellInfo->Effects[EFFECT_0].MiscValue = 224; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; From 5f7e817ca6c50cb83112cdaa00fc53db98a8f8d5 Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Sun, 14 May 2023 18:30:11 +0300 Subject: [PATCH 082/107] fix(DB/Quest): Plundering the Plunderers - Polly improvements. (#15265) * fix(DB/Creature): Polly spawning as level 18 and missing text. * update * add missing yell text * add to SAI, on just summoned * update * Update rev_1677938661497953700.sql --- .../rev_1677938661497953700.sql | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1677938661497953700.sql diff --git a/data/sql/updates/pending_db_world/rev_1677938661497953700.sql b/data/sql/updates/pending_db_world/rev_1677938661497953700.sql new file mode 100644 index 000000000..e13ca417e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1677938661497953700.sql @@ -0,0 +1,38 @@ +-- +-- Polly (pre E.C.A.C) +UPDATE `creature_template` SET `minlevel` = 50, `maxlevel` = 50 WHERE `entry` = 7167; + +DELETE FROM `creature_text` WHERE `CreatureID`=7167; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(7167, 0, 0, 'SQUAWK!!!', 14, 0, 100, 0, 0, 0, 3170, 0, 'Polly - SAY_SPAWN'), +(7167, 1, 0, 'MmmmmMmmmm... Enormous chemically altered cracker....', 12, 0, 100, 0, 0, 0, 3167, 0, 'Polly - SAY_ON_ECAC'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 7167); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(7167, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Just Summoned - Say Line 0'), +(7167, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Just Summoned - Start Attacking'), +(7167, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, -1456.55, -3959.53, 0.24, 1.99, 'Polly - On Just Summoned - Set Home Position'), +(7167, 0, 3, 0, 1, 0, 100, 1, 73000, 73000, 60000, 60000, 0, 11, 8822, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - OOC - Cast Stealth'), +(7167, 0, 4, 0, 1, 0, 100, 257, 5000, 5000, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, -1456.55, -3959.53, 0.24, 1.99, 'Polly - Out of Combat - Move To Position (No Repeat/Reset)'), +(7167, 0, 5, 6, 8, 0, 100, 513, 9976, 0, 0, 0, 0, 1, 1, 2500, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Spellhit \'Polly Eats the E.C.A.C.\' - Say Line 1 (No Repeat)'), +(7167, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 0, 2, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Spellhit \'Polly Eats the E.C.A.C.\' - Set Faction 35 (No Repeat)'), +(7167, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Spellhit \'Polly Eats the E.C.A.C.\' - Set Home Position (No Repeat)'), +(7167, 0, 8, 9, 52, 0, 100, 513, 1, 7167, 0, 0, 0, 12, 7168, 4, 60000, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Text 1 Over - Summon Creature \'Polly\' (No Repeat)'), +(7167, 0, 9, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Text 1 Over - Despawn Instant (No Repeat)'); + +-- Polly (after E.C.A.C) +DELETE FROM `creature_text` WHERE `CreatureID`=7168; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(7168, 0, 0, 'What the squawk??? Squawk squawk, squawk? SQUAWK!', 12, 0, 100, 0, 0, 0, 3165, 0, 'Polly - SAY_ON_ECAC'); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 7168; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 7168); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(7168, 0, 0, 1, 54, 0, 100, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Just Summoned - Say Line 0 (No Repeat)'), +(7168, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 10, 0, 0, 0, 0, 0, 0, 0, 'Polly - On Just Summoned - Start Attacking (No Repeat)'); + +-- Script event - Summon 7167 +DELETE FROM `event_scripts` WHERE `id`=2153 AND `datalong`=7167; +INSERT INTO `event_scripts` (`id`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES +(2153, 5, 10, 7167, 900000, 0, -1463.40, -3926.96, 0.24, 4.88); From 9ce833a68a8c85cc78e893f81091baab5b80dd0d Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 14 May 2023 15:32:29 +0000 Subject: [PATCH 083/107] chore(DB): import pending files Referenced commit(s): 5f7e817ca6c50cb83112cdaa00fc53db98a8f8d5 --- .../rev_1677938661497953700.sql => db_world/2023_05_14_07.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1677938661497953700.sql => db_world/2023_05_14_07.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1677938661497953700.sql b/data/sql/updates/db_world/2023_05_14_07.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1677938661497953700.sql rename to data/sql/updates/db_world/2023_05_14_07.sql index e13ca417e..bb8f0232c 100644 --- a/data/sql/updates/pending_db_world/rev_1677938661497953700.sql +++ b/data/sql/updates/db_world/2023_05_14_07.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_06 -> 2023_05_14_07 -- -- Polly (pre E.C.A.C) UPDATE `creature_template` SET `minlevel` = 50, `maxlevel` = 50 WHERE `entry` = 7167; From 1724088e0665b6105646fc42de2fcf039b27bf50 Mon Sep 17 00:00:00 2001 From: Eddy Vega <61223313+Si1ker@users.noreply.github.com> Date: Sun, 14 May 2023 16:13:42 -0600 Subject: [PATCH 084/107] fix(Scripts/HellfireCitadel): Mass struct/model update (#16264) * init * . * check codestyle (ubuntu-20.04) * ubuntu-20.04-clang-with-modules * clang --- .../rev_1684044915713162200.sql | 9 + .../BloodFurnace/blood_furnace.h | 48 +- .../BloodFurnace/boss_broggok.cpp | 15 +- .../BloodFurnace/boss_kelidan_the_breaker.cpp | 517 ++++++++-------- .../BloodFurnace/boss_the_maker.cpp | 152 ++--- .../boss_omor_the_unscarred.cpp | 201 +++--- .../boss_vazruden_the_herald.cpp | 581 ++++++++---------- .../boss_watchkeeper_gargolmar.cpp | 207 +++---- .../HellfireRamparts/hellfire_ramparts.h | 2 + .../ShatteredHalls/boss_nethekurse.cpp | 563 ++++++++--------- .../ShatteredHalls/boss_warbringer_omrogg.cpp | 377 ++++++------ .../boss_warchief_kargath_bladefist.cpp | 265 ++++---- .../ShatteredHalls/shattered_halls.h | 2 + 13 files changed, 1385 insertions(+), 1554 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1684044915713162200.sql diff --git a/data/sql/updates/pending_db_world/rev_1684044915713162200.sql b/data/sql/updates/pending_db_world/rev_1684044915713162200.sql new file mode 100644 index 000000000..38b615465 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684044915713162200.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (19130,30925,12739,30500,30495); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES +(19130, 19130, 40392), +(30925, 30925, 40059), +(12739, 12739, 15472), +(30500, 30500, 35954), +(30495, 30495, 35953); + diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h index 985cb7618..23fc4acce 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h @@ -29,41 +29,41 @@ constexpr uint32 EncounterCount = 4; enum bloodFurnace { - DATA_THE_MAKER = 0, - DATA_BROGGOK = 1, - DATA_KELIDAN = 2, - MAX_ENCOUNTER = 3, + DATA_THE_MAKER = 0, + DATA_BROGGOK = 1, + DATA_KELIDAN = 2, + MAX_ENCOUNTER = 3, - DATA_DOOR1 = 10, - DATA_DOOR2 = 11, - DATA_DOOR3 = 12, - DATA_BROGGOK_REAR_DOOR = 13, - DATA_BROGGOK_LEVER = 14, - DATA_DOOR6 = 15, + DATA_DOOR1 = 10, + DATA_DOOR2 = 11, + DATA_DOOR3 = 12, + DATA_BROGGOK_REAR_DOOR = 13, + DATA_BROGGOK_LEVER = 14, + DATA_DOOR6 = 15, - DATA_PRISON_CELL1 = 20, - DATA_PRISON_CELL2 = 21, - DATA_PRISON_CELL3 = 22, - DATA_PRISON_CELL4 = 23, + DATA_PRISON_CELL1 = 20, + DATA_PRISON_CELL2 = 21, + DATA_PRISON_CELL3 = 22, + DATA_PRISON_CELL4 = 23, - ACTION_ACTIVATE_BROGGOK = 30, - ACTION_PREPARE_BROGGOK = 31 + ACTION_ACTIVATE_BROGGOK = 30, + ACTION_PREPARE_BROGGOK = 31 }; enum bloodFurnaceNPC { - NPC_THE_MAKER = 17381, - NPC_BROGGOK = 17380, - NPC_KELIDAN = 17377, - NPC_NASCENT_FEL_ORC = 17398, - NPC_CHANNELER = 17653 + NPC_THE_MAKER = 17381, + NPC_BROGGOK = 17380, + NPC_KELIDAN = 17377, + NPC_NASCENT_FEL_ORC = 17398, + NPC_CHANNELER = 17653 }; enum BloodFurnaceGO { - GO_BROGGOK_DOOR_FRONT = 181822, - GO_BROGGOK_DOOR_REAR = 181819, - GO_BROGGOK_LEVER = 181982 + GO_BROGGOK_DOOR_FRONT = 181822, + GO_BROGGOK_DOOR_REAR = 181819, + GO_BROGGOK_LEVER = 181982 }; template diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp index 838216b81..6b2b5b01c 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp @@ -21,14 +21,17 @@ #include "SpellScript.h" #include "blood_furnace.h" -enum eEnums +enum Say { - SAY_AGGRO = 0, + SAY_AGGRO = 0 +}; +enum Spells +{ SPELL_SLIME_SPRAY = 30913, SPELL_POISON_CLOUD = 30916, SPELL_POISON_BOLT = 30917, - SPELL_POISON = 30914, + SPELL_POISON = 30914 }; struct boss_broggok : public BossAI @@ -52,7 +55,6 @@ struct boss_broggok : public BossAI void JustSummoned(Creature* summoned) override { summons.Summon(summoned); - summoned->SetFaction(FACTION_MONSTER_2); summoned->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); summoned->CastSpell(summoned, SPELL_POISON, true, 0, 0, me->GetGUID()); @@ -80,7 +82,6 @@ struct boss_broggok : public BossAI DoCastSelf(SPELL_POISON_CLOUD); context.Repeat(20s); }); - me->SetReactState(REACT_AGGRESSIVE); me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); me->SetImmuneToAll(false); @@ -106,7 +107,6 @@ public: } } } - go->UseDoorOrButton(); return false; } @@ -121,6 +121,7 @@ class spell_broggok_poison_cloud : public AuraScript { if (!sSpellMgr->GetSpellInfo(spellInfo->Effects[EFFECT_0].TriggerSpell)) return false; + return true; } @@ -142,6 +143,6 @@ class spell_broggok_poison_cloud : public AuraScript void AddSC_boss_broggok() { RegisterBloodFurnaceCreatureAI(boss_broggok); - new go_broggok_lever(); RegisterSpellScript(spell_broggok_poison_cloud); + new go_broggok_lever(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index ce06c53d6..396f24ffd 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -20,15 +20,18 @@ #include "SpellAuras.h" #include "blood_furnace.h" -enum eKelidan +enum Says { SAY_WAKE = 0, SAY_ADD_AGGRO = 1, SAY_KILL = 2, SAY_NOVA = 3, - SAY_DIE = 4, + SAY_DIE = 4 +}; - // Keldian spells +enum Spells +{ + // Keldian SPELL_CORRUPTION = 30938, SPELL_EVOCATION = 30935, SPELL_FIRE_NOVA = 33132, @@ -36,23 +39,16 @@ enum eKelidan SPELL_BURNING_NOVA = 30940, SPELL_VORTEX = 37370, - // Channelers spells - SPELL_SHADOW_BOLT = 12739, - SPELL_SHADOW_BOLT_H = 15472, - SPELL_MARK_OF_SHADOW = 30937, - SPELL_CHANNELING = 39123, + // Channelers + SPELL_SHADOW_BOLT = 12739, + SPELL_MARK_OF_SHADOW = 30937, + SPELL_CHANNELING = 39123 +}; - // Events - EVENT_SPELL_VOLLEY = 1, - EVENT_SPELL_CORRUPTION = 2, - EVENT_SPELL_BURNING_NOVA = 3, - EVENT_SPELL_FIRE_NOVA = 4, - EVENT_SPELL_SHADOW_BOLT = 5, - EVENT_SPELL_MARK = 6, - - // Actions - ACTION_CHANNELER_ENGAGED = 1, - ACTION_CHANNELER_DIED = 2, +enum Actions +{ + ACTION_CHANNELER_ENGAGED = 1, + ACTION_CHANNELER_DIED = 2 }; const float ShadowmoonChannelers[5][4] = @@ -64,299 +60,276 @@ const float ShadowmoonChannelers[5][4] = {316.0f, -109.0f, -24.6f, 1.257f} }; -class boss_kelidan_the_breaker : public CreatureScript +struct boss_kelidan_the_breaker : public BossAI { -public: - boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker") + boss_kelidan_the_breaker(Creature* creature) : BossAI(creature, DATA_KELIDAN) { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } - struct boss_kelidan_the_breakerAI : public ScriptedAI + ObjectGuid channelers[5]; + uint32 checkTimer; + bool addYell; + + void Reset() override { - boss_kelidan_the_breakerAI(Creature* creature) : ScriptedAI(creature) + addYell = false; + checkTimer = 5000; + _Reset(); + ApplyImmunities(true); + SummonChannelers(); + me->SetReactState(REACT_PASSIVE); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->SetImmuneToAll(true); + if (instance) { - instance = creature->GetInstanceScript(); + instance->SetData(DATA_KELIDAN, NOT_STARTED); } + } - InstanceScript* instance; - EventMap events; - ObjectGuid channelers[5]; - uint32 checkTimer; - bool addYell; - - void Reset() override + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_WAKE); + _JustEngagedWith(); + me->InterruptNonMeleeSpells(false); + if (instance) { - addYell = false; - checkTimer = 5000; - - events.Reset(); + instance->SetData(DATA_KELIDAN, IN_PROGRESS); + } + scheduler.Schedule(1s, [this](TaskContext context) + { + DoCastAOE(SPELL_SHADOW_BOLT_VOLLEY); + context.Repeat(8s, 13s); + }).Schedule(5s, [this](TaskContext context) + { + DoCastAOE(SPELL_CORRUPTION); + context.Repeat(30s, 50s); + }).Schedule(15s, [this](TaskContext context) + { + Talk(SAY_NOVA); + ApplyImmunities(false); + me->AddAura(SPELL_BURNING_NOVA, me); ApplyImmunities(true); - SummonChannelers(); - me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(true); - if (instance) - instance->SetData(DATA_KELIDAN, NOT_STARTED); - } - - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_SPELL_VOLLEY, 1000); - events.ScheduleEvent(EVENT_SPELL_CORRUPTION, 5000); - events.ScheduleEvent(EVENT_SPELL_BURNING_NOVA, 15000); - - me->InterruptNonMeleeSpells(false); - Talk(SAY_WAKE); - - if (instance) - instance->SetData(DATA_KELIDAN, IN_PROGRESS); - } - - void KilledUnit(Unit* /*victim*/) override - { - if (urand(0, 1)) - Talk(SAY_KILL); - } - - void DoAction(int32 param) override - { - if (param == ACTION_CHANNELER_ENGAGED) + if (IsHeroic()) { - if (!addYell) - { - addYell = true; - Talk(SAY_ADD_AGGRO); - - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && !channeler->IsInCombat()) - channeler->SetInCombatWithZone(); - } - } + DoCastAOE(SPELL_VORTEX); } - else if (param == ACTION_CHANNELER_DIED) + scheduler.DelayGroup(0, 6s); + scheduler.Schedule(5s, [this](TaskContext /*context*/) { + DoCastSelf(SPELL_FIRE_NOVA, true); + }); + context.Repeat(25s, 32s); + }); + } + + void KilledUnit(Unit* /*victim*/) override + { + if (urand(0, 1)) + { + Talk(SAY_KILL); + } + } + + void DoAction(int32 param) override + { + if (param == ACTION_CHANNELER_ENGAGED) + { + if (!addYell) + { + addYell = true; + Talk(SAY_ADD_AGGRO); for (uint8 i = 0; i < 5; ++i) { Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && channeler->IsAlive()) - return; - } - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(false); - if (Unit* target = me->SelectNearestPlayer(100.0f)) - AttackStart(target); - } - } - - void CheckChannelers() - { - if (addYell) - { - if (!SelectTargetFromPlayerList(100.0f)) - EnterEvadeMode(); - return; - } - - SummonChannelers(); - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat()) - { - Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i + 2) % 5]); - if (target) - channeler->CastSpell(target, SPELL_CHANNELING, false); + if (channeler && !channeler->IsInCombat()) + { + channeler->SetInCombatWithZone(); + } } } } - - void SummonChannelers() + else if (param == ACTION_CHANNELER_DIED) { for (uint8 i = 0; i < 5; ++i) { Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && channeler->isDead()) - { - channeler->DespawnOrUnsummon(1); - channeler = nullptr; - } - if (!channeler) - channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000); - - channelers[i] = channeler ? channeler->GetGUID() : ObjectGuid::Empty; + if (channeler && channeler->IsAlive()) + return; } - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DIE); - if (instance) + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->SetImmuneToAll(false); + if (Unit* target = me->SelectNearestPlayer(100.0f)) { - // Xinef: load grid with start doors - me->GetMap()->LoadGrid(0, -111.0f); - instance->SetData(DATA_KELIDAN, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_DOOR1), true); - instance->HandleGameObject(instance->GetGuidData(DATA_DOOR6), true); + AttackStart(target); } } + } - void ApplyImmunities(bool apply) - { - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, apply); - me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - { - checkTimer += diff; - if (checkTimer >= 5000) - { - checkTimer = 0; - CheckChannelers(); - if (!me->HasUnitState(UNIT_STATE_CASTING)) - me->CastSpell(me, SPELL_EVOCATION, false); - } - return; - } - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_VOLLEY: - me->CastSpell(me, SPELL_SHADOW_BOLT_VOLLEY, false); - events.RepeatEvent(urand(8000, 13000)); - break; - case EVENT_SPELL_CORRUPTION: - me->CastSpell(me, SPELL_CORRUPTION, false); - events.RepeatEvent(urand(30000, 50000)); - break; - case EVENT_SPELL_BURNING_NOVA: - Talk(SAY_NOVA); - - ApplyImmunities(false); - me->AddAura(SPELL_BURNING_NOVA, me); - ApplyImmunities(true); - - if (IsHeroic()) - DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - - events.DelayEvents(6000, 0); - events.RepeatEvent(urand(25000, 32000)); - events.ScheduleEvent(EVENT_SPELL_FIRE_NOVA, 5000); - break; - case EVENT_SPELL_FIRE_NOVA: - me->CastSpell(me, SPELL_FIRE_NOVA, true); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void CheckChannelers() { - return GetBloodFurnaceAI(creature); + if (addYell) + { + if (!SelectTargetFromPlayerList(100.0f)) + { + EnterEvadeMode(); + } + return; + } + SummonChannelers(); + for (uint8 i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); + if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat()) + { + Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i + 2) % 5]); + if (target) + { + channeler->CastSpell(target, SPELL_CHANNELING, false); + } + } + } + } + + void SummonChannelers() + { + for (uint8 i = 0; i < 5; ++i) + { + Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); + if (channeler && channeler->isDead()) + { + channeler->DespawnOrUnsummon(1); + channeler = nullptr; + } + if (!channeler) + { + channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000); + } + channelers[i] = channeler ? channeler->GetGUID() : ObjectGuid::Empty; + } + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DIE); + _JustDied(); + if (instance) + { + me->GetMap()->LoadGrid(0, -111.0f); + instance->SetData(DATA_KELIDAN, DONE); + instance->HandleGameObject(instance->GetGuidData(DATA_DOOR1), true); + instance->HandleGameObject(instance->GetGuidData(DATA_DOOR6), true); + } + } + + void ApplyImmunities(bool apply) + { + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, apply); + me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + checkTimer += diff; + if (checkTimer >= 5000) + { + checkTimer = 0; + CheckChannelers(); + if (!me->HasUnitState(UNIT_STATE_CASTING)) + { + me->CastSpell(me, SPELL_EVOCATION, false); + } + } + return; + } + + scheduler.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + DoMeleeAttackIfReady(); } }; -class npc_shadowmoon_channeler : public CreatureScript +struct npc_shadowmoon_channeler : public ScriptedAI { -public: - npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") {} + npc_shadowmoon_channeler(Creature* creature) : ScriptedAI(creature) {} - struct npc_shadowmoon_channelerAI : public ScriptedAI + Creature* GetKelidan() { - npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature) {} - - EventMap events; - - void Reset() override + if (InstanceScript* instance = me->GetInstanceScript()) { - events.Reset(); + return instance->GetCreature(DATA_KELIDAN); } - - Creature* GetKelidan() - { - if (InstanceScript* instance = me->GetInstanceScript()) - return instance->GetCreature(DATA_KELIDAN); - - return nullptr; - } - - void JustEngagedWith(Unit* /*who*/) override - { - if (Creature* kelidan = GetKelidan()) - kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED); - - me->InterruptNonMeleeSpells(false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, urand(1200, 2400)); - events.ScheduleEvent(EVENT_SPELL_MARK, urand(5000, 6500)); - } - - void JustDied(Unit* /*killer*/) override - { - if (Creature* kelidan = GetKelidan()) - kelidan->AI()->DoAction(ACTION_CHANNELER_DIED); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SHADOW_BOLT_H : SPELL_SHADOW_BOLT, false); - events.RepeatEvent(urand(6000, 7200)); - break; - case EVENT_SPELL_MARK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_MARK_OF_SHADOW, false); - events.RepeatEvent(urand(16000, 17500)); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBloodFurnaceAI(creature); + return nullptr; } + + void JustEngagedWith(Unit* /*who*/) override + { + if (Creature* kelidan = GetKelidan()) + { + kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED); + } + me->InterruptNonMeleeSpells(false); + _scheduler.Schedule(1200ms, 2400ms, [this](TaskContext context) + { + DoCastVictim(SPELL_SHADOW_BOLT); + context.Repeat(6s, 7200ms); + }).Schedule(5s, 6500ms, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_MARK_OF_SHADOW); + context.Repeat(16s, 17500ms); + }); + } + + void JustDied(Unit* /*killer*/) override + { + if (Creature* kelidan = GetKelidan()) + { + kelidan->AI()->DoAction(ACTION_CHANNELER_DIED); + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _scheduler.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + DoMeleeAttackIfReady(); + } + +private: + TaskScheduler _scheduler; }; void AddSC_boss_kelidan_the_breaker() { - new boss_kelidan_the_breaker(); - new npc_shadowmoon_channeler(); + RegisterBloodFurnaceCreatureAI(boss_kelidan_the_breaker); + RegisterBloodFurnaceCreatureAI(npc_shadowmoon_channeler); } diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp index efc7a5316..77bb5ef91 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp @@ -19,111 +19,87 @@ #include "ScriptedCreature.h" #include "blood_furnace.h" -enum eEnums +enum Says { - SAY_AGGRO = 0, - SAY_KILL = 1, - SAY_DIE = 2, - - SPELL_EXPLODING_BREAKER = 30925, - SPELL_DOMINATION = 30923, - - EVENT_SPELL_EXPLODING = 1, - EVENT_SPELL_DOMINATION = 2 + SAY_AGGRO = 0, + SAY_KILL = 1, + SAY_DIE = 2 }; -class boss_the_maker : public CreatureScript +enum Spells { -public: - boss_the_maker() : CreatureScript("boss_the_maker") + SPELL_EXPLODING_BEAKER = 30925, + SPELL_DOMINATION = 30923 +}; + +struct boss_the_maker : public BossAI +{ + boss_the_maker(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } - struct boss_the_makerAI : public ScriptedAI + void Reset() override { - boss_the_makerAI(Creature* creature) : ScriptedAI(creature) + _Reset(); + if (instance) { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - EventMap events; - - void Reset() override - { - events.Reset(); - if (!instance) - return; - instance->SetData(DATA_THE_MAKER, NOT_STARTED); instance->HandleGameObject(instance->GetGuidData(DATA_DOOR2), true); } + } - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SPELL_EXPLODING, 6000); - events.ScheduleEvent(EVENT_SPELL_DOMINATION, 120000); - - if (!instance) - return; - - instance->SetData(DATA_THE_MAKER, IN_PROGRESS); - instance->HandleGameObject(instance->GetGuidData(DATA_DOOR2), false); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DIE); - - if (!instance) - return; - - instance->SetData(DATA_THE_MAKER, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_DOOR2), true); - instance->HandleGameObject(instance->GetGuidData(DATA_DOOR3), true); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_EXPLODING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_EXPLODING_BREAKER, false); - events.RepeatEvent(urand(7000, 11000)); - break; - case EVENT_SPELL_DOMINATION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_DOMINATION, false); - events.RepeatEvent(120000); - break; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* /*who*/) override { - return GetBloodFurnaceAI(creature); + Talk(SAY_AGGRO); + _JustEngagedWith(); + instance->SetData(DATA_THE_MAKER, IN_PROGRESS); + instance->HandleGameObject(instance->GetGuidData(DATA_DOOR2), false); + scheduler.Schedule(6s, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_EXPLODING_BEAKER); + context.Repeat(7s, 11s); + }).Schedule(2min, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_DOMINATION); + context.Repeat(2min); + }); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1)) + { + Talk(SAY_KILL); + } + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DIE); + _JustDied(); + instance->SetData(DATA_THE_MAKER, DONE); + instance->HandleGameObject(instance->GetGuidData(DATA_DOOR2), true); + instance->HandleGameObject(instance->GetGuidData(DATA_DOOR3), true); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + scheduler.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + DoMeleeAttackIfReady(); } }; void AddSC_boss_the_maker() { - new boss_the_maker(); + RegisterBloodFurnaceCreatureAI(boss_the_maker); } diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp index 01f612a44..4abd908e3 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp @@ -37,124 +37,111 @@ enum Spells SPELL_DEMONIC_SHIELD = 31901 }; -class boss_omor_the_unscarred : public CreatureScript +struct boss_omor_the_unscarred : public BossAI { -public: - boss_omor_the_unscarred() : CreatureScript("boss_omor_the_unscarred") { } - - struct boss_omor_the_unscarredAI : public BossAI + boss_omor_the_unscarred(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED) { - boss_omor_the_unscarredAI(Creature* creature) : BossAI(creature, DATA_OMOR_THE_UNSCARRED) + SetCombatMovement(false); + scheduler.SetValidator([this] { - SetCombatMovement(false); + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } - scheduler.SetValidator([this] + void Reset() override + { + Talk(SAY_WIPE); + _Reset(); + _targetGUID.Clear(); + ScheduleHealthCheckEvent(21, [&]{ + DoCastSelf(SPELL_DEMONIC_SHIELD); + scheduler.Schedule(15s, [this](TaskContext context) { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } - - void Reset() override - { - Talk(SAY_WIPE); - _Reset(); - _targetGUID.Clear(); - - ScheduleHealthCheckEvent(21, [&]{ DoCastSelf(SPELL_DEMONIC_SHIELD); - scheduler.Schedule(15s, [this](TaskContext context) - { - DoCastSelf(SPELL_DEMONIC_SHIELD); - context.Repeat(15s); - }); - }); - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - _JustEngagedWith(); - - scheduler.Schedule(6s, [this](TaskContext context) - { - if (roll_chance_i(33)) - { - Talk(SAY_CURSE); - } - DoCastRandomTarget(SPELL_TREACHEROUS_AURA); - context.Repeat(12s, 18s); - }).Schedule(10s, [this](TaskContext /*context*/) - { - DoCastSelf(SPELL_SUMMON_FIENDISH_HOUND); - }).Schedule(25s, [this](TaskContext context) - { - DoCastSelf(SPELL_SUMMON_FIENDISH_HOUND); context.Repeat(15s); }); - } - - void KilledUnit(Unit*) override - { - if(!_hasSpoken) - { - _hasSpoken = true; - Talk(SAY_KILL); - } - scheduler.Schedule(6s, [this](TaskContext /*context*/) - { - _hasSpoken = false; - }); - } - - void JustSummoned(Creature* summon) override - { - Talk(SAY_SUMMON); - summons.Summon(summon); - summon->SetInCombatWithZone(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DIE); - _JustDied(); - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (!me->GetVictim() || !me->isAttackReady()) - return; - - if (me->IsWithinMeleeRange(me->GetVictim())) - { - me->GetMotionMaster()->MoveChase(me->GetVictim()); - DoMeleeAttackIfReady(); - } - else - { - me->GetMotionMaster()->Clear(); - me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false); - me->resetAttackTimer(); - } - } - - private: - ObjectGuid _targetGUID; - bool _hasSpoken; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHellfireRampartsAI(creature); + }); } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + _JustEngagedWith(); + scheduler.Schedule(6s, [this](TaskContext context) + { + if (roll_chance_i(33)) + { + Talk(SAY_CURSE); + } + DoCastRandomTarget(SPELL_TREACHEROUS_AURA); + context.Repeat(12s, 18s); + }).Schedule(10s, [this](TaskContext /*context*/) + { + DoCastSelf(SPELL_SUMMON_FIENDISH_HOUND); + }).Schedule(25s, [this](TaskContext context) + { + DoCastSelf(SPELL_SUMMON_FIENDISH_HOUND); + context.Repeat(15s); + }); + } + + void KilledUnit(Unit*) override + { + if(!_hasSpoken) + { + _hasSpoken = true; + Talk(SAY_KILL); + } + scheduler.Schedule(6s, [this](TaskContext /*context*/) + { + _hasSpoken = false; + }); + } + + void JustSummoned(Creature* summon) override + { + Talk(SAY_SUMMON); + summons.Summon(summon); + summon->SetInCombatWithZone(); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DIE); + _JustDied(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + scheduler.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (!me->GetVictim() || !me->isAttackReady()) + return; + + if (me->IsWithinMeleeRange(me->GetVictim())) + { + me->GetMotionMaster()->MoveChase(me->GetVictim()); + DoMeleeAttackIfReady(); + } + else + { + me->GetMotionMaster()->Clear(); + DoCastVictim(SPELL_SHADOW_BOLT); + me->resetAttackTimer(); + } + } + +private: + ObjectGuid _targetGUID; + bool _hasSpoken; }; void AddSC_boss_omor_the_unscarred() { - new boss_omor_the_unscarred(); + RegisterHellfireRampartsCreatureAI(boss_omor_the_unscarred); } diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp index f11b60189..64a274f6a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp @@ -21,36 +21,35 @@ enum Says { - SAY_INTRO = 0, - SAY_WIPE = 0, - SAY_AGGRO = 1, - SAY_KILL = 2, - SAY_DIE = 3, - EMOTE_NAZAN = 0 + SAY_INTRO = 0, + SAY_WIPE = 0, + SAY_AGGRO = 1, + SAY_KILL = 2, + SAY_DIE = 3, + EMOTE_NAZAN = 0 }; enum Spells { - SPELL_FIREBALL = 33793, - SPELL_SUMMON_LIQUID_FIRE = 31706, - SPELL_REVENGE = 19130, - SPELL_REVENGE_H = 40392, - SPELL_CALL_NAZAN = 30693, - SPELL_BELLOWING_ROAR = 39427, - SPELL_CONE_OF_FIRE = 30926 + SPELL_FIREBALL = 33793, + SPELL_SUMMON_LIQUID_FIRE = 31706, + SPELL_REVENGE = 19130, + SPELL_CALL_NAZAN = 30693, + SPELL_BELLOWING_ROAR = 39427, + SPELL_CONE_OF_FIRE = 30926 }; enum Misc { - ACTION_FLY_DOWN = 0, - POINT_MIDDLE = 0, - POINT_FLIGHT = 1 + ACTION_FLY_DOWN = 0, + POINT_MIDDLE = 0, + POINT_FLIGHT = 1 }; enum GroupPhase { - GROUP_PHASE_1 = 0, - GROUP_PHASE_2 = 1 + GROUP_PHASE_1 = 0, + GROUP_PHASE_2 = 1 }; const Position NazanPos[3] = @@ -60,354 +59,302 @@ const Position NazanPos[3] = {-1373.84f, 1771.57f, 111.0f, 0.0f} }; -class boss_vazruden_the_herald : public CreatureScript +struct boss_vazruden_the_herald : public BossAI { -public: - boss_vazruden_the_herald() : CreatureScript("boss_vazruden_the_herald") { } + boss_vazruden_the_herald(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) {} - struct boss_vazruden_the_heraldAI : public BossAI + void Reset() override { - boss_vazruden_the_heraldAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) - { - } + BossAI::Reset(); + me->SetVisible(true); + me->SetReactState(REACT_PASSIVE); + me->SummonCreature(NPC_HELLFIRE_SENTRY, -1372.56f, 1724.31f, 82.967f, 5.3058f); + me->SummonCreature(NPC_HELLFIRE_SENTRY, -1383.39f, 1711.82f, 82.7961f, 5.67232f); + } - void Reset() override - { - BossAI::Reset(); - me->SetVisible(true); - me->SetReactState(REACT_PASSIVE); - me->SummonCreature(NPC_HELLFIRE_SENTRY, -1372.56f, 1724.31f, 82.967f, 5.3058f); - me->SummonCreature(NPC_HELLFIRE_SENTRY, -1383.39f, 1711.82f, 82.7961f, 5.67232f); - } + void AttackStart(Unit*) override {} - void AttackStart(Unit*) override - { - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) - summon->SetInCombatWithZone(); - } - - void JustDied(Unit*) override - { - instance->SetBossState(DATA_VAZRUDEN, DONE); - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) - { - me->SetVisible(false); - me->SummonCreature(NPC_VAZRUDEN, me->GetPositionX(), me->GetPositionY(), 81.2f, 5.46f); - me->SummonCreature(NPC_NAZAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 5.46f); - } - } - - void SummonedCreatureDies(Creature* summon, Unit*) override - { - summons.Despawn(summon); - if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0) - { - Talk(SAY_INTRO); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false); - me->setActive(true); - } - else if (summons.size() == 0) - { - me->KillSelf(); - } - } - - void SummonedCreatureDespawn(Creature* summon) override - { - summons.Despawn(summon); - if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) - BossAI::EnterEvadeMode(); - } - - void SetData(uint32 type, uint32 data) override - { - if (type == 0 && data == 1) - { - summons.DoZoneInCombat(NPC_HELLFIRE_SENTRY); - } - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!me->IsVisible() && summons.size() == 0) - BossAI::EnterEvadeMode(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void JustSummoned(Creature* summon) override { - return GetHellfireRampartsAI(creature); + summons.Summon(summon); + if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) + { + summon->SetInCombatWithZone(); + } + } + + void JustDied(Unit*) override + { + instance->SetBossState(DATA_VAZRUDEN, DONE); + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) + { + me->SetVisible(false); + me->SummonCreature(NPC_VAZRUDEN, me->GetPositionX(), me->GetPositionY(), 81.2f, 5.46f); + me->SummonCreature(NPC_NAZAN, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 5.46f); + } + } + + void SummonedCreatureDies(Creature* summon, Unit*) override + { + summons.Despawn(summon); + if (summon->GetEntry() == NPC_HELLFIRE_SENTRY && summons.size() == 0) + { + Talk(SAY_INTRO); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 85.0f, false); + me->setActive(true); + } + else if (summons.size() == 0) + { + me->KillSelf(); + } + } + + void SummonedCreatureDespawn(Creature* summon) override + { + summons.Despawn(summon); + if (summon->GetEntry() != NPC_HELLFIRE_SENTRY) + { + BossAI::EnterEvadeMode(); + } + } + + void SetData(uint32 type, uint32 data) override + { + if (type == 0 && data == 1) + { + summons.DoZoneInCombat(NPC_HELLFIRE_SENTRY); + } + } + + void UpdateAI(uint32 /*diff*/) override + { + if (!me->IsVisible() && summons.size() == 0) + { + BossAI::EnterEvadeMode(); + } } }; -class boss_nazan : public CreatureScript +struct boss_nazan : public BossAI { -public: - boss_nazan() : CreatureScript("boss_nazan") { } - - struct boss_nazanAI : public BossAI + boss_nazan(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) { - boss_nazanAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) + scheduler.SetValidator([this] { - scheduler.SetValidator([this] + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + void Reset() override + { + me->SetCanFly(true); + me->SetDisableGravity(true); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + me->DespawnOrUnsummon(1); + } + + void JustEngagedWith(Unit*) override + { + scheduler.CancelGroup(GROUP_PHASE_2); + scheduler.Schedule(5ms, GROUP_PHASE_1, [this](TaskContext context) + { + me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false); + scheduler.DelayAll(7s); + context.Repeat(30s); + }).Schedule(5s, GROUP_PHASE_1, [this](TaskContext context) + { + DoCastRandomTarget(SPELL_FIREBALL); + context.Repeat(4s, 6s); + }); + } + + void AttackStart(Unit* who) override + { + if (me->IsLevitating()) + { + me->Attack(who, true); + } + else + { + ScriptedAI::AttackStart(who); + } + } + + void DoAction(int32 param) override + { + if (param == ACTION_FLY_DOWN) + { + Talk(EMOTE_NAZAN); + me->SetReactState(REACT_PASSIVE); + me->InterruptNonMeleeSpells(true); + me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false); + } + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) + { + me->SetCanFly(false); + me->SetDisableGravity(false); + me->SetReactState(REACT_AGGRESSIVE); + scheduler.CancelGroup(GROUP_PHASE_1); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + scheduler.Schedule(5s, GROUP_PHASE_2, [this](TaskContext context) { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } - - void Reset() override - { - me->SetCanFly(true); - me->SetDisableGravity(true); - events.Reset(); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - me->DespawnOrUnsummon(1); - } - - void JustEngagedWith(Unit*) override - { - scheduler.CancelGroup(GROUP_PHASE_2); - scheduler.Schedule(5ms, GROUP_PHASE_1, [this](TaskContext context) - { - me->GetMotionMaster()->MovePoint(POINT_FLIGHT, NazanPos[urand(0, 2)], false); - scheduler.DelayAll(7s); - context.Repeat(30s); - }).Schedule(5s, GROUP_PHASE_1, [this](TaskContext context) + DoCastVictim(SPELL_CONE_OF_FIRE); + context.Repeat(12s); + }).Schedule(6s, GROUP_PHASE_2, [this](TaskContext context) { DoCastRandomTarget(SPELL_FIREBALL); context.Repeat(4s, 6s); }); - } - - void AttackStart(Unit* who) override - { - if (me->IsLevitating()) - me->Attack(who, true); - else - ScriptedAI::AttackStart(who); - } - - void DoAction(int32 param) override - { - if (param == ACTION_FLY_DOWN) + if (IsHeroic()) { - Talk(EMOTE_NAZAN); - events.Reset(); - me->SetReactState(REACT_PASSIVE); - me->InterruptNonMeleeSpells(true); - me->GetMotionMaster()->MovePoint(POINT_MIDDLE, -1406.5f, 1746.5f, 81.2f, false); - } - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == POINT_MOTION_TYPE && id == POINT_MIDDLE) - { - me->SetCanFly(false); - me->SetDisableGravity(false); - me->SetReactState(REACT_AGGRESSIVE); - scheduler.CancelGroup(GROUP_PHASE_1); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - - scheduler.Schedule(5s, GROUP_PHASE_2, [this](TaskContext context) + scheduler.Schedule(10s, GROUP_PHASE_2, [this](TaskContext context) { - DoCastVictim(SPELL_CONE_OF_FIRE); - context.Repeat(12s); - }).Schedule(6s, GROUP_PHASE_2, [this](TaskContext context) - { - DoCastRandomTarget(SPELL_FIREBALL); - context.Repeat(4s, 6s); + DoCastSelf(SPELL_BELLOWING_ROAR); + context.Repeat(30s); }); - if (IsHeroic()) - { - scheduler.Schedule(10s, GROUP_PHASE_2, [this](TaskContext context) - { - DoCastSelf(SPELL_BELLOWING_ROAR); - context.Repeat(30s); - }); - } } } - - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (!me->IsLevitating()) - DoMeleeAttackIfReady(); - } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHellfireRampartsAI(creature); } -}; -class boss_vazruden : public CreatureScript -{ -public: - boss_vazruden() : CreatureScript("boss_vazruden") { } - - struct boss_vazrudenAI : public BossAI + void UpdateAI(uint32 /*diff*/) override { - boss_vazrudenAI(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) - { - scheduler.SetValidator([this] - { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } + if (!UpdateVictim()) + return; - void Reset() override - { - events.Reset(); - _nazanCalled = false; - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - Talk(SAY_WIPE); - me->DespawnOrUnsummon(1); - } - - void JustEngagedWith(Unit*) override - { - scheduler.Schedule(5s, [this](TaskContext /*context*/) - { - Talk(SAY_AGGRO); - }).Schedule(4s, [this](TaskContext context) - { - DoCastVictim(DUNGEON_MODE(SPELL_REVENGE, SPELL_REVENGE_H)); - context.Repeat(6s); - }); - } - - void KilledUnit(Unit*) override - { - if (!_hasSpoken) - { - _hasSpoken = true; - Talk(SAY_KILL); - } - scheduler.Schedule(6s, [this](TaskContext /*context*/) - { - _hasSpoken = false; - }); - } - - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override - { - if (!_nazanCalled && me->HealthBelowPctDamaged(35, damage)) - { - _nazanCalled = true; - me->CastSpell(me, SPELL_CALL_NAZAN, true); - } - } - - void JustDied(Unit*) override - { - Talk(SAY_DIE); - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + if (!me->IsLevitating()) DoMeleeAttackIfReady(); - } - - private: - EventMap events; - bool _hasSpoken; - bool _nazanCalled; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHellfireRampartsAI(creature); } }; -class spell_vazruden_fireball : public SpellScriptLoader +struct boss_vazruden : public BossAI { -public: - spell_vazruden_fireball() : SpellScriptLoader("spell_vazruden_fireball") { } - - class spell_vazruden_fireball_SpellScript : public SpellScript + boss_vazruden(Creature* creature) : BossAI(creature, DATA_VAZRUDEN) { - PrepareSpellScript(spell_vazruden_fireball_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + scheduler.SetValidator([this] { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_SUMMON_LIQUID_FIRE, true); - } + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_vazruden_fireball_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Reset() override { - return new spell_vazruden_fireball_SpellScript(); + _nazanCalled = false; + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + Talk(SAY_WIPE); + me->DespawnOrUnsummon(1); + } + + void JustEngagedWith(Unit*) override + { + scheduler.Schedule(5s, [this](TaskContext /*context*/) + { + Talk(SAY_AGGRO); + }).Schedule(4s, [this](TaskContext context) + { + DoCastVictim(SPELL_REVENGE); + context.Repeat(6s); + }); + } + + void KilledUnit(Unit*) override + { + if (!_hasSpoken) + { + _hasSpoken = true; + Talk(SAY_KILL); + } + scheduler.Schedule(6s, [this](TaskContext /*context*/) + { + _hasSpoken = false; + }); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override + { + if (!_nazanCalled && me->HealthBelowPctDamaged(35, damage)) + { + _nazanCalled = true; + DoCastSelf(SPELL_CALL_NAZAN, true); + } + } + + void JustDied(Unit*) override + { + Talk(SAY_DIE); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + scheduler.Update(diff); + DoMeleeAttackIfReady(); + } + +private: + bool _hasSpoken; + bool _nazanCalled; +}; + +class spell_vazruden_fireball : public SpellScript +{ + PrepareSpellScript(spell_vazruden_fireball); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + { + target->CastSpell(target, SPELL_SUMMON_LIQUID_FIRE, true); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_vazruden_fireball::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_vazruden_call_nazan : public SpellScriptLoader +class spell_vazruden_call_nazan : public SpellScript { -public: - spell_vazruden_call_nazan() : SpellScriptLoader("spell_vazruden_call_nazan") { } + PrepareSpellScript(spell_vazruden_call_nazan); - class spell_vazruden_call_nazan_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_vazruden_call_nazan_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - target->GetAI()->DoAction(ACTION_FLY_DOWN); + target->GetAI()->DoAction(ACTION_FLY_DOWN); } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_vazruden_call_nazan_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_vazruden_call_nazan_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_vazruden_call_nazan::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_boss_vazruden_the_herald() { - new boss_vazruden_the_herald(); - new boss_vazruden(); - new boss_nazan(); - new spell_vazruden_fireball(); - new spell_vazruden_call_nazan(); + RegisterHellfireRampartsCreatureAI(boss_vazruden_the_herald); + RegisterHellfireRampartsCreatureAI(boss_vazruden); + RegisterHellfireRampartsCreatureAI(boss_nazan); + RegisterSpellScript(spell_vazruden_fireball); + RegisterSpellScript(spell_vazruden_call_nazan); } diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp index bb3a374d3..4718cc6fb 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp @@ -41,121 +41,110 @@ enum Misc NPC_HELLFIRE_WATCHER = 17309 }; -class boss_watchkeeper_gargolmar : public CreatureScript +struct boss_watchkeeper_gargolmar : public BossAI { -public: - boss_watchkeeper_gargolmar() : CreatureScript("boss_watchkeeper_gargolmar") { } - - struct boss_watchkeeper_gargolmarAI : public BossAI + boss_watchkeeper_gargolmar(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR) { - boss_watchkeeper_gargolmarAI(Creature* creature) : BossAI(creature, DATA_WATCHKEEPER_GARGOLMAR) + _taunted = false; + scheduler.SetValidator([this] { - _taunted = false; - - scheduler.SetValidator([this] - { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } - - void Reset() override - { - _Reset(); - - ScheduleHealthCheckEvent(50, [&]{ - Talk(SAY_HEAL); - std::list clist; - me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER); - for (std::list::const_iterator itr = clist.begin(); itr != clist.end(); ++itr) - (*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0); - }); - - ScheduleHealthCheckEvent(20, [&]{ - DoCastSelf(SPELL_RETALIATION); - scheduler.Schedule(30s, [this](TaskContext context) - { - DoCastSelf(SPELL_RETALIATION); - context.Repeat(30s); - }); - }); - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - _JustEngagedWith(); - - scheduler.Schedule(5s, [this] (TaskContext context) - { - DoCastVictim(SPELL_MORTAL_WOUND); - context.Repeat(8s); - }).Schedule(3s, [this](TaskContext context) - { - Talk(SAY_SURGE); - if(Unit* target = SelectTarget((SelectTargetMethod::MinDistance), 0)) - { - me->CastSpell(target, SPELL_SURGE); - } - context.Repeat(11s); - }); - } - - void MoveInLineOfSight(Unit* who) override - { - if (!_taunted) - { - if (who->GetTypeId() == TYPEID_PLAYER) - { - _taunted = true; - Talk(SAY_TAUNT); - } - } - - BossAI::MoveInLineOfSight(who); - } - - void KilledUnit(Unit*) override - { - if (!_hasSpoken) - { - _hasSpoken = true; - Talk(SAY_KILL); - } - scheduler.Schedule(6s, [this](TaskContext /*context*/) - { - _hasSpoken = false; - }); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DIE); - _JustDied(); - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - DoMeleeAttackIfReady(); - } - - private: - bool _taunted; - bool _hasSpoken; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHellfireRampartsAI(creature); + return !me->HasUnitState(UNIT_STATE_CASTING); + }); } + + void Reset() override + { + _Reset(); + ScheduleHealthCheckEvent(50, [&]{ + Talk(SAY_HEAL); + std::list clist; + me->GetCreaturesWithEntryInRange(clist, 100.0f, NPC_HELLFIRE_WATCHER); + for (std::list::const_iterator itr = clist.begin(); itr != clist.end(); ++itr) + { + (*itr)->AI()->SetData(NPC_HELLFIRE_WATCHER, 0); + } + }); + + ScheduleHealthCheckEvent(20, [&]{ + DoCastSelf(SPELL_RETALIATION); + scheduler.Schedule(30s, [this](TaskContext context) + { + DoCastSelf(SPELL_RETALIATION); + context.Repeat(30s); + }); + }); + } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + _JustEngagedWith(); + scheduler.Schedule(5s, [this] (TaskContext context) + { + DoCastVictim(SPELL_MORTAL_WOUND); + context.Repeat(8s); + }).Schedule(3s, [this](TaskContext context) + { + Talk(SAY_SURGE); + if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0)) + { + me->CastSpell(target, SPELL_SURGE); + } + context.Repeat(11s); + }); + } + + void MoveInLineOfSight(Unit* who) override + { + if (!_taunted) + { + if (who->GetTypeId() == TYPEID_PLAYER) + { + _taunted = true; + Talk(SAY_TAUNT); + } + } + BossAI::MoveInLineOfSight(who); + } + + void KilledUnit(Unit*) override + { + if (!_hasSpoken) + { + _hasSpoken = true; + Talk(SAY_KILL); + } + scheduler.Schedule(6s, [this](TaskContext /*context*/) + { + _hasSpoken = false; + }); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DIE); + _JustDied(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + scheduler.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + DoMeleeAttackIfReady(); + } + +private: + bool _taunted; + bool _hasSpoken; + }; void AddSC_boss_watchkeeper_gargolmar() { - new boss_watchkeeper_gargolmar(); + RegisterHellfireRampartsCreatureAI(boss_watchkeeper_gargolmar); } diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h index 35c71f723..0f6109880 100644 --- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h +++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h @@ -52,4 +52,6 @@ inline AI* GetHellfireRampartsAI(T* obj) return GetInstanceAI(obj, HellfireRampartsScriptName); } +#define RegisterHellfireRampartsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetHellfireRampartsAI) + #endif diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index f74bb1aa3..606abfbdb 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -20,7 +20,7 @@ #include "ScriptedCreature.h" #include "shattered_halls.h" -enum eGrandWarlockNethekurse +enum Says { SAY_INTRO = 0, SAY_INTRO_2 = 1, @@ -30,41 +30,42 @@ enum eGrandWarlockNethekurse SAY_SHADOW_FISSURE = 5, SAY_DEATH_COIL = 6, SAY_SLAY = 7, - SAY_DIE = 8, + SAY_DIE = 8 +}; - SPELL_DEATH_COIL_N = 30500, - SPELL_DEATH_COIL_H = 35954, +enum Spells +{ + SPELL_DEATH_COIL = 30500, SPELL_DARK_SPIN = 30502, SPELL_SHADOW_FISSURE = 30496, - SPELL_SHADOW_CLEAVE_N = 30495, - SPELL_SHADOW_SLAM_H = 35953, + SPELL_SHADOW_CLEAVE = 30495, - // Spells used exclusively in RP SPELL_SHADOW_SEAR = 30735, - SPELL_DEATH_COIL = 30741, - SPELL_SHADOW_FISSURE_RP = 30745, + SPELL_DEATH_COIL_RP = 30741, + SPELL_SHADOW_FISSURE_RP = 30745 +}; +enum Events +{ EVENT_INTRO = 1, EVENT_START_ATTACK = 2, EVENT_STAGE_NONE = 0, EVENT_STAGE_INTRO = 1, EVENT_STAGE_TAUNT = 2, - EVENT_STAGE_MAIN = 3, - - SETDATA_DATA = 1, - SETDATA_PEON_AGGRO = 1, - SETDATA_PEON_DEATH = 2, + EVENT_STAGE_MAIN = 3 }; -enum Creatures +enum Data { - NPC_PEON = 17083 + SETDATA_DATA = 1, + SETDATA_PEON_AGGRO = 1, + SETDATA_PEON_DEATH = 2 }; enum Groups { - GROUP_RP = 0, + GROUP_RP = 0 }; enum Actions @@ -74,336 +75,306 @@ enum Actions ACTION_START_COMBAT = 2, }; -// ######################################################## -// Grand Warlock Nethekurse -// ######################################################## - float NethekurseIntroPath[4][3] = { - {184.78966f, 290.3699f, -8.18139f}, + {184.78966f, 290.3699f, -8.18139f}, {178.51125f, 278.779022f, -8.183065f}, - {171.82281f, 289.97687f, -8.185595f}, - {178.51125f, 287.97794f, -8.183065f} + {171.82281f, 289.97687f, -8.185595f}, + {178.51125f, 287.97794f, -8.183065f} }; -class boss_grand_warlock_nethekurse : public CreatureScript +struct boss_grand_warlock_nethekurse : public BossAI { -public: - boss_grand_warlock_nethekurse() : CreatureScript("boss_grand_warlock_nethekurse") { } - - struct boss_grand_warlock_nethekurseAI : public BossAI + boss_grand_warlock_nethekurse(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { - boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) + scheduler.SetValidator([this] { - scheduler.SetValidator([this] - { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); - } + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } - EventMap events2; - void Reset() override + EventMap events2; + + void Reset() override + { + EventStage = EVENT_STAGE_NONE; + _Reset(); + events2.Reset(); + ScheduleHealthCheckEvent(25, [&] { + DoCastSelf(SPELL_DARK_SPIN); + }); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DIE); + _JustDied(); + } + + void SetData(uint32 data, uint32 value) override + { + if (data != SETDATA_DATA) + return; + + switch (value) { - EventStage = EVENT_STAGE_NONE; - _Reset(); - events2.Reset(); + case SETDATA_PEON_AGGRO: + if (PeonEngagedCount >= 4) + return; - ScheduleHealthCheckEvent(25, [&] { - DoCastSelf(SPELL_DARK_SPIN); - }); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DIE); - _JustDied(); - } - - void SetData(uint32 data, uint32 value) override - { - if (data != SETDATA_DATA) - return; - - switch (value) - { - case SETDATA_PEON_AGGRO: - if (PeonEngagedCount >= 4) - return; - - if (EventStage < EVENT_STAGE_TAUNT) - { - Talk(SAY_PEON_ATTACKED); - } - break; - case SETDATA_PEON_DEATH: - if (PeonKilledCount >= 4) - return; - - if (EventStage < EVENT_STAGE_TAUNT) - { - PeonDieRP(); - } - if (++PeonKilledCount == 4) - DoAction(ACTION_CANCEL_INTRO); - break; - } - } - - void PeonDieRP() - { - me->GetMotionMaster()->Clear(); - me->SetFacingTo(4.572762489318847656f); - scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) - { - me->HandleEmoteCommand(EMOTE_ONESHOT_APPLAUD); - Talk(SAY_PEON_DIES); - }); - } - - void AttackStart(Unit* who) override - { - if (EventStage < EVENT_STAGE_MAIN) - return; - - if (me->Attack(who, true)) - { - DoStartMovement(who); - CombatEventScheduler(); - } - } - - void CombatEventScheduler() - { - scheduler.Schedule(12150ms, 19850ms, [this](TaskContext context) - { - if (me->HealthBelowPct(90)) + if (EventStage < EVENT_STAGE_TAUNT) { - DoCastRandomTarget(DUNGEON_MODE(SPELL_DEATH_COIL_N, SPELL_DEATH_COIL_H), 0, 30.0f, true); + Talk(SAY_PEON_ATTACKED); } - context.Repeat(); - }).Schedule(8100ms, 17300ms, [this](TaskContext context) - { - DoCastRandomTarget(SPELL_SHADOW_FISSURE, 0, 60.0f, true); - context.Repeat(8450ms, 9450ms); - }).Schedule(10950ms, 21850ms, [this](TaskContext context) - { - DoCastVictim(DUNGEON_MODE(SPELL_SHADOW_CLEAVE_N, SPELL_SHADOW_SLAM_H)); - context.Repeat(1200ms, 23900ms); - }); - } + break; + case SETDATA_PEON_DEATH: + if (PeonKilledCount >= 4) + return; - void MoveInLineOfSight(Unit* /*who*/) override - { - if (EventStage == EVENT_STAGE_NONE) - { - if (me->SelectNearestPlayer(30.0f)) + if (EventStage < EVENT_STAGE_TAUNT) + { + PeonDieRP(); + } + if (++PeonKilledCount == 4) { DoAction(ACTION_CANCEL_INTRO); } - } + break; } + } - void IntroRP() + void PeonDieRP() + { + me->GetMotionMaster()->Clear(); + me->SetFacingTo(4.572762489318847656f); + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) { - scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext context) + me->HandleEmoteCommand(EMOTE_ONESHOT_APPLAUD); + Talk(SAY_PEON_DIES); + }); + } + + void AttackStart(Unit* who) override + { + if (EventStage < EVENT_STAGE_MAIN) + return; + + if (me->Attack(who, true)) + { + DoStartMovement(who); + CombatEventScheduler(); + } + } + + void CombatEventScheduler() + { + scheduler.Schedule(12150ms, 19850ms, [this](TaskContext context) + { + if (me->HealthBelowPct(90)) { - me->GetMotionMaster()->Clear(); - scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) - { - uint32 choicelocation = urand(1, 3); - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MovePoint(0, NethekurseIntroPath[choicelocation][0], NethekurseIntroPath[choicelocation][1], NethekurseIntroPath[choicelocation][2]); - scheduler.Schedule(2500ms, GROUP_RP, [this, choicelocation](TaskContext /*context*/) - { - CastRandomPeonSpell(choicelocation); - }); - }); - context.Repeat(16400ms, 28500ms); - }); - } - - void JustEngagedWith(Unit* /*who*/) override + DoCastRandomTarget(SPELL_DEATH_COIL, 0, 30.0f, true); + } + context.Repeat(); + }).Schedule(8100ms, 17300ms, [this](TaskContext context) { - _JustEngagedWith(); - if (EventStage == EVENT_STAGE_NONE) + DoCastRandomTarget(SPELL_SHADOW_FISSURE, 0, 60.0f, true); + context.Repeat(8450ms, 9450ms); + }).Schedule(10950ms, 21850ms, [this](TaskContext context) + { + DoCastVictim(SPELL_SHADOW_CLEAVE); + context.Repeat(1200ms, 23900ms); + }); + } + + void MoveInLineOfSight(Unit* /*who*/) override + { + if (EventStage == EVENT_STAGE_NONE) + { + if (me->SelectNearestPlayer(30.0f)) { DoAction(ACTION_CANCEL_INTRO); - CombatEventScheduler(); } } + } - void CastRandomPeonSpell(uint32 choice) + void IntroRP() + { + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext context) { - if (choice == 1) + me->GetMotionMaster()->Clear(); + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) { - Talk(SAY_DEATH_COIL); - me->CastSpell(me, SPELL_DEATH_COIL, false); - } - else if (choice == 2) - { - Talk(SAY_SHADOW_FISSURE); - me->CastSpell(me, SPELL_SHADOW_FISSURE_RP, false); - } - else if (choice == 3) - { - Talk(SAY_SHADOW_SEAR); - me->CastSpell(me, SPELL_SHADOW_SEAR, false); - } + uint32 choicelocation = urand(1, 3); + me->GetMotionMaster()->MoveIdle(); + me->GetMotionMaster()->MovePoint(0, NethekurseIntroPath[choicelocation][0], NethekurseIntroPath[choicelocation][1], NethekurseIntroPath[choicelocation][2]); + scheduler.Schedule(2500ms, GROUP_RP, [this, choicelocation](TaskContext /*context*/) + { + CastRandomPeonSpell(choicelocation); + }); + }); + context.Repeat(16400ms, 28500ms); + }); + } + + void JustEngagedWith(Unit* /*who*/) override + { + _JustEngagedWith(); + if (EventStage == EVENT_STAGE_NONE) + { + DoAction(ACTION_CANCEL_INTRO); + CombatEventScheduler(); } + } - void KilledUnit(Unit* /*victim*/) override + void CastRandomPeonSpell(uint32 choice) + { + if (choice == 1) { - Talk(SAY_SLAY); + Talk(SAY_DEATH_COIL); + me->CastSpell(me, SPELL_DEATH_COIL_RP, false); } - - void DoAction(int32 action) override + else if (choice == 2) { - if (action == ACTION_CANCEL_INTRO) - { - introDone = true; - scheduler.CancelGroup(GROUP_RP); - events2.ScheduleEvent(EVENT_START_ATTACK, 1000); - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); - me->SetInCombatWithZone(); - Talk(SAY_INTRO_2); - me->SetHomePosition(NethekurseIntroPath[3][0], NethekurseIntroPath[3][1], NethekurseIntroPath[3][2], 4.572762489318847656f); - me->RemoveUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); - return; - } + Talk(SAY_SHADOW_FISSURE); + me->CastSpell(me, SPELL_SHADOW_FISSURE_RP, false); + } + else if (choice == 3) + { + Talk(SAY_SHADOW_SEAR); + me->CastSpell(me, SPELL_SHADOW_SEAR, false); + } + } - if (action != ACTION_START_INTRO) - { - return; - } + void KilledUnit(Unit* /*victim*/) override + { + Talk(SAY_SLAY); + } - if (ATreached == true) - { - return; - } - - ATreached = true; - me->SetUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); - events2.ScheduleEvent(EVENT_INTRO, 90000); - Talk(SAY_INTRO); - EventStage = EVENT_STAGE_INTRO; + void DoAction(int32 action) override + { + if (action == ACTION_CANCEL_INTRO) + { + introDone = true; + scheduler.CancelGroup(GROUP_RP); + events2.ScheduleEvent(EVENT_START_ATTACK, 1000); instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); me->SetInCombatWithZone(); - IntroRP(); + Talk(SAY_INTRO_2); + me->SetHomePosition(NethekurseIntroPath[3][0], NethekurseIntroPath[3][1], NethekurseIntroPath[3][2], 4.572762489318847656f); + me->RemoveUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); + return; } - void UpdateAI(uint32 diff) override - { - events2.Update(diff); - scheduler.Update(diff); - uint32 eventId = events2.ExecuteEvent(); + if (action != ACTION_START_INTRO) + return; - if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) + if (ATreached == true) + return; + + ATreached = true; + me->SetUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); + events2.ScheduleEvent(EVENT_INTRO, 90000); + Talk(SAY_INTRO); + EventStage = EVENT_STAGE_INTRO; + instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); + me->SetInCombatWithZone(); + IntroRP(); + } + + void UpdateAI(uint32 diff) override + { + events2.Update(diff); + scheduler.Update(diff); + uint32 eventId = events2.ExecuteEvent(); + if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) + { + if (eventId == EVENT_INTRO) { - if (eventId == EVENT_INTRO) - { - EventStage = EVENT_STAGE_TAUNT; - } - else if (eventId == EVENT_START_ATTACK) - { - EventStage = EVENT_STAGE_MAIN; - if (Unit* target = me->SelectNearestPlayer(50.0f)) - AttackStart(target); - DoAction(ACTION_CANCEL_INTRO); - return; - } + EventStage = EVENT_STAGE_TAUNT; } - - if (!UpdateVictim()) - return; - - if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (!me->HealthBelowPct(25)) - DoMeleeAttackIfReady(); - } - - private: - uint8 PeonEngagedCount = 0; - uint8 PeonKilledCount = 0; - uint8 EventStage; - bool introDone; - bool ATreached = false; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetShatteredHallsAI(creature); - } -}; - -class spell_tsh_shadow_sear : public SpellScriptLoader -{ -public: - spell_tsh_shadow_sear() : SpellScriptLoader("spell_tsh_shadow_sear") { } - - class spell_tsh_shadow_sear_AuraScript : public AuraScript - { - PrepareAuraScript(spell_tsh_shadow_sear_AuraScript); - - void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = 0; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear_AuraScript::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_tsh_shadow_sear_AuraScript(); - } -}; - -class spell_tsh_shadow_bolt : public SpellScriptLoader -{ -public: - spell_tsh_shadow_bolt() : SpellScriptLoader("spell_tsh_shadow_bolt") { } - - class spell_tsh_shadow_bolt_SpellScript : public SpellScript - { - PrepareSpellScript(spell_tsh_shadow_bolt_SpellScript); - - void SelectRandomPlayer(WorldObject*& target) - { - if (Creature* caster = GetCaster()->ToCreature()) + else if (eventId == EVENT_START_ATTACK) { - std::list playerList; - Map::PlayerList const& players = caster->GetMap()->GetPlayers(); - for (auto itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()->ToPlayer()) - if (player->IsWithinDist(caster, 100.0f) && player->IsAlive()) - playerList.push_back(player); - - if (!playerList.empty()) - target = Acore::Containers::SelectRandomContainerElement(playerList); + EventStage = EVENT_STAGE_MAIN; + if (Unit* target = me->SelectNearestPlayer(50.0f)) + { + AttackStart(target); + } + DoAction(ACTION_CANCEL_INTRO); + return; } } - void Register() override - { - OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_tsh_shadow_bolt_SpellScript::SelectRandomPlayer, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); - } - }; + if (!UpdateVictim()) + return; - SpellScript* GetSpellScript() const override + if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (!me->HealthBelowPct(25)) + DoMeleeAttackIfReady(); + } + +private: + uint8 PeonEngagedCount = 0; + uint8 PeonKilledCount = 0; + uint8 EventStage; + bool introDone; + bool ATreached = false; +}; + +class spell_tsh_shadow_sear : public AuraScript +{ + PrepareAuraScript(spell_tsh_shadow_sear); + + void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - return new spell_tsh_shadow_bolt_SpellScript(); + amount = 0; + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; + +class spell_tsh_shadow_bolt : public SpellScript +{ + PrepareSpellScript(spell_tsh_shadow_bolt); + + void SelectRandomPlayer(WorldObject*& target) + { + if (Creature* caster = GetCaster()->ToCreature()) + { + std::list playerList; + Map::PlayerList const& players = caster->GetMap()->GetPlayers(); + for (auto itr = players.begin(); itr != players.end(); ++itr) + { + if (Player* player = itr->GetSource()->ToPlayer()) + { + if (player->IsWithinDist(caster, 100.0f) && player->IsAlive()) + { + playerList.push_back(player); + } + } + } + + if (!playerList.empty()) + { + target = Acore::Containers::SelectRandomContainerElement(playerList); + } + } + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_tsh_shadow_bolt::SelectRandomPlayer, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); + } +}; + class at_rp_nethekurse : public AreaTriggerScript { public: - at_rp_nethekurse() : AreaTriggerScript - ("at_rp_nethekurse") { } + at_rp_nethekurse() : AreaTriggerScript("at_rp_nethekurse") { } bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override { @@ -427,8 +398,8 @@ public: void AddSC_boss_grand_warlock_nethekurse() { - new boss_grand_warlock_nethekurse(); - new spell_tsh_shadow_sear(); - new spell_tsh_shadow_bolt(); + RegisterShatteredHallsCreatureAI(boss_grand_warlock_nethekurse); + RegisterSpellScript(spell_tsh_shadow_sear); + RegisterSpellScript(spell_tsh_shadow_bolt); new at_rp_nethekurse(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index 9f72931a6..eb6ebc266 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -25,10 +25,13 @@ enum Spells SPELL_FEAR = 30584, SPELL_THUNDERCLAP = 30633, SPELL_BEATDOWN = 30618, - SPELL_BURNING_MAUL_N = 30598, - SPELL_BURNING_MAUL_H = 36056, + SPELL_BURNING_MAUL = 30598 +}; + +enum Equip +{ EQUIP_STANDARD = 1, - EQUIP_BURNING_MAUL = 2, + EQUIP_BURNING_MAUL = 2 }; enum Creatures @@ -50,233 +53,219 @@ enum Events EVENT_AGGRO_YELL_1 = 1, EVENT_AGGRO_YELL_2 = 2, EVENT_AGGRO_YELL_3 = 3, - EVENT_THREAT_YELL_L_1 = 4, EVENT_THREAT_YELL_L_2 = 5, EVENT_THREAT_YELL_L_3 = 6, - EVENT_THREAT_YELL_R_1 = 7, - EVENT_KILL_YELL_LEFT = 8, EVENT_KILL_YELL_RIGHT = 9, - EVENT_DEATH_YELL = 10, + EVENT_DEATH_YELL = 10 }; enum Phase { - GROUP_NON_BURNING_PHASE = 0, - GROUP_BURNING_PHASE = 1, - GROUP_FULL_PHASE = 2 + GROUP_NON_BURNING_PHASE = 0, + GROUP_BURNING_PHASE = 1, + GROUP_FULL_PHASE = 2 }; -// ######################################################## -// Warbringer_Omrogg -// ######################################################## - -class boss_warbringer_omrogg : public CreatureScript +struct boss_warbringer_omrogg : public BossAI { -public: - boss_warbringer_omrogg() : CreatureScript("boss_warbringer_omrogg") { } - - struct boss_warbringer_omroggAI : public BossAI + boss_warbringer_omrogg(Creature* creature) : BossAI(creature, DATA_OMROGG) { - boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG) + scheduler.SetValidator([this] { - scheduler.SetValidator([this] - { - return !me->HasUnitState(UNIT_STATE_CASTING); - }); + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } + + EventMap events2; + + Creature* GetLeftHead() + { + return summons.GetCreatureWithEntry(NPC_LEFT_HEAD); + } + + Creature* GetRightHead() + { + return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD); + } + + void JustEngagedWith(Unit* /*who*/) override + { + me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); + me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); + + if (Creature* LeftHead = GetLeftHead()) + { + uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3); + LeftHead->AI()->Talk(aggroYell - 1); + events2.ScheduleEvent(aggroYell, 3000); } - EventMap events2; - - Creature* GetLeftHead() + _JustEngagedWith(); + scheduler.Schedule(500ms, GROUP_FULL_PHASE, [this](TaskContext context) { - return summons.GetCreatureWithEntry(NPC_LEFT_HEAD); - } - - Creature* GetRightHead() - { - return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD); - } - - void JustEngagedWith(Unit* /*who*/) override - { - me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - - if (Creature* LeftHead = GetLeftHead()) + scheduler.Schedule(12100ms, 17300ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context) { - uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3); - LeftHead->AI()->Talk(aggroYell - 1); - events2.ScheduleEvent(aggroYell, 3000); - } - - _JustEngagedWith(); - scheduler.Schedule(500ms, GROUP_FULL_PHASE, [this](TaskContext context) + DoCastAOE(SPELL_THUNDERCLAP); + context.Repeat(17200ms, 24200ms); + }).Schedule(20s, 30s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) { - scheduler.Schedule(12100ms, 17300ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context) + DoCastSelf(SPELL_BEATDOWN); + me->SetUnitFlag(UNIT_FLAG_PACIFIED); + me->SetReactState(REACT_PASSIVE); + scheduler.Schedule(200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) { - DoCastAOE(SPELL_THUNDERCLAP); - context.Repeat(17200ms, 24200ms); - }).Schedule(20s, 30s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + { + uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); + if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) + { + head->AI()->Talk(threatYell - 1); + } + events.ScheduleEvent(threatYell, 3000); + DoResetThreatList(); + me->AddThreat(target, 2250.0f); + scheduler.Schedule(1200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + { + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + }); + } + }).Schedule(40s, 60s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) { - DoCastSelf(SPELL_BEATDOWN, false); me->SetUnitFlag(UNIT_FLAG_PACIFIED); me->SetReactState(REACT_PASSIVE); - scheduler.Schedule(200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + scheduler.Schedule(1200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCastSelf(SPELL_FEAR); + DoCastSelf(SPELL_BURNING_MAUL); + me->LoadEquipment(EQUIP_BURNING_MAUL); + scheduler.CancelGroup(GROUP_NON_BURNING_PHASE); + scheduler.Schedule(200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) { - uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); - if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) - head->AI()->Talk(threatYell - 1); - events.ScheduleEvent(threatYell, 3000); - DoResetThreatList(); - me->AddThreat(target, 2250.0f); - scheduler.Schedule(1200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + me->Yell("%s roars!", LANG_UNIVERSAL); + scheduler.Schedule(2200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) { - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); - }); - } - }).Schedule(40s, 60s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) - { - me->SetUnitFlag(UNIT_FLAG_PACIFIED); - me->SetReactState(REACT_PASSIVE); - scheduler.Schedule(1200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) - { - DoCastSelf(SPELL_FEAR, false); - DoCastSelf(DUNGEON_MODE(SPELL_BURNING_MAUL_N, SPELL_BURNING_MAUL_H), false); - me->LoadEquipment(EQUIP_BURNING_MAUL); - scheduler.CancelGroup(GROUP_NON_BURNING_PHASE); - scheduler.Schedule(200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) - { - me->Yell("%s roars!", LANG_UNIVERSAL); - scheduler.Schedule(2200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); + if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) { - uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); - if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) - head->AI()->Talk(threatYell - 1); - events.ScheduleEvent(threatYell, 3000); - - DoResetThreatList(); - me->AddThreat(target, 2250.0f); - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + head->AI()->Talk(threatYell - 1); } - }); - }); - scheduler.Schedule(4850ms, 8500ms, GROUP_BURNING_PHASE, [this](TaskContext context) - { - DoCastAOE(SPELL_BLAST_WAVE, false); - context.Repeat(4850ms, 8500ms); - }).Schedule(45s, 60s, GROUP_BURNING_PHASE, [this](TaskContext context) - { - me->LoadEquipment(EQUIP_STANDARD); - context.CancelGroup(GROUP_BURNING_PHASE); - scheduler.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); - context.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); - context.RescheduleGroup(GROUP_FULL_PHASE, 1050ms); + events.ScheduleEvent(threatYell, 3000); + DoResetThreatList(); + me->AddThreat(target, 2250.0f); + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + } }); }); + scheduler.Schedule(4850ms, 8500ms, GROUP_BURNING_PHASE, [this](TaskContext context) + { + DoCastAOE(SPELL_BLAST_WAVE, false); + context.Repeat(4850ms, 8500ms); + }).Schedule(45s, 60s, GROUP_BURNING_PHASE, [this](TaskContext context) + { + me->LoadEquipment(EQUIP_STANDARD); + context.CancelGroup(GROUP_BURNING_PHASE); + scheduler.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); + context.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); + context.RescheduleGroup(GROUP_FULL_PHASE, 1050ms); + }); }); }); - context.Repeat(130s, 150s); }); - } + context.Repeat(130s, 150s); + }); + } - void JustSummoned(Creature* summoned) override - { - summons.Summon(summoned); - } - - void KilledUnit(Unit* /*victim*/) override - { - Creature* head = nullptr; - uint32 eventId = EVENT_KILL_YELL_LEFT; - if (urand(0, 1)) - { - head = GetLeftHead(); - eventId = EVENT_KILL_YELL_LEFT; - } - else - { - head = GetRightHead(); - eventId = EVENT_KILL_YELL_RIGHT; - } - - if (head) - head->AI()->Talk(eventId - 1); - - events2.ScheduleEvent(eventId, 3000); - } - - void JustDied(Unit* /*killer*/) override - { - Creature* LeftHead = GetLeftHead(); - Creature* RightHead = GetRightHead(); - if (!LeftHead || !RightHead) - return; - - LeftHead->DespawnOrUnsummon(5000); - RightHead->DespawnOrUnsummon(5000); - - LeftHead->AI()->Talk(EVENT_DEATH_YELL - 1); - RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL); - - instance->SetBossState(DATA_OMROGG, DONE); - } - - void UpdateAI(uint32 diff) override - { - events2.Update(diff); - scheduler.Update(diff); - switch (uint32 eventId = events2.ExecuteEvent()) - { - case EVENT_AGGRO_YELL_1: - case EVENT_AGGRO_YELL_2: - case EVENT_AGGRO_YELL_3: - case EVENT_KILL_YELL_LEFT: - case EVENT_THREAT_YELL_L_1: - case EVENT_THREAT_YELL_L_2: - case EVENT_THREAT_YELL_L_3: - if (Creature* RightHead = GetRightHead()) - RightHead->AI()->Talk(eventId - 1); - break; - case EVENT_KILL_YELL_RIGHT: - case EVENT_THREAT_YELL_R_1: - if (Creature* LeftHead = GetLeftHead()) - LeftHead->AI()->Talk(eventId - 1); - break; - } - - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void JustSummoned(Creature* summoned) override { - return GetShatteredHallsAI(creature); + summons.Summon(summoned); + } + + void KilledUnit(Unit* /*victim*/) override + { + Creature* head = nullptr; + uint32 eventId = EVENT_KILL_YELL_LEFT; + if (urand(0, 1)) + { + head = GetLeftHead(); + eventId = EVENT_KILL_YELL_LEFT; + } + else + { + head = GetRightHead(); + eventId = EVENT_KILL_YELL_RIGHT; + } + + if (head) + { + head->AI()->Talk(eventId - 1); + } + events2.ScheduleEvent(eventId, 3000); + } + + void JustDied(Unit* /*killer*/) override + { + Creature* LeftHead = GetLeftHead(); + Creature* RightHead = GetRightHead(); + if (!LeftHead || !RightHead) + return; + + LeftHead->DespawnOrUnsummon(5000); + RightHead->DespawnOrUnsummon(5000); + LeftHead->AI()->Talk(EVENT_DEATH_YELL - 1); + RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL); + instance->SetBossState(DATA_OMROGG, DONE); + } + + void UpdateAI(uint32 diff) override + { + events2.Update(diff); + scheduler.Update(diff); + switch (uint32 eventId = events2.ExecuteEvent()) + { + case EVENT_AGGRO_YELL_1: + case EVENT_AGGRO_YELL_2: + case EVENT_AGGRO_YELL_3: + case EVENT_KILL_YELL_LEFT: + case EVENT_THREAT_YELL_L_1: + case EVENT_THREAT_YELL_L_2: + case EVENT_THREAT_YELL_L_3: + if (Creature* RightHead = GetRightHead()) + { + RightHead->AI()->Talk(eventId - 1); + } + break; + case EVENT_KILL_YELL_RIGHT: + case EVENT_THREAT_YELL_R_1: + if (Creature* LeftHead = GetLeftHead()) + { + LeftHead->AI()->Talk(eventId - 1); + } + break; + } + + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + DoMeleeAttackIfReady(); } }; -class npc_omrogg_heads : public CreatureScript +struct npc_omrogg_heads : public NullCreatureAI { -public: - npc_omrogg_heads() : CreatureScript("npc_omrogg_heads") { } - - struct npc_omrogg_headsAI : public NullCreatureAI - { - npc_omrogg_headsAI(Creature* creature) : NullCreatureAI(creature) { timer = 0; } + npc_omrogg_heads(Creature* creature) : NullCreatureAI(creature) + { + timer = 0; + } void SetData(uint32 data, uint32 value) override { @@ -297,16 +286,10 @@ public: } } uint32 timer; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetShatteredHallsAI(creature); - } }; void AddSC_boss_warbringer_omrogg() { - new boss_warbringer_omrogg(); - new npc_omrogg_heads(); + RegisterShatteredHallsCreatureAI(boss_warbringer_omrogg); + RegisterShatteredHallsCreatureAI(npc_omrogg_heads); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index 1df447a16..5c9a5c09a 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -21,170 +21,161 @@ enum Says { - SAY_AGGRO = 0, - SAY_SLAY = 1, - SAY_DEATH = 2 + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_DEATH = 2 }; enum Spells { - SPELL_BLADE_DANCE = 30739, - SPELL_CHARGE = 25821, - SPELL_SPRINT = 32720, + SPELL_BLADE_DANCE = 30739, + SPELL_CHARGE = 25821, + SPELL_SPRINT = 32720 }; enum Creatures { - NPC_SHATTERED_ASSASSIN = 17695, - NPC_HEARTHEN_GUARD = 17621, - NPC_SHARPSHOOTER_GUARD = 17622, - NPC_REAVER_GUARD = 17623 + NPC_SHATTERED_ASSASSIN = 17695, + NPC_HEARTHEN_GUARD = 17621, + NPC_SHARPSHOOTER_GUARD = 17622, + NPC_REAVER_GUARD = 17623 +}; + +enum Misc +{ + EVENT_SPELL_CHARGE = 1, + EVENT_MOVE_TO_NEXT_POINT = 2, + EVENT_BLADE_DANCE = 3, + EVENT_FINISH_BLADE_DANCE = 4 }; float AssassEntrance[3] = { 275.136f, -84.29f, 2.3f }; // y -8 float AssassExit[3] = { 184.233f, -84.29f, 2.3f }; // y -8 float AddsEntrance[3] = { 306.036f, -84.29f, 1.93f }; -enum Misc +struct boss_warchief_kargath_bladefist : public BossAI { - EVENT_CHECK_ROOM = 1, - EVENT_SUMMON_ADDS = 2, - EVENT_SUMMON_ASSASSINS = 3, - EVENT_SPELL_CHARGE = 4, - EVENT_MOVE_TO_NEXT_POINT = 5, - EVENT_BLADE_DANCE = 6, - EVENT_FINISH_BLADE_DANCE = 7 -}; - -class boss_warchief_kargath_bladefist : public CreatureScript -{ -public: - boss_warchief_kargath_bladefist() : CreatureScript("boss_warchief_kargath_bladefist") { } - - struct boss_warchief_kargath_bladefistAI : public BossAI + boss_warchief_kargath_bladefist(Creature* creature) : BossAI(creature, DATA_KARGATH) { - boss_warchief_kargath_bladefistAI(Creature* creature) : BossAI(creature, DATA_KARGATH) { } - - void InitializeAI() override + scheduler.SetValidator([this] { - BossAI::InitializeAI(); - if (instance) - if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EXECUTIONER))) - executioner->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - } + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } - void JustDied(Unit* /*killer*/) override + void InitializeAI() override + { + BossAI::InitializeAI(); + if (instance) { - Talk(SAY_DEATH); - _JustDied(); - - if (instance) - if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EXECUTIONER))) - executioner->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - _JustEngagedWith(); - - events.ScheduleEvent(EVENT_CHECK_ROOM, 5000); - events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); - events.ScheduleEvent(EVENT_SUMMON_ASSASSINS, 5000); - events.ScheduleEvent(EVENT_BLADE_DANCE, 30000); - events.ScheduleEvent(EVENT_SPELL_CHARGE, 0); - } - - void JustSummoned(Creature* summon) override - { - if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN) - summon->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0)); - - summons.Summon(summon); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE || id != 1) - return; - - me->CastSpell(me, SPELL_BLADE_DANCE, true); - events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - switch (events.ExecuteEvent()) + if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EXECUTIONER))) { - case EVENT_CHECK_ROOM: - if (me->GetPositionX() > 255 || me->GetPositionX() < 205) - { - EnterEvadeMode(); - return; - } - events.ScheduleEvent(EVENT_CHECK_ROOM, 5000); - break; - case EVENT_SUMMON_ASSASSINS: - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] + 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] - 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] + 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] - 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - break; - case EVENT_SUMMON_ADDS: - for (uint8 i = 0; i < 2; ++i) - me->SummonCreature(NPC_HEARTHEN_GUARD + urand(0, 2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - - events.ScheduleEvent(EVENT_SUMMON_ADDS, 30000); - break; - case EVENT_BLADE_DANCE: - events.DelayEvents(10001); - events.ScheduleEvent(EVENT_BLADE_DANCE, 40000); - events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); - events.ScheduleEvent(EVENT_FINISH_BLADE_DANCE, 10000); - events.SetPhase(1); - me->CastSpell(me, SPELL_SPRINT, true); - break; - case EVENT_MOVE_TO_NEXT_POINT: - { - float x = 210 + frand(0.0f, 35.0f); - float y = -65.0f - frand(0.0f, 35.0f); - me->GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ()); - break; - } - case EVENT_FINISH_BLADE_DANCE: - events.SetPhase(0); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_CHARGE, 3000); - break; - case EVENT_SPELL_CHARGE: - me->CastSpell(me->GetVictim(), SPELL_CHARGE, false); - break; + executioner->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); } - - if (!events.IsInPhase(1)) - DoMeleeAttackIfReady(); } - }; + } - CreatureAI* GetAI(Creature* creature) const override + void JustDied(Unit* /*killer*/) override { - return GetShatteredHallsAI(creature); + Talk(SAY_DEATH); + _JustDied(); + if (instance) + { + if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EXECUTIONER))) + { + executioner->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + } + } + } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + _JustEngagedWith(); + scheduler.Schedule(5s, [this](TaskContext /*context*/) + { + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] + 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] - 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] + 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] - 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + }).Schedule(30s, [this](TaskContext context) + { + for (uint8 i = 0; i < 2; ++i) + { + me->SummonCreature(NPC_HEARTHEN_GUARD + urand(0, 2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); + } + context.Repeat(30s); + }).Schedule(30s, [this](TaskContext context) + { + scheduler.DelayAll(10001ms); + context.Repeat(40s); + scheduler.Schedule(1ms, [this](TaskContext /*context*/) + { + float x = 210 + frand(0.0f, 35.0f); + float y = -65.0f - frand(0.0f, 35.0f); + me->GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ()); + }).Schedule(10s, [this](TaskContext /*context*/) + { + //events.SetPhase(0); howToMigrate? + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + if (IsHeroic()) + { + scheduler.Schedule(3s, [this](TaskContext context) + { + DoCastVictim(SPELL_CHARGE); + context.Repeat(30s); + }); + } + }); + //events.SetPhase(1); howToMigrate? + DoCastSelf(SPELL_SPRINT, true); + }); + } + + void JustSummoned(Creature* summon) override + { + if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN) + { + summon->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0)); + } + summons.Summon(summon); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE || id != 1) + return; + + me->CastSpell(me, SPELL_BLADE_DANCE, true); + events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); + } + + void UpdateAI(uint32 diff) override + { + if (me->GetPositionX() > 255 || me->GetPositionX() < 205) + { + EnterEvadeMode(); + return; + } + + if (!UpdateVictim()) + return; + + scheduler.Update(diff); + + if (!events.IsInPhase(1)) // howToMigrate? + DoMeleeAttackIfReady(); } }; void AddSC_boss_warchief_kargath_bladefist() { - new boss_warchief_kargath_bladefist(); + RegisterShatteredHallsCreatureAI(boss_warchief_kargath_bladefist); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h index 0e94153ef..249224ae4 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h @@ -73,4 +73,6 @@ inline AI* GetShatteredHallsAI(T* obj) return GetInstanceAI(obj, ShatteredHallsLairScriptName); } +#define RegisterShatteredHallsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetShatteredHallsAI) + #endif From 3f47275f6c59293383dbdaee6c19793675eb4703 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 14 May 2023 22:16:00 +0000 Subject: [PATCH 085/107] chore(DB): import pending files Referenced commit(s): 1724088e0665b6105646fc42de2fcf039b27bf50 --- .../rev_1684044915713162200.sql => db_world/2023_05_14_08.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1684044915713162200.sql => db_world/2023_05_14_08.sql} (86%) diff --git a/data/sql/updates/pending_db_world/rev_1684044915713162200.sql b/data/sql/updates/db_world/2023_05_14_08.sql similarity index 86% rename from data/sql/updates/pending_db_world/rev_1684044915713162200.sql rename to data/sql/updates/db_world/2023_05_14_08.sql index 38b615465..ffd901a14 100644 --- a/data/sql/updates/pending_db_world/rev_1684044915713162200.sql +++ b/data/sql/updates/db_world/2023_05_14_08.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_07 -> 2023_05_14_08 -- DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (19130,30925,12739,30500,30495); INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`) VALUES From d059babed81cf684290a566351d12fd57397bd55 Mon Sep 17 00:00:00 2001 From: "Julio A. Leyva Osorio" Date: Sun, 14 May 2023 20:01:48 -0400 Subject: [PATCH 086/107] fix(DB/Quest): All Clear! - Missing RP Event (#16255) * Create 20913.sql * Update 20913.sql Co-Authored-By: Rushor * update --------- Co-authored-by: Rushor --- data/sql/updates/pending_db_world/20913.sql | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 data/sql/updates/pending_db_world/20913.sql diff --git a/data/sql/updates/pending_db_world/20913.sql b/data/sql/updates/pending_db_world/20913.sql new file mode 100644 index 000000000..6dc8831f2 --- /dev/null +++ b/data/sql/updates/pending_db_world/20913.sql @@ -0,0 +1,24 @@ +SET @ENTRY := 20913; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,0,0,20,0,100,0,10436,0,0,0,80,@ENTRY*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Quest \'All Clear!\' Finished - Run Script'); + +-- Actionlist SAI +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY*100 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY*100,9,0,0,0,0,100,0,0,0,0,0,83,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Remove Npc Flag Questgiver'), +(@ENTRY*100,9,1,0,0,0,100,0,1000,1000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Say Line 0'), +(@ENTRY*100,9,2,0,0,0,100,0,0,0,0,0,59,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Set Run Off'), +(@ENTRY*100,9,3,0,0,0,100,0,2000,2000,0,0,69,0,0,0,0,0,0,8,0,0,0,4922.18,2991.38,93.9847,5.88582,'Tashar - On Script - Move To Position'), +(@ENTRY*100,9,4,0,0,0,100,0,5000,5000,0,0,17,173,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Set Emote State 173'), +(@ENTRY*100,9,5,0,0,0,100,0,4000,4000,0,0,17,26,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Set Emote State 26'), +(@ENTRY*100,9,6,0,0,0,100,0,0,0,0,0,11,28730,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Cast \'Arcane Torrent\''), +(@ENTRY*100,9,7,0,0,0,100,0,2000,2000,0,0,50,184614,15,0,0,0,0,8,0,0,0,4923.56,2990.45,93.9413,0.813699,'Tashar - On Script - Summon Gameobject \'Ethereal Repair Kit\''), +(@ENTRY*100,9,8,0,0,0,100,0,0,0,0,0,50,184614,15,0,0,0,0,8,0,0,0,4923.45,2991.21,93.9248,5.49404,'Tashar - On Script - Summon Gameobject \'Ethereal Repair Kit\''), +(@ENTRY*100,9,9,0,0,0,100,0,0,0,0,0,50,184614,15,0,0,0,0,8,0,0,0,4924.47,2990.35,93.8867,2.25067,'Tashar - On Script - Summon Gameobject \'Ethereal Repair Kit\''), +(@ENTRY*100,9,10,0,0,0,100,0,0,0,0,0,50,184614,15,0,0,0,0,8,0,0,0,4924.32,2991.21,93.8808,3.88003,'Tashar - On Script - Summon Gameobject \'Ethereal Repair Kit\''), +(@ENTRY*100,9,11,0,0,0,100,0,2000,2000,0,0,1,1,4000,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Say Line 1'), +(@ENTRY*100,9,12,0,0,0,100,0,4000,4000,0,0,69,0,0,0,0,0,0,8,0,0,0,4914.74,2991.92,94.1138,0,'Tashar - On Script - Move To Position'), +(@ENTRY*100,9,13,0,0,0,100,0,3000,3000,0,0,66,0,0,0,0,0,0,8,0,0,0,0,0,0,0.15708,'Tashar - On Script - Set Orientation 0,15708'), +(@ENTRY*100,9,14,0,0,0,100,0,0,0,0,0,82,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Tashar - On Script - Add Npc Flag Questgiver'); From a8bc892da3b4d4868cd7ebe3260c6927ec33b692 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Mon, 15 May 2023 00:04:27 +0000 Subject: [PATCH 087/107] chore(DB): import pending files Referenced commit(s): d059babed81cf684290a566351d12fd57397bd55 --- .../{pending_db_world/20913.sql => db_world/2023_05_15_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/20913.sql => db_world/2023_05_15_00.sql} (98%) diff --git a/data/sql/updates/pending_db_world/20913.sql b/data/sql/updates/db_world/2023_05_15_00.sql similarity index 98% rename from data/sql/updates/pending_db_world/20913.sql rename to data/sql/updates/db_world/2023_05_15_00.sql index 6dc8831f2..c97995777 100644 --- a/data/sql/updates/pending_db_world/20913.sql +++ b/data/sql/updates/db_world/2023_05_15_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_14_08 -> 2023_05_15_00 SET @ENTRY := 20913; UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY; DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0; From 97dff23ba1edaaf29b410e33962d565bf7028df0 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Tue, 16 May 2023 20:57:35 -0300 Subject: [PATCH 088/107] feat(apps/scripts): set a logging file for gdb using starter app (#16278) --- apps/startup-scripts/run-engine | 6 ++++-- apps/startup-scripts/starter | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/startup-scripts/run-engine b/apps/startup-scripts/run-engine index 86391f02a..bc1c04a02 100644 --- a/apps/startup-scripts/run-engine +++ b/apps/startup-scripts/run-engine @@ -61,9 +61,9 @@ function run() { echo "> Starting with screen ( screen $OPTIONS )" - screen $OPTIONS $1 "$RUN_ENGINE_PATH/starter" $2 $3 "$4" "$5" "$6" $7 + screen $OPTIONS $1 "$RUN_ENGINE_PATH/starter" $2 $3 "$4" "$5" "$6" $7 "$BINPATH/crashes" else - $RUN_ENGINE_PATH/starter $2 $3 "$4" "$5" "$6" $7 + $RUN_ENGINE_PATH/starter $2 $3 "$4" "$5" "$6" $7 "$BINPATH/crashes" fi } @@ -71,6 +71,7 @@ function starter() { cd $BINPATH mkdir -p "$LOGS_PATH" + mkdir -p "$BINPATH"/crashes configureFiles @@ -82,6 +83,7 @@ function restarter() { cd $BINPATH mkdir -p "$LOGS_PATH" + mkdir -p "$BINPATH"/crashes configureFiles diff --git a/apps/startup-scripts/starter b/apps/startup-scripts/starter index c29af3e1a..d1768667e 100644 --- a/apps/startup-scripts/starter +++ b/apps/startup-scripts/starter @@ -5,9 +5,11 @@ CONFIG="$3" SYSLOG="$4" SYSERR="$5" GDB_ENABLED="$6" +CRASHES_PATH="$7" if [ $GDB_ENABLED -eq 1 ]; then - echo "set logging on" > "$GDB_FILE" + echo "set logging file "$CRASHES_PATH"/gdb-$(date +%Y-%m-%d-%H-%M-%S).txt" > "$GDB_FILE" + echo "set logging on" >> "$GDB_FILE" echo "set debug timestamp" >> "$GDB_FILE" echo "run -c $3" >> "$GDB_FILE" echo "bt" >> "$GDB_FILE" From 69fab3df70f082a4dbfd3703c1476c3c11b6151c Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Wed, 17 May 2023 09:31:50 -0300 Subject: [PATCH 089/107] feat(Core/SAI): Implement SMART_ACTION_DISABLE (#16254) * init * Create rev_1684036819129474700.sql * Update rev_1684036819129474700.sql --- .../rev_1684036819129474700.sql | 59 +++++++++++++++++++ .../game/AI/SmartScripts/SmartScript.cpp | 12 ++++ .../game/AI/SmartScripts/SmartScriptMgr.cpp | 2 + .../game/AI/SmartScripts/SmartScriptMgr.h | 8 ++- 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_world/rev_1684036819129474700.sql diff --git a/data/sql/updates/pending_db_world/rev_1684036819129474700.sql b/data/sql/updates/pending_db_world/rev_1684036819129474700.sql new file mode 100644 index 000000000..8727ddd2e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684036819129474700.sql @@ -0,0 +1,59 @@ +-- +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` IN (-151019,-151020,-151021,-151022,-151023,-151024,-151025,-151026,-151027,-151028,-151029,-151030,-151031,-151032,-151033,-151034,-151019,-151020,-151021,-151022,-151023,-151024,-151025,-151026,-151027,-151028,-151029,-151030,-151031,-151032,-151033,-151034) AND `action_type` = 80 AND `action_param1` IN (1670011, 1670012); + +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` IN (-151019,-151020,-151021,-151022,-151023,-151024,-151025,-151026,-151027,-151028,-151029,-151030,-151031,-151032,-151033,-151034,-151019,-151020,-151021,-151022,-151023,-151024,-151025,-151026,-151027,-151028,-151029,-151030,-151031,-151032,-151033,-151034) AND `action_type` = 226; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-151019, 0, 1006, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Respawn - Disable'), +(-151020, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Respawn - Disable'), +(-151021, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Respawn - Disable'), +(-151022, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Heathen - On Respawn - Disable'), +(-151023, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Darkcaster - On Respawn - Disable'), +(-151024, 0, 1006, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Respawn - Disable'), +(-151025, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Respawn - Disable'), +(-151026, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Respawn - Disable'), +(-151027, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Respawn - Disable'), +(-151028, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Darkcaster - On Respawn - Disable'), +(-151029, 0, 1006, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Respawn - Disable'), +(-151030, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Respawn - Disable'), +(-151031, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Respawn - Disable'), +(-151032, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Respawn - Disable'), +(-151033, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Respawn - Disable'), +(-151034, 0, 1001, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Respawn - Disable'), +(-151019, 0, 1007, 1008, 77, 0, 100, 0, 1, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Counter 2/2 - Enable'), +(-151020, 0, 1002, 1003, 38, 0, 100, 0, 3, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Data Set 3 1 - Enable'), +(-151021, 0, 1002, 1003, 38, 0, 100, 0, 3, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Data Set 3 1 - Enable'), +(-151022, 0, 1002, 1003, 38, 0, 100, 0, 3, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Heathen - On Data Set 3 1 - Enable'), +(-151023, 0, 1002, 1003, 38, 0, 100, 0, 3, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Darkcaster - On Data Set 3 1 - Enable'), +(-151024, 0, 1007, 1008, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Data Set 3 2 - Enable'), +(-151025, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Data Set 3 2 - Enable'), +(-151026, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Data Set 3 2 - Enable'), +(-151027, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Data Set 3 2 - Enable'), +(-151028, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Darkcaster - On Data Set 3 2 - Enable'), +(-151029, 0, 1008, 1009, 10, 0, 100, 267, 0, 90, 0, 0, 1, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Within 0-90 Range Out of Combat LoS - Enable'), +(-151030, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Data Set 3 2 - Enable'), +(-151031, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Reaver - On Data Set 3 2 - Enable'), +(-151032, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Data Set 3 2 - Enable'), +(-151033, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Data Set 3 2 - Enable'), +(-151034, 0, 1002, 1003, 38, 0, 100, 0, 3, 2, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Sharpshooter - On Data Set 3 2 - Enable'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = -151019) AND (`source_type` = 0) AND (`id` IN (1009, 1010, 1011)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-151019, 0, 1009, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 80, 1670011, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Linked - Run Script'), +(-151019, 0, 1010, 0, 58, 0, 100, 0, 0, 1670002, 0, 0, 0, 80, 1670013, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Waypoint Finished - Run Script'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 1670011); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1670011, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 53, 0, 1670002, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Actionlist - Start Waypoint'), +(1670011, 9, 1, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Actionlist - Say Line 5'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = -151024) AND (`source_type` = 0) AND (`id` IN (1008, 1009, 1010)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-151024, 0, 1008, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 80, 1670012, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Linked - Run Script'), +(-151024, 0, 1009, 0, 40, 0, 100, 0, 4, 1670004, 0, 0, 0, 80, 1670014, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - On Waypoint Finished - Run Script'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 1670012); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1670012, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 53, 0, 1670004, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Actionlist - Start Waypoint'), +(1670012, 9, 1, 0, 0, 0, 100, 0, 400, 400, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Legionnaire - Actionlist - Say Line 8'); + +UPDATE `smart_scripts` SET `event_flags`=257 WHERE `entryorguid`=-151029 AND `source_type`=0 AND `id`=1008 AND `link`=1009; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 60f3660db..e089c7c24 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2797,6 +2797,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } break; } + case SMART_ACTION_DISABLE: + { + for (WorldObject* target : targets) + { + if (IsUnit(target)) + { + target->ToUnit()->SetImmuneToAll(!e.action.disable.state); + target->ToUnit()->SetVisible(e.action.disable.state); + } + } + break; + } default: LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry {} SourceType {}, Event {}, Unhandled Action type {}", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 26d52bb23..eede4981d 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -762,6 +762,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_LOAD_GRID: return NO_PARAMS; case SMART_ACTION_MUSIC: return sizeof(SmartAction::music); case SMART_ACTION_SET_GUID: return sizeof(SmartAction::setGuid); + case SMART_ACTION_DISABLE: return sizeof(SmartAction::disable); default: LOG_WARN("sql.sql", "SmartAIMgr: entryorguid {} source_type {} id {} action_type {} is using an action with no unused params specified in SmartAIMgr::CheckUnusedActionParams(), please report this.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); @@ -1918,6 +1919,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_ATTACK_STOP: case SMART_ACTION_PLAY_CINEMATIC: case SMART_ACTION_SET_GUID: + case SMART_ACTION_DISABLE: break; default: LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type({}), event_type({}), Entry {} SourceType {} Event {}, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 88d82027e..51fa2ea4a 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -693,8 +693,9 @@ enum SMART_ACTION SMART_ACTION_DO_ACTION = 223, // ActionId SMART_ACTION_ATTACK_STOP = 224, // SMART_ACTION_SET_GUID = 225, // Sends the invoker's or the base object's own ObjectGuid to target + SMART_ACTION_DISABLE = 226, // Disable the targeted creatures, setting them Invisible and Immune to All - SMART_ACTION_AC_END = 226, // placeholder + SMART_ACTION_AC_END = 227, // placeholder }; enum class SmartActionSummonCreatureFlags @@ -1365,6 +1366,11 @@ struct SmartAction SAIBool invokerGUID; uint32 index; } setGuid; + + struct + { + SAIBool state; + } disable; //! Note for any new future actions //! All parameters must have type uint32 From 42a1650d3146e025d996ce5b9b5dfbd9bd8fbe88 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Wed, 17 May 2023 12:34:29 +0000 Subject: [PATCH 090/107] chore(DB): import pending files Referenced commit(s): 69fab3df70f082a4dbfd3703c1476c3c11b6151c --- .../rev_1684036819129474700.sql => db_world/2023_05_17_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1684036819129474700.sql => db_world/2023_05_17_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1684036819129474700.sql b/data/sql/updates/db_world/2023_05_17_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1684036819129474700.sql rename to data/sql/updates/db_world/2023_05_17_00.sql index 8727ddd2e..f60a545d6 100644 --- a/data/sql/updates/pending_db_world/rev_1684036819129474700.sql +++ b/data/sql/updates/db_world/2023_05_17_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_15_00 -> 2023_05_17_00 -- DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryorguid` IN (-151019,-151020,-151021,-151022,-151023,-151024,-151025,-151026,-151027,-151028,-151029,-151030,-151031,-151032,-151033,-151034,-151019,-151020,-151021,-151022,-151023,-151024,-151025,-151026,-151027,-151028,-151029,-151030,-151031,-151032,-151033,-151034) AND `action_type` = 80 AND `action_param1` IN (1670011, 1670012); From 7945e11557a7a87369ddcb51d82719db7610ddf1 Mon Sep 17 00:00:00 2001 From: KJack Date: Thu, 18 May 2023 14:34:50 -0400 Subject: [PATCH 091/107] fix(Scripts/ZulGurub): fix timing regression for Venoxis cobras (#16309) Fixes timing regression caused by conversion miss in #14876 --- src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 339ce76d9..6143b32c3 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -301,7 +301,7 @@ public: void JustEngagedWith(Unit*) { - events.ScheduleEvent(EVENT_POISON, 8ms); + events.ScheduleEvent(EVENT_POISON, 8s); if (Creature* Venoxis = GetVenoxis()) { @@ -331,7 +331,7 @@ public: case EVENT_POISON: { me->CastSpell(me->GetVictim(), SPELL_POISON); - events.ScheduleEvent(EVENT_POISON, 15ms); + events.ScheduleEvent(EVENT_POISON, 15s); break; } } From be48e3c2493b420c62c293897e321c0bf7c0483f Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Thu, 18 May 2023 22:11:53 +0200 Subject: [PATCH 092/107] fix(Core/Player): Instance.IgnoreRaid kicking people out (#16306) * closes https://github.com/azerothcore/azerothcore-wotlk/issues/16201 --- src/server/game/Entities/Player/PlayerStorage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index a943b590e..4b5336cfb 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -6978,7 +6978,7 @@ bool Player::CheckInstanceLoginValid() if (GetMap()->IsRaid()) { // cannot be in raid instance without a group - if (!GetGroup()) + if (!GetGroup() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID)) return false; } else From c5f20318332ccf5522d2515abf4b3840fda6b60e Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 20 May 2023 18:25:38 -0300 Subject: [PATCH 093/107] chore(Scripts/BloodFurnace): Clean up Keli'dan script (#16321) * init * Update rev_1684449165991504600.sql * leftover --- .../rev_1684449165991504600.sql | 39 ++++ .../BloodFurnace/boss_kelidan_the_breaker.cpp | 186 ++---------------- 2 files changed, 54 insertions(+), 171 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1684449165991504600.sql diff --git a/data/sql/updates/pending_db_world/rev_1684449165991504600.sql b/data/sql/updates/pending_db_world/rev_1684449165991504600.sql new file mode 100644 index 000000000..d1b3b830d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684449165991504600.sql @@ -0,0 +1,39 @@ +-- +SET @CGUID := 138519; + +DELETE FROM `creature` WHERE `id1` IN (17653, 17377) AND `map` = 542; +INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES +(@CGUID+0, 17653, 542, 3713, 3713, 3, 1, 0, 316.273651123046875, -108.876602172851562, -24.6027107238769531, 1.256637096405029296, 86400, 0, 0, 0, 0, 0, 0, 0, 0, 46366), +(@CGUID+1, 17653, 542, 3713, 3713, 3, 1, 0, 345.848419189453125, -74.4559097290039062, -24.6402416229248046, 3.59537816047668457, 86400, 0, 0, 0, 0, 0, 0, 0, 0, 46366), +(@CGUID+2, 17653, 542, 3713, 3713, 3, 1, 0, 343.5838623046875, -103.630592346191406, -24.5688228607177734, 2.356194496154785156, 86400, 0, 0, 0, 0, 0, 0, 0, 0, 46366), +(@CGUID+3, 17653, 542, 3713, 3713, 3, 1, 0, 301.987579345703125, -86.74652099609375, -24.4516544342041015, 0.157079637050628662, 86400, 0, 0, 0, 0, 0, 0, 0, 0, 46366), +(@CGUID+4, 17653, 542, 3713, 3713, 3, 1, 0, 320.75, -63.6120796203613281, -24.6360912322998046, 4.886921882629394531, 86400, 0, 0, 0, 0, 0, 0, 0, 0, 46366), +(@CGUID+5, 17377, 542, 3713, 3713, 3, 1, 1, 326.502899169921875, -86.0027542114257812, -24.5770149230957031, 3.59537816047668457, 86400, 0, 0, 0, 0, 0, 0, 0, 0, 46366); + + UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE (`entry` = 17653); + UPDATE `creature_template` SET `flags_extra` = `flags_extra`|67108864 WHERE (`entry` IN (17653, 18620)); + + DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 17653); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17653, 0, 0, 0, 0, 0, 100, 0, 1200, 2400, 6000, 7200, 0, 11, 12739, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - In Combat - Cast \'Shadow Bolt\''), +(17653, 0, 1, 0, 0, 0, 100, 0, 5000, 6500, 16000, 17500, 0, 11, 30937, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - In Combat - Cast \'Mark of Shadow\''), +(17653, 0, 2, 0, 6, 0, 100, 512, 0, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 0, 10, @CGUID+5, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - On Just Died - Do Action 1 on Keli\'dan the Breaker'), +(17653, 0, 3, 0, 4, 0, 100, 512, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 9, 17653, 0, 100, 1, 0, 0, 0, 0, 'Shadowmoon Channeler - On Aggro - Set In Combat With Zone'); + +DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+0,@CGUID+1,@CGUID+2,@CGUID+3,@CGUID+4,@CGUID+5); +INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES +(@CGUID+0, @CGUID+5, 24), +(@CGUID+1, @CGUID+5, 24), +(@CGUID+2, @CGUID+5, 24), +(@CGUID+3, @CGUID+5, 24), +(@CGUID+4, @CGUID+5, 24), +(@CGUID+5, @CGUID+5, 24); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-138519,-138519,-138520,-138521,-138522,-138523)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@CGUID+0), 0, 1000, 0, 1, 0, 100, 0, 3600, 3600, 15000, 15000, 0, 11, 30888, 0, 0, 0, 0, 0, 10, @CGUID+4, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - Out of Combat - Cast \'Star Beam\''), +(-(@CGUID+0), 0, 1001, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 223, 2, 0, 0, 0, 0, 0, 10, @CGUID+5, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - On Aggro - Do Action 2 on Keli\'dan the Breaker'), +(-(@CGUID+1), 0, 1000, 0, 1, 0, 100, 0, 3600, 3600, 15000, 15000, 0, 11, 30888, 0, 0, 0, 0, 0, 10, @CGUID+0, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - Out of Combat - Cast \'Star Beam\''), +(-(@CGUID+2), 0, 1000, 0, 1, 0, 100, 0, 3600, 3600, 15000, 15000, 0, 11, 30888, 0, 0, 0, 0, 0, 10, @CGUID+3, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - Out of Combat - Cast \'Star Beam\''), +(-(@CGUID+3), 0, 1000, 0, 1, 0, 100, 0, 3600, 3600, 15000, 15000, 0, 11, 30888, 0, 0, 0, 0, 0, 10, @CGUID+1, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - Out of Combat - Cast \'Star Beam\''), +(-(@CGUID+4), 0, 1000, 0, 1, 0, 100, 0, 3600, 3600, 15000, 15000, 0, 11, 30888, 0, 0, 0, 0, 0, 10, @CGUID+2, 0, 0, 0, 0, 0, 0, 0, 'Shadowmoon Channeler - Out of Combat - Cast \'Star Beam\''); diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp index 396f24ffd..51d72a28b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp @@ -31,33 +31,23 @@ enum Says enum Spells { - // Keldian SPELL_CORRUPTION = 30938, SPELL_EVOCATION = 30935, SPELL_FIRE_NOVA = 33132, SPELL_SHADOW_BOLT_VOLLEY = 28599, SPELL_BURNING_NOVA = 30940, - SPELL_VORTEX = 37370, + SPELL_VORTEX = 37370 +}; - // Channelers - SPELL_SHADOW_BOLT = 12739, - SPELL_MARK_OF_SHADOW = 30937, - SPELL_CHANNELING = 39123 +enum Misc +{ + NPC_SHADOWMOON_CHANNELER = 17653 }; enum Actions { - ACTION_CHANNELER_ENGAGED = 1, - ACTION_CHANNELER_DIED = 2 -}; - -const float ShadowmoonChannelers[5][4] = -{ - {302.0f, -87.0f, -24.4f, 0.157f}, - {321.0f, -63.5f, -24.6f, 4.887f}, - {346.0f, -74.5f, -24.6f, 3.595f}, - {344.0f, -103.5f, -24.5f, 2.356f}, - {316.0f, -109.0f, -24.6f, 1.257f} + ACTION_CHANNELER_DIED = 1, + ACTION_CHANNELER_AGGRO = 2 }; struct boss_kelidan_the_breaker : public BossAI @@ -70,20 +60,13 @@ struct boss_kelidan_the_breaker : public BossAI }); } - ObjectGuid channelers[5]; - uint32 checkTimer; - bool addYell; - void Reset() override { - addYell = false; - checkTimer = 5000; _Reset(); ApplyImmunities(true); - SummonChannelers(); me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(true); + me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + DoCastSelf(SPELL_EVOCATION); if (instance) { instance->SetData(DATA_KELIDAN, NOT_STARTED); @@ -136,80 +119,20 @@ struct boss_kelidan_the_breaker : public BossAI void DoAction(int32 param) override { - if (param == ACTION_CHANNELER_ENGAGED) + if (param == ACTION_CHANNELER_DIED) { - if (!addYell) + if (me->FindNearestCreature(NPC_SHADOWMOON_CHANNELER, 100.0f)) { - addYell = true; - Talk(SAY_ADD_AGGRO); - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && !channeler->IsInCombat()) - { - channeler->SetInCombatWithZone(); - } - } - } - } - else if (param == ACTION_CHANNELER_DIED) - { - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && channeler->IsAlive()) return; } + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetImmuneToAll(false); - if (Unit* target = me->SelectNearestPlayer(100.0f)) - { - AttackStart(target); - } + me->SetInCombatWithZone(); } - } - void CheckChannelers() - { - if (addYell) + else if (param == ACTION_CHANNELER_AGGRO) { - if (!SelectTargetFromPlayerList(100.0f)) - { - EnterEvadeMode(); - } - return; - } - SummonChannelers(); - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && !channeler->HasUnitState(UNIT_STATE_CASTING) && !channeler->IsInCombat()) - { - Creature* target = ObjectAccessor::GetCreature(*me, channelers[(i + 2) % 5]); - if (target) - { - channeler->CastSpell(target, SPELL_CHANNELING, false); - } - } - } - } - - void SummonChannelers() - { - for (uint8 i = 0; i < 5; ++i) - { - Creature* channeler = ObjectAccessor::GetCreature(*me, channelers[i]); - if (channeler && channeler->isDead()) - { - channeler->DespawnOrUnsummon(1); - channeler = nullptr; - } - if (!channeler) - { - channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000); - } - channelers[i] = channeler ? channeler->GetGUID() : ObjectGuid::Empty; + Talk(SAY_ADD_AGGRO); } } @@ -248,88 +171,9 @@ struct boss_kelidan_the_breaker : public BossAI me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, apply); } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - { - checkTimer += diff; - if (checkTimer >= 5000) - { - checkTimer = 0; - CheckChannelers(); - if (!me->HasUnitState(UNIT_STATE_CASTING)) - { - me->CastSpell(me, SPELL_EVOCATION, false); - } - } - return; - } - - scheduler.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - DoMeleeAttackIfReady(); - } -}; - -struct npc_shadowmoon_channeler : public ScriptedAI -{ - npc_shadowmoon_channeler(Creature* creature) : ScriptedAI(creature) {} - - Creature* GetKelidan() - { - if (InstanceScript* instance = me->GetInstanceScript()) - { - return instance->GetCreature(DATA_KELIDAN); - } - return nullptr; - } - - void JustEngagedWith(Unit* /*who*/) override - { - if (Creature* kelidan = GetKelidan()) - { - kelidan->AI()->DoAction(ACTION_CHANNELER_ENGAGED); - } - me->InterruptNonMeleeSpells(false); - _scheduler.Schedule(1200ms, 2400ms, [this](TaskContext context) - { - DoCastVictim(SPELL_SHADOW_BOLT); - context.Repeat(6s, 7200ms); - }).Schedule(5s, 6500ms, [this](TaskContext context) - { - DoCastRandomTarget(SPELL_MARK_OF_SHADOW); - context.Repeat(16s, 17500ms); - }); - } - - void JustDied(Unit* /*killer*/) override - { - if (Creature* kelidan = GetKelidan()) - { - kelidan->AI()->DoAction(ACTION_CHANNELER_DIED); - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - _scheduler.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - DoMeleeAttackIfReady(); - } - -private: - TaskScheduler _scheduler; }; void AddSC_boss_kelidan_the_breaker() { RegisterBloodFurnaceCreatureAI(boss_kelidan_the_breaker); - RegisterBloodFurnaceCreatureAI(npc_shadowmoon_channeler); } From bf91a2d092b40071d1372dd3fe4b453205210997 Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sat, 20 May 2023 18:25:56 -0300 Subject: [PATCH 094/107] fix(DB/Creature): Misc fixes for TBC Heroic dungeons (#16330) Create rev_1684593078469435100.sql --- .../rev_1684593078469435100.sql | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1684593078469435100.sql diff --git a/data/sql/updates/pending_db_world/rev_1684593078469435100.sql b/data/sql/updates/pending_db_world/rev_1684593078469435100.sql new file mode 100644 index 000000000..4dfc7f7eb --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684593078469435100.sql @@ -0,0 +1,35 @@ +-- +UPDATE `creature_template_addon` SET `bytes2` = 1, `auras` = '18950' WHERE (`entry` = 20993); +UPDATE `creature_template_addon` SET `bytes2` = 2 WHERE (`entry` IN (17826, 20183)); + +DELETE FROM `creature_template_addon` WHERE (`entry` IN (18054,17455,18051,19886,19885,21126,21842,17938,19888,21127,21843,17960,19890,19887,20254,20697,20691,20698)); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(18054, 0, 0, 0, 1, 0, 0, ''), +(17455, 0, 0, 0, 1, 0, 0, ''), +(18051, 0, 0, 0, 1, 0, 0, ''), +(19886, 0, 0, 0, 1, 0, 0, ''), +(19885, 0, 0, 0, 1, 0, 0, ''), +(21126, 0, 0, 0, 1, 0, 0, ''), +(21842, 0, 0, 0, 1, 0, 0, ''), +(17938, 0, 0, 0, 1, 0, 0, ''), +(19888, 0, 0, 0, 1, 0, 0, ''), +(21127, 0, 0, 0, 1, 0, 0, ''), +(21843, 0, 0, 0, 1, 0, 0, ''), +(17960, 0, 0, 0, 1, 0, 0, ''), +(19890, 0, 0, 0, 1, 0, 0, ''), +(19887, 0, 0, 0, 1, 0, 0, ''), +(20254, 0, 0, 0, 1, 0, 0, '32368'), +(20697, 0, 0, 0, 1, 0, 0, '37509'), +(20691, 0, 0, 0, 1, 0, 0, '37509'), +(20698, 0, 0, 0, 1, 0, 0, '37509'); + +UPDATE `creature_addon` SET `bytes2` = 1 WHERE `guid` IN (202625, 202627, 202628, 202629, 202630, 202631, 202697, 202623, 202624, 202614, 202615); +UPDATE `creature_addon` SET `bytes2` = 2 WHERE `guid` IN (138500); + +UPDATE `creature` SET `equipment_id` = 1 WHERE `id1` IN (17958, 17957, 21126, 17938, 17940, 21127, 17960, 17961, 17826); + +UPDATE `creature_template` SET `unit_flags` = `unit_flags`|33555200 WHERE (`entry` = 20307); +UPDATE `creature_template` SET `unit_flags` = `unit_flags`|33554688 WHERE (`entry` = 20304); + +UPDATE `creature_template` SET `lootid` = 18639, `pickpocketloot` = 18639, `mingold` = 881, `maxgold` = 1155 WHERE (`entry` = 20647); +UPDATE `creature_template` SET `lootid` = 18634, `pickpocketloot` = 18634, `mingold` = 881, `maxgold` = 1155 WHERE (`entry` = 20648); From 08308230ef28dd2a15fade366feee66e5a410e1c Mon Sep 17 00:00:00 2001 From: v-mstrs <104088833+v-mstrs@users.noreply.github.com> Date: Sat, 20 May 2023 23:26:36 +0200 Subject: [PATCH 095/107] fix(DB/Creature): Missing stealth detection to some creatures (#16331) * fix(DB/creature) add missing stealth detection --- .../updates/pending_db_world/rev_1684589406305000945.sql | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1684589406305000945.sql diff --git a/data/sql/updates/pending_db_world/rev_1684589406305000945.sql b/data/sql/updates/pending_db_world/rev_1684589406305000945.sql new file mode 100644 index 000000000..1b2618754 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684589406305000945.sql @@ -0,0 +1,9 @@ +-- + +UPDATE `creature_addon` SET `auras` = '18950' WHERE `guid` IN (135170, 135171, 135174, 135175, 135345, 135346, 135347, 135348, 135349, 135350, 135351, 135352, 135353, 135354, 135355, 135356, 135357, 135358, 135359, 135360, 135361, 135362); + +DELETE FROM `creature_template_addon` WHERE `entry` = 16408; +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(16408, 0, 0, 0, 0, 0, 0, '18950'); + +UPDATE `creature_template_addon` SET `auras` = '18950' WHERE `entry` IN (20058, 16424); From 87a172064ad13a42cf19a8c2a09a47af51aa2c37 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sat, 20 May 2023 21:29:10 +0000 Subject: [PATCH 096/107] chore(DB): import pending files Referenced commit(s): 08308230ef28dd2a15fade366feee66e5a410e1c --- .../rev_1684449165991504600.sql => db_world/2023_05_20_00.sql} | 1 + .../rev_1684589406305000945.sql => db_world/2023_05_20_01.sql} | 1 + .../rev_1684593078469435100.sql => db_world/2023_05_20_02.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/rev_1684449165991504600.sql => db_world/2023_05_20_00.sql} (99%) rename data/sql/updates/{pending_db_world/rev_1684589406305000945.sql => db_world/2023_05_20_01.sql} (92%) rename data/sql/updates/{pending_db_world/rev_1684593078469435100.sql => db_world/2023_05_20_02.sql} (97%) diff --git a/data/sql/updates/pending_db_world/rev_1684449165991504600.sql b/data/sql/updates/db_world/2023_05_20_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1684449165991504600.sql rename to data/sql/updates/db_world/2023_05_20_00.sql index d1b3b830d..b8053ef39 100644 --- a/data/sql/updates/pending_db_world/rev_1684449165991504600.sql +++ b/data/sql/updates/db_world/2023_05_20_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_17_00 -> 2023_05_20_00 -- SET @CGUID := 138519; diff --git a/data/sql/updates/pending_db_world/rev_1684589406305000945.sql b/data/sql/updates/db_world/2023_05_20_01.sql similarity index 92% rename from data/sql/updates/pending_db_world/rev_1684589406305000945.sql rename to data/sql/updates/db_world/2023_05_20_01.sql index 1b2618754..cce6163b6 100644 --- a/data/sql/updates/pending_db_world/rev_1684589406305000945.sql +++ b/data/sql/updates/db_world/2023_05_20_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_20_00 -> 2023_05_20_01 -- UPDATE `creature_addon` SET `auras` = '18950' WHERE `guid` IN (135170, 135171, 135174, 135175, 135345, 135346, 135347, 135348, 135349, 135350, 135351, 135352, 135353, 135354, 135355, 135356, 135357, 135358, 135359, 135360, 135361, 135362); diff --git a/data/sql/updates/pending_db_world/rev_1684593078469435100.sql b/data/sql/updates/db_world/2023_05_20_02.sql similarity index 97% rename from data/sql/updates/pending_db_world/rev_1684593078469435100.sql rename to data/sql/updates/db_world/2023_05_20_02.sql index 4dfc7f7eb..556cb5ecd 100644 --- a/data/sql/updates/pending_db_world/rev_1684593078469435100.sql +++ b/data/sql/updates/db_world/2023_05_20_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_20_01 -> 2023_05_20_02 -- UPDATE `creature_template_addon` SET `bytes2` = 1, `auras` = '18950' WHERE (`entry` = 20993); UPDATE `creature_template_addon` SET `bytes2` = 2 WHERE (`entry` IN (17826, 20183)); From f06ab04748f8faa355399cd1eeffeff74d297eed Mon Sep 17 00:00:00 2001 From: Gultask <100873791+Gultask@users.noreply.github.com> Date: Sun, 21 May 2023 11:19:57 -0300 Subject: [PATCH 097/107] fix(DB/ShatteredHalls): Implement scripted adds for Porung and Kargath (#16334) Create rev_1684618396046160600.sql --- .../rev_1684618396046160600.sql | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1684618396046160600.sql diff --git a/data/sql/updates/pending_db_world/rev_1684618396046160600.sql b/data/sql/updates/pending_db_world/rev_1684618396046160600.sql new file mode 100644 index 000000000..f9a490203 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684618396046160600.sql @@ -0,0 +1,175 @@ +/* + Blood Guard Porung +*/ +-- Add some leftover details to Porung +UPDATE `creature` SET `zoneId` = 3714, `areaId` = 3714 WHERE `guid` = 151283 AND `id1` = 20923; + +-- SAI Override for Zealots +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|67108864 WHERE (`entry` IN (17462, 20595)); + +-- Delete deprecated summon_group +DELETE FROM `creature_summon_groups` WHERE `summonerID` = 20923; + +SET @CGUID := 151283; + +-- Add the pre-spawn Zealots +DELETE FROM `creature` WHERE `id1` = 17462 AND `guid` BETWEEN @CGUID+1 AND @CGUID+8; +INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `VerifiedBuild`) VALUES +(@CGUID+1, 17462, 540, 3714, 3714, 3, 1, 500.66077, 335.08316, 2.1801622, 4.790035247802734375, 86400, 46924), +(@CGUID+2, 17462, 540, 3714, 3714, 3, 1, 502.3265, 339.933, 2.1924121, 4.682251453399658203, 86400, 46924), +(@CGUID+3, 17462, 540, 3714, 3714, 3, 1, 507.43033, 340.37152, 2.1807163, 4.49735260009765625, 86400, 46924), +(@CGUID+4, 17462, 540, 3714, 3714, 3, 1, 515.1152, 339.82166, 2.1918812, 4.189203739166259765, 86400, 46924), +(@CGUID+5, 17462, 540, 3714, 3714, 3, 1, 500.43695, 299.709, 2.0352724, 1.837408661842346191, 86400, 46924), +(@CGUID+6, 17462, 540, 3714, 3714, 3, 1, 500.4554, 295.4435, 2.0247803, 1.765462279319763183, 86400, 46924), +(@CGUID+7, 17462, 540, 3714, 3714, 3, 1, 505.0166, 294.01736, 2.0213714, 1.931191682815551757, 86400, 46924), +(@CGUID+8, 17462, 540, 3714, 3714, 3, 1, 510.66922, 292.43665, 2.0080533, 2.112969875335693359, 86400, 46924); + +DELETE FROM `creature_addon` WHERE (`guid` IN (@CGUID+1,@CGUID+2,@CGUID+3,@CGUID+4,@CGUID+5,@CGUID+6,@CGUID+7,@CGUID+8)); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(@CGUID+1, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+2, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+3, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+4, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+5, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+6, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+7, 0, 0, 0, 0, 0, 0, '18950'), +(@CGUID+8, 0, 0, 0, 0, 0, 0, '18950'); + +DELETE FROM `waypoints` WHERE `point_comment` LIKE 'Shattered Hand Zealot - %' AND `entry` BETWEEN 1746200 AND 1746208; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `point_comment`) VALUES +(1746200,1,518.51355,254.91473,1.935091,NULL,'Shattered Hand Zealot - Summon Gauntlet Guards'), +(1746200,2,522.1381,253.96086,1.9344256,NULL,'Shattered Hand Zealot - Summon Gauntlet Guards'), +(1746200,3,512.82446,286.9732,2.1900017,NULL,'Shattered Hand Zealot - Summon Gauntlet Guards'), -- Decomposed to not clip through the wall +(1746200,4,497.68735,316.3075,1.9454536,NULL,'Shattered Hand Zealot - Summon Gauntlet Guards'), +(1746200,5,485.92004,316.08777,1.9463365,NULL,'Shattered Hand Zealot - Summon Gauntlet Guards'), +(1746201,1,495.4776,316.98608,1.946535,NULL,'Shattered Hand Zealot - Add 1'), +(1746201,2,483.1907,317.86993,1.9473528,NULL,'Shattered Hand Zealot - Add 1'), +(1746201,3,455.10214,317.3777,1.9421942,NULL,'Shattered Hand Zealot - Add 1'), +(1746201,4,430.9916,316.97632,1.9160842,NULL,'Shattered Hand Zealot - Add 1'), +(1746201,5,400.69287,318.7411,1.8979802,NULL,'Shattered Hand Zealot - Add 1'), +(1746201,6,385.03403,321.49213,1.9389232,3.351032257080078125,'Shattered Hand Zealot - Add 1'), +(1746202,1,501.7538,320.9323,1.9434687,NULL,'Shattered Hand Zealot - Add 2'), +(1746202,2,476.05844,317.75107,1.9364125,NULL,'Shattered Hand Zealot - Add 2'), +(1746202,3,455.1762,318.79874,1.9421194,NULL,'Shattered Hand Zealot - Add 2'), +(1746202,4,429.9724,317.08362,1.9209572,NULL,'Shattered Hand Zealot - Add 2'), +(1746202,5,418.716,319.8783,1.9447119,3.351032257080078125,'Shattered Hand Zealot - Add 2'), +(1746203,1,503.322,321.56223,1.9413302,NULL,'Shattered Hand Zealot - Add 3'), +(1746203,2,492.0797,318.1158,1.9481977,NULL,'Shattered Hand Zealot - Add 3'), +(1746203,3,480.32916,318.5935,1.9409089,NULL,'Shattered Hand Zealot - Add 3'), +(1746203,4,454.69748,319.9294,1.942607,3.351032257080078125,'Shattered Hand Zealot - Add 3'), +(1746204,1,503.59293,319.84564,1.9425683,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,2,493.9259,316.13474,1.9472932,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,3,476.05844,317.75107,1.9364125,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,4,455.65674,317.68033,1.9416298,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,5,429.9724,317.08362,1.9209572,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,6,409.81305,318.26263,1.9170406,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,7,384.47876,318.11124,1.9394886,NULL,'Shattered Hand Zealot - Add 4'), +(1746204,8,359.87564,320.17487,1.9181617,3.351032257080078125,'Shattered Hand Zealot - Add 4'), +(1746205,1,497.69696,309.7413,1.9453896,NULL,'Shattered Hand Zealot - Add 5 - Decomposed'), +(1746205,2,485.07498,314.65887,1.9463371,NULL,'Shattered Hand Zealot - Add 5'), +(1746205,3,460.72418,313.97842,1.9364703,NULL,'Shattered Hand Zealot - Add 5'), +(1746205,4,434.42194,314.33572,1.9077104,NULL,'Shattered Hand Zealot - Add 5'), +(1746205,5,403.79083,314.16635,1.9008716,NULL,'Shattered Hand Zealot - Add 5'), +(1746205,6,374.89954,312.64014,1.9247476,NULL,'Shattered Hand Zealot - Add 5'), +(1746205,7,359.43372,312.43814,1.9181622,2.809980154037475585,'Shattered Hand Zealot - Add 5'), +(1746206,1,496.7627,314.17264,1.9459041,NULL,'Shattered Hand Zealot - Add 6'), +(1746206,2,485.07498,314.65887,1.9463371,NULL,'Shattered Hand Zealot - Add 6'), +(1746206,3,460.7832,315.03976,1.9364105,NULL,'Shattered Hand Zealot - Add 6'), +(1746206,4,435.2396,312.74365,1.9061459,NULL,'Shattered Hand Zealot - Add 6'), +(1746206,5,403.83655,312.20764,1.9023694,NULL,'Shattered Hand Zealot - Add 6'), +(1746206,6,385.5018,309.696,1.938451,2.809980154037475585,'Shattered Hand Zealot - Add 6'), +(1746207,1,497.28668,314.52902,1.9456482,NULL,'Shattered Hand Zealot - Add 7'), +(1746207,2,484.36633,313.18347,1.9463377,NULL,'Shattered Hand Zealot - Add 7'), +(1746207,3,459.75717,313.03488,1.9374542,NULL,'Shattered Hand Zealot - Add 7'), +(1746207,4,439.54303,312.2451,1.8873941,NULL,'Shattered Hand Zealot - Add 7'), +(1746207,5,420.8947,309.70868,1.9430903,2.809980154037475585,'Shattered Hand Zealot - Add 7'), +(1746208,1,497.14935,314.8804,1.9457157,NULL,'Shattered Hand Zealot - Add 8'), +(1746208,2,485.2548,314.55142,1.946337,NULL,'Shattered Hand Zealot - Add 8'), +(1746208,3,469.40604,311.16257,1.9173245,NULL,'Shattered Hand Zealot - Add 8'), +(1746208,4,460.55313,309.96686,1.936643,2.809980154037475585,'Shattered Hand Zealot - Add 8'); + +DELETE FROM `spell_target_position` WHERE `ID` = 30976; +INSERT INTO `spell_target_position` (`ID`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES +(30976, 540, 520.062, 255.486, 2.0333333, 48999); + +-- SmartAI for spell +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17462) AND (`source_type` = 0) AND (`id` IN (1, 2)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17462, 0, 1, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746200, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Just Summoned - Start Waypoint'), +(17462, 0, 2, 0, 58, 0, 100, 0, 0, 1746200, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Set In Combat With Zone'); + +-- SmartAI for pre-spawns +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-(@CGUID+1),-(@CGUID+2),-(@CGUID+3),-(@CGUID+4),-(@CGUID+5),-(@CGUID+6),-(@CGUID+7),-(@CGUID+8))); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-(@CGUID+1), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+1), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+1), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746201, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+1), 0, 1003, 0, 58, 0, 100, 0, 0, 1746201, 0, 0, 0, 80, 1746200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+2), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+2), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+2), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746202, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+2), 0, 1003, 0, 58, 0, 100, 0, 0, 1746202, 0, 0, 0, 80, 1746200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+3), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+3), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+3), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746203, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+3), 0, 1003, 0, 58, 0, 100, 0, 0, 1746203, 0, 0, 0, 80, 1746200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+4), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+4), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+4), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746204, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+4), 0, 1003, 0, 58, 0, 100, 0, 0, 1746204, 0, 0, 0, 80, 1746200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+5), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+5), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+5), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746205, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+5), 0, 1003, 0, 58, 0, 100, 0, 0, 1746205, 0, 0, 0, 80, 1746201, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+6), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+6), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+6), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746206, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+6), 0, 1003, 0, 58, 0, 100, 0, 0, 1746206, 0, 0, 0, 80, 1746201, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+7), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+7), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+7), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746207, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+7), 0, 1003, 0, 58, 0, 100, 0, 0, 1746207, 0, 0, 0, 80, 1746201, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'), +(-(@CGUID+8), 0, 1000, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Respawn - Disable'), +(-(@CGUID+8), 0, 1001, 1002, 38, 0, 100, 0, 1, 1, 0, 0, 0, 226, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Data Set 1 1 - Enable'), +(-(@CGUID+8), 0, 1002, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1746208, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Linked - Start Waypoint'), +(-(@CGUID+8), 0, 1003, 0, 58, 0, 100, 0, 0, 1746208, 0, 0, 0, 80, 1746201, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - On Waypoint Finished - Run Script'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` IN (1746200, 1746201)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(1746200, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3.351032257080078, 'Shattered Hand Zealot - Actionlist - Set Orientation 3.351032257080078'), +(1746200, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Actionlist - Set Sheath Melee'), +(1746200, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 17, 333, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Actionlist - Set Emote State 333'), +(1746201, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2.809980154037475585, 'Shattered Hand Zealot - Actionlist - Set Orientation 2.809980154037475585'), +(1746201, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Actionlist - Set Sheath Melee'), +(1746201, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 17, 333, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Shattered Hand Zealot - Actionlist - Set Emote State 333'); + +/* + Kargath Bladefist +*/ +DELETE FROM `waypoints` WHERE `entry`=1680800; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `point_comment`) VALUES +(1680800,1,312.5911,-84.185234,1.9369955,NULL,'Warchief Kargath Bladefist Add'), +(1680800,2,301.18335,-83.94184,1.9370385,NULL,'Warchief Kargath Bladefist Add'), +(1680800,3,289.016,-83.993065,1.9304622,NULL,'Warchief Kargath Bladefist Add'), +(1680800,4,279.15543,-84.08081,2.1895409,NULL,'Warchief Kargath Bladefist Add'), +(1680800,5,274.1177,-84.06761,2.3095043,NULL,'Warchief Kargath Bladefist Add'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17621) AND (`source_type` = 0) AND (`id` IN (3, 4)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17621, 0, 3, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1680800, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Heathen Guard - On Just Summoned - Start Waypoint'), +(17621, 0, 4, 0, 58, 0, 100, 0, 0, 1680800, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Heathen Guard - On Waypoint Finished - Set In Combat With Zone'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17622) AND (`source_type` = 0) AND (`id` IN (4, 5)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17622, 0, 4, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1680800, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sharpshooter Guard - On Just Summoned - Start Waypoint'), +(17622, 0, 5, 0, 58, 0, 100, 0, 0, 1680800, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sharpshooter Guard - On Waypoint Finished - Set In Combat With Zone'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17623) AND (`source_type` = 0) AND (`id` IN (4, 5)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17623, 0, 4, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 53, 1, 1680800, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Reaver Guard - On Just Summoned - Start Waypoint'), +(17623, 0, 5, 0, 58, 0, 100, 0, 0, 1680800, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Reaver Guard - On Waypoint Finished - Set In Combat With Zone'); + +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|33554432 WHERE (`entry` IN (17621, 17622, 17623, 20569, 20578, 20575)); + +UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE (`entry` IN (17621, 20569, 17623, 20575)); +UPDATE `creature_template_addon` SET `bytes2` = 2 WHERE (`entry` IN (17622, 20578)); From 0637170c3014d028784414400f4c92e4e9965bdf Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 21 May 2023 14:22:26 +0000 Subject: [PATCH 098/107] chore(DB): import pending files Referenced commit(s): f06ab04748f8faa355399cd1eeffeff74d297eed --- .../rev_1684618396046160600.sql => db_world/2023_05_21_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1684618396046160600.sql => db_world/2023_05_21_00.sql} (99%) diff --git a/data/sql/updates/pending_db_world/rev_1684618396046160600.sql b/data/sql/updates/db_world/2023_05_21_00.sql similarity index 99% rename from data/sql/updates/pending_db_world/rev_1684618396046160600.sql rename to data/sql/updates/db_world/2023_05_21_00.sql index f9a490203..97220aed4 100644 --- a/data/sql/updates/pending_db_world/rev_1684618396046160600.sql +++ b/data/sql/updates/db_world/2023_05_21_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_20_02 -> 2023_05_21_00 /* Blood Guard Porung */ From 6a73c38eb62f0b3ef2fa44b3f60736aad5ba051b Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 21 May 2023 18:11:31 -0300 Subject: [PATCH 099/107] fix(Scripts/ShatteredHalls): Rework Nethekurse (#16265) --- .../rev_1684108506441826000.sql | 44 +++ .../game/Spells/SpellInfoCorrections.cpp | 6 + .../ShatteredHalls/boss_nethekurse.cpp | 305 ++++++------------ .../instance_shattered_halls.cpp | 64 +--- 4 files changed, 169 insertions(+), 250 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1684108506441826000.sql diff --git a/data/sql/updates/pending_db_world/rev_1684108506441826000.sql b/data/sql/updates/pending_db_world/rev_1684108506441826000.sql new file mode 100644 index 000000000..aa96370ae --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684108506441826000.sql @@ -0,0 +1,44 @@ +-- +SET @NPC := 151089 * 10; +DELETE FROM `waypoint_data` WHERE `id` = @NPC; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES +(@NPC, 1, 184.78966, 290.3699, -8.18139, 0), +(@NPC, 2, 178.51125, 287.97794, -8.183065, 0), +(@NPC, 3, 171.82281, 289.97687, -8.185595, 0), +(@NPC, 4, 178.51125, 287.97794, -8.183065, 0); + +UPDATE `creature` SET `MovementType` = 2 WHERE `ID1` IN (16807, 20568); + +DELETE FROM `creature_template_addon` WHERE `entry` IN (16807, 20568); +INSERT INTO `creature_template_addon` (`entry`, `path_id`) VALUES +(16807, @NPC), +(20568, @NPC); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 17083) AND (`source_type` = 0) AND (`id` IN (1, 2, 3)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17083, 0, 2, 0, 4, 0, 100, 512, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 16807, 50, 0, 0, 0, 0, 0, 0, 'Fel Orc Convert - On Aggro - Set Data 1 1'), +(17083, 0, 3, 0, 6, 0, 100, 512, 0, 0, 0, 0, 0, 45, 1, 2, 0, 0, 0, 0, 19, 16807, 50, 0, 0, 0, 0, 0, 0, 'Fel Orc Convert - On Just Died - Set Data 1 2'); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 3) AND (`SourceEntry` = 17083) AND (`SourceId` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 3, 17083, 0, 0, 31, 0, 4, 0, 0, 0, 0, 0, '', 'Only play SAI Event if Invoker is a Player'); + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_tsh_shadow_sear'; + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 3) AND (`SourceEntry` = 30741); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 3, 30741, 0, 0, 31, 0, 3, 17083, 151090, 0, 0, 0, '', 'Death Coil (30741) can only target Fel Orc Convert (17083) of specific guids'), +(13, 3, 30741, 0, 1, 31, 0, 3, 17083, 151091, 0, 0, 0, '', 'Death Coil (30741) can only target Fel Orc Convert (17083) of specific guids'), +(13, 3, 30741, 0, 2, 31, 0, 3, 17083, 151092, 0, 0, 0, '', 'Death Coil (30741) can only target Fel Orc Convert (17083) of specific guids'), +(13, 3, 30741, 0, 3, 31, 0, 3, 17083, 151093, 0, 0, 0, '', 'Death Coil (30741) can only target Fel Orc Convert (17083) of specific guids'); + +DELETE FROM `spell_script_names` WHERE `spell_id` = 30745; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(30745, 'spell_target_fissures'); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 3) AND (`SourceEntry` = 30745); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 30745, 0, 0, 31, 0, 3, 17083, 151090, 0, 0, 0, '', 'Target Fissures (30745) can only target Fel Orc Convert (17083) of specific guids'), +(13, 1, 30745, 0, 1, 31, 0, 3, 17083, 151091, 0, 0, 0, '', 'Target Fissures (30745) can only target Fel Orc Convert (17083) of specific guids'), +(13, 1, 30745, 0, 2, 31, 0, 3, 17083, 151092, 0, 0, 0, '', 'Target Fissures (30745) can only target Fel Orc Convert (17083) of specific guids'), +(13, 1, 30745, 0, 3, 31, 0, 3, 17083, 151093, 0, 0, 0, '', 'Target Fissures (30745) can only target Fel Orc Convert (17083) of specific guids'); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 9c51fe10f..e37231d02 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4528,6 +4528,12 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].MiscValue = 224; }); + // Target Fissures + ApplySpellFix({ 30745 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 1; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp index 606abfbdb..52136278e 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp @@ -20,29 +20,30 @@ #include "ScriptedCreature.h" #include "shattered_halls.h" -enum Says +enum Texts { - SAY_INTRO = 0, - SAY_INTRO_2 = 1, - SAY_PEON_ATTACKED = 2, - SAY_PEON_DIES = 3, - SAY_SHADOW_SEAR = 4, - SAY_SHADOW_FISSURE = 5, - SAY_DEATH_COIL = 6, - SAY_SLAY = 7, - SAY_DIE = 8 + SAY_SKIP_INTRO = 0, + SAY_INTRO_2 = 1, + SAY_PEON_ATTACKED = 2, + SAY_PEON_DIES = 3, + SAY_SHADOW_SEAR = 4, + SAY_SHADOW_FISSURE = 5, + SAY_DEATH_COIL = 6, + SAY_SLAY = 7, + SAY_DIE = 8 }; enum Spells { - SPELL_DEATH_COIL = 30500, - SPELL_DARK_SPIN = 30502, - SPELL_SHADOW_FISSURE = 30496, - SPELL_SHADOW_CLEAVE = 30495, + SPELL_DEATH_COIL = 30500, + SPELL_DARK_SPIN = 30502, + SPELL_SHADOW_FISSURE = 30496, + SPELL_SHADOW_CLEAVE = 30495, - SPELL_SHADOW_SEAR = 30735, - SPELL_DEATH_COIL_RP = 30741, - SPELL_SHADOW_FISSURE_RP = 30745 + SPELL_SHADOW_SEAR = 30735, + SPELL_DEATH_COIL_RP = 30741, + SPELL_SHADOW_FISSURE_RP = 30745, + SPELL_LESSER_SHADOW_FISSURE = 30744 }; enum Events @@ -75,12 +76,22 @@ enum Actions ACTION_START_COMBAT = 2, }; -float NethekurseIntroPath[4][3] = +enum Creatures { - {184.78966f, 290.3699f, -8.18139f}, - {178.51125f, 278.779022f, -8.183065f}, - {171.82281f, 289.97687f, -8.185595f}, - {178.51125f, 287.97794f, -8.183065f} + NPC_PEON = 17083 +}; + +struct PeonRoleplay +{ + uint32 spellId; + uint8 textId; +}; + +PeonRoleplay PeonRoleplayData[3] = +{ + { SPELL_DEATH_COIL_RP, SAY_DEATH_COIL }, + { SPELL_SHADOW_FISSURE_RP, SAY_SHADOW_FISSURE }, + { SPELL_SHADOW_SEAR, SAY_SHADOW_SEAR } }; struct boss_grand_warlock_nethekurse : public BossAI @@ -93,16 +104,13 @@ struct boss_grand_warlock_nethekurse : public BossAI }); } - EventMap events2; - void Reset() override { - EventStage = EVENT_STAGE_NONE; - _Reset(); - events2.Reset(); ScheduleHealthCheckEvent(25, [&] { DoCastSelf(SPELL_DARK_SPIN); }); + + instance->SetBossState(DATA_NETHEKURSE, NOT_STARTED); } void JustDied(Unit* /*killer*/) override @@ -116,58 +124,69 @@ struct boss_grand_warlock_nethekurse : public BossAI if (data != SETDATA_DATA) return; - switch (value) + if (value == SETDATA_PEON_AGGRO && PeonEngagedCount <= 4) { - case SETDATA_PEON_AGGRO: - if (PeonEngagedCount >= 4) - return; + Talk(SAY_PEON_ATTACKED); + } + else if (value == SETDATA_PEON_DEATH && PeonKilledCount <= 4) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveIdle(); + me->SetFacingTo(4.572762489318847656f); - if (EventStage < EVENT_STAGE_TAUNT) - { - Talk(SAY_PEON_ATTACKED); - } - break; - case SETDATA_PEON_DEATH: - if (PeonKilledCount >= 4) - return; + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) + { + me->HandleEmoteCommand(EMOTE_ONESHOT_APPLAUD); + me->GetMotionMaster()->Initialize(); + Talk(SAY_PEON_DIES); - if (EventStage < EVENT_STAGE_TAUNT) - { - PeonDieRP(); - } if (++PeonKilledCount == 4) { + Talk(SAY_INTRO_2); DoAction(ACTION_CANCEL_INTRO); + if (Unit* target = me->SelectNearestPlayer(80.0f)) + { + AttackStart(target); + } } - break; + }); } } - void PeonDieRP() + void IntroRP() { - me->GetMotionMaster()->Clear(); - me->SetFacingTo(4.572762489318847656f); - scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext context) { - me->HandleEmoteCommand(EMOTE_ONESHOT_APPLAUD); - Talk(SAY_PEON_DIES); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveIdle(); + me->SetFacingTo(4.572762489318847656f); + + scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) + { + scheduler.Schedule(2500ms, GROUP_RP, [this](TaskContext /*context*/) + { + PeonRoleplay roleplayData = Acore::Containers::SelectRandomContainerElement(PeonRoleplayData); + DoCast(me, roleplayData.spellId); + Talk(roleplayData.textId); + me->GetMotionMaster()->Initialize(); + }); + }); + context.Repeat(16400ms, 28500ms); }); } - void AttackStart(Unit* who) override + void JustEngagedWith(Unit* who) override { - if (EventStage < EVENT_STAGE_MAIN) - return; - - if (me->Attack(who, true)) + if (who->GetEntry() == NPC_PEON) { - DoStartMovement(who); - CombatEventScheduler(); + return; } - } - void CombatEventScheduler() - { + _JustEngagedWith(); + DoAction(ACTION_CANCEL_INTRO); + + scheduler.CancelAll(); + scheduler.Schedule(12150ms, 19850ms, [this](TaskContext context) { if (me->HealthBelowPct(90)) @@ -184,64 +203,10 @@ struct boss_grand_warlock_nethekurse : public BossAI DoCastVictim(SPELL_SHADOW_CLEAVE); context.Repeat(1200ms, 23900ms); }); - } - void MoveInLineOfSight(Unit* /*who*/) override - { - if (EventStage == EVENT_STAGE_NONE) + if (PeonKilledCount < 4) { - if (me->SelectNearestPlayer(30.0f)) - { - DoAction(ACTION_CANCEL_INTRO); - } - } - } - - void IntroRP() - { - scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext context) - { - me->GetMotionMaster()->Clear(); - scheduler.Schedule(500ms, GROUP_RP, [this](TaskContext /*context*/) - { - uint32 choicelocation = urand(1, 3); - me->GetMotionMaster()->MoveIdle(); - me->GetMotionMaster()->MovePoint(0, NethekurseIntroPath[choicelocation][0], NethekurseIntroPath[choicelocation][1], NethekurseIntroPath[choicelocation][2]); - scheduler.Schedule(2500ms, GROUP_RP, [this, choicelocation](TaskContext /*context*/) - { - CastRandomPeonSpell(choicelocation); - }); - }); - context.Repeat(16400ms, 28500ms); - }); - } - - void JustEngagedWith(Unit* /*who*/) override - { - _JustEngagedWith(); - if (EventStage == EVENT_STAGE_NONE) - { - DoAction(ACTION_CANCEL_INTRO); - CombatEventScheduler(); - } - } - - void CastRandomPeonSpell(uint32 choice) - { - if (choice == 1) - { - Talk(SAY_DEATH_COIL); - me->CastSpell(me, SPELL_DEATH_COIL_RP, false); - } - else if (choice == 2) - { - Talk(SAY_SHADOW_FISSURE); - me->CastSpell(me, SPELL_SHADOW_FISSURE_RP, false); - } - else if (choice == 3) - { - Talk(SAY_SHADOW_SEAR); - me->CastSpell(me, SPELL_SHADOW_SEAR, false); + Talk(SAY_SKIP_INTRO); } } @@ -254,60 +219,24 @@ struct boss_grand_warlock_nethekurse : public BossAI { if (action == ACTION_CANCEL_INTRO) { - introDone = true; scheduler.CancelGroup(GROUP_RP); - events2.ScheduleEvent(EVENT_START_ATTACK, 1000); - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); me->SetInCombatWithZone(); - Talk(SAY_INTRO_2); - me->SetHomePosition(NethekurseIntroPath[3][0], NethekurseIntroPath[3][1], NethekurseIntroPath[3][2], 4.572762489318847656f); - me->RemoveUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); return; } - - if (action != ACTION_START_INTRO) - return; - - if (ATreached == true) - return; - - ATreached = true; - me->SetUnitFlag(UNIT_FLAG_NOT_ATTACKABLE_1); - events2.ScheduleEvent(EVENT_INTRO, 90000); - Talk(SAY_INTRO); - EventStage = EVENT_STAGE_INTRO; - instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS); - me->SetInCombatWithZone(); - IntroRP(); + else if (action == ACTION_START_INTRO) + { + IntroRP(); + } } void UpdateAI(uint32 diff) override { - events2.Update(diff); scheduler.Update(diff); - uint32 eventId = events2.ExecuteEvent(); - if (EventStage < EVENT_STAGE_MAIN && instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS) - { - if (eventId == EVENT_INTRO) - { - EventStage = EVENT_STAGE_TAUNT; - } - else if (eventId == EVENT_START_ATTACK) - { - EventStage = EVENT_STAGE_MAIN; - if (Unit* target = me->SelectNearestPlayer(50.0f)) - { - AttackStart(target); - } - DoAction(ACTION_CANCEL_INTRO); - return; - } - } if (!UpdateVictim()) return; - if (EventStage < EVENT_STAGE_MAIN || me->HasUnitState(UNIT_STATE_CASTING)) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; if (!me->HealthBelowPct(25)) @@ -317,24 +246,6 @@ struct boss_grand_warlock_nethekurse : public BossAI private: uint8 PeonEngagedCount = 0; uint8 PeonKilledCount = 0; - uint8 EventStage; - bool introDone; - bool ATreached = false; -}; - -class spell_tsh_shadow_sear : public AuraScript -{ - PrepareAuraScript(spell_tsh_shadow_sear); - - void CalculateDamageAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - amount = 0; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_tsh_shadow_sear::CalculateDamageAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } }; class spell_tsh_shadow_bolt : public SpellScript @@ -345,22 +256,9 @@ class spell_tsh_shadow_bolt : public SpellScript { if (Creature* caster = GetCaster()->ToCreature()) { - std::list playerList; - Map::PlayerList const& players = caster->GetMap()->GetPlayers(); - for (auto itr = players.begin(); itr != players.end(); ++itr) + if (Unit* randomTarget = caster->AI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) { - if (Player* player = itr->GetSource()->ToPlayer()) - { - if (player->IsWithinDist(caster, 100.0f) && player->IsAlive()) - { - playerList.push_back(player); - } - } - } - - if (!playerList.empty()) - { - target = Acore::Containers::SelectRandomContainerElement(playerList); + target = randomTarget; } } } @@ -371,17 +269,28 @@ class spell_tsh_shadow_bolt : public SpellScript } }; -class at_rp_nethekurse : public AreaTriggerScript +class spell_target_fissures : public SpellScript +{ + PrepareSpellScript(spell_target_fissures); + + void HandleEffect(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_LESSER_SHADOW_FISSURE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_target_fissures::HandleEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class at_rp_nethekurse : public OnlyOnceAreaTriggerScript { public: - at_rp_nethekurse() : AreaTriggerScript("at_rp_nethekurse") { } + at_rp_nethekurse() : OnlyOnceAreaTriggerScript("at_rp_nethekurse") { } - bool OnTrigger(Player* player, AreaTrigger const* /*at*/) override + bool _OnTrigger(Player* player, AreaTrigger const* /*at*/) override { - if (player->IsGameMaster()) - { - return false; - } if (InstanceScript* instance = player->GetInstanceScript()) { if (instance->GetBossState(DATA_NETHEKURSE) != DONE && instance->GetBossState(DATA_NETHEKURSE) != IN_PROGRESS) @@ -399,7 +308,7 @@ public: void AddSC_boss_grand_warlock_nethekurse() { RegisterShatteredHallsCreatureAI(boss_grand_warlock_nethekurse); - RegisterSpellScript(spell_tsh_shadow_sear); RegisterSpellScript(spell_tsh_shadow_bolt); + RegisterSpellScript(spell_target_fissures); new at_rp_nethekurse(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index 4860b4207..7f5fbcee7 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -22,9 +22,16 @@ ObjectData const creatureData[] = { - { NPC_GRAND_WARLOCK_NETHEKURSE , DATA_NETHEKURSE }, - { NPC_WARCHIEF_KARGATH , DATA_KARGATH }, - { 0, 0 } + { NPC_GRAND_WARLOCK_NETHEKURSE, DATA_NETHEKURSE }, + { NPC_WARCHIEF_KARGATH, DATA_KARGATH }, + { 0, 0 } +}; + +DoorData const doorData[] = +{ + { GO_GRAND_WARLOCK_CHAMBER_DOOR_1, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE }, + { GO_GRAND_WARLOCK_CHAMBER_DOOR_2, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE }, + { 0, 0, DOOR_TYPE_ROOM } // END }; class instance_shattered_halls : public InstanceMapScript @@ -45,6 +52,7 @@ public: { SetBossNumber(ENCOUNTER_COUNT); LoadObjectData(creatureData, nullptr); + LoadDoorData(doorData); TeamIdInInstance = TEAM_NEUTRAL; RescueTimer = 100 * MINUTE * IN_MILLISECONDS; @@ -56,23 +64,6 @@ public: TeamIdInInstance = player->GetTeamId(); } - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_GRAND_WARLOCK_CHAMBER_DOOR_1: - nethekurseDoor1GUID = go->GetGUID(); - if (GetBossState(DATA_NETHEKURSE) == DONE) - HandleGameObject(ObjectGuid::Empty, true, go); - break; - case GO_GRAND_WARLOCK_CHAMBER_DOOR_2: - nethekurseDoor2GUID = go->GetGUID(); - if (GetBossState(DATA_NETHEKURSE) == DONE) - HandleGameObject(ObjectGuid::Empty, true, go); - break; - } - } - void OnCreatureCreate(Creature* creature) override { if (TeamIdInInstance == TEAM_NEUTRAL) @@ -85,9 +76,6 @@ public: switch (creature->GetEntry()) { - case NPC_WARCHIEF_KARGATH: - warchiefKargathGUID = creature->GetGUID(); - break; case NPC_SHATTERED_EXECUTIONER: if (RescueTimer > 25 * MINUTE * IN_MILLISECONDS) creature->AddLootMode(2); @@ -112,29 +100,6 @@ public: InstanceScript::OnCreatureCreate(creature); } - bool SetBossState(uint32 type, EncounterState state) override - { - if (!InstanceScript::SetBossState(type, state)) - return false; - - switch (type) - { - case DATA_NETHEKURSE: - if (state == IN_PROGRESS) - { - HandleGameObject(nethekurseDoor1GUID, false); - HandleGameObject(nethekurseDoor2GUID, false); - } - else - { - HandleGameObject(nethekurseDoor1GUID, true); - HandleGameObject(nethekurseDoor2GUID, true); - } - break; - } - return true; - } - void SetData(uint32 type, uint32 data) override { if (type == DATA_ENTERED_ROOM && data == DATA_ENTERED_ROOM && RescueTimer == 100 * MINUTE * IN_MILLISECONDS) @@ -142,7 +107,7 @@ public: DoCastSpellOnPlayers(SPELL_KARGATHS_EXECUTIONER_1); instance->LoadGrid(230, -80); - if (Creature* kargath = instance->GetCreature(warchiefKargathGUID)) + if (Creature* kargath = GetCreature(DATA_KARGATH)) sCreatureTextMgr->SendChat(kargath, TeamIdInInstance == TEAM_ALLIANCE ? 3 : 4, nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP); RescueTimer = 80 * MINUTE * IN_MILLISECONDS; @@ -206,11 +171,6 @@ public: } protected: - ObjectGuid warchiefKargathGUID; - ObjectGuid grandWarlockNethekurseGUID; - ObjectGuid nethekurseDoor1GUID; - ObjectGuid nethekurseDoor2GUID; - ObjectGuid executionerGUID; ObjectGuid prisonerGUID[3]; uint32 RescueTimer; From 93c42a4f09d172fff0abfc39e077ce1619d511b2 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 21 May 2023 21:13:58 +0000 Subject: [PATCH 100/107] chore(DB): import pending files Referenced commit(s): 6a73c38eb62f0b3ef2fa44b3f60736aad5ba051b --- .../rev_1684108506441826000.sql => db_world/2023_05_21_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1684108506441826000.sql => db_world/2023_05_21_01.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1684108506441826000.sql b/data/sql/updates/db_world/2023_05_21_01.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1684108506441826000.sql rename to data/sql/updates/db_world/2023_05_21_01.sql index aa96370ae..c083fbc57 100644 --- a/data/sql/updates/pending_db_world/rev_1684108506441826000.sql +++ b/data/sql/updates/db_world/2023_05_21_01.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_21_00 -> 2023_05_21_01 -- SET @NPC := 151089 * 10; DELETE FROM `waypoint_data` WHERE `id` = @NPC; From 67be37def67e834274f66432aeed671de6dce359 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Sun, 21 May 2023 18:24:07 -0300 Subject: [PATCH 101/107] fix(Core/Scripts): Rewrite Warbringer O'mrogg (#16346) * fix(Core/Scripts): Rewrite Warbringer O'mrogg * typo --- .../rev_1684616338556943400.sql | 48 +++ .../ShatteredHalls/boss_warbringer_omrogg.cpp | 382 +++++++++--------- .../instance_shattered_halls.cpp | 8 +- .../ShatteredHalls/shattered_halls.h | 8 +- 4 files changed, 248 insertions(+), 198 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1684616338556943400.sql diff --git a/data/sql/updates/pending_db_world/rev_1684616338556943400.sql b/data/sql/updates/pending_db_world/rev_1684616338556943400.sql new file mode 100644 index 000000000..1e4b8691a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684616338556943400.sql @@ -0,0 +1,48 @@ +-- +UPDATE `creature_template` SET `ScriptName` = '' WHERE `entry` IN (19523, 19524); + +DELETE FROM `creature_template_movement` WHERE (`CreatureId` IN (19523, 19524)); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(19523, 0, 0, 1, 1, 0, 0, 0), +(19524, 0, 0, 1, 1, 0, 0, 0); + +DELETE FROM `creature_text` WHERE `CreatureID` IN (16809, 19523, 19524); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(16809, 0, 0, '%s roars!', 16, 0, 100, 0, 0, 0, 14029, 0, 'O\'mrogg Burning Maul'), + +(19523, 0, 0, 'Smash!', 14, 0, 100, 0, 0, 10306, 14046, 0, 'O\'mrogg Left Head Aggro 1'), +(19523, 1, 0, 'If you nice me let you live.', 14, 0, 100, 0, 0, 10308, 14048, 0, 'O\'mrogg Left Head Aggro 2'), +(19523, 2, 0, 'Me hungry!', 14, 0, 100, 0, 0, 10309, 16918, 0, 'O\'mrogg Left Head Aggro 3'), + +(19523, 3, 0, 'You stay here. Me go kill someone else!', 14, 0, 100, 0, 0, 10303, 16898, 0, 'O\'mrogg Left Head Beatdown'), +(19523, 3, 1, 'We kill someone else!', 14, 0, 100, 0, 0, 10302, 16895, 0, 'O\'mrogg Left Head Beatdown'), +(19523, 3, 2, 'Me not like this one...', 14, 0, 100, 0, 0, 10300, 14043, 0, 'O\'mrogg Left Head Beatdown'), +(19523, 3, 3, 'We kill his friend!', 14, 0, 100, 0, 0, 10301, 14045, 0, 'O\'mrogg Left Head Beatdown'), + +(19523, 4, 0, 'Me get bored.', 14, 0, 100, 0, 0, 10305, 16902, 0, 'O\'mrogg Left Head Beatdown Reply'), +(19523, 5, 0, 'Ha ha ha.', 14, 0, 100, 0, 0, 10304, 16900, 0, 'O\'mrogg Left Head Beatdown Reply'), + +(19523, 6, 0, 'Hey...', 14, 0, 100, 0, 0, 10307, 16917, 0, 'O\'mrogg Left Head Kill Reply'), +(19523, 7, 0, 'This one die easy!', 14, 0, 100, 0, 0, 10310, 16922, 0, 'O\'mrogg Left Head Kill'), + +(19523, 8, 0, 'This all... your fault!', 14, 0, 100, 0, 0, 10311, 16924, 0, 'O\'mrogg Left Head Death'), + +(19524, 0, 0, 'Why don\'t you let me do the talking?', 14, 0, 100, 0, 0, 10317, 14047, 0, 'O\'mrogg Right Head Aggro 1'), +(19524, 1, 0, 'No, we will NOT let you live.', 14, 0, 100, 0, 0, 10318, 16916, 0, 'O\'mrogg Right Head Aggro 2'), +(19524, 2, 0, 'You\'re always hungry. That\'s why we so fat!', 14, 0, 100, 0, 0, 10319, 16919, 0, 'O\'mrogg Right Head Aggro 3'), + +(19524, 3, 0, 'What are you doing?', 14, 0, 100, 0, 0, 10315, 16901, 0, 'O\'mrogg Right Head Beatdown'), +(19524, 3, 1, 'I\'m not done yet, idiot!', 14, 0, 100, 0, 0, 10313, 16896, 0, 'O\'mrogg Right Head Beatdown'), +(19524, 3, 2, 'Hey, you numbskull!', 14, 0, 100, 0, 0, 10312, 14044, 0, 'O\'mrogg Right Head Beatdown'), + +(19524, 4, 0, 'Bored? He was almost dead!', 14, 0, 100, 0, 0, 10316, 16903, 0, 'O\'mrogg Right Head Beatdown Reply'), +(19524, 5, 0, 'That\'s not funny!', 14, 0, 100, 0, 0, 10314, 16899, 0, 'O\'mrogg Right Head Beatdown Reply'), + +(19524, 6, 0, 'I\'m tired. You kill next one!', 14, 0, 100, 0, 0, 10320, 16921, 0, 'O\'mrogg Right Head Kill'), +(19524, 7, 0, 'That\'s because I do all the hard work!', 14, 0, 100, 0, 0, 10321, 16923, 0, 'O\'mrogg Right Head Kill Reply'), + +(19524, 8, 0, 'I... hate... you.', 14, 0, 100, 0, 0, 10322, 16925, 0, 'O\'mrogg Right Head Death'); + +DELETE FROM `spell_script_names` WHERE `spell_id` = 30598 AND `ScriptName` = 'spell_burning_maul'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(30598, 'spell_burning_maul'); diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp index eb6ebc266..46d074148 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp @@ -17,6 +17,8 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "TaskScheduler.h" #include "shattered_halls.h" enum Spells @@ -34,32 +36,23 @@ enum Equip EQUIP_BURNING_MAUL = 2 }; -enum Creatures +enum HeadYells { - NPC_LEFT_HEAD = 19523, - NPC_RIGHT_HEAD = 19524 + SAY_ON_AGGRO = 0, + SAY_ON_AGGRO_2, + SAY_ON_AGGRO_3, + SAY_ON_BEATDOWN, + SAY_ON_BEATDOWN_2, + SAY_ON_BEATDOWN_3, + SAY_ON_KILL, + SAY_ON_KILL_2, + SAY_ON_DEATH }; enum Misc { - EMOTE_ENRAGE = 0, - - SETDATA_DATA = 1, - SETDATA_YELL = 1 -}; - -enum Events -{ - EVENT_AGGRO_YELL_1 = 1, - EVENT_AGGRO_YELL_2 = 2, - EVENT_AGGRO_YELL_3 = 3, - EVENT_THREAT_YELL_L_1 = 4, - EVENT_THREAT_YELL_L_2 = 5, - EVENT_THREAT_YELL_L_3 = 6, - EVENT_THREAT_YELL_R_1 = 7, - EVENT_KILL_YELL_LEFT = 8, - EVENT_KILL_YELL_RIGHT = 9, - EVENT_DEATH_YELL = 10 + EMOTE_BURNING_MAUL = 0, + DATA_BURNING_MAUL_END = 1 }; enum Phase @@ -79,217 +72,218 @@ struct boss_warbringer_omrogg : public BossAI }); } - EventMap events2; - - Creature* GetLeftHead() + void HandleHeadTalk(HeadYells yell) { - return summons.GetCreatureWithEntry(NPC_LEFT_HEAD); - } - - Creature* GetRightHead() - { - return summons.GetCreatureWithEntry(NPC_RIGHT_HEAD); - } - - void JustEngagedWith(Unit* /*who*/) override - { - me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0); - - if (Creature* LeftHead = GetLeftHead()) + switch (yell) { - uint8 aggroYell = urand(EVENT_AGGRO_YELL_1, EVENT_AGGRO_YELL_3); - LeftHead->AI()->Talk(aggroYell - 1); - events2.ScheduleEvent(aggroYell, 3000); - } - - _JustEngagedWith(); - scheduler.Schedule(500ms, GROUP_FULL_PHASE, [this](TaskContext context) - { - scheduler.Schedule(12100ms, 17300ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context) + case SAY_ON_AGGRO: { - DoCastAOE(SPELL_THUNDERCLAP); - context.Repeat(17200ms, 24200ms); - }).Schedule(20s, 30s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) - { - DoCastSelf(SPELL_BEATDOWN); - me->SetUnitFlag(UNIT_FLAG_PACIFIED); - me->SetReactState(REACT_PASSIVE); - scheduler.Schedule(200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + uint8 group = urand(SAY_ON_AGGRO, SAY_ON_AGGRO_3); + if (Creature* leftHead = instance->GetCreature(DATA_OMROGG_LEFT_HEAD)) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); - if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) + leftHead->AI()->Talk(group); + _headTalk.Schedule(3600ms, [this, group](TaskContext /*context*/) { - head->AI()->Talk(threatYell - 1); - } - events.ScheduleEvent(threatYell, 3000); - DoResetThreatList(); - me->AddThreat(target, 2250.0f); - scheduler.Schedule(1200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) - { - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); + if (Creature* rightHead = instance->GetCreature(DATA_OMROGG_RIGHT_HEAD)) + rightHead->AI()->Talk(group); }); - } - }).Schedule(40s, 60s, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + } + break; + } + case SAY_ON_BEATDOWN: + { + if (Creature* leftHead = instance->GetCreature(DATA_OMROGG_LEFT_HEAD)) { - me->SetUnitFlag(UNIT_FLAG_PACIFIED); - me->SetReactState(REACT_PASSIVE); - scheduler.Schedule(1200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) - { - DoCastSelf(SPELL_FEAR); - DoCastSelf(SPELL_BURNING_MAUL); - me->LoadEquipment(EQUIP_BURNING_MAUL); - scheduler.CancelGroup(GROUP_NON_BURNING_PHASE); - scheduler.Schedule(200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + leftHead->AI()->Talk(SAY_ON_BEATDOWN); + _headTalk.Schedule(3600ms, [this](TaskContext context) { - me->Yell("%s roars!", LANG_UNIVERSAL); - scheduler.Schedule(2200ms, GROUP_BURNING_PHASE, [this](TaskContext /*context*/) + if (Creature* rightHead = instance->GetCreature(DATA_OMROGG_RIGHT_HEAD)) + rightHead->AI()->Talk(SAY_ON_BEATDOWN); + context.Schedule(3600ms, [this](TaskContext context) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + uint8 group = urand(SAY_ON_BEATDOWN_2, SAY_ON_BEATDOWN_3); + if (Creature* leftHead = instance->GetCreature(DATA_OMROGG_LEFT_HEAD)) + leftHead->AI()->Talk(group); + context.Schedule(3600ms, [this, group](TaskContext /*context*/) { - uint8 threatYell = urand(EVENT_THREAT_YELL_L_1, EVENT_THREAT_YELL_R_1); - if (Creature* head = threatYell == EVENT_THREAT_YELL_R_1 ? GetRightHead() : GetLeftHead()) - { - head->AI()->Talk(threatYell - 1); - } - events.ScheduleEvent(threatYell, 3000); - DoResetThreatList(); - me->AddThreat(target, 2250.0f); - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_PACIFIED); - } + if (Creature* rightHead = instance->GetCreature(DATA_OMROGG_RIGHT_HEAD)) + rightHead->AI()->Talk(group); + }); }); }); - scheduler.Schedule(4850ms, 8500ms, GROUP_BURNING_PHASE, [this](TaskContext context) - { - DoCastAOE(SPELL_BLAST_WAVE, false); - context.Repeat(4850ms, 8500ms); - }).Schedule(45s, 60s, GROUP_BURNING_PHASE, [this](TaskContext context) - { - me->LoadEquipment(EQUIP_STANDARD); - context.CancelGroup(GROUP_BURNING_PHASE); - scheduler.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); - context.RescheduleGroup(GROUP_NON_BURNING_PHASE, 5ms); - context.RescheduleGroup(GROUP_FULL_PHASE, 1050ms); - }); + } + break; + } + case SAY_ON_KILL: + { + uint8 group = urand(SAY_ON_KILL, SAY_ON_KILL_2); + if (Creature* leftHead = instance->GetCreature(DATA_OMROGG_LEFT_HEAD)) + leftHead->AI()->Talk(group); + _headTalk.Schedule(3600ms, [this, group](TaskContext /*context*/) + { + if (Creature* rightHead = instance->GetCreature(DATA_OMROGG_RIGHT_HEAD)) + rightHead->AI()->Talk(group); }); - }); - }); - context.Repeat(130s, 150s); - }); + break; + } + case SAY_ON_DEATH: + { + if (Creature* leftHead = instance->GetCreature(DATA_OMROGG_LEFT_HEAD)) + leftHead->AI()->Talk(SAY_ON_DEATH); + _headTalk.Schedule(3600ms, [this](TaskContext /*context*/) + { + if (Creature* rightHead = instance->GetCreature(DATA_OMROGG_RIGHT_HEAD)) + rightHead->AI()->Talk(SAY_ON_DEATH); + }); + break; + } + default: + break; + } } - void JustSummoned(Creature* summoned) override + void SetData(uint32 data, uint32) override { - summons.Summon(summoned); - } - - void KilledUnit(Unit* /*victim*/) override - { - Creature* head = nullptr; - uint32 eventId = EVENT_KILL_YELL_LEFT; - if (urand(0, 1)) - { - head = GetLeftHead(); - eventId = EVENT_KILL_YELL_LEFT; - } - else - { - head = GetRightHead(); - eventId = EVENT_KILL_YELL_RIGHT; - } - - if (head) - { - head->AI()->Talk(eventId - 1); - } - events2.ScheduleEvent(eventId, 3000); - } - - void JustDied(Unit* /*killer*/) override - { - Creature* LeftHead = GetLeftHead(); - Creature* RightHead = GetRightHead(); - if (!LeftHead || !RightHead) + if (data != DATA_BURNING_MAUL_END) return; - LeftHead->DespawnOrUnsummon(5000); - RightHead->DespawnOrUnsummon(5000); - LeftHead->AI()->Talk(EVENT_DEATH_YELL - 1); - RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL); - instance->SetBossState(DATA_OMROGG, DONE); + scheduler.CancelGroup(GROUP_BURNING_PHASE); + ScheduleNonBurningPhase(); + ScheduleBurningPhase(); + } + + void ScheduleNonBurningPhase() + { + scheduler. + Schedule(12100ms, 17300ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context) + { + DoCastAOE(SPELL_THUNDERCLAP); + context.Repeat(17200ms, 24200ms); + }) + .Schedule(20s, 30s, GROUP_NON_BURNING_PHASE, [this](TaskContext context) + { + DoCastSelf(SPELL_BEATDOWN); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + context.Schedule(200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext context) + { + DoResetThreatList(); + if (Unit* newTarget = SelectTarget(SelectTargetMethod::Random, 1)) + me->AddThreat(newTarget, 2250.f); + HandleHeadTalk(SAY_ON_BEATDOWN); + context.Schedule(1200ms, GROUP_NON_BURNING_PHASE, [this](TaskContext /*context*/) + { + me->SetReactState(REACT_AGGRESSIVE); + }); + }); + context.Repeat(); + }); + } + + void ScheduleBurningPhase() + { + scheduler. + Schedule(45s, 60s, GROUP_BURNING_PHASE, [this](TaskContext context) + { + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + context.CancelGroup(GROUP_NON_BURNING_PHASE); + context.Schedule(1200ms, [this](TaskContext context) + { + DoCastAOE(SPELL_FEAR); + DoCast(SPELL_BURNING_MAUL); + context.Schedule(200ms, [this](TaskContext context) + { + Talk(EMOTE_BURNING_MAUL); + context.Schedule(2200ms, [this](TaskContext context) + { + DoResetThreatList(); + if (Unit* newTarget = SelectTarget(SelectTargetMethod::Random, 1)) + me->AddThreat(newTarget, 2250.f); + me->SetReactState(REACT_AGGRESSIVE); + context.Schedule(4850ms, 8500ms, GROUP_BURNING_PHASE, [this](TaskContext context) + { + DoCastAOE(SPELL_BLAST_WAVE); + context.Repeat(); + }); + }); + }); + }); + + }); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + _headTalk.CancelAll(); + HandleHeadTalk(SAY_ON_AGGRO); + + ScheduleNonBurningPhase(); + ScheduleBurningPhase(); + } + + void KilledUnit(Unit* victim) override + { + if (victim && victim->GetTypeId() == TYPEID_PLAYER) + HandleHeadTalk(SAY_ON_KILL); + } + + void JustDied(Unit* killer) override + { + HandleHeadTalk(SAY_ON_DEATH); + BossAI::JustDied(killer); } void UpdateAI(uint32 diff) override { - events2.Update(diff); - scheduler.Update(diff); - switch (uint32 eventId = events2.ExecuteEvent()) - { - case EVENT_AGGRO_YELL_1: - case EVENT_AGGRO_YELL_2: - case EVENT_AGGRO_YELL_3: - case EVENT_KILL_YELL_LEFT: - case EVENT_THREAT_YELL_L_1: - case EVENT_THREAT_YELL_L_2: - case EVENT_THREAT_YELL_L_3: - if (Creature* RightHead = GetRightHead()) - { - RightHead->AI()->Talk(eventId - 1); - } - break; - case EVENT_KILL_YELL_RIGHT: - case EVENT_THREAT_YELL_R_1: - if (Creature* LeftHead = GetLeftHead()) - { - LeftHead->AI()->Talk(eventId - 1); - } - break; - } + _headTalk.Update(diff); if (!UpdateVictim()) return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - DoMeleeAttackIfReady(); + scheduler.Update(diff, [this] + { + DoMeleeAttackIfReady(); + }); } + + protected: + TaskScheduler _headTalk; }; -struct npc_omrogg_heads : public NullCreatureAI +class spell_burning_maul : public AuraScript { - npc_omrogg_heads(Creature* creature) : NullCreatureAI(creature) - { - timer = 0; - } + PrepareAuraScript(spell_burning_maul); - void SetData(uint32 data, uint32 value) override + void HandleOnRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) + { + if (Unit* caster = GetCaster()) { - if (data == SETDATA_DATA && value == SETDATA_YELL) - timer = 1; - } - - void UpdateAI(uint32 diff) override - { - if (timer) + if (Creature* omrogg = caster->ToCreature()) { - timer += diff; - if (timer >= 3000) - { - timer = 0; - Talk(EVENT_DEATH_YELL - 1); - } + omrogg->LoadEquipment(EQUIP_STANDARD); + omrogg->AI()->SetData(DATA_BURNING_MAUL_END, 0); } } - uint32 timer; + } + + void HandleOnApply(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) + { + if (Unit* caster = GetCaster()) + if (Creature* omrogg = caster->ToCreature()) + omrogg->LoadEquipment(EQUIP_BURNING_MAUL); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_burning_maul::HandleOnRemove, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectApply += AuraEffectApplyFn(spell_burning_maul::HandleOnApply, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_warbringer_omrogg() { RegisterShatteredHallsCreatureAI(boss_warbringer_omrogg); - RegisterShatteredHallsCreatureAI(npc_omrogg_heads); + RegisterSpellScript(spell_burning_maul); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index 7f5fbcee7..7ae1c3304 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -22,9 +22,11 @@ ObjectData const creatureData[] = { - { NPC_GRAND_WARLOCK_NETHEKURSE, DATA_NETHEKURSE }, - { NPC_WARCHIEF_KARGATH, DATA_KARGATH }, - { 0, 0 } + { NPC_GRAND_WARLOCK_NETHEKURSE , DATA_NETHEKURSE }, + { NPC_WARCHIEF_KARGATH , DATA_KARGATH }, + { NPC_OMROGG_LEFT_HEAD , DATA_OMROGG_LEFT_HEAD }, + { NPC_OMROGG_RIGHT_HEAD , DATA_OMROGG_RIGHT_HEAD }, + { 0 , 0 } }; DoorData const doorData[] = diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h index 249224ae4..df137d902 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h @@ -35,7 +35,9 @@ enum DataTypes DATA_PRISONER_1 = 11, DATA_PRISONER_2 = 12, DATA_PRISONER_3 = 13, - DATA_EXECUTIONER = 14 + DATA_EXECUTIONER = 14, + DATA_OMROGG_LEFT_HEAD = 15, + DATA_OMROGG_RIGHT_HEAD = 16 }; enum CreatureIds @@ -44,6 +46,10 @@ enum CreatureIds NPC_WARCHIEF_KARGATH = 16808, NPC_FEL_ORC_CONVERT = 17083, + // O'MROGG + NPC_OMROGG_LEFT_HEAD = 19523, + NPC_OMROGG_RIGHT_HEAD = 19524, + // Trial of the Naaru: Mercy NPC_SHATTERED_EXECUTIONER = 17301, NPC_RIFLEMAN_BROWNBEARD = 17289, From 8e91065412805f4674c54119bcd7a060d1f84e19 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Sun, 21 May 2023 21:26:27 +0000 Subject: [PATCH 102/107] chore(DB): import pending files Referenced commit(s): 67be37def67e834274f66432aeed671de6dce359 --- .../rev_1684616338556943400.sql => db_world/2023_05_21_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1684616338556943400.sql => db_world/2023_05_21_02.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1684616338556943400.sql b/data/sql/updates/db_world/2023_05_21_02.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1684616338556943400.sql rename to data/sql/updates/db_world/2023_05_21_02.sql index 1e4b8691a..f08ba22fe 100644 --- a/data/sql/updates/pending_db_world/rev_1684616338556943400.sql +++ b/data/sql/updates/db_world/2023_05_21_02.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_21_01 -> 2023_05_21_02 -- UPDATE `creature_template` SET `ScriptName` = '' WHERE `entry` IN (19523, 19524); From a56a400a1368ec0c61e7b1bdf17ad11933a348e1 Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Tue, 23 May 2023 06:48:23 -0300 Subject: [PATCH 103/107] fix(Scripts/ShatteredHalls): Rewrite Warchief Kargath Bladefist (#16355) --- .../rev_1684773536924402300.sql | 10 + .../boss_warchief_kargath_bladefist.cpp | 290 +++++++++++++----- .../instance_shattered_halls.cpp | 1 + .../ShatteredHalls/shattered_halls.h | 7 +- 4 files changed, 231 insertions(+), 77 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1684773536924402300.sql diff --git a/data/sql/updates/pending_db_world/rev_1684773536924402300.sql b/data/sql/updates/pending_db_world/rev_1684773536924402300.sql new file mode 100644 index 000000000..cebd5fdbe --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1684773536924402300.sql @@ -0,0 +1,10 @@ +-- +DELETE FROM `spell_script_names` WHERE `spell_id` = 30738 AND `ScriptName` = 'spell_blade_dance_targeting'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(30738, 'spell_blade_dance_targeting'); + +UPDATE `creature_template` SET `ScriptName` = 'npc_warchief_portal' WHERE `entry` = 17611; + +DELETE FROM `creature_text` WHERE `CreatureID` = 16808 AND `GroupID` = 5; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(16808, 5, 0, 'Cowards! You\'ll never draw me into the shadows!', 14, 0, 100, 0, 0, 0, 18367, 0, 'kargath SAY_EVADE'); diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index 5c9a5c09a..71c2760f0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -17,41 +17,53 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "TaskScheduler.h" #include "shattered_halls.h" enum Says { SAY_AGGRO = 0, SAY_SLAY = 1, - SAY_DEATH = 2 + SAY_DEATH = 2, + SAY_EVADE = 5 }; enum Spells { - SPELL_BLADE_DANCE = 30739, - SPELL_CHARGE = 25821, - SPELL_SPRINT = 32720 + // Blade dance + SPELL_BLADE_DANCE_TARGETING = 30738, + SPELL_BLADE_DANCE_DMG = 30739, + SPELL_BLADE_DANCE_CHARGE = 30751, + + // Warchief portal + SPELL_SUMMON_HEATHEN = 30737, + SPELL_SUMMON_REAVER = 30785, + SPELL_SUMMON_SHARPSHOOTER = 30786 }; enum Creatures { NPC_SHATTERED_ASSASSIN = 17695, - NPC_HEARTHEN_GUARD = 17621, - NPC_SHARPSHOOTER_GUARD = 17622, - NPC_REAVER_GUARD = 17623 + NPC_BLADE_DANCE_TARGET = 20709 }; -enum Misc +enum PortalData { - EVENT_SPELL_CHARGE = 1, - EVENT_MOVE_TO_NEXT_POINT = 2, - EVENT_BLADE_DANCE = 3, - EVENT_FINISH_BLADE_DANCE = 4 + DATA_START_FIGHT = 1, + DATA_RESET_FIGHT = 2 }; -float AssassEntrance[3] = { 275.136f, -84.29f, 2.3f }; // y -8 -float AssassExit[3] = { 184.233f, -84.29f, 2.3f }; // y -8 -float AddsEntrance[3] = { 306.036f, -84.29f, 1.93f }; +std::array const summonSpells = { SPELL_SUMMON_HEATHEN, SPELL_SUMMON_REAVER, SPELL_SUMMON_SHARPSHOOTER }; +std::vector const assassinsPos = +{ + { 172.68164f, -80.65692f, 2.0834563f, 5.4279f }, + { 167.8295f, -86.55783f, 1.9949634f, 0.8118f }, + { 287.0375f, -88.17879f, 2.0663502f, 3.2490f }, + { 292.1491f, -82.25267f, 1.9973913f, 5.8568f } +}; + +Position const kargathRespawnPos = { 231.25f, -83.6449f, 5.02341f }; struct boss_warchief_kargath_bladefist : public BossAI { @@ -75,10 +87,45 @@ struct boss_warchief_kargath_bladefist : public BossAI } } - void JustDied(Unit* /*killer*/) override + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + if (summon) + { + summon->SetVisible(false); + scheduler.Schedule(20s, [summon](TaskContext /*context*/) + { + if (summon) + { + summon->Respawn(true); + summon->SetVisible(true); + } + }); + } + } + + void RespawnAssassins() + { + for (Position const& summonPos : assassinsPos) + me->SummonCreature(NPC_SHATTERED_ASSASSIN, summonPos); + } + + void Reset() override + { + BossAI::Reset(); + if (Creature* warchiefPortal = instance->GetCreature(DATA_WARCHIEF_PORTAL)) + warchiefPortal->AI()->SetData(DATA_RESET_FIGHT, 0); + _danceCount = 0; + } + + void JustDied(Unit* killer) override { Talk(SAY_DEATH); - _JustDied(); + BossAI::JustDied(killer); if (instance) { if (Creature* executioner = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EXECUTIONER))) @@ -88,79 +135,58 @@ struct boss_warchief_kargath_bladefist : public BossAI } } - void JustEngagedWith(Unit* /*who*/) override + void JustEngagedWith(Unit* who) override { Talk(SAY_AGGRO); - _JustEngagedWith(); - scheduler.Schedule(5s, [this](TaskContext /*context*/) - { - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] + 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassEntrance[0], AssassEntrance[1] - 8, AssassEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] + 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - me->SummonCreature(NPC_SHATTERED_ASSASSIN, AssassExit[0], AssassExit[1] - 8, AssassExit[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - }).Schedule(30s, [this](TaskContext context) - { - for (uint8 i = 0; i < 2; ++i) - { - me->SummonCreature(NPC_HEARTHEN_GUARD + urand(0, 2), AddsEntrance[0], AddsEntrance[1], AddsEntrance[2], 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); - } - context.Repeat(30s); - }).Schedule(30s, [this](TaskContext context) - { - scheduler.DelayAll(10001ms); - context.Repeat(40s); - scheduler.Schedule(1ms, [this](TaskContext /*context*/) - { - float x = 210 + frand(0.0f, 35.0f); - float y = -65.0f - frand(0.0f, 35.0f); - me->GetMotionMaster()->MovePoint(1, x, y, me->GetPositionZ()); - }).Schedule(10s, [this](TaskContext /*context*/) - { - //events.SetPhase(0); howToMigrate? - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - if (IsHeroic()) + BossAI::JustEngagedWith(who); + if (Creature* warchiefPortal = instance->GetCreature(DATA_WARCHIEF_PORTAL)) + warchiefPortal->AI()->SetData(DATA_START_FIGHT, 0); + RespawnAssassins(); + scheduler + .Schedule(30s, [this](TaskContext context) { - scheduler.Schedule(3s, [this](TaskContext context) - { - DoCastVictim(SPELL_CHARGE); - context.Repeat(30s); - }); - } - }); - //events.SetPhase(1); howToMigrate? - DoCastSelf(SPELL_SPRINT, true); - }); - } - - void JustSummoned(Creature* summon) override - { - if (summon->GetEntry() != NPC_SHATTERED_ASSASSIN) - { - summon->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0)); - } - summons.Summon(summon); + me->SetReactState(REACT_PASSIVE); + _danceCount = 0; + DoCastAOE(SPELL_BLADE_DANCE_TARGETING); + context.Repeat(32850ms, 41350ms); + }); } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() == TYPEID_PLAYER) + if (victim && victim->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); } - void MovementInform(uint32 type, uint32 id) override + void MovementInform(uint32 type, uint32 /*id*/) override { - if (type != POINT_MOTION_TYPE || id != 1) + if (type != POINT_MOTION_TYPE) return; - me->CastSpell(me, SPELL_BLADE_DANCE, true); - events.ScheduleEvent(EVENT_MOVE_TO_NEXT_POINT, 0); + if (_danceCount < 8) + { + _danceCount++; + scheduler.Schedule(100ms, [this](TaskContext /*context*/) + { + DoCastAOE(SPELL_BLADE_DANCE_TARGETING); + }); + } + else + me->SetReactState(REACT_AGGRESSIVE); + } + + bool IsInRoom() + { + if (me->GetExactDist2d(kargathRespawnPos) >= 42.f) + return false; + return true; } void UpdateAI(uint32 diff) override { - if (me->GetPositionX() > 255 || me->GetPositionX() < 205) + if (!IsInRoom()) { + Talk(SAY_EVADE); EnterEvadeMode(); return; } @@ -168,14 +194,128 @@ struct boss_warchief_kargath_bladefist : public BossAI if (!UpdateVictim()) return; - scheduler.Update(diff); + scheduler.Update(diff, [this] + { + DoMeleeAttackIfReady(); + }); + } - if (!events.IsInPhase(1)) // howToMigrate? - DoMeleeAttackIfReady(); + protected: + uint8 _danceCount; +}; + +struct npc_warchief_portal : public ScriptedAI +{ +public: + npc_warchief_portal(Creature* creature) : ScriptedAI(creature) { } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + + void JustSummoned(Creature* creature) override + { + InstanceScript* instance = me->GetInstanceScript(); + if (!instance) + return; + + if (Creature* kargath = instance->GetCreature(DATA_KARGATH)) + kargath->AI()->JustSummoned(creature); + } + + void SetData(uint32 type, uint32 /*data*/) override + { + if (type == DATA_START_FIGHT) + { + _scheduler.Schedule(20600ms, [this](TaskContext context) + { + DoCastSelf(summonSpells[context.GetRepeatCounter() % 3]); + context.Repeat(); + }); + } + + if (type == DATA_RESET_FIGHT) + { + _scheduler.CancelAll(); + } + } + +protected: + TaskScheduler _scheduler; +}; + +class spell_blade_dance_targeting : public SpellScript +{ + PrepareSpellScript(spell_blade_dance_targeting); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BLADE_DANCE_CHARGE, SPELL_BLADE_DANCE_DMG }); + } + + void FilterTargets(std::list& targets) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + targets.remove_if([&](WorldObject* target) -> bool + { + float dist = caster->GetDistance2d(target); + // Do not target dummies that are too close or too far away + if (dist < 5.f || dist > 16.f) + return true; + // Do not target anything that is not a target dummy + if (target->GetEntry() != NPC_BLADE_DANCE_TARGET) + return true; + + return false; + }); + + std::list targets2 = targets; + + targets.remove_if([&](WorldObject* target) -> bool + { + if (target->SelectNearestPlayer(15.f)) + return false; + return true; + }); + + Acore::Containers::RandomResize(targets2, 1); + + if (urand(0, 2)) + { + if (targets.empty()) + targets = targets2; + else + Acore::Containers::RandomResize(targets, 1); + } + else + targets = targets2; + } + + void HandleOnHit() + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + if (!caster || !target) + return; + + caster->CastSpell(target, SPELL_BLADE_DANCE_CHARGE, true); + caster->CastSpell(target, SPELL_BLADE_DANCE_DMG, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_blade_dance_targeting::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnHit += SpellHitFn(spell_blade_dance_targeting::HandleOnHit); } }; void AddSC_boss_warchief_kargath_bladefist() { RegisterShatteredHallsCreatureAI(boss_warchief_kargath_bladefist); + RegisterShatteredHallsCreatureAI(npc_warchief_portal); + RegisterSpellScript(spell_blade_dance_targeting); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index 7ae1c3304..5df8630d0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -26,6 +26,7 @@ ObjectData const creatureData[] = { NPC_WARCHIEF_KARGATH , DATA_KARGATH }, { NPC_OMROGG_LEFT_HEAD , DATA_OMROGG_LEFT_HEAD }, { NPC_OMROGG_RIGHT_HEAD , DATA_OMROGG_RIGHT_HEAD }, + { NPC_WARCHIEF_PORTAL , DATA_WARCHIEF_PORTAL }, { 0 , 0 } }; diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h index df137d902..089c0d2d2 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h @@ -37,14 +37,17 @@ enum DataTypes DATA_PRISONER_3 = 13, DATA_EXECUTIONER = 14, DATA_OMROGG_LEFT_HEAD = 15, - DATA_OMROGG_RIGHT_HEAD = 16 + DATA_OMROGG_RIGHT_HEAD = 16, + DATA_WARCHIEF_PORTAL = 17 }; enum CreatureIds { NPC_GRAND_WARLOCK_NETHEKURSE = 16807, - NPC_WARCHIEF_KARGATH = 16808, NPC_FEL_ORC_CONVERT = 17083, + // Warchief Kargath + NPC_WARCHIEF_KARGATH = 16808, + NPC_WARCHIEF_PORTAL = 17611, // O'MROGG NPC_OMROGG_LEFT_HEAD = 19523, From f9e046db551e299a953909e4be59d8f5219b64d6 Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 23 May 2023 09:50:54 +0000 Subject: [PATCH 104/107] chore(DB): import pending files Referenced commit(s): a56a400a1368ec0c61e7b1bdf17ad11933a348e1 --- .../rev_1684773536924402300.sql => db_world/2023_05_23_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1684773536924402300.sql => db_world/2023_05_23_00.sql} (93%) diff --git a/data/sql/updates/pending_db_world/rev_1684773536924402300.sql b/data/sql/updates/db_world/2023_05_23_00.sql similarity index 93% rename from data/sql/updates/pending_db_world/rev_1684773536924402300.sql rename to data/sql/updates/db_world/2023_05_23_00.sql index cebd5fdbe..10e58210b 100644 --- a/data/sql/updates/pending_db_world/rev_1684773536924402300.sql +++ b/data/sql/updates/db_world/2023_05_23_00.sql @@ -1,3 +1,4 @@ +-- DB update 2023_05_21_02 -> 2023_05_23_00 -- DELETE FROM `spell_script_names` WHERE `spell_id` = 30738 AND `ScriptName` = 'spell_blade_dance_targeting'; INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES From 5e326789ac1d740c7897acddf07d6dfd0cb886c4 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 23 May 2023 16:16:00 +0200 Subject: [PATCH 105/107] fix(DB/Character): Allow names to be accent senstive (#16344) * fix(DB/Character): Allow names to be accent senstive * closes https://github.com/azerothcore/azerothcore-wotlk/issues/16314 * Cherry-pick commit (https://github.com/TrinityCore/TrinityCore/commit/fb388298a0bf76402a6f1de35bdfcb33223d51bb) Co-authored-by: Shauren --- data/sql/base/db_characters/characters.sql | 2 +- .../updates/pending_db_characters/rev_1684700137059902900.sql | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 data/sql/updates/pending_db_characters/rev_1684700137059902900.sql diff --git a/data/sql/base/db_characters/characters.sql b/data/sql/base/db_characters/characters.sql index ce8bb12f6..02bcc41d3 100644 --- a/data/sql/base/db_characters/characters.sql +++ b/data/sql/base/db_characters/characters.sql @@ -19,7 +19,7 @@ DROP TABLE IF EXISTS `characters`; CREATE TABLE IF NOT EXISTS `characters` ( `guid` int unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', `account` int unsigned NOT NULL DEFAULT '0' COMMENT 'Account Identifier', - `name` varchar(12) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, `race` tinyint unsigned NOT NULL DEFAULT '0', `class` tinyint unsigned NOT NULL DEFAULT '0', `gender` tinyint unsigned NOT NULL DEFAULT '0', diff --git a/data/sql/updates/pending_db_characters/rev_1684700137059902900.sql b/data/sql/updates/pending_db_characters/rev_1684700137059902900.sql new file mode 100644 index 000000000..74d8d2a70 --- /dev/null +++ b/data/sql/updates/pending_db_characters/rev_1684700137059902900.sql @@ -0,0 +1,2 @@ +-- +ALTER TABLE `characters` MODIFY `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL AFTER `account`; From 3e708d384dca7c3583cbf22bf0647c2b8708610a Mon Sep 17 00:00:00 2001 From: AzerothCoreBot Date: Tue, 23 May 2023 14:18:39 +0000 Subject: [PATCH 106/107] chore(DB): import pending files Referenced commit(s): 5e326789ac1d740c7897acddf07d6dfd0cb886c4 --- .../2023_05_23_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_characters/rev_1684700137059902900.sql => db_characters/2023_05_23_00.sql} (73%) diff --git a/data/sql/updates/pending_db_characters/rev_1684700137059902900.sql b/data/sql/updates/db_characters/2023_05_23_00.sql similarity index 73% rename from data/sql/updates/pending_db_characters/rev_1684700137059902900.sql rename to data/sql/updates/db_characters/2023_05_23_00.sql index 74d8d2a70..579d5d880 100644 --- a/data/sql/updates/pending_db_characters/rev_1684700137059902900.sql +++ b/data/sql/updates/db_characters/2023_05_23_00.sql @@ -1,2 +1,3 @@ +-- DB update 2023_04_24_00 -> 2023_05_23_00 -- ALTER TABLE `characters` MODIFY `name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL AFTER `account`; From 30f475829a831230e4308e40eac62c712819250e Mon Sep 17 00:00:00 2001 From: Angelo Venturini Date: Tue, 23 May 2023 22:39:55 -0300 Subject: [PATCH 107/107] fix(Core/Spells): Hunter snake trap damage (#16326) --- src/server/game/Entities/Pet/Pet.cpp | 18 +++++++++++++----- src/server/game/Entities/Pet/PetDefines.h | 4 ++++ src/server/scripts/Pet/pet_hunter.cpp | 17 +++++------------ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index d9ebd3c26..01b8fb146 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -1124,11 +1124,11 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetModifierValue(UNIT_MOD_MANA, BASE_VALUE, GetCreateMana()); // xinef: added some multipliers so debuffs can affect pets in any way... - SetCreateStat(STAT_STRENGTH, 22 + 2 * petlevel); - SetCreateStat(STAT_AGILITY, 22 + 1.5f * petlevel); - SetCreateStat(STAT_STAMINA, 25 + 2 * petlevel); - SetCreateStat(STAT_INTELLECT, 28 + 2 * petlevel); - SetCreateStat(STAT_SPIRIT, 27 + 1.5f * petlevel); + SetCreateStat(STAT_STRENGTH, 22); + SetCreateStat(STAT_AGILITY, 22); + SetCreateStat(STAT_STAMINA, 25); + SetCreateStat(STAT_INTELLECT, 28); + SetCreateStat(STAT_SPIRIT, 27); } switch (petType) @@ -1348,6 +1348,14 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel + (petlevel / 4))); break; } + case NPC_VENOMOUS_SNAKE: + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel * 0.7 - 38)); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel * 0.8 - 40)); + break; + case NPC_VIPER: + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(1.3 * petlevel - 64)); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(1.5 * petlevel - 68)); + break; case NPC_GENERIC_IMP: case NPC_GENERIC_VOIDWALKER: { diff --git a/src/server/game/Entities/Pet/PetDefines.h b/src/server/game/Entities/Pet/PetDefines.h index 1b739c1b3..22849c217 100644 --- a/src/server/game/Entities/Pet/PetDefines.h +++ b/src/server/game/Entities/Pet/PetDefines.h @@ -122,6 +122,10 @@ enum NPCEntries NPC_ARMY_OF_THE_DEAD = 24207, NPC_EBON_GARGOYLE = 27829, + // Hunter + NPC_VENOMOUS_SNAKE = 19833, + NPC_VIPER = 19921, + // Generic NPC_GENERIC_IMP = 12922, NPC_GENERIC_VOIDWALKER = 8996 diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 048afaf13..1e9298759 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -96,24 +96,17 @@ struct npc_pet_hunter_snake_trap : public ScriptedAI { _init = true; - CreatureTemplate const* Info = me->GetCreatureTemplate(); - CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(me->GetLevel(), Info->unit_class); uint32 health = uint32(107 * (me->GetLevel() - 40) * 0.025f); me->SetCreateHealth(health); - - for (uint8 stat = 0; stat < MAX_STATS; ++stat) - { - me->SetStat(Stats(stat), 0); - me->SetCreateStat(Stats(stat), 0); - } - me->SetModifierValue(UNIT_MOD_HEALTH, BASE_VALUE, (float)health); me->SetMaxHealth(health); + //Add delta to make them not all hit the same time uint32 delta = urand(0, 700); - me->SetAttackTime(BASE_ATTACK, Info->BaseAttackTime + delta); - me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(stats->AttackPower)); - me->CastSpell(me, SPELL_HUNTER_DEADLY_POISON_PASSIVE, true); + me->SetAttackTime(BASE_ATTACK, me->GetAttackTime(BASE_ATTACK) + delta); + + if (me->GetEntry() == NPC_VENOMOUS_SNAKE) + DoCastSelf(SPELL_HUNTER_DEADLY_POISON_PASSIVE, true); // Glyph of Snake Trap if (Unit* owner = me->GetOwner())