Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2024-01-04 19:22:20 +08:00
57 changed files with 1900 additions and 551 deletions
@@ -0,0 +1,4 @@
-- DB update 2023_12_28_00 -> 2023_12_30_00
-- Rotting Touch
DELETE FROM `spell_custom_attr` WHERE `spell_id`=50196;
INSERT INTO `spell_custom_attr` (`spell_id`, `attributes`) VALUES (50196, 4194304);
+217
View File
@@ -0,0 +1,217 @@
-- DB update 2023_12_30_00 -> 2024_01_01_00
-- Update all 'Mailbox' gameobjects with sniffed values
-- updated spawns
DELETE FROM `gameobject`
WHERE (`id` IN (142075, 142089, 142093, 142094, 142095, 142102, 142103, 142109, 142110, 142111, 142117, 142119, 143981, 143982, 143983, 143984, 143985, 143986, 143987, 143988, 143989, 143990, 144011, 144112, 144125, 144126, 144127, 144128, 144129, 144130, 144131, 144179, 153578, 153716, 157637, 163313, 163645, 164618, 164840, 171556, 171699, 171752, 173047, 173221, 176319, 176324, 176404, 177044, 178864, 179895, 179896, 180451, 181236, 181380, 181381, 181639, 181883, 181980, 182356, 182357, 182359, 182360, 182361, 182362, 182363, 182364, 182365, 182391, 182567, 182939, 182946, 182948, 182949, 182950, 182955, 183037, 183038, 183039, 183040, 183042, 183047, 183167, 183856, 183857, 183858, 184085, 184133, 184134, 184135, 184136, 184137, 184138, 184139, 184140, 184147, 184148, 184490, 184652, 184944, 185102, 185472, 185473, 185477, 186230, 186435, 186506, 186629, 186687, 187113, 187260, 187268, 187316, 187322, 188123, 188241, 188256, 188355, 188486, 188531, 188534, 188541, 188604, 188618, 188682, 188710, 189328, 189329, 189969, 190914, 190915, 191228, 191521, 191832, 191946, 191947, 191948, 191949, 191950, 191951, 191952, 191953, 191954, 191955, 191956, 191957, 192952, 193030, 193043, 193044, 193045, 193071, 193791, 193972, 194016, 194027, 194147, 194492, 194788, 195218, 195467, 195468, 195528, 195529, 195530, 195554, 195555, 195556, 195557, 195558, 195559, 195560, 195561, 195562, 195603, 195604, 195606, 195607, 195608, 195609, 195610, 195611, 195612, 195613, 195614, 195615, 195616, 195617, 195618, 195619, 195624, 195625, 195626, 195627, 195628, 195629, 32349))
AND (`guid` IN (10011, 100156, 100157, 100158, 100159, 100499, 100500, 100501, 100502, 100503, 100505, 100506, 10107, 1074, 10764, 10807, 10880, 10968, 11824, 121573, 121574, 121575, 12634, 13449, 13770, 14131, 150145, 150736, 150737, 150738, 150739, 150740, 150741, 150742, 150743, 150744, 150745, 150746, 150747, 150748, 150749, 150750, 150751, 150752, 150753, 150754, 150755, 151207, 151239, 1564, 15724, 15753, 15760, 1620, 16565, 17022, 17101, 17424, 17473, 20420, 20426, 20492, 20534, 21722, 21723, 22398, 22851, 22852, 22853, 22854, 22855, 22856, 22857, 22858, 22859, 22871, 23173, 23802, 23859, 23861, 23862, 23900, 23953, 23954, 23955, 23990, 24053, 24717, 24718, 24719, 25004, 25034, 25035, 25036, 25037, 25038, 25039, 25040, 25041, 25046, 25047, 25341, 25454, 25833, 25969, 26175, 26176, 26387, 26463, 26784, 268682, 268683, 27147, 27845, 29365, 30400, 30852, 32101, 32537, 32540, 33370, 42497, 42900, 42913, 44775, 45603, 46048, 46054, 47458, 47593, 47829, 48037, 48629, 48827, 48996, 49429, 49531, 49532, 49832, 49947, 50044, 516, 52, 55701, 55927, 55966, 55975, 56563, 56726, 56975, 57535, 57604, 57696, 58222, 59045, 59093, 59214, 59314, 59451, 59543, 59565, 59746, 60040, 60041, 60074, 60111, 60214, 60310, 60320, 60433, 60436, 60445, 60454, 60469, 60479, 60509, 60519, 60545, 60554, 60563, 60576, 60591, 60953, 61662, 61819, 62014, 62980, 63134, 66065, 66357, 66633, 7555, 7574, 7597, 866, 92053));
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES
(10011, 163645, 0, 0, 0, 1, 1, -12387.638671875, 145.8055572509765625, 2.519112110137939453, 4.677483558654785156, 0, 0, -0.71933937072753906, 0.694658815860748291, 120, 255, 1, "", 50172, NULL),
(100156, 195603, 0, 0, 0, 1, 1, -8815.1689453125, 652.92669677734375, 94.89659881591796875, 4.878195762634277343, 0, 0, -0.64612388610839843, 0.763232588768005371, 120, 255, 1, "", 48632, NULL),
(100157, 195604, 0, 0, 0, 1, 1, -8861.4970703125, 636.744384765625, 96.17852783203125, 1.911133170127868652, 0, 0, 0.816640853881835937, 0.577146172523498535, 120, 255, 1, "", 48632, NULL),
(100158, 195614, 0, 0, 0, 1, 1, -8811.2802734375, 838.16448974609375, 99.0288238525390625, 6.161012649536132812, 0, 0, -0.06104850769042968, 0.998134791851043701, 120, 255, 1, "", 49345, NULL),
(100159, 195615, 0, 0, 0, 1, 1, -8826.5341796875, 725.575927734375, 98.67694091796875, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, "", 49345, NULL),
(100499, 195624, 0, 0, 0, 1, 1, 1483.6412353515625, 187.9666748046875, -62.2915382385253906, 5.10445404052734375, 0, 0, -0.55583381652832031, 0.831293404102325439, 120, 255, 1, "", 50063, NULL),
(100500, 195626, 0, 0, 0, 1, 1, 1547.329833984375, 276.82818603515625, -62.2802848815917968, 4.656640529632568359, 0, 0, -0.72653961181640625, 0.687124609947204589, 120, 255, 1, "", 49345, NULL),
(100501, 195628, 0, 0, 0, 1, 1, 1644.317626953125, 204.032501220703125, -62.2799644470214843, 6.13532114028930664, 0, 0, -0.07386493682861328, 0.997268259525299072, 120, 255, 1, "", 49345, NULL),
(100502, 195627, 0, 0, 0, 1, 1, 1644.8427734375, 276.180145263671875, -62.2799034118652343, 0.828394830226898193, 0, 0, 0.402455329895019531, 0.9154396653175354, 120, 255, 1, "", 49345, NULL),
(100503, 195625, 0, 0, 0, 1, 1, 1547.062255859375, 204.549346923828125, -62.2807502746582031, 0.776035070419311523, 0, 0, 0.378354072570800781, 0.925660967826843261, 120, 255, 1, "", 49345, NULL),
(100505, 195618, 0, 0, 0, 1, 1, -8572.3623046875, 552.68365478515625, 102.003875732421875, 3.665196180343627929, 0, 0, -0.96592521667480468, 0.258821308612823486, 120, 255, 1, "", 48632, NULL),
(100506, 195610, 0, 0, 0, 1, 1, -9003.4990234375, 860.5499267578125, 105.8765716552734375, 5.07018136978149414, 0, 0, -0.56999683380126953, 0.821646869182586669, 120, 255, 1, "", 49345, NULL),
(10107, 173221, 1, 0, 0, 1, 1, 1615.583740234375, -4391.6015625, 10.33495712280273437, 3.94444584846496582, 0, 0, -0.92050457000732421, 0.3907318115234375, 120, 255, 1, "", 47720, NULL),
(1074, 142102, 0, 0, 0, 1, 1, -5603.5869140625, -513.78125, 401.569244384765625, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 48632, NULL),
(10764, 144126, 0, 0, 0, 1, 1, -14417.3662109375, 517.03448486328125, 5.013153076171875, 2.504543066024780273, 0, 0, 0.949698448181152343, 0.313165903091430664, 120, 255, 1, "", 50063, NULL),
(10807, 144127, 0, 0, 0, 1, 1, -14461.9619140625, 480.032073974609375, 26.86115264892578125, 2.408554315567016601, 0, 0, 0.933580398559570312, 0.358368009328842163, 120, 255, 1, "", 50063, NULL),
(10880, 163313, 0, 0, 0, 1, 1, -6673.94775390625, -2174.3525390625, 244.159881591796875, 2.539447784423828125, 0, 0, 0.955018997192382812, 0.296544641256332397, 120, 255, 1, "", 48632, NULL),
(10968, 173047, 1, 0, 0, 1, 1, 1894.966064453125, -4553.87548828125, 29.38039779663085937, 2.155482053756713867, 0, 0, 0.880890846252441406, 0.473319470882415771, 120, 255, 1, "", 47720, NULL),
(11824, 142103, 0, 0, 0, 1, 1, -5365.62255859375, -2954.108154296875, 323.754547119140625, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 120, 255, 1, "", 48632, NULL),
(121573, 195528, 1, 0, 0, 1, 1, 9734.6376953125, 2253.09033203125, 1327.3465576171875, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 50172, NULL),
(121574, 195529, 1, 0, 0, 1, 1, 9850.2236328125, 2307.10595703125, 1318.53759765625, 1.553341388702392578, 0, 0, 0.700908660888671875, 0.713251054286956787, 120, 255, 1, "", 48632, NULL),
(121575, 195530, 1, 0, 0, 1, 1, 9916.2939453125, 2348.201416015625, 1330.6988525390625, 3.185266733169555664, 0, 0, -0.99976158142089843, 0.021835235878825187, 120, 255, 1, "", 48632, NULL),
(12634, 164618, 0, 0, 0, 1, 1, -10995.859375, -3387.513916015625, 62.11632156372070312, 3.010695457458496093, 0, 0, 0.997859001159667968, 0.065401896834373474, 120, 255, 1, "", 50063, NULL),
(13449, 143982, 1, 0, 0, 1, 1, -443.692169189453125, -2649.07861328125, 95.77381134033203125, 0.226890549063682556, 0, 0, 0.113202095031738281, 0.993571996688842773, 120, 255, 1, "", 49345, NULL),
(13770, 142094, 0, 0, 0, 1, 1, -3793.975830078125, -838.58160400390625, 9.54323577880859375, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 50063, NULL),
(14131, 142089, 0, 0, 0, 1, 1, -10546.4755859375, -1157.3211669921875, 27.78338050842285156, 3.23760390281677246, 0, 0, -0.99884796142578125, 0.047987140715122222, 120, 255, 1, "", 50063, NULL),
(150145, 188241, 571, 0, 0, 1, 1, 4600.57470703125, -4235.314453125, 178.6544036865234375, 2.024578809738159179, 0, 0, 0.848047256469726562, 0.529920578002929687, 120, 255, 1, "", 50664, NULL),
(150736, 195467, 0, 0, 0, 1, 1, -8291.4892578125, 1196.079833984375, 5.59665679931640625, 1.605701684951782226, 0, 0, 0.719339370727539062, 0.694658815860748291, 120, 255, 1, "", 50664, NULL),
(150737, 195606, 0, 0, 0, 1, 1, -8744.5751953125, 407.27215576171875, 98.20717620849609375, 3.412121534347534179, 0, 0, -0.99086570739746093, 0.134852290153503417, 120, 255, 1, "", 50063, NULL),
(150738, 195607, 0, 0, 0, 1, 1, -8424.0458984375, 599.5169677734375, 94.69469451904296875, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 48632, NULL),
(150739, 195608, 0, 0, 0, 1, 1, -8797.541015625, 463.5186767578125, 95.81647491455078125, 4.319690704345703125, 0, 0, -0.83146953582763671, 0.555570363998413085, 120, 255, 1, "", 48632, NULL),
(150740, 195609, 0, 0, 0, 1, 1, -8662.744140625, 774.28955078125, 97.01007080078125, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, "", 49345, NULL),
(150741, 195611, 0, 0, 0, 1, 1, -8712.9296875, 1013.33984375, 96.36161041259765625, 3.874636650085449218, 0, 0, -0.9335794448852539, 0.358370482921600341, 120, 255, 1, "", 50664, NULL),
(150742, 195612, 0, 0, 0, 1, 1, -8620.947265625, 929.647216796875, 99.51955413818359375, 3.865906238555908203, 0, 0, -0.9351348876953125, 0.354291886091232299, 120, 255, 1, "", 50250, NULL),
(150743, 195613, 0, 0, 0, 1, 1, -8393.654296875, 1064.357177734375, 31.63024139404296875, 3.089183330535888671, 0, 0, 0.99965667724609375, 0.026201646775007247, 120, 255, 1, "", 50664, NULL),
(150744, 195616, 0, 0, 0, 1, 1, -8724.318359375, 773.5013427734375, 98.50853729248046875, 2.556905269622802734, 0, 0, 0.957571029663085937, 0.288197338581085205, 120, 255, 1, "", 49345, NULL),
(150745, 195617, 0, 0, 0, 1, 1, -8581.619140625, 669.0135498046875, 97.92009735107421875, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 120, 255, 1, "", 49345, NULL),
(150746, 195619, 0, 0, 0, 1, 1, -8498.1767578125, 654.275634765625, 100.52685546875, 2.72271275520324707, 0, 0, 0.978147506713867187, 0.207912087440490722, 120, 255, 1, "", 48632, NULL),
(150747, 195554, 1, 0, 0, 1, 1, 1657.8717041015625, -4433.03076171875, 17.48180389404296875, 5.585053920745849609, 0, 0, -0.34202003479003906, 0.939692676067352294, 120, 255, 1, "", 47720, NULL),
(150748, 195555, 1, 0, 0, 1, 1, 1574.0245361328125, -4215.53369140625, 45.16959762573242187, 4.049163341522216796, 0, 0, -0.89879417419433593, 0.438370853662490844, 120, 255, 1, "", 49345, NULL),
(150749, 195556, 1, 0, 0, 1, 1, 2076.423828125, -4824.20556640625, 23.66915321350097656, 4.956734657287597656, 0, 0, -0.61566162109375, 0.788010656833648681, 120, 255, 1, "", 50063, NULL),
(150750, 195557, 1, 0, 0, 1, 1, 1919.0592041015625, -4359.271484375, 20.73931694030761718, 3.848456144332885742, 0, 0, -0.93819046020507812, 0.346119433641433715, 120, 255, 1, "", 47720, NULL),
(150751, 195558, 1, 0, 0, 1, 1, 1720.126953125, -4406.9765625, 35.84055709838867187, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 120, 255, 1, "", 47720, NULL),
(150752, 195559, 1, 0, 0, 1, 1, 1754.653076171875, -4534.02685546875, 29.03590202331542968, 4.817109584808349609, 0, 0, -0.66913032531738281, 0.74314504861831665, 120, 255, 1, "", 47720, NULL),
(150753, 195560, 1, 0, 0, 1, 1, 1768.001953125, -4320.849609375, 6.551733016967773437, 4.40695810317993164, 0, 0, -0.80644416809082031, 0.59131026268005371, 120, 255, 1, "", 47720, NULL),
(150754, 195561, 1, 0, 0, 1, 1, 1834.3509521484375, -4407.33740234375, 5.340616226196289062, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 47720, NULL),
(150755, 195562, 1, 0, 0, 1, 1, 1607.486328125, -4374.2578125, 9.76903533935546875, 3.28996133804321289, 0, 0, -0.99724960327148437, 0.074116282165050506, 120, 255, 1, "", 47720, NULL),
(151207, 186506, 571, 0, 0, 1, 1, 2476.552001953125, -5075.70654296875, 282.771820068359375, 2.993224143981933593, 0, 0, 0.997249603271484375, 0.074116282165050506, 120, 255, 1, "", 51739, NULL),
(151239, 195468, 0, 0, 0, 1, 1, -8565.5244140625, 1195.4947509765625, 5.44072580337524414, 1.527163028717041015, 0, 0, 0.6915130615234375, 0.722363948822021484, 120, 255, 1, "", 50250, NULL),
(1564, 32349, 0, 0, 0, 1, 1, -4845.779296875, -879.300537109375, 501.614166259765625, 1.649333357810974121, 0, 0, 0.73432159423828125, 0.678801715373992919, 120, 255, 1, "", 48632, NULL),
(15724, 153578, 1, 0, 0, 1, 1, -2351.58251953125, -1944.7510986328125, 95.791107177734375, 0.427604883909225463, 0, 0, 0.212177276611328125, 0.977231204509735107, 120, 255, 1, "", 50172, NULL),
(15753, 144125, 1, 0, 0, 1, 1, -1035.10791015625, -3676.033447265625, 23.06699752807617187, 2.871063947677612304, 0, 0, 0.990865707397460937, 0.134852290153503417, 120, 255, 1, "", 49345, NULL),
(15760, 164840, 0, 0, 0, 1, 1, -927.87872314453125, -3525.539306640625, 70.87708282470703125, 1.553341388702392578, 0, 0, 0.700908660888671875, 0.713251054286956787, 120, 255, 1, "", 48632, NULL),
(1620, 143981, 1, 0, 0, 1, 1, 322.408050537109375, -4706.90087890625, 14.68337535858154296, 1.038469314575195312, 0, 0, 0.4962158203125, 0.86819922924041748, 120, 255, 1, "", 48632, NULL),
(16565, 144179, 90, 0, 0, 1, 1, -547.90301513671875, 167.2587890625, -193.804351806640625, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 7200, 255, 1, "", 52237, NULL),
(17022, 143988, 0, 0, 0, 1, 1, -20.3935012817382812, -929.42156982421875, 55.46469497680664062, 2.644171714782714843, 0, 0, 0.96923065185546875, 0.246154293417930603, 120, 255, 1, "", 50063, NULL),
(17101, 176324, 1, 0, 0, 1, 1, -5464.3681640625, -2450.802001953125, 89.24736785888671875, 3.516837835311889648, 0, 0, -0.98245048522949218, 0.186523601412773132, 120, 255, 1, "", 49345, NULL),
(17424, 143987, 0, 0, 0, 1, 1, -852.20269775390625, -546.710205078125, 10.93239021301269531, 4.738570213317871093, 0, 0, -0.69779014587402343, 0.716302275657653808, 120, 255, 1, "", 50063, NULL),
(17473, 144112, 1, 0, 0, 1, 1, -7154.40087890625, -3829.517822265625, 8.750293731689453125, 4.223697185516357421, 0, 0, -0.85716724395751953, 0.515038192272186279, 120, 255, 1, "", 49345, NULL),
(20420, 143984, 1, 0, 0, 1, 1, -2338.213623046875, -367.14251708984375, -8.52861213684082031, 2.67034769058227539, 0, 0, 0.972369194030761718, 0.233448356389999389, 120, 255, 1, "", 48632, NULL),
(20426, 143985, 1, 0, 0, 1, 1, -1263.310791015625, 44.54513931274414062, 127.5445709228515625, 4.729844093322753906, 0, 0, -0.70090866088867187, 0.713251054286956787, 120, 255, 1, "", 48632, NULL),
(20492, 182950, 530, 0, 0, 1, 1, -2046.0069580078125, -11876.2236328125, 46.57349014282226562, 2.818698406219482421, 0, 0, 0.986995697021484375, 0.160746723413467407, 120, 255, 1, "", 50063, NULL),
(20534, 183042, 530, 0, 0, 1, 1, 288.03472900390625, 6082.4990234375, 131.550689697265625, 2.923415660858154296, 0, 0, 0.994055747985839843, 0.108872212469577789, 120, 255, 1, "", 49345, NULL),
(21722, 181380, 530, 0, 0, 1, 1, -706.5538330078125, 2700.935791015625, 94.53797149658203125, 1.494295954704284667, 0, 0, 0.679549217224121093, 0.733629941940307617, 120, 255, 1, "", 49345, NULL),
(21723, 181381, 530, 0, 0, 1, 1, 172.7256927490234375, 2623.0556640625, 86.83609771728515625, 3.569828033447265625, 0, 0, -0.97716426849365234, 0.212485253810882568, 120, 255, 1, "", 50063, NULL),
(22398, 181980, 530, 0, 0, 1, 1, 8719.9267578125, -6665.38916015625, 70.2157440185546875, 2.757623195648193359, 0, 0, 0.981627464294433593, 0.190807580947875976, 120, 255, 1, "", 50664, NULL),
(22851, 182356, 530, 0, 0, 1, 1, 9548.134765625, -7263.0068359375, 14.11757087707519531, 4.694939613342285156, 0, 0, -0.71324920654296875, 0.700910508632659912, 120, 255, 1, "", 48632, NULL),
(22852, 182357, 530, 0, 0, 1, 1, 9515.6630859375, -7262.47216796875, 14.19133853912353515, 4.729841232299804687, 0, 0, -0.70090961456298828, 0.71325010061264038, 120, 255, 1, "", 48632, NULL),
(22853, 182359, 530, 0, 0, 1, 1, 9500.134765625, -6842.25, 16.40702056884765625, 1.754055619239807128, 0, 0, 0.768841743469238281, 0.639439105987548828, 120, 255, 1, "", 48632, NULL),
(22854, 182360, 530, 0, 0, 1, 1, 9624.4814453125, -7404.205078125, 13.62501907348632812, 4.712389945983886718, 0, 0, -0.70710659027099609, 0.707106947898864746, 120, 255, 1, "", 49345, NULL),
(22855, 182361, 530, 0, 0, 1, 1, 9743.9580078125, -7466.10400390625, 13.5187997817993164, 3.865906238555908203, 0, 0, -0.9351348876953125, 0.354291886091232299, 120, 255, 1, "", 49345, NULL),
(22856, 182362, 530, 0, 0, 1, 1, 9651.7392578125, -7403.69091796875, 13.62811183929443359, 4.694933891296386718, 0, 0, -0.71325111389160156, 0.700908601284027099, 120, 255, 1, "", 48632, NULL),
(22857, 182363, 530, 0, 0, 1, 1, 9918.849609375, -7226.41162109375, 30.73390007019042968, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 120, 255, 1, "", 48632, NULL),
(22858, 182364, 530, 0, 0, 1, 1, 9709.3564453125, -7308.94091796875, 24.71313285827636718, 2.556905269622802734, 0, 0, 0.957571029663085937, 0.288197338581085205, 120, 255, 1, "", 48632, NULL),
(22859, 182365, 530, 0, 0, 1, 1, 9804.517578125, -7400.15283203125, 13.62031078338623046, 0.008724239654839038, 0, 0, 0.004362106323242187, 0.999990463256835937, 120, 255, 1, "", 49345, NULL),
(22871, 182391, 530, 0, 0, 1, 1, -1267.7100830078125, 7175.015625, 57.30986785888671875, 0.89884275197982788, 0, 0, 0.434444427490234375, 0.900698602199554443, 120, 255, 1, "", 50063, NULL),
(23173, 182567, 530, 0, 0, 1, 1, 258.90972900390625, 7870.71728515625, 23.01399421691894531, 5.034697532653808593, 0, 0, -0.58448410034179687, 0.811405181884765625, 120, 255, 1, "", 49345, NULL),
(23802, 182939, 530, 0, 0, 1, 1, -2929.392333984375, 4008.915771484375, -1.38916504383087158, 3.673924207687377929, 0, 0, -0.96478652954101562, 0.263034075498580932, 120, 255, 1, "", 49345, NULL),
(23859, 182946, 530, 0, 0, 1, 1, -2985.4775390625, 2567.935791015625, 76.5433502197265625, 4.267611980438232421, 0, 0, -0.84565258026123046, 0.533733725547790527, 120, 255, 1, "", 50063, NULL),
(23861, 182948, 530, 0, 0, 1, 1, -4147.99462890625, -12490.40625, 44.31752777099609375, 3.682650327682495117, 0, 0, -0.96362972259521484, 0.26724100112915039, 120, 255, 1, "", 48632, NULL),
(23862, 182949, 530, 0, 0, 1, 1, -4055.44091796875, -11904.59765625, -1.986083984375, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, "", 48632, NULL),
(23900, 182955, 530, 0, 0, 1, 1, -2673.138916015625, 7288.91845703125, 36.85296630859375, 4.310963630676269531, -0.05280876159667968, 0.111169815063476562, -0.8263702392578125, 0.549513161182403564, 120, 255, 1, "", 50063, NULL),
(23953, 183037, 530, 0, 0, 1, 1, -596.53125, 4151.74853515625, 65.4322357177734375, 4.956737518310546875, 0.000751972198486328, -0.00612449645996093, -0.61563396453857421, 0.788008093833923339, 120, 255, 1, "", 50664, NULL),
(23954, 183038, 530, 0, 0, 1, 1, 195.2725677490234375, 4326.39404296875, 116.8954010009765625, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 49345, NULL),
(23955, 183040, 530, 0, 0, 1, 1, 1029.8680419921875, 7362.12939453125, 36.40353775024414062, 2.015855789184570312, 0, 0, 0.845727920532226562, 0.533614337444305419, 120, 255, 1, "", 50664, NULL),
(23990, 183047, 530, 0, 0, 1, 1, 4122.46875, 3057.693603515625, 339.356781005859375, 1.946041464805603027, 0, 0, 0.826589584350585937, 0.56280517578125, 120, 255, 1, "", 50664, NULL),
(24053, 183167, 530, 0, 0, 1, 1, -2615.288330078125, 4417.97119140625, 35.98839187622070312, 1.370081901550292968, 0, 0, 0.632704734802246093, 0.774393141269683837, 120, 255, 1, "", 50063, NULL),
(24717, 183856, 530, 0, 0, 1, 1, -3975.03759765625, -11700.0205078125, -139.257614135742187, 3.141570329666137695, -0.00587272644042968, -0.0018930435180664, 0.999980926513671875, 0, 120, 255, 1, "", 48632, NULL),
(24718, 183857, 530, 0, 0, 1, 1, -3913.078369140625, -11605.9912109375, -138.353134155273437, 4.473990917205810546, 0.005786895751953125, -0.00214099884033203, -0.78617191314697265, 0.617977082729339599, 120, 255, 1, "", 48632, NULL),
(24719, 183858, 530, 0, 0, 1, 1, -3803.274169921875, -11688.873046875, -105.384963989257812, 2.956346750259399414, -0.00567293167114257, -0.0024271011352539, 0.995696067810058593, 0.092472918331623077, 120, 255, 1, "", 48632, NULL),
(25004, 184085, 530, 0, 0, 1, 1, 3056.501708984375, 3687.03466796875, 142.7493133544921875, 3.735011100769042968, -0.00874757766723632, -0.07558345794677734, -0.95290660858154296, 0.293563634157180786, 120, 255, 1, "", 50063, NULL),
(25034, 184133, 530, 0, 0, 1, 1, -2175.96533203125, 5411.55126953125, 50.22069168090820312, 3.586656570434570312, 0, 0, -0.975341796875, 0.220699742436408996, 120, 255, 1, "", 49345, NULL),
(25035, 184134, 530, 0, 0, 1, 1, -1887.6666259765625, 5769.12060546875, 129.5399017333984375, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, "", 50063, NULL),
(25036, 184135, 530, 0, 0, 1, 1, -2034.0867919921875, 5336.11279296875, -9.37981128692626953, 3.70009779930114746, 0, 0, -0.96126174926757812, 0.275637149810791015, 120, 255, 1, "", 49345, NULL),
(25037, 184136, 530, 0, 0, 1, 1, -2041.19970703125, 5350.26123046875, -9.38034439086914062, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, "", 49345, NULL),
(25038, 184137, 530, 0, 0, 1, 1, -1694.7603759765625, 5522.42529296875, -9.81281185150146484, 3.752462387084960937, 0, 0, -0.95371627807617187, 0.300707906484603881, 120, 255, 1, "", 49345, NULL),
(25039, 184138, 530, 0, 0, 1, 1, -1687.7864990234375, 5508.5224609375, -9.80751228332519531, 3.447027206420898437, 0, 0, -0.98836135864257812, 0.152124300599098205, 120, 255, 1, "", 49345, NULL),
(25040, 184139, 530, 0, 0, 1, 1, -1897.9478759765625, 5158.58056640625, -40.2316780090332031, 3.874636650085449218, 0, 0, -0.9335794448852539, 0.358370482921600341, 120, 255, 1, "", 49345, NULL),
(25041, 184140, 530, 0, 0, 1, 1, -1773.6771240234375, 5171.82470703125, -40.2134323120117187, 2.242745637893676757, 0, 0, 0.900697708129882812, 0.434446364641189575, 120, 255, 1, "", 49345, NULL),
(25046, 184147, 530, 0, 0, 1, 1, 2083.6494140625, 6879.58154296875, 180.3868408203125, 3.926990509033203125, 0, 0, -0.92387962341308593, 0.382683247327804565, 120, 255, 1, "", 50063, NULL),
(25047, 184148, 530, 0, 0, 1, 1, 2392.8525390625, 5987.0625, 151.738525390625, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 50063, NULL),
(25341, 184490, 530, 0, 0, 1, 1, -3009.2431640625, 850.86981201171875, -10.5309038162231445, 3.656470775604248046, -0.01951789855957031, -0.04571723937988281, -0.96554374694824218, 0.255449146032333374, 120, 255, 1, "", 50664, NULL),
(25454, 184652, 530, 0, 0, 1, 1, -4055.28125, 2177.048583984375, 110.3008880615234375, 4.703663349151611328, 0, 0, -0.71018505096435546, 0.704015016555786132, 120, 255, 1, "", 50063, NULL),
(25833, 184944, 530, 0, 0, 1, 1, 1935.921875, 5544.75146484375, 266.741851806640625, 5.201082706451416015, 0, 0, -0.51503753662109375, 0.857167601585388183, 120, 255, 1, "", 50664, NULL),
(25969, 185102, 530, 0, 0, 1, 1, -4081.75341796875, 1132.140625, 43.03768539428710937, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 120, 255, 1, "", 50664, NULL),
(26175, 185472, 530, 0, 0, 1, 1, 9720.4638671875, -7199.421875, 14.22868156433105468, 5.113816738128662109, 0, 0, -0.55193614959716796, 0.833886384963989257, 120, 255, 1, "", 48632, NULL),
(26176, 185473, 530, 0, 0, 1, 1, 9657.6630859375, -7116.189453125, 14.28754901885986328, 4.27606058120727539, 0, 0, -0.84339046478271484, 0.537301182746887207, 120, 255, 1, "", 51943, NULL),
(26387, 144131, 0, 0, 0, 1, 1, -8876.982421875, 652.0072021484375, 95.9927215576171875, 5.07018136978149414, 0, 0, -0.56999683380126953, 0.821646869182586669, 120, 255, 1, "", 48632, NULL),
(26463, 144128, 0, 0, 0, 1, 1, -8637.4794921875, 427.74847412109375, 102.0831451416015625, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, "", 50063, NULL),
(26784, 142075, 0, 0, 0, 1, 1, -9455.9892578125, 45.82291793823242187, 56.43953323364257812, 1.404989838600158691, 0, 0, 0.646123886108398437, 0.763232588768005371, 120, 255, 1, "", 48632, NULL),
(268682, 177044, 0, 0, 0, 1, 1, 1633.0244140625, 219.280609130859375, -43.1118049621582031, 1.082102894783020019, 0, 0, 0.51503753662109375, 0.857167601585388183, 120, 255, 1, "", 49345, NULL),
(268683, 195629, 0, 0, 0, 1, 1, 1554.9732666015625, 235.1077728271484375, -43.2009544372558593, 0.252435922622680664, 0, 0, 0.125883102416992187, 0.992045104503631591, 120, 255, 1, "", 49345, NULL),
(27147, 181883, 530, 0, 0, 1, 1, 7579.02001953125, -6860.11962890625, 93.34931182861328125, 4.328416347503662109, 0, 0, -0.82903766632080078, 0.559192776679992675, 120, 255, 1, "", 48632, NULL),
(27845, 187113, 530, 0, 0, 1, 1, 12792.7744140625, -6965.97802734375, 15.40067386627197265, 2.251473426818847656, 0, 0, 0.902585029602050781, 0.430511653423309326, 120, 255, 1, "", 50063, NULL),
(29365, 157637, 0, 0, 0, 1, 1, -10464.0439453125, -3265.2587890625, 20.17782783508300781, 1.396264195442199707, 0, 0, 0.642787933349609375, 0.766044199466705322, 120, 255, 1, "", 50063, NULL),
(30400, 183039, 530, 0, 0, 1, 1, -198.708328247070312, 5507.98681640625, 22.26667213439941406, 3.43830275535583496, 0, 0, -0.98901557922363281, 0.147811368107795715, 120, 255, 1, "", 51943, NULL),
(30852, 185477, 530, 0, 0, 1, 1, 3019.47314453125, 5450.02099609375, 146.65374755859375, 3.307402372360229492, 0.033659934997558593, -0.03657913208007812, -0.99543190002441406, 0.081512629985809326, 120, 255, 1, "", 50664, NULL),
(32101, 153716, 0, 0, 0, 1, 1, -10644.5146484375, 1158.03759765625, 33.13823318481445312, 2.556905269622802734, 0, 0, 0.957571029663085937, 0.288197338581085205, 120, 255, 1, "", 49345, NULL),
(32537, 179896, 1, 0, 0, 1, 1, -1609.19970703125, 3118.862060546875, 44.829315185546875, 3.892086982727050781, 0, 0, -0.93041706085205078, 0.366502493619918823, 120, 255, 1, "", 50063, NULL),
(32540, 176319, 1, 0, 0, 1, 1, 248.11822509765625, 1291.649658203125, 190.39178466796875, 3.420850038528442382, 0, 0, -0.99026775360107421, 0.139175355434417724, 120, 255, 1, "", 50063, NULL),
(33370, 143989, 0, 0, 0, 1, 1, 503.972320556640625, 1626.9268798828125, 125.6075973510742187, 4.703663349151611328, 0, 0, -0.71018505096435546, 0.704015016555786132, 120, 255, 1, "", 50063, NULL),
(42497, 142093, 0, 0, 0, 1, 1, -9248.4130859375, -2144.225830078125, 63.9334259033203125, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 50063, NULL),
(42900, 144130, 0, 0, 0, 1, 1, -8797.42578125, 1083.4786376953125, 90.20792388916015625, 5.436702728271484375, 0, 0, -0.41071796417236328, 0.911762416362762451, 120, 255, 1, "", 50664, NULL),
(42913, 144129, 0, 0, 0, 1, 1, -9035.40625, 844.06689453125, 106.9599990844726562, 0.436331570148468017, 0, 0, 0.216439247131347656, 0.976296067237854003, 120, 255, 1, "", 49345, NULL),
(44775, 143990, 0, 0, 0, 1, 1, 2238.5625, 254.50347900390625, 34.00535964965820312, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 120, 255, 1, "", 47720, NULL),
(45603, 181236, 0, 0, 0, 1, 1, 2289.5556640625, -5318.34716796875, 88.64002227783203125, 2.357861518859863281, 0, 0, 0.924198150634765625, 0.381913274526596069, 120, 255, 1, "", 48632, NULL),
(46048, 144011, 0, 0, 0, 1, 1, 293.6279296875, -2115.567626953125, 121.7698822021484375, 3.316144466400146484, 0, 0, -0.99619388580322265, 0.087165042757987976, 120, 255, 1, "", 50063, NULL),
(46054, 179895, 0, 0, 0, 1, 1, -599.54339599609375, -4610.392578125, 9.731907844543457031, 5.834193229675292968, 0, 0, -0.22261524200439453, 0.974906384944915771, 120, 255, 1, "", 48632, NULL),
(47458, 143983, 1, 0, 0, 1, 1, 925.94085693359375, 901.49163818359375, 104.9693069458007812, 1.256635904312133789, 0, 0, 0.587784767150878906, 0.809017360210418701, 120, 255, 1, "", 50063, NULL),
(47593, 181639, 1, 0, 0, 1, 1, 2681.9345703125, 1487.064697265625, 233.9166412353515625, 4.803250312805175781, 0, 0, -0.67426395416259765, 0.738490462303161621, 120, 255, 1, "", 50664, NULL),
(47829, 142117, 1, 0, 0, 1, 1, 2742.4716796875, -395.14398193359375, 108.8573837280273437, 2.775068521499633789, 0, 0, 0.983254432678222656, 0.182238012552261352, 120, 255, 1, "", 50063, NULL),
(48037, 178864, 1, 0, 0, 1, 1, 2332.56298828125, -2545.971923828125, 101.6266632080078125, 3.935721635818481445, 0, 0, -0.92220020294189453, 0.386712819337844848, 120, 255, 1, "", 49345, NULL),
(48629, 142111, 1, 0, 0, 1, 1, 6423.6181640625, 497.105377197265625, 7.670820236206054687, 2.801248550415039062, 0, 0, 0.985555648803710937, 0.169351965188980102, 120, 255, 1, "", 48632, NULL),
(48827, 187260, 1, 0, 0, 1, 1, 5103.54150390625, -360.51910400390625, 357.0400390625, 3.490667104721069335, 0, 0, -0.98480701446533203, 0.173652306199073791, 120, 255, 1, "", 51943, NULL),
(48996, 176404, 1, 0, 0, 1, 1, 6705.10498046875, -4667.3505859375, 721.59991455078125, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 49345, NULL),
(49429, 180451, 1, 0, 0, 1, 1, -6840.3046875, 734.941650390625, 42.1886749267578125, 1.27409064769744873, 0, 0, 0.594822883605957031, 0.80385679006576538, 120, 255, 1, "", 50063, NULL),
(49531, 142109, 1, 0, 0, 1, 1, 9848.27734375, 957.2960205078125, 1306.790283203125, 3.481936931610107421, 0, 0, -0.98555564880371093, 0.169351965188980102, 120, 255, 1, "", 48632, NULL),
(49532, 142110, 1, 0, 0, 1, 1, 9942.998046875, 2497.741455078125, 1317.6929931640625, 3.630291461944580078, 0, 0, -0.97029495239257812, 0.241925001144409179, 120, 255, 1, "", 48632, NULL),
(49832, 188123, 1, 0, 0, 1, 1, 10122.1181640625, 2227.40283203125, 1328.18701171875, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 255, 1, "", 50172, NULL),
(49947, 142119, 1, 0, 0, 1, 1, -4396.26513671875, 3269.04736328125, 11.92736625671386718, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 50063, NULL),
(50044, 143986, 1, 0, 0, 1, 1, -4405.3681640625, 237.6770782470703125, 26.76781082153320312, 2.286378860473632812, 0, 0, 0.909960746765136718, 0.414694398641586303, 120, 255, 1, "", 50063, NULL),
(516, 171556, 0, 0, 0, 1, 1, -4949.82275390625, -1277.37158203125, 501.583404541015625, 2.530723094940185546, 0, 0, 0.953716278076171875, 0.300707906484603881, 120, 255, 1, "", 48632, NULL),
(52, 171752, 0, 0, 0, 1, 1, -4828.27783203125, -1285.0472412109375, 501.80706787109375, 2.260197162628173828, 0, 0, 0.904454231262207031, 0.426570683717727661, 120, 255, 1, "", 50063, NULL),
(55701, 189969, 571, 0, 0, 1, 1, 2676.614501953125, -4381.533203125, 283.96075439453125, 2.713986396789550781, 0, 0, 0.977231025695800781, 0.212178006768226623, 120, 255, 1, "", 50664, NULL),
(55927, 193043, 571, 0, 0, 1, 1, 5462.18310546875, -2599.90966796875, 306.817169189453125, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 120, 255, 1, "", 50172, NULL),
(55966, 193044, 571, 0, 0, 1, 1, 5417.15478515625, -2620.260498046875, 307.008758544921875, 6.19592142105102539, 0, 0, -0.04361820220947265, 0.999048292636871337, 120, 255, 1, "", 50172, NULL),
(55975, 193045, 571, 0, 0, 1, 1, 5483.01416015625, -2644.76220703125, 307.0357666015625, 6.265731334686279296, 0, 0, -0.00872707366943359, 0.999961912631988525, 120, 255, 1, "", 50172, NULL),
(56563, 191521, 571, 0, 0, 1, 1, 6126.4755859375, -1070.9478759765625, 403.10333251953125, 4.502951622009277343, 0, 0, -0.7771453857421875, 0.629321098327636718, 120, 255, 1, "", 50172, NULL),
(56726, 188710, 571, 0, 0, 1, 1, 442.130218505859375, -4555.77587890625, 245.471466064453125, 3.342307567596435546, 0, 0, -0.99496841430664062, 0.100189015269279479, 120, 255, 1, "", 47720, NULL),
(56975, 193071, 571, 0, 0, 1, 1, 5812.95556640625, 508.35467529296875, 657.38323974609375, 4.677483558654785156, 0, 0, -0.71933937072753906, 0.694658815860748291, 120, 255, 1, "", 48632, NULL),
(57535, 186687, 571, 0, 0, 1, 1, 1887.1007080078125, -6172.91650390625, 23.70248794555664062, 1.073378324508666992, 0, 0, 0.511293411254882812, 0.859406232833862304, 120, 255, 1, "", 50664, NULL),
(57604, 186435, 571, 0, 0, 1, 1, 1419.09033203125, -3265.8125, 165.23553466796875, 2.548179388046264648, 0, 0, 0.956304550170898437, 0.292372345924377441, 120, 255, 1, "", 50664, NULL),
(57696, 188486, 571, 0, 0, 1, 1, 570.65802001953125, -4935.9462890625, 18.43669700622558593, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 120, 255, 1, "", 50664, NULL),
(58222, 188256, 571, 0, 0, 1, 1, 3862.33154296875, -4548.84033203125, 209.4533233642578125, 2.888511419296264648, 0, 0, 0.99200439453125, 0.126203224062919616, 120, 255, 1, "", 50664, NULL),
(59045, 188531, 571, 0, 0, 1, 1, 3225.0634765625, -690.50518798828125, 167.1182403564453125, 0.069813184440135955, 0.004359722137451171, -0.00019073486328125, 0.034900665283203125, 0.999381244182586669, 120, 255, 1, "", 50664, NULL),
(59093, 188534, 571, 0, 0, 1, 1, 3474.537353515625, 2005.07470703125, 64.8327178955078125, 2.391098499298095703, 0, 0, 0.930417060852050781, 0.366502493619918823, 120, 255, 1, "", 49345, NULL),
(59214, 188541, 571, 0, 0, 1, 1, 3400.859130859375, -2811.433349609375, 200.4548797607421875, 4.424411773681640625, 0, 0, -0.80125331878662109, 0.598325252532958984, 120, 255, 1, "", 50172, NULL),
(59314, 187268, 571, 0, 0, 1, 1, 4166.265625, 5286.08349609375, 26.35922050476074218, 0.305430829524993896, 0, 0, 0.15212249755859375, 0.988361656665802001, 120, 255, 1, "", 50664, NULL),
(59451, 194492, 571, 0, 0, 1, 1, 8592.5283203125, 693.717041015625, 547.2921142578125, 2.382372379302978515, 0, 0, 0.928809165954589843, 0.370558410882949829, 120, 255, 1, "", 50172, NULL),
(59543, 189328, 571, 0, 0, 1, 1, 737.453125, -2920.482666015625, 7.280445098876953125, 5.6897735595703125, 0, 0, -0.29237174987792968, 0.956304728984832763, 120, 255, 1, "", 47720, NULL),
(59565, 189329, 571, 0, 0, 1, 1, 4502.22314453125, 5716.38037109375, 81.48361968994140625, 3.307414531707763671, 0, 0, -0.99656486511230468, 0.082815870642662048, 120, 255, 1, "", 47720, NULL),
(59746, 194788, 571, 0, 0, 1, 1, 8452.8173828125, 683.8055419921875, 547.28314208984375, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 255, 1, "", 50172, NULL),
(60040, 187316, 571, 0, 0, 1, 1, 2262.991455078125, 5196.11572265625, 12.07118797302246093, 1.213003993034362792, 0, 0, 0.569996833801269531, 0.821646869182586669, 120, 255, 1, "", 50664, NULL),
(60041, 193972, 571, 0, 0, 1, 1, 8440.736328125, -329.427093505859375, 906.50616455078125, 0.715582847595214843, 0, 0, 0.350206375122070312, 0.936672568321228027, 120, 255, 1, "", 50664, NULL),
(60074, 192952, 571, 0, 0, 1, 1, 5563.18603515625, 5759.63134765625, -75.2276840209960937, 4.712389945983886718, 0, 0, -0.70710659027099609, 0.707106947898864746, 120, 255, 1, "", 49345, NULL),
(60111, 187322, 571, 0, 0, 1, 1, 3458.64404296875, 4132.48876953125, 15.04328441619873046, 1.562069892883300781, 0, 0, 0.704014778137207031, 0.71018528938293457, 120, 255, 1, "", 47720, NULL),
(60214, 188604, 571, 0, 0, 1, 1, 2790.482666015625, 917.82464599609375, 22.41530799865722656, 5.12254190444946289, 0, 0, -0.54829311370849609, 0.83628624677658081, 120, 255, 1, "", 51739, NULL),
(60310, 188355, 571, 0, 0, 1, 1, 3827.8056640625, 1533.657958984375, 89.6991729736328125, 1.640609622001647949, 0, 0, 0.731353759765625, 0.681998312473297119, 120, 255, 1, "", 50172, NULL),
(60320, 194147, 571, 0, 0, 1, 1, 5763.82275390625, 726.92926025390625, 618.58465576171875, 0.087265998125076293, 0, 0, 0.043619155883789062, 0.999048233032226562, 120, 255, 1, "", 48632, NULL),
(60433, 188618, 571, 0, 0, 1, 1, 3240.612060546875, -2236.583251953125, 115.105987548828125, 3.159062385559082031, 0, 0, -0.99996185302734375, 0.008734640665352344, 120, 255, 1, "", 50172, NULL),
(60436, 191946, 571, 0, 0, 1, 1, 5853.01953125, 669.45123291015625, 644.25738525390625, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 120, 255, 1, "", 48632, NULL),
(60445, 191947, 571, 0, 0, 1, 1, 5862.66650390625, 638.68426513671875, 647.15972900390625, 5.916666030883789062, 0, 0, -0.1822357177734375, 0.983254849910736083, 120, 255, 1, "", 48632, NULL),
(60454, 191948, 571, 0, 0, 1, 1, 5917.0400390625, 616.7635498046875, 646.29388427734375, 5.820673465728759765, 0, 0, -0.22920036315917968, 0.973379254341125488, 120, 255, 1, "", 48632, NULL),
(60469, 191949, 571, 0, 0, 1, 1, 5927.66796875, 644.7076416015625, 645.5087890625, 5.986480236053466796, 0, 0, -0.14780902862548828, 0.989015936851501464, 120, 255, 1, "", 48632, NULL),
(60479, 191950, 571, 0, 0, 1, 1, 5893.23486328125, 528.2362060546875, 641.39501953125, 5.017822265625, 0, 0, -0.5913095474243164, 0.806444704532623291, 120, 255, 1, "", 48632, NULL),
(60509, 191951, 571, 0, 0, 1, 1, 5690.9208984375, 681.9393310546875, 646.130859375, 5.742133140563964843, 0, 0, -0.26723861694335937, 0.963630378246307373, 120, 255, 1, "", 48632, NULL),
(60519, 191952, 571, 0, 0, 1, 1, 5740.30419921875, 680.889404296875, 644.65704345703125, 5.785767555236816406, 0, 0, -0.24615287780761718, 0.969231009483337402, 120, 255, 1, "", 48632, NULL),
(60545, 191953, 571, 0, 0, 1, 1, 5734.775390625, 744.04644775390625, 641.73516845703125, 0.881391823291778564, 0, 0, 0.426568984985351562, 0.904455006122589111, 120, 255, 1, "", 48632, NULL),
(60554, 191954, 571, 0, 0, 1, 1, 5743.07763671875, 626.9576416015625, 648.4044189453125, 0.27925160527229309, 0, 0, 0.139172554016113281, 0.990268170833587646, 120, 255, 1, "", 48632, NULL),
(60563, 191955, 571, 0, 0, 1, 1, 5886.2646484375, 716.32843017578125, 640.5423583984375, 0.349065244197845458, 0, 0, 0.173647880554199218, 0.984807789325714111, 120, 255, 1, "", 48632, NULL),
(60576, 191956, 571, 0, 0, 1, 1, 5800.7392578125, 731.10186767578125, 640.4296875, 4.721115589141845703, 0, 0, -0.70401477813720703, 0.71018528938293457, 120, 255, 1, "", 48632, NULL),
(60591, 191957, 571, 0, 0, 1, 1, 5797.9052734375, 558.436279296875, 650.71917724609375, 4.363324165344238281, 0, 0, -0.81915187835693359, 0.573576688766479492, 120, 255, 1, "", 48632, NULL),
(60953, 194016, 571, 0, 0, 1, 1, 6677.02587890625, -202.756942749023437, 951.6678466796875, 5.131268978118896484, 0, 0, -0.54463863372802734, 0.838670849800109863, 120, 255, 1, "", 50664, NULL),
(61662, 191228, 571, 0, 0, 1, 1, 3000.864501953125, 4067.616455078125, 26.89543533325195312, 1.239183306694030761, 0, 0, 0.580702781677246093, 0.814115643501281738, 120, 255, 1, "", 49345, NULL),
(61819, 193791, 571, 0, 0, 1, 1, 7809.5849609375, -2956.826416015625, 1257.4970703125, 0.942478775978088378, 0, 0, 0.453990936279296875, 0.891006350517272949, 120, 255, 1, "", 50664, NULL),
(62014, 193030, 571, 0, 0, 1, 1, 6402.078125, 457.835845947265625, 511.9805908203125, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 120, 255, 1, "", 50172, NULL),
(62980, 194027, 571, 0, 0, 1, 1, 8415.34765625, 2696.229248046875, 655.0931396484375, 1.796540141105651855, 0, 0, 0.782250404357910156, 0.622964143753051757, 120, 255, 1, "", 50664, NULL),
(63134, 191832, 571, 0, 0, 1, 1, 2789.627685546875, 6148.1201171875, 84.58600616455078125, 0.724311470985412597, 0, 0, 0.354290962219238281, 0.935135245323181152, 120, 255, 1, "", 47720, NULL),
(66065, 190914, 609, 0, 0, 1, 1, 2113.5400390625, -5796.0625, 99.71340179443359375, 0.671950221061706542, -0.0012969970703125, 0.0041656494140625, 0.329686164855957031, 0.944080471992492675, 120, 255, 1, "", 50664, NULL),
(66357, 190915, 609, 0, 0, 1, 4, 2113.588623046875, -5796.01904296875, 99.69663238525390625, 3.883359670639038085, 0.014132976531982421, -0.00137233734130859, -0.93194293975830078, 0.362326800823211669, 120, 255, 1, "", 50664, NULL),
(66633, 188682, 571, 0, 0, 1, 1, 3668.736083984375, -703.61456298828125, 214.52703857421875, 4.616398334503173828, -0.00070858001708984, -0.00169086456298828, -0.74021530151367187, 0.672367453575134277, 120, 255, 1, "", 50664, NULL),
(7555, 142095, 1, 0, 0, 1, 1, -3618.420166015625, -4437.94091796875, 13.45739459991455078, 3.141592741012573242, 0, 0, -1, 0, 120, 255, 1, "", 49345, NULL),
(7574, 186629, 1, 0, 0, 1, 1, -3158.546630859375, -2894.1171875, 33.67470169067382812, 2.827429771423339843, 0, 0, 0.987688064575195312, 0.156436234712600708, 120, 255, 1, "", 50172, NULL),
(7597, 186230, 1, 0, 0, 1, 1, -4599.271484375, -3178.7314453125, 34.8251190185546875, 0.078540004789829254, 0, 0, 0.039259910583496093, 0.999229073524475097, 120, 255, 1, "", 50172, NULL),
(866, 171699, 0, 0, 0, 1, 1, -4910.3818359375, -976.211669921875, 501.40789794921875, 2.268925428390502929, 0, 0, 0.906307220458984375, 0.422619491815567016, 120, 255, 1, "", 48632, NULL),
(92053, 195218, 1, 0, 0, 1, 1, 8008.7421875, -2668.053955078125, 512.06414794921875, 2.757613182067871093, 0, 0, 0.981626510620117187, 0.190812408924102783, 120, 255, 1, "", 50664, NULL);
-- new spawns
DELETE FROM `gameobject` WHERE (`id` IN (185965, 188132, 195219, 195605, 195620)) AND (`guid` BETWEEN 929 AND 933);
INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `ScriptName`, `VerifiedBuild`, `Comment`) VALUES
(929, 185965, 530, 0, 0, 1, 1, 2511.02783203125, 7346.34130859375, 380.741790771484375, 3.586656570434570312, 0, 0, -0.975341796875, 0.220699742436408996, 120, 255, 1, "", 52237, NULL),
(930, 188132, 530, 0, 0, 1, 1, 2209.026123046875, 4735.65625, 159.667083740234375, 3.586656570434570312, 0, 0, -0.975341796875, 0.220699742436408996, 120, 255, 1, "", 50664, NULL),
(931, 195219, 1, 0, 0, 1, 1, 7867.26904296875, -2575.546875, 486.91259765625, 3.24634718894958496, 0, 0, -0.99862861633300781, 0.052353221923112869, 120, 255, 1, "", 49345, NULL),
(932, 195605, 0, 0, 0, 1, 1, -8559.0166015625, 457.105499267578125, 104.6490020751953125, 1.946041464805603027, 0, 0, 0.826589584350585937, 0.56280517578125, 120, 255, 1, "", 48632, NULL),
(933, 195620, 0, 0, 0, 1, 1, -8753.294921875, 565.23223876953125, 97.53444671630859375, 2.373644113540649414, 0, 0, 0.927183151245117187, 0.37460830807685852, 120, 255, 1, "", 48632, NULL);
-- remove duplicate / invalid spawns
DELETE FROM `gameobject` WHERE (`id` IN (173221, 177044, 185471)) AND (`guid` IN (31694, 268684, 268687, 268685, 268686, 26174));
DELETE FROM `gameobject_addon` WHERE (`guid` IN (31694, 268684, 268687, 268685, 268686, 26174));
DELETE FROM `game_event_gameobject` WHERE (`guid` IN (31694, 268684, 268687, 268685, 268686, 26174));
@@ -0,0 +1,8 @@
-- DB update 2024_01_01_00 -> 2024_01_01_01
--
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 17683;
DELETE FROM `smart_scripts` WHERE `entryorguid` = 17683 AND `source_type` = 0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(17683, 0, 0, 0, 0, 0, 100, 0, 22650, 46000, 24260, 65400, 0, 0, 11, 744, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Zarakh - In Combat - Cast \'Poison\''),
(17683, 0, 1, 0, 0, 0, 100, 0, 1600, 19790, 17720, 40430, 0, 0, 11, 745, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Zarakh - In Combat - Cast \'Web\'');
@@ -0,0 +1,9 @@
-- DB update 2024_01_01_01 -> 2024_01_01_02
--
UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 17604;
DELETE FROM `smart_scripts` WHERE `entryorguid` = 17604 AND `source_type` = 0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(17604, 0, 0, 0, 26, 0, 100, 1, 0, 10, 0, 1, 0, 0, 11, 31734, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunhawk Spy - In Combat LOS 10 yards - Cast \'31734\' (No Repeat)'),
(17604, 0, 1, 0, 0, 0, 100, 0, 4800, 29700, 16140, 25110, 0, 0, 11, 13730, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunhawk Spy - In Combat - Cast \'Demoralizing Shout\''),
(17604, 0, 2, 0, 0, 0, 100, 0, 6450, 9380, 9700, 21250, 0, 0, 11, 31827, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Sunhawk Spy - In Combat - Cast \'Heroic Strike\'');
@@ -0,0 +1,3 @@
-- DB update 2024_01_01_02 -> 2024_01_01_03
--
UPDATE `creature_model_info` SET `BoundingRadius`=6.315000057220458984, `CombatReach`=6 WHERE `DisplayID`=20739;
@@ -0,0 +1,22 @@
-- DB update 2024_01_01_03 -> 2024_01_01_04
-- Update creature 26188 '[PH] Torch Catching Target Bunny' with sniffed values
-- updated spawns
DELETE FROM `creature` WHERE (`id1` = 26188) AND (`guid` IN (245595, 245600, 245604, 245606, 245610, 245614, 245635, 245640));
INSERT INTO `creature` (`guid`, `id1`, `map`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES
(245595, 26188, 1, 1, 1, 0, 8687.6015625, 971.4619140625, 11.0921945571899414, 3.351032257080078125, 120, 0, 0, 0, 0, 0, "", 50063, 1, NULL),
(245600, 26188, 1, 1, 1, 0, -1026.82470703125, 284.664947509765625, 135.8292694091796875, 5.113814830780029296, 120, 0, 0, 0, 0, 0, "", 50172, 1, NULL),
(245604, 26188, 1, 1, 1, 0, 1930.842041015625, -4341.5693359375, 19.84100914001464843, 5.445427417755126953, 120, 0, 0, 0, 0, 0, "", 50172, 1, NULL),
(245606, 26188, 0, 1, 1, 0, 1826.7586669921875, 254.811309814453125, 59.9133148193359375, 0.680678427219390869, 120, 0, 0, 0, 0, 0, "", 50063, 1, NULL),
(245610, 26188, 0, 1, 1, 0, -4716.79296875, -1203.8480224609375, 501.74273681640625, 3.019419670104980468, 120, 0, 0, 0, 0, 0, "", 50063, 1, NULL),
(245614, 26188, 0, 1, 1, 0, -8814.5283203125, 876.83599853515625, 98.82147216796875, 3.96189737319946289, 120, 0, 0, 0, 0, 0, "", 50063, 1, NULL),
(245635, 26188, 530, 1, 1, 0, 9816.404296875, -7269.10205078125, 26.31508064270019531, 4.485496044158935546, 120, 0, 0, 0, 0, 0, "", 50063, 1, NULL),
(245640, 26188, 530, 1, 1, 0, -3769, -11506.2119140625, -134.381103515625, 3.333578824996948242, 120, 0, 0, 0, 0, 0, "", 50063, 1, NULL);
-- remove duplicate spawns
DELETE FROM `creature` WHERE (`id1` = 26188) AND (`guid` IN (245611, 245609, 245612, 245594, 245615, 245613, 245608, 245607, 245601, 245598, 245599, 245602, 245605, 245603, 245596, 245597, 245639, 245641, 245638, 245636, 245637, 245634));
DELETE FROM `creature_addon` WHERE (`guid` IN (245611, 245609, 245612, 245594, 245615, 245613, 245608, 245607, 245601, 245598, 245599, 245602, 245605, 245603, 245596, 245597, 245639, 245641, 245638, 245636, 245637, 245634));
DELETE FROM `game_event_creature` WHERE (`guid` IN (245611, 245609, 245612, 245594, 245615, 245613, 245608, 245607, 245601, 245598, 245599, 245602, 245605, 245603, 245596, 245597, 245639, 245641, 245638, 245636, 245637, 245634));
-- enable all spawns for eventEntry 1
DELETE FROM `game_event_creature` WHERE (`eventEntry` = 1) AND (`guid` IN (SELECT `guid` FROM `creature` WHERE `id1` = 26188));
INSERT INTO `game_event_creature` (SELECT 1, `guid` FROM `creature` WHERE `id1` = 26188);
@@ -0,0 +1,29 @@
-- DB update 2024_01_01_04 -> 2024_01_01_05
--
DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5046, 5047);
INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
(5046, 'SmartTrigger'),
(5047, 'SmartTrigger');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 5046) AND (`source_type` = 2) AND (`id` IN (0));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(5046, 2, 0, 0, 46, 0, 100, 0, 5046, 0, 0, 0, 0, 0, 134, 52056, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Cast \'Sholazar to Un`goro Teleport\'');
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 5047) AND (`source_type` = 2) AND (`id` IN (0));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(5047, 2, 0, 0, 46, 0, 100, 0, 5047, 0, 0, 0, 0, 0, 134, 52057, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Cast \'Un`goro to Sholazar Teleport\'');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=1 AND `SourceEntry` IN (5046, 5047) AND `SourceId`=2;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 1, 5046, 2, 0, 36, 0, 0, 0, 0, 0, 0, 0, '', 'Player must be alive'),
(22, 1, 5046, 2, 0, 14, 0, 13956, 0, 0, 1, 0, 0, '', 'Cast Teleport to Un\'goro if Meeting a Great One (13956) status is not none.'),
(22, 1, 5046, 2, 1, 36, 0, 0, 0, 0, 0, 0, 0, '', 'Player must be alive'),
(22, 1, 5046, 2, 1, 8, 0, 12613, 0, 0, 0, 0, 0, '', 'Cast Teleport to Un\'goro if The Makers Overlook (12613) has been rewarded.'),
(22, 1, 5046, 2, 1, 8, 0, 12559, 0, 0, 0, 0, 0, '', 'Cast Teleport to Un\'goro if The Makers Perch (12559) has been rewarded.');
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 1, 5047, 2, 0, 36, 0, 0, 0, 0, 0, 0, 0, '', 'Player must be alive'),
(22, 1, 5047, 2, 0, 14, 0, 13956, 0, 0, 1, 0, 0, '', 'Cast Teleport to Sholazar if Meeting a Great One (13956) status is not none.'),
(22, 1, 5047, 2, 1, 36, 0, 0, 0, 0, 0, 0, 0, '', 'Player must be alive'),
(22, 1, 5047, 2, 1, 8, 0, 12613, 0, 0, 0, 0, 0, '', 'Cast Teleport to Sholazar if The Makers Overlook (12613) has been rewarded.'),
(22, 1, 5047, 2, 1, 8, 0, 12559, 0, 0, 0, 0, 0, '', 'Cast Teleport to Sholazar if The Makers Perch (12559) has been rewarded.');
@@ -0,0 +1,49 @@
-- DB update 2024_01_01_05 -> 2024_01_02_00
--
DELETE FROM `waypoints` WHERE `entry` IN (1829800, 1829801);
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `point_comment`) VALUES
(1829800, 1, -2672.9744, 7931.336, -27.176205, NULL, 0, 'Gava\'xi'),
(1829800, 2, -2684.0105, 7918.5903, -31.449396, NULL, 0, 'Gava\'xi'),
(1829800, 3, -2709.6504, 7895.3516, -40.8449, NULL, 0, 'Gava\'xi'),
(1829800, 4, -2722.3762, 7894.163, -41.931747, NULL, 0, 'Gava\'xi'),
(1829800, 5, -2732.9348, 7900.942, -41.43452, NULL, 0, 'Gava\'xi'),
(1829800, 6, -2738.069, 7909.868, -41.615604, NULL, 0, 'Gava\'xi'),
(1829800, 7, -2731.4773, 7926.874, -40.430233, NULL, 0, 'Gava\'xi'),
(1829800, 8, -2706.214, 7966.6875, -44.424637, NULL, 0, 'Gava\'xi'),
(1829800, 9, -2678.335, 7982.9517, -46.47888, NULL, 0, 'Gava\'xi'),
(1829800, 10, -2664.7808, 7981.76, -47.284157, NULL, 0, 'Gava\'xi'),
(1829800, 11, -2643.7148, 7983.618, -47.950817, NULL, 0, 'Gava\'xi'),
(1829800, 12, -2627.47, 7988.2173, -48.725338, NULL, 0, 'Gava\'xi'),
(1829800, 13, -2608.5688, 7992.2085, -49.956314, NULL, 0, 'Gava\'xi'),
(1829800, 14, -2591.1943, 7998.155, -51.645016, NULL, 0, 'Gava\'xi'),
(1829800, 15, -2587.0571, 8000.884, -51.988026, NULL, 0, 'Gava\'xi'),
(1829801, 1, -2595.9915, 7978.7476, -51.318558, NULL, 0, 'Gava\'xi'),
(1829801, 2, -2606.409, 7970.6963, -50.899216, NULL, 0, 'Gava\'xi'),
(1829801, 3, -2618.4011, 7955.8125, -51.952393, NULL, 0, 'Gava\'xi'),
(1829801, 4, -2631.3743, 7933.137, -52.171066, NULL, 0, 'Gava\'xi'),
(1829801, 5, -2629.679, 7916.777, -53.126976, NULL, 0, 'Gava\'xi'),
(1829801, 6, -2638.3762, 7903.308, -51.517876, NULL, 0, 'Gava\'xi'),
(1829801, 7, -2654.426, 7890.7925, -49.859486, NULL, 0, 'Gava\'xi'),
(1829801, 8, -2675.7644, 7878.1504, -45.659203, NULL, 0, 'Gava\'xi'),
(1829801, 9, -2694.0188, 7872.3525, -44.287346, NULL, 0, 'Gava\'xi'),
(1829801, 10, -2705.9536, 7878.065, -43.997498, NULL, 0, 'Gava\'xi'),
(1829801, 11, -2707.866, 7888.1953, -41.754112, NULL, 0, 'Gava\'xi'),
(1829801, 12, -2702.4153, 7895.1562, -39.975098, NULL, 0, 'Gava\'xi'),
(1829801, 13, -2694.282, 7903.423, -37.312958, NULL, 0, 'Gava\'xi'),
(1829801, 14, -2675.754, 7928.2773, -28.246132, NULL, 0, 'Gava\'xi'),
(1829801, 15, -2670.222, 7942.9243, -23.193773, NULL, 0, 'Gava\'xi'),
(1829801, 16, -2665.6055, 7953.998, -18.960806, NULL, 0, 'Gava\'xi');
DELETE FROM `smart_scripts` WHERE `entryorguid` = 18298 AND `source_type` = 0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(18298, 0, 0, 0, 0, 0, 100, 0, 2500, 4000, 9500, 12000, 0, 0, 11, 14873, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - In Combat - Cast \'Sinister Strike\''),
(18298, 0, 1, 0, 2, 0, 100, 1, 20, 80, 0, 0, 0, 0, 11, 12540, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - Between 20-80% Health - Cast \'Gouge\' (No Repeat)'),
(18298, 0, 2, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 53, 1, 1829800, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - Respawn - Start waypoint movement'),
(18298, 0, 3, 4, 40, 0, 100, 0, 15, 1829800, 0, 0, 0, 0, 89, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - WP reached - Start wander movement (10yds)'),
(18298, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 67, 1, 15000, 15000, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - WP reached - Do timed event 1'),
(18298, 0, 5, 0, 59, 0, 100, 0, 1, 0, 0, 0, 0, 0, 53, 0, 1829801, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - On timed event triggered - Start waypoint movement'),
(18298, 0, 6, 7, 40, 0, 100, 0, 16, 1829801, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - WP reached - Start wander movement (0yds)'),
(18298, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 67, 2, 4000, 4000, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - WP reached - Do timed event 2'),
(18298, 0, 8, 9, 59, 0, 100, 0, 2, 0, 0, 0, 0, 0, 5, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - On timed event triggered - Do emote \'ONESHOT_ROAR\''),
(18298, 0, 9, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 67, 3, 22000, 22000, 0, 0, 100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - On timed event triggered - Do timed event 3'),
(18298, 0, 10, 0, 59, 0, 100, 0, 3, 0, 0, 0, 0, 0, 53, 1, 1829800, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Gava\'xi - On timed event triggered - Start waypoint movement');
@@ -0,0 +1,33 @@
-- DB update 2024_01_02_00 -> 2024_01_03_00
# Lord Cobrahn
DELETE FROM `smart_scripts` WHERE `entryorguid`=3669 AND `source_type`=0 AND `id`=6 AND `link`=7;
UPDATE `smart_scripts` SET `id`=6 WHERE `entryorguid`=3669 AND `source_type`=0 AND `id`=7 AND `link`=0;
UPDATE `smart_scripts` SET `id`=7 WHERE `entryorguid`=3669 AND `source_type`=0 AND `id`=8 AND `link`=0;
# Druid of the Fang
DELETE FROM `smart_scripts` WHERE `entryorguid`=3840 AND `source_type`=0 AND `id`=4 AND `link`=0;
UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=3840 AND `source_type`=0 AND `id`=3 AND `link`=4;
UPDATE `smart_scripts` SET `id`=4, `link`=5 WHERE `entryorguid`=3840 AND `source_type`=0 AND `id`=5 AND `link`=6;
UPDATE `smart_scripts` SET `id`=5 WHERE `entryorguid`=3840 AND `source_type`=0 AND `id`=6 AND `link`=0;
UPDATE `smart_scripts` SET `id`=6 WHERE `entryorguid`=3840 AND `source_type`=0 AND `id`=7 AND `link`=0;
# Phantom Guest
DELETE FROM `smart_scripts` WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=6 AND `link`=0;
UPDATE `smart_scripts` SET `id`=6 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=7 AND `link`=0;
UPDATE `smart_scripts` SET `id`=7 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=8 AND `link`=0;
UPDATE `smart_scripts` SET `id`=8 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=9 AND `link`=0;
UPDATE `smart_scripts` SET `id`=9 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=10 AND `link`=0;
UPDATE `smart_scripts` SET `id`=10 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=11 AND `link`=0;
UPDATE `smart_scripts` SET `id`=11 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=12 AND `link`=0;
UPDATE `smart_scripts` SET `id`=12 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=13 AND `link`=0;
UPDATE `smart_scripts` SET `id`=13 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=14 AND `link`=0;
UPDATE `smart_scripts` SET `id`=14 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=15 AND `link`=0;
UPDATE `smart_scripts` SET `id`=15 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=20 AND `link`=0;
UPDATE `smart_scripts` SET `id`=16 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=21 AND `link`=0;
UPDATE `smart_scripts` SET `id`=17 WHERE `entryorguid`=16409 AND `source_type`=0 AND `id`=22 AND `link`=0;
# Maiev Shadowsong
DELETE FROM `smart_scripts` WHERE `entryorguid`=23197 AND `source_type`=0 AND `id`=7 AND `link`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=23197 AND `source_type`=0 AND `id`=8 AND `link`=0;
UPDATE `smart_scripts` SET `id`=7 WHERE `entryorguid`=23197 AND `source_type`=0 AND `id`=9 AND `link`=0;
UPDATE `smart_scripts` SET `id`=8 WHERE `entryorguid`=23197 AND `source_type`=0 AND `id`=10 AND `link`=0;
@@ -0,0 +1,9 @@
-- DB update 2024_01_03_00 -> 2024_01_03_01
--
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 18) AND (`SourceGroup` = 29857) AND (`SourceEntry` = 55460) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 9) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 12910) AND (`ConditionValue2` = 0) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(18, 29857, 55460, 0, 0, 9, 0, 12910, 0, 0, 0, 0, 0, '', 'Ride Frostbite (Khaliisi\'s Pet) Spellclick requires Active (taken) quest \'Sniffing Out the Perpetrator\'.');
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 17) AND (`SourceGroup` = 0) AND (`SourceEntry` = 54997) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 29696) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(17, 0, 54997, 0, 0, 31, 1, 3, 29696, 0, 0, 0, 0, '', 'Immobilizes a Stormforged Pursuer.');
@@ -0,0 +1,54 @@
-- DB update 2024_01_03_01 -> 2024_01_03_02
--
DELETE FROM `smart_scripts` WHERE `entryorguid` = 18670 AND `source_type` = 0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(18670, 0, 0, 0, 0, 0, 100, 0, 2000, 4000, 30000, 35000, 0, 0, 11, 32918, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Ironjaw - In Combat - Cast \'Chilling Howl\''),
(18670, 0, 1, 0, 0, 0, 100, 0, 4000, 6000, 4000, 6000, 0, 0, 11, 32919, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Ironjaw - In Combat - Cast \'Snarl\''),
(18670, 0, 2, 0, 0, 0, 100, 0, 8000, 11000, 9000, 11000, 0, 0, 11, 32962, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Ironjaw - In Combat - Cast \'Iron Bite\''),
(18670, 0, 3, 0, 11, 0, 100, 0, 0, 0, 0, 0, 0, 0, 53, 0, 1867000, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Ironjaw - Respawn - Start waypoint movement');
DELETE FROM `creature` WHERE `guid` = 66940 and `id1` = 18670;
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`, `CreateObject`, `Comment`) VALUES
(66940, 18670, 0, 0, 530, 0, 0, 1, 1, 0, -2255.6384, 3470.4573, -23.312017, 1.83568, 300, 0, 0, 5715, 0, 0, 0, 0, 0, '', 0, 0, NULL);
DELETE FROM `waypoints` WHERE `entry` = 1867000;
INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `point_comment`) VALUES
(1867000, 1, -2254.9797, 3456.6707, -22.450056, NULL, 0, 'Ironjaw'),
(1867000, 2, -2260.0933, 3436.6528, -19.26712, NULL, 0, 'Ironjaw'),
(1867000, 3, -2269.3323, 3417.3464, -18.036856, NULL, 0, 'Ironjaw'),
(1867000, 4, -2261.3965, 3401.6484, -19.311249, NULL, 0, 'Ironjaw'),
(1867000, 5, -2241.924, 3399.447, -20.934261, NULL, 0, 'Ironjaw'),
(1867000, 6, -2223.0876, 3399.6868, -22.344685, NULL, 0, 'Ironjaw'),
(1867000, 7, -2212.784, 3398.4434, -25.655071, NULL, 0, 'Ironjaw'),
(1867000, 8, -2203.8513, 3393.8677, -29.047827, NULL, 0, 'Ironjaw'),
(1867000, 9, -2193.1848, 3385.0598, -31.713863, NULL, 0, 'Ironjaw'),
(1867000, 10, -2187.9397, 3375.0015, -31.811998, NULL, 0, 'Ironjaw'),
(1867000, 11, -2188.9473, 3363.0488, -31.13889, NULL, 0, 'Ironjaw'),
(1867000, 12, -2190.2373, 3350.6533, -31.041891, NULL, 0, 'Ironjaw'),
(1867000, 13, -2188.941, 3363.031, -31.168343, NULL, 0, 'Ironjaw'),
(1867000, 14, -2187.9397, 3375.0015, -31.811998, NULL, 0, 'Ironjaw'),
(1867000, 15, -2193.1848, 3385.0598, -31.713863, NULL, 0, 'Ironjaw'),
(1867000, 16, -2203.8513, 3393.8677, -29.047827, NULL, 0, 'Ironjaw'),
(1867000, 17, -2223.0876, 3399.6868, -22.344685, NULL, 0, 'Ironjaw'),
(1867000, 18, -2241.924, 3399.447, -20.934261, NULL, 0, 'Ironjaw'),
(1867000, 19, -2261.3965, 3401.6484, -19.311249, NULL, 0, 'Ironjaw'),
(1867000, 20, -2269.3323, 3417.3464, -18.036856, NULL, 0, 'Ironjaw'),
(1867000, 21, -2260.0933, 3436.6528, -19.26712, NULL, 0, 'Ironjaw'),
(1867000, 22, -2254.9797, 3456.6707, -22.450056, NULL, 0, 'Ironjaw'),
(1867000, 23, -2255.6384, 3470.4573, -23.312017, NULL, 0, 'Ironjaw'),
(1867000, 24, -2264.9858, 3485.0881, -24.062012, NULL, 0, 'Ironjaw'),
(1867000, 25, -2261.0608, 3496.8245, -23.882532, NULL, 0, 'Ironjaw'),
(1867000, 26, -2254.7573, 3518.5947, -25.678585, NULL, 0, 'Ironjaw'),
(1867000, 27, -2256.2546, 3543.88, -22.95422, NULL, 0, 'Ironjaw'),
(1867000, 28, -2260.6467, 3560.1096, -16.475277, NULL, 0, 'Ironjaw'),
(1867000, 29, -2264.5212, 3586.5452, -18.401897, NULL, 0, 'Ironjaw'),
(1867000, 30, -2273.019, 3609.3972, -15.251651, NULL, 0, 'Ironjaw'),
(1867000, 31, -2271.3945, 3641.3662, -9.791668, NULL, 0, 'Ironjaw'),
(1867000, 32, -2273.019, 3609.3972, -15.251651, NULL, 0, 'Ironjaw'),
(1867000, 33, -2264.5212, 3586.5452, -18.401897, NULL, 0, 'Ironjaw'),
(1867000, 34, -2260.6467, 3560.1096, -16.475277, NULL, 0, 'Ironjaw'),
(1867000, 35, -2256.2546, 3543.88, -22.95422, NULL, 0, 'Ironjaw'),
(1867000, 36, -2254.7573, 3518.5947, -25.678585, NULL, 0, 'Ironjaw'),
(1867000, 37, -2261.0608, 3496.8245, -23.882532, NULL, 0, 'Ironjaw'),
(1867000, 38, -2264.9858, 3485.0881, -24.062012, NULL, 0, 'Ironjaw'),
(1867000, 39, -2255.6384, 3470.4573, -23.312017, NULL, 0, 'Ironjaw');
File diff suppressed because it is too large Load Diff
@@ -604,9 +604,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_CHAR_SETTINGS, "DELETE FROM character_settings WHERE guid = ?", CONNECTION_ASYNC);
// Instance saved data. Stores the states of gameobjects in instances to be loaded on server start
PrepareStatement(CHAR_SELECT_INSTANCE_SAVED_DATA, "SELECT id, guid, state FROM instance_saved_go_state_data", CONNECTION_SYNCH);
PrepareStatement(CHAR_UPDATE_INSTANCE_SAVED_DATA, "UPDATE instance_saved_go_state_data SET state = ? WHERE guid = ? AND id = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INSERT_INSTANCE_SAVED_DATA, "INSERT INTO instance_saved_go_state_data (id, guid, state) VALUES (?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_SELECT_INSTANCE_SAVED_DATA, "SELECT guid, state FROM instance_saved_go_state_data WHERE id = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_INSERT_INSTANCE_SAVED_DATA, "INSERT INTO instance_saved_go_state_data (id, guid, state) VALUES (?, ?, ?)"
"ON DUPLICATE KEY UPDATE state = VALUES(state)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DELETE_INSTANCE_SAVED_DATA, "DELETE FROM instance_saved_go_state_data WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SANITIZE_INSTANCE_SAVED_DATA, "DELETE FROM instance_saved_go_state_data WHERE id NOT IN (SELECT instance.id FROM instance)", CONNECTION_ASYNC);
}
@@ -517,7 +517,6 @@ enum CharacterDatabaseStatements : uint32
CHAR_DEL_CHAR_SETTINGS,
CHAR_SELECT_INSTANCE_SAVED_DATA,
CHAR_UPDATE_INSTANCE_SAVED_DATA,
CHAR_INSERT_INSTANCE_SAVED_DATA,
CHAR_DELETE_INSTANCE_SAVED_DATA,
CHAR_SANITIZE_INSTANCE_SAVED_DATA,
+35 -21
View File
@@ -500,6 +500,7 @@ void SmartAI::CheckConditions(const uint32 diff)
void SmartAI::UpdateAI(uint32 diff)
{
bool hasVictim = UpdateVictim();
CheckConditions(diff);
GetScript()->OnUpdate(diff);
UpdatePath(diff);
@@ -535,7 +536,7 @@ void SmartAI::UpdateAI(uint32 diff)
return;
}
if (!UpdateVictim())
if (!hasVictim)
return;
if (mCanAutoAttack)
@@ -827,14 +828,14 @@ void SmartAI::AttackStart(Unit* who)
// xinef: dont allow charmed npcs to act on their own
if (me->HasUnitFlag(UNIT_FLAG_POSSESSED))
{
if (who && mCanAutoAttack)
me->Attack(who, true);
if (who)
me->Attack(who, mCanAutoAttack);
return;
}
if (who && me->Attack(who, me->IsWithinMeleeRange(who)))
{
if (mCanCombatMove || GetScript()->GetMaxCombatDist())
if (mCanCombatMove)
{
SetRun(mRun);
MovementGeneratorType type = me->GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_ACTIVE);
@@ -843,8 +844,8 @@ void SmartAI::AttackStart(Unit* who)
me->GetMotionMaster()->MovementExpired();
me->StopMoving();
}
float range = GetScript()->GetCasterActualDist() > 0.f ? GetScript()->GetCasterActualDist() : GetScript()->GetActualCombatDist();
me->GetMotionMaster()->MoveChase(who, range > 0.f ? ChaseRange(range) : std::optional<ChaseRange>());
me->GetMotionMaster()->MoveChase(who);
}
}
}
@@ -1019,21 +1020,8 @@ void SmartAI::sQuestReward(Player* player, Quest const* quest, uint32 opt)
GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt);
}
void SmartAI::SetForcedCombatMove(float dist)
void SmartAI::SetCombatMove(bool on, float chaseRange)
{
if (!me->GetVictim())
return;
SetRun(mRun);
me->GetMotionMaster()->MoveChase(me->GetVictim(), dist);
}
void SmartAI::SetCombatMove(bool on)
{
// Xinef: Fix Combat Movement
if (GetScript()->GetMaxCombatDist()/* || GetScript()->GetCasterMaxDist()*/) // Xinef: we only need this hack for old caster movement system
return;
if (mCanCombatMove == on)
return;
@@ -1049,7 +1037,7 @@ void SmartAI::SetCombatMove(bool on)
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE)
{
SetRun(mRun);
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->GetMotionMaster()->MoveChase(me->GetVictim(), chaseRange);
me->CastStop();
}
}
@@ -1115,6 +1103,32 @@ void SmartAI::StopFollow(bool complete)
GetScript()->ProcessEventsFor(SMART_EVENT_FOLLOW_COMPLETED, player);
}
void SmartAI::MoveAway(float distance)
{
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
return;
mCanCombatMove = false;
if (!IsAIControlled())
return;
if (!HasEscortState(SMART_ESCORT_ESCORTING))
{
if (me->GetVictim())
{
me->StopMoving();
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
me->GetMotionMaster()->Clear(false);
float x, y, z;
me->GetClosePoint(x, y, z, me->GetObjectSize(), distance, M_PI);
if (me->GetVictim()->IsWithinLOS(x, y, z))
me->GetMotionMaster()->MovePoint(SMART_RANDOM_POINT, x, y, z);
}
}
}
void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
{
if (invoker)
+2 -2
View File
@@ -64,10 +64,11 @@ public:
bool IsEscorted() override { return (mEscortState & SMART_ESCORT_ESCORTING); }
void RemoveEscortState(uint32 uiEscortState) { mEscortState &= ~uiEscortState; }
void SetAutoAttack(bool on) { mCanAutoAttack = on; }
void SetCombatMove(bool on);
void SetCombatMove(bool on, float chaseRange = 0.0f);
bool CanCombatMove() { return mCanCombatMove; }
void SetFollow(Unit* target, float dist = 0.0f, float angle = 0.0f, uint32 credit = 0, uint32 end = 0, uint32 creditType = 0, bool aliveState = true);
void StopFollow(bool complete);
void MoveAway(float distance);
void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
SmartScript* GetScript() { return &mScript; }
@@ -205,7 +206,6 @@ public:
// Xinef
void SetWPPauseTimer(uint32 time) { mWPPauseTimer = time; }
void SetForcedCombatMove(float dist);
private:
bool mIsCharmed;
+126 -83
View File
@@ -56,15 +56,8 @@ SmartScript::SmartScript()
mTemplate = SMARTAI_TEMPLATE_BASIC;
mScriptType = SMART_SCRIPT_TYPE_CREATURE;
isProcessingTimedActionList = false;
// Xinef: Fix Combat Movement
mActualCombatDist = 0;
mMaxCombatDist = 0;
smartCasterActualDist = 0.0f;
smartCasterMaxDist = 0.0f;
smartCasterPowerType = POWER_MANA;
mCurrentPriority = 0;
mEventSortingRequired = false;
_allowPhaseReset = true;
}
@@ -87,14 +80,16 @@ void SmartScript::OnReset()
InitTimer((*i));
(*i).runOnce = false;
}
if ((*i).priority != SmartScriptHolder::DEFAULT_PRIORITY)
{
(*i).priority = SmartScriptHolder::DEFAULT_PRIORITY;
mEventSortingRequired = true;
}
}
ProcessEventsFor(SMART_EVENT_RESET);
mLastInvoker.Clear();
mCounterList.clear();
// Xinef: Fix Combat Movement
RestoreMaxCombatDist();
RestoreCasterMaxDist();
}
void SmartScript::ProcessEventsFor(SMART_EVENT e, Unit* unit, uint32 var0, uint32 var1, bool bvar, SpellInfo const* spell, GameObject* gob)
@@ -118,14 +113,18 @@ void SmartScript::ProcessEventsFor(SMART_EVENT e, Unit* unit, uint32 var0, uint3
void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, uint32 var1, bool bvar, SpellInfo const* spell, GameObject* gob)
{
e.runOnce = true;//used for repeat check
//calc random
if (e.event.event_chance < 100 && e.event.event_chance)
if (e.event.event_chance < 100 && e.event.event_chance && !(e.event.event_flags & SMART_EVENT_FLAG_TEMP_IGNORE_CHANCE_ROLL))
{
uint32 rnd = urand(1, 100);
if (e.event.event_chance <= rnd)
return;
}
e.runOnce = true;//used for repeat check
// Remove SMART_EVENT_FLAG_TEMP_IGNORE_CHANCE_ROLL flag after processing roll chances as it's not needed anymore
e.event.event_flags &= ~SMART_EVENT_FLAG_TEMP_IGNORE_CHANCE_ROLL;
if (unit)
mLastInvoker = unit->GetGUID();
@@ -589,6 +588,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (e.action.cast.targetsLimit)
Acore::Containers::RandomResize(targets, e.action.cast.targetsLimit);
bool failedSpellCast = false, successfulSpellCast = false;
for (WorldObject* target : targets)
{
// may be nullptr
@@ -621,23 +622,40 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (e.action.cast.castFlags & SMARTCAST_INTERRUPT_PREVIOUS)
me->InterruptNonMeleeSpells(false);
// Flag usable only if caster has max dist set.
if ((e.action.cast.castFlags & SMARTCAST_COMBAT_MOVE) && GetCasterMaxDist() > 0.0f && me->GetMaxPower(GetCasterPowerType()) > 0)
{
// Check mana case only and operate movement accordingly, LoS and range is checked in targetet movement generator.
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(e.action.cast.spell);
int32 currentPower = me->GetPower(GetCasterPowerType());
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(e.action.cast.spell);
float distanceToTarget = me->GetDistance(target->ToUnit());
float spellMaxRange = me->GetSpellMaxRangeForTarget(target->ToUnit(), spellInfo);
float spellMinRange = me->GetSpellMinRangeForTarget(target->ToUnit(), spellInfo);
float meleeRange = me->GetMeleeRange(target->ToUnit());
if ((spellInfo && (currentPower < spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()) || me->IsSpellProhibited(spellInfo->GetSchoolMask()))) || me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
{
SetCasterActualDist(0);
CAST_AI(SmartAI, me->AI())->SetForcedCombatMove(0);
}
else if (GetCasterActualDist() == 0.0f && me->GetPowerPct(GetCasterPowerType()) > 30.0f)
{
RestoreCasterMaxDist();
CAST_AI(SmartAI, me->AI())->SetForcedCombatMove(GetCasterActualDist());
}
bool isWithinLOSInMap = me->IsWithinLOSInMap(target->ToUnit());
bool isWithinMeleeRange = distanceToTarget <= meleeRange;
bool isRangedAttack = spellMaxRange > NOMINAL_MELEE_RANGE;
bool isTargetRooted = target->ToUnit()->HasUnitState(UNIT_STATE_ROOT);
// To prevent running back and forth when OOM, we must have more than 10% mana.
bool canCastSpell = me->GetPowerPct(POWER_MANA) > 10.0f && spellInfo->CalcPowerCost(me, spellInfo->GetSchoolMask()) < (int32)me->GetPower(POWER_MANA) && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED);
// If target is rooted we move out of melee range before casting, but not further than spell max range.
if (isWithinLOSInMap && isWithinMeleeRange && isRangedAttack && isTargetRooted && canCastSpell)
{
failedSpellCast = true; // Mark spellcast as failed so we can retry it later
float minDistance = std::max(meleeRange, spellMinRange) - distanceToTarget + NOMINAL_MELEE_RANGE;
CAST_AI(SmartAI, me->AI())->MoveAway(std::min(minDistance, spellMaxRange));
continue;
}
// Let us not try to cast spell if we know it is going to fail anyway. Stick to chasing and continue.
if (distanceToTarget > spellMaxRange && isWithinLOSInMap)
{
failedSpellCast = true;
CAST_AI(SmartAI, me->AI())->SetCombatMove(true, std::max(spellMaxRange - NOMINAL_MELEE_RANGE, 0.0f));
continue;
}
else if (distanceToTarget < spellMinRange || !isWithinLOSInMap)
{
failedSpellCast = true;
CAST_AI(SmartAI, me->AI())->SetCombatMove(true);
continue;
}
TriggerCastFlags triggerFlags = TRIGGERED_NONE;
@@ -649,11 +667,38 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
triggerFlags = TRIGGERED_FULL_MASK;
}
me->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlags);
SpellCastResult result = me->CastSpell(target->ToUnit(), e.action.cast.spell, triggerFlags);
bool spellCastFailed = (result != SPELL_CAST_OK && result != SPELL_FAILED_SPELL_IN_PROGRESS);
if (e.action.cast.castFlags & SMARTCAST_COMBAT_MOVE)
{
// If cast flag SMARTCAST_COMBAT_MOVE is set combat movement will not be allowed unless target is outside spell range, out of mana, or LOS.
if (result == SPELL_FAILED_OUT_OF_RANGE)
// if we are just out of range, we only chase until we are back in spell range.
CAST_AI(SmartAI, me->AI())->SetCombatMove(true, std::max(spellMaxRange - NOMINAL_MELEE_RANGE, 0.0f));
else
// if spell fail for any other reason, we chase to melee range, or stay where we are if spellcast was successful.
CAST_AI(SmartAI, me->AI())->SetCombatMove(spellCastFailed);
}
if (spellCastFailed)
failedSpellCast = true;
else
successfulSpellCast = true;
LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_CAST: Unit {} casts spell {} on target {} with castflags {}",
me->GetGUID().ToString(), e.action.cast.spell, target->GetGUID().ToString(), e.action.cast.castFlags);
}
}
// If there is at least 1 failed cast and no successful casts at all, retry again on next loop
if (failedSpellCast && !successfulSpellCast)
{
RetryLater(e, true);
// Don't execute linked events
return;
}
break;
}
case SMART_ACTION_SELF_CAST:
@@ -864,15 +909,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!IsSmart())
break;
// Xinef: Fix Combat Movement
bool move = e.action.combatMove.move;
if (move && GetMaxCombatDist() && e.GetEventType() == SMART_EVENT_MANA_PCT)
{
SetActualCombatDist(0);
CAST_AI(SmartAI, me->AI())->SetForcedCombatMove(0);
}
else
CAST_AI(SmartAI, me->AI())->SetCombatMove(move);
CAST_AI(SmartAI, me->AI())->SetCombatMove(move);
LOG_DEBUG("sql.sql", "SmartScript::ProcessAction:: SMART_ACTION_ALLOW_COMBAT_MOVEMENT: Creature {} bool on = {}",
me->GetGUID().ToString(), e.action.combatMove.move);
break;
@@ -2425,17 +2463,6 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
}
case SMART_ACTION_SET_CASTER_COMBAT_DIST:
{
if (e.action.casterDistance.reset)
RestoreCasterMaxDist();
else
SetCasterActualDist(e.action.casterDistance.dist);
if (me->GetVictim() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
me->GetMotionMaster()->MoveChase(me->GetVictim(), GetCasterActualDist());
break;
}
case SMART_ACTION_SET_SIGHT_DIST:
{
for (WorldObject* const target : targets)
@@ -4577,7 +4604,7 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff)
{
if (me && me->HasUnitState(UNIT_STATE_CASTING))
{
e.timer = 1200;
RaisePriority(e);
return;
}
}
@@ -4635,6 +4662,18 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff)
break;
}
}
if (e.priority != SmartScriptHolder::DEFAULT_PRIORITY)
{
// Reset priority to default one only if the event hasn't been rescheduled again to next loop
if (e.timer > 1)
{
// Re-sort events if this was moved to the top of the queue
mEventSortingRequired = true;
// Reset priority to default one
e.priority = SmartScriptHolder::DEFAULT_PRIORITY;
}
}
}
else
e.timer -= diff;
@@ -4663,6 +4702,12 @@ void SmartScript::OnUpdate(uint32 const diff)
InstallEvents();//before UpdateTimers
if (mEventSortingRequired)
{
SortEvents(mEvents);
mEventSortingRequired = false;
}
for (SmartAIEventList::iterator i = mEvents.begin(); i != mEvents.end(); ++i)
UpdateTimer(*i, diff);
@@ -4718,6 +4763,33 @@ void SmartScript::OnUpdate(uint32 const diff)
}
}
void SmartScript::SortEvents(SmartAIEventList& events)
{
std::sort(events.begin(), events.end());
}
void SmartScript::RaisePriority(SmartScriptHolder& e)
{
e.timer = 1200;
// Change priority only if it's set to default, otherwise keep the current order of events
if (e.priority == SmartScriptHolder::DEFAULT_PRIORITY)
{
e.priority = mCurrentPriority++;
mEventSortingRequired = true;
}
}
void SmartScript::RetryLater(SmartScriptHolder& e, bool ignoreChanceRoll)
{
RaisePriority(e);
// This allows to retry the action later without rolling again the chance roll (which might fail and end up not executing the action)
if (ignoreChanceRoll)
e.event.event_flags |= SMART_EVENT_FLAG_TEMP_IGNORE_CHANCE_ROLL;
e.runOnce = false;
}
void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTrigger const* at)
{
(void)at; // ensure that the variable is referenced even if extra logs are disabled in order to pass compiler checks
@@ -4822,37 +4894,8 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTrigger const* at)
GetScript();//load copy of script
uint32 maxDisableDist = 0;
uint32 minEnableDist = 0;
for (SmartAIEventList::iterator i = mEvents.begin(); i != mEvents.end(); ++i)
{
InitTimer((*i));//calculate timers for first time use
if (i->GetEventType() == SMART_EVENT_RANGE && i->GetActionType() == SMART_ACTION_ALLOW_COMBAT_MOVEMENT)
{
if (i->action.combatMove.move == 1 && i->event.minMaxRepeat.rangeMin > minEnableDist)
minEnableDist = i->event.minMaxRepeat.rangeMin;
else if (i->action.combatMove.move == 0 && (i->event.minMaxRepeat.rangeMax < maxDisableDist || maxDisableDist == 0))
maxDisableDist = i->event.minMaxRepeat.rangeMax;
}
// Xinef: if smartcast combat move flag is present
if (i->GetActionType() == SMART_ACTION_CAST && (i->action.cast.castFlags & SMARTCAST_COMBAT_MOVE))
{
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i->action.cast.spell))
{
float maxRange = spellInfo->GetMaxRange(spellInfo->IsPositive());
float minRange = spellInfo->GetMinRange(spellInfo->IsPositive());
if (maxRange > 0 && minRange <= maxRange)
{
smartCasterMaxDist = minRange + ((maxRange - minRange) * 0.65f);
smartCasterPowerType = (Powers)spellInfo->PowerType;
}
}
}
}
if (maxDisableDist > 0 && minEnableDist >= maxDisableDist)
mMaxCombatDist = uint32(maxDisableDist + ((minEnableDist - maxDisableDist) / 2));
for (SmartScriptHolder& event : mEvents)
InitTimer(event);//calculate timers for first time use
ProcessEventsFor(SMART_EVENT_AI_INIT);
InstallEvents();
+6 -22
View File
@@ -216,19 +216,6 @@ public:
typedef std::unordered_map<uint32, uint32> CounterMap;
CounterMap mCounterList;
// Xinef: Fix Combat Movement
void SetActualCombatDist(uint32 dist) { mActualCombatDist = dist; }
void RestoreMaxCombatDist() { mActualCombatDist = mMaxCombatDist; }
uint32 GetActualCombatDist() const { return mActualCombatDist; }
uint32 GetMaxCombatDist() const { return mMaxCombatDist; }
// Xinef: SmartCasterAI, replace above
void SetCasterActualDist(float dist) { smartCasterActualDist = dist; }
void RestoreCasterMaxDist() { smartCasterActualDist = smartCasterMaxDist; }
Powers GetCasterPowerType() const { return smartCasterPowerType; }
float GetCasterActualDist() const { return smartCasterActualDist; }
float GetCasterMaxDist() const { return smartCasterMaxDist; }
bool AllowPhaseReset() const { return _allowPhaseReset; }
void SetPhaseReset(bool allow) { _allowPhaseReset = allow; }
@@ -241,6 +228,10 @@ private:
void SetPhase(uint32 p);
bool IsInPhase(uint32 p) const;
void SortEvents(SmartAIEventList& events);
void RaisePriority(SmartScriptHolder& e);
void RetryLater(SmartScriptHolder& e, bool ignoreChanceRoll = false);
SmartAIEventList mEvents;
SmartAIEventList mInstallEvents;
SmartAIEventList mTimedActionList;
@@ -262,15 +253,8 @@ private:
uint32 mLastTextID;
uint32 mTalkerEntry;
bool mUseTextTimer;
// Xinef: Fix Combat Movement
uint32 mActualCombatDist;
uint32 mMaxCombatDist;
// Xinef: SmartCasterAI, replace above in future
uint32 smartCasterActualDist;
uint32 smartCasterMaxDist;
Powers smartCasterPowerType;
uint32 mCurrentPriority;
bool mEventSortingRequired;
// Xinef: misc
bool _allowPhaseReset;
@@ -755,7 +755,6 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e)
case SMART_ACTION_EXIT_VEHICLE: return NO_PARAMS;
case SMART_ACTION_SET_UNIT_MOVEMENT_FLAGS: return sizeof(SmartAction::movementFlag);
case SMART_ACTION_SET_COMBAT_DISTANCE: return sizeof(SmartAction::combatDistance);
case SMART_ACTION_SET_CASTER_COMBAT_DIST: return sizeof(SmartAction::casterDistance);
case SMART_ACTION_FALL: return NO_PARAMS;
case SMART_ACTION_SET_EVENT_FLAG_RESET: return sizeof(SmartAction::setActive);
case SMART_ACTION_STOP_MOTION: return sizeof(SmartAction::stopMotion);
@@ -1918,7 +1917,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_EXIT_VEHICLE:
case SMART_ACTION_SET_UNIT_MOVEMENT_FLAGS:
case SMART_ACTION_SET_COMBAT_DISTANCE:
case SMART_ACTION_SET_CASTER_COMBAT_DIST:
case SMART_ACTION_SET_SIGHT_DIST:
case SMART_ACTION_FLEE:
case SMART_ACTION_ADD_THREAT:
@@ -26,6 +26,7 @@
#include "Spell.h"
#include "SpellMgr.h"
#include "Unit.h"
#include <limits>
typedef uint32 SAIBool;
@@ -686,7 +687,7 @@ enum SMART_ACTION
SMART_ACTION_EXIT_VEHICLE = 203, // none
SMART_ACTION_SET_UNIT_MOVEMENT_FLAGS = 204, // flags
SMART_ACTION_SET_COMBAT_DISTANCE = 205, // combatDistance
SMART_ACTION_SET_CASTER_COMBAT_DIST = 206, // followDistance, resetToMax
// UNUSED = 206,
SMART_ACTION_SET_HOVER = 207, // 0/1
SMART_ACTION_ADD_IMMUNITY = 208, // type, id, value
SMART_ACTION_REMOVE_IMMUNITY = 209, // type, id, value
@@ -1859,7 +1860,10 @@ enum SmartEventFlags
SMART_EVENT_FLAG_WHILE_CHARMED = 0x200, // Event occurs even if AI owner is charmed
SMART_EVENT_FLAG_DIFFICULTY_ALL = (SMART_EVENT_FLAG_DIFFICULTY_0 | SMART_EVENT_FLAG_DIFFICULTY_1 | SMART_EVENT_FLAG_DIFFICULTY_2 | SMART_EVENT_FLAG_DIFFICULTY_3),
SMART_EVENT_FLAGS_ALL = (SMART_EVENT_FLAG_NOT_REPEATABLE | SMART_EVENT_FLAG_DIFFICULTY_ALL | SMART_EVENT_FLAG_RESERVED_5 | SMART_EVENT_FLAG_RESERVED_6 | SMART_EVENT_FLAG_DEBUG_ONLY | SMART_EVENT_FLAG_DONT_RESET | SMART_EVENT_FLAG_WHILE_CHARMED)
SMART_EVENT_FLAGS_ALL = (SMART_EVENT_FLAG_NOT_REPEATABLE | SMART_EVENT_FLAG_DIFFICULTY_ALL | SMART_EVENT_FLAG_RESERVED_5 | SMART_EVENT_FLAG_RESERVED_6 | SMART_EVENT_FLAG_DEBUG_ONLY | SMART_EVENT_FLAG_DONT_RESET | SMART_EVENT_FLAG_WHILE_CHARMED),
// Temp flags, used only at runtime, never stored in DB
SMART_EVENT_FLAG_TEMP_IGNORE_CHANCE_ROLL = 0x40000000, //Event occurs no matter what roll_chance_i(e.event.event_chance) returns.
};
enum SmartCastFlags
@@ -1889,7 +1893,7 @@ enum SmartFollowType
struct SmartScriptHolder
{
SmartScriptHolder() : entryOrGuid(0), source_type(SMART_SCRIPT_TYPE_CREATURE)
, event_id(0), link(0), event(), action(), target(), timer(0), active(false), runOnce(false)
, event_id(0), link(0), event(), action(), target(), timer(0), priority(DEFAULT_PRIORITY), active(false), runOnce(false)
, enableTimed(false) {}
int32 entryOrGuid;
@@ -1908,9 +1912,18 @@ public:
uint32 GetTargetType() const { return (uint32)target.type; }
uint32 timer;
uint32 priority;
bool active;
bool runOnce;
bool enableTimed;
// Default comparision operator using priority field as first ordering field
bool operator<(SmartScriptHolder const& other) const
{
return std::tie(priority, entryOrGuid, source_type, event_id, link) < std::tie(other.priority, other.entryOrGuid, other.source_type, other.event_id, other.link);
}
static constexpr uint32 DEFAULT_PRIORITY = std::numeric_limits<uint32>::max();
};
typedef std::unordered_map<uint32, WayPoint*> WPPath;
@@ -335,21 +335,22 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u
if (IsInstanceGameobject())
{
switch (GetStateSavedOnInstance())
if (InstanceScript* instance = GetInstanceScript())
{
case 0:
SetGoState(GO_STATE_READY);
SwitchDoorOrButton(true);
break;
case 1:
SetGoState(GO_STATE_READY);
break;
case 2:
SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
break;
default:
SetGoState(go_state);
break;
switch (uint8 state = instance->GetStoredGameObjectState(GetSpawnId()))
{
case 0:
SetGoState(GO_STATE_READY);
SwitchDoorOrButton(true);
break;
case 1:
case 2:
SetGoState((GOState)state);
break;
default:
SetGoState(go_state);
break;
}
}
}
else
@@ -2505,21 +2506,13 @@ void GameObject::SetGoState(GOState state)
* save it's state on the database to be loaded properly
* on server restart or crash.
*/
if (IsInstanceGameobject() && IsAbleToSaveOnDb())
if (IsInstanceGameobject() && IsAllowedToSaveToDB())
{
// Save the gameobject state on the Database
if (!FindStateSavedOnInstance())
{
SaveInstanceData(GameobjectStateToInt(&state));
}
else
{
UpdateInstanceData(GameobjectStateToInt(&state));
}
SaveStateToDB();
}
}
bool GameObject::IsInstanceGameobject()
bool GameObject::IsInstanceGameobject() const
{
// Avoid checking for unecessary gameobjects whose
// states don't matter for the dungeon progression
@@ -2538,7 +2531,7 @@ bool GameObject::IsInstanceGameobject()
return false;
}
bool GameObject::ValidateGameobjectType()
bool GameObject::ValidateGameobjectType() const
{
switch (m_goInfo->type)
{
@@ -2553,7 +2546,7 @@ bool GameObject::ValidateGameobjectType()
}
}
uint8 GameObject::GameobjectStateToInt(GOState* state)
uint8 GameObject::GameobjectStateToInt(GOState* state) const
{
uint8 m_state = 3;
@@ -2578,71 +2571,24 @@ uint8 GameObject::GameobjectStateToInt(GOState* state)
return m_state;
}
bool GameObject::IsAbleToSaveOnDb()
{
return m_saveStateOnDb;
}
void GameObject::UpdateSaveToDb(bool enable)
{
m_saveStateOnDb = enable;
if (enable)
{
SavingStateOnDB();
}
}
void GameObject::SavingStateOnDB()
void GameObject::SaveStateToDB()
{
if (IsInstanceGameobject())
{
GOState param = GetGoState();
if (!FindStateSavedOnInstance())
if (InstanceScript* instance = GetInstanceScript())
{
SaveInstanceData(GameobjectStateToInt(&param));
GOState param = GetGoState();
instance->StoreGameObjectState(GetSpawnId(), GameobjectStateToInt(&param));
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INSERT_INSTANCE_SAVED_DATA);
stmt->SetData(0, GetInstanceId());
stmt->SetData(1, GetSpawnId());
stmt->SetData(2, GameobjectStateToInt(&param));
CharacterDatabase.Execute(stmt);
}
}
}
void GameObject::SaveInstanceData(uint8 state)
{
uint32 id = GetInstanceId();
uint32 guid = GetSpawnId();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INSERT_INSTANCE_SAVED_DATA);
stmt->SetData(0, id);
stmt->SetData(1, guid);
stmt->SetData(2, state);
CharacterDatabase.Execute(stmt);
sObjectMgr->NewInstanceSavedGameobjectState(id, guid, state);
}
void GameObject::UpdateInstanceData(uint8 state)
{
uint32 id = GetInstanceId();
uint32 guid = GetSpawnId();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_INSTANCE_SAVED_DATA);
stmt->SetData(0, state);
stmt->SetData(1, guid);
stmt->SetData(2, id);
CharacterDatabase.Execute(stmt);
sObjectMgr->SetInstanceSavedGameobjectState(id, guid, state);
}
uint8 GameObject::GetStateSavedOnInstance()
{
return sObjectMgr->GetInstanceSavedGameobjectState(GetInstanceId(), GetSpawnId());
}
bool GameObject::FindStateSavedOnInstance()
{
return sObjectMgr->FindInstanceSavedGameobjectState(GetInstanceId(), GetSpawnId());
}
void GameObject::SetDisplayId(uint32 displayid)
{
SetUInt32Value(GAMEOBJECT_DISPLAYID, displayid);
@@ -350,25 +350,21 @@ public:
static std::unordered_map<int, goEventFlag> gameObjectToEventFlag; // Gameobject -> event flag
void SaveInstanceData(uint8 state);
void UpdateInstanceData(uint8 state);
bool FindStateSavedOnInstance();
bool ValidateGameobjectType();
uint8 GetStateSavedOnInstance();
bool IsInstanceGameobject();
uint8 GameobjectStateToInt(GOState* state);
[[nodiscard]] bool ValidateGameobjectType() const;
[[nodiscard]] bool IsInstanceGameobject() const;
[[nodiscard]] uint8 GameobjectStateToInt(GOState* state) const;
/* A check to verify if this object is available to be saved on the DB when
* a state change occurs
*/
bool IsAbleToSaveOnDb();
[[nodiscard]] bool IsAllowedToSaveToDB() const { return m_saveStateOnDb; };
/* Enable or Disable the ability to save on the database this gameobject's state
* whenever it changes
*/
void UpdateSaveToDb(bool enable);
void AllowSaveToDB(bool enable) { m_saveStateOnDb = enable; };
void SavingStateOnDB();
void SaveStateToDB();
std::string GetDebugInfo() const override;
protected:
+8
View File
@@ -105,6 +105,14 @@ void Pet::AddToWorld()
if (GetOwnerGUID().IsPlayer())
{
if (Player* owner = GetOwner())
{
if (getPetType() == SUMMON_PET && owner->getClass() == CLASS_WARLOCK)
{
owner->SetLastPetSpell(GetUInt32Value(UNIT_CREATED_BY_SPELL));
}
}
sScriptMgr->OnPetAddToWorld(this);
}
}
+18 -16
View File
@@ -2524,6 +2524,11 @@ void Player::GiveLevel(uint8 level)
sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
}
bool Player::IsMaxLevel() const
{
return GetLevel() >= GetUInt32Value(PLAYER_FIELD_MAX_LEVEL);
}
void Player::InitTalentForLevel()
{
uint32 talentPointsForLevel = CalculateTalentsPoints();
@@ -14166,24 +14171,21 @@ void Player::ResummonPetTemporaryUnSummonedIfAny()
bool Player::CanResummonPet(uint32 spellid)
{
switch (getClass())
if (getClass() == CLASS_DEATH_KNIGHT)
{
case CLASS_DEATH_KNIGHT:
if (CanSeeDKPet())
return true;
else if (spellid == 52150) //Raise Dead
return false;
break;
case CLASS_MAGE:
if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
return true;
break;
case CLASS_HUNTER:
case CLASS_WARLOCK:
if (CanSeeDKPet())
return true;
break;
default:
break;
else if (spellid == 52150) // Raise Dead
return false;
}
else if (getClass() == CLASS_MAGE)
{
if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
return true;
}
else if (getClass() == CLASS_HUNTER)
{
return true;
}
return HasSpell(spellid);
+1
View File
@@ -1686,6 +1686,7 @@ public:
void SetFreeTalentPoints(uint32 points);
bool resetTalents(bool noResetCost = false);
[[nodiscard]] uint32 resetTalentsCost() const;
bool IsMaxLevel() const;
void InitTalentForLevel();
void BuildPlayerTalentsInfoData(WorldPacket* data);
void BuildPetTalentsInfoData(WorldPacket* data);
@@ -2352,7 +2352,7 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP)
WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
data << uint32(questid);
if (GetLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
if (!IsMaxLevel())
{
data << uint32(XP);
data << uint32(quest->GetRewOrReqMoney(GetLevel()));
+18 -25
View File
@@ -4468,19 +4468,12 @@ void Unit::_ApplyAura(AuraApplication* aurApp, uint8 effMask)
SpellInfo const* spellInfo = aura->GetSpellInfo();
if (AuraStateType aState = spellInfo->GetAuraState())
{
if (aState != AURA_STATE_CONFLAGRATE)
{
// Sting (hunter's pet ability), Faerie Fire (druid versions)
if (aState == AURA_STATE_FAERIE_FIRE)
aurApp->GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_STEALTH);
uint32 aStateMask = (1 << (aState - 1));
// force update so the new caster registers it
if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
ForceValuesUpdateAtIndex(UNIT_FIELD_AURASTATE);
else
ModifyAuraState(aState, true);
}
else if (caster)
{
ConflagrateAuraStateDelayEvent* pEvent = new ConflagrateAuraStateDelayEvent(this, caster->GetGUID());
m_Events.AddEvent(pEvent, m_Events.CalculateTime(700)); // intended 700ms delay before allowing to cast conflagrate
}
}
if (aurApp->GetRemoveMode())
@@ -4575,9 +4568,19 @@ void Unit::_UnapplyAura(AuraApplicationMap::iterator& i, AuraRemoveMode removeMo
ToTotem()->setDeathState(DeathState::JustDied);
}
// Remove aurastates only if were not found
if (!auraStateFound)
ModifyAuraState(auraState, false);
// Remove aurastates only if needed and were not found
if (auraState)
{
if (!auraStateFound)
ModifyAuraState(auraState, false);
else
{
// update for casters, some shouldn't 'see' the aura state
uint32 aStateMask = (1 << (auraState - 1));
if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
ForceValuesUpdateAtIndex(UNIT_FIELD_AURASTATE);
}
}
aura->HandleAuraSpecificMods(aurApp, caster, false, false);
@@ -20762,16 +20765,6 @@ int32 Unit::CalculateAOEDamageReduction(int32 damage, uint32 schoolMask, Unit* c
return damage;
}
bool ConflagrateAuraStateDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
{
if (m_owner->IsInWorld())
if (m_owner->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x4, 0, 0, m_casterGUID) || // immolate
m_owner->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0, 0, 0x2, m_casterGUID)) // shadowflame
m_owner->ModifyAuraState(AURA_STATE_CONFLAGRATE, true);
return true;
}
void Unit::ExecuteDelayedUnitRelocationEvent()
{
this->RemoveFromNotify(NOTIFY_VISIBILITY_CHANGED);
-11
View File
@@ -2674,17 +2674,6 @@ namespace Acore
};
}
class ConflagrateAuraStateDelayEvent : public BasicEvent
{
public:
ConflagrateAuraStateDelayEvent(Unit* owner, ObjectGuid casterGUID) : BasicEvent(), m_owner(owner), m_casterGUID(casterGUID) { }
bool Execute(uint64 e_time, uint32 p_time) override;
private:
Unit* m_owner;
ObjectGuid m_casterGUID;
};
class RedirectSpellEvent : public BasicEvent
{
public:
-66
View File
@@ -10135,72 +10135,6 @@ uint32 ObjectMgr::GetQuestMoneyReward(uint8 level, uint32 questMoneyDifficulty)
return 0;
}
void ObjectMgr::LoadInstanceSavedGameobjectStateData()
{
uint32 oldMSTime = getMSTime();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SELECT_INSTANCE_SAVED_DATA);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (!result)
{
// There's no gameobject with this GUID saved on the DB
LOG_INFO("sql.sql", ">> Loaded 0 Instance saved gameobject state data. DB table `instance_saved_go_state_data` is empty.");
return;
}
Field* fields;
uint32 count = 0;
do
{
fields = result->Fetch();
GameobjectInstanceSavedStateList.push_back({ fields[0].Get<uint32>(), fields[1].Get<uint32>(), fields[2].Get<unsigned short>() });
count++;
} while (result->NextRow());
LOG_INFO("server.loading", ">> Loaded {} instance saved gameobject state data in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
LOG_INFO("server.loading", " ");
}
uint8 ObjectMgr::GetInstanceSavedGameobjectState(uint32 id, uint32 guid)
{
for (auto it = GameobjectInstanceSavedStateList.begin(); it != GameobjectInstanceSavedStateList.end(); it++)
{
if (it->m_guid == guid && it->m_instance == id)
{
return it->m_state;
}
}
return 3; // Any state higher than 2 to get the default state
}
bool ObjectMgr::FindInstanceSavedGameobjectState(uint32 id, uint32 guid)
{
for (auto it = GameobjectInstanceSavedStateList.begin(); it != GameobjectInstanceSavedStateList.end(); it++)
{
if (it->m_guid == guid && it->m_instance == id)
{
return true;
}
}
return false;
}
void ObjectMgr::SetInstanceSavedGameobjectState(uint32 id, uint32 guid, uint8 state)
{
for (auto it = GameobjectInstanceSavedStateList.begin(); it != GameobjectInstanceSavedStateList.end(); it++)
{
if (it->m_guid == guid && it->m_instance == id)
{
it->m_state = state;
}
}
}
void ObjectMgr::NewInstanceSavedGameobjectState(uint32 id, uint32 guid, uint8 state)
{
GameobjectInstanceSavedStateList.push_back({ id, guid, state });
}
void ObjectMgr::SendServerMail(Player* player, uint32 id, uint32 reqLevel, uint32 reqPlayTime, uint32 rewardMoneyA, uint32 rewardMoneyH, uint32 rewardItemA, uint32 rewardItemCountA, uint32 rewardItemH, uint32 rewardItemCountH, std::string subject, std::string body, uint8 active) const
{
if (active)
-6
View File
@@ -1445,12 +1445,6 @@ public:
[[nodiscard]] uint32 GetQuestMoneyReward(uint8 level, uint32 questMoneyDifficulty) const;
void SendServerMail(Player* player, uint32 id, uint32 reqLevel, uint32 reqPlayTime, uint32 rewardMoneyA, uint32 rewardMoneyH, uint32 rewardItemA, uint32 rewardItemCountA, uint32 rewardItemH, uint32 rewardItemCountH, std::string subject, std::string body, uint8 active) const;
void LoadInstanceSavedGameobjectStateData();
bool FindInstanceSavedGameobjectState(uint32 id, uint32 guid);
uint8 GetInstanceSavedGameobjectState(uint32 id, uint32 guid);
void SetInstanceSavedGameobjectState(uint32 id, uint32 guid, uint8 state);
void NewInstanceSavedGameobjectState(uint32 id, uint32 guid, uint8 state);
private:
// first free id for selected id type
uint32 _auctionId; // pussywizard: accessed by a single thread
@@ -371,10 +371,6 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData)
item2->SetState(ITEM_CHANGED, _player);
_player->ItemRemovedQuestCheck(item2->GetEntry(), count[j]);
item2->SendUpdateToPlayer(_player);
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
item2->SaveToDB(trans);
CharacterDatabase.CommitTransaction(trans);
}
}
+4 -1
View File
@@ -188,7 +188,10 @@ void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket& /*recvData*
uint8 playerLevel = GetPlayer() ? GetPlayer()->GetLevel() : 0;
data << uint8(done);
data << uint32(quest->GetRewOrReqMoney(playerLevel));
data << uint32(quest->XPValue(playerLevel));
if (!GetPlayer()->IsMaxLevel())
data << uint32(quest->XPValue(playerLevel));
else
data << uint32(0);
data << uint32(0);
data << uint32(0);
data << uint8(quest->GetRewItemsCount());
@@ -740,6 +740,26 @@ void InstanceScript::SendEncounterUnit(uint32 type, Unit* unit /*= nullptr*/, ui
instance->SendToPlayers(&data);
}
void InstanceScript::LoadInstanceSavedGameobjectStateData()
{
_objectStateMap.clear();
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SELECT_INSTANCE_SAVED_DATA);
stmt->SetData(0, instance->GetInstanceId());
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
{
Field* fields;
do
{
fields = result->Fetch();
StoreGameObjectState(fields[0].Get<uint32>(), fields[1].Get<uint8>());
} while (result->NextRow());
}
}
std::string InstanceScript::GetBossStateName(uint8 state)
{
// See enum EncounterState in InstanceScript.h
@@ -762,6 +782,18 @@ std::string InstanceScript::GetBossStateName(uint8 state)
}
}
uint8 InstanceScript::GetStoredGameObjectState(ObjectGuid::LowType spawnId) const
{
auto i = _objectStateMap.find(spawnId);
if (i != _objectStateMap.end())
{
return i->second;
}
return 3; // Any state higher than 2 to get the default state for the object we are loading.
}
bool InstanceHasScript(WorldObject const* obj, char const* scriptName)
{
if (InstanceMap* instance = obj->GetMap()->ToInstanceMap())
@@ -136,6 +136,7 @@ typedef std::pair<DoorInfoMap::const_iterator, DoorInfoMap::const_iterator> Door
typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap;
typedef std::map<uint32 /*type*/, ObjectGuid /*guid*/> ObjectGuidMap;
typedef std::map<uint32 /*entry*/, uint32 /*type*/> ObjectInfoMap;
typedef std::map<ObjectGuid::LowType /*spawnId*/, uint8 /*state*/> ObjectStateMap;
class InstanceScript : public ZoneScript
{
@@ -265,6 +266,12 @@ public:
// Allows executing code using all creatures registered in the instance script as minions
void DoForAllMinions(uint32 id, std::function<void(Creature*)> exec);
//
void StoreGameObjectState(ObjectGuid::LowType spawnId, uint8 state) { _objectStateMap[spawnId] = state; };
[[nodiscard]] uint8 GetStoredGameObjectState(ObjectGuid::LowType spawnId) const;
void LoadInstanceSavedGameobjectStateData();
TaskScheduler scheduler;
protected:
void SetHeaders(std::string const& dataHeaders);
@@ -311,6 +318,7 @@ private:
ObjectInfoMap _creatureInfo;
ObjectInfoMap _gameObjectInfo;
ObjectGuidMap _objectGuids;
ObjectStateMap _objectStateMap;
uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
std::unordered_set<uint32> _activatedAreaTriggers;
};
+2
View File
@@ -3096,6 +3096,8 @@ void InstanceMap::CreateInstanceScript(bool load, std::string data, uint32 compl
if (data != "")
instance_data->Load(data.c_str());
}
instance_data->LoadInstanceSavedGameobjectStateData();
}
/*
@@ -107,7 +107,7 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
if (i_recalculateTravel && PositionOkay(owner, target, _movingTowards ? maxTarget : Optional<float>(), angle))
{
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase)
if ((owner->HasUnitState(UNIT_STATE_CHASE_MOVE) && !target->isMoving() && !mutualChase) || _range)
{
i_recalculateTravel = false;
i_path = nullptr;
@@ -134,11 +134,11 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
}
// if the target moved, we have to consider whether to adjust
if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase)
if (!_lastTargetPosition || target->GetPosition() != _lastTargetPosition.value() || mutualChase != _mutualChase || !owner->IsWithinLOSInMap(target))
{
_lastTargetPosition = target->GetPosition();
_mutualChase = mutualChase;
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE) || !PositionOkay(owner, target, target->isMoving() ? maxTarget : maxRange, angle))
if (owner->HasUnitState(UNIT_STATE_CHASE_MOVE) || !PositionOkay(owner, target, maxTarget, angle))
{
// can we get to the target?
if (cOwner && !target->isInAccessiblePlaceFor(cOwner))
@@ -150,10 +150,10 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
}
// figure out which way we want to move
float tarX, tarY, tarZ;
target->GetPosition(tarX, tarY, tarZ);
float x, y, z;
target->GetPosition(x, y, z);
bool withinRange = owner->IsInDist(target, maxRange);
bool withinLOS = owner->IsWithinLOS(tarX, tarY, tarZ);
bool withinLOS = owner->IsWithinLOS(x, y, z);
bool moveToward = !(withinRange && withinLOS);
// make a new path if we have to...
@@ -181,14 +181,12 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
additionalRange = owner->GetExactDistSq(target) < G3D::square(speed) ? 0 : speed;
}
float x, y, z;
bool shortenPath;
// if we want to move toward the target and there's no fixed angle...
if (moveToward && !angle)
{
// ...we'll pathfind to the center, then shorten the path
target->GetPosition(x, y, z);
shortenPath = true;
}
else
@@ -214,7 +212,7 @@ bool ChaseMovementGenerator<T>::DoUpdate(T* owner, uint32 time_diff)
}
if (shortenPath)
i_path->ShortenPathUntilDist(G3D::Vector3(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()), maxTarget);
i_path->ShortenPathUntilDist(G3D::Vector3(x, y, z), maxTarget);
if (cOwner)
{
-4
View File
@@ -385,10 +385,6 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
damage += damage / 4;
}
}
// Immolate - hidden delay for conflagrate
else if (m_spellInfo->SpellFamilyFlags[0] & 0x4)
{
}
// Conflagrate - consumes Immolate or Shadowflame
else if (m_spellInfo->TargetAuraState == AURA_STATE_CONFLAGRATE)
{
+1
View File
@@ -612,6 +612,7 @@ public:
virtual void SetRealmName(std::string name) = 0;
virtual void RemoveOldCorpses() = 0;
virtual SQLQueryHolderCallback& AddQueryHolderCallback(SQLQueryHolderCallback&& callback) = 0;
virtual void DoForAllOnlinePlayers(std::function<void(Player*)> exec) = 0;
};
#endif //AZEROTHCORE_IWORLD_H
+17 -3
View File
@@ -1615,9 +1615,6 @@ void World::SetInitialWorldSettings()
LOG_INFO("server.loading", "Loading Instance Template...");
sObjectMgr->LoadInstanceTemplate();
LOG_INFO("server.loading", "Loading Instance Saved Gameobject State Data...");
sObjectMgr->LoadInstanceSavedGameobjectStateData();
LOG_INFO("server.loading", "Loading Character Cache...");
sCharacterCache->LoadCharacterCacheStorage();
@@ -3273,6 +3270,23 @@ void World::RemoveOldCorpses()
_timers[WUPDATE_CORPSES].SetCurrent(_timers[WUPDATE_CORPSES].GetInterval());
}
void World::DoForAllOnlinePlayers(std::function<void(Player*)> exec)
{
std::shared_lock lock(*HashMapHolder<Player>::GetLock());
for (auto const& it : ObjectAccessor::GetPlayers())
{
if (Player* player = it.second)
{
if (!player->IsInWorld())
{
continue;
}
exec(player);
}
}
}
bool World::IsPvPRealm() const
{
return getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP;
+2
View File
@@ -352,6 +352,8 @@ public:
void RemoveOldCorpses() override;
void DoForAllOnlinePlayers(std::function<void(Player*)> exec) override;
protected:
void _UpdateGameTime();
// callback for UpdateRealmCharacters
+3 -4
View File
@@ -290,10 +290,9 @@ public:
stmt->SetData(0, uint16(atLogin));
CharacterDatabase.Execute(stmt);
std::shared_lock<std::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
HashMapHolder<Player>::MapType const& plist = ObjectAccessor::GetPlayers();
for (auto itr = plist.begin(); itr != plist.end(); ++itr)
itr->second->SetAtLoginFlag(atLogin);
sWorld->DoForAllOnlinePlayers([&] (Player* player){
player->SetAtLoginFlag(atLogin);
});
return true;
}
@@ -23,13 +23,11 @@
#include "GridNotifiers.h"
#include "InstanceMapScript.h"
#include "InstanceScript.h"
#include "ObjectDefines.h"
#include "ObjectMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "blackrock_spire.h"
#include "GridNotifiersImpl.h"
uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUMMONER, NPC_BLACKHAND_VETERAN };
@@ -15,7 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Containers.h"
#include "CreatureScript.h"
#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
@@ -46,17 +46,17 @@ public:
case GO_DOOR_LEVER_2:
case GO_DOOR_LEVER_3:
case GO_CANNON:
gameobject->UpdateSaveToDb(true);
gameobject->AllowSaveToDB(true);
break;
case GO_FACTORY_DOOR:
gameobject->UpdateSaveToDb(true);
gameobject->AllowSaveToDB(true);
// GoState (Door opened) is restored during GO creation, but we need to set LootState to prevent Lever from closing it again
if (_encounters[TYPE_RHAHK_ZOR] == DONE)
gameobject->SetLootState(GO_ACTIVATED);
break;
case GO_IRON_CLAD_DOOR:
gameobject->UpdateSaveToDb(true);
if (gameobject->GetStateSavedOnInstance() == GO_STATE_ACTIVE)
gameobject->AllowSaveToDB(true);
if (GetStoredGameObjectState(gameobject->GetSpawnId()) == GO_STATE_ACTIVE)
{
gameobject->DespawnOrUnsummon();
}
@@ -62,7 +62,7 @@ public:
case GO_CAVE_IN_2:
case GO_WORKSHOP_DOOR:
case GO_FINAL_CHAMBER_DOOR:
gameobject->UpdateSaveToDb(true);
gameobject->AllowSaveToDB(true);
break;
}
}
@@ -18,7 +18,6 @@
#include "SpellInfo.h"
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "Unit.h"
class spell_q12779_an_end_to_all_things : public SpellScript
{
@@ -538,7 +538,7 @@ public:
void DamageTaken(Unit* /*doneBy*/, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
if (!canResurrectCheck && damage >= me->GetHealth())
if ((!canResurrectCheck || canResurrect) && damage >= me->GetHealth())
damage = me->GetHealth() - 1;
}
@@ -65,7 +65,7 @@ public:
GateKirtonosGUID = go->GetGUID();
break;
case GO_DOOR_OPENED_WITH_KEY:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
break;
case GO_GATE_GANDLING_DOWN_NORTH:
GandlingGatesGUID[0] = go->GetGUID();
@@ -178,69 +178,69 @@ public:
case GO_HALL_OF_HIGH_COMMAND:
case GO_GAUNTLET_DOOR_1:
case GO_GAUNTLET_DOOR_2:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
break;
case GO_ZIGGURAT_DOORS1:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_zigguratDoorsGUID1 = go->GetGUID();
if (GetData(TYPE_ZIGGURAT1) >= 1)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ZIGGURAT_DOORS2:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_zigguratDoorsGUID2 = go->GetGUID();
if (GetData(TYPE_ZIGGURAT2) >= 1)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ZIGGURAT_DOORS3:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_zigguratDoorsGUID3 = go->GetGUID();
if (GetData(TYPE_ZIGGURAT3) >= 1)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_GAUNTLET_GATE:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_gauntletGateGUID = go->GetGUID();
if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_SLAUGTHER_GATE:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_slaughterGateGUID = go->GetGUID();
if (_zigguratState1 == 2 && _zigguratState2 == 2 && _zigguratState3 == 2)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ZIGGURAT_DOORS4:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_zigguratDoorsGUID4 = go->GetGUID();
if (_slaughterProgress == 4)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ZIGGURAT_DOORS5:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_zigguratDoorsGUID5 = go->GetGUID();
if (_slaughterProgress == 4)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_SLAUGHTER_GATE_SIDE:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
if (_slaughterProgress >= 2)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_PORT_TRAP_GATE_1:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_trapGatesGUIDs[0] = go->GetGUID();
break;
case GO_PORT_TRAP_GATE_2:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_trapGatesGUIDs[1] = go->GetGUID();
break;
case GO_PORT_TRAP_GATE_3:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_trapGatesGUIDs[2] = go->GetGUID();
break;
case GO_PORT_TRAP_GATE_4:
go->UpdateSaveToDb(true);
go->AllowSaveToDB(true);
_trapGatesGUIDs[3] = go->GetGUID();
break;
}
@@ -23,7 +23,6 @@
#include "SpellScript.h"
#include "SpellScriptLoader.h"
#include "TaskScheduler.h"
#include "WaypointMgr.h"
#include "zulgurub.h"
enum Says
@@ -20,7 +20,6 @@ Blasted_Lands
Quest support: 3628. Teleporter to Rise of the Defiler.
*/
#include "CreatureScript.h"
#include "Group.h"
#include "Player.h"
#include "ScriptedCreature.h"
@@ -18,7 +18,6 @@
#include "CreatureScript.h"
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
/*######
## NPC 9836: Maredis Firestar
@@ -20,7 +20,6 @@
#include "Player.h"
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "ScriptedGossip.h"
/*######
## npc_ranger_lilatha
+19 -38
View File
@@ -1014,44 +1014,29 @@ class spell_midsummer_fling_torch : public SpellScript
bool handled;
bool Load() override { handled = false; return true; }
SpellCastResult CheckCast()
{
GetCaster()->GetCreaturesWithEntryInRange(_crList, 100.0f, NPC_TORCH_TARGET);
if (_crList.empty())
{
return SPELL_FAILED_NOT_HERE;
}
return SPELL_CAST_OK;
}
void ThrowNextTorch(Unit* caster)
{
uint8 rand = urand(0, _crList.size() - 1);
Position pos;
pos.Relocate(0.0f, 0.0f, 0.0f);
for (std::list<Creature*>::const_iterator itr = _crList.begin(); itr != _crList.end(); ++itr, --rand)
{
if (caster->GetDistance(*itr) < 5)
{
if (!rand)
rand++;
continue;
}
Creature* bunny = caster->FindNearestCreature(NPC_TORCH_TARGET, 100.0f);
if (!rand)
{
pos.Relocate(*itr);
break;
}
}
if (!bunny)
return;
// we have any pos
if (pos.GetPositionX())
{
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_FLING_TORCH, true);
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_TORCH_SHADOW, true);
}
// targets are located on a circle with fixed radius around the target bunny
// first target is chosen randomly anywhere on the circle
// next target is chosen on the opposite half of the circle
// so a minimum flight duration of the torch is guaranteed
float angle = 0.0f;
if (GetSpellInfo()->Id == SPELL_FLING_TORCH_DUMMY)
angle = frand(-1.0f * M_PI, 1.0f * M_PI); // full circle
else
angle = frand(-0.5f * M_PI, 0.5f * M_PI); // half circle
Position pos = bunny->GetPosition();
pos.SetOrientation(caster->GetPosition().GetAbsoluteAngle(pos));
pos.RelocatePolarOffset(angle, 8.0f); // radius is sniffed value
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_FLING_TORCH, true);
caster->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), SPELL_TORCH_SHADOW, true);
}
void HandleFinish()
@@ -1108,15 +1093,11 @@ class spell_midsummer_fling_torch : public SpellScript
void Register() override
{
AfterCast += SpellCastFn(spell_midsummer_fling_torch::HandleFinish);
OnCheckCast += SpellCheckCastFn(spell_midsummer_fling_torch::CheckCast);
if (m_scriptSpellId == SPELL_JUGGLE_TORCH)
{
OnEffectHitTarget += SpellEffectFn(spell_midsummer_fling_torch::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
}
private:
std::list<Creature*> _crList;
};
enum eJuggle
@@ -59,19 +59,12 @@ enum Misc
struct boss_high_astromancer_solarian : public BossAI
{
boss_high_astromancer_solarian(Creature* creature) : BossAI(creature, DATA_ASTROMANCER)
{
scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
}
boss_high_astromancer_solarian(Creature* creature) : BossAI(creature, DATA_ASTROMANCER) { }
void Reset() override
{
BossAI::Reset();
me->SetModelVisible(true);
_visible = true;
ScheduleHealthCheckEvent(20, [&]{
scheduler.CancelAll();
@@ -131,7 +124,6 @@ struct boss_high_astromancer_solarian : public BossAI
context.Repeat(33900ms, 48100ms);
}).Schedule(52100ms, [this](TaskContext context)
{
_visible = false;
me->SetReactState(REACT_PASSIVE);
me->SetModelVisible(false);
scheduler.DelayAll(21s);
@@ -158,7 +150,6 @@ struct boss_high_astromancer_solarian : public BossAI
});
}).Schedule(20s, [this](TaskContext)
{
_visible = true;
me->SetReactState(REACT_AGGRESSIVE);
Talk(SAY_SUMMON2);
summons.DoForAllSummons([&](WorldObject* summon)
@@ -204,7 +195,7 @@ struct boss_high_astromancer_solarian : public BossAI
scheduler.Update(diff);
if (_visible)
if (me->GetReactState() == REACT_AGGRESSIVE)
{
DoMeleeAttackIfReady();
}
@@ -223,76 +214,52 @@ struct boss_high_astromancer_solarian : public BossAI
{
return me->GetDistance2d(432.59f, -371.93f) > 105.0f;
}
private:
bool _visible;
};
class spell_astromancer_wrath_of_the_astromancer : public SpellScriptLoader
class spell_astromancer_wrath_of_the_astromancer : public AuraScript
{
public:
spell_astromancer_wrath_of_the_astromancer() : SpellScriptLoader("spell_astromancer_wrath_of_the_astromancer") { }
PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer);
class spell_astromancer_wrath_of_the_astromancer_AuraScript : public AuraScript
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
PrepareAuraScript(spell_astromancer_wrath_of_the_astromancer_AuraScript);
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
return;
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
return;
Unit* target = GetUnitOwner();
target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false);
}
Unit* target = GetUnitOwner();
target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_1].CalcValue(), false);
}
void Register() override
{
AfterEffectRemove += AuraEffectRemoveFn(spell_astromancer_wrath_of_the_astromancer_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
void Register() override
{
return new spell_astromancer_wrath_of_the_astromancer_AuraScript();
AfterEffectRemove += AuraEffectRemoveFn(spell_astromancer_wrath_of_the_astromancer::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
class spell_astromancer_solarian_transform : public SpellScriptLoader
class spell_astromancer_solarian_transform : public AuraScript
{
public:
spell_astromancer_solarian_transform() : SpellScriptLoader("spell_astromancer_solarian_transform") { }
PrepareAuraScript(spell_astromancer_solarian_transform);
class spell_astromancer_solarian_transform_AuraScript : public AuraScript
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
PrepareAuraScript(spell_astromancer_solarian_transform_AuraScript);
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, true);
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, true);
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, false);
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_astromancer_solarian_transform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_astromancer_solarian_transform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const override
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
return new spell_astromancer_solarian_transform_AuraScript();
GetUnitOwner()->HandleStatModifier(UnitMods(UNIT_MOD_ARMOR), TOTAL_PCT, 400.0f, false);
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_astromancer_solarian_transform::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
OnEffectRemove += AuraEffectRemoveFn(spell_astromancer_solarian_transform::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
}
};
void AddSC_boss_high_astromancer_solarian()
{
RegisterTheEyeAI(boss_high_astromancer_solarian);
new spell_astromancer_wrath_of_the_astromancer();
new spell_astromancer_solarian_transform();
RegisterSpellScript(spell_astromancer_wrath_of_the_astromancer);
RegisterSpellScript(spell_astromancer_solarian_transform);
}
@@ -245,49 +245,6 @@ public:
}
};
/*######
## at_sholazar_waygate
######*/
enum Waygate
{
SPELL_SHOLAZAR_TO_UNGORO_TELEPORT = 52056,
SPELL_UNGORO_TO_SHOLAZAR_TELEPORT = 52057,
AT_SHOLAZAR = 5046,
AT_UNGORO = 5047,
QUEST_THE_MAKERS_OVERLOOK = 12613,
QUEST_THE_MAKERS_PERCH = 12559,
QUEST_MEETING_A_GREAT_ONE = 13956,
};
class AreaTrigger_at_sholazar_waygate : public AreaTriggerScript
{
public:
AreaTrigger_at_sholazar_waygate() : AreaTriggerScript("at_sholazar_waygate") { }
bool OnTrigger(Player* player, AreaTrigger const* trigger) override
{
if (!player->isDead() && (player->GetQuestStatus(QUEST_MEETING_A_GREAT_ONE) != QUEST_STATUS_NONE ||
(player->GetQuestStatus(QUEST_THE_MAKERS_OVERLOOK) == QUEST_STATUS_REWARDED && player->GetQuestStatus(QUEST_THE_MAKERS_PERCH) == QUEST_STATUS_REWARDED)))
{
switch (trigger->entry)
{
case AT_SHOLAZAR:
player->CastSpell(player, SPELL_SHOLAZAR_TO_UNGORO_TELEPORT, true);
break;
case AT_UNGORO:
player->CastSpell(player, SPELL_UNGORO_TO_SHOLAZAR_TELEPORT, true);
break;
}
}
return false;
}
};
/*######
## at_nats_landing
######*/
@@ -490,7 +447,6 @@ void AddSC_areatrigger_scripts()
new AreaTrigger_at_stormwright_shelf();
new AreaTrigger_at_scent_larkorwi();
new AreaTrigger_at_last_rites();
new AreaTrigger_at_sholazar_waygate();
new AreaTrigger_at_nats_landing();
new AreaTrigger_at_sentry_point();
new AreaTrigger_at_brewfest();
+1
View File
@@ -120,6 +120,7 @@ public:
MOCK_METHOD(std::string const&, GetRealmName, (), (const));
MOCK_METHOD(void, SetRealmName, (std::string name), ());
MOCK_METHOD(void, RemoveOldCorpses, ());
MOCK_METHOD(void, DoForAllOnlinePlayers, (std::function<void(Player*)> exec));
};
#pragma GCC diagnostic pop