aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2025_10_03_00_world.sql103
-rw-r--r--sql/updates/world/master/2025_10_04_00_world.sql398
-rw-r--r--sql/updates/world/master/2025_10_04_01_world.sql76
-rw-r--r--src/server/game/AI/CreatureAI.h7
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp4
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h8
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp34
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h9
-rw-r--r--src/server/game/Chat/Chat.cpp3
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp2
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp10
-rw-r--r--src/server/game/Entities/Player/Player.cpp66
-rw-r--r--src/server/game/Entities/Player/Player.h9
-rw-r--r--src/server/game/Groups/Group.cpp2
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp12
-rw-r--r--src/server/game/Maps/MapScripts.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp14
-rw-r--r--src/server/scripts/Battlegrounds/CageOfCarnage/arena_cage_of_carnage.cpp332
-rw-r--r--src/server/scripts/Battlegrounds/battlegrounds_script_loader.cpp4
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp16
-rw-r--r--src/server/scripts/EasternKingdoms/Gilneas/gilneas_chapter_1.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_shade_of_medivh.cpp868
-rw-r--r--src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h4
-rw-r--r--src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp2
-rw-r--r--src/server/scripts/KhazAlgar/CityOfThreads/boss_orator_krix_vizk.cpp525
-rw-r--r--src/server/scripts/KhazAlgar/CityOfThreads/city_of_threads.h61
-rw-r--r--src/server/scripts/KhazAlgar/CityOfThreads/instance_city_of_threads.cpp66
-rw-r--r--src/server/scripts/KhazAlgar/khaz_algar_script_loader.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp10
34 files changed, 2629 insertions, 69 deletions
diff --git a/sql/updates/world/master/2025_10_03_00_world.sql b/sql/updates/world/master/2025_10_03_00_world.sql
new file mode 100644
index 00000000000..b33763cacc3
--- /dev/null
+++ b/sql/updates/world/master/2025_10_03_00_world.sql
@@ -0,0 +1,103 @@
+SET @ATSPAWNID := 266;
+SET @ATPROPERTIESID := 163;
+SET @ATID := 169;
+SET @CGUID := 10006844;
+
+-- Creature
+UPDATE `creature_template_difficulty` SET `ContentTuningID`=2722, `VerifiedBuild`=57388 WHERE (`Entry`=216619 AND `DifficultyID`=0); -- 216619 (Orator Krix'vizk) - CanSwim
+UPDATE `creature_template_addon` SET `auras`='422356' WHERE `entry`=216619;
+UPDATE `creature_template` SET `ScriptName`='boss_orator_krix_vizk' WHERE `entry`=216619;
+UPDATE `creature_template` SET `faction`=35, `BaseAttackTime`=2000, `unit_flags`=0x2000000, `unit_flags2`=0x800, `unit_flags3`=0x41000001 WHERE `entry`=220769; -- Orator Krix'vizk
+
+DELETE FROM `creature` WHERE `guid` = @CGUID+0;
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`) VALUES
+(@CGUID+0, 220769, 2669, 14979, 15111, '1,2,23,8,205', '0', 0, 0, 0, -1857.5416259765625, -1155.314208984375, -1244.12255859375, 0.737591743469238281, 7200, 0, 0, 0, NULL, NULL, NULL, NULL, 57388); -- Orator Krix'vizk (Area: Umbral Bazaar - Difficulty: Mythic) CreateObject1
+
+DELETE FROM `creature_template_difficulty` WHERE (`DifficultyID`=23 AND `Entry` = 220769);
+INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `LevelScalingDeltaMin`, `LevelScalingDeltaMax`, `ContentTuningID`, `StaticFlags1`, `StaticFlags2`, `StaticFlags3`, `StaticFlags4`, `StaticFlags5`, `StaticFlags6`, `StaticFlags7`, `StaticFlags8`, `VerifiedBuild`) VALUES
+(220769, 23, 0, 0, 1279, 0x20000100, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 57388); -- 220769 (Orator Krix'vizk) - Sessile, Floating
+
+-- Instance
+DELETE FROM `instance_template` WHERE `map`=2669;
+INSERT INTO `instance_template` (`map`, `parent`, `script`) VALUES
+(2669, 0, 'instance_city_of_threads');
+
+DELETE FROM `areatrigger_template` WHERE (`IsCustom`=0 AND `Id` IN (34764, 35433, 34738));
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `VerifiedBuild`) VALUES
+(34764, 0, 0, 57388),
+(35433, 0, 0, 58238),
+(34738, 0, 0, 57292);
+
+DELETE FROM `areatrigger_template_actions` WHERE `AreaTriggerId`=35803 AND `IsCustom`=0;
+INSERT INTO `areatrigger_template_actions` (`AreaTriggerId`, `IsCustom`, `ActionType`, `ActionParam`, `TargetType`) VALUES
+(35803, 0, 0, 449122, 0);
+
+DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (31997, 32026));
+INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
+(32026, 0, 34764, 0, 2, 0, 0, 0, 0, -1, 0, 82, NULL, 6000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 'at_orator_krix_vizk_lingering_influence', 58238), -- Spell: 434923 (Lingering Influence)
+(31997, 0, 34738, 0, 4, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 5, 10, 10, 80, 80, 30, 30, 10, 10, 'at_orator_krix_vizk_chains_of_oppression', 58238); -- Spell: 434691 (Chains of Oppression)
+
+DELETE FROM `areatrigger_template` WHERE `Id` BETWEEN @ATID+0 AND @ATID+1;
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`, `VerifiedBuild`) VALUES
+(@ATID+0, 1, 1, 0, 0, 0),
+(@ATID+1, 1, 1, 0, 0, 0);
+
+DELETE FROM `areatrigger` WHERE `SpawnId` BETWEEN @ATSPAWNID+0 AND @ATSPAWNID+2;
+INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
+(@ATSPAWNID+0, @ATPROPERTIESID+0, 1, 2669, '1,2,8,23', -1691.11, -903.29, -1249.49, 1.498532, 0, 0, 0, 'at_orator_conversation_intro_1', 'City of Threads - Orator Krixvizk Conversation 1', 56647),
+(@ATSPAWNID+1, @ATPROPERTIESID+1, 1, 2669, '1,2,8,23', -1790.64, -1026.74, -1243.88, 1.247988, 0, 0, 0, 'at_orator_conversation_intro_2', 'City of Threads - Orator Krixvizk Conversation 2', 56647),
+(@ATSPAWNID+2, @ATPROPERTIESID+0, 1, 2669, '1,2,8,23', -1826.44, -1082.34, -1244.16, 1.094052, 0, 0, 0, 'at_orator_conversation_intro_3', 'City of Threads - Orator Krixvizk Conversation 3', 56647);
+
+DELETE FROM `areatrigger_create_properties` WHERE `Id` BETWEEN @ATPROPERTIESID+0 AND @ATPROPERTIESID+2;
+INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
+(@ATPROPERTIESID+0, 1, @ATID+0, 1, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 1, 10, 50, 5, 10, 50, 5, 0, 0, '', 0),
+(@ATPROPERTIESID+1, 1, @ATID+1, 1, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 0, 50, 50, 0, 0, 0, 0, 0, 0, '', 0),
+(@ATPROPERTIESID+2, 1, 35433, 0, 16, 0, 0, 0, 0, -1, 0, 601, 443437, 30000, 12, 0, 1, 1, 0, 0, 0, 0, 0, 0, 'at_orator_krix_vizk_doubt', 58238); -- SpellForVisuals: 443437 (Shadows of Doubt)
+
+-- Jumpcharge Parameters
+DELETE FROM `jump_charge_params` WHERE `id`=959;
+INSERT INTO `jump_charge_params` (`id`, `speed`, `treatSpeedAsMoveTimeSeconds`, `jumpGravity`, `spellVisualId`, `progressCurveId`, `parabolicCurveId`) VALUES
+(959, 35, 0, 56.1096, NULL, NULL, NULL);
+
+-- Conversations
+DELETE FROM `conversation_actors` WHERE (`Idx`=0 AND `ConversationId` IN (24642, 24643, 24644));
+INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
+(24644, 51642, 0, 216619, 116692, 0, 0, 57388),
+(24642, 51642, 0, 220769, 116692, 0, 0, 57388),
+(24643, 51642, 0, 216619, 116692, 0, 0, 57388);
+
+DELETE FROM `conversation_template` WHERE `Id` IN (24642, 24643, 24644);
+INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
+(24644, 67092, 0, 57388),
+(24643, 67091, 0, 57388),
+(24642, 67085, 0, 57388);
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (67085, 67091, 67092);
+INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
+(67092, 1751, 0, 0, 0, 57388),
+(67091, 1751, 0, 0, 0, 57388),
+(67085, 1751, 0, 0, 0, 57388);
+
+-- Spells
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (440310, 448560, 434808, 448561, 434829);
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(440310, 'spell_orator_krix_vizk_chains_of_oppression_periodic'),
+(448560, 'spell_orator_krix_vizk_shadows_of_doubt_selector'),
+(434808, 'spell_orator_krix_vizk_terrorize_selector'),
+(448561, 'spell_orator_krix_vizk_shadows_of_doubt_periodic'),
+(434829, 'spell_orator_krix_vizk_vociferous_indoctrination_periodic');
+
+-- Texts
+DELETE FROM `creature_text` WHERE `CreatureID`=216619;
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(216619, 0, 0, 'Come! Let us speak.', 14, 0, 100, 0, 0, 247788, 262861, 0, 'Orator Krix\'vizk'),
+(216619, 1, 0, 'Bow before me!', 14, 0, 100, 0, 0, 247792, 262867, 0, 'Orator Krix\'vizk'),
+(216619, 1, 1, 'Bend the knee!', 14, 0, 100, 0, 0, 247791, 262866, 0, 'Orator Krix\'vizk'),
+(216619, 2, 0, 'We revel in your fear!', 14, 0, 100, 0, 0, 247794, 262869, 0, 'Orator Krix\'vizk'),
+(216619, 2, 1, 'Your terror is our victory!', 14, 0, 100, 0, 0, 247793, 262868, 0, 'Orator Krix\'vizk'),
+(216619, 3, 0, 'We rise through conquest!', 14, 0, 100, 0, 0, 247797, 262872, 0, 'Orator Krix\'vizk'),
+(216619, 3, 1, 'Azj-Kahet will thrive!', 14, 0, 100, 0, 0, 247798, 262873, 0, 'Orator Krix\'vizk'),
+(216619, 4, 0, 'Should have listened.', 14, 0, 100, 0, 0, 247789, 262862, 0, 'Orator Krix\'vizk'),
+(216619, 4, 1, 'Blessed silence.', 14, 0, 100, 0, 0, 247790, 262863, 0, 'Orator Krix\'vizk'),
+(216619, 4, 2, 'I shall prepare your eulogy myself.', 14, 0, 100, 0, 0, 247799, 262864, 0, 'Orator Krix\'vizk'),
+(216619, 5, 0, 'My... beautiful... voice...', 14, 0, 100, 0, 0, 247800, 262865, 0, 'Orator Krix\'vizk');
diff --git a/sql/updates/world/master/2025_10_04_00_world.sql b/sql/updates/world/master/2025_10_04_00_world.sql
new file mode 100644
index 00000000000..48af133c41b
--- /dev/null
+++ b/sql/updates/world/master/2025_10_04_00_world.sql
@@ -0,0 +1,398 @@
+SET @CGUID := 10006845;
+SET @OGUID := 10001698;
+SET @WORLD_SAFE_LOC_ID := 100101;
+SET @SPAWN_GROUP := 1273;
+
+SET @AT_WIDTH := 10;
+SET @AT_LENGTH := 35;
+SET @AT_HEIGHT := 15;
+SET @AT_ID := 171;
+SET @AT_PROP_ID := 166;
+SET @AT_SPAWN_ID = 269;
+
+DELETE FROM `areatrigger_template` WHERE `Id` = @AT_ID AND `IsCustom` = 1;
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`) VALUES
+(@AT_ID, 1);
+
+DELETE FROM `areatrigger_create_properties` WHERE `Id` = @AT_PROP_ID AND `IsCustom` = 1;
+INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`) VALUES
+(@AT_PROP_ID, 1, @AT_ID, 1, 1, @AT_LENGTH, @AT_WIDTH, @AT_HEIGHT, @AT_LENGTH, @AT_WIDTH, @AT_HEIGHT, 0, 0);
+
+DELETE FROM `areatrigger_template_actions` WHERE `AreaTriggerId` = @AT_ID AND `IsCustom` = 1;
+INSERT INTO `areatrigger_template_actions` (`AreaTriggerId`, `IsCustom`, `ActionType`, `ActionParam`, `TargetType`) VALUES
+(@AT_ID, 1, 0, 228212, 0); -- Arena Starting Area Marker
+
+DELETE FROM `areatrigger` WHERE `SpawnId` BETWEEN @AT_SPAWN_ID+0 AND @AT_SPAWN_ID+1;
+INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `PosX`, `PosY`, `PosZ`, `Orientation`, `Comment`) VALUES
+(@AT_SPAWN_ID+0, @AT_PROP_ID, 1, 2759, 443.727, 314.306, -24.5936, 1.6772544, 'Cage of Carnage - Entrance Purple'),
+(@AT_SPAWN_ID+1, @AT_PROP_ID, 1, 2759, 443.885, 456.386, -24.5629, 4.7431593, 'Cage of Carnage - Entrance Gold');
+
+DELETE FROM `world_safe_locs` WHERE `ID` BETWEEN @WORLD_SAFE_LOC_ID + 0 AND @WORLD_SAFE_LOC_ID + 1;
+INSERT INTO `world_safe_locs` (`ID`, `MapID`, `LocX`, `LocY`, `LocZ`, `Facing`, `Comment`) VALUES
+(@WORLD_SAFE_LOC_ID+0, 2759, 443.727, 314.306, -24.5936, DEGREES(1.6772544), 'Cage of Carnage - Purple Team'),
+(@WORLD_SAFE_LOC_ID+1, 2759, 443.885, 456.386, -24.5629, DEGREES(4.7431593), 'Cage of Carnage - Gold Team');
+
+DELETE FROM `battleground_scripts` WHERE `MapId` = 2759 AND `BattlemasterListId` = 0;
+INSERT INTO `battleground_scripts` (`MapId`, `BattlemasterListId`, `ScriptName`) VALUES
+(2759, 0, 'arena_cage_of_carnage');
+
+DELETE FROM `battleground_template` WHERE `ID` = 1117;
+INSERT INTO `battleground_template` (`ID`, `AllianceStartLoc`, `HordeStartLoc`, `StartMaxDist`, `Weight`, `Comment`) VALUES
+(1117, @WORLD_SAFE_LOC_ID+0, @WORLD_SAFE_LOC_ID+1, 0, 1, 'Cage of Carnage');
+
+DELETE FROM `gameobject_template_addon` WHERE `entry` IN (478078 /*Door*/, 506572 /*Cage of Carnage East Side Starting Collision*/, 506573 /*Cage of Carnage West side Starting Collision*/, 473878 /*Sewer Grate*/, 473877 /*Sewer Grate*/, 505683 /*11GO_Goblin_Arena_TrapDoor01*/);
+INSERT INTO `gameobject_template_addon` (`entry`, `faction`, `flags`, `WorldEffectID`, `AIAnimKitID`) VALUES
+(478078, 0, 0x20, 0, 0), -- Door
+(506572, 0, 0x100020, 0, 0), -- Cage of Carnage East Side Starting Collision
+(506573, 0, 0x100020, 0, 0), -- Cage of Carnage West side Starting Collision
+(473878, 0, 0x20, 0, 0), -- Sewer Grate
+(473877, 0, 0x20, 0, 0), -- Sewer Grate
+(505683, 0, 0x20, 0, 0); -- 11GO_Goblin_Arena_TrapDoor01
+
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+106;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES
+(@OGUID+0, 525465, 2759, 15332, 15332, '0', '0', 0, 0.325886726379394531, 551.505615234375, 5.800933837890625, 3.486468315124511718, 0, 0, -0.9851694107055664, 0.171584486961364746, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+1, 525464, 2759, 15332, 15332, '0', '0', 0, 18.04027938842773437, 532.50067138671875, 5.800936698913574218, 2.24745488166809082, 0, 0, 0.9017181396484375, 0.432324379682540893, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+2, 525197, 2759, 15332, 15332, '0', '0', 0, -16.7575874328613281, 947.5001220703125, 2.785342216491699218, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+3, 525467, 2759, 15332, 15332, '0', '0', 0, 16.87337493896484375, 514.9034423828125, 17.86402130126953125, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+4, 525196, 2759, 15332, 15332, '0', '0', 0, -19.4325237274169921, 947.5001220703125, 2.785341262817382812, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+5, 525466, 2759, 15332, 15332, '0', '0', 0, -1.09853553771972656, 551.562255859375, 5.800928115844726562, 4.563417911529541015, 0, 0, -0.7577667236328125, 0.652525544166564941, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+6, 525198, 2759, 15332, 15332, '0', '0', 0, 2.195569753646850585, 988.78961181640625, 11.15308666229248046, 1.832597970962524414, 0, 0, 0.793354034423828125, 0.608760535717010498, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+7, 525193, 2759, 15332, 15332, '0', '0', 0, -8.76826953887939453, 999.69866943359375, 11.15328025817871093, 2.879789113998413085, 0, 0, 0.991444587707519531, 0.130528271198272705, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+8, 525192, 2759, 15332, 15332, '0', '0', 0, -2.11676788330078125, 988.8541259765625, 11.15306568145751953, 1.308997869491577148, 0, 0, 0.608761787414550781, 0.793353080749511718, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+9, 525195, 2759, 15332, 15332, '0', '0', 0, 19.29920387268066406, 947.50018310546875, 2.785341262817382812, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+10, 525194, 2759, 15332, 15332, '0', '0', 0, 16.624267578125, 947.50018310546875, 2.785340309143066406, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+11, 479165, 2759, 15332, 15332, '0', '0', 0, 122.915985107421875, 424.7452392578125, 14.0477762222290039, 3.900179862976074218, 0, 0, -0.92892646789550781, 0.370264261960983276, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+12, 479164, 2759, 15332, 15332, '0', '0', 0, 129.81365966796875, 405.911712646484375, 8.184061050415039062, 1.963491797447204589, 0, 0, 0.831468582153320312, 0.555571734905242919, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+13, 455361, 2759, 15332, 15332, '0', '0', 0, -20.8462390899658203, 546.555419921875, 17.86402130126953125, 0.01374827791005373, 0, 0, 0.00687408447265625, 0.999976336956024169, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+14, 479167, 2759, 15332, 15332, '0', '0', 0, 117.160888671875, 417.282012939453125, 23.55408096313476562, 4.773479461669921875, 0, 0, -0.6851816177368164, 0.728372275829315185, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+15, 455360, 2759, 15332, 15332, '0', '0', 0, -13.3388633728027343, 553.869384765625, 17.86402130126953125, 4.7123870849609375, 0, 0, -0.7071075439453125, 0.707105994224548339, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+16, 479166, 2759, 15332, 15332, '0', '0', 0, 120.985443115234375, 404.391082763671875, 8.114322662353515625, 6.03011322021484375, 0, 0, -0.12619876861572265, 0.992004990577697753, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+17, 479163, 2759, 15332, 15332, '0', '0', 0, 125.4969482421875, 401.861419677734375, 14.57009696960449218, 1.509708642959594726, 0, 0, 0.685182571411132812, 0.728371381759643554, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+18, 479162, 2759, 15332, 15332, '0', '0', 0, 116.0111846923828125, 406.791107177734375, 23.56104660034179687, 5.419250965118408203, 0, 0, -0.41865825653076171, 0.908143877983093261, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+19, 505683, 2759, 15332, 15332, '0', '0', 0, 443.59033203125, 321.262237548828125, -24.8806037902832031, 1.570798397064208984, 0, 0, 0.7071075439453125, 0.707105994224548339, 7200, 255, 1, 63305), -- 11GO_Goblin_Arena_TrapDoor01 (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+20, 505683, 2759, 15332, 15332, '0', '0', 0, 443.37841796875, 449.341278076171875, -24.8492507934570312, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- 11GO_Goblin_Arena_TrapDoor01 (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+21, 473877, 2759, 15332, 15332, '0', '0', 0, 356.2386474609375, 568.727294921875, 15.15458869934082031, 5.122544288635253906, 0, 0, -0.54829216003417968, 0.836286902427673339, 7200, 255, 1, 63305), -- Sewer Grate (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+22, 473878, 2759, 15332, 15332, '0', '0', 0, 268.52630615234375, 564.385009765625, -3.20471692085266113, 2.050761699676513671, 0, 0, 0.85491180419921875, 0.518773376941680908, 7200, 255, 1, 63305), -- Sewer Grate (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+23, 495141, 2759, 15332, 15332, '0', '0', 0, 394.425933837890625, 600.0740966796875, 24.84228897094726562, 0.158200204372406005, 0, 0, 0.07901763916015625, 0.996873199939727783, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+24, 495140, 2759, 15332, 15332, '0', '0', 0, 378.77734375, 599.0595703125, 24.82088470458984375, 3.63901376724243164, 0, 0, -0.96923065185546875, 0.246154293417930603, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+25, 495142, 2759, 15332, 15332, '0', '0', 0, 381.012908935546875, 598.70916748046875, 18.73786544799804687, 5.874795913696289062, 0, 0, -0.20277881622314453, 0.979224562644958496, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+26, 495137, 2759, 15332, 15332, '0', '0', 0, 368.642578125, 590.95703125, 18.69490814208984375, 1.972219824790954589, 0, 0, 0.83388519287109375, 0.55193793773651123, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+27, 455349, 2759, 15332, 15332, '0', '0', 0, -6.41716861724853515, 549.5706787109375, 5.881754875183105468, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+28, 495136, 2759, 15332, 15332, '0', '0', 0, 392.986328125, 611.3447265625, 24.81931304931640625, 0.32288438081741333, 0, 0, 0.160741806030273437, 0.98699653148651123, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+29, 495139, 2759, 15332, 15332, '0', '0', 0, 379.341796875, 600.70703125, 24.81390571594238281, 6.08247232437133789, 0, 0, -0.10018825531005859, 0.994968533515930175, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+30, 455351, 2759, 15332, 15332, '0', '0', 0, 16.07133674621582031, 527.0821533203125, 5.881753921508789062, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+31, 495138, 2759, 15332, 15332, '0', '0', 0, 395.967529296875, 601.81793212890625, 24.84229278564453125, 4.606337547302246093, 0, 0, -0.74359035491943359, 0.668635487556457519, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+32, 455350, 2759, 15332, 15332, '0', '0', 0, -4.74736690521240234, 551.2564697265625, 5.881754875183105468, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+33, 455357, 2759, 15332, 15332, '0', '0', 0, 2.841243267059326171, 515.48846435546875, 5.881755828857421875, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+34, 455356, 2759, 15332, 15332, '0', '0', 0, -9.65997505187988281, 523.70123291015625, 6.43730926513671875, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+35, 455359, 2759, 15332, 15332, '0', '0', 0, 13.36458778381347656, 512.0887451171875, 17.86402130126953125, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+36, 455358, 2759, 15332, 15332, '0', '0', 0, 20.72269058227539062, 519.81463623046875, 17.86402130126953125, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+37, 455353, 2759, 15332, 15332, '0', '0', 0, 5.640529632568359375, 517.348876953125, 5.881753921508789062, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+38, 455352, 2759, 15332, 15332, '0', '0', 0, 17.70462989807128906, 528.7154541015625, 5.881753921508789062, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+39, 499159, 2759, 15332, 15332, '0', '0', 0, -23.218963623046875, 542.37420654296875, 5.948953628540039062, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+40, 455355, 2759, 15332, 15332, '0', '0', 0, -15.7143983840942382, 538.87396240234375, 5.881753921508789062, 4.97418975830078125, 0, 0, -0.60876083374023437, 0.793353796005249023, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+41, 455354, 2759, 15332, 15332, '0', '0', 0, -18.0155696868896484, 536.34552001953125, 5.881752967834472656, 0, 0, 0, 0, 1, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+42, 499165, 2759, 15332, 15332, '0', '0', 0, -41.225860595703125, 534.64422607421875, 6.707051277160644531, 0.785396754741668701, 0, 0, 0.38268280029296875, 0.923879802227020263, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+43, 499164, 2759, 15332, 15332, '0', '0', 0, -36.7888603210449218, 527.624755859375, 6.707051753997802734, 2.139628887176513671, 0, 0, 0.877111434936523437, 0.48028692603111267, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+44, 499166, 2759, 15332, 15332, '0', '0', 0, -36.739044189453125, 538.6851806640625, 6.707051277160644531, 4.188792228698730468, 0, 0, -0.86602497100830078, 0.50000077486038208, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+45, 479173, 2759, 15332, 15332, '0', '0', 0, 240.801422119140625, 455.694305419921875, 15.81334686279296875, 2.740161895751953125, 0, 0, 0.979924201965332031, 0.199370384216308593, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+46, 479172, 2759, 15332, 15332, '0', '0', 0, 235.213134765625, 445.31170654296875, 0.489330291748046875, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+47, 499160, 2759, 15332, 15332, '0', '0', 0, -25.6193504333496093, 540.27197265625, 5.948953628540039062, 2.356189966201782226, 0, 0, 0.923878669738769531, 0.38268551230430603, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+48, 479175, 2759, 15332, 15332, '0', '0', 0, 247.4295654296875, 444.84844970703125, 15.83253288269042968, 5.846856117248535156, 0, 0, -0.21643829345703125, 0.976296305656433105, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+49, 469497, 2759, 15332, 15332, '0', '0', 0, 18.37844467163085937, 991.58551025390625, 5.562197208404541015, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- 11GO_Goblin_Decor_TrashPile06 (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+50, 499163, 2759, 15332, 15332, '0', '0', 0, -41.2045249938964843, 531.8770751953125, 6.707051753997802734, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+51, 479168, 2759, 15332, 15332, '0', '0', 0, 113.5483856201171875, 415.38714599609375, 14.50669193267822265, 0.706856250762939453, 0, 0, 0.346116065979003906, 0.938191711902618408, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+52, 479171, 2759, 15332, 15332, '0', '0', 0, 118.3330917358398437, 410.6474609375, 14.61388969421386718, 5.611230850219726562, 0, 0, -0.32969188690185546, 0.944088578224182128, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+53, 479181, 2759, 15332, 15332, '0', '0', 0, 124.3650588989257812, 402.869720458984375, 8.249117851257324218, 2.277649402618408203, 0, 0, 0.90814208984375, 0.418662101030349731, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+54, 479180, 2759, 15332, 15332, '0', '0', 0, 127.5780563354492187, 408.690948486328125, 8.239223480224609375, 5.593780994415283203, 0, 0, -0.33791637420654296, 0.941176116466522216, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+55, 479182, 2759, 15332, 15332, '0', '0', 0, 131.529205322265625, 407.81524658203125, 14.52459049224853515, 1.108283400535583496, 0, 0, 0.526213645935058593, 0.850352406501770019, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+56, 495117, 2759, 15332, 15332, '0', '0', 0, 456.00201416015625, 95.220733642578125, -7.50032424926757812, 2.050761699676513671, 0, 0, 0.85491180419921875, 0.518773376941680908, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+57, 499251, 2759, 15332, 15332, '0', '0', 0, -14.9672374725341796, 553.03369140625, 17.86402130126953125, 5.759587764739990234, 0, 0, -0.25881862640380859, 0.965925931930541992, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+58, 495116, 2759, 15332, 15332, '0', '0', 0, 465.45892333984375, 105.5692825317382812, -1.44336986541748046, 3.377224683761596679, 0, 0, -0.99306774139404296, 0.117543503642082214, 7200, 255, 1, 63305), -- BBQ (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+59, 495119, 2759, 15332, 15332, '0', '0', 0, 458.711181640625, 104.0494003295898437, -1.40163898468017578, 0.890116631984710693, 0, 0, 0.430510520935058593, 0.902585566043853759, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+60, 495118, 2759, 15332, 15332, '0', '0', 0, 453.606842041015625, 110.278533935546875, -1.43806171417236328, 3.150327444076538085, 0, 0, -0.99999046325683593, 0.004367320332676172, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+61, 479189, 2759, 15332, 15332, '0', '0', 0, 114.9322509765625, 417.023406982421875, 8.190715789794921875, 4.374268054962158203, 0, 0, -0.81600093841552734, 0.578050553798675537, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+62, 495113, 2759, 15332, 15332, '0', '0', 0, 455.18170166015625, 102.9365234375, -1.42340946197509765, 2.146752834320068359, 0, 0, 0.878816604614257812, 0.477159708738327026, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+63, 479188, 2759, 15332, 15332, '0', '0', 0, 116.0741653442382812, 417.666290283203125, 8.190715789794921875, 3.080887079238891601, 0, 0, 0.999539375305175781, 0.030348163098096847, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+64, 495115, 2759, 15332, 15332, '0', '0', 0, 457.76922607421875, 111.3832550048828125, -1.39204788208007812, 4.625123500823974609, 0, 0, -0.73727703094482421, 0.67559051513671875, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+65, 479190, 2759, 15332, 15332, '0', '0', 0, 119.9293212890625, 417.4990234375, 8.239215850830078125, 3.753324508666992187, 0, 0, -0.95358657836914062, 0.301118940114974975, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+66, 495114, 2759, 15332, 15332, '0', '0', 0, 457.831390380859375, 109.6317825317382812, -1.39204788208007812, 2.076942920684814453, 0, 0, 0.861629486083984375, 0.507537841796875, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+67, 479185, 2759, 15332, 15332, '0', '0', 0, 128.975494384765625, 409.37115478515625, 8.239222526550292968, 4.756022453308105468, 0, 0, -0.6915130615234375, 0.722363948822021484, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+68, 495125, 2759, 15332, 15332, '0', '0', 0, 456.39111328125, 111.2852935791015625, -1.39204883575439453, 4.991641044616699218, 0, 0, -0.60181522369384765, 0.798635363578796386, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+69, 495124, 2759, 15332, 15332, '0', '0', 0, 456.47979736328125, 108.9578475952148437, -1.39204788208007812, 0.907570242881774902, 0, 0, 0.438370704650878906, 0.898794233798980712, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+70, 479187, 2759, 15332, 15332, '0', '0', 0, 115.9761505126953125, 414.505859375, 8.190725326538085937, 3.041915655136108398, 0, 0, 0.998758316040039062, 0.049817848950624465, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+71, 495127, 2759, 15332, 15332, '0', '0', 0, 460.7196044921875, 106.1158370971679687, -1.40164089202880859, 4.625123500823974609, 0, 0, -0.73727703094482421, 0.67559051513671875, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+72, 479186, 2759, 15332, 15332, '0', '0', 0, 117.78582763671875, 414.748931884765625, 8.190715789794921875, 1.876227378845214843, 0, 0, 0.806444168090820312, 0.59131026268005371, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+73, 495126, 2759, 15332, 15332, '0', '0', 0, 465.499053955078125, 103.323455810546875, -1.44336986541748046, 2.809975385665893554, 0, 0, 0.986285209655761718, 0.165049895644187927, 7200, 255, 1, 63305), -- BBQ (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+74, 506573, 2759, 15332, 15332, '0', '0', 0, 440.38714599609375, 389.951385498046875, -241.243789672851562, 0, 0, 0, 0, 1, 7200, 255, 1, 63305), -- Cage of Carnage West side Starting Collision (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+75, 495121, 2759, 15332, 15332, '0', '0', 0, 453.50384521484375, 104.7364044189453125, -1.42341041564941406, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+76, 506572, 2759, 15332, 15332, '0', '0', 0, 446.607635498046875, 381.079864501953125, -241.243789672851562, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 63305), -- Cage of Carnage East Side Starting Collision (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+77, 495120, 2759, 15332, 15332, '0', '0', 0, 451.3865966796875, 110.999420166015625, -1.43806171417236328, 4.991643905639648437, 0, 0, -0.60181427001953125, 0.798636078834533691, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+78, 495123, 2759, 15332, 15332, '0', '0', 0, 463.435455322265625, 101.3131790161132812, -7.52160358428955078, 5.785769462585449218, 0, 0, -0.24615192413330078, 0.969231247901916503, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+79, 478078, 2759, 15332, 15332, '0', '0', 0, 536.6385498046875, 381.858154296875, -20.6060752868652343, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 63305), -- Door (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+80, 495122, 2759, 15332, 15332, '0', '0', 0, 450.914459228515625, 109.2589035034179687, -1.43806171417236328, 0.008726147934794425, 0, 0, 0.004363059997558593, 0.999990463256835937, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+81, 495133, 2759, 15332, 15332, '0', '0', 0, 380.04296875, 590.5400390625, 18.7163848876953125, 4.24988412857055664, 0, 0, -0.85035037994384765, 0.52621692419052124, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+82, 495132, 2759, 15332, 15332, '0', '0', 0, 378.11944580078125, 591.8095703125, 24.81722068786621093, 0.882507562637329101, 0, 0, 0.427073478698730468, 0.904216945171356201, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+83, 499202, 2759, 15332, 15332, '0', '0', 0, 19.73452568054199218, 517.9140625, 17.86402130126953125, 2.094393253326416015, 0, 0, 0.866024971008300781, 0.50000077486038208, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+84, 524333, 2759, 15332, 15332, '0', '0', 0, -32.3823928833007812, 103.6567306518554687, -3.9420318603515625, 0, 0, 0, 0, 1, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+85, 495135, 2759, 15332, 15332, '0', '0', 0, 388.95703125, 593.94140625, 24.67194747924804687, 3.324855566024780273, 0, 0, -0.9958047866821289, 0.091503240168094635, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+86, 524332, 2759, 15332, 15332, '0', '0', 0, -29.3839874267578125, 103.0057525634765625, -3.9420318603515625, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+87, 524335, 2759, 15332, 15332, '0', '0', 0, -26.8305740356445312, 108.8494644165039062, -3.9420318603515625, 0, 0, 0, 0, 1, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+88, 524334, 2759, 15332, 15332, '0', '0', 0, -23.8921966552734375, 107.8621292114257812, -3.9420318603515625, 2.879789113998413085, 0, 0, 0.991444587707519531, 0.130528271198272705, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+89, 495128, 2759, 15332, 15332, '0', '0', 0, 456.59088134765625, 101.6902923583984375, -7.5155801773071289, 1.400974750518798828, 0, 0, 0.644590377807617187, 0.764528095722198486, 7200, 255, 1, 63305), -- Fancy Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+90, 456569, 2759, 15332, 15332, '0', '0', 0, -26.5109634399414062, 1029.7576904296875, 10.91524028778076171, 4.712392330169677734, 0, 0, -0.70710563659667968, 0.707107901573181152, 7200, 255, 1, 63305), -- Rocket Drill (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+91, 495130, 2759, 15332, 15332, '0', '0', 0, 378.586334228515625, 594.24334716796875, 24.81722068786621093, 5.244716167449951171, 0, 0, -0.4962158203125, 0.86819922924041748, 7200, 255, 1, 63305), -- Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+92, 456568, 2759, 15332, 15332, '0', '0', 0, -1.81405127048492431, 1072.8233642578125, 10.44353389739990234, 6.177367687225341796, 0, 0, -0.05288410186767578, 0.998600661754608154, 7200, 255, 1, 63305), -- Rocket Drill (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+93, 524331, 2759, 15332, 15332, '0', '0', 0, -33.4838027954101562, 108.1009750366210937, -3.89253044128417968, 2.879789113998413085, 0, 0, 0.991444587707519531, 0.130528271198272705, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+94, 524330, 2759, 15332, 15332, '0', '0', 0, -36.7371673583984375, 108.2857894897460937, -3.89245986938476562, 0, 0, 0, 0, 1, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+95, 525461, 2759, 15332, 15332, '0', '0', 0, 0.500454902648925781, 514.7607421875, 5.881754875183105468, 1.621405363082885742, 0, 0, 0.724771499633789062, 0.688989341259002685, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+96, 525463, 2759, 15332, 15332, '0', '0', 0, -18.9522514343261718, 533.288818359375, 5.881754875183105468, 6.039627552032470703, 0, 0, -0.12147808074951171, 0.992594122886657714, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+97, 525462, 2759, 15332, 15332, '0', '0', 0, -0.86119651794433593, 514.5313720703125, 5.881754875183105468, 0.748943269252777099, 0, 0, 0.365780830383300781, 0.930701017379760742, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+98, 524337, 2759, 15332, 15332, '0', '0', 0, -15.5856094360351562, 108.3418197631835937, -3.9420318603515625, 6.021387100219726562, 0, 0, -0.13052558898925781, 0.991444945335388183, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+99, 524336, 2759, 15332, 15332, '0', '0', 0, -12.6158599853515625, 107.8908767700195312, -3.9420318603515625, 3.141592741012573242, 0, 0, -1, 0, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+100, 524339, 2759, 15332, 15332, '0', '0', 0, -21.4862289428710937, 102.9893035888671875, -3.9420318603515625, 0.523597896099090576, 0, 0, 0.258818626403808593, 0.965925931930541992, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+101, 524338, 2759, 15332, 15332, '0', '0', 0, -18.5143966674804687, 103.436920166015625, -3.9420318603515625, 3.403396368026733398, 0, 0, -0.99144458770751953, 0.130528271198272705, 7200, 255, 1, 63305), -- Stool (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+102, 525191, 2759, 15332, 15332, '0', '0', 0, 8.161557197570800781, 994.0087890625, 11.1531219482421875, 2.75469517707824707, 0, 0, 0.981347084045410156, 0.192244425415992736, 7200, 255, 1, 63305), -- Bench (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+103, 525469, 2759, 15332, 15332, '0', '0', 0, -21.0345821380615234, 543.11871337890625, 17.86401939392089843, 0.206334680318832397, 0, 0, 0.102984428405761718, 0.994682967662811279, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+104, 525468, 2759, 15332, 15332, '0', '0', 0, -21.011972427368164, 544.3123779296875, 17.86402130126953125, 5.229222297668457031, 0, 0, -0.50292682647705078, 0.864328980445861816, 7200, 255, 1, 63305), -- Bean Bag Chair (Area: Cage of Carnage - Difficulty: 0) CreateObject1
+(@OGUID+105, 184663, 2759, 15332, 15332, '0', '0', 0, 399.666656494140625, 350.197906494140625, -42.23541259765625, 0.759438693523406982, 0, 0, 0.370659828186035156, 0.928768694400787353, 7200, 255, 1, 63305), -- Shadow Sight (Area: Cage of Carnage - Difficulty: 0) CreateObject2
+(@OGUID+106, 184663, 2759, 15332, 15332, '0', '0', 0, 487.026031494140625, 420.6875, -42.0717048645019531, 3.807122707366943359, 0, 0, -0.94514274597167968, 0.326657593250274658, 7200, 255, 1, 63305); -- Shadow Sight (Area: Cage of Carnage - Difficulty: 0) CreateObject2
+
+DELETE FROM `gameobject_addon` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+106;
+INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`, `WorldEffectID`, `AIAnimKitID`) VALUES
+(@OGUID+0, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+1, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+2, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+3, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+4, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+5, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+6, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+7, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+8, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+9, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+10, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+11, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Stool
+(@OGUID+12, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Fancy Chair
+(@OGUID+13, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+14, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Fancy Chair
+(@OGUID+15, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+16, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Fancy Chair
+(@OGUID+17, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Fancy Chair
+(@OGUID+18, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Chair
+(@OGUID+19, 0, 0, 0.7071075439453125, 0.707105994224548339, 0, 0), -- 11GO_Goblin_Arena_TrapDoor01
+(@OGUID+20, 0, 0, -0.70710641145706176, 0.707107126712799072, 0, 0), -- 11GO_Goblin_Arena_TrapDoor01
+(@OGUID+21, 0, 0, -0.54829299449920654, 0.836286306381225585, 0, 0), -- Sewer Grate
+(@OGUID+22, 0, 0, 0.854912161827087402, 0.518772840499877929, 0, 0), -- Sewer Grate
+(@OGUID+23, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+24, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+25, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Fancy Chair
+(@OGUID+26, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+27, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+28, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+29, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+30, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+31, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+32, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+33, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Stool
+(@OGUID+34, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Stool
+(@OGUID+35, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+36, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+37, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Stool
+(@OGUID+38, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+39, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+40, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+41, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+42, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+43, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+44, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+45, 0, 0, 0.700909793376922607, 0.71324998140335083, 0, 0), -- Chair
+(@OGUID+46, 0, 0, 0.700909793376922607, 0.71324998140335083, 0, 0), -- Chair
+(@OGUID+47, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+48, 0, 0, 0.700909793376922607, 0.71324998140335083, 0, 0), -- Chair
+(@OGUID+49, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- 11GO_Goblin_Decor_TrashPile06
+(@OGUID+50, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bench
+(@OGUID+51, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Fancy Chair
+(@OGUID+52, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Fancy Chair
+(@OGUID+53, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Chair
+(@OGUID+54, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Chair
+(@OGUID+55, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Chair
+(@OGUID+56, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Stool
+(@OGUID+57, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+58, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- BBQ
+(@OGUID+59, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+60, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Bean Bag Chair
+(@OGUID+61, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Stool
+(@OGUID+62, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+63, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Stool
+(@OGUID+64, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+65, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Chair
+(@OGUID+66, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+67, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Chair
+(@OGUID+68, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+69, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+70, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Stool
+(@OGUID+71, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+72, 0, 0, 0.999990463256835937, -0.00436332821846008, 0, 0), -- Stool
+(@OGUID+73, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- BBQ
+(@OGUID+75, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+77, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Bean Bag Chair
+(@OGUID+78, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Chair
+(@OGUID+79, 0, 0, 1, -0.00000004371138828, 0, 0), -- Door
+(@OGUID+80, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Bean Bag Chair
+(@OGUID+81, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Chair
+(@OGUID+82, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Chair
+(@OGUID+83, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Fancy Chair
+(@OGUID+84, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+85, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Fancy Chair
+(@OGUID+86, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+87, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+88, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+89, 0, 0, 0.004363371990621089, 0.999990463256835937, 0, 0), -- Fancy Chair
+(@OGUID+90, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Rocket Drill
+(@OGUID+91, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Chair
+(@OGUID+92, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Rocket Drill
+(@OGUID+93, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+94, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+95, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+96, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+97, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+98, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+99, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+100, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+101, 0, 0, 0.70710688829421997, 0.707106649875640869, 0, 0), -- Stool
+(@OGUID+102, 0, 0, -0.70710605382919311, 0.707107484340667724, 0, 0), -- Bench
+(@OGUID+103, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0), -- Bean Bag Chair
+(@OGUID+104, 0, 0, 0.923879504203796386, 0.38268357515335083, 0, 0); -- Bean Bag Chair
+
+DELETE FROM `creature` WHERE `guid`=@CGUID;
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`) VALUES
+(@CGUID, 232750, 2759, 15332, 15332, '0', '0', 0, 0, 0, 492.08160400390625, 384.34027099609375, -14.6007318496704101, 3.058808803558349609, 7200, 0, 0, 0, NULL, NULL, NULL, NULL, 63305); -- Naminze Boltfingers (Area: Cage of Carnage - Difficulty: 0) CreateObject1 (Auras: )
+
+DELETE FROM `creature_addon` WHERE `guid`=@CGUID;
+
+UPDATE `creature_template_difficulty` SET `ContentTuningID`=969, `VerifiedBuild`=63305 WHERE (`Entry`=232750 AND `DifficultyID`=0); -- 232750 (Naminze Boltfingers)
+UPDATE `creature_template` SET `faction`=35, `BaseAttackTime`=2000, `unit_flags`=0x2000000, `unit_flags2`=0x800 WHERE `entry`=232750; -- Naminze Boltfingers
+
+DELETE FROM `spawn_group_template` WHERE `groupId` = @SPAWN_GROUP;
+INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES
+(@SPAWN_GROUP, 'Cage of Carnage - Shadow sight', 0x20);
+
+DELETE FROM `spawn_group` WHERE `groupId` = @SPAWN_GROUP;
+INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
+(@SPAWN_GROUP, 1, @OGUID+105),
+(@SPAWN_GROUP, 1, @OGUID+106);
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 33 AND `SourceEntry` = @SPAWN_GROUP;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceEntry`, `SourceGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ScriptName`) VALUES
+(33, @SPAWN_GROUP, 0, 0, 0, 'condition_is_shadow_sight_enabled');
+
+DELETE FROM `creature_text` WHERE `CreatureID` IN (232750);
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(232750, 0, 0, 'He he he he. Look how tough all of you look. This is gonna be good!', 12, 0, 100, 0, 0, 276108, 275530, 3, 'Naminze Boltfingers'),
+(232750, 1, 0, 'Get ready. It\'s about to go down!', 12, 0, 100, 0, 0, 269101, 275534, 3, 'Naminze Boltfingers'),
+(232750, 2, 0, 'Ah, c\'mon. Right when it was gettin\' good!', 12, 0, 100, 0, 0, 269090, 275539, 3, 'Naminze Boltfingers to Player'),
+(232750, 2, 1, 'This is a gen-u-ine nailbiter!', 12, 0, 100, 0, 0, 269091, 275538, 3, 'Naminze Boltfingers to Player'),
+(232750, 3, 0, 'That\'s gotta hurt. But not for long. Heh.', 12, 0, 100, 0, 0, 276094, 275546, 3, 'Naminze Boltfingers to Player'),
+(232750, 2, 2, 'Aw, you keep spoilin\' all my fun!', 12, 0, 100, 0, 0, 269088, 275541, 3, 'Naminze Boltfingers to Player'),
+(232750, 2, 3, 'Keepin\' this fight interestin\' this time!', 12, 0, 100, 0, 0, 269089, 275540, 3, 'Naminze Boltfingers to Player'),
+(232750, 3, 1, 'Wowza. I\'m gonna remember that one for a long time.', 12, 0, 100, 0, 0, 276094, 275544, 3, 'Naminze Boltfingers to Player'),
+(232750, 3, 2, 'Oof, right in the... well, the everywhere!', 12, 0, 100, 0, 0, 276094, 275545, 3, 'Naminze Boltfingers to Player');
+
+DELETE FROM `spell_proc` WHERE `SpellId` IN (472885);
+INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
+(472885,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0,0,0,0); -- Undermine Arena Reaction Trigger
+
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_undermine_arena_reaction_trigger_low_health', 'spell_undermine_arena_reaction_trigger', 'spell_undermine_arena_warning_countdown', 'spell_undermine_arena_warning_teleport');
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(472883, 'spell_undermine_arena_reaction_trigger_low_health'),
+(472885, 'spell_undermine_arena_reaction_trigger'),
+(1214676, 'spell_undermine_arena_warning_countdown'),
+(371319, 'spell_undermine_arena_warning_teleport');
+
+DELETE FROM `creature_model_info` WHERE `DisplayID`=123368;
+INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `DisplayID_Other_Gender`, `VerifiedBuild`) VALUES
+(123368, 0.305999994277954101, 1.5, 0, 63305);
+
+UPDATE `gameobject_template` SET `Data8`=103829, `Data10`=30092, `VerifiedBuild`=63305 WHERE `entry`=365672; -- Forge
+UPDATE `gameobject_template` SET `Data8`=103828, `Data10`=30091, `VerifiedBuild`=63305 WHERE `entry`=365673; -- Anvil
+UPDATE `gameobject_template` SET `Data8`=103828, `Data10`=30091, `VerifiedBuild`=63305 WHERE `entry`=357962; -- Anvil
+UPDATE `gameobject_template` SET `Data8`=103829, `Data10`=30092, `VerifiedBuild`=63305 WHERE `entry`=357961; -- Forge
+
+DELETE FROM `gameobject_template` WHERE `entry` IN (495116 /*BBQ*/, 479165 /*Stool*/, 479163 /*Fancy Chair*/, 456569 /*Rocket Drill*/, 524336 /*Stool*/, 524332 /*Stool*/, 495130 /*Chair*/, 524331 /*Stool*/, 495126 /*BBQ*/, 495119 /*Chair*/, 495113 /*Chair*/, 495124 /*Chair*/, 505683 /*11GO_Goblin_Arena_TrapDoor01*/, 495121 /*Chair*/, 479166 /*Fancy Chair*/, 479164 /*Fancy Chair*/, 473877 /*Sewer Grate*/, 456568 /*Rocket Drill*/, 525195 /*Bench*/, 506572 /*Cage of Carnage East Side Starting Collision*/, 479162 /*Chair*/, 479181 /*Chair*/, 455350 /*Bench*/, 524330 /*Stool*/, 495139 /*Stool*/, 479175 /*Chair*/, 479167 /*Fancy Chair*/, 479187 /*Stool*/, 495120 /*Bean Bag Chair*/, 479172 /*Chair*/, 495137 /*Stool*/, 479189 /*Stool*/, 495136 /*Stool*/, 495132 /*Chair*/, 525191 /*Bench*/, 524334 /*Stool*/, 479171 /*Fancy Chair*/, 479185 /*Chair*/, 525198 /*Bench*/, 495135 /*Fancy Chair*/, 495115 /*Chair*/, 495118 /*Bean Bag Chair*/, 479188 /*Stool*/, 469497 /*11GO_Goblin_Decor_TrashPile06*/, 479186 /*Stool*/, 479173 /*Chair*/, 478078 /*Door*/, 524335 /*Stool*/, 525197 /*Bench*/, 495142 /*Fancy Chair*/, 524338 /*Stool*/, 495123 /*Chair*/, 479168 /*Fancy Chair*/, 524339 /*Stool*/, 524333 /*Stool*/, 495125 /*Chair*/, 495114 /*Chair*/, 495117 /*Stool*/, 525196 /*Bench*/, 525193 /*Bench*/, 495138 /*Stool*/, 495128 /*Fancy Chair*/, 525192 /*Bench*/, 495140 /*Stool*/, 495133 /*Chair*/, 525194 /*Bench*/, 473878 /*Sewer Grate*/, 495122 /*Bean Bag Chair*/, 524337 /*Stool*/, 479182 /*Chair*/, 479190 /*Chair*/, 495141 /*Stool*/, 479180 /*Chair*/, 506573 /*Cage of Carnage West side Starting Collision*/, 495127 /*Chair*/);
+INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`, `Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`, `Data33`, `Data34`, `ContentTuningId`, `VerifiedBuild`) VALUES
+(495116, 8, 95234, 'BBQ', '', '', '', 0.999999761581420898, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- BBQ
+(479165, 7, 92627, 'Stool', '', '', '', 0.999999463558197021, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479163, 7, 89571, 'Fancy Chair', '', '', '', 0.99999934434890747, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(456569, 5, 92678, 'Rocket Drill', '', '', '', 0.749999880790710449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Rocket Drill
+(524336, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(524332, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495130, 7, 92626, 'Chair', '', '', '', 0.999999701976776123, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(524331, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495126, 8, 95234, 'BBQ', '', '', '', 0.999999701976776123, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- BBQ
+(495119, 7, 92626, 'Chair', '', '', '', 0.999999523162841796, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495113, 7, 92626, 'Chair', '', '', '', 0.999999642372131347, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495124, 7, 92626, 'Chair', '', '', '', 0.999999582767486572, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(505683, 35, 99831, '11GO_Goblin_Arena_TrapDoor01', '', '', '', 0.999999761581420898, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- 11GO_Goblin_Arena_TrapDoor01
+(495121, 7, 92626, 'Chair', '', '', '', 0.999999523162841796, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(479166, 7, 89571, 'Fancy Chair', '', '', '', 0.999999463558197021, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(479164, 7, 89571, 'Fancy Chair', '', '', '', 0.999999225139617919, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(473877, 0, 96881, 'Sewer Grate', '', '', '', 1.084214687347412109, 0, 0, 3000, 0, 0, 0, 0, 136039, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Sewer Grate
+(456568, 5, 92678, 'Rocket Drill', '', '', '', 0.749999880790710449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Rocket Drill
+(525195, 7, 93731, 'Bench', '', '', '', 0.999999761581420898, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(506572, 43, 100393, 'Cage of Carnage East Side Starting Collision', '', '', '', 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Cage of Carnage East Side Starting Collision
+(479162, 7, 92626, 'Chair', '', '', '', 0.99999934434890747, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(479181, 7, 92626, 'Chair', '', '', '', 0.999999284744262695, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(455350, 7, 93731, 'Bench', '', '', '', 0.999999523162841796, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(524330, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495139, 7, 92627, 'Stool', '', '', '', 0.999999761581420898, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479175, 7, 92626, 'Chair', '', '', '', 0.99999934434890747, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(479167, 7, 89571, 'Fancy Chair', '', '', '', 0.999999403953552246, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(479187, 7, 92627, 'Stool', '', '', '', 0.999999105930328369, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495120, 7, 97337, 'Bean Bag Chair', '', '', '', 0.999999523162841796, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bean Bag Chair
+(479172, 7, 92626, 'Chair', '', '', '', 0.999999523162841796, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495137, 7, 92627, 'Stool', '', '', '', 0.999999642372131347, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479189, 7, 92627, 'Stool', '', '', '', 0.999999105930328369, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495136, 7, 92627, 'Stool', '', '', '', 0.999999582767486572, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495132, 7, 92626, 'Chair', '', '', '', 0.999999523162841796, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(525191, 7, 93731, 'Bench', '', '', '', 0.999999761581420898, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(524334, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479171, 7, 89571, 'Fancy Chair', '', '', '', 0.99999934434890747, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(479185, 7, 92626, 'Chair', '', '', '', 0.999999523162841796, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(525198, 7, 93731, 'Bench', '', '', '', 0.999999821186065673, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(495135, 7, 89571, 'Fancy Chair', '', '', '', 0.999999642372131347, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(495115, 7, 92626, 'Chair', '', '', '', 0.999999582767486572, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495118, 7, 97767, 'Bean Bag Chair', '', '', '', 0.999999761581420898, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bean Bag Chair
+(479188, 7, 92627, 'Stool', '', '', '', 0.999999165534973144, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(469497, 5, 96383, '11GO_Goblin_Decor_TrashPile06', '', '', '', 1.199999570846557617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- 11GO_Goblin_Decor_TrashPile06
+(479186, 7, 92627, 'Stool', '', '', '', 0.999999165534973144, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479173, 7, 92626, 'Chair', '', '', '', 0.999999225139617919, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(478078, 0, 96874, 'Door', '', '', '', 0.999999761581420898, 0, 0, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Door
+(524335, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(525197, 7, 93731, 'Bench', '', '', '', 0.999999761581420898, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(495142, 7, 89571, 'Fancy Chair', '', '', '', 0.999999463558197021, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(524338, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495123, 7, 92626, 'Chair', '', '', '', 0.999999403953552246, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(479168, 7, 89571, 'Fancy Chair', '', '', '', 0.999999463558197021, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(524339, 7, 92627, 'Stool', '', '', '', 0.999999880790710449, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(524333, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495125, 7, 92626, 'Chair', '', '', '', 0.999999761581420898, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495114, 7, 92626, 'Chair', '', '', '', 0.999999642372131347, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495117, 7, 92627, 'Stool', '', '', '', 0.999999642372131347, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(525196, 7, 93731, 'Bench', '', '', '', 0.999999761581420898, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(525193, 7, 93731, 'Bench', '', '', '', 0.999999761581420898, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(495138, 7, 92627, 'Stool', '', '', '', 0.999999761581420898, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495128, 7, 89571, 'Fancy Chair', '', '', '', 0.999999582767486572, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Fancy Chair
+(525192, 7, 93731, 'Bench', '', '', '', 0.999999821186065673, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(495140, 7, 92627, 'Stool', '', '', '', 0.999999642372131347, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(495133, 7, 92626, 'Chair', '', '', '', 0.999999701976776123, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(525194, 7, 93731, 'Bench', '', '', '', 0.999999761581420898, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bench
+(473878, 0, 96881, 'Sewer Grate', '', '', '', 1.02015388011932373, 0, 0, 3000, 0, 0, 0, 0, 136039, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Sewer Grate
+(495122, 7, 97767, 'Bean Bag Chair', '', '', '', 0.999999701976776123, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Bean Bag Chair
+(524337, 7, 92627, 'Stool', '', '', '', 0.999999821186065673, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479182, 7, 92626, 'Chair', '', '', '', 0.999999463558197021, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(479190, 7, 92626, 'Chair', '', '', '', 0.999999463558197021, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(495141, 7, 92627, 'Stool', '', '', '', 0.999999701976776123, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Stool
+(479180, 7, 92626, 'Chair', '', '', '', 0.99999934434890747, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Chair
+(506573, 43, 100393, 'Cage of Carnage West side Starting Collision', '', '', '', 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), -- Cage of Carnage West side Starting Collision
+(495127, 7, 92626, 'Chair', '', '', '', 0.999999582767486572, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305); -- Chair
diff --git a/sql/updates/world/master/2025_10_04_01_world.sql b/sql/updates/world/master/2025_10_04_01_world.sql
new file mode 100644
index 00000000000..686df6d8d94
--- /dev/null
+++ b/sql/updates/world/master/2025_10_04_01_world.sql
@@ -0,0 +1,76 @@
+SET @AREATRIGGERID := 172;
+
+-- Creature
+UPDATE `creature_template` SET `ScriptName`='boss_shade_of_medivh' WHERE `entry`=114350;
+UPDATE `creature_template` SET `faction`=16, `BaseAttackTime`=2000, `unit_flags2`=0x800, `unit_flags3`=0x40080000, `ScriptName`='boss_shade_of_medivh_guardians_image' WHERE `entry`=114675; -- Guardian's Image
+UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=2, `LevelScalingDeltaMax`=2, `ContentTuningID`=629, `StaticFlags1`=0x30000100, `VerifiedBuild`=63003 WHERE (`Entry`=114675 AND `DifficultyID`=23); -- 114675 (Guardian's Image) - Sessile, CanSwim, Floating
+
+DELETE FROM `creature_template_movement` WHERE `CreatureId`=114675;
+INSERT INTO `creature_template_movement` (`CreatureId`, `HoverInitiallyEnabled`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES
+(114675, 1, 0, 0, NULL);
+
+-- Areatriggers
+DELETE FROM `areatrigger_template` WHERE (`IsCustom` IN (0,1) AND `Id` IN (12878, 12916, @AREATRIGGERID+0, @AREATRIGGERID+1));
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`, `VerifiedBuild`) VALUES
+(12916, 0, 0, 0, 512, 59570),
+(12878, 0, 0, 0, 0, 45745),
+(@AREATRIGGERID+0, 1, 0, 0, 0, 0),
+(@AREATRIGGERID+1, 1, 0, 0, 0, 0);
+
+DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (8809, 8848, 8851, 8879));
+INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
+(8851, 0, 12916, 0, 0, 2618, 0, 0, 0, -1, 0, 0, NULL, 20000, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 'at_shade_of_medivh_flame_wreath', 45745), -- Spell: 228257 (Flame Wreath)
+(8809, 0, @AREATRIGGERID+0, 1, 0, 0, 0, 0, 0, -1, 0, 89, NULL, 20000, 0, 4, 40, 40, 1, 1, 0.300000011920928955, 0.300000011920928955, 0, 0, 'at_shade_of_medivh_ceaseless_winter_jump_check', 45745), -- SpellForVisuals: 227779 (Ceaseless Winter)
+(8848, 0, 12878, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 20000, 0, 4, 40, 40, 15, 15, 0.300000011920928955, 0.300000011920928955, 0, 0, 'at_shade_of_medivh_ceaseless_winter', 45745), -- SpellForVisuals: 227779 (Ceaseless Winter)
+(8879, 0, @AREATRIGGERID+1, 1, 0, 0, 0, 2319, 0, -1, 0, 89, NULL, 20000, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, '', 45745); -- Spell: 228588 (Ceaseless Winter)
+
+-- Texts
+DELETE FROM `creature_text` WHERE `CreatureID` = 114350;
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(114350, 0, 0, 'This is who I am. I was tainted from birth, polluted from before my conception, a bad seed grown to bear bitter fruit.', 14, 0, 100, 0, 0, 77556, 123824, 0, 'Shade of Medivh'),
+(114350, 1, 0, 'You\'re just like the others, aren\'t you?', 14, 0, 50, 0, 0, 77558, 123832, 0, 'Shade of Medivh to Player'),
+(114350, 1, 1, 'Hello, champions. I\'ve been expecting you.', 14, 0, 50, 0, 0, 77552, 123831, 0, 'Shade of Medivh to Player'),
+(114350, 2, 0, '|TInterface\\Icons\\spell_mage_infernoblast:20|tYou are targeted by |cFFF00000|Hspell:227615|h[Inferno Bolt]|h|r!', 42, 0, 100, 0, 0, 77558, 123231, 0, 'Shade of Medivh to Player'),
+(114350, 3, 0, 'The inherent nature of fire...', 14, 0, 50, 0, 0, 77561, 123812, 0, 'Shade of Medivh'),
+(114350, 3, 1, 'Burn... just like that dragon!', 14, 0, 50, 0, 0, 77570, 123813, 0, 'Shade of Medivh'),
+(114350, 4, 0, '|TINTERFACE\\ICONS\\SPELL_SHAMAN_IMPROVEDFIRENOVA:20|tShade of Medivh begins to cast |cFFF00000|Hspell:228269|h[Flame Wreath]|h|r!', 41, 0, 100, 0, 0, 77550, 123526, 0, 'Shade of Medivh'),
+(114350, 5, 0, 'It burns, burns, burns!', 14, 0, 50, 0, 0, 77550, 123819, 0, 'Shade of Medivh'),
+(114350, 5, 1, 'I suggest staying put.', 14, 0, 50, 0, 0, 77566 , 123820, 0, 'Shade of Medivh'),
+(114350, 6, 0, 'Winter is here!', 14, 0, 50, 0, 0, 77572, 123821, 0, 'Shade of Medivh'),
+(114350, 6, 1, 'Keep still. Let it end.', 14, 0, 50, 0, 0, 77555, 123822, 0, 'Shade of Medivh to Player'),
+(114350, 7, 0, 'So many pieces of me...', 14, 0, 50, 0, 0, 77565, 123817, 0, 'Shade of Medivh'),
+(114350, 7, 1, 'Carrion for the birds...', 14, 0, 50, 0, 0, 77562, 123818, 0, 'Shade of Medivh'),
+(114350, 8, 0, 'A memory, frozen in time!', 14, 0, 100, 0, 0, 77560, 123809, 0, 'Shade of Medivh to Player'),
+(114350, 8, 1, 'The tower needed a new decoration.', 14, 0, 100, 0, 0, 77571, 123810, 0, 'Shade of Medivh to Player'),
+(114350, 9, 0, 'A basic spell... but effective.', 14, 0, 100, 0, 0, 77549, 123816, 0, 'Shade of Medivh to Player'),
+(114350, 10, 0, 'Just. Gets. Easier.', 14, 0, 33, 0, 0, 77551, 123826, 0, 'Shade of Medivh to Player'),
+(114350, 10, 1, 'A fitting end for a thief!', 14, 0, 33, 0, 0, 77554, 123829, 0, 'Shade of Medivh to Player'),
+(114350, 10, 2, 'All goes as planned.', 14, 0, 33, 0, 0, 77557, 123828, 0, 'Shade of Medivh to Player'),
+(114350, 11, 0, 'You grow weaker... I grow stronger!', 14, 0, 100, 0, 0, 77564, 123815, 0, 'Shade of Medivh to Player'),
+(114350, 12, 0, 'Once you get used to it, you can kill friends as easily as anyone else.', 14, 0, 50, 0, 0, 77573, 123834, 0, 'Shade of Medivh to Player'),
+(114350, 12, 1, 'You have no idea what it\'s like to do the things I\'ve done. Harsh things. Necessary things.', 14, 0, 50, 0, 0, 77559, 123835, 0, 'Shade of Medivh to Player'),
+(114350, 13, 0, 'So... it comes... to this...', 14, 0, 33, 0, 0, 77567, 123838, 0, 'Shade of Medivh to Player'),
+(114350, 13, 1, 'Atiesh... will be... splintered...', 14, 0, 3, 0, 0, 77569, 123839, 0, 'Shade of Medivh to Player'),
+(114350, 13, 2, 'I fought it... for as long as... I could...', 14, 0, 33, 0, 0, 77563, 123836, 0, 'Shade of Medivh to Player'),
+(114350, 14, 0, 'My staff... a relic, yes, but MINE!', 14, 0, 100, 0, 0, 77568, 123833, 0, 'Shade of Medivh to Player');
+
+-- Conditions
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=228558;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(13, 1, 228558, 0, 0, 51, 0, 5, 114350, 0, '', 0, 0, 0, '', 'Spell \'Reform Visual\' can only hit \'Shade of Medivh\'');
+
+-- Spells
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_shade_of_medivh_arcane_bolt_selector', 'spell_shade_of_medivh_basic_primer', 'spell_shade_of_medivh_ceaseless_winter_periodic', 'spell_shade_of_medivh_flame_wreath_selector', 'spell_shade_of_medivh_guardians_image', 'spell_shade_of_medivh_inferno_bolt_marker', 'spell_shade_of_medivh_mana_regen', 'spell_shade_of_medivh_piercing_missiles', 'spell_shade_of_medivh_signature_primer', 'spell_shade_of_medivh_vo_controller', 'spell_shade_of_medivh_vo_controller_cast');
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(228992, 'spell_shade_of_medivh_arcane_bolt_selector'),
+(227599, 'spell_shade_of_medivh_basic_primer'),
+(228237, 'spell_shade_of_medivh_signature_primer'),
+(228222, 'spell_shade_of_medivh_ceaseless_winter_periodic'),
+(228269, 'spell_shade_of_medivh_flame_wreath_selector'),
+(228334, 'spell_shade_of_medivh_guardians_image'),
+(228249, 'spell_shade_of_medivh_inferno_bolt_marker'),
+(228582, 'spell_shade_of_medivh_mana_regen'),
+(227628, 'spell_shade_of_medivh_piercing_missiles'),
+(232314, 'spell_shade_of_medivh_vo_controller'),
+(227592, 'spell_shade_of_medivh_vo_controller_cast'),
+(227615, 'spell_shade_of_medivh_vo_controller_cast');
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index 953c349bad7..66fd60bfcdb 100644
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -26,6 +26,7 @@
class AreaBoundary;
class AreaTrigger;
+class AuraApplication;
class Creature;
class DynamicObject;
class GameObject;
@@ -144,6 +145,12 @@ class TC_GAME_API CreatureAI : public UnitAI
// Called when a channeled spell finishes
virtual void OnChannelFinished(SpellInfo const* /*spell*/) { }
+ // Called when aura is applied
+ virtual void OnAuraApplied(AuraApplication const* /*aurApp*/) { }
+
+ // Called when aura is removed
+ virtual void OnAuraRemoved(AuraApplication const* /*aurApp*/) { }
+
// Should return true if the NPC is currently being escorted
virtual bool IsEscorted() const { return false; }
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index cdc2530617c..c210b7ea582 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -29,6 +29,7 @@
#include "PetDefines.h"
#include "Player.h"
#include "ScriptMgr.h"
+#include "SpellAuras.h"
#include "Vehicle.h"
#include "WaypointManager.h"
@@ -611,6 +612,16 @@ void SmartAI::OnSpellStart(SpellInfo const* spellInfo)
GetScript()->ProcessEventsFor(SMART_EVENT_ON_SPELL_START, nullptr, 0, 0, false, spellInfo);
}
+void SmartAI::OnAuraApplied(AuraApplication const* aurApp)
+{
+ GetScript()->ProcessEventsFor(SMART_EVENT_ON_AURA_APPLIED, nullptr, 0, 0, false, aurApp->GetBase()->GetSpellInfo());
+}
+
+void SmartAI::OnAuraRemoved(AuraApplication const* aurApp)
+{
+ GetScript()->ProcessEventsFor(SMART_EVENT_ON_AURA_REMOVED, nullptr, 0, 0, false, aurApp->GetBase()->GetSpellInfo());
+}
+
void SmartAI::DamageTaken(Unit* doneBy, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/)
{
GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage);
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 0d1054796d2..79ab404e971 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -132,6 +132,12 @@ class TC_GAME_API SmartAI : public CreatureAI
// Called when a spell starts
void OnSpellStart(SpellInfo const* spellInfo) override;
+ // Called when aura is applied
+ void OnAuraApplied(AuraApplication const* aurApp) override;
+
+ // Called when aura is removed
+ void OnAuraRemoved(AuraApplication const* aurApp) override;
+
// Called at any Damage from any attacker (before damage apply)
void DamageTaken(Unit* doneBy, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index e1715f787b6..7eccef96070 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -3366,6 +3366,8 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
case SMART_EVENT_ON_SPELL_CAST:
case SMART_EVENT_ON_SPELL_FAILED:
case SMART_EVENT_ON_SPELL_START:
+ case SMART_EVENT_ON_AURA_APPLIED:
+ case SMART_EVENT_ON_AURA_REMOVED:
{
if (!spell)
return;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 82ec392bfdb..7fceb43a614 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -844,6 +844,8 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e)
case SMART_EVENT_ON_SPELL_CAST: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_SPELL_FAILED: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_SPELL_START: return sizeof(SmartEvent::spellCast);
+ case SMART_EVENT_ON_AURA_APPLIED: return sizeof(SmartEvent::spellCast);
+ case SMART_EVENT_ON_AURA_REMOVED: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_DESPAWN: return NO_PARAMS;
case SMART_EVENT_SEND_EVENT_TRIGGER: return NO_PARAMS;
case SMART_EVENT_AREATRIGGER_EXIT: return NO_PARAMS;
@@ -1255,6 +1257,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_EVENT_ON_SPELL_CAST:
case SMART_EVENT_ON_SPELL_FAILED:
case SMART_EVENT_ON_SPELL_START:
+ case SMART_EVENT_ON_AURA_APPLIED:
+ case SMART_EVENT_ON_AURA_REMOVED:
{
if (!IsSpellValid(e, e.event.spellCast.spell))
return false;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 0c57aaf5415..ea7459ac26f 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -189,8 +189,10 @@ enum SMART_EVENT
SMART_EVENT_ON_DESPAWN = 86, // NONE
SMART_EVENT_SEND_EVENT_TRIGGER = 87, // NONE
SMART_EVENT_AREATRIGGER_EXIT = 88, // NONE
+ SMART_EVENT_ON_AURA_APPLIED = 89, // SpellID, CooldownMin, CooldownMax
+ SMART_EVENT_ON_AURA_REMOVED = 90, // SpellID, CooldownMin, CooldownMax
- SMART_EVENT_END = 89
+ SMART_EVENT_END = 91
};
struct SmartEvent
@@ -1608,7 +1610,9 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_ON_SPELL_START, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_ON_DESPAWN, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_SEND_EVENT_TRIGGER, SMART_SCRIPT_TYPE_MASK_EVENT },
- {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }
+ {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
+ {SMART_EVENT_ON_AURA_APPLIED, SMART_SCRIPT_TYPE_MASK_CREATURE },
+ {SMART_EVENT_ON_AURA_REMOVED, SMART_SCRIPT_TYPE_MASK_CREATURE },
};
enum SmartEventFlags
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index 2739854926b..b6716c248ae 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -32,6 +32,7 @@
#include "Player.h"
#include "SharedDefines.h"
#include "World.h"
+#include "WorldSession.h"
bool BattlegroundTemplate::IsArena() const
{
@@ -64,7 +65,7 @@ uint8 BattlegroundTemplate::GetMaxLevel() const
BattlegroundMgr::BattlegroundMgr() :
m_NextRatedArenaUpdate(sWorld->getIntConfig(CONFIG_ARENA_RATED_UPDATE_TIMER)),
- m_UpdateTimer(0), m_ArenaTesting(false), m_Testing(false)
+ m_UpdateTimer(0), m_ArenaTesting(0), m_Testing(false)
{ }
BattlegroundMgr::~BattlegroundMgr()
@@ -300,6 +301,15 @@ BattlegroundScriptTemplate const* BattlegroundMgr::FindBattlegroundScriptTemplat
return Trinity::Containers::MapGetValuePtr(_battlegroundScriptTemplates, { mapId, BATTLEGROUND_TYPE_NONE });
}
+void BattlegroundMgr::QueuePlayerForArena(Player const* player, uint8 teamSize, uint8 roles)
+{
+ WorldPackets::Battleground::BattlemasterJoinArena packet((WorldPacket(CMSG_BATTLEMASTER_JOIN_ARENA)));
+ packet.TeamSizeIndex = teamSize;
+ packet.Roles = roles;
+
+ player->GetSession()->HandleBattlemasterJoinArena(packet);
+}
+
uint32 BattlegroundMgr::CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
{
if (IsArenaType(bgTypeId))
@@ -507,10 +517,23 @@ void BattlegroundMgr::ToggleTesting()
sWorld->SendWorldText(m_Testing ? LANG_DEBUG_BG_ON : LANG_DEBUG_BG_OFF);
}
-void BattlegroundMgr::ToggleArenaTesting()
+bool BattlegroundMgr::ToggleArenaTesting(uint32 battlemasterListId)
{
- m_ArenaTesting = !m_ArenaTesting;
- sWorld->SendWorldText(m_ArenaTesting ? LANG_DEBUG_ARENA_ON : LANG_DEBUG_ARENA_OFF);
+ if (battlemasterListId != 0)
+ {
+ BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(static_cast<BattlegroundTypeId>(battlemasterListId));
+ if (!bgTemplate)
+ return false;
+
+ if (!bgTemplate->IsArena())
+ return false;
+ }
+
+ if (m_ArenaTesting != battlemasterListId)
+ sWorld->SendWorldText((battlemasterListId != 0) ? LANG_DEBUG_ARENA_ON : LANG_DEBUG_ARENA_OFF);
+
+ m_ArenaTesting = battlemasterListId;
+ return true;
}
bool BattlegroundMgr::IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
@@ -686,6 +709,9 @@ BattlegroundTypeId BattlegroundMgr::GetRandomBG(BattlegroundTypeId bgTypeId)
{
if (BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(bgTypeId))
{
+ if (bgTemplate->IsArena() && isArenaTesting())
+ return static_cast<BattlegroundTypeId>(m_ArenaTesting);
+
std::vector<BattlegroundTemplate const*> ids;
ids.reserve(bgTemplate->MapIDs.size());
for (int32 mapId : bgTemplate->MapIDs)
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h
index b31b0193af0..8aa341cbca8 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.h
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h
@@ -126,10 +126,11 @@ class TC_GAME_API BattlegroundMgr
void ScheduleQueueUpdate(uint32 arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundBracketId bracket_id);
uint32 GetPrematureFinishTime() const;
- void ToggleArenaTesting();
+ // Return whether toggling was successful. In case of a non-existing battlemasterListId, or this battlemasterListId is not an arena, this would return false.
+ bool ToggleArenaTesting(uint32 battlemasterListId);
void ToggleTesting();
- bool isArenaTesting() const { return m_ArenaTesting; }
+ bool isArenaTesting() const { return m_ArenaTesting != 0; }
bool isTesting() const { return m_Testing; }
static bool IsRandomBattleground(uint32 battlemasterListId);
@@ -162,6 +163,8 @@ class TC_GAME_API BattlegroundMgr
void LoadBattlegroundScriptTemplate();
BattlegroundScriptTemplate const* FindBattlegroundScriptTemplate(uint32 mapId, BattlegroundTypeId bgTypeId) const;
+ static void QueuePlayerForArena(Player const* player, uint8 teamSize, uint8 roles);
+
private:
uint32 CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id);
static bool IsArenaType(BattlegroundTypeId bgTypeId);
@@ -185,7 +188,7 @@ class TC_GAME_API BattlegroundMgr
std::vector<ScheduledQueueUpdate> m_QueueUpdateScheduler;
uint32 m_NextRatedArenaUpdate;
uint32 m_UpdateTimer;
- bool m_ArenaTesting;
+ uint32 m_ArenaTesting;
bool m_Testing;
BattleMastersMap mBattleMastersMap;
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index 6cf24b10671..b9ff4085f20 100644
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -444,9 +444,6 @@ ObjectGuid::LowType ChatHandler::extractLowGuidFromLink(char* text, HighGuid& gu
return player->GetGUID().GetCounter();
ObjectGuid guid = sCharacterCache->GetCharacterGuidByName(name);
- if (guid.IsEmpty())
- return 0;
-
return guid.GetCounter();
}
case GUID_LINK_CREATURE:
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index fcf78441463..89012688d26 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -103,7 +103,7 @@ char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX_D
ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] =
{
{ .Name = "None", .HasConditionValue1 = false, .HasConditionValue2 = false, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
- { .Name = "Aura", .HasConditionValue1 = true, .HasConditionValue2 = true, .HasConditionValue3 = true, .HasConditionStringValue1 = false },
+ { .Name = "Aura", .HasConditionValue1 = true, .HasConditionValue2 = true, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
{ .Name = "Item Stored", .HasConditionValue1 = true, .HasConditionValue2 = true, .HasConditionValue3 = true, .HasConditionStringValue1 = false },
{ .Name = "Item Equipped", .HasConditionValue1 = true, .HasConditionValue2 = false, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
{ .Name = "Zone", .HasConditionValue1 = true, .HasConditionValue2 = false, .HasConditionValue3 = false, .HasConditionStringValue1 = false },
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 829aa4d4816..1ed4b4d06ca 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -178,7 +178,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), 1.0f);
- if (caster)
+ if (caster && spellInfo)
{
if (Player const* modOwner = caster->GetSpellModOwner())
{
@@ -894,6 +894,14 @@ void AreaTrigger::HandleUnitEnter(Unit* unit)
DoActions(unit);
_ai->OnUnitEnter(unit);
+
+ // OnUnitEnter script can despawn this areatrigger
+ if (!IsInWorld())
+ return;
+
+ // Register areatrigger in Unit after actions/scripts to allow them to determine
+ // if the unit is in one or more areatriggers with the same id
+ // without forcing every script to have additional logic excluding this areatrigger
unit->EnterAreaTrigger(this);
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index c8c75eb8279..0bcdbbd1ec7 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5626,8 +5626,8 @@ bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step)
if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
return false;
- uint16 value = m_activePlayerData->Skill->SkillRank[itr->second.pos];
- uint16 max = m_activePlayerData->Skill->SkillMaxRank[itr->second.pos];
+ uint16 value = GetSkillRankByPos(itr->second.pos);
+ uint16 max = GetSkillMaxRankByPos(itr->second.pos);
if (!max || !value || value >= max)
return false;
@@ -5666,13 +5666,13 @@ bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step)
void Player::ModifySkillBonus(uint32 skillid, int32 val, bool talent)
{
SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return;
if (talent)
- SetSkillPermBonus(itr->second.pos, m_activePlayerData->Skill->SkillPermBonus[itr->second.pos] + val);
+ SetSkillPermBonus(itr->second.pos, GetSkillPermBonusByPos(itr->second.pos) + val);
else
- SetSkillTempBonus(itr->second.pos, m_activePlayerData->Skill->SkillTempBonus[itr->second.pos] + val);
+ SetSkillTempBonus(itr->second.pos, GetSkillTempBonusByPos(itr->second.pos) + val);
// Apply/Remove bonus to child skill lines
if (std::vector<SkillLineEntry const*> const* childSkillLines = sDB2Manager.GetSkillLinesForParentSkill(skillid))
@@ -5687,7 +5687,7 @@ void Player::UpdateSkillsForLevel()
for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end(); ++itr)
{
- if (itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
continue;
uint32 pskill = itr->first;
@@ -5706,7 +5706,7 @@ void Player::UpdateSkillsForLevel()
}
// Update level dependent skillline spells
- LearnSkillRewardedSpells(rcEntry->SkillID, m_activePlayerData->Skill->SkillRank[itr->second.pos], race);
+ LearnSkillRewardedSpells(rcEntry->SkillID, GetSkillRankByPos(itr->second.pos), race);
}
}
@@ -5761,7 +5761,7 @@ void Player::SetSkill(uint32 id, uint16 step, uint16 newVal, uint16 maxVal)
// Handle already stored skills
if (itr != mSkillStatus.end())
{
- currVal = m_activePlayerData->Skill->SkillRank[itr->second.pos];
+ currVal = GetSkillRankByPos(itr->second.pos);
// Activate and update skill line
if (newVal)
@@ -5879,7 +5879,7 @@ void Player::SetSkill(uint32 id, uint16 step, uint16 newVal, uint16 maxVal)
// Find a free skill slot
for (uint32 i = 0; i < PLAYER_MAX_SKILLS; ++i)
{
- if (!m_activePlayerData->Skill->SkillLineID[i])
+ if (!GetSkillLineIdByPos(i))
{
skillSlot = i;
break;
@@ -5979,7 +5979,7 @@ bool Player::HasSkill(uint32 skill) const
return false;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- return (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED && m_activePlayerData->Skill->SkillRank[itr->second.pos]);
+ return itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED && GetSkillRankByPos(itr->second.pos);
}
uint16 Player::GetSkillStep(uint32 skill) const
@@ -5988,10 +5988,10 @@ uint16 Player::GetSkillStep(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillStep[itr->second.pos];
+ return GetSkillStepByPos(itr->second.pos);
}
uint16 Player::GetSkillValue(uint32 skill) const
@@ -6000,12 +6000,12 @@ uint16 Player::GetSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- int32 result = int32(m_activePlayerData->Skill->SkillRank[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillTempBonus[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillPermBonus[itr->second.pos]);
+ int32 result = int32(GetSkillRankByPos(itr->second.pos));
+ result += int32(GetSkillTempBonusByPos(itr->second.pos));
+ result += int32(GetSkillPermBonusByPos(itr->second.pos));
return result < 0 ? 0 : result;
}
@@ -6015,12 +6015,12 @@ uint16 Player::GetMaxSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- int32 result = int32(m_activePlayerData->Skill->SkillMaxRank[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillTempBonus[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillPermBonus[itr->second.pos]);
+ int32 result = int32(GetSkillMaxRankByPos(itr->second.pos));
+ result += int32(GetSkillTempBonusByPos(itr->second.pos));
+ result += int32(GetSkillPermBonusByPos(itr->second.pos));
return result < 0 ? 0 : result;
}
@@ -6030,10 +6030,10 @@ uint16 Player::GetPureMaxSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillMaxRank[itr->second.pos];
+ return GetSkillMaxRankByPos(itr->second.pos);
}
uint16 Player::GetBaseSkillValue(uint32 skill) const
@@ -6042,11 +6042,11 @@ uint16 Player::GetBaseSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- int32 result = int32(m_activePlayerData->Skill->SkillRank[itr->second.pos]);
- result += int32(m_activePlayerData->Skill->SkillPermBonus[itr->second.pos]);
+ int32 result = int32(GetSkillRankByPos(itr->second.pos));
+ result += int32(GetSkillPermBonusByPos(itr->second.pos));
return result < 0 ? 0 : result;
}
@@ -6056,10 +6056,10 @@ uint16 Player::GetPureSkillValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillRank[itr->second.pos];
+ return GetSkillRankByPos(itr->second.pos);
}
int16 Player::GetSkillPermBonusValue(uint32 skill) const
@@ -6068,10 +6068,10 @@ int16 Player::GetSkillPermBonusValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillPermBonus[itr->second.pos];
+ return GetSkillPermBonusByPos(itr->second.pos);
}
int16 Player::GetSkillTempBonusValue(uint32 skill) const
@@ -6080,10 +6080,10 @@ int16 Player::GetSkillTempBonusValue(uint32 skill) const
return 0;
SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
- if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !m_activePlayerData->Skill->SkillRank[itr->second.pos])
+ if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED || !GetSkillRankByPos(itr->second.pos))
return 0;
- return m_activePlayerData->Skill->SkillTempBonus[itr->second.pos];
+ return GetSkillTempBonusByPos(itr->second.pos);
}
void Player::SendActionButtons(uint32 state) const
@@ -21205,8 +21205,8 @@ void Player::_SaveSkills(CharacterDatabaseTransaction trans)
continue;
}
- uint16 value = m_activePlayerData->Skill->SkillRank[itr->second.pos];
- uint16 max = m_activePlayerData->Skill->SkillMaxRank[itr->second.pos];
+ uint16 value = GetSkillRankByPos(itr->second.pos);
+ uint16 max = GetSkillMaxRankByPos(itr->second.pos);
int8 professionSlot = int8(GetProfessionSlotFor(itr->first));
switch (itr->second.uState)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 51c91183d20..2b615518381 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2310,12 +2310,19 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue, Races race);
int32 GetProfessionSlotFor(uint32 skillId) const;
int32 FindEmptyProfessionSlotFor(uint32 skillId) const;
+ uint16 GetSkillLineIdByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillLineID[pos]; }
void SetSkillLineId(uint32 pos, uint16 skillLineId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillLineID, pos), skillLineId); }
- void SetSkillStep(uint32 pos, uint16 step) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillStep, pos), step); };
+ uint16 GetSkillStepByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillStep[pos]; }
+ void SetSkillStep(uint32 pos, uint16 step) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillStep, pos), step); }
+ uint16 GetSkillRankByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillRank[pos]; }
void SetSkillRank(uint32 pos, uint16 rank) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillRank, pos), rank); }
+ uint16 GetSkillStartingRankByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillStartingRank[pos]; }
void SetSkillStartingRank(uint32 pos, uint16 starting) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillStartingRank, pos), starting); }
+ uint16 GetSkillMaxRankByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillMaxRank[pos]; }
void SetSkillMaxRank(uint32 pos, uint16 max) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillMaxRank, pos), max); }
+ int16 GetSkillTempBonusByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillTempBonus[pos]; }
void SetSkillTempBonus(uint32 pos, uint16 bonus) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillTempBonus, pos), bonus); }
+ uint16 GetSkillPermBonusByPos(uint32 pos) const { return m_activePlayerData->Skill->SkillPermBonus[pos]; }
void SetSkillPermBonus(uint32 pos, uint16 bonus) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::Skill).ModifyValue(&UF::SkillInfo::SkillPermBonus, pos), bonus); }
TeleportLocation& GetTeleportDest() { return m_teleport_dest; }
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index aa504001619..36246c0c1a8 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -237,7 +237,7 @@ void Group::LoadGroupFromDB(Field* fields)
m_raidDifficulty = Player::CheckLoadedRaidDifficultyID(Difficulty(fields[14].GetUInt8()));
m_legacyRaidDifficulty = Player::CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[15].GetUInt8()));
- m_masterLooterGuid = ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt64());
+ m_masterLooterGuid = fields[16].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt64()) : ObjectGuid::Empty;
m_pingRestriction = RestrictPingsTo(fields[18].GetInt8());
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 8fb5a150793..e78a52042b9 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -540,9 +540,16 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
return;
Group* grp = _player->GetGroup();
+ if (!grp)
+ {
+ grp = new Group();
+ grp->Create(_player);
+ }
+
// no group found, error
if (!grp)
return;
+
if (grp->GetLeaderGUID() != _player->GetGUID())
return;
@@ -559,7 +566,10 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
GroupQueueInfo* ginfo = nullptr;
ObjectGuid errorGuid;
- GroupJoinBattlegroundResult err = grp->CanJoinBattlegroundQueue(bgTemplate, bgQueueTypeId, arenatype, arenatype, true, packet.TeamSizeIndex, errorGuid);
+ GroupJoinBattlegroundResult err = ERR_BATTLEGROUND_NONE;
+ if (!sBattlegroundMgr->isArenaTesting())
+ err = grp->CanJoinBattlegroundQueue(bgTemplate, bgQueueTypeId, arenatype, arenatype, true, packet.TeamSizeIndex, errorGuid);
+
if (!err)
{
TC_LOG_DEBUG("bg.battleground", "Battleground: arena team id {}, leader {} queued with matchmaker rating {} for type {}", _player->GetArenaTeamId(packet.TeamSizeIndex), _player->GetName(), matchmakerRating, arenatype);
diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp
index 299fef61b80..745783a536a 100644
--- a/src/server/game/Maps/MapScripts.cpp
+++ b/src/server/game/Maps/MapScripts.cpp
@@ -325,7 +325,7 @@ void Map::ScriptsProcess()
{
switch (step.sourceGUID.GetHigh())
{
- case HighGuid::Item: // as well as HIGHGUID_CONTAINER
+ case HighGuid::Item:
if (Player* player = GetPlayer(step.ownerGUID))
source = player->GetItemByGuid(step.sourceGUID);
break;
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 3d9100457c0..248fd007871 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -19,6 +19,7 @@
#include "CellImpl.h"
#include "Common.h"
#include "Containers.h"
+#include "CreatureAI.h"
#include "DynamicObject.h"
#include "GridNotifiersImpl.h"
#include "Item.h"
@@ -1593,6 +1594,19 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
}
break;
}
+
+ if (apply)
+ {
+ if (Creature* creature = target->ToCreature())
+ if (CreatureAI* ai = creature->AI())
+ ai->OnAuraApplied(aurApp);
+ }
+ else
+ {
+ if (Creature* creature = target->ToCreature())
+ if (CreatureAI* ai = creature->AI())
+ ai->OnAuraRemoved(aurApp);
+ }
}
bool Aura::CanBeAppliedOn(Unit* target)
diff --git a/src/server/scripts/Battlegrounds/CageOfCarnage/arena_cage_of_carnage.cpp b/src/server/scripts/Battlegrounds/CageOfCarnage/arena_cage_of_carnage.cpp
new file mode 100644
index 00000000000..8ef5d8903a0
--- /dev/null
+++ b/src/server/scripts/Battlegrounds/CageOfCarnage/arena_cage_of_carnage.cpp
@@ -0,0 +1,332 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Battleground.h"
+#include "BattlegroundScript.h"
+#include "Creature.h"
+#include "CreatureAI.h"
+#include "GameObject.h"
+#include "Map.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+#include "SpellScript.h"
+#include "TaskScheduler.h"
+
+namespace CageOfCarnage
+{
+ namespace Actions
+ {
+ static constexpr uint32 ReactionTrigger = 1;
+ static constexpr uint32 ReactionDead = 2;
+ }
+
+ namespace Creatures
+ {
+ static constexpr uint32 NaminzeBoltfingers = 232750;
+ }
+
+ namespace GameObjects
+ {
+ static constexpr uint32 GoblinArenaTrapDoor01 = 505683;
+ }
+
+ namespace MapIds
+ {
+ static constexpr uint32 CageOfCarnage = 2759;
+ }
+
+ namespace Positions
+ {
+ static constexpr Position PurpleWarningTeleport = { 442.311f, 343.167f, -34.1166f, 1.7453293f };
+ static constexpr Position GoldWarningTeleport = { 443.167f, 439.243f, -42.6562f, 4.5902157f };
+ }
+
+ namespace Spells
+ {
+ static constexpr uint32 UndermineArenaVOCooldownAura = 472905;
+ static constexpr uint32 UndermineArenaVOCooldownAuraPlayerDeath = 472913;
+ static constexpr uint32 UndermineArenaReactionTrigger = 472885;
+ static constexpr uint32 ArenaLowHealthCooldownAura = 234031;
+ static constexpr uint32 Warning = 1214676;
+ static constexpr uint32 WarningTeleport = 371319;
+ static constexpr uint32 ArenaStartingAreaMarker = 228212;
+ }
+
+ namespace Texts
+ {
+ namespace Naminze
+ {
+ static constexpr uint8 Prepare = 0;
+ static constexpr uint8 Start = 1;
+ static constexpr uint8 ReactionAlmostDead = 2;
+ static constexpr uint8 ReactionKill = 3;
+ }
+ }
+}
+
+struct arena_cage_of_carnage : ArenaScript
+{
+ explicit arena_cage_of_carnage(BattlegroundMap* map) : ArenaScript(map) { }
+
+ void OnUpdate(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+ void OnStart() override
+ {
+ for (ObjectGuid const& guid : _doorGUIDs)
+ {
+ if (GameObject* door = battlegroundMap->GetGameObject(guid))
+ {
+ door->UseDoorOrButton();
+ door->DespawnOrUnsummon(5s);
+ }
+ }
+
+ if (Creature const* creature = battlegroundMap->GetCreature(_naminzeGUID))
+ creature->AI()->Talk(CageOfCarnage::Texts::Naminze::Start);
+
+ _scheduler.Schedule(5s, [&](TaskContext context)
+ {
+ battlegroundMap->DoOnPlayers([&](Player* player)
+ {
+ if (!player->HasAura(CageOfCarnage::Spells::ArenaStartingAreaMarker))
+ return;
+
+ if (player->HasAura(CageOfCarnage::Spells::Warning))
+ return;
+
+ player->CastSpell(nullptr, CageOfCarnage::Spells::Warning, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+ });
+
+ context.Repeat();
+ });
+ }
+
+ void DoAction(uint32 actionId, WorldObject* source, WorldObject* target) override
+ {
+ switch (actionId)
+ {
+ case CageOfCarnage::Actions::ReactionTrigger:
+ HandleReactionLowHealth(Object::ToPlayer(source));
+ break;
+ case CageOfCarnage::Actions::ReactionDead:
+ HandleKill(Object::ToPlayer(target));
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnPrepareStage2() override
+ {
+ if (Creature const* creature = battlegroundMap->GetCreature(_naminzeGUID))
+ creature->AI()->Talk(CageOfCarnage::Texts::Naminze::Prepare);
+ }
+
+ void OnCreatureCreate(Creature* creature) override
+ {
+ switch (creature->GetEntry())
+ {
+ case CageOfCarnage::Creatures::NaminzeBoltfingers:
+ _naminzeGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnGameObjectCreate(GameObject* gameobject) override
+ {
+ switch (gameobject->GetEntry())
+ {
+ case CageOfCarnage::GameObjects::GoblinArenaTrapDoor01:
+ _doorGUIDs.emplace_back(gameobject->GetGUID());
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnPlayerJoined(Player* player, bool /*inBattleground*/) override
+ {
+ player->CastSpell(nullptr, CageOfCarnage::Spells::UndermineArenaReactionTrigger, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+ }
+
+ void HandleKill(Player const* victim) const
+ {
+ if (!victim)
+ return;
+
+ if (Creature* creature = battlegroundMap->GetCreature(_naminzeGUID))
+ {
+ if (creature->HasAura(CageOfCarnage::Spells::UndermineArenaVOCooldownAuraPlayerDeath))
+ return;
+
+ creature->AI()->Talk(CageOfCarnage::Texts::Naminze::ReactionKill, victim);
+
+ creature->CastSpell(nullptr, CageOfCarnage::Spells::UndermineArenaVOCooldownAuraPlayerDeath, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+ }
+ }
+
+ void HandleReactionLowHealth(Player const* victim) const
+ {
+ if (!victim)
+ return;
+
+ if (Creature* creature = battlegroundMap->GetCreature(_naminzeGUID))
+ {
+ if (creature->HasAura(CageOfCarnage::Spells::UndermineArenaVOCooldownAura))
+ return;
+
+ creature->AI()->Talk(CageOfCarnage::Texts::Naminze::ReactionAlmostDead, victim);
+
+ creature->CastSpell(nullptr, CageOfCarnage::Spells::UndermineArenaVOCooldownAura, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+ }
+ }
+
+private:
+ GuidVector _doorGUIDs;
+ ObjectGuid _naminzeGUID;
+
+ TaskScheduler _scheduler;
+};
+
+// 472883 - Undermine Arena Reaction Trigger - Low Health
+class spell_undermine_arena_reaction_trigger_low_health : public SpellScript
+{
+ bool Load() override
+ {
+ return GetCaster()->GetMapId() == CageOfCarnage::MapIds::CageOfCarnage;
+ }
+
+ void HandleHit(SpellEffIndex /*effIndex*/) const
+ {
+ Unit* target = GetHitUnit();
+ if (target->HasAura(CageOfCarnage::Spells::ArenaLowHealthCooldownAura))
+ return;
+
+ target->CastSpell(nullptr, CageOfCarnage::Spells::ArenaLowHealthCooldownAura, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+
+ if (ZoneScript* zoneScript = target->FindZoneScript())
+ zoneScript->DoAction(CageOfCarnage::Actions::ReactionTrigger, GetCaster(), target);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_undermine_arena_reaction_trigger_low_health::HandleHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
+// 472885 - Undermine Arena Reaction Trigger
+class spell_undermine_arena_reaction_trigger : public AuraScript
+{
+ bool Load() override
+ {
+ return GetOwner()->GetMapId() == CageOfCarnage::MapIds::CageOfCarnage;
+ }
+
+ void HandleProc(ProcEventInfo const& eventInfo) const
+ {
+ if (ZoneScript* zonescript = GetTarget()->FindZoneScript())
+ zonescript->DoAction(CageOfCarnage::Actions::ReactionDead, eventInfo.GetActor(), eventInfo.GetProcTarget());
+ }
+
+ void Register() override
+ {
+ OnProc += AuraProcFn(spell_undermine_arena_reaction_trigger::HandleProc);
+ }
+};
+
+// 1214676 - Warning (countdown)
+class spell_undermine_arena_warning_countdown : public AuraScript
+{
+ bool Load() override
+ {
+ return GetOwner()->GetMapId() == CageOfCarnage::MapIds::CageOfCarnage;
+ }
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ CageOfCarnage::Spells::WarningTeleport });
+ }
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ Player* target= GetTarget()->ToPlayer();
+ if (!target)
+ return;
+
+ if (!target->HasAura(CageOfCarnage::Spells::ArenaStartingAreaMarker))
+ return;
+
+ target->CastSpell(nullptr, CageOfCarnage::Spells::WarningTeleport, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_undermine_arena_warning_countdown::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
+// 371319 - Warning Teleport
+class spell_undermine_arena_warning_teleport : public SpellScript
+{
+ bool Load() override
+ {
+ return GetCaster()->GetMapId() == CageOfCarnage::MapIds::CageOfCarnage;
+ }
+
+ void HandleTeleport(SpellEffIndex /*effIndex*/) const
+ {
+ Player* target = GetHitPlayer();
+ if (!target)
+ return;
+
+ if (target->GetBGTeam() == ALLIANCE)
+ target->NearTeleportTo(CageOfCarnage::Positions::PurpleWarningTeleport);
+ else
+ target->NearTeleportTo(CageOfCarnage::Positions::GoldWarningTeleport);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_undermine_arena_warning_teleport::HandleTeleport, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+void AddSC_arena_cage_of_carnage()
+{
+ RegisterBattlegroundMapScript(arena_cage_of_carnage, CageOfCarnage::MapIds::CageOfCarnage);
+ RegisterSpellScript(spell_undermine_arena_reaction_trigger_low_health);
+ RegisterSpellScript(spell_undermine_arena_reaction_trigger);
+ RegisterSpellScript(spell_undermine_arena_warning_countdown);
+ RegisterSpellScript(spell_undermine_arena_warning_teleport);
+}
diff --git a/src/server/scripts/Battlegrounds/battlegrounds_script_loader.cpp b/src/server/scripts/Battlegrounds/battlegrounds_script_loader.cpp
index 5bf00c0a80a..c2c3d8b3439 100644
--- a/src/server/scripts/Battlegrounds/battlegrounds_script_loader.cpp
+++ b/src/server/scripts/Battlegrounds/battlegrounds_script_loader.cpp
@@ -70,6 +70,8 @@ void AddSC_arena_the_robodrome();
void AddSC_arena_maldraxxus_coliseum();
+void AddSC_arena_cage_of_carnage();
+
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
void AddBattlegroundsScripts()
@@ -124,4 +126,6 @@ void AddBattlegroundsScripts()
AddSC_arena_the_robodrome();
AddSC_arena_maldraxxus_coliseum();
+
+ AddSC_arena_cage_of_carnage();
}
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 68020eb435d..3785f81f70a 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -39,6 +39,7 @@ EndScriptData */
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
#include "Language.h"
+#include "LFG.h"
#include "Log.h"
#include "M2Stores.h"
#include "MapManager.h"
@@ -856,9 +857,20 @@ public:
return true;
}
- static bool HandleDebugArenaCommand(ChatHandler* /*handler*/)
+ static bool HandleDebugArenaCommand(ChatHandler* handler, uint32 battlemasterListId)
{
- sBattlegroundMgr->ToggleArenaTesting();
+ bool successful = sBattlegroundMgr->ToggleArenaTesting(battlemasterListId);
+ if (!successful)
+ {
+ handler->PSendSysMessage("BattlemasterListId %u does not exist or is not an arena.", battlemasterListId);
+ handler->SetSentErrorMessage(true);
+ return true;
+ }
+
+ if (!battlemasterListId || !handler || !handler->GetSession())
+ return true;
+
+ BattlegroundMgr::QueuePlayerForArena(handler->GetSession()->GetPlayer(), 0, lfg::PLAYER_ROLE_DAMAGE);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/Gilneas/gilneas_chapter_1.cpp b/src/server/scripts/EasternKingdoms/Gilneas/gilneas_chapter_1.cpp
index 915c48f09f6..a249d16a0f5 100644
--- a/src/server/scripts/EasternKingdoms/Gilneas/gilneas_chapter_1.cpp
+++ b/src/server/scripts/EasternKingdoms/Gilneas/gilneas_chapter_1.cpp
@@ -154,8 +154,7 @@ class spell_gilneas_knocking : public SpellScript
void HandleEffect()
{
- if (SpellInfo const* spellInfo = GetSpellInfo())
- GetCaster()->CastSpell(GetCaster(), spellInfo->GetEffect(RAND(EFFECT_1, EFFECT_2)).CalcValue(), true);
+ GetCaster()->CastSpell(GetCaster(), GetEffectInfo(RAND(EFFECT_1, EFFECT_2)).CalcValue(), true);
}
void Register() override
diff --git a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_shade_of_medivh.cpp b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_shade_of_medivh.cpp
new file mode 100644
index 00000000000..c2d31a6b5f7
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_shade_of_medivh.cpp
@@ -0,0 +1,868 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "AreaTrigger.h"
+#include "AreaTriggerAI.h"
+#include "Containers.h"
+#include "Creature.h"
+#include "InstanceScript.h"
+#include "ObjectAccessor.h"
+#include "Player.h"
+#include "Position.h"
+#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
+#include "Spell.h"
+#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
+#include "SpellScript.h"
+#include "return_to_karazhan.h"
+
+enum ShadeOfMedivhSpells
+{
+ SPELL_ARCANE_CHANNEL = 189573,
+ SPELL_MANA_REGEN = 228582,
+ SPELL_VO_CONTROLLER = 232314,
+ SPELL_BASIC_PRIMER = 227599,
+ SPELL_INFERNO_BOLT = 227615,
+ SPELL_INFERNO_BOLT_MARKER = 228249,
+ SPELL_PIERCING_MISSILES = 227628,
+ SPELL_PIERCING_MISSILES_DEBUFF = 227644,
+ SPELL_FROSTBITE = 227592,
+ SPELL_SIGNATURE_PRIMER = 228237,
+ SPELL_FLAME_WREATH_SELECTOR = 228269,
+ SPELL_FLAME_WREATH_AREATRIGGER = 228257,
+ SPELL_FLAME_WREATH_AREA_DAMAGE = 228262,
+ SPELL_FLAME_WREATH_PERIODIC_DAMAGE = 228261,
+ SPELL_CEASELESS_WINTER = 227779,
+ SPELL_CEASELESS_WINTER_DAMAGE = 227806,
+ SPELL_CEASELESS_WINTER_PERIODIC = 228222,
+ SPELL_GUARDIANS_IMAGE = 228334,
+ SPELL_GUARDIANS_IMAGE_MISSILE = 228338,
+ SPELL_DISSOLVE = 228572,
+ SPELL_REFORM_VISUAL = 228558,
+ SPELL_REFORM_VISUAL_STATE_1 = 228568,
+ SPELL_REFORM_VISUAL_STATE_2 = 228569,
+ SPELL_ARCANE_DISSOLVE_IN = 228343,
+ SPELL_ARCANE_BOLT_SELECTOR = 228992,
+ SPELL_SHIMMER = 228521
+};
+
+enum ShadeOfMedivhEvents
+{
+ EVENT_BASIC_PRIMER = 1,
+ EVENT_CHECK_MANA,
+ EVENT_TELEPORT,
+ EVENT_BACK_TO_COMBAT,
+
+ // Guardian's Image
+ EVENT_ARCANE_BOLT
+};
+
+enum ShadeOfMedivhTexts
+{
+ SAY_INTRO = 0, // Implement later
+ SAY_AGGRO = 1,
+ SAY_INFERNO_BOLT_WARNING = 2,
+ SAY_INFERNO_BOLT = 3,
+ SAY_FLAME_WREATH_WARNING = 4,
+ SAY_FLAME_WREATH = 5,
+ SAY_CEASELESS_WINTER = 6,
+ SAY_GUARDIANS_IMAGE = 7,
+ SAY_FROSTBITE = 8,
+ SAY_PIERCING_MISSILES = 9,
+ SAY_SLAY = 10,
+ SAY_STRONGER = 11,
+ SAY_WIPE = 12,
+ SAY_DEAD = 13,
+ SAY_SPECIAL = 14 // Used if players have the item Atiesh, Greatstaff of the Guardian
+};
+
+enum ShadeOfMedivhActions
+{
+ ACTION_DISSOLVE = 1,
+ ACTION_FINISH_SPLIT,
+ ACTION_START_VISUALS
+};
+
+enum ShadeOfMedivhDatas
+{
+ DATA_INFERNO_BOLT_NEXT = 0,
+};
+
+enum ShadeOfMedivhVisuals
+{
+ SPELLVISUAL_ARCANE_MISSILE = 51100
+};
+
+static constexpr Position GuardiansImageMedivhPosition = { -4599.3f, -2517.86f, 2876.59f };
+static constexpr Position GuardiansImagePosition[3] =
+{
+ { -4599.8057f, -2494.7551f, 2876.6255f, 4.694935f },
+ { -4618.8994f, -2526.8315f, 2876.6252f, 0.663225f },
+ { -4581.1006f, -2526.6892f, 2876.6257f, 2.460914f }
+};
+
+static constexpr Position MedivhVisualSpellsPositions[14] =
+{
+ { -4573.2363f, -2517.875f, 2903.3594f },
+ { -4617.39f, -2499.2f, 2886.25f },
+ { -4620.2275f, -2535.092f, 2903.4875f },
+ { -4573.2363f, -2517.875f, 2885.7869f },
+ { -4617.3906f, -2499.1997f, 2902.f },
+ { -4598.722f, -2555.3784f, 2906.814f },
+ { -4580.137f, -2499.736f, 2887.0764f },
+ { -4624.4116f, -2517.2588f, 2886.9016f },
+ { -4624.4116f, -2517.2588f, 2904.4302f },
+ { -4580.137f, -2499.736f, 2902.3f },
+ { -4620.2275f, -2535.092f, 2887.8333f },
+ { -4577.932f, -2535.927f, 2902.615f },
+ { -4573.2363f, -2517.875f, 2903.3594f },
+ { -4577.932f, -2535.927f, 2885.7869f }
+};
+
+// 114350 - Shade of Medivh
+struct boss_shade_of_medivh : public BossAI
+{
+ boss_shade_of_medivh(Creature* creature) : BossAI(creature, DATA_SHADE_OF_MEDIVH), _triggeredSplit(false), _castInfernoBoltNext(0), _guardiansImageDefeatedCount(0) { }
+
+ void JustAppeared() override
+ {
+ scheduler.ClearValidator();
+ DoCastSelf(SPELL_ARCANE_CHANNEL);
+ me->SetPowerType(POWER_MANA);
+ me->SetPower(POWER_MANA, 0);
+
+ scheduler.Schedule(2s, [this](TaskContext task)
+ {
+ static constexpr uint8 VisualCount = 5;
+ static constexpr float TravelSpeed = 8.0f;
+
+ std::vector<Position> positions(std::begin(MedivhVisualSpellsPositions), std::end(MedivhVisualSpellsPositions));
+ Trinity::Containers::RandomShuffle(positions);
+
+ for (uint8 i = 0; i < VisualCount; i++)
+ {
+ me->SendPlaySpellVisual(positions[i], SPELLVISUAL_ARCANE_MISSILE, 0, 0, TravelSpeed);
+ }
+ task.Repeat(1200ms);
+ });
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustDied();
+ me->RemoveAllAreaTriggers();
+ Talk(SAY_DEAD);
+ }
+
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+
+ Talk(SAY_WIPE);
+ summons.DespawnAll();
+ me->RemoveAllAreaTriggers();
+ _EnterEvadeMode();
+ _DespawnAtEvade();
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (!victim->IsPlayer())
+ return;
+
+ Talk(SAY_SLAY);
+ }
+
+ void Reset() override
+ {
+ events.Reset();
+ _triggeredSplit = false;
+ _castInfernoBoltNext = 0;
+ _guardiansImageDefeatedCount = 0;
+ }
+
+ void DoAction(int32 action) override
+ {
+ switch (action)
+ {
+ case ACTION_DISSOLVE:
+ {
+ DoCastSelf(SPELL_DISSOLVE);
+ me->RemoveAurasDueToSpell(SPELL_MANA_REGEN);
+ me->AttackStop();
+ me->SetUninteractible(true);
+ me->SetReactState(REACT_PASSIVE);
+ events.ScheduleEvent(EVENT_TELEPORT, 2s);
+ events.CancelEvent(EVENT_BASIC_PRIMER);
+ break;
+ }
+ case ACTION_FINISH_SPLIT:
+ {
+ _triggeredSplit = false;
+ _guardiansImageDefeatedCount = 0;
+ me->RemoveAurasDueToSpell(SPELL_REFORM_VISUAL_STATE_1);
+ me->RemoveAurasDueToSpell(SPELL_REFORM_VISUAL_STATE_2);
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_UPDATE_PRIORITY, me, 1);
+ events.ScheduleEvent(EVENT_BACK_TO_COMBAT, 2s);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
+ {
+ switch (spellInfo->Id)
+ {
+ case SPELL_REFORM_VISUAL:
+ {
+ _guardiansImageDefeatedCount++;
+
+ if (_guardiansImageDefeatedCount == 1)
+ DoCastSelf(SPELL_REFORM_VISUAL_STATE_1);
+ else if (_guardiansImageDefeatedCount == 2)
+ DoCastSelf(SPELL_REFORM_VISUAL_STATE_2);
+ else if (_guardiansImageDefeatedCount == 3)
+ DoAction(ACTION_FINISH_SPLIT);
+
+ break;
+ }
+ case SPELL_GUARDIANS_IMAGE:
+ {
+ if (!_triggeredSplit)
+ {
+ _triggeredSplit = true;
+ DoAction(ACTION_DISSOLVE);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
+ {
+ if (!target->IsPlayer())
+ return;
+
+ switch (spellInfo->Id)
+ {
+ case SPELL_PIERCING_MISSILES_DEBUFF:
+ {
+ Talk(SAY_PIERCING_MISSILES);
+ break;
+ }
+ case SPELL_INFERNO_BOLT_MARKER:
+ {
+ Talk(SAY_INFERNO_BOLT_WARNING, target);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void OnSpellStart(SpellInfo const* spellInfo) override
+ {
+ switch (spellInfo->Id)
+ {
+ case SPELL_GUARDIANS_IMAGE:
+ {
+ Talk(SAY_GUARDIANS_IMAGE);
+ break;
+ }
+ case SPELL_FLAME_WREATH_SELECTOR:
+ {
+ Talk(SAY_FLAME_WREATH_WARNING);
+ Talk(SAY_FLAME_WREATH);
+ break;
+ }
+ case SPELL_CEASELESS_WINTER:
+ {
+ Talk(SAY_CEASELESS_WINTER);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void OnSpellFailed(SpellInfo const* spellInfo) override
+ {
+ switch (spellInfo->Id)
+ {
+ case SPELL_INFERNO_BOLT:
+ case SPELL_PIERCING_MISSILES:
+ case SPELL_FROSTBITE:
+ {
+ Talk(SAY_STRONGER);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+
+ DoCastSelf(SPELL_VO_CONTROLLER);
+ DoCastSelf(SPELL_MANA_REGEN, TRIGGERED_FULL_MASK);
+
+ scheduler.CancelAll();
+
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+
+ events.ScheduleEvent(EVENT_BASIC_PRIMER, 3s);
+ events.ScheduleEvent(EVENT_CHECK_MANA, 1s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ scheduler.Update(diff);
+
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_BASIC_PRIMER:
+ {
+ DoCastSelf(SPELL_BASIC_PRIMER);
+ events.Repeat(6s);
+ break;
+ }
+ case EVENT_CHECK_MANA:
+ {
+ if (me->GetPowerPct(POWER_MANA) >= 100)
+ DoCastSelf(SPELL_SIGNATURE_PRIMER);
+ events.Repeat(500ms);
+ break;
+ }
+ case EVENT_TELEPORT:
+ {
+ me->NearTeleportTo(GuardiansImageMedivhPosition);
+ break;
+ }
+ case EVENT_BACK_TO_COMBAT:
+ {
+ me->RemoveAurasDueToSpell(SPELL_DISSOLVE);
+ me->SetUninteractible(false);
+ me->SetReactState(REACT_AGGRESSIVE);
+ DoCastSelf(SPELL_MANA_REGEN);
+ events.ScheduleEvent(EVENT_BASIC_PRIMER, 1s);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ }
+
+ uint32 GetData(uint32 id) const override
+ {
+ if (id == DATA_INFERNO_BOLT_NEXT)
+ return _castInfernoBoltNext;
+ return 0;
+ }
+
+ void SetData(uint32 id, uint32 value) override
+ {
+ if (id == DATA_INFERNO_BOLT_NEXT)
+ _castInfernoBoltNext = value;
+ }
+
+private:
+ bool _triggeredSplit;
+ uint8 _castInfernoBoltNext;
+ uint8 _guardiansImageDefeatedCount;
+};
+
+// 114675 - Guardian's Image
+struct boss_shade_of_medivh_guardians_image : public ScriptedAI
+{
+ boss_shade_of_medivh_guardians_image(Creature* creature) : ScriptedAI(creature) { }
+
+ void JustAppeared() override
+ {
+ DoCastSelf(SPELL_ARCANE_DISSOLVE_IN);
+ DoZoneInCombat();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ me->GetInstanceScript()->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ DoCast(SPELL_REFORM_VISUAL);
+
+ me->DespawnOrUnsummon(3s);
+ }
+
+ void EnterEvadeMode(EvadeReason why) override
+ {
+ if (Creature* shadeOfMedivh = me->GetInstanceScript()->GetCreature(DATA_SHADE_OF_MEDIVH))
+ shadeOfMedivh->AI()->EnterEvadeMode(why);
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ me->GetInstanceScript()->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 2);
+ DoCastSelf(SPELL_SHIMMER);
+ events.ScheduleEvent(EVENT_ARCANE_BOLT, 1s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ARCANE_BOLT:
+ {
+ DoCastSelf(SPELL_ARCANE_BOLT_SELECTOR);
+ events.Repeat(3s);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ }
+
+private:
+ EventMap events;
+};
+
+// 228582 - Mana Regen
+class spell_shade_of_medivh_mana_regen : public AuraScript
+{
+ static constexpr std::array<uint8, 3> ShadeOfMedivhEnergizeCycle = { 3, 4, 3 };
+
+ void PeriodicTick(AuraEffect const* aurEff) const
+ {
+ uint8 cycleIdx = (aurEff->GetTickNumber() - 1) % ShadeOfMedivhEnergizeCycle.size();
+ int32 amount = ShadeOfMedivhEnergizeCycle[cycleIdx] * GetTarget()->GetMaxPower(POWER_MANA) / 100;
+ GetTarget()->ModifyPower(POWER_MANA, amount);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_shade_of_medivh_mana_regen::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
+// 227599 - Basic Primer
+class spell_shade_of_medivh_basic_primer : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_INFERNO_BOLT_MARKER, SPELL_PIERCING_MISSILES, SPELL_FROSTBITE });
+ }
+
+ void HandleHit()
+ {
+ Creature* creatureCaster = GetCaster()->ToCreature();
+ if (!creatureCaster)
+ return;
+
+ Unit* target = creatureCaster->AI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true);
+ uint32 spellId = RAND(SPELL_INFERNO_BOLT_MARKER, SPELL_PIERCING_MISSILES, SPELL_FROSTBITE);
+
+ if (creatureCaster->AI()->GetData(DATA_INFERNO_BOLT_NEXT) == 1)
+ {
+ spellId = SPELL_INFERNO_BOLT_MARKER;
+ creatureCaster->AI()->SetData(DATA_INFERNO_BOLT_NEXT, 0);
+ }
+ else if (spellId == SPELL_FROSTBITE)
+ creatureCaster->AI()->SetData(DATA_INFERNO_BOLT_NEXT, 1);
+
+ creatureCaster->CastSpell(target, spellId, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnHit += SpellHitFn(spell_shade_of_medivh_basic_primer::HandleHit);
+ }
+};
+
+// 228237 - Signature Primer
+class spell_shade_of_medivh_signature_primer : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_FLAME_WREATH_SELECTOR, SPELL_GUARDIANS_IMAGE, SPELL_CEASELESS_WINTER });
+ }
+
+ void HandleHit() const
+ {
+ Creature* creatureCaster = GetCaster()->ToCreature();
+ if (!creatureCaster)
+ return;
+
+ uint32 spellId = RAND(SPELL_FLAME_WREATH_SELECTOR, SPELL_GUARDIANS_IMAGE, SPELL_CEASELESS_WINTER);
+ creatureCaster->CastSpell(creatureCaster, spellId, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void HandleAfterCast() const
+ {
+ GetCaster()->SetPower(POWER_MANA, 0);
+ }
+
+ void Register() override
+ {
+ OnHit += SpellHitFn(spell_shade_of_medivh_signature_primer::HandleHit);
+ AfterCast += SpellCastFn(spell_shade_of_medivh_signature_primer::HandleAfterCast);
+ }
+};
+
+// 228249 - Inferno Bolt
+class spell_shade_of_medivh_inferno_bolt_marker : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_INFERNO_BOLT });
+ }
+
+ void HandleInfernoBolt(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_INFERNO_BOLT, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shade_of_medivh_inferno_bolt_marker::HandleInfernoBolt, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+};
+
+// 227628 - Piercing Missiles
+class spell_shade_of_medivh_piercing_missiles : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_PIERCING_MISSILES_DEBUFF });
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
+ return;
+
+ GetCaster()->CastSpell(GetTarget(), SPELL_PIERCING_MISSILES_DEBUFF, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_shade_of_medivh_piercing_missiles::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
+// 228269 - Flame Wreath
+class spell_shade_of_medivh_flame_wreath_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_FLAME_WREATH_AREATRIGGER });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit()->GetPosition(), SPELL_FLAME_WREATH_AREATRIGGER, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shade_of_medivh_flame_wreath_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 228222 - Ceaseless Winter
+class spell_shade_of_medivh_ceaseless_winter_periodic : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_CEASELESS_WINTER_DAMAGE });
+ }
+
+ void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) const
+ {
+ Unit* target = GetTarget();
+ if (target->isMoving())
+ GetTarget()->RemoveAuraFromStack(SPELL_CEASELESS_WINTER_DAMAGE);
+ else
+ target->CastSpell(target, SPELL_CEASELESS_WINTER_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_shade_of_medivh_ceaseless_winter_periodic::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
+// 228334 - Guardian's Image
+class spell_shade_of_medivh_guardians_image : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_GUARDIANS_IMAGE_MISSILE });
+ }
+
+ void HandleHit() const
+ {
+ for (uint8 i = 0; i < 3; i++)
+ {
+ GetCaster()->CastSpell(GuardiansImagePosition[i], SPELL_GUARDIANS_IMAGE_MISSILE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+ }
+
+ void Register() override
+ {
+ OnHit += SpellHitFn(spell_shade_of_medivh_guardians_image::HandleHit);
+ }
+};
+
+// 228992 - Arcane Bolt
+class spell_shade_of_medivh_arcane_bolt_selector : public SpellScript
+{
+ void HandleScript(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell(),
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shade_of_medivh_arcane_bolt_selector::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 232314 - V.O Controller
+class spell_shade_of_medivh_vo_controller : public SpellScript
+{
+ void HandleScript(SpellEffIndex /*effIndex*/) const
+ {
+ uint8 text = 0;
+ ObjectGuid originalCast = GetSpell()->m_originalCastId;
+
+ if (!originalCast.IsEmpty())
+ {
+ switch (originalCast.GetEntry())
+ {
+ case SPELL_FROSTBITE:
+ {
+ text = SAY_FROSTBITE;
+ break;
+ }
+ case SPELL_INFERNO_BOLT:
+ {
+ text = SAY_INFERNO_BOLT;
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ else
+ text = SAY_AGGRO;
+
+ if (Creature* shadeOfMedivh = GetHitUnit()->ToCreature())
+ shadeOfMedivh->AI()->Talk(text);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shade_of_medivh_vo_controller::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+};
+
+// 232314 - V.O Controller (attached to 227592 - Frostbite and 227615 - Inferno Bolt)
+class spell_shade_of_medivh_vo_controller_cast : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_VO_CONTROLLER });
+ }
+
+ void HandleAfterCast() const
+ {
+ Unit* caster = GetCaster();
+ if (caster->HasAura(SPELL_VO_CONTROLLER))
+ return;
+
+ caster->CastSpell(caster, SPELL_VO_CONTROLLER, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell(),
+ });
+ }
+
+ void Register() override
+ {
+ AfterCast += SpellCastFn(spell_shade_of_medivh_vo_controller_cast::HandleAfterCast);
+ }
+};
+
+// 227779 - Ceaseless Winter
+// Id - 8848
+struct at_shade_of_medivh_ceaseless_winter : AreaTriggerAI
+{
+ using AreaTriggerAI::AreaTriggerAI;
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ unit->CastSpell(unit, SPELL_CEASELESS_WINTER_PERIODIC, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
+ {
+ unit->RemoveAurasDueToSpell(SPELL_CEASELESS_WINTER_DAMAGE);
+ unit->RemoveAurasDueToSpell(SPELL_CEASELESS_WINTER_PERIODIC);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+// 227779 - Ceaseless Winter
+// Id - 8809
+struct at_shade_of_medivh_ceaseless_winter_jump_check : AreaTriggerAI
+{
+ using AreaTriggerAI::AreaTriggerAI;
+
+ void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
+ {
+ unit->RemoveAuraFromStack(SPELL_CEASELESS_WINTER_DAMAGE);
+ }
+};
+
+// 228257 - Flame Wreath
+struct at_shade_of_medivh_flame_wreath : AreaTriggerAI
+{
+ using AreaTriggerAI::AreaTriggerAI;
+
+ uint32 GetInsidePlayersCount()
+ {
+ return std::ranges::count_if(at->GetInsideUnits(), [this](ObjectGuid const& guid)
+ {
+ Player* player = ObjectAccessor::GetPlayer(*at, guid);
+ if (!player || !player->IsAlive() || player->IsGameMaster())
+ return false;
+ return true;
+ });
+ }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ if (!unit->IsPlayer())
+ return;
+
+ if (GetInsidePlayersCount() >= 2)
+ {
+ caster->CastSpell(unit, SPELL_FLAME_WREATH_AREA_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ at->Remove();
+ }
+ else
+ caster->CastSpell(unit, SPELL_FLAME_WREATH_PERIODIC_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+
+ }
+
+ void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
+ {
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ if (!unit->IsPlayer())
+ return;
+
+ if (unit->HasAura(SPELL_FLAME_WREATH_PERIODIC_DAMAGE))
+ {
+ unit->RemoveAurasDueToSpell(SPELL_FLAME_WREATH_PERIODIC_DAMAGE);
+ caster->CastSpell(unit, SPELL_FLAME_WREATH_AREA_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ at->Remove();
+ }
+ }
+};
+
+void AddSC_boss_shade_of_medivh()
+{
+ RegisterReturnToKarazhanCreatureAI(boss_shade_of_medivh);
+ RegisterReturnToKarazhanCreatureAI(boss_shade_of_medivh_guardians_image);
+
+ RegisterSpellScript(spell_shade_of_medivh_mana_regen);
+ RegisterSpellScript(spell_shade_of_medivh_piercing_missiles);
+ RegisterSpellScript(spell_shade_of_medivh_basic_primer);
+ RegisterSpellScript(spell_shade_of_medivh_signature_primer);
+ RegisterSpellScript(spell_shade_of_medivh_inferno_bolt_marker);
+ RegisterSpellScript(spell_shade_of_medivh_flame_wreath_selector);
+ RegisterSpellScript(spell_shade_of_medivh_ceaseless_winter_periodic);
+ RegisterSpellScript(spell_shade_of_medivh_guardians_image);
+ RegisterSpellScript(spell_shade_of_medivh_arcane_bolt_selector);
+ RegisterSpellScript(spell_shade_of_medivh_vo_controller);
+ RegisterSpellScript(spell_shade_of_medivh_vo_controller_cast);
+
+ RegisterAreaTriggerAI(at_shade_of_medivh_ceaseless_winter_jump_check);
+ RegisterAreaTriggerAI(at_shade_of_medivh_ceaseless_winter);
+ RegisterAreaTriggerAI(at_shade_of_medivh_flame_wreath);
+}
diff --git a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp
index b3fefe7c4d3..23a17ec2f9d 100644
--- a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp
@@ -22,7 +22,8 @@
BossBoundaryData const boundaries =
{
- { DATA_MAIDEN_OF_VIRTUE_RTK, new CircleBoundary(Position(-10945.900391f, -2103.530029f, 92.794197f), 55.0f) }
+ { DATA_MAIDEN_OF_VIRTUE_RTK, new CircleBoundary(Position(-10945.900391f, -2103.530029f, 92.794197f), 55.0f) },
+ { DATA_SHADE_OF_MEDIVH, new CircleBoundary(Position(-4599.149902f, -2517.947266f, 2876.506836f), 35.0f) },
};
ObjectData const creatureData[] =
@@ -35,8 +36,10 @@ ObjectData const creatureData[] =
DoorData const doorData[] =
{
- { GO_STRANGE_WALL, DATA_THE_CURATOR_RTK, EncounterDoorBehavior::OpenWhenDone },
- { 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress }
+ { GO_STRANGE_WALL, DATA_THE_CURATOR_RTK, EncounterDoorBehavior::OpenWhenDone },
+ { GO_SUSPICIOUS_BOOKCASE, DATA_SHADE_OF_MEDIVH, EncounterDoorBehavior::OpenWhenDone },
+ { GO_MEDIVH_DOOR, DATA_SHADE_OF_MEDIVH, EncounterDoorBehavior::OpenWhenNotInProgress },
+ { 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress }
};
DungeonEncounterData const encounters[] =
diff --git a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h
index 5dbf20c04dc..4614073f32d 100644
--- a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h
+++ b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h
@@ -49,7 +49,9 @@ enum RTKCreatureIds
enum RTKGameObjectsIds
{
- GO_STRANGE_WALL = 266508
+ GO_STRANGE_WALL = 266508,
+ GO_SUSPICIOUS_BOOKCASE = 266510,
+ GO_MEDIVH_DOOR = 266846
};
template <class AI, class T>
diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
index 13f41362243..8db2083868e 100644
--- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
+++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
@@ -211,6 +211,7 @@ void AddSC_instance_return_to_karazhan();
void AddSC_boss_maiden_of_virtue_rtk();
void AddSC_boss_the_curator_rtk();
void AddSC_boss_mana_devourer();
+void AddSC_boss_shade_of_medivh();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
@@ -412,4 +413,5 @@ void AddEasternKingdomsScripts()
AddSC_boss_maiden_of_virtue_rtk();
AddSC_boss_the_curator_rtk();
AddSC_boss_mana_devourer();
+ AddSC_boss_shade_of_medivh();
}
diff --git a/src/server/scripts/KhazAlgar/CityOfThreads/boss_orator_krix_vizk.cpp b/src/server/scripts/KhazAlgar/CityOfThreads/boss_orator_krix_vizk.cpp
new file mode 100644
index 00000000000..fb7129faf17
--- /dev/null
+++ b/src/server/scripts/KhazAlgar/CityOfThreads/boss_orator_krix_vizk.cpp
@@ -0,0 +1,525 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "AreaTrigger.h"
+#include "AreaTriggerAI.h"
+#include "CellImpl.h"
+#include "Conversation.h"
+#include "Creature.h"
+#include "GridNotifiersImpl.h"
+#include "InstanceScript.h"
+#include "MotionMaster.h"
+#include "PathGenerator.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellAuras.h"
+#include "SpellScript.h"
+#include "city_of_threads.h"
+
+enum OratorKrixVizkSpells
+{
+ SPELL_ORATION = 454689,
+ SPELL_CHAINS_OF_OPPRESSION = 434691,
+ SPELL_CHAINS_OF_OPPRESSION_PERIODIC = 440310,
+ SPELL_CHAINS_OF_OPPRESSION_CHARGE = 434712,
+ SPELL_CHAINS_OF_OPPRESSION_DAMAGE = 434710,
+ SPELL_SUBJUGATE = 434722,
+ SPELL_TERRORIZE_SELECTOR = 434808,
+ SPELL_TERRORIZE = 434779,
+ SPELL_SHADOWS_OF_DOUBT_SELECTOR = 448560,
+ SPELL_SHADOWS_OF_DOUBT = 448561,
+ SPELL_DOUBT = 448562,
+ SPELL_VOCIFEROUS_INDOCTRINATION = 434829,
+ SPELL_VOCIFEROUS_INDOCTRINATION_DAMAGE = 434832,
+ SPELL_LINGERING_INFLUENCE_AREATRIGGER = 434923,
+ SPELL_LINGERING_INFLUENCE_DAMAGE = 434926
+};
+
+enum OratorKrixVizkConversations
+{
+ CONVERSATION_ORATOR_INTRO_1 = 24642,
+ CONVERSATION_ORATOR_INTRO_2 = 24643,
+ CONVERSATION_ORATOR_INTRO_3 = 24644
+};
+
+enum OratorKrixVizkTexts
+{
+ SAY_AGGRO = 0,
+ SAY_SUBJUGATE = 1,
+ SAY_TERRORIZE = 2,
+ SAY_VOCIFEROUS_INDOCTRINATION = 3,
+ SAY_KILL = 4,
+ SAY_DEATH = 5
+};
+
+enum OratorKrixVizkEvents
+{
+ EVENT_SUBJUGATE = 1,
+ EVENT_TERRORIZE,
+ EVENT_SHADOWS_OF_DOUBT,
+ EVENT_ENERGIZE
+};
+
+enum OratorKrixVizkMisc
+{
+ AREATRIGGER_BARRIER = 35803,
+ DISPLAY_POWERID = 527
+};
+
+// 163
+// 164
+template<uint32 conversationEntry, uint32 data>
+struct at_orator_conversation_intro : AreaTriggerAI
+{
+ at_orator_conversation_intro(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ InstanceScript* instance = at->GetInstanceScript();
+ if (!instance)
+ return;
+
+ Player* player = unit->ToPlayer();
+ if (!player || player->IsGameMaster())
+ return;
+
+ if (Creature* oratorKrixVizk = instance->GetCreature(data))
+ Conversation::CreateConversation(conversationEntry, oratorKrixVizk, player->GetPosition(), player->GetGUID());
+
+ at->Remove();
+ }
+};
+
+// 216619 - Orator Krix'vizk <The Fifth Strand>
+struct boss_orator_krix_vizk : public BossAI
+{
+ boss_orator_krix_vizk(Creature* creature) : BossAI(creature, DATA_ORATOR_KRIX_VIZK), _subjugateCount(1), _terrorizeCount(1), _energizeCount(0) { }
+
+ void JustAppeared() override
+ {
+ DoCastSelf(SPELL_ORATION);
+ me->SetPower(POWER_ENERGY, 0);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+
+ WorldObject* obj = nullptr;
+ Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(ObjectGuid::Empty, AREATRIGGER_BARRIER);
+ Trinity::WorldObjectSearcher<Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck> checker(me, obj, check, GRID_MAP_TYPE_MASK_AREATRIGGER);
+ Cell::VisitGridObjects(me, checker, 100.0f);
+
+ if (!obj)
+ return;
+
+ if (AreaTrigger* at = obj->ToAreaTrigger())
+ at->Remove();
+ }
+
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+
+ _EnterEvadeMode();
+ _DespawnAtEvade();
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (!victim->IsPlayer())
+ return;
+
+ Talk(SAY_KILL);
+ }
+
+ void Reset() override
+ {
+ _Reset();
+
+ _subjugateCount = 1;
+ _terrorizeCount = 1;
+ _energizeCount = 0;
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+
+ DoCastSelf(SPELL_CHAINS_OF_OPPRESSION);
+
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+
+ me->SetOverrideDisplayPowerId(DISPLAY_POWERID); // No aura handle
+
+ events.ScheduleEvent(EVENT_ENERGIZE, 1s);
+ events.ScheduleEvent(EVENT_SUBJUGATE, 4500ms);
+ events.ScheduleEvent(EVENT_TERRORIZE, 9400ms);
+
+ if (IsMythic() || IsMythicPlus())
+ events.ScheduleEvent(EVENT_SHADOWS_OF_DOUBT, 15200ms);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SUBJUGATE:
+ {
+ Talk(SAY_SUBJUGATE);
+ DoCastVictim(SPELL_SUBJUGATE);
+ _subjugateCount++;
+ if (_subjugateCount % 2 == 0)
+ events.ScheduleEvent(EVENT_SUBJUGATE, 17100ms);
+ else
+ events.ScheduleEvent(EVENT_SUBJUGATE, 12s);
+ break;
+ }
+ case EVENT_TERRORIZE:
+ {
+ Talk(SAY_TERRORIZE);
+ DoCast(SPELL_TERRORIZE_SELECTOR);
+ _terrorizeCount++;
+ if (_terrorizeCount % 2 == 0)
+ events.ScheduleEvent(EVENT_TERRORIZE, 8100ms);
+ else
+ events.ScheduleEvent(EVENT_TERRORIZE, 21100ms);
+ break;
+ }
+ case EVENT_SHADOWS_OF_DOUBT:
+ {
+ DoCast(SPELL_SHADOWS_OF_DOUBT_SELECTOR);
+ events.ScheduleEvent(EVENT_SHADOWS_OF_DOUBT, 30300ms);
+ break;
+ }
+ case EVENT_ENERGIZE:
+ {
+ if (me->GetPower(POWER_ENERGY) == 100)
+ {
+ Talk(SAY_VOCIFEROUS_INDOCTRINATION);
+ DoCastSelf(SPELL_VOCIFEROUS_INDOCTRINATION);
+ events.RescheduleEvent(EVENT_ENERGIZE, 6s);
+ }
+ else
+ {
+ me->SetPower(POWER_ENERGY, me->GetPower(POWER_ENERGY) + 4);
+ _energizeCount++;
+ events.ScheduleEvent(EVENT_ENERGIZE, (_energizeCount % 2) ? 1200ms : 800ms);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ uint8 _subjugateCount;
+ uint8 _terrorizeCount;
+ uint8 _energizeCount;
+};
+
+// 434808 - Terrorize
+class spell_orator_krix_vizk_terrorize_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_TERRORIZE });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_TERRORIZE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_orator_krix_vizk_terrorize_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 448560 - Shadows of Doubt
+class spell_orator_krix_vizk_shadows_of_doubt_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SHADOWS_OF_DOUBT });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_SHADOWS_OF_DOUBT, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_orator_krix_vizk_shadows_of_doubt_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 440310 - Chains of Oppression
+class spell_orator_krix_vizk_chains_of_oppression_periodic : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_CHAINS_OF_OPPRESSION_DAMAGE, SPELL_CHAINS_OF_OPPRESSION_CHARGE });
+ }
+
+ void Tick(AuraEffect const* /*aurEff*/) const
+ {
+ if (Unit* caster = GetCaster())
+ {
+ Unit* target = GetTarget();
+ CastSpellExtraArgs args;
+ args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR;
+
+ caster->CastSpell(target, SPELL_CHAINS_OF_OPPRESSION_DAMAGE, args);
+ target->CastSpell(caster, SPELL_CHAINS_OF_OPPRESSION_CHARGE, args);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_orator_krix_vizk_chains_of_oppression_periodic::Tick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
+// 448561 - Shadows of Doubt
+class spell_orator_krix_vizk_shadows_of_doubt_periodic : public AuraScript
+{
+ static constexpr uint8 MAX_SHADOW_OF_DOUBTS = 5;
+ static constexpr uint32 DOUBT_AT_CREATE_PROPERTIES = 165;
+
+ bool Validate(SpellInfo const* /*spell*/) override
+ {
+ return ValidateSpellInfo({ SPELL_DOUBT });
+ }
+
+ void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
+ return;
+
+ Unit* caster = GetCaster();
+ if (!caster)
+ return;
+
+ for (uint8 i = 0; i < MAX_SHADOW_OF_DOUBTS; ++i)
+ {
+ Unit* target = GetTarget();
+ float angle = 2.f * float(M_PI) / MAX_SHADOW_OF_DOUBTS * i;
+ Position dest(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), angle);
+ AreaTrigger::CreateAreaTrigger({ DOUBT_AT_CREATE_PROPERTIES, true }, dest, -1, caster, target);
+ }
+ }
+
+ void Register() override
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_orator_krix_vizk_shadows_of_doubt_periodic::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
+// 434829 - Vociferous Indoctrination
+class spell_orator_krix_vizk_vociferous_indoctrination_periodic : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_VOCIFEROUS_INDOCTRINATION_DAMAGE, SPELL_LINGERING_INFLUENCE_AREATRIGGER });
+ }
+
+ void Tick(AuraEffect const* aurEff) const
+ {
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(GetTarget(), SPELL_VOCIFEROUS_INDOCTRINATION_DAMAGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringAura = aurEff
+ });
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ if (Unit* caster = GetCaster())
+ GetTarget()->CastSpell(caster, SPELL_LINGERING_INFLUENCE_AREATRIGGER, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+
+ if (Creature* creatureTarget = GetTarget()->ToCreature())
+ creatureTarget->SetPower(POWER_ENERGY, 0);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_orator_krix_vizk_vociferous_indoctrination_periodic::Tick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_orator_krix_vizk_vociferous_indoctrination_periodic::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
+// 434691 - Chains of Oppression
+// Id - 31997
+struct at_orator_krix_vizk_chains_of_oppression : AreaTriggerAI
+{
+ at_orator_krix_vizk_chains_of_oppression(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ caster->CastSpell(unit, SPELL_CHAINS_OF_OPPRESSION_PERIODIC, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ unit->RemoveAurasDueToSpell(SPELL_CHAINS_OF_OPPRESSION_PERIODIC);
+ }
+};
+
+// 434923 - Lingering Influence
+// ID - 32026
+struct at_orator_krix_vizk_lingering_influence : AreaTriggerAI
+{
+ at_orator_krix_vizk_lingering_influence(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ caster->CastSpell(unit, SPELL_LINGERING_INFLUENCE_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ unit->RemoveAurasDueToSpell(SPELL_LINGERING_INFLUENCE_DAMAGE);
+ }
+
+ void OnInitialize() override
+ {
+ std::array<DBCPosition2D, 2> points =
+ { {
+ { 0.0f, 1.0f },
+ { 1.0f, 18.0f }
+ } };
+
+ at->SetTimeToTargetScale(6000);
+ at->SetOverrideScaleCurve(points, 2);
+ }
+};
+
+// 165
+struct at_orator_krix_vizk_doubt : AreaTriggerAI
+{
+ explicit at_orator_krix_vizk_doubt(AreaTrigger* areaTrigger) : AreaTriggerAI(areaTrigger), _canHitOrigin(false) {}
+
+ void OnInitialize() override
+ {
+ Position destPos = at->GetPosition();
+ at->MovePositionToFirstCollision(destPos, 200.0f, 0.0f);
+
+ PathGenerator path(at);
+ path.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), true);
+
+ at->InitSplines(path.GetPath());
+
+ _canHitOrigin = false;
+ _scheduler.Schedule(1s, [this](TaskContext /*task*/)
+ {
+ _canHitOrigin = true;
+ });
+ }
+
+ void OnUpdate(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+ void OnDestinationReached() override
+ {
+ at->Remove();
+ }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ if (!_canHitOrigin && unit == at->GetTarget())
+ return;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ caster->CastSpell(unit, SPELL_DOUBT, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+private:
+ TaskScheduler _scheduler;
+ bool _canHitOrigin;
+};
+
+void AddSC_boss_orator_krix_vizk()
+{
+ new GenericAreaTriggerEntityScript<at_orator_conversation_intro<CONVERSATION_ORATOR_INTRO_1, DATA_ORATOR_CONVO>>("at_orator_conversation_intro_1");
+ new GenericAreaTriggerEntityScript<at_orator_conversation_intro<CONVERSATION_ORATOR_INTRO_2, DATA_ORATOR_KRIX_VIZK>>("at_orator_conversation_intro_2");
+ new GenericAreaTriggerEntityScript<at_orator_conversation_intro<CONVERSATION_ORATOR_INTRO_3, DATA_ORATOR_KRIX_VIZK>>("at_orator_conversation_intro_3");
+
+ RegisterCityOfThreadsCreatureAI(boss_orator_krix_vizk);
+
+ RegisterSpellScript(spell_orator_krix_vizk_terrorize_selector);
+ RegisterSpellScript(spell_orator_krix_vizk_shadows_of_doubt_selector);
+ RegisterSpellScript(spell_orator_krix_vizk_chains_of_oppression_periodic);
+ RegisterSpellScript(spell_orator_krix_vizk_shadows_of_doubt_periodic);
+ RegisterSpellScript(spell_orator_krix_vizk_vociferous_indoctrination_periodic);
+
+ RegisterAreaTriggerAI(at_orator_krix_vizk_chains_of_oppression);
+ RegisterAreaTriggerAI(at_orator_krix_vizk_lingering_influence);
+ RegisterAreaTriggerAI(at_orator_krix_vizk_doubt);
+}
diff --git a/src/server/scripts/KhazAlgar/CityOfThreads/city_of_threads.h b/src/server/scripts/KhazAlgar/CityOfThreads/city_of_threads.h
new file mode 100644
index 00000000000..7efc98d0269
--- /dev/null
+++ b/src/server/scripts/KhazAlgar/CityOfThreads/city_of_threads.h
@@ -0,0 +1,61 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DEF_CITY_OF_THREADS_H_
+#define DEF_CITY_OF_THREADS_H_
+
+#include "CreatureAIImpl.h"
+
+#define COTScriptName "instance_city_of_threads"
+#define DataHeader "CityOfThreads"
+
+uint32 const EncounterCount = 4;
+
+enum CityOfThreadsDataTypes
+{
+ // Encounters
+ DATA_ORATOR_KRIX_VIZK = 0,
+ DATA_FANGS_OF_THE_QUEEN = 1,
+ DATA_THE_COAGLAMATION = 2,
+ DATA_IZO_THE_GRAND_SPLICER = 3,
+
+ // Additional Data
+ DATA_ORATOR_CONVO
+};
+
+enum CityOfThreadsCreatureIds
+{
+ // Bosses
+ BOSS_ORATOR_KRIX_VIZK = 216619,
+ BOSS_NX = 216648,
+ BOSS_VX = 216649,
+ BOSS_THE_COAGLAMATION = 216320,
+ BOSS_IZO_THE_GRAND_SPLICER = 216658,
+
+ // Npcs
+ NPC_ORATOR_KRIX_VIZK_CONVO = 220769
+};
+
+template <class AI, class T>
+inline AI* GetCityOfThreadsAI(T* obj)
+{
+ return GetInstanceAI<AI>(obj, COTScriptName);
+}
+
+#define RegisterCityOfThreadsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetCityOfThreadsAI)
+
+#endif
diff --git a/src/server/scripts/KhazAlgar/CityOfThreads/instance_city_of_threads.cpp b/src/server/scripts/KhazAlgar/CityOfThreads/instance_city_of_threads.cpp
new file mode 100644
index 00000000000..38e8d2905d5
--- /dev/null
+++ b/src/server/scripts/KhazAlgar/CityOfThreads/instance_city_of_threads.cpp
@@ -0,0 +1,66 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "InstanceScript.h"
+#include "ScriptMgr.h"
+#include "city_of_threads.h"
+
+static constexpr ObjectData creatureData[] =
+{
+ { BOSS_ORATOR_KRIX_VIZK, DATA_ORATOR_KRIX_VIZK },
+ { BOSS_NX, DATA_FANGS_OF_THE_QUEEN },
+ { BOSS_VX, DATA_FANGS_OF_THE_QUEEN },
+ { BOSS_THE_COAGLAMATION, DATA_THE_COAGLAMATION },
+ { BOSS_IZO_THE_GRAND_SPLICER, DATA_IZO_THE_GRAND_SPLICER },
+ { NPC_ORATOR_KRIX_VIZK_CONVO, DATA_ORATOR_CONVO },
+ { 0, 0 } // END
+};
+
+static constexpr DungeonEncounterData const encounters[] =
+{
+ { DATA_ORATOR_KRIX_VIZK, {{ 2907 }} },
+ { DATA_FANGS_OF_THE_QUEEN, {{ 2908 }} },
+ { DATA_THE_COAGLAMATION, {{ 2905 }} },
+ { DATA_IZO_THE_GRAND_SPLICER, {{ 2909 }} }
+};
+
+class instance_city_of_threads : public InstanceMapScript
+{
+public:
+ instance_city_of_threads() : InstanceMapScript(COTScriptName, 2669) { }
+
+ struct instance_city_of_threads_InstanceMapScript: public InstanceScript
+ {
+ instance_city_of_threads_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
+ {
+ SetHeaders(DataHeader);
+ SetBossNumber(EncounterCount);
+ LoadObjectData(creatureData, nullptr);
+ LoadDungeonEncounterData(encounters);
+ }
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const override
+ {
+ return new instance_city_of_threads_InstanceMapScript(map);
+ }
+};
+
+void AddSC_instance_city_of_threads()
+{
+ new instance_city_of_threads();
+}
diff --git a/src/server/scripts/KhazAlgar/khaz_algar_script_loader.cpp b/src/server/scripts/KhazAlgar/khaz_algar_script_loader.cpp
index e8f1c7de329..86ae7069db0 100644
--- a/src/server/scripts/KhazAlgar/khaz_algar_script_loader.cpp
+++ b/src/server/scripts/KhazAlgar/khaz_algar_script_loader.cpp
@@ -32,6 +32,10 @@ void AddSC_boss_skarmorak();
void AddSC_instance_nerubar_palace();
void AddSC_boss_ulgrax_the_devourer();
+// City of Threads
+void AddSC_instance_city_of_threads();
+void AddSC_boss_orator_krix_vizk();
+
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
void AddKhazAlgarScripts()
@@ -50,4 +54,8 @@ void AddKhazAlgarScripts()
// Nerub'ar Palace
AddSC_instance_nerubar_palace();
AddSC_boss_ulgrax_the_devourer();
+
+ // City of Threads
+ AddSC_instance_city_of_threads();
+ AddSC_boss_orator_krix_vizk();
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 807109e1493..659f216fc1e 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -648,7 +648,7 @@ struct npc_spinestalker : public ScriptedAI
// Increase add count
if (!me->isDead())
{
- _instance->SetGuidData(DATA_SINDRAGOSA_FROSTWYRMS, ObjectGuid::Create<HighGuid::Creature>(631, me->GetEntry(), me->GetSpawnId())); // this cannot be in Reset because reset also happens on evade
+ _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
Reset();
}
}
@@ -670,7 +670,7 @@ struct npc_spinestalker : public ScriptedAI
void JustAppeared() override
{
ScriptedAI::JustAppeared();
- _instance->SetGuidData(DATA_SINDRAGOSA_FROSTWYRMS, ObjectGuid::Create<HighGuid::Creature>(631, me->GetEntry(), me->GetSpawnId())); // this cannot be in Reset because reset also happens on evade
+ _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
}
void JustDied(Unit* /*killer*/) override
@@ -773,7 +773,7 @@ struct npc_rimefang_icc : public ScriptedAI
// Increase add count
if (!me->isDead())
{
- _instance->SetGuidData(DATA_SINDRAGOSA_FROSTWYRMS, ObjectGuid::Create<HighGuid::Creature>(631, me->GetEntry(), me->GetSpawnId())); // this cannot be in Reset because reset also happens on evade
+ _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
Reset();
}
}
@@ -795,7 +795,7 @@ struct npc_rimefang_icc : public ScriptedAI
void JustAppeared() override
{
ScriptedAI::JustAppeared();
- _instance->SetGuidData(DATA_SINDRAGOSA_FROSTWYRMS, ObjectGuid::Create<HighGuid::Creature>(631, me->GetEntry(), me->GetSpawnId())); // this cannot be in Reset because reset also happens on evade
+ _instance->SetData64(DATA_SINDRAGOSA_FROSTWYRMS, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
}
void JustDied(Unit* /*killer*/) override
@@ -929,7 +929,7 @@ struct npc_sindragosa_trash : public ScriptedAI
if (!me->isDead())
{
if (me->GetEntry() == NPC_FROSTWING_WHELP)
- _instance->SetGuidData(_frostwyrmId, ObjectGuid::Create<HighGuid::Creature>(631, me->GetEntry(), me->GetSpawnId())); // this cannot be in Reset because reset also happens on evade
+ _instance->SetData64(_frostwyrmId, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
Reset();
}
}
@@ -952,7 +952,7 @@ struct npc_sindragosa_trash : public ScriptedAI
// Increase add count
if (me->GetEntry() == NPC_FROSTWING_WHELP)
- _instance->SetGuidData(_frostwyrmId, ObjectGuid::Create<HighGuid::Creature>(631, me->GetEntry(), me->GetSpawnId())); // this cannot be in Reset because reset also happens on evade
+ _instance->SetData64(_frostwyrmId, me->GetSpawnId()); // this cannot be in Reset because reset also happens on evade
}
void SetData(uint32 type, uint32 data) override
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index e4de05aa1f5..5ea4c256ab5 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -1015,18 +1015,20 @@ class instance_icecrown_citadel : public InstanceMapScript
}
}
- void SetGuidData(uint32 type, ObjectGuid guid) override
+ void SetData64(uint32 type, uint64 data) override
{
switch (type)
{
case DATA_SINDRAGOSA_FROSTWYRMS:
- FrostwyrmGUIDs.insert(guid.GetCounter());
+ FrostwyrmGUIDs.insert(data);
break;
case DATA_SPINESTALKER:
- SpinestalkerTrash.insert(guid.GetCounter());
+ SpinestalkerTrash.insert(data);
break;
case DATA_RIMEFANG:
- RimefangTrash.insert(guid.GetCounter());
+ RimefangTrash.insert(data);
+ break;
+ default:
break;
}
}