diff --git a/data/sql/updates/db_world/2025_03_22_00.sql b/data/sql/updates/db_world/2025_03_22_00.sql new file mode 100644 index 000000000..05fa260eb --- /dev/null +++ b/data/sql/updates/db_world/2025_03_22_00.sql @@ -0,0 +1,51 @@ +-- DB update 2025_03_21_00 -> 2025_03_22_00 +-- +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` IN (45635, 45635, 45635, 45635, 45635, 45635, 45623, 45635, 45623, 45635, 45633, 45633, 45633, 45622, 45633, 45633, 45633, 45622, 45633, 45633, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45586, 45585, 45586, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585, 45585)) AND (`SourceId` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 23472) AND (`ConditionValue3` IN (54796, 54792, 54788, 54785, 54781, 54777, 54774, 54774, 54794, 54794, 54773, 54789, 54602, 54798, 54798, 54790, 54808, 54608, 54608, 54772, 54800, 54603, 54795, 54597, 54782, 54793, 54804, 54802, 54783, 54783, 54435, 54435, 54797, 54775, 54779, 54769, 54593, 54806, 54778, 54595, 54776, 54801, 54771, 54623, 54791, 54784, 54770)); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 45585, 0, 0, 31, 0, 3, 23472, 54435, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 1, 31, 0, 3, 23472, 54593, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 2, 31, 0, 3, 23472, 54595, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 3, 31, 0, 3, 23472, 54597, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 4, 31, 0, 3, 23472, 54603, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 5, 31, 0, 3, 23472, 54623, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 6, 31, 0, 3, 23472, 54769, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 7, 31, 0, 3, 23472, 54770, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 8, 31, 0, 3, 23472, 54771, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 9, 31, 0, 3, 23472, 54775, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 10, 31, 0, 3, 23472, 54776, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 11, 31, 0, 3, 23472, 54778, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 12, 31, 0, 3, 23472, 54779, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 13, 31, 0, 3, 23472, 54782, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 14, 31, 0, 3, 23472, 54783, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 15, 31, 0, 3, 23472, 54784, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 16, 31, 0, 3, 23472, 54791, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 17, 31, 0, 3, 23472, 54793, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 18, 31, 0, 3, 23472, 54795, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 19, 31, 0, 3, 23472, 54797, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 20, 31, 0, 3, 23472, 54800, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 21, 31, 0, 3, 23472, 54801, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 22, 31, 0, 3, 23472, 54802, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 23, 31, 0, 3, 23472, 54804, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45585, 0, 24, 31, 0, 3, 23472, 54806, 0, 0, 0, '', 'Felmyst - Strafe (Top) - target World Trigger '), +(13, 1, 45586, 0, 0, 31, 0, 3, 23472, 54435, 0, 0, 0, '', 'Felmyst - Strafe (Trigger Top) - target World Trigger '), +(13, 1, 45586, 0, 1, 31, 0, 3, 23472, 54783, 0, 0, 0, '', 'Felmyst - Strafe (Trigger Top) - target World Trigger '), +(13, 1, 45622, 0, 0, 31, 0, 3, 23472, 54608, 0, 0, 0, '', 'Felmyst - Strafe (Trigger Middle) - target World Trigger '), +(13, 1, 45622, 0, 1, 31, 0, 3, 23472, 54798, 0, 0, 0, '', 'Felmyst - Strafe (Trigger Middle) - target World Trigger '), +(13, 1, 45623, 0, 0, 31, 0, 3, 23472, 54774, 0, 0, 0, '', 'Felmyst - Strafe (Trigger Bottom) - target World Trigger '), +(13, 1, 45623, 0, 1, 31, 0, 3, 23472, 54794, 0, 0, 0, '', 'Felmyst - Strafe (Trigger Bottom) - target World Trigger '), +(13, 1, 45633, 0, 0, 31, 0, 3, 23472, 54602, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 1, 31, 0, 3, 23472, 54608, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 2, 31, 0, 3, 23472, 54772, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 3, 31, 0, 3, 23472, 54773, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 4, 31, 0, 3, 23472, 54789, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 5, 31, 0, 3, 23472, 54790, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 6, 31, 0, 3, 23472, 54798, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45633, 0, 7, 31, 0, 3, 23472, 54808, 0, 0, 0, '', 'Felmyst - Strafe (Middle) - target World Trigger '), +(13, 1, 45635, 0, 0, 31, 0, 3, 23472, 54774, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 1, 31, 0, 3, 23472, 54777, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 2, 31, 0, 3, 23472, 54781, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 3, 31, 0, 3, 23472, 54785, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 4, 31, 0, 3, 23472, 54788, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 5, 31, 0, 3, 23472, 54792, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 6, 31, 0, 3, 23472, 54794, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '), +(13, 1, 45635, 0, 7, 31, 0, 3, 23472, 54796, 0, 0, 0, '', 'Felmyst - Strafe (Bottom) - target World Trigger '); diff --git a/data/sql/updates/db_world/2025_03_22_01.sql b/data/sql/updates/db_world/2025_03_22_01.sql new file mode 100644 index 000000000..87951d909 --- /dev/null +++ b/data/sql/updates/db_world/2025_03_22_01.sql @@ -0,0 +1,21 @@ +-- DB update 2025_03_22_00 -> 2025_03_22_01 + +-- Pack after Eredar Twins +DELETE FROM `creature_formations` WHERE `leaderGUID` = 47607; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(47607, 47607, 0, 0, 3, 0, 0), +(47607, 47313, 0, 0, 3, 0, 0), +(47607, 47471, 0, 0, 3, 0, 0), +(47607, 47768, 0, 0, 3, 0, 0), +(47607, 47608, 0, 0, 3, 0, 0), +(47607, 47769, 0, 0, 3, 0, 0); + +-- Pack before M'uru +DELETE FROM `creature_formations` WHERE `leaderGUID` = 47470; +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(47470, 47470, 0, 0, 3, 0, 0), +(47470, 47475, 0, 0, 3, 0, 0), +(47470, 47578, 0, 0, 3, 0, 0), +(47470, 47875, 0, 0, 3, 0, 0), +(47470, 47897, 0, 0, 3, 0, 0), +(47470, 47884, 0, 0, 3, 0, 0); diff --git a/data/sql/updates/db_world/2025_03_22_02.sql b/data/sql/updates/db_world/2025_03_22_02.sql new file mode 100644 index 000000000..5f8fca51d --- /dev/null +++ b/data/sql/updates/db_world/2025_03_22_02.sql @@ -0,0 +1,15 @@ +-- DB update 2025_03_22_01 -> 2025_03_22_02 + +-- Update Comments and row 7 added. +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 25744; + +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 25744); +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 +(25744, 0, 0, 1, 37, 0, 100, 512, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - On Initialize - Set Reactstate Passive'), +(25744, 0, 1, 2, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 11, 45934, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - On Initialize - Cast \'Dark Fiend\''), +(25744, 0, 2, 3, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 11, 45936, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - On Initialize - Cast \'Dark Fiend\''), +(25744, 0, 3, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 42, 1, 100, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - On Initialize - Set Invincibility Hp 1'), +(25744, 0, 4, 0, 60, 0, 100, 1, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 50, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - On Update - Start Attacking (No Repeat)'), +(25744, 0, 5, 6, 9, 0, 100, 1, 0, 0, 0, 0, 0, 4, 11, 45944, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - Within 0-4 Range - Cast \'Dark Fiend\' (No Repeat)'), +(25744, 0, 6, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - Within 0-0 Range - Despawn Instant (No Repeat)'), +(25744, 0, 7, 0, 23, 0, 100, 512, 45934, 0, 500, 500, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Dark Fiend - On Aura \'Dark Fiend\' - Despawn Instant'); diff --git a/data/sql/updates/db_world/2025_03_24_00.sql b/data/sql/updates/db_world/2025_03_24_00.sql new file mode 100644 index 000000000..03dacdb67 --- /dev/null +++ b/data/sql/updates/db_world/2025_03_24_00.sql @@ -0,0 +1,3 @@ +-- DB update 2025_03_22_02 -> 2025_03_24_00 +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra` &~2147483648 WHERE `entry` = 25315; diff --git a/data/sql/updates/db_world/2025_03_25_00.sql b/data/sql/updates/db_world/2025_03_25_00.sql new file mode 100644 index 000000000..4f51db812 --- /dev/null +++ b/data/sql/updates/db_world/2025_03_25_00.sql @@ -0,0 +1,4 @@ +-- DB update 2025_03_24_00 -> 2025_03_25_00 + +-- Taunt Immune +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|256 WHERE `entry` IN (25166, 25165); diff --git a/data/sql/updates/db_world/2025_03_25_01.sql b/data/sql/updates/db_world/2025_03_25_01.sql new file mode 100644 index 000000000..60fe56251 --- /dev/null +++ b/data/sql/updates/db_world/2025_03_25_01.sql @@ -0,0 +1,9 @@ +-- DB update 2025_03_25_00 -> 2025_03_25_01 +-- Update Alumeth the Ascended 32300 to repeat around psychicscream ~20 sec +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 32300; +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 32300); +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 +(32300, 0, 0, 0, 0, 0, 100, 0, 8000, 9000, 8000, 9000, 0, 0, 11, 60472, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended - In Combat - Cast \'Mind Flay\''), +(32300, 0, 1, 0, 0, 0, 100, 0, 8000, 10000, 18000, 22000, 0, 0, 11, 34322, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended - In Combat - Cast \'Psychic Scream\''), +(32300, 0, 2, 0, 0, 0, 100, 0, 9000, 12000, 9000, 12000, 0, 0, 11, 37978, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended - In Combat - Cast \'Renew\''), +(32300, 0, 3, 0, 0, 0, 100, 0, 7000, 10000, 7000, 10000, 0, 0, 11, 34942, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Alumeth the Ascended - In Combat - Cast \'Shadow Word: Pain\''); diff --git a/data/sql/updates/db_world/2025_03_27_00.sql b/data/sql/updates/db_world/2025_03_27_00.sql new file mode 100644 index 000000000..abd85d26f --- /dev/null +++ b/data/sql/updates/db_world/2025_03_27_00.sql @@ -0,0 +1,4 @@ +-- DB update 2025_03_25_01 -> 2025_03_27_00 + +-- Add Hard Reset Extra Flag +UPDATE `creature_template` SET `flags_extra` = `flags_extra`|2147483648 WHERE `entry` IN (25741); diff --git a/data/sql/updates/db_world/2025_03_27_01.sql b/data/sql/updates/db_world/2025_03_27_01.sql new file mode 100644 index 000000000..19e1c7cc7 --- /dev/null +++ b/data/sql/updates/db_world/2025_03_27_01.sql @@ -0,0 +1,3 @@ +-- DB update 2025_03_27_00 -> 2025_03_27_01 +-- Set Kirtonos the Herald level to 60 +UPDATE `creature_template` SET `minlevel` = 60, `maxlevel` = 60 WHERE (`entry` = 10506); diff --git a/data/sql/updates/db_world/2025_03_28_00.sql b/data/sql/updates/db_world/2025_03_28_00.sql new file mode 100644 index 000000000..299c6806f --- /dev/null +++ b/data/sql/updates/db_world/2025_03_28_00.sql @@ -0,0 +1,6 @@ +-- DB update 2025_03_27_01 -> 2025_03_28_00 + +-- Add Condition to use Scarlet Cannons +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 18) AND (`SourceGroup` = 28833) AND (`SourceEntry` = 52447) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 9) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 12701) AND (`ConditionValue2` = 0) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(18, 28833, 52447, 0, 0, 9, 0, 12701, 0, 0, 0, 0, 0, '', 'Scarlet Cannon spellclick require Massacre at Light’s Point quest taken'); diff --git a/data/sql/updates/db_world/2025_03_29_00.sql b/data/sql/updates/db_world/2025_03_29_00.sql new file mode 100644 index 000000000..4291d638c --- /dev/null +++ b/data/sql/updates/db_world/2025_03_29_00.sql @@ -0,0 +1,3 @@ +-- DB update 2025_03_28_00 -> 2025_03_29_00 +-- Matches the Heroic Faction to the base brann, Adds "Brann Bronzebeard" (1) [Heroic] to Heroic Version | 32'052 => 40'065 HP +UPDATE `creature_template` SET `faction` = 1665, `difficulty_entry_1` = 31366 WHERE (`entry` = 28070); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b079dbf83..38d36ac94 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -20474,10 +20474,10 @@ void Unit::PetSpellFail(SpellInfo const* spellInfo, Unit* target, uint32 result) } } -int32 Unit::CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, Unit* caster) const +int32 Unit::CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, bool npcCaster) const { damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask)); - if (caster && caster->IsCreature()) + if (npcCaster) damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE, schoolMask)); return damage; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 812b5d392..8e91a002c 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1187,7 +1187,7 @@ public: uint32 SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack = 1); // AOE damages - int32 CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, Unit* caster) const; + int32 CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, bool npcCaster) const; // Armor reduction static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const* spellInfo = nullptr, uint8 effIndex = MAX_SPELL_EFFECTS); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 033891ee3..050647311 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6692,9 +6692,17 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const damage = Unit::SpellCriticalDamageBonus(caster, m_spellInfo, damage, target); // Auras reducing damage from AOE spells - if (GetSpellInfo()->Effects[GetEffIndex()].IsAreaAuraEffect() || GetSpellInfo()->Effects[GetEffIndex()].IsTargetingArea() || GetSpellInfo()->Effects[GetEffIndex()].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA) // some persistent area auras have targets like A=53 B=28 + if (!GetSpellInfo()->HasAttribute(SPELL_ATTR4_IGNORE_DAMAGE_TAKEN_MODIFIERS)) { - damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, caster); + if (GetSpellInfo()->Effects[GetEffIndex()].IsAreaAuraEffect() || + GetSpellInfo()->Effects[GetEffIndex()].IsTargetingArea() || + GetSpellInfo()->Effects[GetEffIndex()].Effect == SPELL_EFFECT_PERSISTENT_AREA_AURA || // some persistent area auras have targets like A=53 B=28 + GetSpellInfo()->HasAttribute(SPELL_ATTR5_TREAT_AS_AREA_EFFECT) || + GetSpellInfo()->HasAttribute(SPELL_ATTR7_TREAT_AS_NPC_AOE)) + { + bool npcCaster = (caster && !caster->IsControlledByPlayer()) || GetSpellInfo()->HasAttribute(SPELL_ATTR7_TREAT_AS_NPC_AOE); + damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, npcCaster); + } } int32 dmg = damage; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 11ca29a07..7cfa77b15 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -8352,7 +8352,8 @@ void Spell::DoAllEffectOnLaunchTarget(TargetInfo& targetInfo, float* multiplier) // Xinef: Area Auras, AoE Targetting spells AND Chain Target spells (cleave etc.) if (m_spellInfo->Effects[i].IsAreaAuraEffect() || m_spellInfo->Effects[i].IsTargetingArea() || (m_spellInfo->Effects[i].ChainTarget > 1 && m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MAGIC)) { - m_damage = unit->CalculateAOEDamageReduction(m_damage, m_spellInfo->SchoolMask, m_caster); + bool npcCaster = (m_caster && !m_caster->IsControlledByPlayer()) || GetSpellInfo()->HasAttribute(SPELL_ATTR7_TREAT_AS_NPC_AOE); + m_damage = unit->CalculateAOEDamageReduction(m_damage, m_spellInfo->SchoolMask, npcCaster); if (m_caster->IsPlayer()) { uint32 targetAmount = m_UniqueTargetInfo.size(); diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 1252b05b0..7e9af691b 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -4885,6 +4885,25 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_2].TargetA = SpellImplicitTargetInfo(TARGET_UNIT_TARGET_ENEMY); }); + // Felmyst Strafe (Top) + ApplySpellFix({ 45585 }, [](SpellInfo* spellInfo) + { + spellInfo->MaxAffectedTargets = 3; + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_70_YARDS); + }); + + // Felmyst Strafe (Middle, Bottom) + ApplySpellFix({ 45633, 45635 }, [](SpellInfo* spellInfo) + { + spellInfo->Effects[EFFECT_0].RadiusEntry = sSpellRadiusStore.LookupEntry(EFFECT_RADIUS_70_YARDS); + }); + + // Encapsulate + ApplySpellFix({ 45662 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx7 |= SPELL_ATTR7_TREAT_AS_NPC_AOE; + }); + for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) { SpellInfo* spellInfo = mSpellInfoMap[i]; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 4bf78c4ab..880a374a2 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -50,6 +50,7 @@ enum Spells SPELL_ENRAGE = 46587, SPELL_EMPOWER = 45366, SPELL_DARK_FLAME = 45345, + SPELL_FIREBLAST = 45232, //Lady Sacrolash spells SPELL_SHADOWFORM = 45455, @@ -78,6 +79,21 @@ struct boss_sacrolash : public BossAI { boss_sacrolash(Creature* creature) : BossAI(creature, DATA_EREDAR_TWINS), _isSisterDead(false) {} + bool CheckInRoom() override + { + if (me->GetExactDist2d(me->GetHomePosition()) >= 50.f) + { + DoCastAOE(SPELL_FIREBLAST, true); + + if (Creature* alythess = instance->GetCreature(DATA_ALYTHESS)) + alythess->AI()->DoCastAOE(SPELL_FIREBLAST, true); + + return false; + } + + return true; + } + void Reset() override { DoCastSelf(SPELL_SHADOWFORM, true); @@ -104,7 +120,11 @@ struct boss_sacrolash : public BossAI Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 100.0f); if (!target) target = me->GetVictim(); - me->CastSpell(target, SPELL_CONFLAGRATION, false); + + DoCast(target, SPELL_CONFLAGRATION); + + if (Creature* alythess = instance->GetCreature(DATA_ALYTHESS)) + alythess->AI()->Talk(EMOTE_CONFLAGRATION, target); }, 30s, 35s); } } @@ -190,6 +210,13 @@ struct boss_alythess : public BossAI sacrolash->Respawn(true); } + void AttackStart(Unit* who) override + { + if (who && who->isTargetableForAttack() && me->GetReactState() != REACT_PASSIVE) + if (me->Attack(who, false)) + me->AddThreat(who, 0.0f); + } + void DoAction(int32 param) override { if (param == ACTION_SISTER_DIED) @@ -200,12 +227,16 @@ struct boss_alythess : public BossAI me->CastSpell(me, SPELL_EMPOWER, true); scheduler.CancelGroup(GROUP_SPECIAL_ABILITY); - ScheduleTimedEvent(20s, [&] { + ScheduleTimedEvent(20s, 26s, [&] { Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 100.0f); if (!target) target = me->GetVictim(); DoCast(target, SPELL_SHADOW_NOVA); - }, 30s, 35s); + + if (Creature * sacrolash = instance->GetCreature(DATA_SACROLASH)) + sacrolash->AI()->Talk(EMOTE_SHADOW_NOVA, target); + + }, 20s, 26s); } } @@ -226,9 +257,9 @@ struct boss_alythess : public BossAI DoCastSelf(SPELL_PYROGENICS); }, 15s); - ScheduleTimedEvent(20s, [&] { - me->CastCustomSpell(SPELL_FLAME_SEAR, SPELLVALUE_MAX_TARGETS, 5, me, TRIGGERED_NONE); - }, 15s); + ScheduleTimedEvent(10s, 15s, [&] { + me->CastCustomSpell(SPELL_FLAME_SEAR, SPELLVALUE_MAX_TARGETS, urand(4, 5), me, TRIGGERED_NONE); + }, 10s, 15s); scheduler.Schedule(20s, GROUP_SPECIAL_ABILITY, [this](TaskContext context) { Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 100.0f); diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index 00e91d584..6bdfaaff4 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -49,6 +49,12 @@ enum Spells SPELL_ENCAPSULATE_CHANNEL = 45661, //Flight phase + SPELL_TRIGGER_TOP_STRAFE = 45586, + SPELL_TRIGGER_MIDDLE_STRAFE = 45622, + SPELL_TRIGGER_BOTTOM_STRAFE = 45623, + SPELL_STRAFE_TOP = 45585, + SPELL_STRAFE_MIDDLE = 45633, + SPELL_STRAFE_BOTTOM = 45635, SPELL_SUMMON_DEMONIC_VAPOR = 45391, SPELL_DEMONIC_VAPOR_SPAWN_TRIGGER = 45388, // Triggers visual beam SPELL_DEMONIC_VAPOR_PERIODIC = 45411, // Spawns cloud and deals damage @@ -110,18 +116,17 @@ public: bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override { - std::list creatureList; - _caster->GetCreaturesWithEntryInRange(creatureList, 70.0f, NPC_FOG_TRIGGER); - for (auto const& creature : creatureList) + switch (_currentLane) { - if (_caster->GetExactDist2d(creature) <= 11.0f) - { - creature->CastSpell(creature, SPELL_FOG_OF_CORRUPTION, true); - continue; - } - - if (!_currentLane && creature->GetPositionX() > 1510.0f) - creature->CastSpell(creature, SPELL_FOG_OF_CORRUPTION, true); + case 0: // top + _caster->CastSpell(_caster, SPELL_STRAFE_TOP, true); + break; + case 1: // middle + _caster->CastSpell(_caster, SPELL_STRAFE_MIDDLE, true); + break; + case 2: // bottom + _caster->CastSpell(_caster, SPELL_STRAFE_BOTTOM, true); + break; } return true; } @@ -183,6 +188,12 @@ struct boss_felmyst : public BossAI Talk(YELL_KILL); } + void SpellHitTarget(Unit* target, const SpellInfo* spell) override + { + if (spell->Id == SPELL_STRAFE_TOP || spell->Id == SPELL_STRAFE_MIDDLE || spell->Id == SPELL_STRAFE_BOTTOM) + target->CastSpell(target, SPELL_FOG_OF_CORRUPTION, true); + } + void JustDied(Unit* killer) override { BossAI::JustDied(killer); @@ -297,15 +308,8 @@ struct boss_felmyst : public BossAI case POINT_LANE: Talk(EMOTE_BREATH); me->m_Events.AddEventAtOffset([&] { - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(0)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(500)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(1000)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(1500)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(2000)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(2500)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(3000)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(3500)); - me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(4000)); + for (uint8 i = 0; i < 16; ++i) + me->m_Events.AddEvent(new CorruptTriggers(me, _currentLane), me->m_Events.CalculateTime(i*250)); }, 5s); me->m_Events.AddEventAtOffset([&] { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index cd2ab0e1a..0fbfb4b8c 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -450,6 +450,7 @@ struct boss_kiljaeden : public BossAI if (me->GetReactState() == REACT_PASSIVE) return; ScriptedAI::EnterEvadeMode(why); + me->DespawnOrUnsummon(); } void AttackStart(Unit* who) override diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index 7638efe9a..df02db644 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -293,7 +293,7 @@ class spell_entropius_void_zone_visual_aura : public AuraScript void Register() override { OnEffectApply += AuraEffectApplyFn(spell_entropius_void_zone_visual_aura::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_entropius_void_zone_visual_aura::HandleApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_entropius_void_zone_visual_aura::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 3222df8df..55600e04e 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -319,7 +319,7 @@ class spell_dk_death_and_decay : public SpellScript // Xinef: include AOE damage reducing auras if (target) - damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, caster); + damage = target->CalculateAOEDamageReduction(damage, GetSpellInfo()->SchoolMask, false); SetHitDamage(damage); } diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 7b1a4122c..22c830ae2 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -664,7 +664,7 @@ enum SpellAttr7 : uint32 SPELL_ATTR7_NO_ATTACK_DODGE = 0x00800000, // TITLE Spell cannot be dodged 23@Attr7 DESCRIPTION Motivate, Mutilate, Shattering Throw SPELL_ATTR7_NO_ATTACK_PARRY = 0x01000000, // TITLE Spell cannot be parried 24@Attr7 DESCRIPTION Motivate, Mutilate, Perform Speech, Shattering Throw SPELL_ATTR7_NO_ATTACK_MISS = 0x02000000, // TITLE Spell cannot be missed 25@Attr7 - SPELL_ATTR7_TREAT_AS_NPC_AOE = 0x04000000, // TITLE Unknown attribute 26@Attr7 + SPELL_ATTR7_TREAT_AS_NPC_AOE = 0x04000000, // TITLE Treat as NPC AoE SPELL_ATTR7_BYPASS_NO_RESURRECTION_AURA = 0x08000000, // TITLE Bypasses the prevent resurrection aura SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD = 0x10000000, // TITLE Consolidate in raid buff frame (client only) SPELL_ATTR7_REFLECTION_ONLY_DEFENDS = 0x20000000, // TITLE Unknown attribute 29@Attr7 DESCRIPTION only 69028, 71237 diff --git a/src/server/shared/enuminfo_SharedDefines.cpp b/src/server/shared/enuminfo_SharedDefines.cpp index f8009d6b3..db0951816 100644 --- a/src/server/shared/enuminfo_SharedDefines.cpp +++ b/src/server/shared/enuminfo_SharedDefines.cpp @@ -1087,7 +1087,7 @@ AC_API_EXPORT EnumText EnumUtils::ToString(SpellAttr7 value) case SPELL_ATTR7_NO_ATTACK_DODGE: return { "SPELL_ATTR7_NO_ATTACK_DODGE", "Spell cannot be dodged 23@Attr7", "Motivate, Mutilate, Shattering Throw" }; case SPELL_ATTR7_NO_ATTACK_PARRY: return { "SPELL_ATTR7_NO_ATTACK_PARRY", "Spell cannot be parried 24@Attr7", "Motivate, Mutilate, Perform Speech, Shattering Throw" }; case SPELL_ATTR7_NO_ATTACK_MISS: return { "SPELL_ATTR7_NO_ATTACK_MISS", "Spell cannot be missed 25@Attr7", "" }; - case SPELL_ATTR7_TREAT_AS_NPC_AOE: return { "SPELL_ATTR7_TREAT_AS_NPC_AOE", "Unknown attribute 26@Attr7", "" }; + case SPELL_ATTR7_TREAT_AS_NPC_AOE: return { "SPELL_ATTR7_TREAT_AS_NPC_AOE", "Treat as NPC AoE", "" }; case SPELL_ATTR7_BYPASS_NO_RESURRECTION_AURA: return { "SPELL_ATTR7_BYPASS_NO_RESURRECTION_AURA", "Bypasses the prevent resurrection aura", "" }; case SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD: return { "SPELL_ATTR7_DO_NOT_COUNT_FOR_PVP_SCOREBOARD", "Consolidate in raid buff frame (client only)", "" }; case SPELL_ATTR7_REFLECTION_ONLY_DEFENDS: return { "SPELL_ATTR7_REFLECTION_ONLY_DEFENDS", "Unknown attribute 29@Attr7", "only 69028, 71237" };