diff --git a/data/sql/updates/db_world/2025_05_23_00.sql b/data/sql/updates/db_world/2025_05_23_00.sql new file mode 100644 index 000000000..50d86dfa8 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_00.sql @@ -0,0 +1,218 @@ +-- DB update 2025_05_22_00 -> 2025_05_23_00 +-- Add Timed Actionlists for both Citizen of Havenshire entries. +DELETE FROM `smart_scripts` WHERE (`source_type` = 9) AND (`entryorguid` IN (2857600, 2857601, 2857700, 2857701)); +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`, `event_param6`, `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 +(2857600, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Play Emote 5'), +(2857600, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 4, 14561, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Play Sound 14561'), +(2857600, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Say Line 1'), +(2857600, 9, 3, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 17, 431, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Set Emote State 431'), +(2857601, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Set Reactstate Aggressive'), +(2857601, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52262, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Cast \'Cornered and Enraged!\''), +(2857601, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Say Line 0'), +(2857700, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Play Emote 5'), +(2857700, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 4, 14564, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Play Sound 14564'), +(2857700, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Say Line 1'), +(2857700, 9, 3, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 0, 0, 17, 431, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Set Emote State 431'), +(2857701, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Set Reactstate Aggressive'), +(2857701, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 52262, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Cast \'Cornered and Enraged!\''), +(2857701, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Actionlist - Say Line 0'); + +-- Set SmartAI for both Citizen of Havenshire entries. +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE (`entry` IN (28576, 28577)); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (28576, 28577)); +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`, `event_param6`, `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 +(28576, 0, 0, 1, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Reset - Set Reactstate Passive'), +(28576, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Reset - Set Active On'), +(28576, 0, 2, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 87, 2857600, 2857601, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Run Random Script'), +(28576, 0, 3, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Just Died - Say Line 2'), +(28576, 0, 4, 0, 4, 0, 50, 0, 0, 0, 0, 0, 0, 0, 86, 58207, 0, 10, 128581, 28765, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Cross Cast \'Lich King VO Blocker\''), +(28576, 0, 5, 0, 1, 0, 30, 0, 5000, 20000, 5000, 20000, 0, 0, 11, 52149, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Out of Combat - Cast \'Rain of Darkness\''), +(28576, 0, 6, 0, 8, 0, 100, 0, 52149, 0, 0, 0, 0, 0, 142, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Spellhit \'Rain of Darkness\' - Set HP to 10%'), +(28577, 0, 0, 1, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Reset - Set Reactstate Passive'), +(28577, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Reset - Set Active On'), +(28577, 0, 2, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 87, 2857700, 2857701, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Run Random Script'), +(28577, 0, 3, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Just Died - Say Line 2'), +(28577, 0, 4, 0, 4, 0, 50, 0, 0, 0, 0, 0, 0, 0, 86, 58207, 0, 10, 128581, 28765, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Cross Cast \'Lich King VO Blocker\''), +(28577, 0, 5, 0, 1, 0, 30, 0, 5000, 20000, 5000, 20000, 0, 0, 11, 52149, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - Out of Combat - Cast \'Rain of Darkness\''), +(28577, 0, 6, 0, 8, 0, 100, 0, 52149, 0, 0, 0, 0, 0, 142, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Spellhit \'Rain of Darkness\' - Set HP to 10%'); + +-- Update Guids for every Citizen +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-128919, -128967, -128918, -128965, -128917, -128964, -128915, -128963, -128962, -128914, -128913, -128961, -128960, -128912, -128911, -128959, -128922, -128979, -128927, -128986, -128928, -128970, -128930, -128966, -128973, -128924, -128976, -128954, -128978, -128929, -128980, -128934, -128981, -128926, -128968, -128920, -128993, -128916, -128991, -128935, -128992, -128948, -128958, -128910)); +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`, `event_param6`, `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 +(-128919, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896700, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896700'), +(-128919, 0, 8, 0, 109, 0, 100, 0, 0, 12896700, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896700 Finished - Despawn In 2000 ms'), +(-128919, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128919, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128967, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896700, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896700'), +(-128967, 0, 8, 0, 109, 0, 100, 0, 0, 12896700, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896700 Finished - Despawn In 2000 ms'), +(-128967, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128967, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128918, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896500'), +(-128918, 0, 8, 0, 109, 0, 100, 0, 0, 12896500, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896500 Finished - Despawn In 2000 ms'), +(-128918, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128918, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128965, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896500'), +(-128965, 0, 8, 0, 109, 0, 100, 0, 0, 12896500, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896500 Finished - Despawn In 2000 ms'), +(-128965, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128965, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128917, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896400'), +(-128917, 0, 8, 0, 109, 0, 100, 0, 0, 12896400, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896400 Finished - Despawn In 2000 ms'), +(-128917, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128917, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128964, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896400'), +(-128964, 0, 8, 0, 109, 0, 100, 0, 0, 12896400, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896400 Finished - Despawn In 2000 ms'), +(-128964, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128964, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128915, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896300'), +(-128915, 0, 8, 0, 109, 0, 100, 0, 0, 12896300, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896300 Finished - Despawn In 2000 ms'), +(-128915, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128915, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128963, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896300'), +(-128963, 0, 8, 0, 109, 0, 100, 0, 0, 12896300, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896300 Finished - Despawn In 2000 ms'), +(-128963, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128963, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128962, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896200'), +(-128962, 0, 8, 0, 109, 0, 100, 0, 0, 12896200, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896200 Finished - Despawn In 2000 ms'), +(-128962, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128962, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128914, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896200'), +(-128914, 0, 8, 0, 109, 0, 100, 0, 0, 12896200, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896200 Finished - Despawn In 2000 ms'), +(-128914, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128914, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128913, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896100'), +(-128913, 0, 8, 0, 109, 0, 100, 0, 0, 12896100, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896100 Finished - Despawn In 2000 ms'), +(-128913, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128913, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128961, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896100'), +(-128961, 0, 8, 0, 109, 0, 100, 0, 0, 12896100, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896100 Finished - Despawn In 2000 ms'), +(-128961, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128961, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128960, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896000'), +(-128960, 0, 8, 0, 109, 0, 100, 0, 0, 12896000, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896000 Finished - Despawn In 2000 ms'), +(-128960, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128960, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128912, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896000'), +(-128912, 0, 8, 0, 109, 0, 100, 0, 0, 12896000, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896000 Finished - Despawn In 2000 ms'), +(-128912, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128912, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128911, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12895900, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12895900'), +(-128911, 0, 8, 0, 109, 0, 100, 0, 0, 12895900, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12895900 Finished - Despawn In 2000 ms'), +(-128911, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128911, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128959, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12895900, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12895900'), +(-128959, 0, 8, 0, 109, 0, 100, 0, 0, 12895900, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12895900 Finished - Despawn In 2000 ms'), +(-128959, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128959, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128922, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12892200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12892200'), +(-128922, 0, 8, 0, 109, 0, 100, 0, 0, 12892200, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12892200 Finished - Despawn In 2000 ms'), +(-128922, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128922, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128979, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12892200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12892200'), +(-128979, 0, 8, 0, 109, 0, 100, 0, 0, 12892200, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12892200 Finished - Despawn In 2000 ms'), +(-128979, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128979, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128927, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12892700, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12892700'), +(-128927, 0, 8, 0, 109, 0, 100, 0, 0, 12892700, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12892700 Finished - Despawn In 2000 ms'), +(-128927, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128927, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128986, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12892700, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12892700'), +(-128986, 0, 8, 0, 109, 0, 100, 0, 0, 12892700, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12892700 Finished - Despawn In 2000 ms'), +(-128986, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128986, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128928, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12892800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12892800'), +(-128928, 0, 8, 0, 109, 0, 100, 0, 0, 12892800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12892800 Finished - Despawn In 2000 ms'), +(-128928, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128928, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128970, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12892800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12892800'), +(-128970, 0, 8, 0, 109, 0, 100, 0, 0, 12892800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12892800 Finished - Despawn In 2000 ms'), +(-128970, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128970, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128930, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12893000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12893000'), +(-128930, 0, 8, 0, 109, 0, 100, 0, 0, 12893000, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12893000 Finished - Despawn In 2000 ms'), +(-128930, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128930, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128966, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12893000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12893000'), +(-128966, 0, 8, 0, 109, 0, 100, 0, 0, 12893000, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12893000 Finished - Despawn In 2000 ms'), +(-128966, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128966, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128973, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12897300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12897300'), +(-128973, 0, 8, 0, 109, 0, 100, 0, 0, 12897300, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12897300 Finished - Despawn In 2000 ms'), +(-128973, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128973, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128924, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12897300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12897300'), +(-128924, 0, 8, 0, 109, 0, 100, 0, 0, 12897300, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12897300 Finished - Despawn In 2000 ms'), +(-128924, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128924, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128976, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12897600, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12897600'), +(-128976, 0, 8, 0, 109, 0, 100, 0, 0, 12897600, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12897600 Finished - Despawn In 2000 ms'), +(-128976, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128976, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128954, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12897600, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12897600'), +(-128954, 0, 8, 0, 109, 0, 100, 0, 0, 12897600, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12897600 Finished - Despawn In 2000 ms'), +(-128954, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128954, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128978, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12897800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12897800'), +(-128978, 0, 8, 0, 109, 0, 100, 0, 0, 12897800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12897800 Finished - Despawn In 2000 ms'), +(-128978, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128978, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128929, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12897800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12897800'), +(-128929, 0, 8, 0, 109, 0, 100, 0, 0, 12897800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12897800 Finished - Despawn In 2000 ms'), +(-128929, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128929, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128980, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12898000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12898000'), +(-128980, 0, 8, 0, 109, 0, 100, 0, 0, 12898000, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12898000 Finished - Despawn In 2000 ms'), +(-128980, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128980, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128934, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12898000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12898000'), +(-128934, 0, 8, 0, 109, 0, 100, 0, 0, 12898000, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12898000 Finished - Despawn In 2000 ms'), +(-128934, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128934, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128981, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12898100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12898100'), +(-128981, 0, 8, 0, 109, 0, 100, 0, 0, 12898100, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12898100 Finished - Despawn In 2000 ms'), +(-128981, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128981, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128926, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12898100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12898100'), +(-128926, 0, 8, 0, 109, 0, 100, 0, 0, 12898100, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12898100 Finished - Despawn In 2000 ms'), +(-128926, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128926, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128968, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896800'), +(-128968, 0, 8, 0, 109, 0, 100, 0, 0, 12896800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896800 Finished - Despawn In 2000 ms'), +(-128968, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128968, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128920, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12896800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12896800'), +(-128920, 0, 8, 0, 109, 0, 100, 0, 0, 12896800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12896800 Finished - Despawn In 2000 ms'), +(-128920, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128920, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128993, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12899300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12899300'), +(-128993, 0, 8, 0, 109, 0, 100, 0, 0, 12899300, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12899300 Finished - Despawn In 2000 ms'), +(-128993, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128993, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128916, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12899300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12899300'), +(-128916, 0, 8, 0, 109, 0, 100, 0, 0, 12899300, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12899300 Finished - Despawn In 2000 ms'), +(-128916, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128916, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128991, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12899100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12899100'), +(-128991, 0, 8, 0, 109, 0, 100, 0, 0, 12899100, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12899100 Finished - Despawn In 2000 ms'), +(-128991, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128991, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128935, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12899100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12899100'), +(-128935, 0, 8, 0, 109, 0, 100, 0, 0, 12899100, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12899100 Finished - Despawn In 2000 ms'), +(-128935, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128935, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128992, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12899200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12899200'), +(-128992, 0, 8, 0, 109, 0, 100, 0, 0, 12899200, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12899200 Finished - Despawn In 2000 ms'), +(-128992, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128992, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128948, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12899200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12899200'), +(-128948, 0, 8, 0, 109, 0, 100, 0, 0, 12899200, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12899200 Finished - Despawn In 2000 ms'), +(-128948, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128948, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128958, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12895800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12895800'), +(-128958, 0, 8, 0, 109, 0, 100, 0, 0, 12895800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12895800 Finished - Despawn In 2000 ms'), +(-128958, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128958, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'), +(-128910, 0, 7, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 232, 12895800, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Respawn - Start Path 12895800'), +(-128910, 0, 8, 0, 109, 0, 100, 0, 0, 12895800, 0, 0, 0, 0, 41, 2000, 120, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Path 12895800 Finished - Despawn In 2000 ms'), +(-128910, 0, 9, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Aggro - Pause Movement'), +(-128910, 0, 10, 0, 7, 0, 100, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Citizen of Havenshire - On Evade - Resume Movement'); diff --git a/data/sql/updates/db_world/2025_05_23_01.sql b/data/sql/updates/db_world/2025_05_23_01.sql new file mode 100644 index 000000000..00cbea473 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_01.sql @@ -0,0 +1,181 @@ +-- DB update 2025_05_23_00 -> 2025_05_23_01 + +-- Mine Car +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28821; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 28821) AND (`source_type` = 0) AND (`id` IN (1)); +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`, `event_param6`, `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 +(28821, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Mine Car - On Reset - Set Active On'); + +-- Scarlet Miners +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |134217728 WHERE (`entry` = 28822); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28822; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 28822) AND (`source_type` = 0) AND (`id` IN (6)); +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`, `event_param6`, `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 +(28822, 0, 6, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Miner - On Reset - Set Active On'); + +-- Havenshire Stallions(some guids only) +DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (-129208, -129214)) AND (`source_type` = 0) AND (`id` IN (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`, `event_param6`, `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 +(-129208, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Stallion - On Reset - Set Active On'), +(-129214, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Stallion - On Reset - Set Active On'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = -129215) AND (`source_type` = 0) AND (`id` IN (12)); +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`, `event_param6`, `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 +(-129215, 0, 12, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Stallion - On Reset - Set Active On'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = -129210) AND (`source_type` = 0) AND (`id` IN (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`, `event_param6`, `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 +(-129210, 0, 5, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Stallion - On Reset - Set Active On'); + +-- Havenshire Mares (some guids only) +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |134217728 WHERE (`entry` = 28606); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-129230, -129234, -129235, -129236)); +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`, `event_param6`, `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 +(-129230, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Mare - On Reset - Set Active On'), +(-129234, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Mare - On Reset - Set Active On'), +(-129235, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Mare - On Reset - Set Active On'), +(-129236, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Mare - On Reset - Set Active On'); + +-- Havenshire Colts (some guids only) +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |134217728 WHERE (`entry` = 28607); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-129243, -129245, -129246, -129248, -129249, -129251)); +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`, `event_param6`, `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 +(-129243, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Colt - On Reset - Set Active On'), +(-129245, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Colt - On Reset - Set Active On'), +(-129246, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Colt - On Reset - Set Active On'), +(-129248, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Colt - On Reset - Set Active On'), +(-129249, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Colt - On Reset - Set Active On'), +(-129251, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Havenshire Colt - On Reset - Set Active On'); + +-- Scarlet Commanders +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28530; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28530); +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`, `event_param6`, `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 +(28530, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Commander - On Reset - Set Active On'); + +-- Scarlet Crusaders (some guids only). +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |134217728 WHERE (`entry` = 28529); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-128705, -128706, -128707, -128708, -128709, -128710, -128711, -128712, -128713)); +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`, `event_param6`, `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 +(-128705, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128706, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128707, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128708, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128709, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128710, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128711, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128712, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'), +(-128713, 0, 3, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Scarlet Crusader - On Reset - Set Active On'); + +-- Tirisfal Crusaders +DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (-130716, -130717, -130718, -130719, -130720, -130734, -130739, -130741, -130743, -130745, -130746, -130749, -130750, -130751, -130752, -130753, -130754, -130755, -130766, -130779, -130782, -130788, -130789, -130790, -130791, -130792, -130794, -130796, -130798, -130799, -130800, -130801, -130802, -130803, -130804, -130805, -130806, -130827, -130829, -130830)) AND (`source_type` = 0) AND (`id` IN (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`, `event_param6`, `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 +(-130716, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130717, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130718, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130719, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130720, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130734, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130739, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130741, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130743, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130745, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130746, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130749, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130750, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130751, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130752, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130753, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130754, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130755, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130766, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130779, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130782, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130788, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130789, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130790, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130791, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130792, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130794, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130796, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130798, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130799, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130800, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130801, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130802, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130803, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130804, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130805, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130806, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130827, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130829, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'), +(-130830, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Active On'); + +-- Hearthglen Crusaders +DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (-130558, -130559, -130565, -130566, -130567, -130569, -130570, -130577, -130587, -130599, -130603, -130608, -130609, -130613, -130615, -130616, -130617, -130618, -130619, -130620, -130637, -130641, -130642, -130653, -130654, -130655, -130656, -130657, -130659, -130661, -130662, -130663, -130664, -130665, -130666, -130667, -130682)) AND (`source_type` = 0) AND (`id` IN (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`, `event_param6`, `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 +(-130558, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130559, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130565, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130566, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130567, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130569, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130570, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130577, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130587, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130599, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130603, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130608, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130609, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130613, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130615, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130616, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130617, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130618, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130619, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130620, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130637, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130641, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130642, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130653, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130654, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130655, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130656, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130657, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130659, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130661, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130662, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130663, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130664, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130665, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130666, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130667, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'), +(-130682, 0, 8, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Active On'); + +-- Volatile Ghouls +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 29136; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29136) AND (`source_type` = 0) AND (`id` IN (1)); +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`, `event_param6`, `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 +(29136, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Volatile Ghoul - On Reset - Set Active On'); + +-- Rampaging Abomination +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 29115; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29115) 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`, `event_param6`, `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 +(29115, 0, 2, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Rampaging Abomination - On Reset - Set Active On'); + +-- Death Knight Champions +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 29106; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29106) AND (`source_type` = 0) AND (`id` IN (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`, `event_param6`, `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 +(29106, 0, 4, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Death Knight Champion - On Reset - Set Active On'); diff --git a/data/sql/updates/db_world/2025_05_23_02.sql b/data/sql/updates/db_world/2025_05_23_02.sql new file mode 100644 index 000000000..a1d3df157 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_02.sql @@ -0,0 +1,7 @@ +-- DB update 2025_05_23_01 -> 2025_05_23_02 +-- + +-- Reduce Aku'Mai Servant damage. Auto attack = 36-45 w 1.5k armor +UPDATE `creature_template` SET `DamageModifier` = 1.7 WHERE `entry` = 4978 AND `type` = 4; +-- Reduce Deviate Moccasin damage. Auto attack = 39-44 w 1.1k armor +UPDATE `creature_template` SET `DamageModifier` = 1.8 WHERE `entry` = 5762 AND `family` = 35; diff --git a/data/sql/updates/db_world/2025_05_23_03.sql b/data/sql/updates/db_world/2025_05_23_03.sql new file mode 100644 index 000000000..235eb603e --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_03.sql @@ -0,0 +1,18 @@ +-- DB update 2025_05_23_02 -> 2025_05_23_03 +-- Crashing Wave +DELETE FROM `spell_script_names` WHERE `spell_id`=57652 AND `ScriptName`='spell_crashing_wave'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (57652, 'spell_crashing_wave'); + +-- Water Terror +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 30645; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 30645); +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`, `event_param6`, `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 +(30645, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 108, 3, 100, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Water Terror - On Just Summoned - Set Energy To 100'); + +DELETE FROM `creature_template_spell` WHERE (`CreatureID` = 30645); +INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES +(30645, 3, 57668, 0), +(30645, 1, 57652, 0), +(30645, 0, 57665, 0), +(30645, 2, 57643, 0); diff --git a/data/sql/updates/db_world/2025_05_23_04.sql b/data/sql/updates/db_world/2025_05_23_04.sql new file mode 100644 index 000000000..11fd4801c --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_04.sql @@ -0,0 +1,3 @@ +-- DB update 2025_05_23_03 -> 2025_05_23_04 +-- +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=24707; diff --git a/data/sql/updates/db_world/2025_05_23_05.sql b/data/sql/updates/db_world/2025_05_23_05.sql new file mode 100644 index 000000000..b76c6d7e0 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_05.sql @@ -0,0 +1,3 @@ +-- DB update 2025_05_23_04 -> 2025_05_23_05 +-- Captured Totem - NON_ATTACKABLE +UPDATE `creature_template` SET `unit_flags` = `unit_flags`|2 WHERE (`entry` = 23811); diff --git a/data/sql/updates/db_world/2025_05_23_06.sql b/data/sql/updates/db_world/2025_05_23_06.sql new file mode 100644 index 000000000..45f25d69c --- /dev/null +++ b/data/sql/updates/db_world/2025_05_23_06.sql @@ -0,0 +1,13 @@ +-- DB update 2025_05_23_05 -> 2025_05_23_06 +-- Warp Storm (21322) +DELETE FROM `creature_template_addon` WHERE (`entry` = 21322); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(21322, 0, 0, 0, 0, 0, 0, '36581'); +UPDATE `creature_template` SET `AIName` = '', `unit_flags` = `unit_flags`&~(128|256) WHERE `entry` = 21322; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (20516,21322) AND `source_type` = 0; +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 18865 AND `id` = 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`, `event_param6`, `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 +(18865, 0, 4, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 204, 21322, 0, 0, 0, 0, 0, 0, 0, 'Warp Aberration - On Just Died - Despawn \'Warp Storm\' In 1000 ms'), +(20516, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 11, 36577, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Warp Monstrosity - On Aggro - Cast \'Warp Storm\''), +(20516, 0, 1, 0, 0, 0, 100, 0, 1700, 2300, 6800, 8100, 0, 0, 11, 13901, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Warp Monstrosity - In Combat - Cast \'Arcane Bolt\''), +(20516, 0, 2, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 0, 41, 1000, 0, 0, 0, 0, 0, 204, 21322, 0, 0, 0, 0, 0, 0, 0, 'Warp Monstrosity - On Just Died - Despawn \'Warp Storm\' In 1000 ms'); diff --git a/data/sql/updates/db_world/2025_05_24_00.sql b/data/sql/updates/db_world/2025_05_24_00.sql new file mode 100644 index 000000000..2198074cc --- /dev/null +++ b/data/sql/updates/db_world/2025_05_24_00.sql @@ -0,0 +1,4 @@ +-- DB update 2025_05_23_06 -> 2025_05_24_00 +-- +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=45848 AND `spell_effect`=47314; +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (45848, 47314, 0, 'Shield of the Blue 95% output damage reduction'); diff --git a/data/sql/updates/db_world/2025_05_24_01.sql b/data/sql/updates/db_world/2025_05_24_01.sql new file mode 100644 index 000000000..84290b60d --- /dev/null +++ b/data/sql/updates/db_world/2025_05_24_01.sql @@ -0,0 +1,15 @@ +-- DB update 2025_05_24_00 -> 2025_05_24_01 +-- +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (29102,29103)); +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`, `event_param6`, `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 +(29102, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Reset - Set Event Phase 1'), +(29102, 0, 1, 0, 24, 1, 100, 0, 52196, 1, 1000, 2000, 0, 0, 11, 53348, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Target Buffed With \'Frostbrood Vanquisher\' - Cast \'Arrow Assault\' (Phase 1)'), +(29102, 0, 2, 0, 9, 1, 100, 0, 2000, 4000, 4000, 6000, 40, 150, 11, 53345, 64, 0, 1, 0, 0, 9, 0, 40, 150, 0, 0, 0, 0, 0, 'Hearthglen Crusader - Within 40-150 Range - Cast \'Arrow Assault\' (Phase 1)'), +(29102, 0, 3, 0, 8, 0, 100, 0, 53110, 1, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Hearthglen Crusader - On Spellhit \'Devour Humanoid\' - Set Event Phase 2'), +(29103, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Reset - Set Event Phase 1'), +(29103, 0, 1, 0, 24, 1, 100, 0, 52196, 1, 1000, 2000, 0, 0, 11, 53348, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Target Buffed With \'Frostbrood Vanquisher\' - Cast \'Arrow Assault\' (Phase 1)'), +(29103, 0, 2, 0, 9, 1, 100, 0, 2000, 4000, 4000, 6000, 40, 150, 11, 53345, 64, 0, 1, 0, 0, 9, 0, 40, 150, 0, 0, 0, 0, 0, 'Tirisfal Crusader - Within 40-150 Range - Cast \'Arrow Assault\' (Phase 1)'), +(29103, 0, 3, 0, 8, 0, 100, 0, 53110, 0, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Tirisfal Crusader - On Spellhit \'Devour Humanoid\' - Set Event Phase 2'); + +DELETE FROM `spell_script_names` WHERE `spell_id`=53111 AND `ScriptName`='spell_q12779_an_end_to_all_things_devour_aura'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (53111, 'spell_q12779_an_end_to_all_things_devour_aura'); diff --git a/data/sql/updates/db_world/2025_05_24_02.sql b/data/sql/updates/db_world/2025_05_24_02.sql new file mode 100644 index 000000000..ad6d83e89 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_24_02.sql @@ -0,0 +1,14 @@ +-- DB update 2025_05_24_01 -> 2025_05_24_02 +-- +DELETE FROM `spell_proc_event` WHERE `entry` IN (45396,45398); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `procPhase`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +(45396, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 45000), +(45398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45000); + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (45396,45398) AND `ScriptName`='spell_gen_weapon_coating_enchant'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45396, 'spell_gen_weapon_coating_enchant'), +(45398, 'spell_gen_weapon_coating_enchant'); + +UPDATE `spell_dbc` SET `ProcTypeMask` = 81920,`ProcChance` = 100,`Effect_1` = 6,`EffectBasePoints_1` = 99,`EffectDieSides_1` = 1,`EffectTriggerSpell_1` = 45403,`EffectAura_1` = 42,`ImplicitTargetA_1` = 1 WHERE `ID` = 45396; +UPDATE `spell_dbc` SET `ProcTypeMask` = 68,`ProcChance` = 100,`Effect_1` = 6,`EffectBasePoints_1` = 99,`EffectDieSides_1` = 1,`EffectTriggerSpell_1` = 45401,`EffectAura_1` = 42,`ImplicitTargetA_1` = 1 WHERE `ID` = 45398; diff --git a/data/sql/updates/db_world/2025_05_26_00.sql b/data/sql/updates/db_world/2025_05_26_00.sql new file mode 100644 index 000000000..4a24adb03 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_26_00.sql @@ -0,0 +1,11 @@ +-- DB update 2025_05_24_02 -> 2025_05_26_00 +-- Eye of Acherus +DELETE FROM `creature_template_spell` WHERE (`CreatureID` = 28511); +INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES +(28511, 0, 51859, 0), +(28511, 1, 51904, 0), +(28511, 2, 52006, 0), +(28511, 4, 52694, 0); + +DELETE FROM `spell_script_names` WHERE `spell_id`=52694 AND `ScriptName`='spell_q12641_death_comes_from_on_high_recall_eye'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (52694, 'spell_q12641_death_comes_from_on_high_recall_eye'); diff --git a/data/sql/updates/db_world/2025_05_27_00.sql b/data/sql/updates/db_world/2025_05_27_00.sql new file mode 100644 index 000000000..a7ba264dc --- /dev/null +++ b/data/sql/updates/db_world/2025_05_27_00.sql @@ -0,0 +1,12 @@ +-- DB update 2025_05_26_00 -> 2025_05_27_00 +-- 30695 (Portal Keeper) +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (58529,58532); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES +(58529, 58529, 61592, 0, 0), +(58532, 58532, 61594, 0, 0); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 30695); +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`, `event_param6`, `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 +(30695, 0, 0, 0, 0, 0, 100, 0, 3000, 6000, 6000, 8000, 0, 0, 11, 58529, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Portal Keeper - In Combat - Cast \'Arcane Missiles\''), +(30695, 0, 1, 0, 0, 0, 100, 0, 13000, 19000, 13000, 19000, 0, 0, 11, 58532, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Portal Keeper - In Combat - Cast \'Frostbolt Volley\''), +(30695, 0, 2, 0, 0, 0, 100, 0, 6000, 9000, 9000, 14000, 0, 0, 11, 58534, 64, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 'Portal Keeper - In Combat - Cast \'Deep Freeze\''); diff --git a/data/sql/updates/db_world/2025_05_27_01.sql b/data/sql/updates/db_world/2025_05_27_01.sql new file mode 100644 index 000000000..4cc6a218f --- /dev/null +++ b/data/sql/updates/db_world/2025_05_27_01.sql @@ -0,0 +1,174 @@ +-- DB update 2025_05_27_00 -> 2025_05_27_01 +DROP TABLE IF EXISTS `player_shapeshift_model`; +DROP TABLE IF EXISTS `player_totem_model`; + +CREATE TABLE IF NOT EXISTS `player_shapeshift_model` ( + `ShapeshiftID` TINYINT unsigned NOT NULL, + `RaceID` TINYINT unsigned NOT NULL, + `CustomizationID` TINYINT unsigned NOT NULL, + `GenderID` TINYINT unsigned NOT NULL, + `ModelID` INT unsigned NOT NULL, + PRIMARY KEY (`ShapeshiftID`, `RaceID`, `CustomizationID`, `GenderID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PACK_KEYS=0; + +CREATE TABLE IF NOT EXISTS `player_totem_model` ( + `TotemID` TINYINT unsigned NOT NULL, + `RaceID` TINYINT unsigned NOT NULL, + `ModelID` INT unsigned NOT NULL, + PRIMARY KEY (`TotemID`, `RaceID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PACK_KEYS=0; + +DELETE FROM `player_shapeshift_model`; +INSERT INTO `player_shapeshift_model` (`ShapeshiftID`, `RaceID`, `CustomizationID`, `GenderID`, `ModelID`) VALUES +-- Cat Form +-- Night Elf +(1, 4, 0, 2, 29407), -- Green +(1, 4, 1, 2, 29407), -- Light Green +(1, 4, 2, 2, 29407), -- Dark Green +(1, 4, 3, 2, 29406), -- Light Blue +(1, 4, 4, 2, 29408), -- White +(1, 4, 7, 2, 29405), -- Violet +(1, 4, 8, 2, 29405), -- Violet +(1, 4, 255, 2, 892), -- Dark Blue +-- Tauren +-- Male +(1, 6, 12, 0, 29409), -- White +(1, 6, 13, 0, 29409), -- White +(1, 6, 14, 0, 29409), -- White +(1, 6, 18, 0, 29409), -- Completely White +(1, 6, 9, 0, 29410), -- Light Brown +(1, 6, 10, 0, 29410), -- Light Brown +(1, 6, 11, 0, 29410), -- Light Brown +(1, 6, 6, 0, 29411), -- Brown +(1, 6, 7, 0, 29411), -- Brown +(1, 6, 8, 0, 29411), -- Brown +(1, 6, 0, 0, 29412), -- Dark +(1, 6, 1, 0, 29412), -- Dark +(1, 6, 2, 0, 29412), -- Dark +(1, 6, 3, 0, 29412), -- Dark Grey +(1, 6, 4, 0, 29412), -- Dark Grey +(1, 6, 5, 0, 29412), -- Dark Grey +(1, 6, 255, 0, 8571), -- Grey +-- Female +(1, 6, 10, 1, 29409), -- White +(1, 6, 6, 1, 29410), -- Light Brown +(1, 6, 7, 1, 29410), -- Light Brown +(1, 6, 4, 1, 29411), -- Brown +(1, 6, 5, 1, 29411), -- Brown +(1, 6, 0, 1, 29412), -- Dark +(1, 6, 1, 1, 29412), -- Dark +(1, 6, 2, 1, 29412), -- Dark +(1, 6, 3, 1, 29412), -- Dark +(1, 6, 255, 1, 8571), -- Grey +-- Bear Form +-- Night Elf +(5, 4, 0, 2, 29413), -- Green (29415?) +(5, 4, 1, 2, 29413), -- Light Green (29415?) +(5, 4, 2, 2, 29413), -- Dark Green (29415?) +(5, 4, 6, 2, 29414), -- Dark Blue +(5, 4, 4, 2, 29416), -- White +(5, 4, 3, 2, 29417), -- Light Blue +(5, 4, 255, 2, 2281), -- Violet +-- Dire Bear Form +(8, 4, 0, 2, 29413), -- Green (29415?) +(8, 4, 1, 2, 29413), -- Light Green (29415?) +(8, 4, 2, 2, 29413), -- Dark Green (29415?) +(8, 4, 6, 2, 29414), -- Dark Blue +(8, 4, 4, 2, 29416), -- White +(8, 4, 3, 2, 29417), -- Light Blue +(8, 4, 255, 2, 2281), -- Violet +-- Bear Form +-- Tauren +-- Male +(5, 6, 0, 0, 29418), -- Dark (Black) +(5, 6, 1, 0, 29418), -- Dark (Black) +(5, 6, 2, 0, 29418), -- Dark (Black) +(5, 6, 3, 0, 29419), -- White +(5, 6, 4, 0, 29419), -- White +(5, 6, 5, 0, 29419), -- White +(5, 6, 12, 0, 29419), -- White +(5, 6, 13, 0, 29419), -- White +(5, 6, 14, 0, 29419), -- White +(5, 6, 9, 0, 29420), -- Light Brown/Grey +(5, 6, 10, 0, 29420), -- Light Brown/Grey +(5, 6, 11, 0, 29420), -- Light Brown/Grey +(5, 6, 15, 0, 29420), -- Light Brown/Grey +(5, 6, 16, 0, 29420), -- Light Brown/Grey +(5, 6, 17, 0, 29420), -- Light Brown/Grey +(5, 6, 18, 0, 29421), -- Completely White +(5, 6, 255, 0, 2289), -- Brown +-- Dire Bear Form +(8, 6, 0, 0, 29418), -- Dark (Black) +(8, 6, 1, 0, 29418), -- Dark (Black) +(8, 6, 2, 0, 29418), -- Dark (Black) +(8, 6, 3, 0, 29419), -- White +(8, 6, 4, 0, 29419), -- White +(8, 6, 5, 0, 29419), -- White +(8, 6, 12, 0, 29419), -- White +(8, 6, 13, 0, 29419), -- White +(8, 6, 14, 0, 29419), -- White +(8, 6, 9, 0, 29420), -- Light Brown/Grey +(8, 6, 10, 0, 29420), -- Light Brown/Grey +(8, 6, 11, 0, 29420), -- Light Brown/Grey +(8, 6, 15, 0, 29420), -- Light Brown/Grey +(8, 6, 16, 0, 29420), -- Light Brown/Grey +(8, 6, 17, 0, 29420), -- Light Brown/Grey +(8, 6, 18, 0, 29421), -- Completely White +(8, 6, 255, 0, 2289), -- Brown +-- Bear Form +-- Female +(5, 6, 0, 1, 29418), -- Dark (Black) +(5, 6, 1, 1, 29418), -- Dark (Black) +(5, 6, 2, 1, 29419), -- White +(5, 6, 3, 1, 29419), -- White +(5, 6, 6, 1, 29420), -- Light Brown/Grey +(5, 6, 7, 1, 29420), -- Light Brown/Grey +(5, 6, 8, 1, 29420), -- Light Brown/Grey +(5, 6, 9, 1, 29420), -- Light Brown/Grey +(5, 6, 10, 1, 29421), -- Completely White +(5, 6, 255, 1, 2289), -- Brown +-- Dire Bear Form +(8, 6, 0, 1, 29418), -- Dark (Black) +(8, 6, 1, 1, 29418), -- Dark (Black) +(8, 6, 2, 1, 29419), -- White +(8, 6, 3, 1, 29419), -- White +(8, 6, 6, 1, 29420), -- Light Brown/Grey +(8, 6, 7, 1, 29420), -- Light Brown/Grey +(8, 6, 8, 1, 29420), -- Light Brown/Grey +(8, 6, 9, 1, 29420), -- Light Brown/Grey +(8, 6, 10, 1, 29421), -- Completely White +(8, 6, 255, 1, 2289), -- Brown + -- Epic Flight Form +(27, 4, 255, 2, 21243), +(27, 6, 255, 2, 21244), +-- Flight Form +(29, 4, 255, 2, 20857), +(29, 6, 255, 2, 20872); + +DELETE FROM `player_totem_model`; +INSERT INTO `player_totem_model` (`TotemID`, `RaceID`, `ModelID`) VALUES +-- Orc +(1, 2, 30758), -- Fire +(2, 2, 30757), -- Earth +(3, 2, 30759), -- Water +(4, 2, 30756), -- Air +-- Dwarf +(1, 3, 30754), +(2, 3, 30753), +(3, 3, 30755), +(4, 3, 30736), +-- Troll +(1, 8, 30762), +(2, 8, 30761), +(3, 8, 30763), +(4, 8, 30760), +-- Tauren +(1, 6, 4589), +(2, 6, 4588), +(3, 6, 4587), +(4, 6, 4590), +-- Draenei +(1, 11, 19074), +(2, 11, 19073), +(3, 11, 19075), +(4, 11, 19071); diff --git a/data/sql/updates/db_world/2025_05_27_02.sql b/data/sql/updates/db_world/2025_05_27_02.sql new file mode 100644 index 000000000..11dfbee2e --- /dev/null +++ b/data/sql/updates/db_world/2025_05_27_02.sql @@ -0,0 +1,3 @@ +-- DB update 2025_05_27_01 -> 2025_05_27_02 +-- From: Syntax: .guild rank [$CharacterName] #Rank Set for player $CharacterName (or selected) rank #Rank in a guild. +UPDATE `command` SET `help` = "Syntax: .guild rank [$CharacterName] #RankNumber\r\n\r\nSet for player $CharacterName (or selected) rank #Rank in a guild. Ranks value are numeric, 0 = Guild Master, 1 = Officer, etc..." WHERE `name` LIKE "guild rank"; diff --git a/data/sql/updates/db_world/2025_05_29_00.sql b/data/sql/updates/db_world/2025_05_29_00.sql new file mode 100644 index 000000000..ab645ab40 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_29_00.sql @@ -0,0 +1,11 @@ +-- DB update 2025_05_27_02 -> 2025_05_29_00 +-- Adds SAI to the missing NPCs and SAI Event to execute the Timed Actionlist +UPDATE `creature_template` SET `AIName` = "SmartAI" WHERE `entry` IN (23853, 23852, 23854, 23855, 23845); + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (23853, 23852, 23854, 23855, 23845) 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`, `event_param6`, `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 +(23845, 0, 0, 0, 11, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2384500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '[DNT] L70ETC Bergrisst Controller - On Respawn - Run Script'), +(23855, 0, 0, 0, 11, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2385500, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '[DNT] L70ETC Chief Thunder-Skins Controller - On Respawn - Run Script'), +(23854, 0, 0, 0, 11, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2385400, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '[DNT] L70ETC Sig Controller - On Respawn - Run Script'), +(23852, 0, 0, 0, 11, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2385200, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '[DNT] L70ETC Mai\'Kyl Controller - On Respawn - Run Script'), +(23853, 0, 0, 0, 11, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2385300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '[DNT] L70ETC Samuro Controller - On Respawn - Run Script'); diff --git a/data/sql/updates/db_world/2025_05_29_01.sql b/data/sql/updates/db_world/2025_05_29_01.sql new file mode 100644 index 000000000..bb632deb2 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_29_01.sql @@ -0,0 +1,3 @@ +-- DB update 2025_05_29_00 -> 2025_05_29_01 +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`&~(4), `flags_extra` = `flags_extra`|2147483648 WHERE (`entry` IN (29310,31465)); diff --git a/data/sql/updates/db_world/2025_05_30_00.sql b/data/sql/updates/db_world/2025_05_30_00.sql new file mode 100644 index 000000000..81eb54e97 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_00.sql @@ -0,0 +1,31 @@ +-- DB update 2025_05_29_01 -> 2025_05_30_00 + +-- Death Knight Champions +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29106) AND (`source_type` = 0) AND (`id` IN (4)); + +-- Rampaging Abominations +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29115) AND (`source_type` = 0) AND (`id` IN (2)); + +-- Volatile Ghouls +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 29136) AND (`source_type` = 0) AND (`id` IN (1)); + +-- Scarlet Crusaders +UPDATE `creature_template` SET `flags_extra` = `flags_extra` &~134217728 WHERE (`entry` = 28529); +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-128705, -128706, -128707, -128708, -128709, -128710, -128711, -128712, -128713)); + +-- Havenshire Colts +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-129243, -129245, -129246, -129248, -129249, -129251)); + +-- Havenshire Mares +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-129230, -129234, -129235, -129236)); + +-- Havenshire Stallions +DELETE FROM `smart_scripts` WHERE (`entryorguid` = -129210) AND (`source_type` = 0) AND (`id` IN (5)); +DELETE FROM `smart_scripts` WHERE (`entryorguid` IN (-129208, -129214)) AND (`source_type` = 0) AND (`id` IN (3)); + +-- Set Active on Kitrik +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 28683; + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 28683) AND (`source_type` = 0) AND (`id` IN (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`, `event_param6`, `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 +(28683, 0, 0, 0, 25, 0, 100, 0, 0, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Stable Master Kitrik - On Reset - Set Active On'); diff --git a/data/sql/updates/db_world/2025_05_30_01.sql b/data/sql/updates/db_world/2025_05_30_01.sql new file mode 100644 index 000000000..8af57068b --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_01.sql @@ -0,0 +1,7 @@ +-- DB update 2025_05_30_00 -> 2025_05_30_01 +-- +DELETE FROM `spell_script_names` WHERE `spell_id`=30610 AND `ScriptName`='spell_karazhan_wrath_titans_stacker'; +DELETE FROM `spell_script_names` WHERE `spell_id`=30554 AND `ScriptName`='spell_karazhan_wrath_titans_aura'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(30610, 'spell_karazhan_wrath_titans_stacker'), +(30554, 'spell_karazhan_wrath_titans_aura'); diff --git a/data/sql/updates/db_world/2025_05_30_02.sql b/data/sql/updates/db_world/2025_05_30_02.sql new file mode 100644 index 000000000..b7e6829a0 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_02.sql @@ -0,0 +1,5 @@ +-- DB update 2025_05_30_01 -> 2025_05_30_02 +-- +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 58152) AND (`SourceId` = 0) AND (`ElseGroup` = 18) AND (`ConditionTypeOrReference` = 31); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 58152, 0, 18, 31, 0, 3, 29321, 0, 0, 0, 0, '', 'Defense System - Arcane Lightning - Ichor Globule'); diff --git a/data/sql/updates/db_world/2025_05_30_03.sql b/data/sql/updates/db_world/2025_05_30_03.sql new file mode 100644 index 000000000..b7de403e1 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_03.sql @@ -0,0 +1,5 @@ +-- DB update 2025_05_30_02 -> 2025_05_30_03 +-- +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=-61874 AND `spell_effect`=24870; +DELETE FROM `spell_script_names` WHERE `spell_id`=61874 AND `ScriptName`='spell_item_noblegarden_chocolate'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (61874, 'spell_item_noblegarden_chocolate'); diff --git a/data/sql/updates/db_world/2025_05_30_04.sql b/data/sql/updates/db_world/2025_05_30_04.sql new file mode 100644 index 000000000..450024419 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_04.sql @@ -0,0 +1,3 @@ +-- DB update 2025_05_30_03 -> 2025_05_30_04 +-- +UPDATE `smart_scripts` SET `action_param2` = 64 WHERE `entryorguid` = 30278 AND `source_type` = 0 AND `id` IN (2,3); diff --git a/data/sql/updates/db_world/2025_05_30_05.sql b/data/sql/updates/db_world/2025_05_30_05.sql new file mode 100644 index 000000000..09c4db3d5 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_05.sql @@ -0,0 +1,5 @@ +-- DB update 2025_05_30_04 -> 2025_05_30_05 +-- +DELETE FROM `command` WHERE `name`IN('debug boundary'); +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('debug boundary', 3, 'Syntax: .debug boundary [duration] [fill] [z]\nOptional arguments:\n- duration: Duration in ms (default: 5000, max: 180000).\n- fill: Fills the boundary with markers.\n- z: Includes z-axis in visualization.'); diff --git a/data/sql/updates/db_world/2025_05_30_06.sql b/data/sql/updates/db_world/2025_05_30_06.sql new file mode 100644 index 000000000..716649c3c --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_06.sql @@ -0,0 +1,5 @@ +-- DB update 2025_05_30_05 -> 2025_05_30_06 +-- Azure Ring Captain (28236) +DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 28236); +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(28236, 0, 0, 1, 0, 0, 0, 0); diff --git a/data/sql/updates/db_world/2025_05_30_07.sql b/data/sql/updates/db_world/2025_05_30_07.sql new file mode 100644 index 000000000..db1631ecd --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_07.sql @@ -0,0 +1,5 @@ +-- DB update 2025_05_30_06 -> 2025_05_30_07 +-- +DELETE FROM `command` WHERE `name` = 'group revive'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('group revive', 2, 'Syntax: .group revive\r\n\r\nRevives all players in your group.'); diff --git a/data/sql/updates/db_world/2025_05_30_08.sql b/data/sql/updates/db_world/2025_05_30_08.sql new file mode 100644 index 000000000..086f31d53 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_30_08.sql @@ -0,0 +1,51 @@ +-- DB update 2025_05_30_07 -> 2025_05_30_08 + +-- Edit Spell Timers +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 25708; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 25708); +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`, `event_param6`, `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 +(25708, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Just Summoned - Set Reactstate Passive'), +(25708, 0, 1, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 134, 45785, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Just Summoned - Invoker Cast \'Sinister Reflection Clone\''), +(25708, 0, 2, 3, 60, 0, 100, 1, 3000, 3000, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Update - Set Reactstate Aggressive (No Repeat)'), +(25708, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 50, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Update - Start Attacking (No Repeat)'), +(25708, 0, 4, 0, 6, 0, 100, 512, 0, 0, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Just Died - Despawn In 2000 ms'), +(25708, 0, 5, 0, 38, 0, 100, 512, 1, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 1 - Set Event Phase 1'), +(25708, 0, 6, 0, 38, 0, 100, 512, 1, 2, 0, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 2 - Set Event Phase 2'), +(25708, 0, 7, 0, 38, 0, 100, 512, 1, 3, 0, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 3 - Set Event Phase 3'), +(25708, 0, 8, 0, 38, 0, 100, 512, 1, 4, 0, 0, 0, 0, 22, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 4 - Set Event Phase 4'), +(25708, 0, 9, 0, 38, 0, 100, 512, 1, 5, 0, 0, 0, 0, 22, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 5 - Set Event Phase 5'), +(25708, 0, 10, 0, 38, 0, 100, 512, 1, 6, 0, 0, 0, 0, 22, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 6 - Set Event Phase 6'), +(25708, 0, 11, 0, 38, 0, 100, 512, 1, 7, 0, 0, 0, 0, 22, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 7 - Set Event Phase 7'), +(25708, 0, 12, 0, 38, 0, 100, 512, 1, 8, 0, 0, 0, 0, 22, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 8 - Set Event Phase 8'), +(25708, 0, 13, 0, 38, 0, 100, 512, 1, 9, 0, 0, 0, 0, 22, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 9 - Set Event Phase 9'), +(25708, 0, 14, 0, 38, 0, 100, 512, 1, 11, 0, 0, 0, 0, 22, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - On Data Set 1 11 - Set Event Phase 11'), +(25708, 0, 15, 0, 0, 1, 100, 1, 0, 0, 0, 0, 0, 0, 11, 42459, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Dual Wield\' (Phase 1) (No Repeat)'), +(25708, 0, 16, 0, 0, 1, 100, 0, 4000, 8000, 9000, 13000, 0, 0, 11, 17207, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Whirlwind\' (Phase 1)'), +(25708, 0, 17, 0, 0, 2, 100, 0, 4000, 8000, 5000, 8000, 0, 0, 11, 38921, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Holy Shock\' (Phase 2)'), +(25708, 0, 18, 0, 0, 2, 100, 0, 6000, 13000, 15000, 25000, 0, 0, 11, 37369, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Hammer of Justice\' (Phase 2)'), +(25708, 0, 19, 0, 9, 4, 100, 0, 3000, 3000, 2000, 2000, 5, 30, 11, 16496, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 5-30 Range - Cast \'Shoot\' (Phase 3)'), +(25708, 0, 20, 0, 9, 4, 100, 0, 3000, 3000, 10000, 15000, 5, 30, 11, 48098, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 5-30 Range - Cast \'Multi-Shot\' (Phase 3)'), +(25708, 0, 21, 0, 9, 4, 100, 0, 3000, 3000, 15000, 25000, 0, 5, 11, 40652, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 0-5 Range - Cast \'Wing Clip\' (Phase 3)'), +(25708, 0, 22, 0, 9, 4, 100, 512, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 0-20 Range - Disable Combat Movement (Phase 3)'), +(25708, 0, 23, 0, 9, 4, 100, 512, 0, 0, 0, 0, 25, 100, 21, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 25-100 Range - Enable Combat Movement (Phase 3)'), +(25708, 0, 24, 0, 0, 8, 100, 1, 0, 0, 0, 0, 0, 0, 11, 42459, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Dual Wield\' (Phase 4) (No Repeat)'), +(25708, 0, 25, 0, 0, 8, 100, 0, 4000, 6000, 4000, 6000, 0, 0, 11, 45897, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Hemorrhage\' (Phase 4)'), +(25708, 0, 26, 0, 0, 16, 100, 0, 4000, 7000, 4000, 5000, 0, 0, 11, 47077, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Holy Smite\' (Phase 5)'), +(25708, 0, 27, 0, 14, 16, 100, 0, 10000, 40, 10000, 15000, 0, 0, 11, 47079, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Friendly At 10000 Health - Cast \'Renew\' (Phase 5)'), +(25708, 0, 28, 0, 9, 16, 100, 512, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 0-20 Range - Disable Combat Movement (Phase 5)'), +(25708, 0, 29, 0, 9, 16, 100, 512, 0, 0, 0, 0, 25, 100, 21, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 25-100 Range - Enable Combat Movement (Phase 5)'), +(25708, 0, 30, 0, 0, 32, 100, 1, 0, 0, 0, 0, 0, 0, 11, 42459, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Dual Wield\' (Phase 6) (No Repeat)'), +(25708, 0, 31, 0, 0, 32, 100, 0, 4000, 8000, 4000, 6000, 0, 0, 11, 58843, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Plague Strike\' (Phase 6)'), +(25708, 0, 32, 0, 0, 64, 100, 1, 0, 0, 0, 0, 0, 0, 11, 42459, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Dual Wield\' (Phase 7) (No Repeat)'), +(25708, 0, 33, 0, 0, 64, 100, 0, 4000, 8000, 6000, 10000, 0, 0, 11, 47071, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Earth Shock\' (Phase 7)'), +(25708, 0, 34, 0, 0, 128, 100, 0, 4000, 5000, 2000, 3000, 0, 0, 11, 47074, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Fireball\' (Phase 8)'), +(25708, 0, 35, 0, 9, 128, 100, 512, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 0-20 Range - Disable Combat Movement (Phase 8)'), +(25708, 0, 36, 0, 9, 128, 100, 512, 0, 0, 0, 0, 25, 100, 21, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 25-100 Range - Enable Combat Movement (Phase 8)'), +(25708, 0, 37, 0, 0, 256, 100, 0, 4000, 4500, 1500, 2500, 0, 0, 11, 47076, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Shadow Bolt\' (Phase 9)'), +(25708, 0, 38, 0, 0, 256, 100, 0, 7000, 8000, 10000, 12000, 0, 0, 11, 46190, 0, 0, 0, 0, 0, 5, 30, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Curse of Agony\' (Phase 9)'), +(25708, 0, 39, 0, 9, 256, 100, 512, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 0-20 Range - Disable Combat Movement (Phase 9)'), +(25708, 0, 40, 0, 9, 256, 100, 512, 0, 0, 0, 0, 25, 100, 21, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 25-100 Range - Enable Combat Movement (Phase 9)'), +(25708, 0, 41, 0, 0, 1024, 100, 0, 4000, 5000, 2000, 3000, 0, 0, 11, 47072, 0, 0, 0, 0, 0, 5, 30, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - In Combat - Cast \'Moonfire\' (Phase 11)'), +(25708, 0, 42, 0, 9, 1024, 100, 512, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 0-20 Range - Disable Combat Movement (Phase 11)'), +(25708, 0, 43, 0, 9, 1024, 100, 512, 0, 0, 0, 0, 25, 100, 21, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sinister Reflection - Within 25-100 Range - Enable Combat Movement (Phase 11)'); diff --git a/data/sql/updates/db_world/2025_05_31_00.sql b/data/sql/updates/db_world/2025_05_31_00.sql new file mode 100644 index 000000000..d19e75eca --- /dev/null +++ b/data/sql/updates/db_world/2025_05_31_00.sql @@ -0,0 +1,3 @@ +-- DB update 2025_05_30_08 -> 2025_05_31_00 +-- +UPDATE `gameobject_template` SET `ScriptName` = 'go_eredar_twins_blaze' WHERE (`entry` = 187366); diff --git a/data/sql/updates/db_world/2025_05_31_01.sql b/data/sql/updates/db_world/2025_05_31_01.sql new file mode 100644 index 000000000..4d69c5c36 --- /dev/null +++ b/data/sql/updates/db_world/2025_05_31_01.sql @@ -0,0 +1,35 @@ +-- DB update 2025_05_31_00 -> 2025_05_31_01 + +-- Remove Flight flag +UPDATE `creature_template_movement` SET `Flight` = 0 WHERE (`CreatureId` = 28511); + +-- Add Waypoint +DELETE FROM `waypoint_data` WHERE `id` IN ("2851100"); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +("2851100", 1, 2341.5713, -5672.797, 538.3942, NULL, 0, 0, 0, 100, 0), +("2851100", 2, 1957.3962, -5844.1055, 273.86673, NULL, 0, 0, 0, 100, 0), +("2851100", 3, 1758.007, -5876.7847, 166.86671, NULL, 0, 0, 0, 100, 0); + +-- Set Action List +DELETE FROM `smart_scripts` WHERE (`source_type` = 9 AND `entryorguid` = 2851100); +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`, `event_param6`, `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 +(2851100, 9, 0, 0, 0, 0, 100, 512, 0, 0, 0, 0, 0, 0, 11, 51892, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Cast \'Eye of Acherus Visual\''), +(2851100, 9, 1, 0, 0, 0, 100, 512, 6000, 6000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Say Line 0'), +(2851100, 9, 2, 0, 0, 0, 100, 512, 1000, 1000, 0, 0, 0, 0, 11, 51923, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Cast \'Eye of Acherus Flight (Boost)\''), +(2851100, 9, 3, 0, 0, 0, 100, 512, 1000, 1000, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Set Rooted Off'), +(2851100, 9, 4, 0, 0, 0, 100, 512, 100, 100, 0, 0, 0, 0, 232, 2851100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Start Path 2851100'), +(2851100, 9, 5, 0, 0, 0, 100, 512, 19200, 19200, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Set Rooted On'), +(2851100, 9, 6, 0, 0, 0, 100, 512, 500, 500, 0, 0, 0, 0, 11, 51890, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Cast \'Eye of Acherus Flight\''), +(2851100, 9, 7, 0, 0, 0, 100, 512, 500, 500, 0, 0, 0, 0, 28, 51923, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Remove Aura \'Eye of Acherus Flight (Boost)\''), +(2851100, 9, 8, 0, 0, 0, 100, 0, 500, 500, 0, 0, 0, 0, 28, 51860, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Remove Aura \'Serverside - Root Self\''), +(2851100, 9, 9, 0, 0, 0, 100, 512, 500, 500, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Say Line 1'), +(2851100, 9, 10, 0, 0, 0, 100, 512, 500, 500, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - Actionlist - Set Rooted Off'); + +-- Set General SmartAI and remove script name +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 28511; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28511); +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`, `event_param6`, `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 +(28511, 0, 0, 1, 54, 0, 100, 512, 0, 0, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - On Just Summoned - Set Rooted On'), +(28511, 0, 1, 2, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 11, 51860, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - On Just Summoned - Cast \'Serverside - Root Self\''), +(28511, 0, 2, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2851100, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Eye of Acherus - On Just Summoned - Run Script'); diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 77fc21621..120a21aad 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -964,7 +964,7 @@ Expansion = 2 # ClientCacheVersion # Description: Client cache version for client cache data reset. Use any value different # from DB and not recently been used to trigger client side cache reset. -# Default: 0 - (Use DB value from world DB db_version.cache_id field) +# Default: 0 - (Use DB value from world DB version.cache_id field) ClientCacheVersion = 0 @@ -2826,6 +2826,14 @@ Rate.Creature.Aggro = 1 CreatureFamilyFleeAssistanceRadius = 30 +# +# CreatureLeashRadius +# Description: Distance (in yards) for default leash due to being too far from pulled position. +# Default: 30 - (Enabled) +# 0 - (Disabled) + +CreatureLeashRadius = 30 + # # CreatureFamilyAssistanceRadius # Description: Distance for creatures calling for assistance from other creatures without diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 82d8279b3..d246171e2 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -26,8 +26,10 @@ #include "MapReference.h" #include "Player.h" #include "ScriptMgr.h" +#include "TemporarySummon.h" #include "Vehicle.h" #include "ZoneScript.h" +#include //Disable CreatureAI when charmed void CreatureAI::OnCharmed(bool /*apply*/) @@ -383,6 +385,115 @@ void CreatureAI::MoveBackwardsChecks() me->GetMotionMaster()->MoveBackwards(victim, moveDist); } +int32 CreatureAI::VisualizeBoundary(uint32 duration, Unit* owner, bool fill, bool checkZ) const +{ + static constexpr float BOUNDARY_STEP = 5.0f; + static constexpr uint32 BOUNDARY_VISUALIZE_CREATURE = 21659; // Floaty Flavor Eye + static constexpr float BOUNDARY_VISUALIZE_CREATURE_SCALE = 0.25f; + static constexpr uint32 BOUNDARY_MAX_SPAWNS = 8000; + static constexpr float BOUNDARY_MAX_DISTANCE = MAX_SEARCHER_DISTANCE; + + float boundaryStep = fill && checkZ ? BOUNDARY_STEP * 2 : BOUNDARY_STEP; + + Position const boundaryDirections[6] = { + {boundaryStep, 0, 0 }, + {-boundaryStep, 0, 0 }, + {0, boundaryStep, 0 }, + {0, -boundaryStep, 0 }, + {0, 0, boundaryStep }, + {0, 0, -boundaryStep} + }; + + if (!owner) + return -1; + + if (!_boundary || _boundary->empty()) + return LANG_CREATURE_MOVEMENT_NOT_BOUNDED; + + Position startPosition = owner->GetPosition(); + if (!IsInBoundary(&startPosition)) // fall back to creature position + { + startPosition = me->GetPosition(); + if (!IsInBoundary(&startPosition)) // fall back to creature home position + { + startPosition = me->GetHomePosition(); + if (!IsInBoundary(&startPosition)) + return LANG_CREATURE_NO_INTERIOR_POINT_FOUND; + } + } + + // Helper to spawn visualization creature + auto spawnVisualizationCreature = [owner, duration, checkZ](Position const& pos) + { + if (TempSummon* summon = + owner->SummonCreature(BOUNDARY_VISUALIZE_CREATURE, pos, TEMPSUMMON_TIMED_DESPAWN, duration)) + { + summon->SetObjectScale(BOUNDARY_VISUALIZE_CREATURE_SCALE); + summon->SetUnitFlag(UNIT_FLAG_STUNNED); + summon->SetImmuneToAll(true); + summon->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE_2); + if (!checkZ) + summon->SetDisableGravity(false); + } + }; + + struct PositionHash + { + std::size_t operator()(Position const& pos) const + { + // Convert to fixed precision coordinates. + // We lose precision here, but we don't care about the exact position + int32 x = int32(pos.m_positionX); + int32 y = int32(pos.m_positionY); + int32 z = int32(pos.m_positionZ); + + return std::hash()(x) ^ std::hash()(y) ^ std::hash()(z); + } + }; + + std::unordered_set visited; + std::queue queue; + queue.push(startPosition); + visited.insert(startPosition); + uint8 maxDirections = checkZ ? 6 : 4; + uint32 spawns = 0; + + while (!queue.empty()) + { + Position currentPosition = queue.front(); + queue.pop(); + + for (uint8 i = 0; i < maxDirections; ++i) + { + Position const& direction = boundaryDirections[i]; + Position nextPosition = currentPosition; + nextPosition.RelocateOffset(direction); + + if (startPosition.GetExactDist(&nextPosition) > BOUNDARY_MAX_DISTANCE) + break; + + if (visited.find(nextPosition) != visited.end()) + continue; // already visited + + visited.insert(nextPosition); + + bool isInBoundary = IsInBoundary(&nextPosition); + + if ((isInBoundary && fill) || !isInBoundary) + { + spawnVisualizationCreature(currentPosition); + ++spawns; + if (spawns > BOUNDARY_MAX_SPAWNS) + return LANG_CREATURE_MOVEMENT_MAYBE_UNBOUNDED; + } + + if (isInBoundary) + queue.push(nextPosition); // continue visiting + } + } + return 0; +} + bool CreatureAI::IsInBoundary(Position const* who) const { if (!_boundary) diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 15aa561f6..4672a8791 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -209,6 +209,9 @@ public: virtual void PetStopAttack() { } + // intended for encounter design/debugging. do not use for other purposes. expensive. + int32 VisualizeBoundary(uint32 duration, Unit* owner = nullptr, bool fill = false, bool checkZ = false) const; + // boundary system methods virtual bool CheckInRoom(); CreatureBoundary const* GetBoundary() const { return _boundary; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp index 22a5595d3..39a7836ff 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundRV.cpp @@ -96,7 +96,7 @@ void BattlegroundRV::PostUpdateImpl(uint32 diff) if (player->GetPositionZ() < 27.0f) TeleportUnitToNewZ(player, 28.28f, true); - for (uint8 i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) + for (uint8 i = SUMMON_SLOT_TOTEM_FIRE; i < MAX_TOTEM_SLOT; ++i) if (player->m_SummonSlot[i]) if (Creature* totem = GetBgMap()->GetCreature(player->m_SummonSlot[i])) if (totem->GetPositionZ() < 28.0f) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index b3a1d81fb..7fdc629f8 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2672,29 +2672,30 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool skipDistCheck) const // pussywizard: don't check distance to home position if recently damaged (allow kiting away from spawnpoint!) // xinef: this should include taunt auras - if (!isWorldBoss() && (GetLastLeashExtensionTime() + 12 > GameTime::GetGameTime().count() || HasTauntAura())) + if (!isWorldBoss() && (GetLastLeashExtensionTime() + GetLeashTimer() > GameTime::GetGameTime().count() || HasTauntAura())) return true; } if (skipDistCheck) return true; - // xinef: added size factor for huge npcs - float dist = std::min(GetDetectionRange() + GetObjectSize() * 2, 150.0f); + float dist = sWorld->getFloatConfig(CONFIG_CREATURE_LEASH_RADIUS); - if (Unit* unit = GetCharmerOrOwner()) + if (GetCharmerOrOwner()) { dist = std::min(GetMap()->GetVisibilityRange() + GetObjectSize() * 2, 150.0f); - return victim->IsWithinDist(unit, dist); + return IsWithinDist(victim, dist); } + + if (!dist) + return true; + + float x, y, z; + x = y = z = 0.0f; + if (GetMotionMaster()->GetMotionSlot(MOTION_SLOT_IDLE)->GetResetPosition(x, y, z)) + return IsInDist2d(x, y, dist); else - { - // to prevent creatures in air ignore attacks because distance is already too high... - if (GetMovementTemplate().IsFlightAllowed()) - return victim->IsInDist2d(&m_homePosition, dist); - else - return victim->IsInDist(&m_homePosition, dist); - } + return IsInDist2d(&m_homePosition, dist); } CreatureAddon const* Creature::GetCreatureAddon() const @@ -3730,6 +3731,16 @@ void Creature::UpdateLeashExtensionTime() (*GetLastLeashExtensionTimePtr()) = GameTime::GetGameTime().count(); } +uint8 Creature::GetLeashTimer() const +{ // Based on testing on Classic, seems to range from ~11s for low level mobs (1-5) to ~16s for high level mobs (70+) + uint8 timerOffset = 11; + + uint8 timerModifier = uint8(GetLevel() / 10) - 2; + + // Formula is likely not quite correct, but better than flat timer + return std::max(timerOffset, timerOffset + timerModifier); +} + bool Creature::CanPeriodicallyCallForAssistance() const { if (!IsInCombat()) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 6b861f17e..092cec299 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -391,6 +391,7 @@ public: void ClearLastLeashExtensionTimePtr(); time_t GetLastLeashExtensionTime() const; void UpdateLeashExtensionTime(); + uint8 GetLeashTimer() const; bool IsFreeToMove(); static constexpr uint32 MOVE_CIRCLE_CHECK_INTERVAL = 3000; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9712c77c7..e5ae95c08 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8840,13 +8840,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId) battlefield->FillInitialWorldStates(packet); break; } - [[fallthrough]]; default: - packet.Worldstates.reserve(4); - packet.Worldstates.emplace_back(WORLD_STATE_GENERIC_UNK_2, 0); - packet.Worldstates.emplace_back(WORLD_STATE_GENERIC_UNK_1, 0); - packet.Worldstates.emplace_back(WORLD_STATE_GENERIC_UNK_0, 0); - packet.Worldstates.emplace_back(WORLD_STATE_GENERIC_UNK_3, 0); break; } } diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp index 97cde0794..159c5aed7 100644 --- a/src/server/game/Entities/Totem/Totem.cpp +++ b/src/server/game/Entities/Totem/Totem.cpp @@ -51,17 +51,17 @@ void Totem::InitStats(uint32 duration) if (Unit* owner = ObjectAccessor::GetUnit(*this, m_owner)) { uint32 slot = m_Properties->Slot; - if (owner->IsPlayer() && slot >= SUMMON_SLOT_TOTEM && slot < MAX_TOTEM_SLOT) + if (owner->IsPlayer() && slot >= SUMMON_SLOT_TOTEM_FIRE && slot < MAX_TOTEM_SLOT) { WorldPackets::Totem::TotemCreated data; data.Totem = GetGUID(); - data.Slot = slot - SUMMON_SLOT_TOTEM; + data.Slot = slot - SUMMON_SLOT_TOTEM_FIRE; data.Duration = duration; data.SpellID = GetUInt32Value(UNIT_CREATED_BY_SPELL); owner->ToPlayer()->SendDirectMessage(data.Write()); // set display id depending on caster's race - SetDisplayId(owner->GetModelForTotem(PlayerTotemType(m_Properties->Id))); + SetDisplayId(sObjectMgr->GetModelForTotem(SummonSlot(slot), Races(owner->getRace()))); } SetLevel(owner->GetLevel()); @@ -133,7 +133,7 @@ void Totem::UnSummon(uint32 msTime) if (Unit* owner = GetOwner()) { // clear owner's totem slot - for (uint8 i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) + for (uint8 i = SUMMON_SLOT_TOTEM_FIRE; i < MAX_TOTEM_SLOT; ++i) { if (owner->m_SummonSlot[i] == GetGUID()) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4c603405f..92752c929 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -19261,7 +19261,7 @@ uint32 Unit::GetCombatRatingDamageReduction(CombatRating cr, float rate, float c return CalculatePct(damage, percent); } -uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const +uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) { // Hardcoded cases switch (spellId) @@ -19276,177 +19276,8 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const if (IsPlayer()) { - switch (form) - { - case FORM_CAT: - // Based on Hair color - if (getRace() == RACE_NIGHTELF) - { - uint8 hairColor = GetByteValue(PLAYER_BYTES, 3); - switch (hairColor) - { - case 7: // Violet - case 8: - return 29405; - case 3: // Light Blue - return 29406; - case 0: // Green - case 1: // Light Green - case 2: // Dark Green - return 29407; - case 4: // White - return 29408; - default: // original - Dark Blue - return 892; - } - } - // Based on Skin color - else if (getRace() == RACE_TAUREN) - { - uint8 skinColor = GetByteValue(PLAYER_BYTES, 0); - // Male - if (getGender() == GENDER_MALE) - { - switch (skinColor) - { - case 12: // White - case 13: - case 14: - case 18: // Completly White - return 29409; - case 9: // Light Brown - case 10: - case 11: - return 29410; - case 6: // Brown - case 7: - case 8: - return 29411; - case 0: // Dark - case 1: - case 2: - case 3: // Dark Grey - case 4: - case 5: - return 29412; - default: // original - Grey - return 8571; - } - } - // Female - else switch (skinColor) - { - case 10: // White - return 29409; - case 6: // Light Brown - case 7: - return 29410; - case 4: // Brown - case 5: - return 29411; - case 0: // Dark - case 1: - case 2: - case 3: - return 29412; - default: // original - Grey - return 8571; - } - } - else if (Player::TeamIdForRace(getRace()) == TEAM_ALLIANCE) - return 892; - else - return 8571; - case FORM_DIREBEAR: - case FORM_BEAR: - // Based on Hair color - if (getRace() == RACE_NIGHTELF) - { - uint8 hairColor = GetByteValue(PLAYER_BYTES, 3); - switch (hairColor) - { - case 0: // Green - case 1: // Light Green - case 2: // Dark Green - return 29413; // 29415? - case 6: // Dark Blue - return 29414; - case 4: // White - return 29416; - case 3: // Light Blue - return 29417; - default: // original - Violet - return 2281; - } - } - // Based on Skin color - else if (getRace() == RACE_TAUREN) - { - uint8 skinColor = GetByteValue(PLAYER_BYTES, 0); - // Male - if (getGender() == GENDER_MALE) - { - switch (skinColor) - { - case 0: // Dark (Black) - case 1: - case 2: - return 29418; - case 3: // White - case 4: - case 5: - case 12: - case 13: - case 14: - return 29419; - case 9: // Light Brown/Grey - case 10: - case 11: - case 15: - case 16: - case 17: - return 29420; - case 18: // Completly White - return 29421; - default: // original - Brown - return 2289; - } - } - // Female - else switch (skinColor) - { - case 0: // Dark (Black) - case 1: - return 29418; - case 2: // White - case 3: - return 29419; - case 6: // Light Brown/Grey - case 7: - case 8: - case 9: - return 29420; - case 10: // Completly White - return 29421; - default: // original - Brown - return 2289; - } - } - else if (Player::TeamIdForRace(getRace()) == TEAM_ALLIANCE) - return 2281; - else - return 2289; - case FORM_FLIGHT: - if (Player::TeamIdForRace(getRace()) == TEAM_ALLIANCE) - return 20857; - return 20872; - case FORM_FLIGHT_EPIC: - if (Player::TeamIdForRace(getRace()) == TEAM_ALLIANCE) - return 21243; - return 21244; - default: - break; - } + if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer())) + return ModelId; } uint32 modelid = 0; @@ -19472,104 +19303,6 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const return modelid; } -uint32 Unit::GetModelForTotem(PlayerTotemType totemType) -{ - switch (getRace()) - { - case RACE_ORC: - { - switch (totemType) - { - case SUMMON_TYPE_TOTEM_FIRE: // fire - return 30758; - case SUMMON_TYPE_TOTEM_EARTH: // earth - return 30757; - case SUMMON_TYPE_TOTEM_WATER: // water - return 30759; - case SUMMON_TYPE_TOTEM_AIR: // air - return 30756; - } - break; - } - case RACE_DWARF: - { - switch (totemType) - { - case SUMMON_TYPE_TOTEM_FIRE: // fire - return 30754; - case SUMMON_TYPE_TOTEM_EARTH: // earth - return 30753; - case SUMMON_TYPE_TOTEM_WATER: // water - return 30755; - case SUMMON_TYPE_TOTEM_AIR: // air - return 30736; - } - break; - } - case RACE_TROLL: - { - switch (totemType) - { - case SUMMON_TYPE_TOTEM_FIRE: // fire - return 30762; - case SUMMON_TYPE_TOTEM_EARTH: // earth - return 30761; - case SUMMON_TYPE_TOTEM_WATER: // water - return 30763; - case SUMMON_TYPE_TOTEM_AIR: // air - return 30760; - } - break; - } - case RACE_TAUREN: - { - switch (totemType) - { - case SUMMON_TYPE_TOTEM_FIRE: // fire - return 4589; - case SUMMON_TYPE_TOTEM_EARTH: // earth - return 4588; - case SUMMON_TYPE_TOTEM_WATER: // water - return 4587; - case SUMMON_TYPE_TOTEM_AIR: // air - return 4590; - } - break; - } - case RACE_DRAENEI: - { - switch (totemType) - { - case SUMMON_TYPE_TOTEM_FIRE: // fire - return 19074; - case SUMMON_TYPE_TOTEM_EARTH: // earth - return 19073; - case SUMMON_TYPE_TOTEM_WATER: // water - return 19075; - case SUMMON_TYPE_TOTEM_AIR: // air - return 19071; - } - break; - } - default: // One standard for other races. - { - switch (totemType) - { - case SUMMON_TYPE_TOTEM_FIRE: // fire - return 4589; - case SUMMON_TYPE_TOTEM_EARTH: // earth - return 4588; - case SUMMON_TYPE_TOTEM_WATER: // water - return 4587; - case SUMMON_TYPE_TOTEM_AIR: // air - return 4590; - } - break; - } - } - return 0; -} - Unit* Unit::GetRedirectThreatTarget() const { return _redirectThreatInfo.GetTargetGUID() ? ObjectAccessor::GetUnit(*this, _redirectThreatInfo.GetTargetGUID()) : nullptr; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 963ce3795..a7c82badb 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -26,6 +26,7 @@ #include "ItemTemplate.h" #include "MotionMaster.h" #include "Object.h" +#include "SharedDefines.h" #include "SpellAuraDefines.h" #include "SpellDefines.h" #include "ThreatMgr.h" @@ -599,23 +600,6 @@ enum ReactiveType MAX_REACTIVE }; -#define SUMMON_SLOT_PET 0 -#define SUMMON_SLOT_TOTEM 1 -#define MAX_TOTEM_SLOT 5 -#define SUMMON_SLOT_MINIPET 5 -#define SUMMON_SLOT_QUEST 6 -#define MAX_SUMMON_SLOT 7 - -#define MAX_GAMEOBJECT_SLOT 4 - -enum PlayerTotemType -{ - SUMMON_TYPE_TOTEM_FIRE = 63, - SUMMON_TYPE_TOTEM_EARTH = 81, - SUMMON_TYPE_TOTEM_WATER = 82, - SUMMON_TYPE_TOTEM_AIR = 83, -}; - /// Spell cooldown flags sent in SMSG_SPELL_COOLDOWN enum SpellCooldownFlags { @@ -1898,8 +1882,7 @@ public: void RestoreDisplayId(); void SetNativeDisplayId(uint32 displayId) { SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, displayId); } - [[nodiscard]] uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId) const; - uint32 GetModelForTotem(PlayerTotemType totemType); + [[nodiscard]] uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId); // Unit positons [[nodiscard]] virtual bool IsInWater() const; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a4033ca1c..330ee91e0 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1785,6 +1785,139 @@ void ObjectMgr::LoadCreatureModelInfo() LOG_INFO("server.loading", " "); } +void ObjectMgr::LoadPlayerTotemModels() +{ + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.Query("SELECT TotemID, RaceID, ModelID from player_totem_model"); + + if (!result) + { + LOG_INFO("server.loading", ">> Loaded 0 player totem model records. DB table `player_totem_model` is empty."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + + SummonSlot totemSlot = SummonSlot(fields[0].Get()); + uint8 race = fields[1].Get(); + uint32 displayId = fields[2].Get(); + + if (totemSlot < SUMMON_SLOT_TOTEM_FIRE || totemSlot >= MAX_TOTEM_SLOT) + { + LOG_ERROR("sql.sql", "Wrong TotemSlot {} in `player_totem_model` table, skipped.", totemSlot); + continue; + } + + ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); + if (!raceEntry) + { + LOG_ERROR("sql.sql", "Race {} defined in `player_totem_model` does not exists, skipped.", uint32(race)); + continue; + } + + CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(displayId); + if (!displayEntry) + { + LOG_ERROR("sql.sql", "TotemSlot: {} defined in `player_totem_model` has non-existing model ({}), skipped.", totemSlot, displayId); + continue; + } + + _playerTotemModel[std::make_pair(totemSlot, Races(race))] = displayId; + ++count; + } while (result->NextRow()); + + LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); + LOG_INFO("server.loading", " "); +} + +uint32 ObjectMgr::GetModelForTotem(SummonSlot totemSlot, Races race) const +{ + auto itr = _playerTotemModel.find(std::make_pair(totemSlot, race)); + if (itr != _playerTotemModel.end()) + return itr->second; + + LOG_ERROR("misc", "TotemSlot {} with RaceID ({}) have no totem model data defined, set to default model.", totemSlot, race); + return 0; +} + +void ObjectMgr::LoadPlayerShapeshiftModels() +{ + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.Query("SELECT ShapeshiftID, RaceID, CustomizationID, GenderID, ModelID from player_shapeshift_model"); + + if (!result) + { + LOG_INFO("server.loading", ">> Loaded 0 player shapeshift model records. DB table `player_shapeshift_model` is empty."); + return; + } + + uint32 count = 0; + do + { + Field* fields = result->Fetch(); + + ShapeshiftForm shapeshiftForm = ShapeshiftForm(fields[0].Get()); + uint8 race = fields[1].Get(); + uint8 customizationID = fields[2].Get(); + uint8 genderID = Gender(fields[3].Get()); + uint32 modelId = fields[4].Get(); + + ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(race); + if (!raceEntry) + { + LOG_ERROR("sql.sql", "Race {} defined in `player_shapeshift_model` does not exists, skipped.", uint32(race)); + continue; + } + + CreatureDisplayInfoEntry const* displayEntry = sCreatureDisplayInfoStore.LookupEntry(modelId); + if (!displayEntry) + { + LOG_ERROR("sql.sql", "ShapeshiftForm: {}, Race: {} defined in `player_shapeshift_model` has non-existing model ({}), skipped.", shapeshiftForm, race, modelId); + continue; + } + + _playerShapeshiftModel[std::make_tuple(shapeshiftForm, race, customizationID, genderID)] = modelId; + ++count; + } while (result->NextRow()); + + LOG_INFO("server.loading", ">> Loaded {} player totem model records in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); + LOG_INFO("server.loading", " "); +} + +uint32 ObjectMgr::GetModelForShapeshift(ShapeshiftForm form, Player* player) const +{ + uint8 customizationID; + + if (player->GetTeamId() == TEAM_ALLIANCE) + customizationID = player->GetByteValue(PLAYER_BYTES, 3); // Use Hair Color + else + customizationID = player->GetByteValue(PLAYER_BYTES, 0); // Use Skin Color + + auto itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, player->getGender())); + if (itr != _playerShapeshiftModel.end()) + return itr->second; // Explicit combination + + itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), customizationID, GENDER_NONE)); + if (itr != _playerShapeshiftModel.end()) + return itr->second; // Combination applied to both genders + + itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, player->getGender())); + if (itr != _playerShapeshiftModel.end()) + return itr->second; // Default gender-dependent model + + itr = _playerShapeshiftModel.find(std::make_tuple(form, player->getRace(), 255, GENDER_NONE)); + if (itr != _playerShapeshiftModel.end()) + return itr->second; // Last resort + + LOG_DEBUG("entities.player", "ShapeshiftForm {} with RaceID ({}) have no shapeshift model data defined, using fallback data.", form, player->getRace()); + return 0; +} + void ObjectMgr::LoadLinkedRespawn() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index f8ce9b096..9c8f9022e 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -711,6 +711,10 @@ struct DungeonEncounter typedef std::list DungeonEncounterList; typedef std::unordered_map DungeonEncounterContainer; +typedef std::map, uint32 /*DisplayId*/> PlayerTotemModelMap; + +typedef std::map, uint32 /*ModelID*/> PlayerShapeshiftModelMap; + static constexpr uint32 MAX_QUEST_MONEY_REWARDS = 10; typedef std::array QuestMoneyRewardArray; typedef std::unordered_map QuestMoneyRewardStore; @@ -777,6 +781,10 @@ public: [[nodiscard]] ItemTemplateContainer const* GetItemTemplateStore() const { return &_itemTemplateStore; } [[nodiscard]] std::vector const* GetItemTemplateStoreFast() const { return &_itemTemplateStoreFast; } + uint32 GetModelForTotem(SummonSlot totemSlot, Races race) const; + + uint32 GetModelForShapeshift(ShapeshiftForm form, Player* player) const; + ItemSetNameEntry const* GetItemSetNameEntry(uint32 itemId) { ItemSetNameContainer::iterator itr = _itemSetNameStore.find(itemId); @@ -1036,6 +1044,8 @@ public: void LoadCreatureAddons(); void LoadGameObjectAddons(); void LoadCreatureModelInfo(); + void LoadPlayerTotemModels(); + void LoadPlayerShapeshiftModels(); void LoadEquipmentTemplates(); void LoadCreatureMovementOverrides(); void LoadGameObjectLocales(); @@ -1623,6 +1633,10 @@ private: std::set _transportMaps; // Helper container storing map ids that are for transports only, loaded from gameobject_template + PlayerTotemModelMap _playerTotemModel; + + PlayerShapeshiftModelMap _playerShapeshiftModel; + QuestMoneyRewardStore _questMoneyRewards; struct GameobjectInstanceSavedState diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 01a81b097..7d6b5bd2e 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -686,7 +686,7 @@ void WorldSession::HandleTotemDestroyed(WorldPackets::Totem::TotemDestroyed& tot return; uint8 slotId = totemDestroyed.Slot; - slotId += SUMMON_SLOT_TOTEM; + slotId += SUMMON_SLOT_TOTEM_FIRE; if (slotId >= MAX_TOTEM_SLOT) return; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index fcaa96b50..1c7e15fd8 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3679,13 +3679,6 @@ void AuraEffect::HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 m } else { - if (GetId() == 53111) // Devour Humanoid - { - Unit::Kill(target, caster); - if (caster->IsCreature()) - caster->ToCreature()->RemoveCorpse(); - } - caster->_ExitVehicle(); // some SPELL_AURA_CONTROL_VEHICLE auras have a dummy effect on the player - remove them caster->RemoveAurasDueToSpell(GetId()); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 75121d79c..6ea3044ab 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3952,7 +3952,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) { int32 basepoints0 = damage; // Cast Absorb on totems - for (uint8 slot = SUMMON_SLOT_TOTEM; slot < MAX_TOTEM_SLOT; ++slot) + for (uint8 slot = SUMMON_SLOT_TOTEM_FIRE; slot < MAX_TOTEM_SLOT; ++slot) { if (!unitTarget->m_SummonSlot[slot]) continue; @@ -5260,7 +5260,7 @@ void Spell::EffectDestroyAllTotems(SpellEffIndex /*effIndex*/) return; int32 mana = 0; - for (uint8 slot = SUMMON_SLOT_TOTEM; slot < MAX_TOTEM_SLOT; ++slot) + for (uint8 slot = SUMMON_SLOT_TOTEM_FIRE; slot < MAX_TOTEM_SLOT; ++slot) { if (!m_caster->m_SummonSlot[slot]) continue; diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 2f7b918a6..3548ea787 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -5105,6 +5105,13 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx6 |= SPELL_ATTR6_ALLOW_WHILE_RIDING_VEHICLE; }); + // Eye of Acherus Flight (Boost) + ApplySpellFix({ 51923 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].ApplyAuraName = SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED; + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_CASTER); + }); + // Shattering Throw ApplySpellFix({ 64382 }, [](SpellInfo* spellInfo) { @@ -5112,6 +5119,27 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Attributes |= SPELL_ATTR0_ALLOW_ITEM_SPELL_IN_PVP; }); + ApplySpellFix({ + 43444, // Explosive Trap (Hex Lord Malacrass) + 43447, // Freezing Trap (Hex Lord Malacrass) + 43449, // Snake Trap (Hex Lord Malacrass) + }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].Effect = SPELL_EFFECT_SUMMON_OBJECT_SLOT1; + }); + + // Arcane Missiles + ApplySpellFix({ 58529, 61592 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); + }); + + // Siphon Bloodgem + ApplySpellFix({ 34367 }, [](SpellInfo* spellInfo) + { + spellInfo->ChannelInterruptFlags &= ~AURA_INTERRUPT_FLAG_TURNING; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 7d2c722f2..0eb83b4b3 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -193,6 +193,7 @@ enum WorldFloatConfigs CONFIG_LISTEN_RANGE_SAY, CONFIG_LISTEN_RANGE_TEXTEMOTE, CONFIG_LISTEN_RANGE_YELL, + CONFIG_CREATURE_LEASH_RADIUS, CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS, CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS, CONFIG_CHANCE_OF_GM_SURVEY, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 6b1ebc65c..a30fed4f6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -794,6 +794,7 @@ void World::LoadConfigSettings(bool reload) _int_configs[CONFIG_EVENT_ANNOUNCE] = sConfigMgr->GetOption("Event.Announce", 0); + _float_configs[CONFIG_CREATURE_LEASH_RADIUS] = sConfigMgr->GetOption("CreatureLeashRadius", 30.0f); _float_configs[CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS] = sConfigMgr->GetOption("CreatureFamilyFleeAssistanceRadius", 30.0f); _float_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS] = sConfigMgr->GetOption("CreatureFamilyAssistanceRadius", 10.0f); _int_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY] = sConfigMgr->GetOption("CreatureFamilyAssistanceDelay", 2000); @@ -1402,6 +1403,12 @@ void World::SetInitialWorldSettings() LOG_INFO("server.loading", "Loading SpellInfo Custom Attributes..."); sSpellMgr->LoadSpellInfoCustomAttributes(); + LOG_INFO("server.loading", "Loading Player Totem models..."); + sObjectMgr->LoadPlayerTotemModels(); + + LOG_INFO("server.loading", "Loading Player Shapeshift models..."); + sObjectMgr->LoadPlayerShapeshiftModels(); + LOG_INFO("server.loading", "Loading GameObject Models..."); LoadGameObjectModelList(_dataPath); diff --git a/src/server/game/World/WorldStateDefines.h b/src/server/game/World/WorldStateDefines.h index 5a7a869f5..a1ce0d11e 100644 --- a/src/server/game/World/WorldStateDefines.h +++ b/src/server/game/World/WorldStateDefines.h @@ -596,12 +596,6 @@ enum WorldStateIDs WORLD_STATE_TRIAL_OF_THE_CRUSADER_UI_COUNT = 4389, WORLD_STATE_TRIAL_OF_THE_CRUSADER_UI_SHOW = 4390, - // Unknown - WORLD_STATE_GENERIC_UNK_0 = 2322, - WORLD_STATE_GENERIC_UNK_1 = 2323, - WORLD_STATE_GENERIC_UNK_2 = 2324, - WORLD_STATE_GENERIC_UNK_3 = 2325, - // Stranglethorn Fishing Extravaganza (Are these custom IDs?) WORLD_STATE_STRANGLETHORN_VALE_FISHING_PREV_WIN_TIME = 197, WORLD_STATE_STRANGLETHORN_VALE_FISHING_HAS_WINNER = 198, diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 3a48e5d33..bb717e753 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -105,7 +105,8 @@ public: { "unitstate", HandleDebugUnitStateCommand, SEC_ADMINISTRATOR, Console::No }, { "objectcount", HandleDebugObjectCountCommand, SEC_ADMINISTRATOR, Console::Yes}, { "dummy", HandleDebugDummyCommand, SEC_ADMINISTRATOR, Console::No }, - { "mapdata", HandleDebugMapDataCommand, SEC_ADMINISTRATOR, Console::No } + { "mapdata", HandleDebugMapDataCommand, SEC_ADMINISTRATOR, Console::No }, + { "boundary", HandleDebugBoundaryCommand, SEC_ADMINISTRATOR, Console::No } }; static ChatCommandTable commandTable = { @@ -1388,6 +1389,27 @@ public: handler->PSendSysMessage("Created Cells In Map: {} / {}", map->GetCreatedCellsInMapCount(), TOTAL_NUMBER_OF_CELLS_PER_MAP * TOTAL_NUMBER_OF_CELLS_PER_MAP); return true; } + + static bool HandleDebugBoundaryCommand(ChatHandler* handler, Optional durationArg, Optional fill, Optional checkZ) + { + Player* player = handler->GetPlayer(); + if (!player) + return false; + + Creature* target = handler->getSelectedCreature(); + if (!target || !target->IsAIEnabled) + return false; + + uint32 duration = durationArg.value_or(5 * IN_MILLISECONDS); + if (duration > 180 * IN_MILLISECONDS) // arbitrary upper limit + duration = 180 * IN_MILLISECONDS; + + int32 errMsg = target->AI()->VisualizeBoundary(duration, player, fill.has_value(), checkZ.has_value()); + if (errMsg > 0) + handler->PSendSysMessage(errMsg); + + return true; + } }; void AddSC_debug_commandscript() diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index ed32701f2..53d172c76 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -36,6 +36,7 @@ public: { "join", HandleGroupJoinCommand, SEC_GAMEMASTER, Console::No }, { "remove", HandleGroupRemoveCommand, SEC_GAMEMASTER, Console::No }, { "disband", HandleGroupDisbandCommand, SEC_GAMEMASTER, Console::No }, + { "revive", HandleGroupReviveCommand, SEC_GAMEMASTER, Console::No }, { "leader", HandleGroupLeaderCommand, SEC_GAMEMASTER, Console::No } }; @@ -257,6 +258,39 @@ public: return true; } + + static bool HandleGroupReviveCommand(ChatHandler* handler, Optional target) + { + if (!target) + target = PlayerIdentifier::FromTargetOrSelf(handler); + + if (!target) + return false; + + Player* targetPlayer = target->GetConnectedPlayer(); + Group* group = targetPlayer->GetGroup(); + std::string nameLink = handler->playerLink(target->GetName()); + + if (!group) + { + handler->SendErrorMessage(LANG_NOT_IN_GROUP, nameLink); + return false; + } + + for (GroupReference* it = group->GetFirstMember(); it != nullptr; it = it->next()) + { + Player* target = it->GetSource(); + if (target) + { + target->RemoveAurasDueToSpell(27827); // Spirit of Redemption + target->ResurrectPlayer(!AccountMgr::IsPlayerAccount(target->GetSession()->GetSecurity()) ? 1.0f : 0.5f); + target->SpawnCorpseBones(); + target->SaveToDB(false, false); + } + } + + return true; + } }; void AddSC_group_commandscript() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index 56aefe2cd..cf45992a8 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -25,18 +25,6 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" #include "SpellScriptLoader.h" -/* ScriptData -SDName: Karazhan -SD%Complete: 100 -SDComment: Support for Barnes (Opera controller) and Berthold (Doorman), Support for Quest 9645. -SDCategory: Karazhan -EndScriptData */ - -/* ContentData -npc_barnes -npc_berthold -npc_image_of_medivh -EndContentData */ enum Spells { @@ -51,7 +39,17 @@ enum Spells SPELL_FIRE_BALL = 30967, SPELL_UBER_FIREBALL = 30971, SPELL_CONFLAGRATION_BLAST = 30977, - SPELL_MANA_SHIELD = 31635 + SPELL_MANA_SHIELD = 31635, + + // Wrath of the Titans + SPELL_WRATH_OF_THE_TITANS = 30554, + + SPELL_WRATH_PROC_BLAST = 30605, + SPELL_WRATH_PROC_BOLT = 30606, + SPELL_WRATH_PROC_FLAME = 30607, + SPELL_WRATH_PROC_SPITE = 30608, + SPELL_WRATH_PROC_CHILL = 30609, + }; enum Creatures @@ -608,10 +606,106 @@ class spell_karazhan_temptation : public AuraScript } }; +// 30610 - Wrath of the Titans Stacker +class spell_karazhan_wrath_titans_stacker : public SpellScript +{ + PrepareSpellScript(spell_karazhan_wrath_titans_stacker); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WRATH_OF_THE_TITANS }); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Unit* caster = GetCaster(); + if (!caster) + return; + + caster->CastSpell(caster, SPELL_WRATH_OF_THE_TITANS, true); + if (Aura* aur = caster->GetAura(SPELL_WRATH_OF_THE_TITANS)) + aur->SetStackAmount(5); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_karazhan_wrath_titans_stacker::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 30554 - Wrath of the Titans +class spell_karazhan_wrath_titans_aura : public AuraScript +{ + PrepareAuraScript(spell_karazhan_wrath_titans_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WRATH_PROC_BLAST, SPELL_WRATH_PROC_BOLT, SPELL_WRATH_PROC_FLAME, SPELL_WRATH_PROC_SPITE, SPELL_WRATH_PROC_CHILL }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (!eventInfo.GetSpellInfo()) + return false; + + if (GetFirstSchoolInMask(eventInfo.GetSpellInfo()->GetSchoolMask()) == SPELL_SCHOOL_NORMAL) + return false; + + if (GetFirstSchoolInMask(eventInfo.GetSpellInfo()->GetSchoolMask()) == SPELL_SCHOOL_HOLY) + return false; + + return true; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* target = eventInfo.GetActionTarget(); + Player* caster = GetTarget()->ToPlayer(); + if (!target || !caster) + return; + + uint32 spellId = 0; + switch (GetFirstSchoolInMask(eventInfo.GetSpellInfo()->GetSchoolMask())) + { + case SPELL_SCHOOL_FIRE: + spellId = SPELL_WRATH_PROC_FLAME; + break; + case SPELL_SCHOOL_NATURE: + spellId = SPELL_WRATH_PROC_BOLT; + break; + case SPELL_SCHOOL_FROST: + spellId = SPELL_WRATH_PROC_CHILL; + break; + case SPELL_SCHOOL_SHADOW: + spellId = SPELL_WRATH_PROC_SPITE; + break; + case SPELL_SCHOOL_ARCANE: + spellId = SPELL_WRATH_PROC_BLAST; + break; + default: + return; + } + + caster->CastSpell(target, spellId, true); + ModStackAmount(-1); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_karazhan_wrath_titans_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_karazhan_wrath_titans_aura::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } +}; + void AddSC_karazhan() { new npc_barnes(); new npc_image_of_medivh(); new at_karazhan_side_entrance(); RegisterSpellScript(spell_karazhan_temptation); + RegisterSpellScript(spell_karazhan_wrath_titans_stacker); + RegisterSpellScript(spell_karazhan_wrath_titans_aura); } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 941bc2f9f..2a5816d74 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -37,145 +37,28 @@ enum EyeOfAcherusMisc { SPELL_THE_EYE_OF_ACHERUS = 51852, - SPELL_EYE_OF_ACHERUS_VISUAL = 51892, - SPELL_EYE_OF_ACHERUS_FLIGHT_BOOST = 51923, - SPELL_EYE_OF_ACHERUS_FLIGHT = 51890, - SPELL_ROOT_SELF = 51860, - - EVENT_ANNOUNCE_LAUNCH_TO_DESTINATION = 1, - EVENT_UNROOT = 2, - EVENT_LAUNCH_TOWARDS_DESTINATION = 3, - EVENT_GRANT_CONTROL = 4, - - SAY_LAUNCH_TOWARDS_DESTINATION = 0, - SAY_EYE_UNDER_CONTROL = 1, - - POINT_NEW_AVALON = 1, - - EYE_POINT_DESTINATION_0 = 0, - EYE_POINT_DESTINATION_1 = 1, - EYE_POINT_DESTINATION_2 = 2, - EYE_POINT_DESTINATION_3 = 3 -}; - -struct npc_eye_of_acherus : public ScriptedAI -{ - npc_eye_of_acherus(Creature* creature) : ScriptedAI(creature) - { - creature->SetDisplayFromModel(0); - creature->SetReactState(REACT_PASSIVE); - } - - void InitializeAI() override - { - DoCastSelf(SPELL_ROOT_SELF); - DoCastSelf(SPELL_EYE_OF_ACHERUS_VISUAL); - _events.ScheduleEvent(EVENT_ANNOUNCE_LAUNCH_TO_DESTINATION, 400ms); - } - - void OnCharmed(bool apply) override - { - if (!apply) - { - me->GetCharmerOrOwner()->RemoveAurasDueToSpell(SPELL_THE_EYE_OF_ACHERUS); - me->GetCharmerOrOwner()->RemoveAurasDueToSpell(SPELL_EYE_OF_ACHERUS_FLIGHT_BOOST); - } - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ANNOUNCE_LAUNCH_TO_DESTINATION: - if (Unit* owner = me->GetCharmerOrOwner()) - { - Talk(SAY_LAUNCH_TOWARDS_DESTINATION, owner); - } - _events.ScheduleEvent(EVENT_UNROOT, 400ms); - break; - case EVENT_UNROOT: - me->RemoveAurasDueToSpell(SPELL_ROOT_SELF); - DoCastSelf(SPELL_EYE_OF_ACHERUS_FLIGHT_BOOST); - _events.ScheduleEvent(EVENT_LAUNCH_TOWARDS_DESTINATION, 1s + 200ms); - break; - case EVENT_LAUNCH_TOWARDS_DESTINATION: - { - Position const EYE_DESTINATION_1 = { 2361.21f, -5660.45f, 496.744f, 0.0f }; - Position const EYE_DESTINATION_2 = { 2341.571f, -5672.797f, 538.3942f, 0.0f }; - Position const EYE_DESTINATION_3 = { 1957.4f, -5844.1f, 273.867f, 0.0f }; - Position const EYE_DESTINATION_4 = { 1758.01f, -5876.79f, 166.867f, 0.0f }; - - Movement::MoveSplineInit init(me); - init.SetFly(); - if (Unit* owner = me->GetCharmerOrOwner()) - { - init.SetVelocity(owner->GetSpeed(MOVE_RUN)); - } - - me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_0, EYE_DESTINATION_1); - me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_1, EYE_DESTINATION_2); - me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_2, EYE_DESTINATION_3); - me->GetMotionMaster()->MovePoint(EYE_POINT_DESTINATION_3, EYE_DESTINATION_4); - _events.ScheduleEvent(EVENT_GRANT_CONTROL, 22s); - break; - } - case EVENT_GRANT_CONTROL: - if (Unit* owner = me->GetCharmerOrOwner()) - { - Talk(SAY_EYE_UNDER_CONTROL, owner); - } - me->RemoveAurasDueToSpell(SPELL_ROOT_SELF); - DoCastSelf(SPELL_EYE_OF_ACHERUS_FLIGHT); - me->RemoveAurasDueToSpell(SPELL_EYE_OF_ACHERUS_FLIGHT_BOOST); - break; - default: - break; - } - } - } - - void MovementInform(uint32 movementType, uint32 pointId) override - { - if (movementType != POINT_MOTION_TYPE) - return; - - switch (pointId) - { - case POINT_NEW_AVALON: - DoCastSelf(SPELL_ROOT_SELF); - break; - default: - break; - } - } - -private: - EventMap _events; }; enum DeathComesFromOnHigh { - SUMMON_GHOULS_ON_SCARLET_CRUSADE = 54522 + SPELL_CALL_OF_THE_DEAD = 51900 }; +// 51904 - Summon Ghouls On Scarlet Crusade class spell_q12641_death_comes_from_on_high_summon_ghouls : public SpellScript { PrepareSpellScript(spell_q12641_death_comes_from_on_high_summon_ghouls); bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SUMMON_GHOULS_ON_SCARLET_CRUSADE }); + return ValidateSpellInfo({ SPELL_CALL_OF_THE_DEAD }); } void HandleScriptEffect(SpellEffIndex effIndex) { PreventHitEffect(effIndex); if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), SUMMON_GHOULS_ON_SCARLET_CRUSADE, true); + target->CastSpell(target, SPELL_CALL_OF_THE_DEAD, true); } void Register() override @@ -184,6 +67,35 @@ class spell_q12641_death_comes_from_on_high_summon_ghouls : public SpellScript } }; +// 52694 - Recall Eye of Acherus +class spell_q12641_death_comes_from_on_high_recall_eye : public SpellScript +{ + PrepareSpellScript(spell_q12641_death_comes_from_on_high_recall_eye); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_THE_EYE_OF_ACHERUS }); + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + Unit* caster = GetCaster(); + Unit* owner = caster->GetCharmerOrOwner(); + + if (!caster || !owner) + return; + + if (owner->HasAura(SPELL_THE_EYE_OF_ACHERUS)) + owner->RemoveAurasDueToSpell(SPELL_THE_EYE_OF_ACHERUS); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + enum deathsChallenge { SPELL_DUEL = 52996, @@ -1300,8 +1212,8 @@ class spell_lich_king_whisper : public SpellScript void AddSC_the_scarlet_enclave_c1() { // Ours - RegisterCreatureAI(npc_eye_of_acherus); RegisterSpellScript(spell_q12641_death_comes_from_on_high_summon_ghouls); + RegisterSpellScript(spell_q12641_death_comes_from_on_high_recall_eye); new npc_death_knight_initiate(); RegisterSpellScript(spell_item_gift_of_the_harvester); RegisterSpellScript(spell_q12698_the_gift_that_keeps_on_giving); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter3.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter3.cpp index e10f3d12c..f659d0ffb 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter3.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter3.cpp @@ -15,27 +15,77 @@ * with this program. If not, see . */ +#include "CreatureScript.h" +#include "ScriptedCreature.h" +#include "SpellAuras.h" #include "SpellInfo.h" #include "SpellScript.h" #include "SpellScriptLoader.h" +enum DevourHumanoid +{ + NPC_HEARTHGLEN_CRUSADER = 29102, + NPC_TIRISFAL_CRUSADER = 29103 +}; + +// 53110 - Devour Humanoid class spell_q12779_an_end_to_all_things : public SpellScript { PrepareSpellScript(spell_q12779_an_end_to_all_things); + SpellCastResult CheckCast() + { + if (Unit* caster = GetCaster()) + if (caster->FindNearestCreature(NPC_HEARTHGLEN_CRUSADER, 15.0f, true) || caster->FindNearestCreature(NPC_TIRISFAL_CRUSADER, 15.0f, true)) + return SPELL_CAST_OK; + + return SPELL_FAILED_BAD_TARGETS; + } + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - if (GetHitUnit()) - GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true); + if (Creature* c = GetHitUnit()->ToCreature()) + if (Unit* caster = GetCaster()) + { + c->AI()->AttackStart(caster); + c->CastSpell(caster, GetEffectValue(), true); // 53111 + } } void Register() override { + OnCheckCast += SpellCheckCastFn(spell_q12779_an_end_to_all_things::CheckCast); OnEffectHitTarget += SpellEffectFn(spell_q12779_an_end_to_all_things::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; +// 53111 - Devour Humanoid (casted by the devoured creature) +class spell_q12779_an_end_to_all_things_devour_aura : public AuraScript +{ + PrepareAuraScript(spell_q12779_an_end_to_all_things_devour_aura); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + Unit* target = GetTarget(); + if (!caster || !target) + return; + + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) + { + caster->SetDisableGravity(true); + Unit::Kill(target, caster); + } + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_q12779_an_end_to_all_things_devour_aura::OnRemove, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_the_scarlet_enclave_c3() { RegisterSpellScript(spell_q12779_an_end_to_all_things); + RegisterSpellScript(spell_q12779_an_end_to_all_things_devour_aura); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 642e7d847..c00e88459 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -17,6 +17,8 @@ #include "AreaTriggerScript.h" #include "CreatureScript.h" +#include "GameObjectAI.h" +#include "GameObjectScript.h" #include "Player.h" #include "ScriptedCreature.h" #include "SpellInfo.h" @@ -488,6 +490,22 @@ public: } }; +struct go_eredar_twins_blaze : GameObjectAI +{ + explicit go_eredar_twins_blaze(GameObject *object) : GameObjectAI(object) { }; + + void InitializeAI() override + { + // required for the trap to apply its startDelay + if (InstanceScript* instance = me->GetInstanceScript()) + if (ObjectGuid creatureGUID = instance->GetGuidData(DATA_ALYTHESS)) + { + me->SetOwnerGUID(creatureGUID); + me->SetLootState(GO_NOT_READY); + } + } +}; + void AddSC_boss_eredar_twins() { RegisterSunwellPlateauCreatureAI(boss_sacrolash); @@ -501,4 +519,5 @@ void AddSC_boss_eredar_twins() RegisterSpellScriptWithArgs(spell_eredar_twins_handle_touch_periodic, "spell_eredar_twins_handle_flame_touched_periodic", SPELL_FLAME_TOUCHED, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); RegisterSpellScriptWithArgs(spell_eredar_twins_handle_touch_periodic, "spell_eredar_twins_handle_flame_touched_flame_sear", SPELL_FLAME_TOUCHED, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); new at_sunwell_eredar_twins(); + RegisterGameObjectAI(go_eredar_twins_blaze); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 534e5de3c..b5aa813db 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -1003,6 +1003,9 @@ class spell_kiljaeden_sinister_reflection_clone : public SpellScript void FilterTargets(std::list& targets) { + if (targets.empty()) + return; + targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); WorldObject* target = targets.front(); @@ -1052,6 +1055,9 @@ class spell_kiljaeden_darkness_aura : public AuraScript void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + if (GetUnitOwner()->IsCreature()) GetUnitOwner()->ToCreature()->AI()->DoAction(ACTION_NO_KILL_TALK); @@ -1157,6 +1163,8 @@ class spell_kiljaeden_armageddon_missile : public SpellScript } }; +// 45856 - Breath: Haste +// 45860 - Breath: Revitalize class spell_kiljaeden_dragon_breath : public SpellScript { PrepareSpellScript(spell_kiljaeden_dragon_breath); @@ -1166,9 +1174,16 @@ class spell_kiljaeden_dragon_breath : public SpellScript targets.remove_if(Acore::UnitAuraCheck(true, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT)); } + void HandleHit(SpellEffIndex /*effindex*/) + { + if (Unit* target = GetHitUnit()) + target->RemoveMovementImpairingAuras(false); + } + void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kiljaeden_dragon_breath::FilterTargets, EFFECT_ALL, TARGET_UNIT_CONE_ALLY); + OnEffectHitTarget += SpellEffectFn(spell_kiljaeden_dragon_breath::HandleHit, EFFECT_ALL, SPELL_EFFECT_ANY); } }; diff --git a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp index f301171e3..be0caf53d 100644 --- a/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp +++ b/src/server/scripts/EasternKingdoms/zone_isle_of_queldanas.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "AreaDefines.h" #include "CreatureScript.h" #include "PassiveAI.h" #include "Pet.h" @@ -23,19 +24,6 @@ #include "SpellInfo.h" #include "SpellScript.h" #include "SpellScriptLoader.h" -/* ScriptData -SDName: Isle_of_Queldanas -SD%Complete: 100 -SDComment: Quest support: 11524, 11525, 11532, 11533, 11542, 11543, 11541 -SDCategory: Isle Of Quel'Danas -EndScriptData */ - -/* ContentData -npc_converted_sentry -npc_greengill_slave -EndContentData */ - -/*###### OUR: ######*/ enum ThalorienNpcs { @@ -677,13 +665,31 @@ public: }; }; +// 45396, 45398 - Weapon Coating Enchant +class spell_gen_weapon_coating_enchant : public AuraScript +{ + PrepareAuraScript(spell_gen_weapon_coating_enchant); + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + if (!caster) + return false; + + return (caster->GetZoneId() == AREA_ISLE_OF_QUEL_DANAS || caster->GetZoneId() == AREA_SUNWELL_PLATEAU || caster->GetZoneId() == AREA_MAGISTERS_TERRACE); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_gen_weapon_coating_enchant::CheckProc); + } +}; + void AddSC_isle_of_queldanas() { - // OUR: new npc_bh_thalorien_dawnseeker(); RegisterSpellScript(spell_bh_cleanse_quel_delar); new npc_grand_magister_rommath(); - - // THEIR: new npc_greengill_slave(); + RegisterSpellScript(spell_gen_weapon_coating_enchant); } diff --git a/src/server/scripts/Events/noblegarden.cpp b/src/server/scripts/Events/noblegarden.cpp index df04be6c1..4187087f1 100644 --- a/src/server/scripts/Events/noblegarden.cpp +++ b/src/server/scripts/Events/noblegarden.cpp @@ -21,7 +21,8 @@ enum eNoblegarden { - SPELL_NOBLEGARDEN_BUNNY = 61734 + SPELL_NOBLEGARDEN_BUNNY = 61734, + SPELL_WELL_FED = 24870, }; // 61712 Summon Noblegarden Bunny Controller @@ -55,7 +56,46 @@ class spell_summon_noblegarden_bunny_controller : public SpellScript } }; +// 61874 - Food (Noblegarden Chocolate, item 44791) +class spell_item_noblegarden_chocolate : public AuraScript +{ + PrepareAuraScript(spell_item_noblegarden_chocolate); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WELL_FED }); + } + + bool Load() override + { + _buffGiven = false; + return true; + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) + { + if (Unit* caster = GetCaster()) + { + uint32 duration = static_cast(GetDuration()); + if (duration <= 14000 && !_buffGiven) + { + _buffGiven = true; + caster->CastSpell(caster, SPELL_WELL_FED, true); + } + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_item_noblegarden_chocolate::HandlePeriodic, EFFECT_0, SPELL_AURA_OBS_MOD_HEALTH); + } + +private: + bool _buffGiven; +}; + void AddSC_event_noblegarden_scripts() { RegisterSpellScript(spell_summon_noblegarden_bunny_controller); + RegisterSpellScript(spell_item_noblegarden_chocolate); } diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h index 2add3a842..b6b691be6 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/ahnkahet.h @@ -48,7 +48,7 @@ enum AhnKahetCreatures enum AhnkahetSpells { - SPELL_SHADOW_SICKLE = 56701, // Shadow Sickle Normal + SPELL_SHADOW_SICKLE = 56701, // Shadow Sickle }; enum AhnkahetObjects diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp index aab8030fd..0201870e7 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_amanitar.cpp @@ -102,11 +102,7 @@ Position const MushroomPositions[MAX_MUSHROOMS_COUNT] = struct boss_amanitar : public BossAI { - boss_amanitar(Creature* creature) : BossAI(creature, DATA_AMANITAR), mushroomsSummoned(false) - { - creature->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true); - creature->SetMeleeDamageSchool(SPELL_SCHOOL_NATURE); - } + boss_amanitar(Creature* creature) : BossAI(creature, DATA_AMANITAR), mushroomsSummoned(false) { } void Reset() override { diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp index 914dd5118..1eaad721f 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_elder_nadox.cpp @@ -101,9 +101,7 @@ struct boss_elder_nadox : public BossAI events.ScheduleEvent(EVENT_PLAGUE, 5s, 8s); if (IsHeroic()) - { events.ScheduleEvent(EVENT_BROOD_RAGE, 5s); - } // Cache eggs std::list eggs; @@ -122,7 +120,7 @@ struct boss_elder_nadox : public BossAI eggs.clear(); - // Guardian eggs + // Guardian eggs me->GetCreatureListWithEntryInGrid(eggs, NPC_AHNKAHAR_GUARDIAN_EGG, 250.0f); if (!eggs.empty()) { @@ -139,17 +137,13 @@ struct boss_elder_nadox : public BossAI void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override { if (summon->GetEntry() == NPC_AHNKAHAR_GUARDIAN) - { respectYourElders = false; - } } void KilledUnit(Unit* victim) override { if (victim->IsPlayer()) - { Talk(SAY_SLAY); - } } void JustDied(Unit* /*killer*/) override @@ -160,7 +154,7 @@ struct boss_elder_nadox : public BossAI void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*school*/) override { - if (!guardianSummoned && me->HealthBelowPctDamaged(55, damage)) + if (!guardianSummoned && me->HealthBelowPctDamaged(50, damage)) { SummonHelpers(false); guardianSummoned = true; @@ -170,9 +164,7 @@ struct boss_elder_nadox : public BossAI uint32 GetData(uint32 type) const override { if (type == DATA_RESPECT_YOUR_ELDERS) - { return respectYourElders ? 1 : 0; - } return 0; } @@ -180,16 +172,12 @@ struct boss_elder_nadox : public BossAI void UpdateAI(uint32 diff) override { if (!UpdateVictim()) - { return; - } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) - { return; - } while (uint32 const eventId = events.ExecuteEvent()) { @@ -218,9 +206,8 @@ struct boss_elder_nadox : public BossAI case EVENT_CHECK_HOME: { if (!me->HasAura(SPELL_ENRAGE) && (me->GetPositionZ() < 24.0f || !me->GetHomePosition().IsInDist(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 110.0f))) - { DoCastSelf(SPELL_ENRAGE, true); - } + events.Repeat(1s); break; } } @@ -241,9 +228,7 @@ private: if (swarm) { if (swarmEggs.empty()) - { return; - } // Make a copy of guid list GuidList swarmEggs2 = swarmEggs; @@ -259,41 +244,29 @@ private: } if (swarmEggs2.empty()) - { return; - } previousSwarmEgg_GUID = Acore::Containers::SelectRandomContainerElement(swarmEggs2); if (Creature* egg = ObjectAccessor::GetCreature(*me, previousSwarmEgg_GUID)) - { egg->CastSpell(egg, SPELL_SUMMON_SWARMERS, true, nullptr, nullptr, me->GetGUID()); - } if (roll_chance_f(33)) - { Talk(SAY_EGG_SAC); - } } else { if (guardianEggs.empty()) - { return; - } ObjectGuid const& guardianEggGUID = Acore::Containers::SelectRandomContainerElement(guardianEggs); if (Creature* egg = ObjectAccessor::GetCreature(*me, guardianEggGUID)) - { egg->CastSpell(egg, SPELL_SUMMON_SWARM_GUARD, true, nullptr, nullptr, me->GetGUID()); - } Talk(EMOTE_HATCHES, me); if (roll_chance_f(33)) - { Talk(SAY_EGG_SAC); - } } } }; diff --git a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp index 0110b5680..f0c56bc78 100644 --- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/instance_ahnkahet.cpp @@ -15,6 +15,7 @@ * with this program. If not, see . */ +#include "AreaBoundary.h" #include "InstanceMapScript.h" #include "Player.h" #include "ScriptedCreature.h" @@ -38,6 +39,11 @@ DoorData const doorData[] = { 0, 0, DOOR_TYPE_ROOM } }; +BossBoundaryData const boundaries = +{ + { DATA_JEDOGA_SHADOWSEEKER, new ParallelogramBoundary(Position(460.365f, -661.997f, -20.985f), Position(364.958f,-790.211f, -14.207f), Position(347.436f,-657.978f,14.478f)) } +}; + class instance_ahnkahet : public InstanceMapScript { public: @@ -52,6 +58,7 @@ public: SetPersistentDataCount(MAX_PERSISTENT_DATA); LoadObjectData(creatureData, nullptr); LoadDoorData(doorData); + LoadBossBoundaries(boundaries); } void OnGameObjectCreate(GameObject* go) override @@ -126,15 +133,19 @@ public: } }; -// 56702 Shadow Sickle -// 59103 Shadow Sickle +// 56702, 59103 - Shadow Sickle class spell_shadow_sickle_periodic_damage : public AuraScript { PrepareAuraScript(spell_shadow_sickle_periodic_damage); void HandlePeriodic(AuraEffect const* /*aurEff*/) { - GetCaster()->CastSpell(nullptr, SPELL_SHADOW_SICKLE); + Unit* caster = GetCaster(); + if (!caster->IsCreature()) + return; + + if (Unit* target = caster->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 40.0f)) // Unknown if it targets only players + caster->CastSpell(target, SPELL_SHADOW_SICKLE, true); } void Register() override diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 1fa461594..be7191ca0 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -94,6 +94,7 @@ public: InstanceScript* pInstance; EventMap events; float ZapAngle; + uint8 step = 0; void Reset() override { @@ -185,32 +186,37 @@ public: { Talk(SAY_AZURE); Talk(SAY_AZURE_EMOTE); - switch (events.ExecuteEvent()) + switch (step) { - case EVENT_CALL_AZURE_RING_CAPTAIN_1: - me->CastSpell(me, SPELL_CALL_AZURE_RING_CAPTAIN_1, true); + case 0: + DoCast(SPELL_CALL_AZURE_RING_CAPTAIN_1); events.ScheduleEvent(EVENT_CALL_AZURE_RING_CAPTAIN_2, 16s); break; - case EVENT_CALL_AZURE_RING_CAPTAIN_2: - me->CastSpell(me, SPELL_CALL_AZURE_RING_CAPTAIN_2, true); + case 1: + DoCast(SPELL_CALL_AZURE_RING_CAPTAIN_2); events.ScheduleEvent(EVENT_CALL_AZURE_RING_CAPTAIN_3, 16s); break; - case EVENT_CALL_AZURE_RING_CAPTAIN_3: - me->CastSpell(me, SPELL_CALL_AZURE_RING_CAPTAIN_3, true); + case 2: + DoCast(SPELL_CALL_AZURE_RING_CAPTAIN_3); events.ScheduleEvent(EVENT_CALL_AZURE_RING_CAPTAIN_4, 16s); break; - case EVENT_CALL_AZURE_RING_CAPTAIN_4: - me->CastSpell(me, SPELL_CALL_AZURE_RING_CAPTAIN_4, true); + case 3: + DoCast(SPELL_CALL_AZURE_RING_CAPTAIN_4); events.ScheduleEvent(EVENT_CALL_AZURE_RING_CAPTAIN_1, 16s); break; } + + step++; + if (step > 3) + step = 0; + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) { if (Creature* trigger = me->SummonCreature(NPC_ARCANE_BEAM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 13000)) { if (Creature* c = me->FindNearestCreature(NPC_AZURE_RING_CAPTAIN, 500.0f, true)) c->CastSpell(trigger, SPELL_ARCANE_BEAM_VISUAL, true); - trigger->GetMotionMaster()->MoveChase(target, 0.1f); + trigger->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, MOTION_SLOT_ACTIVE, false, false); /// @todo: sniff speed for NPC_ARCANE_BEAM (ID: 28239) trigger->CastSpell(me, SPELL_ARCANE_BEAM_PERIODIC_DAMAGE, true); } } diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 382be4be1..8406b3527 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -218,7 +218,11 @@ public: { EncounterStatus = IN_PROGRESS; if (Creature* c = instance->GetCreature(NPC_SinclariGUID)) + { + c->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); c->AI()->Talk(SAY_SINCLARI_LEAVING); + /// @todo: Missing orientation for Sinclari's movement and "interaction" animation with the nearby crystal. + } events.RescheduleEvent(EVENT_GUARDS_FALL_BACK, 4s); } break; @@ -451,6 +455,7 @@ public: { if (Creature* c = instance->GetCreature(NPC_SinclariGUID)) { + c->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); c->AI()->Talk(SAY_SINCLARI_DOOR_LOCK); } if (Creature* c = instance->GetCreature(NPC_DoorSealGUID)) @@ -568,7 +573,13 @@ public: } // reset positions of Sinclari and Guards - if (Creature* c = instance->GetCreature(NPC_SinclariGUID)) { c->DespawnOrUnsummon(); c->SetRespawnTime(3); } + if (Creature* c = instance->GetCreature(NPC_SinclariGUID)) + { + c->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP); + c->DespawnOrUnsummon(); + c->SetRespawnTime(3); + } + for (uint8 i = 0; i < 4; ++i) if (Creature* c = instance->GetCreature(NPC_GuardGUID[i])) { diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 21fe3a013..1332cf672 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -27,16 +27,15 @@ #include "SpellScriptLoader.h" /// @todo: Missing Sinclari Trigger announcements (32204) Look at its creature_text for more info. -/// @todo: Activation Crystals (go_vh_activation_crystal) (193611) are spammable, should be a 1 time use per crystal. enum Texts { - GOSSIP_MENU_START_EVENT = 9998, - GOSSIP_MENU_ITEM = 9997, + GOSSIP_MENU_START_1 = 9997, + GOSSIP_MENU_START_2 = 9998, GOSSIP_MENU_LATE_JOIN = 10275, NPC_TEXT_SINCLARI_IN = 13853, - NPC_TEXT_SINCLARI_ITEM = 13854, + NPC_TEXT_SINCLARI_START = 13854, NPC_TEXT_SINCLARI_DONE = 13910, NPC_TEXT_SINCLARI_LATE_JOIN = 14271, }; @@ -53,7 +52,11 @@ public: bool OnGossipHello(Player* /*player*/, GameObject* go) override { if (InstanceScript* pInstance = go->GetInstanceScript()) + { pInstance->SetData(DATA_ACTIVATE_DEFENSE_SYSTEM, 1); + go->SetGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } + return true; } }; @@ -73,8 +76,7 @@ public: switch (pInstance->GetData(DATA_ENCOUNTER_STATUS)) { case NOT_STARTED: - AddGossipItemFor(player, GOSSIP_MENU_ITEM, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - AddGossipItemFor(player, GOSSIP_MENU_START_EVENT, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, GOSSIP_MENU_START_1, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); SendGossipMenuFor(player, NPC_TEXT_SINCLARI_IN, creature->GetGUID()); break; case IN_PROGRESS: @@ -94,13 +96,14 @@ public: switch (uiAction) { case GOSSIP_ACTION_INFO_DEF+1: + AddGossipItemFor(player, GOSSIP_MENU_START_2, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, NPC_TEXT_SINCLARI_START, creature->GetGUID()); + break; + case GOSSIP_ACTION_INFO_DEF+2: CloseGossipMenuFor(player); if (InstanceScript* pInstance = creature->GetInstanceScript()) pInstance->SetData(DATA_START_INSTANCE, 1); break; - case GOSSIP_ACTION_INFO_DEF+2: - SendGossipMenuFor(player, NPC_TEXT_SINCLARI_ITEM, creature->GetGUID()); - break; case GOSSIP_ACTION_INFO_DEF+3: player->NearTeleportTo(playerTeleportPosition.GetPositionX(), playerTeleportPosition.GetPositionY(), playerTeleportPosition.GetPositionZ(), playerTeleportPosition.GetOrientation(), true); CloseGossipMenuFor(player); diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 1ae98dba7..48a6cf03c 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -2131,9 +2131,31 @@ public: } }; +enum WaterTerror +{ + SPELL_WATER_TERROR_FROST_NOVA = 57668 +}; + +// 57652 - Crashing Wave +class spell_crashing_wave : public SpellScript +{ + PrepareSpellScript(spell_crashing_wave); + + void RecalculateDamage() + { + if (Unit* target = GetHitUnit()) + if (target->HasAura(SPELL_WATER_TERROR_FROST_NOVA)) + SetHitDamage(GetHitDamage() * 2); + } + + void Register() override + { + OnHit += SpellHitFn(spell_crashing_wave::RecalculateDamage); + } +}; + void AddSC_icecrown() { - // Ours new npc_black_knight_graveyard(); new npc_battle_at_valhalas(); new npc_llod_generic(); @@ -2147,10 +2169,9 @@ void AddSC_icecrown() new npc_infra_green_bomber_generic(); RegisterSpellScript(spell_onslaught_or_call_bone_gryphon); RegisterSpellScript(spell_deliver_gryphon); - - // Theirs new npc_guardian_pavilion(); new npc_tournament_training_dummy(); new npc_blessed_banner(); new npc_frostbrood_skytalon(); + RegisterSpellScript(spell_crashing_wave); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index 095fbf423..dab0d0590 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -346,7 +346,7 @@ struct boss_alar : public BossAI scheduler.Schedule(timer, GROUP_FLAME_BUFFET, [this](TaskContext context) { if (!me->SelectNearestTarget(me->GetCombatReach()) && !me->isMoving()) - DoCastVictim(SPELL_FLAME_BUFFET); + DoCastAOE(SPELL_FLAME_BUFFET); context.Repeat(2s); }); @@ -372,11 +372,11 @@ struct boss_alar : public BossAI { _transitionScheduler.Update(diff); + scheduler.Update(diff); + if (!UpdateVictim()) return; - scheduler.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) return; diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index ba882e45b..46e9e9ca9 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -152,7 +152,7 @@ class spell_sha_totemic_mastery : public AuraScript { PreventDefaultAction(); - for (uint8 i = SUMMON_SLOT_TOTEM; i < MAX_TOTEM_SLOT; ++i) + for (uint8 i = SUMMON_SLOT_TOTEM_FIRE; i < MAX_TOTEM_SLOT; ++i) if (!GetTarget()->m_SummonSlot[i]) return; diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 22c830ae2..0df2a73f1 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -3306,6 +3306,22 @@ enum SummonType SUMMON_TYPE_JEEVES = 12 }; +enum SummonSlot +{ + SUMMON_SLOT_PET = 0, + SUMMON_SLOT_TOTEM_FIRE = 1, + SUMMON_SLOT_TOTEM_EARTH = 2, + SUMMON_SLOT_TOTEM_WATER = 3, + SUMMON_SLOT_TOTEM_AIR = 4, + SUMMON_SLOT_MINIPET = 5, + SUMMON_SLOT_QUEST = 6, + + MAX_SUMMON_SLOT +}; + +#define MAX_TOTEM_SLOT 5 +#define MAX_GAMEOBJECT_SLOT 4 + enum EventId { EVENT_CHARGE = 1003,