diff options
35 files changed, 2765 insertions, 91 deletions
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/sql/updates/world/master/2025_10_05_00_world.sql b/sql/updates/world/master/2025_10_05_00_world.sql new file mode 100644 index 00000000000..fe591a6eed8 --- /dev/null +++ b/sql/updates/world/master/2025_10_05_00_world.sql @@ -0,0 +1,169 @@ +SET @ATSPAWN := 271; +SET @ATID := 174; +SET @ATPROP := 167; + +-- Creature +UPDATE `creature_template_addon` SET `auras`='160758' WHERE `entry`=134060; -- 134060 (Lord Stormsong) - Mod Scale 140% +UPDATE `creature_template` SET `ScriptName`='boss_lord_stormsong' WHERE `entry`=134060; +UPDATE `creature_template` SET `ScriptName`='boss_lord_stormsong_brother_pike' WHERE `entry`=139970; +UPDATE `creature_template` SET `ScriptName`='boss_lord_stormsong_rexxar' WHERE `entry`=139971; +UPDATE `creature_template` SET `ScriptName`='boss_lord_stormsong_ancient_mindbender' WHERE `entry`=137051; +UPDATE `creature_template` SET `faction`=14, `speed_walk`=0.800000011920928955, `speed_run`=0.285714298486709594, `BaseAttackTime`=2000, `unit_flags`=0x2000000, `unit_flags2`=0x4000800, `unit_flags3`=0x1280000, `AIName`='SmartAI' WHERE `entry`=137036; -- Awoken Void + +DELETE FROM `creature_template_difficulty` WHERE `Entry` IN (137036, 134060, 137051, 82347); +INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `LevelScalingDeltaMin`, `LevelScalingDeltaMax`, `ContentTuningID`, `HealthScalingExpansion`, `HealthModifier`, `ManaModifier`, `ArmorModifier`, `DamageModifier`, `CreatureDifficultyID`, `TypeFlags`, `TypeFlags2`, `TypeFlags3`, `LootID`, `PickPocketLootID`, `SkinLootID`, `GoldMin`, `GoldMax`, `StaticFlags1`, `StaticFlags2`, `StaticFlags3`, `StaticFlags4`, `StaticFlags5`, `StaticFlags6`, `StaticFlags7`, `StaticFlags8`, `VerifiedBuild`) VALUES +(137036, 0, 0, 0, 500, 0, 1, 1, 1, 1, 143479, 1610612752, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(137036, 1, 0, 0, 500, 7, 1, 1, 1, 1, 143479, 1610612752, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(137036, 2, 0, 0, 501, 7, 1, 1, 1, 1, 158853, 1610612752, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(137036, 23, 0, 0, 502, 7, 1, 1, 1, 1, 158854, 1610612752, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(134060, 0, 2, 2, 500, 7, 35, 55, 1, 1, 140110, 2097224, 129, 0, 0, 0, 0, 0, 0, 268435456, 0, 0, 0, 0, 0, 0, 0, 63305), +(134060, 1, 2, 2, 500, 7, 35, 55, 1, 1, 140110, 2097224, 129, 0, 0, 0, 0, 0, 0, 268435456, 0, 0, 0, 0, 0, 0, 0, 63305), +(134060, 2, 2, 2, 501, 7, 35, 55.3403, 1, 1, 144314, 2097224, 129, 0, 0, 0, 0, 0, 0, 268435456, 0, 0, 0, 0, 0, 0, 0, 63305), +(134060, 23, 2, 2, 502, 7, 35, 55.3403, 1, 1, 144315, 2097224, 129, 0, 0, 0, 0, 0, 0, 268435456, 0, 0, 0, 0, 0, 0, 0, 63305), +(137051, 0, 0, 0, 500, 7, 3, 1, 1, 1, 143496, 2097224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(137051, 1, 0, 0, 500, 7, 3, 1, 1, 1, 143496, 2097224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(137051, 2, 0, 0, 501, 7, 3, 1, 1, 1, 144310, 2097224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(137051, 23, 0, 0, 502, 7, 3, 1, 1, 1, 144311, 2097224, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63305), +(82347, 0, 0, 0, 181, 10, 0.01, 1, 1, 1, 80443, 0, 0, 0, 0, 0, 0, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 63305), +(82347, 1, 0, 0, 181, 10, 0.01, 1, 1, 1, 80443, 0, 0, 0, 0, 0, 0, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 63305), +(82347, 2, 0, 0, 181, 10, 1, 1, 1, 1, 80443, 0, 0, 0, 0, 0, 0, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 63305), +(82347, 23, 0, 0, 181, 9, 0.01, 1, 1, 1, 80443, 0, 0, 0, 0, 0, 0, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 63305); + +-- Areatrigger +DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (13289)); +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 +(13289, 0, 17892, 0, 4, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 4, 1.5, 1.5, 4, 4, 1, 1, 0, 0, 'at_lord_stormsong_waken_the_void', 63305); -- Spell: 269094 (Waken the Void) + +DELETE FROM `areatrigger_template` WHERE (`IsCustom`=0 AND `Id` IN (17892)); +INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES +(17892, 0, 63305); + +DELETE FROM `areatrigger` WHERE `SpawnId`=@ATSPAWN; +INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES +(@ATSPAWN, @ATPROP, 1, 1864, '1,2,23,8', 3578.1179, -1450.8363, 156.6917, 2.635109, 0, 0, 0, 'at_lord_stormsong_intro', 'Shrine of the Storm - Lord Stormsong intro', 0); + +DELETE FROM `areatrigger_create_properties` WHERE `Id`=@ATPROP AND `IsCustom`=1; +INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `SpeedIsTime`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES +(@ATPROP, 1, @ATID, 1, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 0, 1, 20, 10, 5, 20, 10, 5, 0, 0, '', 0); + +DELETE FROM `areatrigger_template` WHERE `Id`=@ATID AND `IsCustom`=1; +INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`, `VerifiedBuild`) VALUES +(@ATID, 1, 1, 0, 0, 0); + +-- Spells +DELETE FROM `serverside_spell` WHERE `Id` = 269396; +INSERT INTO `serverside_spell` (`Id`, `DifficultyID`, `CategoryId`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `AttributesEx8`, `AttributesEx9`, `AttributesEx10`, `AttributesEx11`, `AttributesEx12`, `AttributesEx13`, `AttributesEx14`, `AttributesEx15`, `Stances`, `StancesNot`, `Targets`, `TargetCreatureType`, `RequiresSpellFocus`, `FacingCasterFlags`, `CasterAuraState`, `TargetAuraState`, `ExcludeCasterAuraState`, `ExcludeTargetAuraState`, `CasterAuraSpell`, `TargetAuraSpell`, `ExcludeCasterAuraSpell`, `ExcludeTargetAuraSpell`, `CasterAuraType`, `TargetAuraType`, `ExcludeCasterAuraType`, `ExcludeTargetAuraType`, `CastingTimeIndex`, `RecoveryTime`, `CategoryRecoveryTime`, `StartRecoveryCategory`, `StartRecoveryTime`, `InterruptFlags`, `AuraInterruptFlags1`, `AuraInterruptFlags2`, `ChannelInterruptFlags1`, `ChannelInterruptFlags2`, `ProcFlags`, `ProcFlags2`, `ProcChance`, `ProcCharges`, `ProcCooldown`, `ProcBasePPM`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `Speed`, `LaunchDelay`, `StackAmount`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `ContentTuningId`, `SpellName`, `ConeAngle`, `ConeWidth`, `MaxTargetLevel`, `MaxAffectedTargets`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `SpellFamilyFlags4`, `DmgClass`, `PreventionType`, `AreaGroupId`, `SchoolMask`, `ChargeCategoryId`) VALUES +(269396, 0, 0, 0, 0, 0x29240180, 0x000004A8, 0x10484004, 0x00070000, 0x00800080, 0x00060008, 0x00001000, 0x00000040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 21, 1, 0, 0, 0, -1, -1, 0, 0, 'Lord Stormsong Gain Energy', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0); + +DELETE FROM `serverside_spell_effect` WHERE `SpellID` = 269396; +INSERT INTO `serverside_spell_effect` (`SpellID`, `EffectIndex`, `DifficultyID`, `Effect`, `EffectAura`, `EffectAmplitude`, `EffectAttributes`, `EffectAuraPeriod`, `EffectBonusCoefficient`, `EffectChainAmplitude`, `EffectChainTargets`, `EffectItemType`, `EffectMechanic`, `EffectPointsPerResource`, `EffectPosFacing`, `EffectRealPointsPerLevel`, `EffectTriggerSpell`, `BonusCoefficientFromAP`, `PvpMultiplier`, `Coefficient`, `Variance`, `ResourceCoefficient`, `GroupSizeBasePointsCoefficient`, `EffectBasePoints`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectSpellClassMask1`, `EffectSpellClassMask2`, `EffectSpellClassMask3`, `EffectSpellClassMask4`, `ImplicitTarget1`, `ImplicitTarget2`) VALUES +(269396, 0, 0, 6, 226, 0, 0, 1000, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName`IN ('spell_lord_stormsong_release_void_missile', 'spell_lord_stormsong_release_void', 'spell_lord_stormsong_ancient_mindbender', 'spell_lord_stormsong_energize', 'spell_lord_stormsong_fixate', 'spell_lord_stormsong_surrender_to_the_void', 'spell_lord_stormsong_disciple_of_the_vol_zith', 'spell_lord_stormsong_waken_the_void_missile'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(269131, 'spell_lord_stormsong_ancient_mindbender'), +(269396, 'spell_lord_stormsong_energize'), +(269103, 'spell_lord_stormsong_fixate'), +(274711, 'spell_lord_stormsong_release_void'), +(274710, 'spell_lord_stormsong_release_void_missile'), +(269242, 'spell_lord_stormsong_surrender_to_the_void'), +(269289, 'spell_lord_stormsong_disciple_of_the_vol_zith'), +(269021, 'spell_lord_stormsong_waken_the_void_missile'); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID` = 134060; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(134060, 0, 0, '|TInterface\\Icons\\Spell_shadow_mindflay.blp:20|tAn |cFFFF0000|Hspell:269131|h[Ancient Mindbender]|h|r attaches to |cFFFF0000$n|r!', 41, 0, 100, 0, 0, 0, 152885, 0, 'Lord Stormsong to Player'); + +-- Sai +DELETE FROM `smart_scripts` WHERE `entryorguid`=137036 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(137036, 0, 0, 1, '', 54, 0, 100, 0, 0, 0, 0, 0, 0, '', 85, 269021, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Awoken Void - On summoned - Self: Cast spell 269021'), +(137036, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 8, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Awoken Void - On linked - Set Reactstate React Passive'); + +-- Conversation +DELETE FROM `conversation_actors` WHERE (`ConversationId`=8767 AND `Idx` = 0) OR (`ConversationId`=8766 AND `Idx` = 0) OR (`ConversationId`=8751 AND `Idx` IN (1,0)) OR (`ConversationId`=8749 AND `Idx` IN (1,0)) OR (`ConversationId`=8750 AND `Idx` IN (1,0)); +INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES +(8767, 65085, 0, 0, 139971, 0, 0, 0, 63305), -- Full: 0x2016D4E90088B0C00058DC00005ACAFC Creature/0 R1461/S22748 Map: 1864 (Shrine of the Storm) Entry: 139971 (Rexxar) Low: 5950204 +(8766, 65078, 0, 0, 139970, 0, 0, 0, 63305), -- Full: 0x20424CE90088B0800029BA000057ECD7 Creature/0 R4243/S10682 Map: 1864 (Shrine of the Storm) Entry: 139970 (Brother Pike) Low: 5762263 +(8751, 65085, 0, 1, 139971, 0, 0, 0, 63305), -- Full: 0x2016D4E90088B0C00058DC00005ACAFC Creature/0 R1461/S22748 Map: 1864 (Shrine of the Storm) Entry: 139971 (Rexxar) Low: 5950204 +(8751, 62882, 7000893, 0, 0, 0, 0, 0, 63305), -- Full: 0x2016D4E90082EB000058DC00005AC3A6 Creature/0 R1461/S22748 Map: 1864 (Shrine of the Storm) Entry: 134060 (Lord Stormsong) Low: 5948326 +(8749, 65076, 7000896, 1, 0, 0, 0, 0, 63305), -- Full: 0x202FD4E90088AEC0003F4E000052B167 Creature/0 R3061/S16206 Map: 1864 (Shrine of the Storm) Entry: 139963 (Queen Azshara) Low: 5419367 +(8749, 62882, 7000893, 0, 0, 0, 0, 0, 63305), -- Full: 0x202FD4E90082EB00003F4E000052B167 Creature/0 R3061/S16206 Map: 1864 (Shrine of the Storm) Entry: 134060 (Lord Stormsong) Low: 5419367 +(8750, 62882, 7000893, 1, 0, 0, 0, 0, 63305), -- Full: 0x202FD4E90082EB00003F4E000052B167 Creature/0 R3061/S16206 Map: 1864 (Shrine of the Storm) Entry: 134060 (Lord Stormsong) Low: 5419367 +(8750, 65078, 0, 0, 139970, 0, 0, 0, 63305); -- Full: 0x202FD4E90088B080003F4E000052B241 Creature/0 R3061/S16206 Map: 1864 (Shrine of the Storm) Entry: 139970 (Brother Pike) Low: 5419585 + +DELETE FROM `conversation_line_template` WHERE `Id` IN (19655, 19654, 19653, 19652, 19651, 19650, 19598, 19597, 19612, 19611, 19610, 19609, 19608, 19607, 19606, 19605); +INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES +(19655, 0, 0, 0, 0, 63305), +(19654, 0, 0, 0, 0, 63305), +(19653, 0, 0, 0, 0, 63305), +(19652, 0, 0, 0, 0, 63305), +(19651, 0, 0, 0, 0, 63305), +(19650, 0, 0, 0, 0, 63305), +(19598, 0, 1, 0, 0, 63305), +(19597, 0, 0, 0, 0, 63305), +(19612, 0, 1, 0, 0, 63305), +(19611, 0, 1, 0, 0, 63305), +(19610, 0, 0, 0, 0, 63305), +(19609, 0, 1, 0, 1, 63305), +(19608, 0, 0, 0, 0, 63305), +(19607, 0, 1, 0, 0, 63305), +(19606, 0, 1, 0, 1, 63305), +(19605, 0, 0, 0, 1, 63305); + +DELETE FROM `conversation_template` WHERE `Id` IN (8750, 8749, 8767, 8766, 8751); +INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `ScriptName`, `VerifiedBuild`) VALUES +(8750, 19605, 0, 'conversation_lord_stormsong_brother_pike_intro_outro', 63305), +(8767, 19653, 0, 'conversation_lord_stormsong_rexxar_outro', 63305), +(8766, 19650, 0, 'conversation_lord_stormsong_brother_pike_intro_outro', 63305), +(8751, 19610, 0, 'conversation_lord_stormsong_rexxar_intro', 63305), +(8749, 19597, 0, '', 63305); + +-- Waypoints +SET @ENTRY := 139970; +SET @PATHOFFSET := 0; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES +(@PATH, 1, 0x0, NULL, 'Brother Pike/Rexxar - Lord Stormsong intro path'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, 3610.2056, -1374.7302, 160.579, NULL, 0), +(@PATH, 1, 3608.8958, -1378.4115, 160.57855, NULL, 0), +(@PATH, 2, 3607.586, -1382.0928, 160.57811, NULL, 0), +(@PATH, 3, 3606.2456, -1385.8595, 160.0007, NULL, 0), +(@PATH, 4, 3604.7078, -1390.1816, 159.93288, NULL, 0), +(@PATH, 5, 3603.3623, -1393.9633, 159.97807, NULL, 0), +(@PATH, 6, 3602.0173, -1397.743, 159.97806, NULL, 0), +(@PATH, 7, 3595.3533, -1411.257, 159.97807, NULL, 0), +(@PATH, 8, 3587.605, -1425.5087, 160.00375, NULL, 0), +(@PATH, 9, 3579.908, -1436.9341, 159.97806, NULL, 0), +(@PATH, 10, 3561.501, -1465.5017, 153.70235, NULL, 0), +(@PATH, 11, 3557.8325, -1476.3142, 153.37808, NULL, 0); + +SET @ENTRY := 139970; +SET @PATHOFFSET := 1; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES +(@PATH, 1, 0x0, NULL, 'Brother Pike/Rexxar - Lord Stormsong outro path'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, 3546.2266, -1492.658, 153.37653, NULL, 0), +(@PATH, 1, 3542.8281, -1499.783, 154.04007, NULL, 0), +(@PATH, 2, 3539.2778, -1512.4166, 153.60727, NULL, 0); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=274646; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 274646, 0, 0, 51, 0, 5, 139970, 0, '', 0, 0, 0, '', 'Spell \'Dark Binding\' can only hit \'Brother Pike\''), +(13, 2, 274646, 0, 0, 51, 0, 5, 139970, 0, '', 0, 0, 0, '', 'Spell \'Dark Binding\' can only hit \'Brother Pike\''), +(13, 1, 274646, 0, 1, 51, 0, 5, 139971, 0, '', 0, 0, 0, '', 'Spell \'Dark Binding\' can only hit \'Rexxar\''), +(13, 2, 274646, 0, 1, 51, 0, 5, 139971, 0, '', 0, 0, 0, '', 'Spell \'Dark Binding\' can only hit \'Rexxar\''); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=269242; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 269242, 0, 0, 51, 0, 5, 134060, 0, '', 0, 0, 0, '', 'Spell \'Surrender to the Void\' can only hit \'Lord Stormsong\''); 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/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/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index dc68d9fc594..542470a7bbf 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -1216,8 +1216,11 @@ enum ItemBonusType ITEM_BONUS_OVERRIDE_NAME = 31, // ItemNameDescription id ITEM_BONUS_ITEM_BONUS_LIST_GROUP = 34, ITEM_BONUS_ITEM_LIMIT_CATEGORY = 35, + ITEM_BONUS_PVP_ITEM_LEVEL_INCREMENT = 36, ITEM_BONUS_ITEM_CONVERSION = 37, ITEM_BONUS_ITEM_HISTORY_SLOT = 38, + ITEM_BONUS_PVP_ITEM_LEVEL_BASE = 43, + ITEM_BONUS_BONDING_WITH_PRIORITY = 47, }; enum class ItemCollectionType : uint8 diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 74aa8596a58..1ed4b4d06ca 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -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/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 5401c0c9c45..6df3558d66b 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1677,7 +1677,13 @@ uint8 Item::GetGemCountWithLimitCategory(uint32 limitCategory) const if (!gemProto) return false; - return gemProto->GetItemLimitCategory() == limitCategory; + BonusData gemBonus; + gemBonus.Initialize(gemProto); + + for (uint16 bonusListID : gemData.BonusListIDs) + gemBonus.AddBonusList(bonusListID); + + return gemBonus.LimitCategory == limitCategory; })); } @@ -2339,7 +2345,13 @@ uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bon uint32 itemLevelBeforeUpgrades = itemLevel; if (pvpBonus) + { + if (bonusData.PvpItemLevel) + itemLevel = bonusData.PvpItemLevel; + + itemLevel += bonusData.PvpItemLevelBonus; itemLevel += sDB2Manager.GetPvpItemLevelBonus(itemTemplate->GetId()); + } if (itemTemplate->GetInventoryType() != INVTYPE_NON_EQUIP) { @@ -2919,6 +2931,9 @@ void BonusData::Initialize(ItemTemplate const* proto) Suffix = 0; RequiredLevelCurve = 0; + PvpItemLevel = 0; + PvpItemLevelBonus = 0; + EffectCount = 0; for (ItemEffectEntry const* itemEffect : proto->Effects) Effects[EffectCount++] = itemEffect; @@ -2926,6 +2941,8 @@ void BonusData::Initialize(ItemTemplate const* proto) for (std::size_t i = EffectCount; i < Effects.size(); ++i) Effects[i] = nullptr; + LimitCategory = proto->GetItemLimitCategory(); + CanDisenchant = !proto->HasFlag(ITEM_FLAG_NO_DISENCHANT); CanScrap = proto->HasFlag(ITEM_FLAG4_SCRAPABLE); @@ -2935,7 +2952,10 @@ void BonusData::Initialize(ItemTemplate const* proto) _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max(); _state.AzeriteTierUnlockSetPriority = std::numeric_limits<int32>::max(); _state.RequiredLevelCurvePriority = std::numeric_limits<int32>::max(); + _state.PvpItemLevelPriority = std::numeric_limits<int32>::max(); + _state.BondingPriority = std::numeric_limits<int32>::max(); _state.HasQualityBonus = false; + _state.HasItemLimitCategory = false; } void BonusData::Initialize(WorldPackets::Item::ItemInstance const& itemInstance) @@ -3072,5 +3092,29 @@ void BonusData::AddBonus(uint32 type, std::array<int32, 4> const& values) ContentTuningId = static_cast<uint32>(values[1]); } break; + case ITEM_BONUS_ITEM_LIMIT_CATEGORY: + if (!_state.HasItemLimitCategory) + { + LimitCategory = values[0]; + _state.HasItemLimitCategory = true; + } + break; + case ITEM_BONUS_PVP_ITEM_LEVEL_INCREMENT: + PvpItemLevelBonus += values[0]; + break; + case ITEM_BONUS_PVP_ITEM_LEVEL_BASE: + if (values[1] < _state.PvpItemLevelPriority) + { + PvpItemLevel = values[0]; + _state.PvpItemLevelPriority = values[1]; + } + break; + case ITEM_BONUS_BONDING_WITH_PRIORITY: + if (values[1] < _state.BondingPriority) + { + Bonding = static_cast<ItemBondingType>(values[0]); + _state.BondingPriority = values[1]; + } + break; } } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index d8d03f1e709..d7bb941284d 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -80,8 +80,11 @@ struct BonusData int32 AzeriteTierUnlockSetId; uint32 Suffix; int32 RequiredLevelCurve; + uint16 PvpItemLevel; + int16 PvpItemLevelBonus; std::array<ItemEffectEntry const*, 13> Effects; std::size_t EffectCount; + uint32 LimitCategory; bool CanDisenchant; bool CanScrap; bool HasFixedLevel; @@ -100,7 +103,10 @@ private: int32 ScalingStatDistributionPriority; int32 AzeriteTierUnlockSetPriority; int32 RequiredLevelCurvePriority; + int32 PvpItemLevelPriority; + int32 BondingPriority; bool HasQualityBonus; + bool HasItemLimitCategory; } _state; }; @@ -347,6 +353,7 @@ class TC_GAME_API Item : public Object static ItemDisenchantLootEntry const* GetBaseDisenchantLoot(ItemTemplate const* itemTemplate, uint32 quality, uint32 itemLevel); void SetFixedLevel(uint8 level); std::span<ItemEffectEntry const* const> GetEffects() const { return { _bonusData.Effects.data(), _bonusData.EffectCount }; } + uint32 GetItemLimitCategory() const { return _bonusData.LimitCategory; } // Item Refund system void SetNotRefundable(Player* owner, bool changestate = true, CharacterDatabaseTransaction* trans = nullptr, bool addToCollection = true); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c8c75eb8279..f8ab0096a05 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 @@ -9564,9 +9564,8 @@ uint32 Player::GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipIte ForEachItem(ItemSearchLocation::Everywhere, [&count, limitCategory, skipItem](Item* item) { if (item != skipItem) - if (ItemTemplate const* pProto = item->GetTemplate()) - if (pProto->GetItemLimitCategory() == limitCategory) - count += item->GetCount(); + if (item->GetItemLimitCategory() == limitCategory) + count += item->GetCount(); return ItemSearchCallbackResult::Continue; }); @@ -9928,7 +9927,7 @@ bool Player::HasItemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count if (pItem->GetSlot() == except_slot) return ItemSearchCallbackResult::Continue; - if (pItem->GetTemplate()->GetItemLimitCategory() != limitCategory) + if (pItem->GetItemLimitCategory() != limitCategory) return ItemSearchCallbackResult::Continue; tempcount += pItem->GetCount(); @@ -9972,8 +9971,10 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item if (pItem && pItem->m_lootGenerated) return EQUIP_ERR_LOOT_GONE; + uint32 limitCategory = pItem ? pItem->GetItemLimitCategory() : pProto->GetItemLimitCategory(); + // no maximum - if ((pProto->GetMaxCount() <= 0 && pProto->GetItemLimitCategory() == 0) || pProto->GetMaxCount() == 2147483647) + if ((pProto->GetMaxCount() <= 0 && limitCategory == 0) || pProto->GetMaxCount() == 2147483647) return EQUIP_ERR_OK; if (pProto->GetMaxCount() > 0) @@ -9988,9 +9989,9 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item } // check unique-equipped limit - if (pProto->GetItemLimitCategory()) + if (limitCategory) { - ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->GetItemLimitCategory()); + ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(limitCategory); if (!limitEntry) { if (no_space_count) @@ -10001,7 +10002,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item if (limitEntry->Flags == ITEM_LIMIT_CATEGORY_MODE_HAVE) { uint8 limitQuantity = GetItemLimitCategoryQuantity(limitEntry); - uint32 curcount = GetItemCountWithLimitCategory(pProto->GetItemLimitCategory(), pItem); + uint32 curcount = GetItemCountWithLimitCategory(limitCategory, pItem); if (curcount + count > uint32(limitQuantity)) { if (no_space_count) @@ -13027,8 +13028,10 @@ void Player::SendEquipError(InventoryResult msg, Item const* item1 /*= nullptr*/ case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS: case EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS: { - ItemTemplate const* proto = item1 ? item1->GetTemplate() : sObjectMgr->GetItemTemplate(itemId); - failure.LimitCategory = proto ? proto->GetItemLimitCategory() : 0; + if (item1) + failure.LimitCategory = item1->GetItemLimitCategory(); + else if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId)) + failure.LimitCategory = proto->GetItemLimitCategory(); break; } default: @@ -21205,8 +21208,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) @@ -27014,7 +27017,7 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi ItemTemplate const* pProto = pItem->GetTemplate(); // proto based limitations - if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count)) + if (InventoryResult res = CanEquipUniqueItem(pProto, *pItem->GetBonus(), eslot, limit_count)) return res; // check unique-equipped on gems @@ -27024,18 +27027,24 @@ InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limi if (!pGem) continue; + BonusData gemBonus; + gemBonus.Initialize(pGem); + + for (uint16 bonusListID : gemData.BonusListIDs) + gemBonus.AddBonusList(bonusListID); + // include for check equip another gems with same limit category for not equipped item (and then not counted) - uint32 gem_limit_count = !pItem->IsEquipped() && pGem->GetItemLimitCategory() - ? pItem->GetGemCountWithLimitCategory(pGem->GetItemLimitCategory()) : 1; + uint32 gem_limit_count = !pItem->IsEquipped() && gemBonus.LimitCategory + ? pItem->GetGemCountWithLimitCategory(gemBonus.LimitCategory) : 1; - if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count)) + if (InventoryResult res = CanEquipUniqueItem(pGem, gemBonus, eslot, gem_limit_count)) return res; } return EQUIP_ERR_OK; } -InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot, uint32 limit_count) const +InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, BonusData const& itemBonus, uint8 except_slot, uint32 limit_count) const { // check unique-equipped on item if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) @@ -27046,9 +27055,9 @@ InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 } // check unique-equipped limit - if (itemProto->GetItemLimitCategory()) + if (itemBonus.LimitCategory) { - ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->GetItemLimitCategory()); + ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemBonus.LimitCategory); if (!limitEntry) return EQUIP_ERR_NOT_EQUIPPABLE; @@ -27059,9 +27068,9 @@ InventoryResult Player::CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS; // there is an equip limit on this item - if (HasItemWithLimitCategoryEquipped(itemProto->GetItemLimitCategory(), limitQuantity - limit_count + 1, except_slot)) + if (HasItemWithLimitCategoryEquipped(itemBonus.LimitCategory, limitQuantity - limit_count + 1, except_slot)) return EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS; - else if (HasGemWithLimitCategoryEquipped(itemProto->GetItemLimitCategory(), limitQuantity - limit_count + 1, except_slot)) + else if (HasGemWithLimitCategoryEquipped(itemBonus.LimitCategory, limitQuantity - limit_count + 1, except_slot)) return EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 51c91183d20..d6abd1c4104 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -45,6 +45,7 @@ struct AzeriteItemMilestonePowerEntry; struct AzeritePowerEntry; struct BarberShopStyleEntry; struct BattlegroundTemplate; +struct BonusData; struct CharTitlesEntry; struct ChatChannelsEntry; struct ChrSpecializationEntry; @@ -1490,7 +1491,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> InventoryResult CanEquipChildItem(Item* parentItem) const; InventoryResult CanEquipUniqueItem(Item* pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const; - InventoryResult CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const; + InventoryResult CanEquipUniqueItem(ItemTemplate const* itemProto, BonusData const& itemBonus, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const; InventoryResult CanUnequipItems(uint32 item, uint32 count) const; InventoryResult CanUnequipItem(uint16 src, bool swap) const; InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading = true, bool reagentBankOnly = false) const; @@ -2310,12 +2311,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/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index a8602605c7d..329849c5e34 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1048,9 +1048,9 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) // unique limit type item int32 limit_newcount = 0; - if (iGemProto->GetItemLimitCategory()) + if (gems[i]->GetItemLimitCategory()) { - if (ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(iGemProto->GetItemLimitCategory())) + if (ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(gems[i]->GetItemLimitCategory())) { // NOTE: limitEntry->Flags is not checked because if item has limit then it is applied in equip case for (int j = 0; j < MAX_GEM_SOCKETS; ++j) @@ -1058,15 +1058,23 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems) if (gems[j]) { // new gem - if (iGemProto->GetItemLimitCategory() == gems[j]->GetTemplate()->GetItemLimitCategory()) + if (gems[i]->GetItemLimitCategory() == gems[j]->GetItemLimitCategory()) ++limit_newcount; } else if (oldGemData[j]) { // existing gem if (ItemTemplate const* jProto = sObjectMgr->GetItemTemplate(oldGemData[j]->ItemID)) - if (iGemProto->GetItemLimitCategory() == jProto->GetItemLimitCategory()) + { + BonusData oldGemBonus; + oldGemBonus.Initialize(jProto); + + for (uint16 bonusListID : oldGemData[j]->BonusListIDs) + oldGemBonus.AddBonusList(bonusListID); + + if (gems[i]->GetItemLimitCategory() == oldGemBonus.LimitCategory) ++limit_newcount; + } } } 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/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index edd02483b46..0dc27c80927 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4968,7 +4968,7 @@ void SpellMgr::LoadSpellInfoCorrections() }); // Conversation - ApplySpellFix({ 274668, 274669 }, [](SpellInfo* spellInfo) + ApplySpellFix({ 274668, 274669, 274622, 274640, 274641, 274674, 274675 }, [](SpellInfo* spellInfo) { ApplySpellEffectFix(spellInfo, EFFECT_0, [](SpellEffectInfo* spellEffectInfo) { 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/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 index 4494838a2f3..fb7129faf17 100644 --- a/src/server/scripts/KhazAlgar/CityOfThreads/boss_orator_krix_vizk.cpp +++ b/src/server/scripts/KhazAlgar/CityOfThreads/boss_orator_krix_vizk.cpp @@ -20,7 +20,7 @@ #include "CellImpl.h" #include "Conversation.h" #include "Creature.h" -#include "GridNotifiers.h" +#include "GridNotifiersImpl.h" #include "InstanceScript.h" #include "MotionMaster.h" #include "PathGenerator.h" diff --git a/src/server/scripts/KulTiras/ShrineOfTheStorm/boss_lord_stormsong.cpp b/src/server/scripts/KulTiras/ShrineOfTheStorm/boss_lord_stormsong.cpp new file mode 100644 index 00000000000..6b69fda5482 --- /dev/null +++ b/src/server/scripts/KulTiras/ShrineOfTheStorm/boss_lord_stormsong.cpp @@ -0,0 +1,645 @@ +/* + * 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 "Conversation.h" +#include "ConversationAI.h" +#include "Creature.h" +#include "GridNotifiersImpl.h" +#include "InstanceScript.h" +#include "Map.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" +#include "TemporarySummon.h" +#include "Vehicle.h" +#include "shrine_of_the_storm.h" + +enum LordStormsongSpells +{ + SPELL_ANCIENT_MINDBENDER = 269131, + SPELL_CONVERSATION = 274622, + SPELL_CONVERSATION_ALLIANCE_INTRO = 274640, + SPELL_CONVERSATION_ALLIANCE_OUTRO = 274674, + SPELL_CONVERSATION_HORDE_INTRO = 274641, + SPELL_CONVERSATION_HORDE_OUTRO = 274675, + SPELL_DARK_BINDING = 274646, + SPELL_DISCIPLE_OF_THE_VOL_ZITH = 269289, + SPELL_ENERGIZE = 269396, // Serverside + SPELL_EXPLOSIVE_VOID = 269104, + SPELL_FIXATE = 269103, + SPELL_MIND_REND = 268896, + SPELL_RELEASE_VOID = 274711, + SPELL_RIDE_VEHICLE = 46598, + SPELL_SURRENDER_TO_THE_VOID = 269242, + SPELL_VOID_BOLT = 268347, + SPELL_WAKEN_THE_VOID_AREATRIGGER = 269094, + SPELL_WAKEN_THE_VOID_SUMMON = 269095, + SPELL_WAKEN_THE_VOID_AREA = 269097 +}; + +enum LordStormsongEvents +{ + EVENT_VOID_BOLT = 1, + EVENT_MIND_REND, + EVENT_WAKEN_THE_VOID, + EVENT_CHECK_POWER, + + EVENT_OUTRO +}; + +enum LordStormsongTexts +{ + SAY_MINDBENDER_WARNING = 0 +}; + +enum LordStormsongActions +{ + ACTION_START_INTRO = 1, + ACTION_START_OUTRO +}; + +enum LordStormsongMisc +{ + DISPLAY_POWERID = 425, + + NPC_QUEEN_AZSHARA = 139963, + NPC_ANCIENT_MINDBENDER = 137051, + NPC_WATER_STALKER = 82347, + + CONVO_ACTOR_BROTHER_PIKE = 65078, + CONVO_ACTOR_REXXAR = 65085, + + PATH_INTRO = 13997000, + PATH_OUTRO = 13997001, + + WAYPOINT_BOSS_INTRO = 11, + WAYPOINT_BOSS_OUTRO = 2 +}; + +constexpr Position IntroPosition = { 3608.3933f, -1379.824f, 160.573f, 4.370550f }; + +// 134060 - Lord Stormsong +struct boss_lord_stormsong : public BossAI +{ + boss_lord_stormsong(Creature* creature) : BossAI(creature, DATA_LORD_STORMSONG) { } + + void JustAppeared() override + { + me->SetPowerType(POWER_ENERGY); + me->SetPower(POWER_ENERGY, 55); // Energy bar is bugged on retail, but its working fine + me->SetOverrideDisplayPowerId(DISPLAY_POWERID); // No aura handle + + if (instance->GetData(DATA_LORD_STORMSONG_INTRO) == DONE) + me->SetImmuneToPC(false); + } + + void DespawnMindbenders() + { + std::list<Creature*> mindbenders; + me->GetCreatureListWithOptionsInGrid(mindbenders, 200.0f, { .CreatureId = NPC_ANCIENT_MINDBENDER }); + for (Creature* mindbender : mindbenders) + mindbender->DespawnOrUnsummon(); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetBossState(DATA_LORD_STORMSONG, FAIL); + + _EnterEvadeMode(); + _DespawnAtEvade(); + + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ANCIENT_MINDBENDER); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DISCIPLE_OF_THE_VOL_ZITH); + DespawnMindbenders(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + instance->SetBossState(DATA_LORD_STORMSONG, IN_PROGRESS); + + DoCastSelf(SPELL_ENERGIZE); + + events.ScheduleEvent(EVENT_VOID_BOLT, 8500ms); + events.ScheduleEvent(EVENT_WAKEN_THE_VOID, 13500ms); + events.ScheduleEvent(EVENT_CHECK_POWER, 500ms); + + if (IsHeroicOrHigher()) + events.ScheduleEvent(EVENT_MIND_REND, 16s); + } + + void DoAction(int32 actionId) override + { + switch (actionId) + { + case ACTION_START_INTRO: + { + DoCastSelf(SPELL_CONVERSATION); + me->SetEmoteState(EMOTE_ONESHOT_NONE); + me->GetMap()->SummonCreature(instance->instance->GetTeamInInstance() == HORDE ? NPC_LORD_STORMSONG_REXXAR : NPC_LORD_STORMSONG_BROTHER_PIKE, IntroPosition); + + scheduler.Schedule(11s, [this](TaskContext task) + { + me->SetFacingTo(1.047197f); + me->SetOrientation(me->GetOrientation()); + Creature* azshara = me->FindNearestCreature(NPC_QUEEN_AZSHARA, 50.0f); + if (!azshara) + return; + + azshara->DespawnOrUnsummon(); + + task.Schedule(16s, [this](TaskContext task) + { + DoCastSelf(SPELL_DARK_BINDING); + + task.Schedule(6s, [this](TaskContext) + { + me->SetImmuneToPC(false); + me->SetEmoteState(EMOTE_STATE_READY1H); + instance->SetData(DATA_LORD_STORMSONG_INTRO, DONE); + }); + }); + }); + break; + } + default: + break; + } + } + + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override + { + if (!target->IsPlayer()) + return; + + if (spellInfo->Id == SPELL_ANCIENT_MINDBENDER) + Talk(SAY_MINDBENDER_WARNING, target); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetBossState(DATA_LORD_STORMSONG, DONE); + + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ANCIENT_MINDBENDER); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DISCIPLE_OF_THE_VOL_ZITH); + + DespawnMindbenders(); + + Creature* pikeOrRexxar = me->GetInstanceScript()->GetCreature(instance->instance->GetTeamInInstance() == HORDE ? DATA_LORD_STORMSONG_REXXAR : DATA_LORD_STORMSONG_BROTHER_PIKE); + if (!pikeOrRexxar) + return; + + pikeOrRexxar->AI()->DoAction(ACTION_START_OUTRO); + } + + 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_VOID_BOLT: + { + DoCastVictim(SPELL_VOID_BOLT); + events.Repeat(8500ms); + break; + } + case EVENT_MIND_REND: + { + DoCastSelf(SPELL_MIND_REND); + events.Repeat(10500ms); + break; + } + case EVENT_WAKEN_THE_VOID: + { + DoCastSelf(SPELL_WAKEN_THE_VOID_AREA); + events.Repeat(43500ms); + break; + } + case EVENT_CHECK_POWER: + { + if (me->GetPower(POWER_ENERGY) >= 100) + { + DoCast(SPELL_ANCIENT_MINDBENDER); + events.RescheduleEvent(EVENT_CHECK_POWER, 2s); + } + events.Repeat(500ms); + break; + } + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } +}; + +// 137051 - Ancient Mindbender +struct boss_lord_stormsong_ancient_mindbender : public ScriptedAI +{ + boss_lord_stormsong_ancient_mindbender(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + TempSummon* tempSummon = me->ToTempSummon(); + if (!tempSummon) + return; + + tempSummon->CastSpell(tempSummon->GetSummoner(), SPELL_RIDE_VEHICLE, TRIGGERED_FULL_MASK); + } +}; + +// 139971 - Rexxar +// 139970 - Brother Pike +template<uint32 ConvoIntroSpellId, uint32 ConvoOutroSpellId> +struct boss_lord_stormsong_intro_npc : public ScriptedAI +{ + boss_lord_stormsong_intro_npc(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + me->GetMotionMaster()->MovePath(PATH_INTRO, false); + } + + void WaypointReached(uint32 waypointId, uint32 pathId) override + { + if (pathId == PATH_INTRO) + { + if (waypointId == WAYPOINT_BOSS_INTRO) + DoCastSelf(ConvoIntroSpellId); + } + else if (pathId == PATH_OUTRO) + { + if (waypointId == WAYPOINT_BOSS_OUTRO) + DoCastSelf(ConvoOutroSpellId); + } + } + + void DoAction(int32 action) override + { + if (action != ACTION_START_OUTRO) + return; + + Creature* stalker = me->FindNearestCreature(NPC_WATER_STALKER, 100.0f); + if (!stalker) + return; + + stalker->CastSpell(stalker, SPELL_RELEASE_VOID, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + + _events.ScheduleEvent(EVENT_OUTRO, 2s); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_OUTRO: + { + me->RemoveAurasDueToSpell(SPELL_DARK_BINDING); + me->GetMotionMaster()->MovePath(PATH_OUTRO, false); + break; + } + default: + break; + } + } + +private: + EventMap _events; +}; + +// 269396 - Lord Stormsong Gain Energy (SERVERSIDE) +class spell_lord_stormsong_energize : public AuraScript +{ + static constexpr std::array<uint8, 2> LordStormsongEnergizeCycle = { 2, 3 }; + + void PeriodicTick(AuraEffect const* aurEff) const + { + uint8 cycleIdx = aurEff->GetTickNumber() % LordStormsongEnergizeCycle.size(); + GetTarget()->ModifyPower(POWER_ENERGY, LordStormsongEnergizeCycle[cycleIdx]); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_lord_stormsong_energize::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 269021 - Waken the Void +class spell_lord_stormsong_waken_the_void_missile : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WAKEN_THE_VOID_AREATRIGGER, SPELL_FIXATE }); + } + + void HandleHitTarget(SpellEffIndex /*effIndex*/) const + { + Unit* caster = GetCaster(); + caster->CastSpell(GetHitUnit(), SPELL_WAKEN_THE_VOID_AREATRIGGER, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + caster->CastSpell(caster, SPELL_FIXATE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_lord_stormsong_waken_the_void_missile::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 269103 - Fixate +class spell_lord_stormsong_fixate : public SpellScript +{ + void HandleFixate(SpellEffIndex /*effIndex*/) const + { + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; + + caster->GetMotionMaster()->MoveFollow(GetHitUnit(), 0.0f); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_lord_stormsong_fixate::HandleFixate, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } +}; + +class spell_lord_stormsong_fixate_aura : public AuraScript +{ + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const + { + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; + + caster->DespawnOrUnsummon(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_lord_stormsong_fixate_aura::AfterRemove, EFFECT_0, SPELL_AURA_MOD_FIXATE, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 269131 - Ancient Mindbender +class spell_lord_stormsong_ancient_mindbender : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SURRENDER_TO_THE_VOID }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) const + { + Unit* target = GetHitUnit(); + target->SummonCreature(NPC_ANCIENT_MINDBENDER, target->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN); + target->CastSpell(target, SPELL_SURRENDER_TO_THE_VOID, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_lord_stormsong_ancient_mindbender::HandleHit, EFFECT_11, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_lord_stormsong_ancient_mindbender_aura : public AuraScript +{ + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const + { + Vehicle* playerVehicle = GetTarget()->GetVehicleKit(); + if (!playerVehicle) + return; + + Unit* ancientMindbender = playerVehicle->GetPassenger(0); + if (!ancientMindbender) + return; + + Creature* mindbender = ancientMindbender->ToCreature(); + if (!mindbender) + return; + + mindbender->DespawnOrUnsummon(); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_lord_stormsong_ancient_mindbender_aura::OnRemove, EFFECT_2, SPELL_AURA_SET_VEHICLE_ID, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 269242 - Surrender to the Void +class spell_lord_stormsong_surrender_to_the_void : public SpellScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); + } + + void HandleDummy(SpellEffIndex /* effIndex */) const + { + GetHitUnit()->m_Events.AddEvent([hitUnit = GetHitUnit(), casterGUID = GetCaster()->GetGUID(), spellId = GetEffectValue()]() + { + if (Unit* caster = ObjectAccessor::GetUnit(*hitUnit, casterGUID)) + hitUnit->CastSpell(caster, uint32(spellId), TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + }, 0ms); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_lord_stormsong_surrender_to_the_void::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 269289 - Disciple of the Vol'zith +class spell_lord_stormsong_disciple_of_the_vol_zith : public AuraScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); + } + + void HandlePeriodic(AuraEffect const* /*aurEff*/) const + { + Unit* target = GetTarget(); + target->CastSpell(target, GetEffectInfo(EFFECT_0).CalcValue(), TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_lord_stormsong_disciple_of_the_vol_zith::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 274711 - Release Void +class spell_lord_stormsong_release_void : public AuraScript +{ + void OnRemove(AuraEffect const* /*auraEffect*/, AuraEffectHandleModes /*mode*/) const + { + if (Creature* creatureCaster = GetCaster()->ToCreature()) + creatureCaster->DespawnOrUnsummon(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_lord_stormsong_release_void::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 274710 - Release Void +class spell_lord_stormsong_release_void_missile : public SpellScript +{ + void ModDestHeight(SpellDestination& dest) const + { + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_lord_stormsong_release_void_missile::ModDestHeight, EFFECT_1, TARGET_DEST_DEST_RANDOM); + } +}; + +// 269094 - Waken the Void +struct at_lord_stormsong_waken_the_void : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + if (!unit->IsPlayer()) + return; + + Unit* caster = at->GetCaster(); + if (!caster) + return; + + caster->CastSpell(unit, SPELL_EXPLOSIVE_VOID, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + unit->RemoveAurasDueToSpell(SPELL_FIXATE); + at->Remove(); + } +}; + +// Id - XXX +struct at_lord_stormsong_intro : AreaTriggerAI +{ + at_lord_stormsong_intro(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player || player->IsGameMaster()) + return; + + InstanceScript* instance = at->GetInstanceScript(); + if (!instance) + return; + + if (Creature* lordStormsong = instance->GetCreature(DATA_LORD_STORMSONG)) + lordStormsong->AI()->DoAction(ACTION_START_INTRO); + + at->Remove(); + } +}; + +// 274640 - Conversation +// 274674 - Conversation +class conversation_lord_stormsong_brother_pike_intro_outro : public ConversationAI +{ +public: + conversation_lord_stormsong_brother_pike_intro_outro(Conversation* conversation) : ConversationAI(conversation) { } + + void OnCreate(Unit* creator) override + { + conversation->AddActor(CONVO_ACTOR_BROTHER_PIKE, 0, creator->GetGUID()); + } +}; + +// 274641 - Conversation +class conversation_lord_stormsong_rexxar_intro : public ConversationAI +{ +public: + conversation_lord_stormsong_rexxar_intro(Conversation* conversation) : ConversationAI(conversation) { } + + void OnCreate(Unit* creator) override + { + conversation->AddActor(CONVO_ACTOR_REXXAR, 1, creator->GetGUID()); + } +}; + +// 274675 - Conversation +class conversation_lord_stormsong_rexxar_outro : public ConversationAI +{ +public: + conversation_lord_stormsong_rexxar_outro(Conversation* conversation) : ConversationAI(conversation) { } + + void OnCreate(Unit* creator) override + { + conversation->AddActor(CONVO_ACTOR_REXXAR, 0, creator->GetGUID()); + } +}; + +void AddSC_boss_lord_stormsong() +{ + RegisterShrineOfTheStormCreatureAI(boss_lord_stormsong); + RegisterShrineOfTheStormCreatureAI(boss_lord_stormsong_ancient_mindbender); + new GenericCreatureScript<boss_lord_stormsong_intro_npc<SPELL_CONVERSATION_HORDE_INTRO, SPELL_CONVERSATION_HORDE_OUTRO>>("boss_lord_stormsong_rexxar"); + new GenericCreatureScript<boss_lord_stormsong_intro_npc<SPELL_CONVERSATION_ALLIANCE_INTRO, SPELL_CONVERSATION_ALLIANCE_OUTRO>>("boss_lord_stormsong_brother_pike"); + + RegisterSpellScript(spell_lord_stormsong_energize); + RegisterSpellScript(spell_lord_stormsong_waken_the_void_missile); + RegisterSpellAndAuraScriptPair(spell_lord_stormsong_fixate, spell_lord_stormsong_fixate_aura); + RegisterSpellAndAuraScriptPair(spell_lord_stormsong_ancient_mindbender, spell_lord_stormsong_ancient_mindbender_aura); + RegisterSpellScript(spell_lord_stormsong_surrender_to_the_void); + RegisterSpellScript(spell_lord_stormsong_disciple_of_the_vol_zith); + RegisterSpellScript(spell_lord_stormsong_release_void); + RegisterSpellScript(spell_lord_stormsong_release_void_missile); + + RegisterAreaTriggerAI(at_lord_stormsong_waken_the_void); + + RegisterAreaTriggerAI(at_lord_stormsong_intro); + + RegisterConversationAI(conversation_lord_stormsong_brother_pike_intro_outro); + RegisterConversationAI(conversation_lord_stormsong_rexxar_intro); + RegisterConversationAI(conversation_lord_stormsong_rexxar_outro); +} diff --git a/src/server/scripts/KulTiras/ShrineOfTheStorm/instance_shrine_of_the_storm.cpp b/src/server/scripts/KulTiras/ShrineOfTheStorm/instance_shrine_of_the_storm.cpp index d384ae6a85e..57c6ceba654 100644 --- a/src/server/scripts/KulTiras/ShrineOfTheStorm/instance_shrine_of_the_storm.cpp +++ b/src/server/scripts/KulTiras/ShrineOfTheStorm/instance_shrine_of_the_storm.cpp @@ -23,17 +23,20 @@ static BossBoundaryData const boundaries = { { DATA_AQUSIRR, new ZRangeBoundary(119.89f, 132.9f) }, - { DATA_TIDESAGE_COUNCIL, new CircleBoundary({ 3939.6357f, -1007.4829f, 109.2227f }, 60.0f)} + { DATA_TIDESAGE_COUNCIL, new CircleBoundary({ 3939.6357f, -1007.4829f, 109.2227f }, 60.0f) }, + { DATA_LORD_STORMSONG, new ZRangeBoundary(146.85f, 157.03f) } }; ObjectData const creatureData[] = { - { BOSS_AQUSIRR, DATA_AQUSIRR }, - { BOSS_BROTHER_IRONHULL, DATA_BROTHER_IRONHULL }, - { BOSS_GALECALLER_FAYE, DATA_GALECALLER_FAYE }, - { BOSS_LORD_STORMSONG, DATA_LORD_STORMSONG }, - { BOSS_VOLZITH_THE_WHISPERER, DATA_VOLZITH_THE_WHISPERER }, - { 0, 0 } // END + { BOSS_AQUSIRR, DATA_AQUSIRR }, + { BOSS_BROTHER_IRONHULL, DATA_BROTHER_IRONHULL }, + { BOSS_GALECALLER_FAYE, DATA_GALECALLER_FAYE }, + { BOSS_LORD_STORMSONG, DATA_LORD_STORMSONG }, + { BOSS_VOLZITH_THE_WHISPERER, DATA_VOLZITH_THE_WHISPERER }, + { NPC_LORD_STORMSONG_BROTHER_PIKE, DATA_LORD_STORMSONG_BROTHER_PIKE }, + { NPC_LORD_STORMSONG_REXXAR, DATA_LORD_STORMSONG_REXXAR }, + { 0, 0 } // END }; DungeonEncounterData const encounters[] = @@ -58,7 +61,36 @@ public: LoadBossBoundaries(boundaries); LoadObjectData(creatureData, nullptr); LoadDungeonEncounterData(encounters); + + _lordStormsongIntroState = NOT_STARTED; + } + + uint32 GetData(uint32 dataId) const override + { + switch (dataId) + { + case DATA_LORD_STORMSONG_INTRO: + return _lordStormsongIntroState; + default: + break; + } + return 0; } + + void SetData(uint32 dataId, uint32 value) override + { + switch (dataId) + { + case DATA_LORD_STORMSONG_INTRO: + _lordStormsongIntroState = value; + break; + default: + break; + } + } + + private: + uint8 _lordStormsongIntroState; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/KulTiras/ShrineOfTheStorm/shrine_of_the_storm.h b/src/server/scripts/KulTiras/ShrineOfTheStorm/shrine_of_the_storm.h index e8d9b7f4e73..a3309dd0932 100644 --- a/src/server/scripts/KulTiras/ShrineOfTheStorm/shrine_of_the_storm.h +++ b/src/server/scripts/KulTiras/ShrineOfTheStorm/shrine_of_the_storm.h @@ -34,7 +34,11 @@ enum ShrineOfTheStormDataTypes DATA_VOLZITH_THE_WHISPERER = 3, DATA_BROTHER_IRONHULL, - DATA_GALECALLER_FAYE + DATA_GALECALLER_FAYE, + + DATA_LORD_STORMSONG_INTRO, + DATA_LORD_STORMSONG_BROTHER_PIKE, + DATA_LORD_STORMSONG_REXXAR }; enum ShrineOfTheStormCreatureIds @@ -50,6 +54,9 @@ enum ShrineOfTheStormCreatureIds NPC_SHRINE_OF_THE_STORM_DUMMY = 139986, NPC_GRASPING_TENTACLE = 134612, NPC_AQUALING = 134828, + + NPC_LORD_STORMSONG_BROTHER_PIKE = 139970, + NPC_LORD_STORMSONG_REXXAR = 139971 }; template <class AI, class T> diff --git a/src/server/scripts/KulTiras/kultiras_script_loader.cpp b/src/server/scripts/KulTiras/kultiras_script_loader.cpp index 3934b6cebe0..68057631500 100644 --- a/src/server/scripts/KulTiras/kultiras_script_loader.cpp +++ b/src/server/scripts/KulTiras/kultiras_script_loader.cpp @@ -28,6 +28,7 @@ void AddSC_drustvar_chapter_3_an_airtight_alibi(); // Shrine of the Storm void AddSC_boss_aqusirr(); void AddSC_boss_tidesage_council(); +void AddSC_boss_lord_stormsong(); void AddSC_instance_shrine_of_the_storm(); // Waycrest Manor @@ -52,6 +53,7 @@ void AddKulTirasScripts() // Shrine of the Storm AddSC_boss_aqusirr(); AddSC_boss_tidesage_council(); + AddSC_boss_lord_stormsong(); AddSC_instance_shrine_of_the_storm(); // Waycrest Manor 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; } } |