diff --git a/data/sql/updates/db_world/2026_02_28_00.sql b/data/sql/updates/db_world/2026_02_28_00.sql new file mode 100644 index 000000000..370b11c7b --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_00.sql @@ -0,0 +1,53 @@ +-- DB update 2026_02_27_06 -> 2026_02_28_00 +DELETE FROM `gameobject` WHERE `guid` IN (65707, 65708, 65709, 65710, 65712, 65714, 65715, 65716, 65717, 65718, 65719, 65720, 65721, 65722, 65723, 65724, 65725, 65726, 65727, 65728, 65729, 65730, 65731, 65732, 65733, 65734, 65735, 65736, 65737, 65738, 65739, 65740, 65741, 65742, 65743, 65744, 65745, 65746, 65747, 65748, 65749, 65750, 65751, 65764, 65765, 65766, 65767, 65768, 65769, 65770, 65771, 65772, 65773, 65774, 65775, 65776, 65777, 65778, 65779, 65780, 65781, 65782, 65783, 65784, 65785, 65786, 65787, 65788, 65789, 65790, 65791, 65792, 65793, 65794, 65795, 65796, 65797, 65798, 65799, 65800, 65801, 65802, 65803, 65804, 65805, 65806, 65807, 65808, 65809, 65810, 65811, 65812, 65813, 65814, 65815, 65819, 65820, 65821, 65822, 65823, 65824, 65825, 65826, 65827, 65828, 65829, 65830, 65831, 65832, 65833, 65834, 65835, 65836, 65837, 65838) AND `id` IN (181510, 181511, 181512, 181513, 181514, 181515, 181516, 181517, 181518, 181519, 181520, 181521, 181522, 181523, 181524, 181525, 181526, 181527, 181528, 181529, 181530, 181531, 181532, 181533, 181534, 181535, 181536, 181537, 181538, 181539, 181540, 181541, 181542, 181543, 181544, 181545, 181546, 181547, 181548, 181549, 181550, 181551, 181552, 181676, 181677, 181678, 181695); + +SET @OGUID := 3904; + +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID AND @OGUID+45 AND `id` IN (181510, 181511, 181512, 181513, 181514, 181515, 181516, 181517, 181518, 181519, 181520, 181521, 181522, 181523, 181524, 181525, 181526, 181527, 181528, 181529, 181530, 181531, 181532, 181533, 181534, 181535, 181536, 181537, 181538, 181539, 181540, 181541, 181542, 181543, 181544, 181545, 181546, 181547, 181548, 181549, 181550, 181551, 181552, 181676, 181677, 181678, 181695); +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 +(@OGUID+0, 181510, 533, 0, 0, 3, 1, 2787.25634765625, -3654.130126953125, 274.316619873046875, 3.534300804138183593, 0, 0, -0.98078441619873046, 0.195094630122184753, 180, 0, 1, '', 46248, NULL), +(@OGUID+1, 181511, 533, 0, 0, 3, 1, 2782.40380859375, -3660.402099609375, 274.314727783203125, 2.110888004302978515, 0, 0, 0.870119094848632812, 0.492841511964797973, 180, 0, 1, '', 46248, NULL), +(@OGUID+2, 181512, 533, 0, 0, 3, 1, 2778.4267578125, -3651.31396484375, 274.316619873046875, 3.54059600830078125, 0, 0, -0.98016548156738281, 0.198180839419364929, 180, 0, 1, '', 46248, NULL), +(@OGUID+3, 181513, 533, 0, 0, 3, 1, 2774.297607421875, -3660.6552734375, 274.316619873046875, 6.099252223968505859, 0, 0, -0.09183692932128906, 0.99577409029006958, 180, 0, 1, '', 46248, NULL), +(@OGUID+4, 181514, 533, 0, 0, 3, 1, 2757.84521484375, -3659.562255859375, 274.316619873046875, 1.971155762672424316, 0, 0, 0.833591461181640625, 0.552381455898284912, 180, 0, 1, '', 46248, NULL), +(@OGUID+5, 181515, 533, 0, 0, 3, 1, 2755.239990234375, -3649.89794921875, 274.316619873046875, 3.396841287612915039, 0, 0, -0.9918670654296875, 0.127278074622154235, 180, 0, 1, '', 46248, NULL), +(@OGUID+6, 181516, 533, 0, 0, 3, 1, 2763.548583984375, -3654.043701171875, 274.316619873046875, 3.399227857589721679, 0, 0, -0.9917144775390625, 0.128461584448814392, 180, 0, 1, '', 46248, NULL), +(@OGUID+7, 181517, 533, 0, 0, 3, 1, 2793.239013671875, -3664.1318359375, 274.316619873046875, 0.635802030563354492, 0, 0, 0.312573432922363281, 0.949893593788146972, 180, 0, 1, '', 46248, NULL), +(@OGUID+8, 181518, 533, 0, 0, 3, 1, 2802.5087890625, -3664.7255859375, 274.316619873046875, 0.635802030563354492, 0, 0, 0.312573432922363281, 0.949893593788146972, 180, 0, 1, '', 46248, NULL), +(@OGUID+9, 181519, 533, 0, 0, 3, 1, 2811.99853515625, -3671.9794921875, 274.07281494140625, 5.809873580932617187, 0, 0, -0.23445320129394531, 0.972127437591552734, 180, 0, 1, '', 46248, NULL), +(@OGUID+10, 181520, 533, 0, 0, 3, 1, 2810.5576171875, -3680.5810546875, 274.316619873046875, 3.186727762222290039, 0, 0, -0.99974536895751953, 0.022565515711903572, 180, 0, 1, '', 46248, NULL), +(@OGUID+11, 181521, 533, 0, 0, 3, 1, 2800.1474609375, -3682.7060546875, 274.351806640625, 1.03882300853729248, 0, 0, 0.496369361877441406, 0.86811143159866333, 180, 0, 1, '', 46248, NULL), +(@OGUID+12, 181522, 533, 0, 0, 3, 1, 2805.9619140625, -3691.665771484375, 274.316619873046875, 4.4343719482421875, 0, 0, -0.7982635498046875, 0.602308332920074462, 180, 0, 1, '', 46248, NULL), +(@OGUID+13, 181523, 533, 0, 0, 3, 1, 2795.81005859375, -3677.5615234375, 274.07281494140625, 2.85315251350402832, 0, 0, 0.989618301391601562, 0.143720671534538269, 180, 0, 1, '', 46248, NULL), +(@OGUID+14, 181524, 533, 0, 0, 3, 1, 2792.328125, -3684.1337890625, 274.316619873046875, 4.97615814208984375, 0, 0, -0.60797977447509765, 0.793952524662017822, 180, 0, 1, '', 46248, NULL), +(@OGUID+15, 181525, 533, 0, 0, 3, 1, 2783.360107421875, -3688.357177734375, 274.385101318359375, 3.161318778991699218, 0, 0, -0.99995136260986328, 0.009862797334790229, 180, 0, 1, '', 46248, NULL), +(@OGUID+16, 181526, 533, 0, 0, 3, 1, 2781.556884765625, -3670.999267578125, 274.351806640625, 3.153632879257202148, 0, 0, -0.99998188018798828, 0.006019935477524995, 180, 0, 1, '', 46248, NULL), +(@OGUID+17, 181527, 533, 0, 0, 3, 1, 2777.41357421875, -3677.635498046875, 274.386993408203125, 0.791340112686157226, 0, 0, 0.385426521301269531, 0.922738552093505859, 180, 0, 1, '', 46248, NULL), +(@OGUID+18, 181528, 533, 0, 0, 3, 1, 2769.25048828125, -3671.42041015625, 274.42218017578125, 5.859179019927978515, 0, 0, -0.210418701171875, 0.977611362934112548, 180, 0, 1, '', 46248, NULL), +(@OGUID+19, 181529, 533, 0, 0, 3, 1, 2763.3271484375, -3680.52783203125, 274.351806640625, 3.146377086639404296, 0, 0, -0.99999713897705078, 0.002392079913988709, 180, 0, 1, '', 46248, NULL), +(@OGUID+20, 181530, 533, 0, 0, 3, 1, 2758.16357421875, -3667.128662109375, 274.351806640625, 3.138830423355102539, 0, 0, 0.999999046325683593, 0.001381067908369004, 180, 0, 1, '', 46248, NULL), +(@OGUID+21, 181531, 533, 0, 0, 3, 1, 2749.33642578125, -3662.211181640625, 274.351806640625, 3.636870622634887695, 0, 0, -0.96949386596679687, 0.245115607976913452, 180, 0, 1, '', 46248, NULL), +(@OGUID+22, 181532, 533, 0, 0, 3, 1, 2743.090087890625, -3671.31982421875, 274.316619873046875, 2.464251995086669921, 0, 0, 0.943197250366210937, 0.332233220338821411, 180, 0, 1, '', 46248, NULL), +(@OGUID+23, 181533, 533, 0, 0, 3, 1, 2754.007568359375, -3673.76953125, 274.386993408203125, 0.791340112686157226, 0, 0, 0.385426521301269531, 0.922738552093505859, 180, 0, 1, '', 46248, NULL), +(@OGUID+24, 181534, 533, 0, 0, 3, 1, 2737.166748046875, -3675.164794921875, 274.316619873046875, 4.369650840759277343, 0, 0, -0.81733322143554687, 0.576165258884429931, 180, 0, 1, '', 46248, NULL), +(@OGUID+25, 181535, 533, 0, 0, 3, 1, 2747.133056640625, -3684.353271484375, 274.351806640625, 3.132431745529174804, 0, 0, 0.999989509582519531, 0.004580484237521886, 180, 0, 1, '', 46248, NULL), +(@OGUID+26, 181536, 533, 0, 0, 3, 1, 2740.491943359375, -3692.1279296875, 274.386993408203125, 0.792787253856658935, 0, 0, 0.386094093322753906, 0.922459423542022705, 180, 0, 1, '', 46248, NULL), +(@OGUID+27, 181537, 533, 0, 0, 3, 1, 2738.39697265625, -3703.1298828125, 274.385101318359375, 5.746106147766113281, 0, 0, -0.26532363891601562, 0.964159369468688964, 180, 0, 1, '', 46248, NULL), +(@OGUID+28, 181538, 533, 0, 0, 3, 1, 2752.92822265625, -3706.515625, 274.316619873046875, 1.047838568687438964, 0, 0, 0.500277519226074218, 0.865865111351013183, 180, 0, 1, '', 46248, NULL), +(@OGUID+29, 181539, 533, 0, 0, 3, 1, 2746.1337890625, -3700.19189453125, 274.316619873046875, 5.493281841278076171, 0, 0, -0.38476371765136718, 0.923015058040618896, 180, 0, 1, '', 46248, NULL), +(@OGUID+30, 181540, 533, 0, 0, 3, 1, 2752.925048828125, -3693.019775390625, 274.316619873046875, 4.099892139434814453, 0, 0, -0.88738727569580078, 0.461024791002273559, 180, 0, 1, '', 46248, NULL), +(@OGUID+31, 181541, 533, 0, 0, 3, 1, 2760.581787109375, -3688.3056640625, 274.386993408203125, 0.412781089544296264, 0, 0, 0.204928398132324218, 0.978776991367340087, 180, 0, 1, '', 46248, NULL), +(@OGUID+32, 181542, 533, 0, 0, 3, 1, 2764.289306640625, -3698.093505859375, 274.42218017578125, 5.49079751968383789, 0, 0, -0.3859100341796875, 0.922536432743072509, 180, 0, 1, '', 46248, NULL), +(@OGUID+33, 181543, 533, 0, 0, 3, 1, 2772.0810546875, -3692.15185546875, 274.351806640625, 5.018846035003662109, 0, 0, -0.5908966064453125, 0.806747317314147949, 180, 0, 1, '', 46248, NULL), +(@OGUID+34, 181544, 533, 0, 0, 3, 1, 2774.958740234375, -3701.132080078125, 274.316619873046875, 0.523546576499938964, 0, 0, 0.258793830871582031, 0.965932607650756835, 180, 0, 1, '', 46248, NULL), +(@OGUID+35, 181545, 533, 0, 0, 3, 1, 2772.289794921875, -3711.435302734375, 274.42218017578125, 6.022431850433349609, 0, 0, -0.13000774383544921, 0.991512954235076904, 180, 0, 1, '', 46248, NULL), +(@OGUID+36, 181546, 533, 0, 0, 3, 1, 2761.821533203125, -3711.9150390625, 274.314727783203125, 3.961472511291503906, 0, 0, -0.917144775390625, 0.398554235696792602, 180, 0, 1, '', 46248, NULL), +(@OGUID+37, 181547, 533, 0, 0, 3, 1, 2754.1904296875, -3718.12109375, 274.316619873046875, 5.370355606079101562, 0, 0, -0.44073295593261718, 0.897638261318206787, 180, 0, 1, '', 46248, NULL), +(@OGUID+38, 181548, 533, 0, 0, 3, 1, 2765.765625, -3718.734130859375, 274.316619873046875, 4.80798196792602539, 0, 0, -0.67251491546630859, 0.740083515644073486, 180, 0, 1, '', 46248, NULL), +(@OGUID+39, 181549, 533, 0, 0, 3, 1, 2776.16064453125, -3721.793212890625, 274.386993408203125, 3.937367200851440429, 0, 0, -0.92188167572021484, 0.38747146725654602, 180, 0, 1, '', 46248, NULL), +(@OGUID+40, 181550, 533, 0, 0, 3, 1, 2765.32763671875, -3728.60595703125, 274.314727783203125, 6.217946529388427734, 0, 0, -0.03261375427246093, 0.999468028545379638, 180, 0, 1, '', 46248, NULL), +(@OGUID+41, 181551, 533, 0, 0, 3, 1, 2774.989990234375, -3731.793212890625, 274.386993408203125, 3.927917003631591796, 0, 0, -0.92370223999023437, 0.383111178874969482, 180, 0, 1, '', 46248, NULL), +(@OGUID+42, 181552, 533, 0, 0, 3, 1, 2784.16943359375, -3724.729736328125, 274.385101318359375, 1.050844550132751464, 0, 0, 0.501578330993652343, 0.865112245082855224, 180, 0, 1, '', 46248, NULL), +(@OGUID+43, 181678, 533, 0, 0, 3, 1, 2802.92578125, -3675.30029296875, 273.66693115234375, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 180, 0, 1, '', 46248, NULL), +(@OGUID+44, 181678, 533, 0, 0, 3, 1, 2821.09423828125, -3691.9658203125, 275.80377197265625, 2.792518377304077148, 0, 0, 0.984807014465332031, 0.173652306199073791, 180, 0, 1, '', 46248, NULL), +(@OGUID+45, 181695, 533, 0, 0, 3, 1, 2787.39697265625, -3730.93701171875, 273.616485595703125, 1.48352813720703125, 0, 0, 0.675589561462402343, 0.737277925014495849, 180, 0, 1, '', 46248, NULL); diff --git a/data/sql/updates/db_world/2026_02_28_01.sql b/data/sql/updates/db_world/2026_02_28_01.sql new file mode 100644 index 000000000..17a739b67 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_01.sql @@ -0,0 +1,4 @@ +-- DB update 2026_02_28_00 -> 2026_02_28_01 +-- Add CheckCast script for Kill Command to prevent casting without a pet +DELETE FROM `spell_script_names` WHERE `spell_id` = 34026 AND `ScriptName` = 'spell_hun_kill_command'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (34026, 'spell_hun_kill_command'); diff --git a/data/sql/updates/db_world/2026_02_28_02.sql b/data/sql/updates/db_world/2026_02_28_02.sql new file mode 100644 index 000000000..a837c6884 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_02.sql @@ -0,0 +1,10 @@ +-- DB update 2026_02_28_01 -> 2026_02_28_02 +-- Add lfg cooldown command to the command table +DELETE FROM `command` WHERE `name` IN ('lfg cooldown'); +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('lfg cooldown', 3, 'Syntax: .lfg cooldown\nClears all LFG dungeon cooldowns for all players.'); + +-- Add acore_string for cooldown cleared message (English, German, Spanish) +DELETE FROM `acore_string` WHERE `entry` = 11019; +INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES +(11019, 'LFG dungeon cooldowns cleared for all players.', NULL, NULL, 'LFG-Dungeon-Abklingzeiten für alle Spieler zurückgesetzt.', NULL, NULL, 'Tiempos de reutilización de mazmorras LFG eliminados para todos los jugadores.', 'Tiempos de reutilización de mazmorras LFG eliminados para todos los jugadores.', NULL); diff --git a/data/sql/updates/db_world/2026_02_28_03.sql b/data/sql/updates/db_world/2026_02_28_03.sql new file mode 100644 index 000000000..8a8129f84 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_03.sql @@ -0,0 +1,55 @@ +-- DB update 2026_02_28_02 -> 2026_02_28_03 +-- Description: Fix missing damage values for various ILVL 146, 232, and 264 player weapons. +-- Reason: These items currently have 0 damage in the database, making them unusable for players. +-- Values sourced from Wowhead (Wrath Classic). + +-- Twin-Edged Stiletto (ILVL 146 Fast 1H) +UPDATE `item_template` SET `dmg_min1` = 104, `dmg_max1` = 195, `dmg_type1` = 0 WHERE `entry` = 36477; + +-- Kalu'ak Peacebringer (ILVL 146 2H) +UPDATE `item_template` SET `dmg_min1` = 106, `dmg_max1` = 198, `dmg_type1` = 0 WHERE `entry` = 38468; + +-- Yielding Bow, Horned Crossbow, Tuskarr Boomstick (ILVL 146 Ranged) +UPDATE `item_template` SET `dmg_min1` = 150, `dmg_max1` = 280, `dmg_type1` = 0 WHERE `entry` IN (36617, 36631, 36645); + +-- Serrated Maul, Moonlit Katana, Mummified Paw, Dragonflayer Hatchet (ILVL 146 Standard 1H) +UPDATE `item_template` SET `dmg_min1` = 160, `dmg_max1` = 298, `dmg_type1` = 0 WHERE `entry` IN (36491, 36519, 36561, 36575); + +-- Adorned Broadsword, Archaic Longspear, Frosted Steel Mallet, Pine Needle Staff (ILVL 146 Standard 2H/Staff) +UPDATE `item_template` SET `dmg_min1` = 320, `dmg_max1` = 481, `dmg_type1` = 0 WHERE `entry` IN (36533, 36603, 36505, 36701); + +-- Wise Dagger, Illuminated Scepter (ILVL 146 Caster 1H) +UPDATE `item_template` SET `dmg_min1` = 41, `dmg_max1` = 132, `dmg_type1` = 0 WHERE `entry` IN (36673, 36687); + +-- Shivery Wand (ILVL 146 Wand) +UPDATE `item_template` SET `dmg_min1` = 192, `dmg_max1` = 358 WHERE `entry` = 36659; + +-- Runed Shuriken (ILVL 146 Thrown) +UPDATE `item_template` SET `dmg_min1` = 136, `dmg_max1` = 253 WHERE `entry` = 36715; + +-- Furious Gladiator's Waraxe (ILVL 232 Epic PvP 2H) +UPDATE `item_template` SET `dmg_min1` = 339, `dmg_max1` = 632, `dmg_type1` = 0 WHERE `entry` = 42238; + +-- Wand of the Drowned Contessa (ILVL 264 Epic Wand) +UPDATE `item_template` SET `dmg_min1` = 583, `dmg_max1` = 1083, `dmg_type1` = 4 WHERE `entry` = 50204; + +UPDATE `item_template` SET `MaxDurability`=55, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36477; +UPDATE `item_template` SET `MaxDurability`=75, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36491; +UPDATE `item_template` SET `MaxDurability`=85, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36505; +UPDATE `item_template` SET `MaxDurability`=75, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36519; +UPDATE `item_template` SET `MaxDurability`=85, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36533; +UPDATE `item_template` SET `MaxDurability`=85, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36547; +UPDATE `item_template` SET `MaxDurability`=75, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36575; +UPDATE `item_template` SET `MaxDurability`=85, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36589; +UPDATE `item_template` SET `MaxDurability`=85, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36603; +UPDATE `item_template` SET `MaxDurability`=65, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36617; +UPDATE `item_template` SET `MaxDurability`=65, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36631; +UPDATE `item_template` SET `MaxDurability`=65, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36645; +UPDATE `item_template` SET `MaxDurability`=55, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36659; +UPDATE `item_template` SET `MaxDurability`=55, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36673; +UPDATE `item_template` SET `MaxDurability`=75, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36687; +UPDATE `item_template` SET `MaxDurability`=85, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36701; +UPDATE `item_template` SET `MaxDurability`=0, `DisenchantID`=15, `RequiredDisenchantSkill`=325 WHERE `entry`=36715; + +UPDATE `item_template` SET `MaxDurability`=105 WHERE `entry`=42238; +UPDATE `item_template` SET `MaxDurability`=75, `DisenchantID`=68, `RequiredDisenchantSkill`=375 WHERE `entry`=50204; diff --git a/data/sql/updates/db_world/2026_02_28_04.sql b/data/sql/updates/db_world/2026_02_28_04.sql new file mode 100644 index 000000000..aacca6371 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_04.sql @@ -0,0 +1,12 @@ +-- DB update 2026_02_28_03 -> 2026_02_28_04 +-- Cold Blood: Bind AuraScript to prevent charge consumption on Mutilate MH/OH, +-- so both sub-spells get the guaranteed crit. +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_rog_cold_blood'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(14177, 'spell_rog_cold_blood'); + +-- Mutilate (parent): remove Cold Blood in AfterCast after both sub-spells +-- have executed their crit rolls. Negative spell_id covers all ranks. +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_rog_mutilate', 'spell_rog_mutilate_strike'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-1329, 'spell_rog_mutilate'); diff --git a/data/sql/updates/db_world/2026_02_28_05.sql b/data/sql/updates/db_world/2026_02_28_05.sql new file mode 100644 index 000000000..61699e478 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_05.sql @@ -0,0 +1,106 @@ +-- DB update 2026_02_28_04 -> 2026_02_28_05 +-- Add new sniffed Waypoints +DELETE FROM `waypoint_data` WHERE `id` IN (13679000, 13678900, 13679900, 13681200, 13679200, 13680600, 13679100, 13679400, 13645300, 13724500); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(13679000, 1, -397.09332, -135.07883, 412.88715, NULL, 0, 0, 0, 100, 0), -- Runeforged Sentry +(13679000, 2, -384.96094, -134.40718, 412.88715, NULL, 0, 0, 0, 100, 0), +(13679000, 3, -397.09332, -135.07883, 412.88715, NULL, 0, 0, 0, 100, 0), +(13679000, 4, -410.16763, -135.7386, 412.88715, NULL, 0, 0, 0, 100, 0), +(13679000, 5, -413.62393, -136.59538, 412.88715, NULL, 0, 0, 0, 100, 0), +(13678900, 1, -355.61935, 59.24794, 412.58917, NULL, 0, 0, 0, 100, 0), +(13678900, 2, -373.42014, 78.33971, 409.944, NULL, 0, 0, 0, 100, 0), +(13678900, 3, -355.69727, 59.347656, 412.53824, NULL, 0, 0, 0, 100, 0), +(13678900, 4, -338.53265, 53.46582, 409.80682, NULL, 0, 0, 0, 100, 0), +(13678900, 5, -322.73795, 51.511013, 409.82108, NULL, 0, 0, 0, 100, 0), +(13678900, 6, -338.53265, 53.46582, 409.80682, NULL, 0, 0, 0, 100, 0), +(13679900, 1, -144.03645, 114.46617, 435.63452, NULL, 0, 0, 0, 100, 0), +(13679900, 2, -129.11014, 130.29802, 433.0258, NULL, 0, 0, 0, 100, 0), +(13679900, 3, -110.88683, 134.8089, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679900, 4, -93.60569, 136.15213, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679900, 5, -110.88683, 134.8089, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679900, 6, -129.11014, 130.29802, 433.0258, NULL, 0, 0, 0, 100, 0), +(13681200, 1, -140.95909, 175.11192, 432.7893, NULL, 0, 0, 0, 100, 0), +(13681200, 2, -162.11394, 172.80434, 432.7893, NULL, 0, 0, 0, 100, 0), +(13681200, 3, -192.95595, 174.20947, 433.90576, NULL, 0, 0, 0, 100, 0), +(13681200, 4, -162.11394, 172.80434, 432.7893, NULL, 0, 0, 0, 100, 0), +(13681200, 5, -140.95909, 175.11192, 432.7893, NULL, 0, 0, 0, 100, 0), +(13681200, 6, -118.73817, 178.98703, 432.7893, NULL, 0, 0, 0, 100, 0), +(13681200, 7, -105.92177, 188.57094, 432.7893, NULL, 0, 0, 0, 100, 0), +(13681200, 8, -118.73817, 178.98703, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679200, 1, -71.88639, 135.4598, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679200, 2, -45.833225, 137.6703, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679200, 3, -28.061523, 128.09358, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679200, 4, -19.924696, 111.42294, 434.43588, NULL, 0, 0, 0, 100, 0), +(13679200, 5, -17.379015, 97.794136, 435.72275, NULL, 0, 0, 0, 100, 0), +(13679200, 6, -19.924696, 111.42294, 434.43588, NULL, 0, 0, 0, 100, 0), +(13679200, 7, -28.061523, 128.09358, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679200, 8, -45.833225, 137.6703, 432.7893, NULL, 0, 0, 0, 100, 0), +(13680600, 1, -45.876087, 202.42575, 432.93832, NULL, 0, 0, 0, 100, 0), +(13680600, 2, -34.05675, 182.35219, 432.7893, NULL, 0, 0, 0, 100, 0), +(13680600, 3, -9.96582, 174.6027, 432.7893, NULL, 0, 0, 0, 100, 0), +(13680600, 4, 14.277561, 173.71742, 432.8126, NULL, 0, 0, 0, 100, 0), +(13680600, 5, -9.96582, 174.6027, 432.7893, NULL, 0, 0, 0, 100, 0), +(13680600, 6, -34.05675, 182.35219, 432.7893, NULL, 0, 0, 0, 100, 0), +(13679100, 1, 306.22174, 321.01862, 409.8037, NULL, 0, 0, 0, 100, 0), +(13679100, 2, 296.98965, 321.7921, 409.80396, NULL, 0, 0, 0, 100, 0), +(13679100, 3, 284.90234, 339.82883, 410.01184, NULL, 0, 0, 0, 100, 0), +(13679100, 4, 281.30573, 357.29932, 410.59863, NULL, 0, 0, 0, 100, 0), +(13679100, 5, 284.90234, 339.82883, 410.01184, NULL, 0, 0, 0, 100, 0), +(13679100, 6, 296.98965, 321.7921, 409.80396, NULL, 0, 0, 0, 100, 0), +(13679400, 1, 298.1935, 259.8495, 409.8037, NULL, 0, 0, 0, 100, 0), +(13679400, 2, 297.61166, 273.3974, 409.92993, NULL, 0, 0, 0, 100, 0), +(13679400, 3, 298.51367, 297.1452, 409.8037, NULL, 0, 0, 0, 100, 0), +(13679400, 4, 310.354, 306.74454, 409.8037, NULL, 0, 0, 0, 100, 0), +(13679400, 5, 298.51367, 297.1452, 409.8037, NULL, 0, 0, 0, 100, 0), +(13679400, 6, 297.61166, 273.3974, 409.92993, NULL, 0, 0, 0, 100, 0), +(13645300, 1, -184.60808, 145.2893, 432.7893, NULL, 0, 0, 0, 100, 0), -- Mechagnome Battletank +(13645300, 2, -150.36296, 148.76291, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 3, -117.89204, 152.05273, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 4, -90.19998, 150.10034, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 5, -43.497288, 152.73245, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 6, -19.35243, 149.0761, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 7, -43.497288, 152.73245, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 8, -90.19998, 150.10034, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 9, -117.89204, 152.05273, 432.7893, NULL, 0, 0, 0, 100, 0), +(13645300, 10, -150.36296, 148.76291, 432.7893, NULL, 0, 0, 0, 100, 0), +(13724500, 1, -252.19054, 26.090767, 409.80365, NULL, 0, 0, 0, 100, 0), -- Steelforged Defender +(13724500, 2, -248.88693, 1.644477, 409.8046, NULL, 0, 0, 0, 100, 0), +(13724500, 3, -249.75499, -46.826714, 409.80362, NULL, 0, 0, 0, 100, 0), +(13724500, 4, -249.17415, -62.65777, 409.80362, NULL, 0, 0, 0, 100, 0), +(13724500, 5, -250.00739, -92.36046, 409.8036, NULL, 0, 0, 0, 100, 0), +(13724500, 6, -250.54742, -106.32905, 409.80362, NULL, 0, 0, 0, 100, 0), +(13724500, 7, -250.00739, -92.36046, 409.8036, NULL, 0, 0, 0, 100, 0), +(13724500, 8, -249.17415, -62.65777, 409.80362, NULL, 0, 0, 0, 100, 0), +(13724500, 9, -249.75499, -46.826714, 409.80362, NULL, 0, 0, 0, 100, 0), +(13724500, 10, -250.02821, -26.687283, 409.80362, NULL, 0, 0, 0, 100, 0), +(13724500, 11, -248.88693, 1.644477, 409.8046, NULL, 0, 0, 0, 100, 0); + +-- Set MT, WD (Mechagnome Battletank, Runeforged Sentry & Steelforged Defenders) +UPDATE `creature` SET `MovementType` = 2 WHERE (`guid` IN (136790, 136789, 136799, 136812, 136792, 136806, 136791, 136794)) AND (`id1` = 34234); +UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 0 WHERE (`id1` = 33236) AND (`guid` IN (137244, 137246, 137247, 137248, 137249, 137250, 137251)); +UPDATE `creature` SET `MovementType` = 2 WHERE (`guid` IN (136453)) AND (`id1` = 34164); +UPDATE `creature` SET `wander_distance` = 0, `MovementType` = 2 WHERE (`id1` = 33236) AND (`guid` IN (137245)); + +-- Add Waypoints (Mechagnome Battletank, Runeforged Sentry, Steelforged Defender) +UPDATE `creature_addon` SET `path_id` = 13679000 WHERE (`guid` = 136790); +UPDATE `creature_addon` SET `path_id` = 13678900 WHERE (`guid` = 136789); +UPDATE `creature_addon` SET `path_id` = 13679900 WHERE (`guid` = 136799); +UPDATE `creature_addon` SET `path_id` = 13681200 WHERE (`guid` = 136812); +UPDATE `creature_addon` SET `path_id` = 13679200 WHERE (`guid` = 136792); +UPDATE `creature_addon` SET `path_id` = 13680600 WHERE (`guid` = 136806); +UPDATE `creature_addon` SET `path_id` = 13679100 WHERE (`guid` = 136791); +UPDATE `creature_addon` SET `path_id` = 13679400 WHERE (`guid` = 136794); +UPDATE `creature_addon` SET `path_id` = 13645300 WHERE (`guid` = 136453); +UPDATE `creature_addon` SET `path_id` = 13724500 WHERE (`guid` = 137245); + +-- Add Formation for a group of Steelforged Defenders +DELETE FROM `creature_formations` WHERE (`LeaderGUID` IN (137245)); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(137245, 137245, 0, 0, 512, 0, 0), +(137245, 137244, 4, 45, 512, 0, 0), +(137245, 137246, 5, 90, 512, 0, 0), +(137245, 137247, 4, 135, 512, 0, 0), +(137245, 137248, 4, 225, 512, 0, 0), +(137245, 137249, 5, 270, 512, 0, 0), +(137245, 137250, 4, 315, 512, 0, 0), +(137245, 137251, 8, 360, 512, 0, 0); diff --git a/data/sql/updates/db_world/2026_02_28_06.sql b/data/sql/updates/db_world/2026_02_28_06.sql new file mode 100644 index 000000000..1fb0eaa09 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_06.sql @@ -0,0 +1,4 @@ +-- DB update 2026_02_28_05 -> 2026_02_28_06 +DELETE FROM `spell_script_names` WHERE `spell_id` = 38132 AND `ScriptName` = 'spell_lady_vashj_tainted_core_paralyze'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(38132, 'spell_lady_vashj_tainted_core_paralyze'); diff --git a/data/sql/updates/db_world/2026_02_28_07.sql b/data/sql/updates/db_world/2026_02_28_07.sql new file mode 100644 index 000000000..0ef22ee01 --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_07.sql @@ -0,0 +1,2 @@ +-- DB update 2026_02_28_06 -> 2026_02_28_07 +UPDATE `waypoint_data` SET `move_type` = 1 WHERE `id` = 1376110; diff --git a/data/sql/updates/db_world/2026_02_28_08.sql b/data/sql/updates/db_world/2026_02_28_08.sql new file mode 100644 index 000000000..a9d6776aa --- /dev/null +++ b/data/sql/updates/db_world/2026_02_28_08.sql @@ -0,0 +1,10 @@ +-- DB update 2026_02_28_07 -> 2026_02_28_08 +-- Phase for accepting or having completed any of the "Rider of%" quests +DELETE FROM `spell_area` WHERE `spell` = 58863 AND `area` = 4520; +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(58863, 4520, 13161, 0, 0, 0, 2, 1, 74, 11), +(58863, 4520, 13162, 0, 0, 0, 2, 1, 74, 11), +(58863, 4520, 13163, 0, 0, 0, 2, 1, 74, 11); + +-- Make sure all prerequisites are completed +UPDATE `conditions` SET `ElseGroup` = 0 WHERE `SourceTypeOrReferenceId` = 19 AND `SourceEntry` IN (13161, 13162, 13163) AND `ConditionTypeOrReference` = 8 AND `ConditionValue1` IN (13146, 13147, 13160); diff --git a/data/sql/updates/db_world/2026_03_01_00.sql b/data/sql/updates/db_world/2026_03_01_00.sql new file mode 100644 index 000000000..f9dd8ec9d --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_00.sql @@ -0,0 +1,6 @@ +-- DB update 2026_02_28_09 -> 2026_03_01_00 +-- Update gameobject 'Thunder Ale' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (369)) AND (`guid` IN (55)); +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 +(55, 369, 0, 0, 0, 1, 1, -5603.8203125, -532.54766845703125, 400.622222900390625, 0.174532130360603332, 0, 0, 0.087155342102050781, 0.996194720268249511, 120, 255, 1, "", 50664, NULL); diff --git a/data/sql/updates/db_world/2026_03_01_01.sql b/data/sql/updates/db_world/2026_03_01_01.sql new file mode 100644 index 000000000..2709ac73a --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_01.sql @@ -0,0 +1,34 @@ +-- DB update 2026_03_01_00 -> 2026_03_01_01 +-- +DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 30871 AND `summonerType` = 0; +INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES +(30871, 0, 0, 192946, 571.36688232421875, -322.152252197265625, 110.5031661987304687, 2.967041015625, 0, 0, 0.996193885803222656, 0.087165042757987976, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192946, 571.5318603515625, -321.752166748046875, 110.71087646484375, 5.044002056121826171, 0, 0, -0.58070278167724609, 0.814115643501281738, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192946, 572.01220703125, -321.80621337890625, 110.50982666015625, 0.977383077144622802, 0, 0, 0.469470977783203125, 0.882947921752929687, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192947, 571.22784423828125, -322.262603759765625, 110.315338134765625, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192947, 571.47369384765625, -322.023345947265625, 110.3218536376953125, 2.356194972991943359, 0, 0, 0.923879623413085937, 0.382683247327804565, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192947, 571.64935302734375, -321.8389892578125, 110.5305023193359375, 5.654868602752685546, 0, 0, -0.30901622772216796, 0.95105677843093872, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192947, 571.791259765625, -321.695098876953125, 110.3360137939453125, 5.497788906097412109, 0, 0, -0.38268280029296875, 0.923879802227020263, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192948, 571.7279052734375, -321.826812744140625, 110.7322235107421875, 6.265733242034912109, 0, 0, -0.00872611999511718, 0.999961912631988525, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192949, 571.04620361328125, -322.154205322265625, 110.5996932983398437, 0.994837164878845214, 0, 0, 0.477158546447753906, 0.878817260265350341, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192949, 571.2098388671875, -321.93023681640625, 110.4892196655273437, 1.413715124130249023, 0, 0, 0.649447441101074218, 0.760406434535980224, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192949, 571.36309814453125, -322.44390869140625, 110.4966201782226562, 0.069811686873435974, 0, 0, 0.034898757934570312, 0.999390840530395507, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192949, 571.5906982421875, -322.227752685546875, 110.5870132446289062, 0.523597896099090576, 0, 0, 0.258818626403808593, 0.965925931930541992, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192949, 571.67779541015625, -321.490447998046875, 110.4804916381835937, 0.645771682262420654, 0, 0, 0.317304611206054687, 0.948323667049407958, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192949, 571.84161376953125, -321.62445068359375, 110.5639266967773437, 4.694936752319335937, 0, 0, -0.71325016021728515, 0.700909554958343505, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.1370849609375, -322.1729736328125, 110.51708984375, 4.398232460021972656, 0, 0, -0.80901622772216796, 0.587786316871643066, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.26519775390625, -322.011505126953125, 110.7107162475585937, 4.904376029968261718, 0, 0, -0.636077880859375, 0.771624863147735595, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.32672119140625, -322.2598876953125, 110.5653533935546875, 1.867502212524414062, 0, 0, 0.803856849670410156, 0.594822824001312255, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.37060546875, -322.31878662109375, 110.6424407958984375, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.49761962890625, -321.629119873046875, 110.730621337890625, 1.954769015312194824, 0, 0, 0.829037666320800781, 0.559192776679992675, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.55181884765625, -322.0615234375, 110.5299835205078125, 0.959929943084716796, 0, 0, 0.461748123168945312, 0.887011110782623291, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'), +(30871, 0, 0, 192950, 571.88018798828125, -321.66839599609375, 110.5022964477539062, 1.186823248863220214, 0, 0, 0.559192657470703125, 0.829037725925445556, 7200, 'Brigg Smallshanks - Quest Junk In My Trunk'); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 30871; +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 30871); +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 +(30871, 0, 0, 0, 20, 0, 100, 0, 13131, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Brigg Smallshanks - On Quest \'Junk in My Trunk\' Finished - Spawn Gameobject Group'); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceEntry` = 30871) AND (`SourceId` = 0) AND (`ConditionTypeOrReference` = 30) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 192946) AND (`ConditionValue2` = 5) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, 30871, 0, 0, 30, 1, 192946, 5, 0, 1, 0, 0, '', 'Only Spawn \'Junk in My Trunk\' Quest Reward Gameobjects if not Already Spawned'); diff --git a/data/sql/updates/db_world/2026_03_01_02.sql b/data/sql/updates/db_world/2026_03_01_02.sql new file mode 100644 index 000000000..3c5eb0f81 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_02.sql @@ -0,0 +1,7 @@ +-- DB update 2026_03_01_01 -> 2026_03_01_02 +-- Update gameobject 'Black Smoke - scale 2' with sniffed values +-- new spawns +DELETE FROM `gameobject` WHERE (`id` IN (965)) AND (`guid` IN (195, 196)); +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 +(195, 965, 0, 0, 0, 1, 1, -10295.9267578125, 73.21956634521484375, 44.2343597412109375, 0, 0, 0, 0, 1, 120, 255, 1, "", 48632, NULL), +(196, 965, 0, 0, 0, 1, 1, 263.2623291015625, -267.665374755859375, 145.0235137939453125, 4.572763919830322265, 0, 0, -0.75470924377441406, 0.656059443950653076, 120, 255, 1, "", 49822, NULL); diff --git a/data/sql/updates/db_world/2026_03_01_04.sql b/data/sql/updates/db_world/2026_03_01_04.sql new file mode 100644 index 000000000..0d7453264 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_04.sql @@ -0,0 +1,351 @@ +-- DB update 2026_03_01_03 -> 2026_03_01_04 +-- +-- Tie Wintergrasp gear vendors to arena seasons +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 23 AND `SourceGroup` IN (32294, 32296, 39172, 39173) AND `SourceEntry` IN (46057, 46058, 46059, 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46071, 46072, 46073, 46074, 46075, 46076, 46077, 46078, 46079, 46080, 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46088, 48974, 48975, 48976, 48977, 48978, 48979, 48980, 48981, 48982, 48983, 48987, 48988, 48990, 48991, 48992, 48993, 48994, 48997, 48998, 48999, 49000, 51568, 51569, 51570, 51571, 51572, 51573, 51574, 51575, 51576, 51577, 51578, 51579, 51580, 51581); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +-- Season 6 +-- Titan-Forged Chestguard of Salvation (46057) +(23,32294,46057,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chestguard of Salvation - S6'), +(23,32294,46057,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chestguard of Salvation - S7'), +(23,32294,46057,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chestguard of Salvation - S8'), +(23,32296,46057,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chestguard of Salvation - S6'), +(23,32296,46057,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chestguard of Salvation - S7'), +(23,32296,46057,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chestguard of Salvation - S8'), +-- Titan-Forged Breastplate of Triumph (46058) +(23,32294,46058,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Breastplate of Triumph - S6'), +(23,32294,46058,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Breastplate of Triumph - S7'), +(23,32294,46058,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Breastplate of Triumph - S8'), +(23,32296,46058,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Breastplate of Triumph - S6'), +(23,32296,46058,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Breastplate of Triumph - S7'), +(23,32296,46058,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Breastplate of Triumph - S8'), +-- Titan-Forged Chain Armor of Triumph (46059) +(23,32294,46059,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chain Armor of Triumph - S6'), +(23,32294,46059,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chain Armor of Triumph - S7'), +(23,32294,46059,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chain Armor of Triumph - S8'), +(23,32296,46059,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chain Armor of Triumph - S6'), +(23,32296,46059,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chain Armor of Triumph - S7'), +(23,32296,46059,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chain Armor of Triumph - S8'), +-- Titan-Forged Ringmail of Salvation (46060) +(23,32294,46060,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Ringmail of Salvation - S6'), +(23,32294,46060,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Ringmail of Salvation - S7'), +(23,32294,46060,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Ringmail of Salvation - S8'), +(23,32296,46060,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Ringmail of Salvation - S6'), +(23,32296,46060,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Ringmail of Salvation - S7'), +(23,32296,46060,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Ringmail of Salvation - S8'), +-- Titan-Forged Mail Armor of Domination (46061) +(23,32294,46061,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Mail Armor of Domination - S6'), +(23,32294,46061,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Mail Armor of Domination - S7'), +(23,32294,46061,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Mail Armor of Domination - S8'), +(23,32296,46061,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Mail Armor of Domination - S6'), +(23,32296,46061,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Mail Armor of Domination - S7'), +(23,32296,46061,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Mail Armor of Domination - S8'), +-- Titan-Forged Leather Tunic of Triumph (46062) +(23,32294,46062,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Tunic of Triumph - S6'), +(23,32294,46062,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Tunic of Triumph - S7'), +(23,32294,46062,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Tunic of Triumph - S8'), +(23,32296,46062,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Tunic of Triumph - S6'), +(23,32296,46062,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Tunic of Triumph - S7'), +(23,32296,46062,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Tunic of Triumph - S8'), +-- Titan-Forged Leather Chestguard of Salvation (46063) +(23,32294,46063,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Chestguard of Salvation - S6'), +(23,32294,46063,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Chestguard of Salvation - S7'), +(23,32294,46063,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Chestguard of Salvation - S8'), +(23,32296,46063,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Chestguard of Salvation - S6'), +(23,32296,46063,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Chestguard of Salvation - S7'), +(23,32296,46063,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Chestguard of Salvation - S8'), +-- Titan-Forged Leather Chestguard of Dominance (46064) +(23,32294,46064,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Chestguard of Dominance - S6'), +(23,32294,46064,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Chestguard of Dominance - S7'), +(23,32294,46064,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Chestguard of Dominance - S8'), +(23,32296,46064,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Chestguard of Dominance - S6'), +(23,32296,46064,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Chestguard of Dominance - S7'), +(23,32296,46064,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Chestguard of Dominance - S8'), +-- Titan-Forged Raiment of Dominance (46065) +(23,32294,46065,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Raiment of Dominance - S6'), +(23,32294,46065,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Raiment of Dominance - S7'), +(23,32294,46065,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Raiment of Dominance - S8'), +(23,32296,46065,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Raiment of Dominance - S6'), +(23,32296,46065,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Raiment of Dominance - S7'), +(23,32296,46065,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Raiment of Dominance - S8'), +-- Titan-Forged Raiment of Salvation (46066) +(23,32294,46066,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Raiment of Salvation - S6'), +(23,32294,46066,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Raiment of Salvation - S7'), +(23,32294,46066,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Raiment of Salvation - S8'), +(23,32296,46066,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Raiment of Salvation - S6'), +(23,32296,46066,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Raiment of Salvation - S7'), +(23,32296,46066,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Raiment of Salvation - S8'), +-- Titan-Forged Girdle of Salvation (46071) +(23,32294,46071,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Girdle of Salvation - S6'), +(23,32294,46071,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Girdle of Salvation - S7'), +(23,32294,46071,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Girdle of Salvation - S8'), +(23,32296,46071,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Girdle of Salvation - S6'), +(23,32296,46071,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Girdle of Salvation - S7'), +(23,32296,46071,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Girdle of Salvation - S8'), +-- Titan-Forged Girdle of Triumph (46072) +(23,32294,46072,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Girdle of Triumph - S6'), +(23,32294,46072,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Girdle of Triumph - S7'), +(23,32294,46072,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Girdle of Triumph - S8'), +(23,32296,46072,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Girdle of Triumph - S6'), +(23,32296,46072,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Girdle of Triumph - S7'), +(23,32296,46072,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Girdle of Triumph - S8'), +-- Titan-Forged Waistguard of Dominance (46073) +(23,32294,46073,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Dominance - S6'), +(23,32294,46073,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Dominance - S7'), +(23,32294,46073,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Dominance - S8'), +(23,32296,46073,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Dominance - S6'), +(23,32296,46073,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Dominance - S7'), +(23,32296,46073,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Dominance - S8'), +-- Titan-Forged Waistguard of Salvation (46074) +(23,32294,46074,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Salvation - S6'), +(23,32294,46074,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Salvation - S7'), +(23,32294,46074,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Salvation - S8'), +(23,32296,46074,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Salvation - S6'), +(23,32296,46074,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Salvation - S7'), +(23,32296,46074,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Salvation - S8'), +-- Titan-Forged Waistguard of Triumph (46075) +(23,32294,46075,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Triumph - S6'), +(23,32294,46075,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Triumph - S7'), +(23,32294,46075,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Waistguard of Triumph - S8'), +(23,32296,46075,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Triumph - S6'), +(23,32296,46075,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Triumph - S7'), +(23,32296,46075,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Waistguard of Triumph - S8'), +-- Titan-Forged Belt of Dominance (46076) +(23,32294,46076,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Dominance - S6'), +(23,32294,46076,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Dominance - S7'), +(23,32294,46076,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Dominance - S8'), +(23,32296,46076,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Dominance - S6'), +(23,32296,46076,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Dominance - S7'), +(23,32296,46076,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Dominance - S8'), +-- Titan-Forged Belt of Salvation (46077) +(23,32294,46077,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Salvation - S6'), +(23,32294,46077,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Salvation - S7'), +(23,32294,46077,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Salvation - S8'), +(23,32296,46077,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Salvation - S6'), +(23,32296,46077,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Salvation - S7'), +(23,32296,46077,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Salvation - S8'), +-- Titan-Forged Belt of Triumph (46078) +(23,32294,46078,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Triumph - S6'), +(23,32294,46078,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Triumph - S7'), +(23,32294,46078,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Belt of Triumph - S8'), +(23,32296,46078,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Triumph - S6'), +(23,32296,46078,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Triumph - S7'), +(23,32296,46078,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Belt of Triumph - S8'), +-- Titan-Forged Cord of Dominance (46079) +(23,32294,46079,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cord of Dominance - S6'), +(23,32294,46079,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cord of Dominance - S7'), +(23,32294,46079,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cord of Dominance - S8'), +(23,32296,46079,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cord of Dominance - S6'), +(23,32296,46079,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cord of Dominance - S7'), +(23,32296,46079,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cord of Dominance - S8'), +-- Titan-Forged Cord of Salvation (46080) +(23,32294,46080,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cord of Salvation - S6'), +(23,32294,46080,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cord of Salvation - S7'), +(23,32294,46080,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cord of Salvation - S8'), +(23,32296,46080,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cord of Salvation - S6'), +(23,32296,46080,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cord of Salvation - S7'), +(23,32296,46080,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cord of Salvation - S8'), +-- Titan-Forged Rune of Audacity (46081) +(23,32294,46081,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Audacity - S6'), +(23,32294,46081,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Audacity - S7'), +(23,32294,46081,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Audacity - S8'), +(23,32296,46081,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Audacity - S6'), +(23,32296,46081,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Audacity - S7'), +(23,32296,46081,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Audacity - S8'), +-- Titan-Forged Rune of Determination (46082) +(23,32294,46082,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Determination - S6'), +(23,32294,46082,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Determination - S7'), +(23,32294,46082,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Determination - S8'), +(23,32296,46082,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Determination - S6'), +(23,32296,46082,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Determination - S7'), +(23,32296,46082,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Determination - S8'), +-- Titan-Forged Rune of Accuracy (46083) +(23,32294,46083,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Accuracy - S6'), +(23,32294,46083,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Accuracy - S7'), +(23,32294,46083,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Accuracy - S8'), +(23,32296,46083,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Accuracy - S6'), +(23,32296,46083,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Accuracy - S7'), +(23,32296,46083,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Accuracy - S8'), +-- Titan-Forged Rune of Cruelty (46084) +(23,32294,46084,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Cruelty - S6'), +(23,32294,46084,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Cruelty - S7'), +(23,32294,46084,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Cruelty - S8'), +(23,32296,46084,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Cruelty - S6'), +(23,32296,46084,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Cruelty - S7'), +(23,32296,46084,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Cruelty - S8'), +-- Titan-Forged Rune of Alacrity (46085) +(23,32294,46085,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Alacrity - S6'), +(23,32294,46085,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Alacrity - S7'), +(23,32294,46085,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Rune of Alacrity - S8'), +(23,32296,46085,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Alacrity - S6'), +(23,32296,46085,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Alacrity - S7'), +(23,32296,46085,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Rune of Alacrity - S8'), +-- Platinum Disks of Battle (46086) +(23,32294,46086,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Battle - S6'), +(23,32294,46086,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Battle - S7'), +(23,32294,46086,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Battle - S8'), +(23,32296,46086,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Battle - S6'), +(23,32296,46086,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Battle - S7'), +(23,32296,46086,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Battle - S8'), +-- Platinum Disks of Sorcery (46087) +(23,32294,46087,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Sorcery - S6'), +(23,32294,46087,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Sorcery - S7'), +(23,32294,46087,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Sorcery - S8'), +(23,32296,46087,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Sorcery - S6'), +(23,32296,46087,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Sorcery - S7'), +(23,32296,46087,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Sorcery - S8'), +-- Platinum Disks of Swiftness (46088) +(23,32294,46088,0,0,12,0,58,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Swiftness - S6'), +(23,32294,46088,0,1,12,0,59,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Swiftness - S7'), +(23,32294,46088,0,2,12,0,60,0,0,0,0,0,'','Knight Dameron - Platinum Disks of Swiftness - S8'), +(23,32296,46088,0,0,12,0,58,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Swiftness - S6'), +(23,32296,46088,0,1,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Swiftness - S7'), +(23,32296,46088,0,2,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Platinum Disks of Swiftness - S8'), +-- Season 7 +-- Titan-Forged Armwraps of Dominance (48974) +(23,32294,48974,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Armwraps of Dominance - S7'), +(23,32294,48974,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Armwraps of Dominance - S8'), +(23,32296,48974,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Armwraps of Dominance - S7'), +(23,32296,48974,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Armwraps of Dominance - S8'), +-- Titan-Forged Armwraps of Salvation (48975) +(23,32294,48975,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Armwraps of Salvation - S7'), +(23,32294,48975,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Armwraps of Salvation - S8'), +(23,32296,48975,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Armwraps of Salvation - S7'), +(23,32296,48975,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Armwraps of Salvation - S8'), +-- Titan-Forged Armwraps of Triumph (48976) +(23,32294,48976,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Armwraps of Triumph - S7'), +(23,32294,48976,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Armwraps of Triumph - S8'), +(23,32296,48976,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Armwraps of Triumph - S7'), +(23,32296,48976,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Armwraps of Triumph - S8'), +-- Titan-Forged Bracers of Salvation (48977) +(23,32294,48977,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Bracers of Salvation - S7'), +(23,32294,48977,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Bracers of Salvation - S8'), +(23,32296,48977,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Bracers of Salvation - S7'), +(23,32296,48977,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Bracers of Salvation - S8'), +-- Titan-Forged Bracers of Triumph (48978) +(23,32294,48978,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Bracers of Triumph - S7'), +(23,32294,48978,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Bracers of Triumph - S8'), +(23,32296,48978,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Bracers of Triumph - S7'), +(23,32296,48978,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Bracers of Triumph - S8'), +-- Titan-Forged Cuffs of Salvation (48979) +(23,32294,48979,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cuffs of Salvation - S7'), +(23,32294,48979,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cuffs of Salvation - S8'), +(23,32296,48979,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cuffs of Salvation - S7'), +(23,32296,48979,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cuffs of Salvation - S8'), +-- Titan-Forged Wristguards of Dominance (48980) +(23,32294,48980,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Wristguards of Dominance - S7'), +(23,32294,48980,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Wristguards of Dominance - S8'), +(23,32296,48980,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Wristguards of Dominance - S7'), +(23,32296,48980,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Wristguards of Dominance - S8'), +-- Titan-Forged Wristguards of Salvation (48981) +(23,32294,48981,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Wristguards of Salvation - S7'), +(23,32294,48981,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Wristguards of Salvation - S8'), +(23,32296,48981,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Wristguards of Salvation - S7'), +(23,32296,48981,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Wristguards of Salvation - S8'), +-- Titan-Forged Wristguards of Triumph (48982) +(23,32294,48982,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Wristguards of Triumph - S7'), +(23,32294,48982,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Wristguards of Triumph - S8'), +(23,32296,48982,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Wristguards of Triumph - S7'), +(23,32296,48982,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Wristguards of Triumph - S8'), +-- Titan-Forged Chain Leggings of Triumph (48983) +(23,32294,48983,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chain Leggings of Triumph - S7'), +(23,32294,48983,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Chain Leggings of Triumph - S8'), +(23,32296,48983,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chain Leggings of Triumph - S7'), +(23,32296,48983,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Chain Leggings of Triumph - S8'), +-- Titan-Forged Leather Legguards of Salvation (48987) +(23,32294,48987,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Legguards of Salvation - S7'), +(23,32294,48987,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Legguards of Salvation - S8'), +(23,32296,48987,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Legguards of Salvation - S7'), +(23,32296,48987,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Legguards of Salvation - S8'), +-- Titan-Forged Leather Legguards of Triumph (48988) +(23,32294,48988,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Legguards of Triumph - S7'), +(23,32294,48988,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Legguards of Triumph - S8'), +(23,32296,48988,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Legguards of Triumph - S7'), +(23,32296,48988,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Legguards of Triumph - S8'), +-- Titan-Forged Mail Leggings of Dominance (48990) +(23,32294,48990,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Mail Leggings of Dominance - S7'), +(23,32294,48990,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Mail Leggings of Dominance - S8'), +(23,32296,48990,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Mail Leggings of Dominance - S7'), +(23,32296,48990,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Mail Leggings of Dominance - S8'), +-- Titan-Forged Cloth Leggings of Salvation (48991) +(23,32294,48991,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cloth Leggings of Salvation - S7'), +(23,32294,48991,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cloth Leggings of Salvation - S8'), +(23,32296,48991,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cloth Leggings of Salvation - S7'), +(23,32296,48991,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cloth Leggings of Salvation - S8'), +-- Titan-Forged Plate Legguards of Salvation (48992) +(23,32294,48992,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Plate Legguards of Salvation - S7'), +(23,32294,48992,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Plate Legguards of Salvation - S8'), +(23,32296,48992,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Plate Legguards of Salvation - S7'), +(23,32296,48992,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Plate Legguards of Salvation - S8'), +-- Titan-Forged Plate Legguards of Triumph (48993) +(23,32294,48993,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Plate Legguards of Triumph - S7'), +(23,32294,48993,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Plate Legguards of Triumph - S8'), +(23,32296,48993,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Plate Legguards of Triumph - S7'), +(23,32296,48993,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Plate Legguards of Triumph - S8'), +-- Titan-Forged Ringmail Leggings of Salvation (48994) +(23,32294,48994,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Ringmail Leggings of Salvation - S7'), +(23,32294,48994,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Ringmail Leggings of Salvation - S8'), +(23,32296,48994,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Ringmail Leggings of Salvation - S7'), +(23,32296,48994,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Ringmail Leggings of Salvation - S8'), +-- Titan-Forged Cloth Trousers of Domination (48997) +(23,32294,48997,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cloth Trousers of Domination - S7'), +(23,32294,48997,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Cloth Trousers of Domination - S8'), +(23,32296,48997,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cloth Trousers of Domination - S7'), +(23,32296,48997,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Cloth Trousers of Domination - S8'), +-- Titan-Forged Leather Legguards of Dominance (48998) +(23,32294,48998,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Legguards of Dominance - S7'), +(23,32294,48998,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Leather Legguards of Dominance - S8'), +(23,32296,48998,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Legguards of Dominance - S7'), +(23,32296,48998,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Leather Legguards of Dominance - S8'), +-- Titan-Forged Band of Ascendancy (48999) +(23,32294,48999,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Band of Ascendancy - S7'), +(23,32294,48999,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Band of Ascendancy - S8'), +(23,32296,48999,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Band of Ascendancy - S7'), +(23,32296,48999,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Band of Ascendancy - S8'), +-- Titan-Forged Band of Victory (49000) +(23,32294,49000,0,0,12,0,59,0,0,0,0,0,'','Knight Dameron - Titan-Forged Band of Victory - S7'), +(23,32294,49000,0,1,12,0,60,0,0,0,0,0,'','Knight Dameron - Titan-Forged Band of Victory - S8'), +(23,32296,49000,0,0,12,0,59,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Band of Victory - S7'), +(23,32296,49000,0,1,12,0,60,0,0,0,0,0,'','Stone Guard Mukar - Titan-Forged Band of Victory - S8'), +-- Season 8 +-- Titan-Forged Pendant of Ascendancy (51568) +(23,39172,51568,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Pendant of Ascendancy - S8'), +(23,39173,51568,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Pendant of Ascendancy - S8'), +-- Titan-Forged Pendant of Victory (51569) +(23,39172,51569,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Pendant of Victory - S8'), +(23,39173,51569,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Pendant of Victory - S8'), +-- Titan-Forged Cloak of Ascendancy (51570) +(23,39172,51570,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Cloak of Ascendancy - S8'), +(23,39173,51570,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Cloak of Ascendancy - S8'), +-- Titan-Forged Cloak of Victory (51571) +(23,39172,51571,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Cloak of Victory - S8'), +(23,39173,51571,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Cloak of Victory - S8'), +-- Titan-Forged Shoulderpads of Salvation (51572) +(23,39172,51572,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulderpads of Salvation - S8'), +(23,39173,51572,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulderpads of Salvation - S8'), +-- Titan-Forged Shoulderpads of Domination (51573) +(23,39172,51573,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulderpads of Domination - S8'), +(23,39173,51573,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulderpads of Domination - S8'), +-- Titan-Forged Spaulders of Dominance (51574) +(23,39172,51574,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Spaulders of Dominance - S8'), +(23,39173,51574,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Spaulders of Dominance - S8'), +-- Titan-Forged Spaulders of Salvation (51575) +(23,39172,51575,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Spaulders of Salvation - S8'), +(23,39173,51575,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Spaulders of Salvation - S8'), +-- Titan-Forged Spaulders of Triumph (51576) +(23,39172,51576,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Spaulders of Triumph - S8'), +(23,39173,51576,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Spaulders of Triumph - S8'), +-- Titan-Forged Shoulders Triumph (51577) +(23,39172,51577,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulders Triumph - S8'), +(23,39173,51577,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulders Triumph - S8'), +-- Titan-Forged Shoulders of Dominance (51578) +(23,39172,51578,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulders of Dominance - S8'), +(23,39173,51578,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulders of Dominance - S8'), +-- Titan-Forged Shoulders of Salvation (51579) +(23,39172,51579,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulders of Salvation - S8'), +(23,39173,51579,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulders of Salvation - S8'), +-- Titan-Forged Shoulderplates of Triumph (51580) +(23,39172,51580,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulderplates of Triumph - S8'), +(23,39173,51580,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulderplates of Triumph - S8'), +-- Titan-Forged Shoulderplates of Salvation (51581) +(23,39172,51581,0,0,12,0,60,0,0,0,0,0,'','Marshal Magruder - Titan-Forged Shoulderplates of Salvation - S8'), +(23,39173,51581,0,0,12,0,60,0,0,0,0,0,'','Champion Ros''slai - Titan-Forged Shoulderplates of Salvation - S8'); diff --git a/data/sql/updates/db_world/2026_03_01_05.sql b/data/sql/updates/db_world/2026_03_01_05.sql new file mode 100644 index 000000000..138704328 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_05.sql @@ -0,0 +1,19 @@ +-- DB update 2026_03_01_04 -> 2026_03_01_05 +-- +DELETE FROM `creature_summon_groups` WHERE `summonerId` = 1557 AND `summonerType` = 1; +INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES +(1557, 1, 0, 1946, 2471.2383, 15.430718, 24.04098, 0.22952774167060852, 4, 30000, 'Lillith\'s Dinner Table - Lillith Nefara'); + +DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 1557 AND `summonerType` = 1; +INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES +(1557, 1, 0, 1558, 2485.39306640625, 22.17523956298828125, 27.59094619750976562, 4.206246376037597656, 0, 0, -0.86162853240966796, 0.50753939151763916, 120, 'Lillith\'s Dinner Table - Candle of Beckoning'); + +DELETE FROM `smart_scripts` WHERE (`source_type` = 1 AND `entryorguid` = 1557); +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 +(1557, 1, 0, 0, 20, 0, 100, 0, 410, 0, 0, 0, 0, 0, 107, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lillith\'s Dinner Table - On Quest \'The Dormant Shade\' Finished - Summon Creature \'Lillith Nefara\''), +(1557, 1, 1, 0, 20, 0, 100, 0, 410, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Lillith\'s Dinner Table - On Quest \'The Dormant Shade\' Finished - Summon Gameobject \'Candle of Beckoning\''); + +UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 1946; +DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 1946); +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 +(1946, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 'Lillith Nefara - On Aggro - Say Line'); diff --git a/data/sql/updates/db_world/2026_03_01_06.sql b/data/sql/updates/db_world/2026_03_01_06.sql new file mode 100644 index 000000000..e2791cee1 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_06.sql @@ -0,0 +1,7 @@ +-- DB update 2026_03_01_05 -> 2026_03_01_06 +-- Seal of Light (20165): Fix PPM 20 -> 10 +UPDATE `spell_proc` SET `ProcsPerMinute` = 10 WHERE `SpellId` = 20165; + +-- Flame Cap (28714): Add 6 PPM (was 100% with no spell_proc entry) +DELETE FROM `spell_proc` WHERE `SpellId` = 28714; +INSERT INTO `spell_proc` (`SpellId`, `ProcsPerMinute`, `SpellTypeMask`, `SpellPhaseMask`) VALUES (28714, 6, 1, 2); diff --git a/data/sql/updates/db_world/2026_03_01_07.sql b/data/sql/updates/db_world/2026_03_01_07.sql new file mode 100644 index 000000000..656ab8e63 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_01_07.sql @@ -0,0 +1,10 @@ +-- DB update 2026_03_01_06 -> 2026_03_01_07 +-- Fix Missile Barrage / Clearcasting proc interaction with Arcane Missiles +-- 1) PROC_ATTR_REQ_SPELLMOD was incorrectly blocking Missile Barrage from +-- proccing because the channel spell (42846) is not in m_appliedMods. +-- Restrict via SpellFamilyMask to Arcane Missiles (0x800) instead. +-- 2) Register Clearcasting script to give Missile Barrage priority +UPDATE `spell_proc` SET `AttributesMask` = 0, `SpellFamilyMask0` = 0x800 WHERE `SpellId` = 44401; + +DELETE FROM `spell_script_names` WHERE `spell_id` = 12536 AND `ScriptName` = 'spell_mage_clearcasting'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (12536, 'spell_mage_clearcasting'); diff --git a/data/sql/updates/db_world/2026_03_02_00.sql b/data/sql/updates/db_world/2026_03_02_00.sql new file mode 100644 index 000000000..4a69484f0 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_02_00.sql @@ -0,0 +1,1183 @@ +-- DB update 2026_03_01_07 -> 2026_03_02_00 + +-- Remove c++ script. +UPDATE `creature_template` SET `ScriptName` = '' WHERE `entry` = 33214; + +-- Remove old waypoints +DELETE FROM `waypoint_data` WHERE `id` BETWEEN 3000000 AND 3000011; + +-- Set new waypoints (sniffed and cleaned). +DELETE FROM `waypoint_data` WHERE `id` IN (13681700, 13681800, 13682000, 13682100, 13682300, 13682700, 13683000, 13683100, 13685300, 13686200, 13686800, 13687000, 13688500, 13682101, 13682102, 13682103, 13682104, 13682105, 13682106, 13682107, 13682108, 13682109, 13682110, 13681801, 13681802, 13681803, 13681804, 13681805, 13681806, 13681807, 13681808, 13681809, 13681810, 13681811, 13681812, 13681813, 13681814, 13681815, 13681816, 13681817, 13681818); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(13681700, 1, -275.35678, -7.686849, 485.66647, NULL, 0, 1, 0, 100, 0), +(13681700, 2, -432.38422, 3.62934, 482.49963, NULL, 0, 1, 0, 100, 0), +(13681700, 3, -503.5546, -5.098361, 482.49963, NULL, 0, 1, 0, 100, 0), +(13681700, 4, -505.91147, -50.871693, 482.49963, NULL, 0, 1, 0, 100, 0), +(13681700, 5, -392.7677, -71.48443, 482.49963, NULL, 0, 1, 0, 100, 0), +(13681700, 6, -330.67123, -91.59462, 484.66623, NULL, 0, 1, 0, 100, 0), +(13681700, 7, -279.45303, -94.886665, 479.22186, NULL, 0, 1, 0, 100, 0), +(13681700, 8, -245.95833, -82.764435, 484.66623, NULL, 0, 1, 0, 100, 0), +(13681700, 9, -209.7704, -74.29975, 484.66623, NULL, 0, 1, 0, 100, 0), +(13681700, 10, -165.03146, -98.273224, 484.66623, NULL, 0, 1, 0, 100, 0), +(13681700, 11, -132.69695, -91.52577, 484.66623, NULL, 0, 1, 0, 100, 0), +(13681700, 12, -139.58052, -54.39502, 484.66623, NULL, 0, 1, 0, 100, 0), +(13681700, 13, -180.62544, -42.819878, 493.27728, NULL, 0, 1, 0, 100, 0), +(13681800, 1, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681800, 2, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681800, 3, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681800, 4, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681800, 5, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681800, 6, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681800, 7, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681800, 8, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681800, 9, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681800, 10, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681800, 11, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 12, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 13, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 14, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 15, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 16, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 17, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 18, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 19, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 20, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 21, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 22, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 23, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 24, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 25, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 26, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 27, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 28, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681800, 29, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681800, 30, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681800, 31, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681800, 32, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681800, 33, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681800, 34, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681800, 35, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681800, 36, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681800, 37, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681800, 38, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681800, 39, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13682000, 1, 231.988, -141.85178, 478.45242, NULL, 0, 1, 0, 100, 0), +(13682000, 2, 236.23563, -102.05073, 484.67468, NULL, 0, 1, 0, 100, 0), +(13682000, 3, 239.76259, -67.93072, 485.3136, NULL, 0, 1, 0, 100, 0), +(13682000, 4, 244.69466, -30.923502, 483.0358, NULL, 0, 1, 0, 100, 0), +(13682000, 5, 270.24213, 33.36963, 484.25797, NULL, 0, 1, 0, 100, 0), +(13682000, 6, 301.04117, 150.75537, 480.56348, NULL, 0, 1, 0, 100, 0), +(13682000, 7, 338.57172, 163.65959, 499.75803, NULL, 0, 1, 0, 100, 0), +(13682100, 1, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682100, 2, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682100, 3, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682100, 4, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682100, 5, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682100, 6, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682100, 7, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682100, 8, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682100, 9, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682100, 10, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682300, 1, -76.85026, -72.64589, 473.26852, NULL, 0, 1, 0, 100, 0), +(13682300, 2, -92.42242, -57.932182, 474.04642, NULL, 0, 1, 0, 100, 0), +(13682300, 3, -75.87804, -29.36621, 476.24088, NULL, 0, 1, 0, 100, 0), +(13682300, 4, -9.34885, -25.406412, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 5, 111.46854, -32.329266, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 6, 159.0783, -40.943195, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 7, 195.14209, -84.7143, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 8, 204.41943, -165.20486, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 9, 164.45113, -283.55383, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 10, 99.03299, -322.20367, 465.90756, NULL, 0, 1, 0, 100, 0), +(13682300, 11, 75.40831, -309.55533, 474.07422, NULL, 0, 1, 0, 100, 0), +(13682300, 12, 72.71083, -225.92404, 487.85205, NULL, 0, 1, 0, 100, 0), +(13682300, 13, 68.384224, -173.09874, 487.85205, NULL, 0, 1, 0, 100, 0), +(13682300, 14, 34.459095, -134.00934, 487.85205, NULL, 0, 1, 0, 100, 0), +(13682300, 15, 5.241103, -122.99522, 487.85205, NULL, 0, 1, 0, 100, 0), +(13682700, 1, -260.4439, 32.80751, 460.47208, NULL, 0, 1, 0, 100, 0), +(13682700, 2, -345.43826, 33.00434, 460.47208, NULL, 0, 1, 0, 100, 0), +(13682700, 3, -398.6176, 78.246315, 467.3053, NULL, 0, 1, 0, 100, 0), +(13682700, 4, -512.3977, 79.12305, 460.47208, NULL, 0, 1, 0, 100, 0), +(13682700, 5, -516.9923, 23.021267, 467.11108, NULL, 0, 1, 0, 100, 0), +(13682700, 6, -503.37848, -40.306316, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 7, -460.63638, -77.13748, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 8, -413.6926, -112.12489, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 9, -325.7985, -133.6671, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 10, -173.50478, -112.61752, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 11, -99.12186, -76.41634, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 12, -93.76693, 5.390191, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 13, -143.11632, 18.960938, 467.11105, NULL, 0, 1, 0, 100, 0), +(13682700, 14, -190.70378, 16.543945, 467.11105, NULL, 0, 1, 0, 100, 0), +(13683000, 1, -352.6684, -111.5434, 460.28995, NULL, 0, 1, 0, 100, 0), +(13683000, 2, -341.22678, -200.38434, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683000, 3, -329.5521, -309.5586, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683000, 4, -341.05502, -381.2105, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683000, 5, -300.66516, -450.87122, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683000, 6, -237.24187, -456.47385, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683000, 7, -170.96875, -333.97864, 424.03992, NULL, 0, 1, 0, 100, 0), +(13683000, 8, -151.34636, -257.32974, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683000, 9, -108.39877, -101.6582, 454.56775, NULL, 0, 1, 0, 100, 0), +(13683000, 10, -107.07031, -72.3635, 452.29, NULL, 0, 1, 0, 100, 0), +(13683000, 11, -114.84473, -7.053711, 465.62326, NULL, 0, 1, 0, 100, 0), +(13683000, 12, -192.82574, 19.951172, 465.62326, NULL, 0, 1, 0, 100, 0), +(13683000, 13, -333.3226, 32.008247, 465.62326, NULL, 0, 1, 0, 100, 0), +(13683000, 14, -375.8252, 13.914714, 465.62326, NULL, 0, 1, 0, 100, 0), +(13683100, 1, -352.6684, -111.5434, 460.28995, NULL, 0, 1, 0, 100, 0), +(13683100, 2, -341.22678, -200.38434, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683100, 3, -329.5521, -309.5586, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683100, 4, -341.05502, -381.2105, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683100, 5, -300.66516, -450.87122, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683100, 6, -237.24187, -456.47385, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683100, 7, -181.72733, -338.89307, 424.03992, NULL, 0, 1, 0, 100, 0), +(13683100, 8, -156.04622, -246.52316, 418.04004, NULL, 0, 1, 0, 100, 0), +(13683100, 9, -121.80729, -132.28017, 461.20667, NULL, 0, 1, 0, 100, 0), +(13683100, 10, -91.04503, -79.6148, 473.28998, NULL, 0, 1, 0, 100, 0), +(13683100, 11, -93.80306, -7.567166, 484.12326, NULL, 0, 1, 0, 100, 0), +(13683100, 12, -207.10188, 13.033421, 488.59534, NULL, 0, 1, 0, 100, 0), +(13683100, 13, -333.3226, 32.008247, 465.62326, NULL, 0, 1, 0, 100, 0), +(13683100, 14, -375.8252, 13.914714, 465.62326, NULL, 0, 1, 0, 100, 0), +(13685300, 1, 224.37674, 308.77103, 471.49118, NULL, 0, 1, 0, 100, 0), +(13685300, 2, 166.50966, 313.94464, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 3, 136.80566, 315.71817, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 4, 119.79102, 312.89005, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 5, 111.01128, 283.61877, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 6, 112.35927, 253.35359, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 7, 112.41917, 182.55095, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 8, 116.08561, 118.66626, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 9, 119.5395, 57.272896, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 10, 131.11578, 41.205784, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 11, 145.45877, 40.725697, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 12, 187.57341, 41.711372, 468.93567, NULL, 0, 1, 0, 100, 0), +(13685300, 13, 253.89024, 46.59885, 482.26898, NULL, 0, 1, 0, 100, 0), +(13685300, 14, 286.0588, 54.509766, 485.46347, NULL, 0, 1, 0, 100, 0), +(13685300, 15, 292.21323, 99.80135, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 16, 292.80322, 129.23332, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 17, 320.00266, 153.13766, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 18, 347.51627, 155.01454, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 19, 424.18887, 150.17036, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 20, 559.90753, 146.02086, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 21, 644.468, 144.4253, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 22, 728.7425, 137.52644, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 23, 753.87775, 157.91194, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 24, 744.11224, 190.53253, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 25, 732.4593, 230.80873, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 26, 676.38434, 251.82666, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 27, 611.2783, 249.44426, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 28, 529.3622, 246.3093, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 29, 470.4146, 244.6853, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 30, 417.24503, 185.56393, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 31, 383.29868, 182.80675, 485.4635, NULL, 0, 1, 0, 100, 0), +(13685300, 32, 370.99164, 199.12764, 484.51886, NULL, 0, 1, 0, 100, 0), +(13685300, 33, 366.172, 235.27779, 499.6579, NULL, 0, 1, 0, 100, 0), +(13685300, 34, 365.08633, 274.85675, 498.15784, NULL, 0, 1, 0, 100, 0), +(13685300, 35, 311.98416, 290.54947, 480.269, NULL, 0, 1, 0, 100, 0), +(13686200, 1, -75.43772, -9.785102, 481.21527, NULL, 0, 1, 0, 100, 0), +(13686200, 2, -167.11003, 15.645237, 480.60397, NULL, 0, 1, 0, 100, 0), +(13686200, 3, -186.87294, 37.720596, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 4, -186.2335, 105.96626, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 5, -147.597, 143.47157, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 6, -86.01226, 155.6913, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 7, -16.6352, 142.48611, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 8, 20.273329, 129.7946, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 9, 30.521376, 27.182888, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 10, 17.663736, -11.067925, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686200, 11, -36.533962, -15.373372, 480.60394, NULL, 0, 1, 0, 100, 0), +(13686800, 1, -252.2845, -244.80354, 412.67056, NULL, 0, 1, 0, 100, 0), +(13686800, 2, -259.41895, -303.50348, 412.67056, NULL, 0, 1, 0, 100, 0), +(13686800, 3, -261.76193, -346.09995, 426.05936, NULL, 0, 1, 0, 100, 0), +(13686800, 4, -232.61545, -396.00858, 435.33722, NULL, 0, 1, 0, 100, 0), +(13686800, 5, -149.08138, -397.88586, 435.33722, NULL, 0, 1, 0, 100, 0), +(13686800, 6, -58.981445, -319.08063, 435.33722, NULL, 0, 1, 0, 100, 0), +(13686800, 7, -54.395832, -247.5369, 432.11508, NULL, 0, 1, 0, 100, 0), +(13686800, 8, -90.98926, -220.85406, 431.69843, NULL, 0, 1, 0, 100, 0), +(13686800, 9, -197.01183, -225.58116, 435.33722, NULL, 0, 1, 0, 100, 0), +(13687000, 1, -275.35678, -7.686849, 485.66647, NULL, 0, 1, 0, 100, 0), +(13687000, 2, -432.38422, 3.62934, 482.49963, NULL, 0, 1, 0, 100, 0), +(13687000, 3, -504.53168, 0.24056, 482.49963, NULL, 0, 1, 0, 100, 0), +(13687000, 4, -490.9974, -64.8597, 482.49963, NULL, 0, 1, 0, 100, 0), +(13687000, 5, -394.54437, -72.40414, 482.49963, NULL, 0, 1, 0, 100, 0), +(13687000, 6, -330.67123, -91.59462, 484.66623, NULL, 0, 1, 0, 100, 0), +(13687000, 7, -273.37933, -106.90625, 479.22186, NULL, 0, 1, 0, 100, 0), +(13687000, 8, -248.07324, -77.724556, 484.66623, NULL, 0, 1, 0, 100, 0), +(13687000, 9, -192.37544, -73.898926, 484.66623, NULL, 0, 1, 0, 100, 0), +(13687000, 10, -142.88065, -84.37169, 484.66623, NULL, 0, 1, 0, 100, 0), +(13687000, 11, -130.12468, -66.115944, 484.66623, NULL, 0, 1, 0, 100, 0), +(13687000, 12, -136.88075, -50.869846, 484.66623, NULL, 0, 1, 0, 100, 0), +(13687000, 13, -180.62544, -42.819878, 493.27728, NULL, 0, 1, 0, 100, 0), +(13688500, 1, -257.45453, -22.570747, 464.3331, NULL, 0, 1, 0, 100, 0), +(13688500, 2, -315.41614, -0.902724, 472.47208, NULL, 0, 1, 0, 100, 0), +(13688500, 3, -439.86002, 3.087837, 460.47208, NULL, 0, 1, 0, 100, 0), +(13688500, 4, -500.10156, -7.398329, 460.47208, NULL, 0, 1, 0, 100, 0), +(13688500, 5, -489.3303, -70.018776, 460.47208, NULL, 0, 1, 0, 100, 0), +(13688500, 6, -391.02203, -67.44163, 462.63855, NULL, 0, 1, 0, 100, 0), +(13688500, 7, -348.19803, -84.97874, 465.88876, NULL, 0, 1, 0, 100, 0), +(13688500, 8, -282.57715, -80.13292, 464.3054, NULL, 0, 1, 0, 100, 0), +(13682101, 1, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682101, 2, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682101, 3, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682101, 4, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682101, 5, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682101, 6, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682101, 7, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682101, 8, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682101, 9, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682101, 10, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 1, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682102, 2, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682102, 3, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 4, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682102, 5, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 6, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 7, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 8, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 9, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682102, 10, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682103, 1, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682103, 2, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682103, 3, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682103, 4, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682103, 5, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682103, 6, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682103, 7, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682103, 8, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682103, 9, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682103, 10, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682104, 1, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682104, 2, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682104, 3, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682104, 4, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682104, 5, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682104, 6, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682104, 7, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682104, 8, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682104, 9, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682104, 10, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682105, 1, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682105, 2, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682105, 3, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682105, 4, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682105, 5, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682105, 6, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682105, 7, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682105, 8, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682105, 9, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682105, 10, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 1, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 2, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 3, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 4, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 5, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 6, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682106, 7, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682106, 8, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682106, 9, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682106, 10, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682107, 1, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682107, 2, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682107, 3, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682107, 4, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682107, 5, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682107, 6, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682107, 7, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682107, 8, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682107, 9, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682107, 10, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682108, 1, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682108, 2, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682108, 3, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682108, 4, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682108, 5, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682108, 6, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682108, 7, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682108, 8, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682108, 9, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682108, 10, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682109, 1, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682109, 2, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682109, 3, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682109, 4, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682109, 5, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682109, 6, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682109, 7, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682109, 8, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682109, 9, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682109, 10, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682110, 1, 317.53516, -255.74696, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682110, 2, 313.0436, -167.2283, 480.26236, NULL, 0, 1, 0, 100, 0), +(13682110, 3, 341.90213, -85.509766, 470.51266, NULL, 0, 1, 0, 100, 0), +(13682110, 4, 348.556, -45.98405, 467.90146, NULL, 0, 1, 0, 100, 0), +(13682110, 5, 371.6923, -20.411676, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682110, 6, 432.02582, -24.92806, 472.20706, NULL, 0, 1, 0, 100, 0), +(13682110, 7, 438.2168, -112.63065, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682110, 8, 440.58704, -193.9669, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682110, 9, 423.04166, -276.23645, 464.6515, NULL, 0, 1, 0, 100, 0), +(13682110, 10, 362.68555, -311.14984, 464.6515, NULL, 0, 1, 0, 100, 0), +(13681801, 1, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681801, 2, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681801, 3, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681801, 4, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681801, 5, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681801, 6, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681801, 7, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681801, 8, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681801, 9, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681801, 10, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681801, 11, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 12, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 13, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 14, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 15, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 16, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 17, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 18, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 19, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 20, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 21, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 22, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 23, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 24, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 25, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 26, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 27, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 28, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681801, 29, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681801, 30, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681801, 31, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681801, 32, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681801, 33, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681801, 34, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681801, 35, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681801, 36, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681801, 37, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681801, 38, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681801, 39, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681802, 1, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681802, 2, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681802, 3, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681802, 4, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681802, 5, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681802, 6, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681802, 7, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681802, 8, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681802, 9, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 10, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 11, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 12, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 13, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 14, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 15, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 16, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 17, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 18, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 19, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 20, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 21, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 22, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 23, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 24, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 25, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 26, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681802, 27, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681802, 28, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681802, 29, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681802, 30, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681802, 31, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681802, 32, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681802, 33, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681802, 34, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681802, 35, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681802, 36, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681802, 37, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681802, 38, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681802, 39, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681803, 1, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681803, 2, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681803, 3, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681803, 4, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681803, 5, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681803, 6, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681803, 7, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 8, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 9, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 10, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 11, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 12, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 13, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 14, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 15, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 16, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 17, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 18, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 19, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 20, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 21, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 22, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 23, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 24, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681803, 25, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681803, 26, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681803, 27, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681803, 28, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681803, 29, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681803, 30, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681803, 31, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681803, 32, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681803, 33, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681803, 34, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681803, 35, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681803, 36, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681803, 37, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681803, 38, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681803, 39, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681804, 1, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681804, 2, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681804, 3, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681804, 4, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681804, 5, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 6, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 7, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 8, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 9, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 10, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 11, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 12, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 13, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 14, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 15, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 16, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 17, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 18, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 19, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 20, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 21, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 22, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681804, 23, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681804, 24, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681804, 25, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681804, 26, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681804, 27, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681804, 28, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681804, 29, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681804, 30, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681804, 31, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681804, 32, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681804, 33, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681804, 34, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681804, 35, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681804, 36, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681804, 37, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681804, 38, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681804, 39, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681805, 1, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681805, 2, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681805, 3, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 4, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 5, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 6, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 7, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 8, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 9, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 10, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 11, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 12, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 13, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 14, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 15, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 16, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 17, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 18, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 19, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 20, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681805, 21, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681805, 22, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681805, 23, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681805, 24, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681805, 25, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681805, 26, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681805, 27, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681805, 28, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681805, 29, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681805, 30, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681805, 31, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681805, 32, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681805, 33, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681805, 34, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681805, 35, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681805, 36, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681805, 37, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681805, 38, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681805, 39, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681806, 1, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 2, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 3, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 4, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 5, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 6, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 7, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 8, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 9, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 10, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 11, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 12, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 13, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 14, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 15, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 16, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 17, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 18, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681806, 19, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681806, 20, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681806, 21, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681806, 22, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681806, 23, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681806, 24, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681806, 25, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681806, 26, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681806, 27, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681806, 28, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681806, 29, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681806, 30, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681806, 31, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681806, 32, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681806, 33, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681806, 34, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681806, 35, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681806, 36, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681806, 37, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681806, 38, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681806, 39, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681807, 1, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 2, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 3, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 4, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 5, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 6, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 7, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 8, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 9, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 10, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 11, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 12, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 13, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 14, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 15, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 16, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 17, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681807, 18, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681807, 19, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681807, 20, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681807, 21, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681807, 22, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681807, 23, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681807, 24, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681807, 25, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681807, 26, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681807, 27, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681807, 28, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681807, 29, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681807, 30, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681807, 31, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681807, 32, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681807, 33, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681807, 34, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681807, 35, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681807, 36, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681807, 37, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681807, 38, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681807, 39, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 1, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 2, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 3, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 4, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 5, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 6, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 7, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 8, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 9, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 10, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 11, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 12, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 13, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 14, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 15, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681808, 16, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681808, 17, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681808, 18, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681808, 19, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681808, 20, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681808, 21, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681808, 22, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681808, 23, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681808, 24, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681808, 25, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681808, 26, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681808, 27, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681808, 28, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681808, 29, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681808, 30, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681808, 31, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681808, 32, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681808, 33, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681808, 34, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681808, 35, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681808, 36, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 37, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 38, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681808, 39, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 1, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 2, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 3, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 4, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 5, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 6, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 7, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 8, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 9, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 10, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 11, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 12, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 13, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681809, 14, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681809, 15, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681809, 16, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681809, 17, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681809, 18, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681809, 19, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681809, 20, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681809, 21, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681809, 22, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681809, 23, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681809, 24, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681809, 25, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681809, 26, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681809, 27, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681809, 28, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681809, 29, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681809, 30, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681809, 31, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681809, 32, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681809, 33, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681809, 34, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 35, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 36, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 37, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 38, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681809, 39, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 1, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 2, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 3, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 4, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 5, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 6, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 7, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 8, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 9, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 10, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 11, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681810, 12, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681810, 13, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681810, 14, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681810, 15, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681810, 16, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681810, 17, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681810, 18, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681810, 19, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681810, 20, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681810, 21, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681810, 22, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681810, 23, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681810, 24, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681810, 25, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681810, 26, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681810, 27, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681810, 28, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681810, 29, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681810, 30, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681810, 31, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681810, 32, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 33, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 34, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 35, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 36, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 37, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 38, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681810, 39, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 1, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 2, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 3, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 4, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 5, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 6, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 7, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 8, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 9, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681811, 10, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681811, 11, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681811, 12, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681811, 13, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681811, 14, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681811, 15, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681811, 16, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681811, 17, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681811, 18, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681811, 19, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681811, 20, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681811, 21, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681811, 22, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681811, 23, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681811, 24, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681811, 25, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681811, 26, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681811, 27, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681811, 28, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681811, 29, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681811, 30, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 31, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 32, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 33, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 34, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 35, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 36, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 37, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 38, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681811, 39, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 1, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 2, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 3, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 4, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 5, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 6, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 7, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681812, 8, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681812, 9, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681812, 10, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681812, 11, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681812, 12, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681812, 13, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681812, 14, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681812, 15, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681812, 16, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681812, 17, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681812, 18, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681812, 19, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681812, 20, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681812, 21, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681812, 22, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681812, 23, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681812, 24, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681812, 25, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681812, 26, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681812, 27, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681812, 28, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 29, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 30, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 31, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 32, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 33, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 34, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 35, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 36, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 37, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 38, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681812, 39, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 1, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 2, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 3, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 4, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 5, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681813, 6, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681813, 7, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681813, 8, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681813, 9, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681813, 10, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681813, 11, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681813, 12, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681813, 13, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681813, 14, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681813, 15, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681813, 16, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681813, 17, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681813, 18, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681813, 19, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681813, 20, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681813, 21, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681813, 22, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681813, 23, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681813, 24, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681813, 25, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681813, 26, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 27, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 28, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 29, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 30, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 31, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 32, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 33, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 34, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 35, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 36, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 37, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 38, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681813, 39, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 1, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 2, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 3, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681814, 4, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681814, 5, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681814, 6, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681814, 7, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681814, 8, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681814, 9, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681814, 10, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681814, 11, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681814, 12, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681814, 13, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681814, 14, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681814, 15, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681814, 16, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681814, 17, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681814, 18, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681814, 19, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681814, 20, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681814, 21, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681814, 22, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681814, 23, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681814, 24, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 25, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 26, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 27, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 28, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 29, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 30, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 31, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 32, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 33, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 34, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 35, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 36, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 37, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 38, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681814, 39, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 1, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681815, 2, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681815, 3, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681815, 4, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681815, 5, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681815, 6, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681815, 7, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681815, 8, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681815, 9, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681815, 10, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681815, 11, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681815, 12, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681815, 13, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681815, 14, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681815, 15, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681815, 16, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681815, 17, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681815, 18, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681815, 19, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681815, 20, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681815, 21, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681815, 22, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 23, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 24, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 25, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 26, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 27, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 28, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 29, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 30, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 31, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 32, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 33, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 34, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 35, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 36, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 37, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 38, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681815, 39, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 1, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681816, 2, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681816, 3, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681816, 4, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681816, 5, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681816, 6, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681816, 7, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681816, 8, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681816, 9, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681816, 10, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681816, 11, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681816, 12, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681816, 13, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681816, 14, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681816, 15, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681816, 16, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681816, 17, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681816, 18, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681816, 19, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681816, 20, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 21, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 22, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 23, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 24, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 25, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 26, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 27, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 28, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 29, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 30, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 31, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 32, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 33, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 34, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 35, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 36, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 37, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681816, 38, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681816, 39, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681817, 1, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681817, 2, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681817, 3, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681817, 4, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681817, 5, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681817, 6, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681817, 7, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681817, 8, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681817, 9, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681817, 10, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681817, 11, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681817, 12, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681817, 13, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681817, 14, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681817, 15, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681817, 16, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681817, 17, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681817, 18, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 19, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 20, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 21, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 22, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 23, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 24, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 25, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 26, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 27, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 28, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 29, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 30, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 31, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 32, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 33, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 34, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 35, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681817, 36, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681817, 37, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681817, 38, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681817, 39, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681818, 1, 355.1171, 177.4279, 486.64096, NULL, 0, 1, 0, 100, 0), +(13681818, 2, 351.857, 244.76576, 488.393, NULL, 0, 1, 0, 100, 0), +(13681818, 3, 340.4311, 272.64713, 488.393, NULL, 0, 1, 0, 100, 0), +(13681818, 4, 318.3053, 283.13095, 480.0596, NULL, 0, 1, 0, 100, 0), +(13681818, 5, 257.91623, 298.47137, 475.86523, NULL, 0, 1, 0, 100, 0), +(13681818, 6, 207.38748, 318.52545, 472.899, NULL, 0, 1, 0, 100, 0), +(13681818, 7, 161.67448, 317.61612, 475.48233, NULL, 0, 1, 0, 100, 0), +(13681818, 8, 125.50499, 315.49072, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681818, 9, 112.53722, 256.79166, 481.12115, NULL, 0, 1, 0, 100, 0), +(13681818, 10, 112.62467, 157.2342, 476.34338, NULL, 0, 1, 0, 100, 0), +(13681818, 11, 112.31879, 87.31461, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681818, 12, 127.74479, 52.932453, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681818, 13, 160.74979, 44.29134, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681818, 14, 211.34647, 53.570095, 462.84338, NULL, 0, 1, 0, 100, 0), +(13681818, 15, 268.59793, 49.672092, 474.67673, NULL, 0, 1, 0, 100, 0), +(13681818, 16, 298.99463, 65.43197, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 17, 292.559, 142.13884, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 18, 306.58084, 160.09993, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 19, 355.0351, 160.98674, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 20, 371.43756, 152.69144, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 21, 386.3669, 102.7841, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 22, 372.3749, 53.708878, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 23, 371.202, 15.819824, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 24, 375.78983, 0.88623, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 25, 427.31863, -8.051595, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 26, 519.5557, -1.629069, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 27, 587.1153, 8.75982, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 28, 657.95154, 4.638401, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 29, 664.86383, 66.65555, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 30, 661.2181, 96.58146, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 31, 686.56555, 123.9101, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 32, 738.67017, 134.17354, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 33, 752.8013, 149.26717, 476.371, NULL, 0, 1, 0, 100, 0), +(13681818, 34, 739.804, 179.00275, 491.33545, NULL, 0, 1, 0, 100, 0), +(13681818, 35, 691.3419, 183.15889, 483.33548, NULL, 0, 1, 0, 100, 0), +(13681818, 36, 646.3623, 181.9244, 471.61325, NULL, 0, 1, 0, 100, 0), +(13681818, 37, 594.9889, 183.85104, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681818, 38, 456.59045, 189.17453, 471.61322, NULL, 0, 1, 0, 100, 0), +(13681818, 39, 390.6969, 170.73389, 471.61322, NULL, 0, 1, 0, 100, 0); + +-- Delete all old guids and replace them with new ones. +DELETE FROM `creature` WHERE (`id1` = 33214); +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 +(136817, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -292.14084, -95.55786, 480.16333, 0.007145, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136818, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 112.38342, 254.76566, 481.06073, 4.641828, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136819, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 401.09763, 173.30676, 470.63666, 3.481457, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136820, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 265.09622, -446.28564, 499.2537, 1.67982, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136821, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 320.47916, -263.37454, 463.99683, 1.973410, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136822, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 362.5529, 170.13043, 482.58173, 2.733846, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136823, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 72.93533, -256.56256, 483.69727, 1.56237, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136824, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 245.00114, -174.56885, 499.84137, 1.949359, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136825, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 365.8338, -311.52258, 464.6515, 3.092305, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136826, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 116.86029, 292.7707, 481.77292, 4.517911, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136827, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -399.31348, -118.160126, 467.11105, 5.895169, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136828, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 263.20834, -397.48785, 499.84137, 1.692322, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136829, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 111.742676, 210.74623, 479.69342, 4.72695, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136830, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -196.17427, -389.82013, 422.00256, 1.12064, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136831, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -338.41037, -107.201866, 461.4916, 3.421568, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136832, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 243.06271, -313.49603, 499.84137, 1.635228, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136833, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 404.6233, 174.6337, 470.52737, 3.518390, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136834, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -120.123985, -219.51703, 433.3789, 3.15474, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136835, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -467.3855, -72.085304, 467.11102, 5.666649, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136836, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 240.04927, -248.06587, 499.84137, 1.646547, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136837, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 312.9997, -167.53654, 480.2513, 1.429987, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136838, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 352.12524, -306.44287, 464.40552, 2.545906, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136839, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -1.5605621, -15.69503, 480.57495, 3.208541, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136840, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 256.53125, -349.81772, 499.84137, 1.688268, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136841, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 424.59732, -273.73285, 464.65146, 4.18577, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136842, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -116.72107, -219.4873, 433.14117, 3.145736, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136843, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -161.73979, -221.67447, 435.88052, 3.224597, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136844, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 240.67508, -284.02972, 499.84137, 1.631820, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136845, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -239.7254, -235.13145, 419.27866, 3.584439, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136846, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -331.1254, -281.35284, 416.86084, 4.805790, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136847, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 438.61075, -55.072266, 469.83298, 4.746424, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136848, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 271.77008, -157.04195, 499.84137, 2.776843, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136849, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -97.017204, 11.718248, 481.20898, 2.845998, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136850, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -510.73862, -20.930248, 467.3563, 4.965182, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136851, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -201.45259, -73.42359, 484.72693, 6.242731, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136852, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 237.27843, -211.07683, 499.84137, 1.647071, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136853, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 115.136856, 302.93628, 468.93564, 4.403156, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136854, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 47.0684, -144.97723, 487.85205, 2.378783, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136855, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 430.54428, -260.0945, 464.65152, 4.394425, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136856, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 267.6612, -527.7477, 499.37302, 1.663390, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136857, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -316.94592, -133.51868, 467.11105, 0.033230, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136858, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 73.01343, -245.32169, 485.3908, 1.567117, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136859, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 345.00723, 266.63794, 489.06503, 2.129632, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136860, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -65.46948, -12.117594, 481.17136, 2.91839, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136861, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -335.87302, -8.896082, 471.15527, 3.15457, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136862, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -188.11429, 44.828564, 480.60394, 1.715697, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136863, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -363.5184, -172.79039, 428.63257, 5.61923, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136864, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -291.96695, -456.5711, 417.9784, 5.752976, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136865, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 39.823586, -138.43175, 487.8521, 2.433701, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136866, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 111.81775, 242.82416, 480.71945, 4.683641, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136867, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 111.61658, 224.2796, 480.1653, 4.715309, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136868, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -79.03326, -223.33072, 431.48288, 2.868818, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136869, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 410.8077, 177.19398, 470.52246, 3.5420, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136870, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -508.15338, -32.880966, 482.49963, 4.894750, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136871, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -522.9536, 59.15032, 462.76648, 4.74477, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136872, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 30.148972, 15.855083, 480.6039, 4.6558, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136873, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -341.0875, -381.05, 418.04004, 4.910322, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136874, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 112.17224, 188.27672, 478.68152, 4.733663, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136875, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 73.00638, -237.85942, 486.42773, 1.577651, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136876, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -197.28227, -379.64047, 422.76407, 1.19786, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136877, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 337.81198, 275.33923, 487.44153, 2.41208, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136878, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 69.80873, -89.27995, 487.852, 2.019833, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136879, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -185.8855, 106.8766, 480.60394, 1.196086, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136880, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -105.563446, -219.6443, 432.39548, 3.106087, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136881, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -261.945, -51.611347, 463.70285, 1.162535, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136882, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -419.9021, -71.05656, 482.34464, 0.007135, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136883, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 399.22873, -299.34967, 464.6515, 3.73568, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136884, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 72.4774, -195.63246, 488.67422, 1.594469, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136885, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -360.44427, -81.03175, 465.28384, 5.771085, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136886, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 412.7033, -288.44296, 464.6515, 3.91075, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136887, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 438.43384, -81.05734, 467.1432, 4.684406, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136888, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 118.091675, 298.3324, 481.75427, 4.468181, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136889, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -483.4969, -72.152504, 460.58313, 6.05074, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136890, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 440.38458, -196.17609, 464.6515, 4.621961, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136891, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 111.701416, 213.78246, 479.80627, 4.724916, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136892, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -476.7308, 2.1543007, 459.6833, 3.219415, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136893, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -217.55727, -222.29514, 430.3932, 2.861475, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136894, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -441.7397, -94.05625, 467.11108, 5.558754, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136895, 33214, 0, 0, 603, 0, 0, 3, 1, 0, 111.64575, 233.63866, 480.454, 4.702418, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL), +(136896, 33214, 0, 0, 603, 0, 0, 3, 1, 0, -92.807686, -5.6074343, 481.15457, 2.902093, 60, 0, 0, 6000, 0, 2, 0, 0, 0, '', 0, 0, NULL); + +-- Set creature_addon. +DELETE FROM `creature_addon` WHERE (`guid` IN (136817, 136818, 136819, 136820, 136821, 136822, 136823, 136824, 136825, 136826, 136827, 136828, 136829, 136830, 136831, 136832, 136833, 136834, 136835, 136836, 136837, 136838, 136839, 136840, 136841, 136842, 136843, 136844, 136845, 136846, 136847, 136848, 136849, 136850, 136851, 136852, 136853, 136854, 136855, 136856, 136857, 136858, 136859, 136860, 136861, 136862, 136863, 136864, 136865, 136866, 136867, 136868, 136869, 136870, 136871, 136872, 136873, 136874, 136875, 136876, 136877, 136878, 136879, 136880, 136881, 136882, 136883, 136884, 136885, 136886, 136887, 136888, 136889, 136890, 136891, 136892, 136893, 136894, 136895, 136896)); +INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES +(136817, 13681700, 0, 0, 0, 0, 0, ''), +(136820, 13682000, 0, 0, 0, 0, 0, ''), +(136823, 13682300, 0, 0, 0, 0, 0, ''), +(136824, 13682000, 0, 0, 0, 0, 0, ''), +(136827, 13682700, 0, 0, 0, 0, 0, ''), +(136828, 13682000, 0, 0, 0, 0, 0, ''), +(136830, 13683000, 0, 0, 0, 0, 0, ''), +(136831, 13683100, 0, 0, 0, 0, 0, ''), +(136832, 13682000, 0, 0, 0, 0, 0, ''), +(136834, 13686800, 0, 0, 0, 0, 0, ''), +(136835, 13682700, 0, 0, 0, 0, 0, ''), +(136836, 13682000, 0, 0, 0, 0, 0, ''), +(136839, 13686200, 0, 0, 0, 0, 0, ''), +(136840, 13682000, 0, 0, 0, 0, 0, ''), +(136842, 13686800, 0, 0, 0, 0, 0, ''), +(136844, 13682000, 0, 0, 0, 0, 0, ''), +(136845, 13687000, 0, 0, 0, 0, 0, ''), +(136848, 13682000, 0, 0, 0, 0, 0, ''), +(136849, 13682300, 0, 0, 0, 0, 0, ''), +(136850, 13682700, 0, 0, 0, 0, 0, ''), +(136851, 13687000, 0, 0, 0, 0, 0, ''), +(136852, 13682000, 0, 0, 0, 0, 0, ''), +(136853, 13685300, 0, 0, 0, 0, 0, ''), +(136854, 13682300, 0, 0, 0, 0, 0, ''), +(136856, 13682000, 0, 0, 0, 0, 0, ''), +(136857, 13682700, 0, 0, 0, 0, 0, ''), +(136858, 13682300, 0, 0, 0, 0, 0, ''), +(136860, 13686200, 0, 0, 0, 0, 0, ''), +(136861, 13683100, 0, 0, 0, 0, 0, ''), +(136862, 13686200, 0, 0, 0, 0, 0, ''), +(136863, 13683100, 0, 0, 0, 0, 0, ''), +(136864, 13683100, 0, 0, 0, 0, 0, ''), +(136865, 13682300, 0, 0, 0, 0, 0, ''), +(136868, 13686800, 0, 0, 0, 0, 0, ''), +(136870, 13687000, 0, 0, 0, 0, 0, ''), +(136871, 13682700, 0, 0, 0, 0, 0, ''), +(136872, 13686200, 0, 0, 0, 0, 0, ''), +(136873, 13683100, 0, 0, 0, 0, 0, ''), +(136875, 13682300, 0, 0, 0, 0, 0, ''), +(136876, 13683100, 0, 0, 0, 0, 0, ''), +(136878, 13682300, 0, 0, 0, 0, 0, ''), +(136879, 13686200, 0, 0, 0, 0, 0, ''), +(136880, 13686800, 0, 0, 0, 0, 0, ''), +(136881, 13683100, 0, 0, 0, 0, 0, ''), +(136882, 13687000, 0, 0, 0, 0, 0, ''), +(136884, 13682300, 0, 0, 0, 0, 0, ''), +(136885, 13688500, 0, 0, 0, 0, 0, ''), +(136889, 13688500, 0, 0, 0, 0, 0, ''), +(136892, 13688500, 0, 0, 0, 0, 0, ''), +(136893, 13686200, 0, 0, 0, 0, 0, ''), +(136894, 13682700, 0, 0, 0, 0, 0, ''), +(136896, 13686200, 0, 0, 0, 0, 0, ''), +(136821, 13682101, 0, 0, 0, 0, 0, ''), +(136825, 13682102, 0, 0, 0, 0, 0, ''), +(136837, 13682103, 0, 0, 0, 0, 0, ''), +(136847, 13682104, 0, 0, 0, 0, 0, ''), +(136890, 13682105, 0, 0, 0, 0, 0, ''), +(136838, 13682106, 0, 0, 0, 0, 0, ''), +(136886, 13682107, 0, 0, 0, 0, 0, ''), +(136883, 13682108, 0, 0, 0, 0, 0, ''), +(136841, 13682109, 0, 0, 0, 0, 0, ''), +(136855, 13682110, 0, 0, 0, 0, 0, ''), +(136818, 13681801, 0, 0, 0, 0, 0, ''), +(136819, 13681802, 0, 0, 0, 0, 0, ''), +(136822, 13681803, 0, 0, 0, 0, 0, ''), +(136826, 13681804, 0, 0, 0, 0, 0, ''), +(136829, 13681805, 0, 0, 0, 0, 0, ''), +(136833, 13681806, 0, 0, 0, 0, 0, ''), +(136843, 13681807, 0, 0, 0, 0, 0, ''), +(136846, 13681808, 0, 0, 0, 0, 0, ''), +(136859, 13681809, 0, 0, 0, 0, 0, ''), +(136866, 13681810, 0, 0, 0, 0, 0, ''), +(136867, 13681811, 0, 0, 0, 0, 0, ''), +(136869, 13681812, 0, 0, 0, 0, 0, ''), +(136874, 13681813, 0, 0, 0, 0, 0, ''), +(136877, 13681814, 0, 0, 0, 0, 0, ''), +(136887, 13681815, 0, 0, 0, 0, 0, ''), +(136888, 13681816, 0, 0, 0, 0, 0, ''), +(136891, 13681817, 0, 0, 0, 0, 0, ''), +(136895, 13681818, 0, 0, 0, 0, 0, ''); diff --git a/data/sql/updates/db_world/2026_03_02_01.sql b/data/sql/updates/db_world/2026_03_02_01.sql new file mode 100644 index 000000000..36417c2c5 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_02_01.sql @@ -0,0 +1,32 @@ +-- DB update 2026_03_02_00 -> 2026_03_02_01 +-- Update gameobject 'Cathedral Square' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (2098, 2131, 2190, 2110, 2116, 2099, 2129, 2140, 25338, 2102, 25339, 2173, 25340, 63197, 63198, 2105, 2175, 2134, 2106, 103794, 2179, 2186)) AND (`guid` IN (10665, 10674, 26290, 26299, 26339, 26413, 26456, 26521, 26522, 26523, 26545, 26599, 26601, 26602, 26603, 26606, 26607, 26652, 4659, 61907, 61923, 61930)); +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 +(10665, 2098, 0, 0, 0, 1, 1, -8439.51953125, 650.0142822265625, 93.5751495361328125, 0.663225173950195312, 0, 0, 0.325568199157714843, 0.945518553256988525, 120, 255, 1, "", 45435, NULL), +(10674, 2131, 0, 0, 0, 1, 1, -8508.3623046875, 659.8963623046875, 99.964111328125, 0.602139830589294433, 0, 0, 0.296542167663574218, 0.955019772052764892, 120, 255, 1, "", 45435, NULL), +(26290, 2190, 0, 0, 0, 1, 1, -8798.767578125, 580.3751220703125, 96.74338531494140625, 5.384342670440673828, 0, 0, -0.43444442749023437, 0.900698602199554443, 120, 255, 1, "", 45327, NULL), +(26299, 2110, 0, 0, 0, 1, 1, -8828.6552734375, 616.827880859375, 94.16197967529296875, 5.384342670440673828, 0, 0, -0.43444442749023437, 0.900698602199554443, 120, 255, 1, "", 45327, NULL), +(26339, 2116, 0, 0, 0, 1, 1, -8750.625, 552.14788818359375, 97.59325408935546875, 5.628688335418701171, 0, 0, -0.32143878936767578, 0.946930348873138427, 120, 255, 1, "", 45327, NULL), +(26413, 2099, 0, 0, 0, 1, 1, -8779.1552734375, 666.68017578125, 104.1385574340820312, 5.384342670440673828, 0, 0, -0.43444442749023437, 0.900698602199554443, 120, 255, 1, "", 45327, NULL), +(26456, 2129, 0, 0, 0, 1, 1, -8578.5146484375, 537.05938720703125, 101.2374420166015625, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 120, 255, 1, "", 45435, NULL), +(26521, 2140, 0, 0, 0, 1, 1, -8538.6025390625, 682.9593505859375, 97.1988525390625, 0.689404308795928955, 0, 0, 0.337916374206542968, 0.941176116466522216, 120, 255, 1, "", 45435, NULL), +(26522, 25338, 0, 0, 0, 1, 1, -8556.1953125, 666.5709228515625, 103.7008895874023437, 5.384342670440673828, 0, 0, -0.43444442749023437, 0.900698602199554443, 120, 255, 1, "", 45435, NULL), +(26523, 2102, 0, 0, 0, 1, 1, -8559.6943359375, 670.72149658203125, 97.8239593505859375, 0.663225173950195312, 0, 0, 0.325568199157714843, 0.945518553256988525, 120, 255, 1, "", 45435, NULL), +(26545, 25339, 0, 0, 0, 1, 1, -8576.9814453125, 671.7752685546875, 109.5662384033203125, 5.384342670440673828, 0, 0, -0.43444442749023437, 0.900698602199554443, 120, 255, 1, "", 45435, NULL), +(26599, 2173, 0, 0, 0, 1, 1, -8735.54296875, 706.58935546875, 98.694671630859375, 5.401795864105224609, 0, 0, -0.42656803131103515, 0.904455482959747314, 120, 255, 1, "", 45327, NULL), +(26601, 25340, 0, 0, 0, 1, 1, -8684.5126953125, 709.81646728515625, 109.42132568359375, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(26602, 63197, 0, 0, 0, 1, 1, -8705.8935546875, 709.3677978515625, 103.5559768676757812, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(26603, 63198, 0, 0, 0, 1, 1, -8700.689453125, 730.15411376953125, 109.42132568359375, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(26606, 2105, 0, 0, 0, 1, 1, -8701.6767578125, 712.72381591796875, 97.6470794677734375, 5.375617504119873046, 0, 0, -0.4383697509765625, 0.898794710636138916, 120, 255, 1, "", 45327, NULL), +(26607, 2175, 0, 0, 0, 1, 1, -8711.3408203125, 725.770263671875, 97.6882476806640625, 5.401795864105224609, 0, 0, -0.42656803131103515, 0.904455482959747314, 120, 255, 1, "", 45327, NULL), +(26652, 2134, 0, 0, 0, 1, 1, -8839.2412109375, 730.37310791015625, 97.2851409912109375, 5.227262020111083984, 0, 0, -0.50377368927001953, 0.863835692405700683, 120, 255, 1, "", 45327, NULL), +(4659, 2106, 0, 0, 0, 1, 1, -8684.693359375, 880.80517578125, 97.39405059814453125, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(61907, 103794, 0, 0, 0, 1, 1, -8825.3974609375, 957.32977294921875, 99.24700164794921875, 3.831001043319702148, 0, 0, -0.94117546081542968, 0.337918221950531005, 120, 255, 1, "", 45327, NULL), +(61923, 2179, 0, 0, 0, 1, 1, -8704.9296875, 865.7830810546875, 96.76332855224609375, 3.831001043319702148, 0, 0, -0.94117546081542968, 0.337918221950531005, 120, 255, 1, "", 45327, NULL), +(61930, 2186, 0, 0, 0, 1, 1, -8726.2236328125, 892.58465576171875, 100.5634689331054687, 3.831001043319702148, 0, 0, -0.94117546081542968, 0.337918221950531005, 120, 255, 1, "", 45327, NULL); + +-- remove incorrect spawns +DELETE FROM `gameobject` WHERE (`id` IN (25338, 25339)) AND (`guid` IN (42869, 42870, 42871)); +DELETE FROM `gameobject_addon` WHERE (`guid` IN (42869, 42870, 42871)); +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 0) AND (`guid` IN (42869, 42870, 42871)); diff --git a/data/sql/updates/db_world/2026_03_02_02.sql b/data/sql/updates/db_world/2026_03_02_02.sql new file mode 100644 index 000000000..a77090285 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_02_02.sql @@ -0,0 +1,22 @@ +-- DB update 2026_03_02_01 -> 2026_03_02_02 +-- Update gameobject 'The Park' with sniffed values +-- updated spawns +DELETE FROM `gameobject` WHERE (`id` IN (24717, 24715, 23301, 23299, 24720, 25353, 25341, 23300, 25354, 24718, 24719, 24721)) AND (`guid` IN (26610, 26643, 42860, 42862, 42866, 42873, 42874, 54963, 61853, 61934, 61939, 61943)); +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 +(26610, 24717, 0, 0, 0, 1, 1, -8713.173828125, 725.94671630859375, 97.08819580078125, 0.689404308795928955, 0, 0, 0.337916374206542968, 0.941176116466522216, 120, 255, 1, "", 45327, NULL), +(26643, 24715, 0, 0, 0, 1, 1, -8873.654296875, 754.26953125, 96.46729278564453125, 5.462880134582519531, 0, 0, -0.39874935150146484, 0.917059957981109619, 120, 255, 1, "", 45327, NULL), +(42860, 23301, 0, 0, 0, 1, 1, -8807.998046875, 938.989990234375, 101.8413772583007812, 5.375617504119873046, 0, 0, -0.4383697509765625, 0.898794710636138916, 120, 255, 1, "", 45327, NULL), +(42862, 23299, 0, 0, 0, 1, 1, -8707.29296875, 909.094482421875, 102.0302886962890625, 0.680676698684692382, 0, 0, 0.333806037902832031, 0.942641794681549072, 120, 255, 1, "", 45327, NULL), +(42866, 24720, 0, 0, 0, 1, 1, -8825.220703125, 959.16259765625, 99.84705352783203125, 5.401795864105224609, 0, 0, -0.42656803131103515, 0.904455482959747314, 120, 255, 1, "", 45327, NULL), +(42873, 25353, 0, 0, 0, 1, 1, -8812.2158203125, 935.57525634765625, 108.2936630249023437, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(42874, 25341, 0, 0, 0, 1, 1, -8806.953125, 956.345703125, 112.9861679077148437, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(54963, 23300, 0, 0, 0, 1, 1, -8897.939453125, 909.4378662109375, 110.7001953125, 5.201082706451416015, 0, 0, -0.51503753662109375, 0.857167601585388183, 120, 255, 1, "", 45327, NULL), +(61853, 25354, 0, 0, 0, 1, 1, -8790.7138671875, 935.9305419921875, 112.9861679077148437, 3.81354522705078125, 0, 0, -0.94408893585205078, 0.329690933227539062, 120, 255, 1, "", 45327, NULL), +(61934, 24718, 0, 0, 0, 1, 1, -8706.5859375, 867.7923583984375, 96.76332855224609375, 0.689404308795928955, 0, 0, 0.337916374206542968, 0.941176116466522216, 120, 255, 1, "", 45327, NULL), +(61939, 24719, 0, 0, 0, 1, 1, -8727.8798828125, 894.59393310546875, 100.5634689331054687, 0.689404308795928955, 0, 0, 0.337916374206542968, 0.941176116466522216, 120, 255, 1, "", 45327, NULL), +(61943, 24721, 0, 0, 0, 1, 1, -8843.0966796875, 924.157470703125, 101.7831039428710937, 5.209809303283691406, 0, 0, -0.5112924575805664, 0.859406769275665283, 120, 255, 1, "", 45327, NULL); + +-- remove duplicate spawns +DELETE FROM `gameobject` WHERE (`id` IN (23299, 25341, 25342)) AND (`guid` IN (42861, 42872, 42875)); +DELETE FROM `gameobject_addon` WHERE (`guid` IN (42861, 42872, 42875)); +DELETE FROM `game_event_gameobject` WHERE (`eventEntry` = 0) AND (`guid` IN (42861, 42872, 42875)); diff --git a/data/sql/updates/db_world/2026_03_03_00.sql b/data/sql/updates/db_world/2026_03_03_00.sql new file mode 100644 index 000000000..b25496377 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_03_00.sql @@ -0,0 +1,11 @@ +-- DB update 2026_03_02_02 -> 2026_03_03_00 +-- +DELETE FROM `acore_string` WHERE `entry` IN (5111, 5112, 5113, 5114, 5115, 5116, 5117); +INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES +(5111, 'Battlefield {} not found.', '전장 {}을(를) 찾을 수 없습니다.', 'Champ de bataille {} introuvable.', 'Schlachtfeld {} nicht gefunden.', '战场 {} 未找到。', '戰場 {} 未找到。', 'Campo de batalla {} no encontrado.', 'Campo de batalla {} no encontrado.', 'Поле боя {} не найдено.'), +(5112, 'Battlefield {} battle started.', '전장 {} 전투가 시작되었습니다.', 'La bataille du champ de bataille {} a commencé.', 'Schlachtfeld {} Kampf gestartet.', '战场 {} 战斗已开始。', '戰場 {} 戰鬥已開始。', 'La batalla del campo de batalla {} ha comenzado.', 'La batalla del campo de batalla {} ha comenzado.', 'Сражение на поле боя {} началось.'), +(5113, 'Battlefield {} battle stopped.', '전장 {} 전투가 중지되었습니다.', 'La bataille du champ de bataille {} a été arrêtée.', 'Schlachtfeld {} Kampf beendet.', '战场 {} 战斗已停止。', '戰場 {} 戰鬥已停止。', 'La batalla del campo de batalla {} ha sido detenida.', 'La batalla del campo de batalla {} ha sido detenida.', 'Сражение на поле боя {} остановлено.'), +(5114, 'Battlefield {} factions switched.', '전장 {} 진영이 전환되었습니다.', 'Les factions du champ de bataille {} ont été échangées.', 'Schlachtfeld {} Fraktionen gewechselt.', '战场 {} 阵营已切换。', '戰場 {} 陣營已切換。', 'Las facciones del campo de batalla {} han sido intercambiadas.', 'Las facciones del campo de batalla {} han sido intercambiadas.', 'Фракции на поле боя {} переключены.'), +(5115, 'Battlefield {} timer set to {} seconds.', '전장 {} 타이머가 {}초로 설정되었습니다.', 'Le minuteur du champ de bataille {} a été réglé à {} secondes.', 'Schlachtfeld {} Timer auf {} Sekunden gesetzt.', '战场 {} 计时器已设置为 {} 秒。', '戰場 {} 計時器已設置為 {} 秒。', 'El temporizador del campo de batalla {} se ha establecido en {} segundos.', 'El temporizador del campo de batalla {} se ha establecido en {} segundos.', 'Таймер поля боя {} установлен на {} секунд.'), +(5116, 'Battlefield {} enabled.', '전장 {}이(가) 활성화되었습니다.', 'Champ de bataille {} activé.', 'Schlachtfeld {} aktiviert.', '战场 {} 已启用。', '戰場 {} 已啟用。', 'Campo de batalla {} habilitado.', 'Campo de batalla {} habilitado.', 'Поле боя {} включено.'), +(5117, 'Battlefield {} disabled.', '전장 {}이(가) 비활성화되었습니다.', 'Champ de bataille {} désactivé.', 'Schlachtfeld {} deaktiviert.', '战场 {} 已禁用。', '戰場 {} 已停用。', 'Campo de batalla {} deshabilitado.', 'Campo de batalla {} deshabilitado.', 'Поле боя {} отключено.'); diff --git a/data/sql/updates/db_world/2026_03_03_01.sql b/data/sql/updates/db_world/2026_03_03_01.sql new file mode 100644 index 000000000..745b838c7 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_03_01.sql @@ -0,0 +1,109 @@ +-- DB update 2026_03_03_00 -> 2026_03_03_01 +UPDATE `acore_string` SET `locale_esES` = 'Has congelado al jugador {}.', `locale_esMX` = 'Has congelado al jugador {}.' WHERE `entry` = 5000; +UPDATE `acore_string` SET `locale_esES` = 'Puede que sea divertido pero no... ¡no puedes congelarte!', `locale_esMX` = 'Puede que sea divertido pero no... ¡no puedes congelarte!' WHERE `entry` = 5001; +UPDATE `acore_string` SET `locale_esES` = 'Entrada no válida, verifique el nombre del destino.', `locale_esMX` = 'Entrada no válida, verifique el nombre del destino.' WHERE `entry` = 5002; +UPDATE `acore_string` SET `locale_esES` = 'Has descongelado al jugador {}.', `locale_esMX` = 'Has descongelado al jugador {}.' WHERE `entry` = 5003; +UPDATE `acore_string` SET `locale_esES` = 'No hay jugadores congelados.', `locale_esMX` = 'No hay jugadores congelados.' WHERE `entry` = 5004; +UPDATE `acore_string` SET `locale_esES` = 'Los siguientes jugadores están congelados en el servidor:', `locale_esMX` = 'Los siguientes jugadores están congelados en el servidor:' WHERE `entry` = 5005; +UPDATE `acore_string` SET `locale_esES` = '- {}', `locale_esMX` = '- {}' WHERE `entry` = 5006; +UPDATE `acore_string` SET `locale_esES` = 'Debes estar en un grupo de banda para ingresar a esta instancia.', `locale_esMX` = 'Debes estar en un grupo de banda para ingresar a esta instancia.' WHERE `entry` = 5007; +UPDATE `acore_string` SET `locale_esES` = 'Esta instancia está cerrada.', `locale_esMX` = 'Esta instancia está cerrada.' WHERE `entry` = 5008; +UPDATE `acore_string` SET `locale_esES` = 'Sonido {} reproducido al servidor.', `locale_esMX` = 'Sonido {} reproducido al servidor.' WHERE `entry` = 5009; +UPDATE `acore_string` SET `locale_esES` = 'linkGUID: {}, Entry: {} ({})', `locale_esMX` = 'linkGUID: {}, Entry: {} ({})' WHERE `entry` = 5010; +UPDATE `acore_string` SET `locale_esES` = '¡No puedes teletransportarte de ti mismo a ti mismo!', `locale_esMX` = '¡No puedes teletransportarte de ti mismo a ti mismo!' WHERE `entry` = 5011; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron mapas!', `locale_esMX` = '¡No se encontraron mapas!' WHERE `entry` = 5012; +UPDATE `acore_string` SET `locale_esES` = '[Continente]', `locale_esMX` = '[Continente]' WHERE `entry` = 5013; +UPDATE `acore_string` SET `locale_esES` = '[Instancia]', `locale_esMX` = '[Instancia]' WHERE `entry` = 5014; +UPDATE `acore_string` SET `locale_esES` = '[Campo de batalla]', `locale_esMX` = '[Campo de batalla]' WHERE `entry` = 5015; +UPDATE `acore_string` SET `locale_esES` = '[Arena]', `locale_esMX` = '[Arena]' WHERE `entry` = 5016; +UPDATE `acore_string` SET `locale_esES` = '[Banda]', `locale_esMX` = '[Banda]' WHERE `entry` = 5017; +UPDATE `acore_string` SET `locale_esES` = 'Phasemask: {}', `locale_esMX` = 'Phasemask: {}' WHERE `entry` = 5020; +UPDATE `acore_string` SET `locale_esES` = 'Armadura: {}', `locale_esMX` = 'Armadura: {}' WHERE `entry` = 5021; +UPDATE `acore_string` SET `locale_esES` = 'Otorgar propiedad a la primera persona que se une al canal "{}": Habilitado.', `locale_esMX` = 'Otorgar propiedad a la primera persona que se une al canal "{}": Habilitado.' WHERE `entry` = 5022; +UPDATE `acore_string` SET `locale_esES` = 'Otorgar propiedad a la primera persona que se une al canal "{}": Deshabilitado.', `locale_esMX` = 'Otorgar propiedad a la primera persona que se une al canal "{}": Deshabilitado.' WHERE `entry` = 5023; +UPDATE `acore_string` SET `locale_esES` = 'Entry: {}', `locale_esMX` = 'Entry: {}' WHERE `entry` = 5024; +UPDATE `acore_string` SET `locale_esES` = 'Tipo: {}', `locale_esMX` = 'Tipo: {}' WHERE `entry` = 5025; +UPDATE `acore_string` SET `locale_esES` = 'DisplayID: {}', `locale_esMX` = 'DisplayID: {}' WHERE `entry` = 5026; +UPDATE `acore_string` SET `locale_esES` = 'Nombre: {}', `locale_esMX` = 'Nombre: {}' WHERE `entry` = 5027; +UPDATE `acore_string` SET `locale_esES` = 'Lootid: {}', `locale_esMX` = 'Lootid: {}' WHERE `entry` = 5028; +UPDATE `acore_string` SET `locale_esES` = 'Límite de resultados alcanzado (máximo de resultados: {})', `locale_esMX` = 'Límite de resultados alcanzado (máximo de resultados: {})' WHERE `entry` = 5029; +UPDATE `acore_string` SET `locale_esES` = 'AIName: {} ScriptName: {}', `locale_esMX` = 'AIName: {} ScriptName: {}' WHERE `entry` = 5031; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontró ningún campo de batalla!', `locale_esMX` = '¡No se encontró ningún campo de batalla!' WHERE `entry` = 5032; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron criterios de logro!', `locale_esMX` = '¡No se encontraron criterios de logro!' WHERE `entry` = 5033; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontró ningún JcJ al aire libre!', `locale_esMX` = '¡No se encontró ningún JcJ al aire libre!' WHERE `entry` = 5034; +UPDATE `acore_string` SET `locale_esES` = 'EquipmentId: {} (Original: {}).', `locale_esMX` = 'EquipmentId: {} (Original: {}).' WHERE `entry` = 5036; +UPDATE `acore_string` SET `locale_esES` = 'MechanicImmuneMask: {}', `locale_esMX` = 'MechanicImmuneMask: {}' WHERE `entry` = 5037; +UPDATE `acore_string` SET `locale_esES` = 'Unit Flags: {}', `locale_esMX` = 'Unit Flags: {}' WHERE `entry` = 5038; +UPDATE `acore_string` SET `locale_esES` = 'Consola', `locale_esMX` = 'Consola' WHERE `entry` = 5039; +UPDATE `acore_string` SET `locale_esES` = 'Personaje', `locale_esMX` = 'Personaje' WHERE `entry` = 5040; +UPDATE `acore_string` SET `locale_esES` = 'Permanentemente', `locale_esMX` = 'Permanentemente' WHERE `entry` = 5041; +UPDATE `acore_string` SET `locale_esES` = 'Estás al aire libre.', `locale_esMX` = 'Estás al aire libre.' WHERE `entry` = 5042; +UPDATE `acore_string` SET `locale_esES` = 'Estás en el interior.', `locale_esMX` = 'Estás en el interior.' WHERE `entry` = 5043; +UPDATE `acore_string` SET `locale_esES` = 'No hay VMAP disponible para información del área', `locale_esMX` = 'No hay VMAP disponible para información del área' WHERE `entry` = 5044; +UPDATE `acore_string` SET `locale_esES` = 'No puedes decir, gritar ni expresar emociones hasta que alcances el nivel {}.', `locale_esMX` = 'No puedes decir, gritar ni expresar emociones hasta que alcances el nivel {}.' WHERE `entry` = 6604; +UPDATE `acore_string` SET `locale_esES` = 'No puedes susurrar hasta que alcances el nivel {}.', `locale_esMX` = 'No puedes susurrar hasta que alcances el nivel {}.' WHERE `entry` = 6605; +UPDATE `acore_string` SET `locale_esES` = 'No puedes escribir en canales hasta que alcances el nivel {}.', `locale_esMX` = 'No puedes escribir en canales hasta que alcances el nivel {}.' WHERE `entry` = 6606; +UPDATE `acore_string` SET `locale_esES` = 'No puedes usar la subasta hasta que alcances el nivel {}.', `locale_esMX` = 'No puedes usar la subasta hasta que alcances el nivel {}.' WHERE `entry` = 6607; +UPDATE `acore_string` SET `locale_esES` = 'No podrás escribir tickets hasta que alcances el nivel {}.', `locale_esMX` = 'No podrás escribir tickets hasta que alcances el nivel {}.' WHERE `entry` = 6608; +UPDATE `acore_string` SET `locale_esES` = 'No podrás comerciar hasta que alcances el nivel {}.', `locale_esMX` = 'No podrás comerciar hasta que alcances el nivel {}.' WHERE `entry` = 6609; +UPDATE `acore_string` SET `locale_esES` = 'No puedes comerciar con personajes de nivel inferior a {}.', `locale_esMX` = 'No puedes comerciar con personajes de nivel inferior a {}.' WHERE `entry` = 6610; +UPDATE `acore_string` SET `locale_esES` = 'No podrás enviar correo hasta que alcances el nivel {}.', `locale_esMX` = 'No podrás enviar correo hasta que alcances el nivel {}.' WHERE `entry` = 6611; +UPDATE `acore_string` SET `locale_esES` = 'No puedes enviar correo a personajes de nivel inferior al {}.', `locale_esMX` = 'No puedes enviar correo a personajes de nivel inferior al {}.' WHERE `entry` = 6612; +UPDATE `acore_string` SET `locale_esES` = '|cfff00000[Anuncio de GM]: {}|r', `locale_esMX` = '|cfff00000[Anuncio de GM]: {}|r' WHERE `entry` = 6613; +UPDATE `acore_string` SET `locale_esES` = 'Notificación a los GM''s -', `locale_esMX` = 'Notificación a los GM''s -' WHERE `entry` = 6614; +UPDATE `acore_string` SET `locale_esES` = '|cffffff00[|c1f40af20Anuncio de GM por|r |cffff0000{}|cffffff00]:|r {}|r', `locale_esMX` = '|cffffff00[|c1f40af20Anuncio de GM por|r |cffff0000{}|cffffff00]:|r {}|r' WHERE `entry` = 6615; +UPDATE `acore_string` SET `locale_esES` = 'El silencio está activado para {}.', `locale_esMX` = 'El silencio está activado para {}.' WHERE `entry` = 6616; +UPDATE `acore_string` SET `locale_esES` = 'GM Spectator está activado.', `locale_esMX` = 'GM Spectator está activado.' WHERE `entry` = 6617; +UPDATE `acore_string` SET `locale_esES` = 'GM Spectator está desactivado.', `locale_esMX` = 'GM Spectator está desactivado.' WHERE `entry` = 6618; +UPDATE `acore_string` SET `locale_esES` = 'MUNDO: Negando conexiones.', `locale_esMX` = 'MUNDO: Negando conexiones.' WHERE `entry` = 7523; +UPDATE `acore_string` SET `locale_esES` = 'MUNDO: Aceptando conexiones.', `locale_esMX` = 'MUNDO: Aceptando conexiones.' WHERE `entry` = 7524; +UPDATE `acore_string` SET `locale_esES` = '¡La Horda ha tomado el mirador!', `locale_esMX` = '¡La Horda ha tomado el mirador!' WHERE `entry` = 10001; +UPDATE `acore_string` SET `locale_esES` = '¡La Alianza ha tomado el mirador!', `locale_esMX` = '¡La Alianza ha tomado el mirador!' WHERE `entry` = 10002; +UPDATE `acore_string` SET `locale_esES` = '¡La Horda ha tomado el estadio!', `locale_esMX` = '¡La Horda ha tomado el estadio!' WHERE `entry` = 10003; +UPDATE `acore_string` SET `locale_esES` = '¡La Alianza ha tomado el estadio!', `locale_esMX` = '¡La Alianza ha tomado el estadio!' WHERE `entry` = 10004; +UPDATE `acore_string` SET `locale_esES` = '¡Dame la bandera, la llevaré a la baliza central para la gloria de la Alianza!', `locale_esMX` = '¡Dame la bandera, la llevaré a la baliza central para la gloria de la Alianza!' WHERE `entry` = 10054; +UPDATE `acore_string` SET `locale_esES` = '¡Dame la bandera, la llevaré a la baliza central para la gloria de la Horda!', `locale_esMX` = '¡Dame la bandera, la llevaré a la baliza central para la gloria de la Horda!' WHERE `entry` = 10055; +UPDATE `acore_string` SET `locale_esES` = 'La batalla por Playa de los Ancestros comienza en 2 minutos.', `locale_esMX` = 'La batalla por Playa de los Ancestros comienza en 2 minutos.' WHERE `entry` = 10056; +UPDATE `acore_string` SET `locale_esES` = 'La batalla por Playa de los Ancestros comienza en 1 minuto.', `locale_esMX` = 'La batalla por Playa de los Ancestros comienza en 1 minuto.' WHERE `entry` = 10057; +UPDATE `acore_string` SET `locale_esES` = 'La batalla por la Playa de los Ancestros comienza en 30 segundos. ¡Prepárense!', `locale_esMX` = 'La batalla por la Playa de los Ancestros comienza en 30 segundos. ¡Prepárense!' WHERE `entry` = 10058; +UPDATE `acore_string` SET `locale_esES` = '¡Que comience la batalla por Playa de los Ancestros!', `locale_esMX` = '¡Que comience la batalla por Playa de los Ancestros!' WHERE `entry` = 10059; +UPDATE `acore_string` SET `locale_esES` = '¡El {} está bajo ataque!', `locale_esMX` = '¡El {} está bajo ataque!' WHERE `entry` = 10060; +UPDATE `acore_string` SET `locale_esES` = '¡El {} fue destruido!', `locale_esMX` = '¡El {} fue destruido!' WHERE `entry` = 10061; +UPDATE `acore_string` SET `locale_esES` = 'Ronda 1 - terminada!', `locale_esMX` = 'Ronda 1 - terminada!' WHERE `entry` = 10062; +UPDATE `acore_string` SET `locale_esES` = '¡La Alianza capturó el portal titán!', `locale_esMX` = '¡La Alianza capturó el portal titán!' WHERE `entry` = 10063; +UPDATE `acore_string` SET `locale_esES` = '¡La Horda capturó el portal titán!', `locale_esMX` = '¡La Horda capturó el portal titán!' WHERE `entry` = 10064; +UPDATE `acore_string` SET `locale_esES` = 'La segunda ronda de la Batalla por la Playa de los Ancestros comienza en 1 minuto.', `locale_esMX` = 'La segunda ronda de la Batalla por la Playa de los Ancestros comienza en 1 minuto.' WHERE `entry` = 10065; +UPDATE `acore_string` SET `locale_esES` = 'La segunda ronda empieza en 30 segundos. ¡Prepárense!', `locale_esMX` = 'La segunda ronda empieza en 30 segundos. ¡Prepárense!' WHERE `entry` = 10066; +UPDATE `acore_string` SET `locale_esES` = '¡La cámara ha sido profanada! ¡La reliquia del titán está vulnerable!', `locale_esMX` = '¡La cámara ha sido profanada! ¡La reliquia del titán está vulnerable!' WHERE `entry` = 10067; +UPDATE `acore_string` SET `locale_esES` = '|cffffff00[|c00077766Mensaje automático|cffffff00]: |cFFF222FF{}|r', `locale_esMX` = '|cffffff00[|c00077766Mensaje automático|cffffff00]: |cFFF222FF{}|r' WHERE `entry` = 11000; +UPDATE `acore_string` SET `locale_esES` = 'No has elegido -1 o el realmID actual en el que te encuentras.', `locale_esMX` = 'No has elegido -1 o el realmID actual en el que te encuentras.' WHERE `entry` = 11001; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha expulsado a {}, motivo: {}', `locale_esMX` = 'Servidor: {} ha expulsado a {}, motivo: {}' WHERE `entry` = 11002; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha silenciado a {} por {}, motivo: {}', `locale_esMX` = 'Servidor: {} ha silenciado a {} por {}, motivo: {}' WHERE `entry` = 11003; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado al personaje {} por {}, motivo: {}', `locale_esMX` = 'Servidor: {} ha baneado al personaje {} por {}, motivo: {}' WHERE `entry` = 11004; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado al personaje {} permanentemente, motivo: {}', `locale_esMX` = 'Servidor: {} ha baneado al personaje {} permanentemente, motivo: {}' WHERE `entry` = 11005; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado la cuenta {} por {}, motivo: {}', `locale_esMX` = 'Servidor: {} ha baneado la cuenta {} por {}, motivo: {}' WHERE `entry` = 11006; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado la cuenta {} permanentemente, motivo: {}', `locale_esMX` = 'Servidor: {} ha baneado la cuenta {} permanentemente, motivo: {}' WHERE `entry` = 11007; +UPDATE `acore_string` SET `locale_esES` = 'Se han borrado los datos almacenados en caché del carácter {} ({}).', `locale_esMX` = 'Se han borrado los datos almacenados en caché del carácter {} ({}).' WHERE `entry` = 5064; +UPDATE `acore_string` SET `locale_esES` = 'Se han actualizado los datos almacenados en caché del carácter {} ({}).', `locale_esMX` = 'Se han actualizado los datos almacenados en caché del carácter {} ({}).' WHERE `entry` = 5065; +UPDATE `acore_string` SET `locale_esES` = 'Caché no encontrado para el personaje {}.', `locale_esMX` = 'Caché no encontrado para el personaje {}.' WHERE `entry` = 5066; +UPDATE `acore_string` SET `locale_esES` = 'Se agregó la misión {} ({}).', `locale_esMX` = 'Se agregó la misión {} ({}).' WHERE `entry` = 5067; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) no encontrada en el registro de misiones.', `locale_esMX` = 'Misión {} ({}) no encontrada en el registro de misiones.' WHERE `entry` = 5068; +UPDATE `acore_string` SET `locale_esES` = 'La misión debe estar activa y completa antes de obtener la recompensa.', `locale_esMX` = 'La misión debe estar activa y completa antes de obtener la recompensa.' WHERE `entry` = 5069; +UPDATE `acore_string` SET `locale_esES` = 'El comando está deshabilitado por configuración.', `locale_esMX` = 'El comando está deshabilitado por configuración.' WHERE `entry` = 5070; +UPDATE `acore_string` SET `locale_esES` = 'La entrada de costo extendido proporcionada no existe.', `locale_esMX` = 'La entrada de costo extendido proporcionada no existe.' WHERE `entry` = 5071; +UPDATE `acore_string` SET `locale_esES` = 'Reembolsar {} ({}) haría que el objetivo supere el límite de puntos de honor (límite: {}, honor actual: {}, honor a reembolsar: {}).', `locale_esMX` = 'Reembolsar {} ({}) haría que el objetivo supere el límite de puntos de honor (límite: {}, honor actual: {}, honor a reembolsar: {}).' WHERE `entry` = 5072; +UPDATE `acore_string` SET `locale_esES` = 'Un intento de reembolsar su item {} ha fallado porque superaría el límite de puntos de honor.', `locale_esMX` = 'Un intento de reembolsar su item {} ha fallado porque superaría el límite de puntos de honor.' WHERE `entry` = 5073; +UPDATE `acore_string` SET `locale_esES` = 'Se reembolsó el item {} ({}), restaurando {} puntos de honor.', `locale_esMX` = 'Se reembolsó el item {} ({}), restaurando {} puntos de honor.' WHERE `entry` = 5074; +UPDATE `acore_string` SET `locale_esES` = 'Reembolsar {} ({}) enviaría al objetivo por encima del límite de puntos de arena (límite: {}, puntos de arena actuales: {}, puntos de arena a reembolsar: {}).', `locale_esMX` = 'Reembolsar {} ({}) enviaría al objetivo por encima del límite de puntos de arena (límite: {}, puntos de arena actuales: {}, puntos de arena a reembolsar: {}).' WHERE `entry` = 5075; +UPDATE `acore_string` SET `locale_esES` = 'Un intento de reembolsar tu item {} ha fallado porque superaría el límite de puntos de arena.', `locale_esMX` = 'Un intento de reembolsar tu item {} ha fallado porque superaría el límite de puntos de arena.' WHERE `entry` = 5076; +UPDATE `acore_string` SET `locale_esES` = 'Se reembolsó el item {} ({}), lo que restauró {} puntos de arena.', `locale_esMX` = 'Se reembolsó el item {} ({}), lo que restauró {} puntos de arena.' WHERE `entry` = 5077; +UPDATE `acore_string` SET `locale_esES` = 'Objeto no encontrado en el inventario del personaje (banco incluido)', `locale_esMX` = 'Objeto no encontrado en el inventario del personaje (banco incluido)' WHERE `entry` = 5078; +UPDATE `acore_string` SET `locale_esES` = 'Debes tener al menos el nivel {} para deshabilitar la transmisión automática de mensajes.', `locale_esMX` = 'Debes tener al menos el nivel {} para deshabilitar la transmisión automática de mensajes.' WHERE `entry` = 5079; +UPDATE `acore_string` SET `locale_esES` = 'Ahora estás recibiendo mensajes globales {}.', `locale_esMX` = 'Ahora estás recibiendo mensajes globales {}.' WHERE `entry` = 5080; +UPDATE `acore_string` SET `locale_esES` = 'Ya no recibirás mensajes globales {}.', `locale_esMX` = 'Ya no recibirás mensajes globales {}.' WHERE `entry` = 5081; +UPDATE `acore_string` SET `locale_esES` = 'Sintaxis incorrecta. Especifique "comienzo" o "fin".', `locale_esMX` = 'Sintaxis incorrecta. Especifique "comienzo" o "fin".' WHERE `entry` = 5082; +UPDATE `acore_string` SET `locale_esES` = 'El carácter {} ({}) se movió de la cuenta {} ({}) a la cuenta {} ({}).', `locale_esMX` = 'El carácter {} ({}) se movió de la cuenta {} ({}) a la cuenta {} ({}).' WHERE `entry` = 5083; +UPDATE `acore_string` SET `locale_esES` = '¡Fallo en el lanzamiento del hechizo! SpellCastResult devuelto: {} ({}).', `locale_esMX` = '¡Fallo en el lanzamiento del hechizo! SpellCastResult devuelto: {} ({}).' WHERE `entry` = 5084; +UPDATE `acore_string` SET `locale_esES` = '¡El objeto {} (entrada: {} guid: {}) ha reaparecido!', `locale_esMX` = '¡El objeto {} (entrada: {} guid: {}) ha reaparecido!' WHERE `entry` = 5085; +UPDATE `acore_string` SET `locale_esES` = 'No se encontraron puertas dentro del alcance ({} yardas).', `locale_esMX` = 'No se encontraron puertas dentro del alcance ({} yardas).' WHERE `entry` = 5086; +UPDATE `acore_string` SET `locale_esES` = '¡La puerta {} (Entry: {}) está abierta!', `locale_esMX` = '¡La puerta {} (Entry: {}) está abierta!' WHERE `entry` = 5087; diff --git a/data/sql/updates/db_world/2026_03_03_02.sql b/data/sql/updates/db_world/2026_03_03_02.sql new file mode 100644 index 000000000..4892600d4 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_03_02.sql @@ -0,0 +1,9 @@ +-- DB update 2026_03_03_01 -> 2026_03_03_02 +-- Add acore_string entries for reset all honor/arena messages +DELETE FROM `acore_string` WHERE `entry` IN (5118, 5119); +INSERT INTO `acore_string` (`entry`, `content_default`, `locale_koKR`, `locale_frFR`, `locale_deDE`, `locale_zhCN`, `locale_zhTW`, `locale_esES`, `locale_esMX`, `locale_ruRU`) VALUES +(5118, 'Honor points have been reset for all players.', NULL, NULL, 'Ehrenpunkte wurden für alle Spieler zurückgesetzt.', '所有玩家的荣誉点数已被重置。', NULL, 'Los puntos de honor se han restablecido para todos los jugadores.', 'Los puntos de honor se han restablecido para todos los jugadores.', NULL), +(5119, 'Arena points have been reset for all players.', NULL, NULL, 'Arenapunkte wurden für alle Spieler zurückgesetzt.', '所有玩家的竞技场点数已被重置。', NULL, 'Los puntos de arena se han restablecido para todos los jugadores.', 'Los puntos de arena se han restablecido para todos los jugadores.', NULL); + +-- Update reset all command description to include honor and arena +UPDATE `command` SET `help` = 'Syntax: .reset all spells\r\n\r\nSyntax: .reset all talents\r\n\r\nSyntax: .reset all honor\r\n\r\nSyntax: .reset all arena\r\n\r\nRequests a reset of spells or talents (including talents for all of a character\'s pets, if any) at the next login for each existing character, or immediately resets honor points or arena points for all characters.' WHERE `name` = 'reset all'; diff --git a/data/sql/updates/db_world/2026_03_03_03.sql b/data/sql/updates/db_world/2026_03_03_03.sql new file mode 100644 index 000000000..7265d5cfc --- /dev/null +++ b/data/sql/updates/db_world/2026_03_03_03.sql @@ -0,0 +1,82 @@ +-- DB update 2026_03_03_02 -> 2026_03_03_03 + +-- Delete old Waypoints +DELETE FROM `waypoint_data` WHERE (`id` IN (1362350, 1362360, 1362370, 1362380, 1362410, 1362420, 1362430, 1362440)); + +-- Add Waypoints +DELETE FROM `waypoint_data` WHERE (`id` IN (13624300, 13624100, 13623700, 13623500)); +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES +(13624300, 1, 604.4754, 267.1886, 361.7973, NULL, 0, 1, 0, 100, 0), +(13624300, 2, 627.0501, 244.33551, 361.79727, NULL, 0, 1, 0, 100, 0), +(13624300, 3, 622.08185, 234.90192, 361.82504, NULL, 0, 1, 0, 100, 0), +(13624300, 4, 621.6751, 208.47331, 361.79953, NULL, 0, 1, 0, 100, 0), +(13624300, 5, 621.5815, 192.92903, 361.8038, NULL, 0, 1, 0, 100, 0), +(13624300, 6, 631.5601, 184.55794, 361.7762, NULL, 0, 1, 0, 100, 0), +(13624300, 7, 645.13855, 191.671, 361.7304, NULL, 0, 1, 0, 100, 0), +(13624300, 8, 631.5601, 184.55794, 361.7762, NULL, 0, 1, 0, 100, 0), +(13624300, 9, 621.5815, 192.92903, 361.8038, NULL, 0, 1, 0, 100, 0), +(13624300, 10, 621.6751, 208.47331, 361.79953, NULL, 0, 1, 0, 100, 0), +(13624300, 11, 622.08185, 234.90192, 361.82504, NULL, 0, 1, 0, 100, 0), +(13624300, 12, 627.0501, 244.33551, 361.79727, NULL, 0, 1, 0, 100, 0), +(13624100, 1, 549.0635, 224.78473, 361.80777, NULL, 0, 1, 0, 100, 0), +(13624100, 2, 548.9704, 210.00739, 361.80957, NULL, 0, 1, 0, 100, 0), +(13624100, 3, 552.8792, 192.92361, 361.81677, NULL, 0, 1, 0, 100, 0), +(13624100, 4, 530.5029, 182.94705, 361.82037, NULL, 0, 1, 0, 100, 0), +(13624100, 5, 552.8792, 192.92361, 361.81677, NULL, 0, 1, 0, 100, 0), +(13624100, 6, 548.9704, 210.00739, 361.80957, NULL, 0, 1, 0, 100, 0), +(13624100, 7, 549.0635, 224.78473, 361.80777, NULL, 0, 1, 0, 100, 0), +(13624100, 8, 548.6949, 244.27539, 361.80786, NULL, 0, 1, 0, 100, 0), +(13624100, 9, 574.47375, 272.91406, 361.7973, NULL, 0, 1, 0, 100, 0), +(13624100, 10, 560.374, 298.37717, 361.7973, NULL, 0, 1, 0, 100, 0), +(13624100, 11, 574.47375, 272.91406, 361.7973, NULL, 0, 1, 0, 100, 0), +(13624100, 12, 548.6949, 244.27539, 361.80786, NULL, 0, 1, 0, 100, 0), +(13623700, 1, 562.5166, 343.37436, 360.78677, NULL, 0, 0, 0, 100, 0), +(13623700, 2, 562.6833, 320.10135, 360.7922, NULL, 0, 0, 0, 100, 0), +(13623700, 3, 563.0174, 296.4394, 360.7973, NULL, 0, 0, 0, 100, 0), +(13623700, 4, 563.0178, 296.53494, 360.7973, NULL, 0, 0, 0, 100, 0), +(13623700, 5, 562.9028, 271.7361, 360.79727, NULL, 0, 0, 0, 100, 0), +(13623700, 6, 562.88605, 247.25673, 360.8035, NULL, 0, 0, 0, 100, 0), +(13623700, 7, 563.201, 223.2819, 360.81, NULL, 0, 0, 0, 100, 0), +(13623700, 8, 562.9016, 212.17578, 360.81314, NULL, 0, 0, 0, 100, 0), +(13623700, 9, 563.201, 223.2819, 360.81, NULL, 0, 0, 0, 100, 0), +(13623700, 10, 562.88605, 247.25673, 360.8035, NULL, 0, 0, 0, 100, 0), +(13623700, 11, 562.9028, 271.7361, 360.79727, NULL, 0, 0, 0, 100, 0), +(13623700, 12, 563.0178, 296.53494, 360.7973, NULL, 0, 0, 0, 100, 0), +(13623700, 13, 562.6833, 320.10135, 360.7922, NULL, 0, 0, 0, 100, 0), +(13623500, 1, 612.53937, 320.58377, 360.78772, NULL, 0, 0, 0, 100, 0), +(13623500, 2, 612.791, 343.58246, 360.78214, NULL, 0, 0, 0, 100, 0), +(13623500, 3, 612.53937, 320.58377, 360.78772, NULL, 0, 0, 0, 100, 0), +(13623500, 4, 612.7063, 296.5853, 360.79727, NULL, 0, 0, 0, 100, 0), +(13623500, 5, 612.72015, 258.76224, 360.79724, NULL, 0, 0, 0, 100, 0), +(13623500, 6, 613.11273, 233.99089, 360.79727, NULL, 0, 0, 0, 100, 0), +(13623500, 7, 613.4015, 212.1148, 360.80057, NULL, 0, 0, 0, 100, 0), +(13623500, 8, 613.11273, 233.99089, 360.79727, NULL, 0, 0, 0, 100, 0), +(13623500, 9, 612.72015, 258.6847, 360.79727, NULL, 0, 0, 0, 100, 0), +(13623500, 10, 612.7063, 296.5853, 360.79727, NULL, 0, 0, 0, 100, 0); + +-- Set PathIDs and remove the old ones. +UPDATE `creature_addon` SET `path_id` = 0 WHERE (`guid` IN (136236, 136238, 136242, 136244)); +UPDATE `creature_addon` SET `path_id` = 13624300 WHERE (`guid` IN(136243)); +UPDATE `creature_addon` SET `path_id` = 13624100 WHERE (`guid` IN(136241)); +UPDATE `creature_addon` SET `path_id` = 13623700 WHERE (`guid` IN(136237)); +UPDATE `creature_addon` SET `path_id` = 13623500 WHERE (`guid` IN(136235)); + +-- Edit creature table. +UPDATE `creature` SET `wander_distance` = 0 WHERE (`id1` IN (34085, 34086)); +UPDATE `creature` SET `MovementType` = 0 WHERE (`id1` = 34086) AND (`guid` IN(136242, 136244)); +UPDATE `creature` SET `MovementType` = 0 WHERE (`id1` = 34085) AND (`guid` IN(136236, 136238)); + +-- Edit spawn point for a Magma Rager. +UPDATE `creature` SET `position_x` = 554.74304, `position_y` = 270.04782, `position_z` = 360.8013, `orientation` = 1.8456981 WHERE (`guid` = 136242) AND (`id1` = 34086); + +-- Add Formations +DELETE FROM `creature_formations` WHERE (`LeaderGUID` IN (136241, 136243, 136237, 136235)); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(136241, 136241, 0, 0, 515, 0, 0), +(136241, 136242, 6, 90, 515, 0, 0), +(136243, 136243, 0, 0, 515, 0, 0), +(136243, 136244, 6, 90, 515, 0, 0), +(136237, 136237, 0, 0, 515, 0, 0), +(136237, 136238, 6, 90, 515, 0, 0), +(136235, 136235, 0, 0, 515, 0, 0), +(136235, 136236, 6, 90, 515, 0, 0); diff --git a/data/sql/updates/db_world/2026_03_04_00.sql b/data/sql/updates/db_world/2026_03_04_00.sql new file mode 100644 index 000000000..9bb257124 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_04_00.sql @@ -0,0 +1,3 @@ +-- DB update 2026_03_03_03 -> 2026_03_04_00 +-- Fix Seal of Command (20375) not proccing from HotR and ShoR +UPDATE `spell_proc` SET `SchoolMask` = 0, `SpellFamilyName` = 10, `SpellFamilyMask1` = 0x168000 WHERE `SpellId` = 20375; diff --git a/data/sql/updates/db_world/2026_03_04_01.sql b/data/sql/updates/db_world/2026_03_04_01.sql new file mode 100644 index 000000000..b98e7e611 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_04_01.sql @@ -0,0 +1,22 @@ +-- DB update 2026_03_04_00 -> 2026_03_04_01 +-- +DELETE FROM `gameobject_summon_groups` WHERE `summonerId` = 3737 AND `summonerType` = 1; +INSERT INTO `gameobject_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `respawnTime`, `Comment`) VALUES +(3737, 1, 0, 3743, -1271.309814453125, -3013.196533203125, 71.92229461669921875, 0.488691210746765136, 0, 0, 0.241921424865722656, 0.970295846462249755, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1272.32763671875, -3010.503662109375, 71.3295440673828125, 5.602506637573242187, 0, 0, -0.33380699157714843, 0.942641437053680419, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1272.4622802734375, -3016.277099609375, 72.82135009765625, 0.593410074710845947, 0, 0, 0.292370796203613281, 0.95630502700805664, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1273.7415771484375, -3017.27490234375, 73.04929351806640625, 3.78736734390258789, 0, 0, -0.94832324981689453, 0.317305892705917358, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1274.7701416015625, -3008.184814453125, 71.509735107421875, 0, 0, 0, 0, 1, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1275.597900390625, -3016.52978515625, 72.68366241455078125, 3.508116960525512695, 0, 0, -0.98325443267822265, 0.182238012552261352, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1277.4346923828125, -3009.509521484375, 71.5238800048828125, 0, 0, 0, 0, 1, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1278.46435546875, -3015.849853515625, 72.256317138671875, 0, 0, 0, 0, 1, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1279.0081787109375, -3010.58642578125, 71.55875396728515625, 2.076939344406127929, 0, 0, 0.861628532409667968, 0.50753939151763916, 120, 'Bubbling Fissure - Fissure Plant'), +(3737, 1, 0, 3743, -1279.7412109375, -3013.78369140625, 71.58141326904296875, 3.804818391799926757, 0, 0, -0.94551849365234375, 0.325568377971649169, 120, 'Bubbling Fissure - Fissure Plant'); + +DELETE FROM `smart_scripts` WHERE (`entryorguid` = 3737) AND (`source_type` = 1) AND (`id` IN (1)); +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(3737, 1, 1, 0, 71, 0, 100, 0, 525, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bubbling Fissure - On Event 525 Inform - Spawn Fissure Plants Nearby'); + +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 2) AND (`SourceEntry` = 3737) AND (`SourceId` = 1) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 30) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 3743) AND (`ConditionValue2` = 10) AND (`ConditionValue3` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 2, 3737, 1, 0, 30, 1, 3743, 10, 0, 1, 0, 0, '', 'Only Spawn Fissure Plants if there are none already nearby.'); diff --git a/data/sql/updates/db_world/2026_03_04_02.sql b/data/sql/updates/db_world/2026_03_04_02.sql new file mode 100644 index 000000000..dd6d68b91 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_04_02.sql @@ -0,0 +1,6 @@ +-- DB update 2026_03_04_01 -> 2026_03_04_02 +-- +DELETE FROM `creature_loot_template` WHERE (`Entry` = 30260) AND (`Item` IN (45912, 1, 2)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(30260, 1, 1200077, 0, 0, 1, 5, 1, 1, 'Stoic Mammoth - World Loot Level 77'), +(30260, 2, 1200078, 0, 0, 1, 5, 1, 1, 'Stoic Mammoth - World Loot Level 78'); diff --git a/data/sql/updates/db_world/2026_03_04_03.sql b/data/sql/updates/db_world/2026_03_04_03.sql new file mode 100644 index 000000000..83a720c1c --- /dev/null +++ b/data/sql/updates/db_world/2026_03_04_03.sql @@ -0,0 +1,6 @@ +-- DB update 2026_03_04_02 -> 2026_03_04_03 + +-- Set delay and orientations. +UPDATE `waypoint_data` SET `delay` = 30000 WHERE (`id` IN(1365990, 1366000)); +UPDATE `waypoint_data` SET `orientation` = 3.8013816 WHERE `id` = 1365990 AND `point` = 2; +UPDATE `waypoint_data` SET `orientation` = 2.4547093 WHERE `id` = 1366000 AND `point` = 1; diff --git a/data/sql/updates/db_world/2026_03_05_00.sql b/data/sql/updates/db_world/2026_03_05_00.sql new file mode 100644 index 000000000..7292adcf3 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_05_00.sql @@ -0,0 +1,18 @@ +-- DB update 2026_03_04_03 -> 2026_03_05_00 +DELETE FROM `spell_script_names` WHERE `spell_id` IN (64436, 64444); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(64436, 'spell_mimiron_magnetic_core_aura'), +(64444, 'spell_mimiron_magnetic_core_summon'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 64436; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 2, 64436, 0, 0, 31, 0, 3, 33670, 0, 0, 0, 0, '', 'Mimiron - Magnetic Core hits Aerial Command Unit only'); + +UPDATE `creature_template` SET `unit_flags` = `unit_flags`&~4 WHERE `entry` IN (33670, 34109); + +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = 34068; + +DELETE FROM `smart_scripts` WHERE `entryorguid` = 34068 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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(34068, 0, 0, 1, 25, 0, 100, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Mimiron - Magnetic Core - On Reset - Set React State Passive'), +(34068, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 64436, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Mimiron - Magnetic Core - Linked - Cast Magnetic Core Triggered'); diff --git a/data/sql/updates/db_world/2026_03_05_01.sql b/data/sql/updates/db_world/2026_03_05_01.sql new file mode 100644 index 000000000..ef7c6f8d8 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_05_01.sql @@ -0,0 +1,35 @@ +-- DB update 2026_03_05_00 -> 2026_03_05_01 + +-- Add new creatures (sniffed). +DELETE FROM `creature` WHERE (`id1` IN (34273, 34269, 34271)) AND (`guid` IN (137497, 137512, 137490, 137491, 137513, 137514, 137517)); +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`, `Comment`, `VerifiedBuild`) VALUES +(137497, 34273, 0, 0, 603, 0, 0, 3, 1, 0, 810.68054, 60.84028, 409.88696, 4.08407, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0), +(137512, 34273, 0, 0, 603, 0, 0, 3, 1, 0, 812.4308, -80.03114, 409.88696, 4.08407, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0), +(137490, 34269, 0, 0, 603, 0, 0, 3, 1, 0, 806.35767, 87.65625, 409.88696, 5.28834, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0), +(137491, 34269, 0, 0, 603, 0, 0, 3, 1, 0, 817.89874, -110.676, 409.88696, 3.59537, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0), +(137513, 34269, 0, 0, 603, 0, 0, 3, 1, 0, 789.4983, 51.805557, 409.88696, 3.59537, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0), +(137514, 34271, 0, 0, 603, 0, 0, 3, 1, 0, 798.1429, -72.44043, 409.88696, 3.15904, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0), +(137517, 34271, 0, 0, 603, 0, 0, 3, 1, 0, 798.1042, 55.526043, 409.88696, 3.15904, 604800, 0, 0, 252000, 0, 0, 0, 0, 0, '', NULL, 0); + +-- Add VerifiedBuild for all spawn positions (old spawns are confirmed by my sniffs). +UPDATE `creature` SET `VerifiedBuild` = 66198 WHERE (`id1` IN (34267, 34273, 34269, 34271)); + +-- Remove old formations and add two new ones. +DELETE FROM `creature_formations` WHERE (`LeaderGUID` IN (137497, 137495, 137486, 137488)); +INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES +(137497, 137497, 0, 0, 3, 0, 0), +(137497, 137490, 0, 0, 3, 0, 0), +(137497, 137492, 0, 0, 3, 0, 0), +(137497, 137485, 0, 0, 3, 0, 0), +(137497, 137488, 0, 0, 3, 0, 0), +(137497, 137517, 0, 0, 3, 0, 0), +(137497, 137513, 0, 0, 3, 0, 0), +(137497, 137494, 0, 0, 3, 0, 0), +(137495, 137495, 0, 0, 3, 0, 0), +(137495, 137491, 0, 0, 3, 0, 0), +(137495, 137486, 0, 0, 3, 0, 0), +(137495, 137487, 0, 0, 3, 0, 0), +(137495, 137512, 0, 0, 3, 0, 0), +(137495, 137493, 0, 0, 3, 0, 0), +(137495, 137514, 0, 0, 3, 0, 0), +(137495, 137489, 0, 0, 3, 0, 0); diff --git a/data/sql/updates/db_world/2026_03_05_02.sql b/data/sql/updates/db_world/2026_03_05_02.sql new file mode 100644 index 000000000..fbb5a8588 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_05_02.sql @@ -0,0 +1,11 @@ +-- DB update 2026_03_05_01 -> 2026_03_05_02 +-- +DELETE FROM `reference_loot_template` WHERE `Entry` = 1011822 AND `Item` = 5093; + +DELETE FROM `creature_loot_template` WHERE (`Entry` = 3457) AND (`Item` IN (5093)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(3457, 5093, 0, 30.1, 0, 1, 0, 1, 1, 'Razormane Stalker - Razormane Backstabber'); + +DELETE FROM `creature_loot_template` WHERE (`Entry` = 3456) AND (`Item` IN (5093)); +INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(3456, 5093, 0, 30.34, 0, 1, 0, 1, 1, 'Razormane Pathfinder - Razormane Backstabber'); diff --git a/data/sql/updates/db_world/2026_03_05_03.sql b/data/sql/updates/db_world/2026_03_05_03.sql new file mode 100644 index 000000000..f25986bf8 --- /dev/null +++ b/data/sql/updates/db_world/2026_03_05_03.sql @@ -0,0 +1,47 @@ +-- DB update 2026_03_05_02 -> 2026_03_05_03 + +-- Remove c++ script and set SAI. +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE (`entry` = 34054); + +-- Set Areatrigger Scripts. +DELETE FROM `areatrigger_scripts` WHERE (`entry` IN (5414, 5415, 5416, 5417, 5442, 5443)); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(5414, 'SmartTrigger'), +(5415, 'SmartTrigger'), +(5416, 'SmartTrigger'), +(5417, 'SmartTrigger'), +(5442, 'SmartTrigger'), +(5443, 'SmartTrigger'); + +-- Set Comments. +UPDATE `creature` SET `Comment` = 'Has Personal GUID SAI' WHERE `id1` = 34054; + +-- Set Areatrigger SAI. +DELETE FROM `smart_scripts` WHERE (`source_type` = 2) AND (`entryorguid` IN (5414, 5415, 5416, 5417, 5442, 5443)); +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 +(5414, 2, 0, 0, 46, 0, 100, 0, 5414, 0, 0, 0, 0, 0, 223, 27, 0, 0, 0, 0, 0, 10, 1975200, 34054, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Do Action ID 27'), +(5415, 2, 0, 0, 46, 0, 100, 0, 5415, 0, 0, 0, 0, 0, 223, 28, 0, 0, 0, 0, 0, 10, 1975199, 34054, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Do Action ID 28'), +(5416, 2, 0, 0, 46, 0, 100, 0, 5416, 0, 0, 0, 0, 0, 223, 26, 0, 0, 0, 0, 0, 10, 1975202, 34054, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Do Action ID 26'), +(5417, 2, 0, 0, 46, 0, 100, 0, 5417, 0, 0, 0, 0, 0, 223, 25, 0, 0, 0, 0, 0, 10, 1975203, 34054, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Do Action ID 25'), +(5442, 2, 0, 0, 46, 0, 100, 0, 5442, 0, 0, 0, 0, 0, 223, 24, 0, 0, 0, 0, 0, 10, 1975201, 34054, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Do Action ID 24'), +(5443, 2, 0, 0, 46, 0, 100, 0, 5443, 0, 0, 0, 0, 0, 223, 23, 0, 0, 0, 0, 0, 10, 1975198, 34054, 0, 0, 0, 0, 0, 0, 'Areatrigger - On Trigger - Do Action ID 24'); + +-- Set Bronzebeard Radio Personal GUID SAI. +DELETE FROM `smart_scripts` WHERE (`source_type` = 0) AND (`entryorguid` IN (-1975198, -1975199, -1975200, -1975201, -1975202, -1975203)); +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 +(-1975198, 0, 0, 0, 72, 0, 100, 257, 23, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bronzebeard Radio - On Action 23 Done - Say Line 3 (No Repeat)'), +(-1975199, 0, 0, 0, 72, 0, 100, 257, 28, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bronzebeard Radio - On Action 28 Done - Say Line 8 (No Repeat)'), +(-1975200, 0, 0, 0, 72, 0, 100, 257, 27, 0, 0, 0, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bronzebeard Radio - On Action 27 Done - Say Line 7 (No Repeat)'), +(-1975201, 0, 0, 0, 72, 0, 100, 257, 24, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bronzebeard Radio - On Action 24 Done - Say Line 4 (No Repeat)'), +(-1975202, 0, 0, 0, 72, 0, 100, 257, 26, 0, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bronzebeard Radio - On Action 26 Done - Say Line 6 (No Repeat)'), +(-1975203, 0, 0, 0, 72, 0, 100, 257, 25, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Bronzebeard Radio - On Action 25 Done - Say Line 5 (No Repeat)'); + +-- Set Conditions +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceEntry` IN (-1975198, -1975199, -1975200, -1975201, -1975202, -1975203)) AND (`SourceId` = 0); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, -1975198, 0, 0, 13, 1, 0, 0, 2, 0, 0, 0, '', 'Bronzebeard Radio event only occours if Leviathan in not started'), +(22, 1, -1975199, 0, 0, 13, 1, 0, 0, 2, 0, 0, 0, '', 'Bronzebeard Radio event only occours if Leviathan in not started'), +(22, 1, -1975200, 0, 0, 13, 1, 0, 0, 2, 0, 0, 0, '', 'Bronzebeard Radio event only occours if Leviathan in not started'), +(22, 1, -1975201, 0, 0, 13, 1, 0, 0, 2, 0, 0, 0, '', 'Bronzebeard Radio event only occours if Leviathan in not started'), +(22, 1, -1975202, 0, 0, 13, 1, 0, 0, 2, 0, 0, 0, '', 'Bronzebeard Radio event only occours if Leviathan in not started'), +(22, 1, -1975203, 0, 0, 13, 1, 0, 0, 2, 0, 0, 0, '', 'Bronzebeard Radio event only occours if Leviathan in not started'); diff --git a/data/sql/updates/db_world/2026_03_06_00.sql b/data/sql/updates/db_world/2026_03_06_00.sql new file mode 100644 index 000000000..20194811c --- /dev/null +++ b/data/sql/updates/db_world/2026_03_06_00.sql @@ -0,0 +1,233 @@ +-- DB update 2026_03_05_03 -> 2026_03_06_00 +-- Add Spanish (esES/esMX) translations for acore_string entries that were missing them + +UPDATE `acore_string` SET `locale_esES` = 'El comando ''{}'' no existe.', `locale_esMX` = 'El comando ''{}'' no existe.' WHERE `entry` = 6; +UPDATE `acore_string` SET `locale_esES` = 'El subcomando ''{}{}{}'' es ambiguo:', `locale_esMX` = 'El subcomando ''{}{}{}'' es ambiguo:' WHERE `entry` = 7; +UPDATE `acore_string` SET `locale_esES` = 'Posibles subcomandos:', `locale_esMX` = 'Posibles subcomandos:' WHERE `entry` = 8; +UPDATE `acore_string` SET `locale_esES` = '| Banderas de cuenta:', `locale_esMX` = '| Banderas de cuenta:' WHERE `entry` = 179; +UPDATE `acore_string` SET `locale_esES` = 'Este nombre es obsceno, elige otro.', `locale_esMX` = 'Este nombre es obsceno, elige otro.' WHERE `entry` = 187; +UPDATE `acore_string` SET `locale_esES` = '|- {}', `locale_esMX` = '|- {}' WHERE `entry` = 191; +UPDATE `acore_string` SET `locale_esES` = '|- {} ...', `locale_esMX` = '|- {} ...' WHERE `entry` = 192; +UPDATE `acore_string` SET `locale_esES` = 'El subcomando ''{}{}{}'' no existe.', `locale_esMX` = 'El subcomando ''{}{}{}'' no existe.' WHERE `entry` = 193; +UPDATE `acore_string` SET `locale_esES` = 'El comando ''{}'' es ambiguo:', `locale_esMX` = 'El comando ''{}'' es ambiguo:' WHERE `entry` = 194; +UPDATE `acore_string` SET `locale_esES` = '### USO: .{} ...', `locale_esMX` = '### USO: .{} ...' WHERE `entry` = 195; +UPDATE `acore_string` SET `locale_esES` = 'No hay información de uso detallada asociada a ''{}''.\nEsto no debería ocurrir en comandos de AzerothCore; si ocurre, repórtalo como error.', `locale_esMX` = 'No hay información de uso detallada asociada a ''{}''.\nEsto no debería ocurrir en comandos de AzerothCore; si ocurre, repórtalo como error.' WHERE `entry` = 196; +UPDATE `acore_string` SET `locale_esES` = 'Recuperar id: {} | Objeto: {} ({}) | Cantidad: {}', `locale_esMX` = 'Recuperar id: {} | Objeto: {} ({}) | Cantidad: {}' WHERE `entry` = 197; +UPDATE `acore_string` SET `locale_esES` = 'El jugador no tiene objetos recuperables.', `locale_esMX` = 'El jugador no tiene objetos recuperables.' WHERE `entry` = 198; +UPDATE `acore_string` SET `locale_esES` = 'El jugador no tiene objeto recuperable con id {}.', `locale_esMX` = 'El jugador no tiene objeto recuperable con id {}.' WHERE `entry` = 199; +UPDATE `acore_string` SET `locale_esES` = 'No se puede ir al spawn {} ya que solo existen {}.', `locale_esMX` = 'No se puede ir al spawn {} ya que solo existen {}.' WHERE `entry` = 288; +UPDATE `acore_string` SET `locale_esES` = 'Honrado', `locale_esMX` = 'Honrado' WHERE `entry` = 323; +UPDATE `acore_string` SET `locale_esES` = 'Reverenciado', `locale_esMX` = 'Reverenciado' WHERE `entry` = 324; +UPDATE `acore_string` SET `locale_esES` = 'Exaltado', `locale_esMX` = 'Exaltado' WHERE `entry` = 325; +UPDATE `acore_string` SET `locale_esES` = 'La facción {} ({}) no puede tener reputación.', `locale_esMX` = 'La facción {} ({}) no puede tener reputación.' WHERE `entry` = 326; +UPDATE `acore_string` SET `locale_esES` = ' [sin reputación]', `locale_esMX` = ' [sin reputación]' WHERE `entry` = 327; +UPDATE `acore_string` SET `locale_esES` = 'Personajes en la cuenta {} (Id: {})', `locale_esMX` = 'Personajes en la cuenta {} (Id: {})' WHERE `entry` = 328; +UPDATE `acore_string` SET `locale_esES` = ' {} (GUID {})', `locale_esMX` = ' {} (GUID {})' WHERE `entry` = 329; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron jugadores!', `locale_esMX` = '¡No se encontraron jugadores!' WHERE `entry` = 330; +UPDATE `acore_string` SET `locale_esES` = 'El coste de objeto extendido {} no existe.', `locale_esMX` = 'El coste de objeto extendido {} no existe.' WHERE `entry` = 331; +UPDATE `acore_string` SET `locale_esES` = 'Modo GM activado.', `locale_esMX` = 'Modo GM activado.' WHERE `entry` = 332; +UPDATE `acore_string` SET `locale_esES` = 'Modo GM desactivado.', `locale_esMX` = 'Modo GM desactivado.' WHERE `entry` = 333; +UPDATE `acore_string` SET `locale_esES` = 'Insignia de GM en chat activada.', `locale_esMX` = 'Insignia de GM en chat activada.' WHERE `entry` = 334; +UPDATE `acore_string` SET `locale_esES` = 'Insignia de GM en chat desactivada.', `locale_esMX` = 'Insignia de GM en chat desactivada.' WHERE `entry` = 335; +UPDATE `acore_string` SET `locale_esES` = 'Has reparado todos los objetos de {}.', `locale_esMX` = 'Has reparado todos los objetos de {}.' WHERE `entry` = 336; +UPDATE `acore_string` SET `locale_esES` = '{} ha reparado todos tus objetos.', `locale_esMX` = '{} ha reparado todos tus objetos.' WHERE `entry` = 337; +UPDATE `acore_string` SET `locale_esES` = 'Has puesto el modo caminar sobre agua {} para {}.', `locale_esMX` = 'Has puesto el modo caminar sobre agua {} para {}.' WHERE `entry` = 338; +UPDATE `acore_string` SET `locale_esES` = 'Tu modo caminar sobre agua {} por {}.', `locale_esMX` = 'Tu modo caminar sobre agua {} por {}.' WHERE `entry` = 339; +UPDATE `acore_string` SET `locale_esES` = '{} te sigue ahora.', `locale_esMX` = '{} te sigue ahora.' WHERE `entry` = 340; +UPDATE `acore_string` SET `locale_esES` = '{} no te sigue.', `locale_esMX` = '{} no te sigue.' WHERE `entry` = 341; +UPDATE `acore_string` SET `locale_esES` = '{} ya no te sigue.', `locale_esMX` = '{} ya no te sigue.' WHERE `entry` = 342; +UPDATE `acore_string` SET `locale_esES` = 'La criatura (Entrada: {}) no puede ser domesticada.', `locale_esMX` = 'La criatura (Entrada: {}) no puede ser domesticada.' WHERE `entry` = 343; +UPDATE `acore_string` SET `locale_esES` = 'Ya tienes una mascota.', `locale_esMX` = 'Ya tienes una mascota.' WHERE `entry` = 344; +UPDATE `acore_string` SET `locale_esES` = 'Se solicitará personalización forzada para el jugador {} en el próximo inicio de sesión.', `locale_esMX` = 'Se solicitará personalización forzada para el jugador {} en el próximo inicio de sesión.' WHERE `entry` = 345; +UPDATE `acore_string` SET `locale_esES` = 'Se solicitará personalización forzada para el jugador {} (GUID #{}) en el próximo inicio de sesión.', `locale_esMX` = 'Se solicitará personalización forzada para el jugador {} (GUID #{}) en el próximo inicio de sesión.' WHERE `entry` = 346; +UPDATE `acore_string` SET `locale_esES` = '¡ID de punto de taxi {} no encontrado!', `locale_esMX` = '¡ID de punto de taxi {} no encontrado!' WHERE `entry` = 347; +UPDATE `acore_string` SET `locale_esES` = 'El objeto de juego (Entrada: {}) tiene datos inválidos y no puede generarse.', `locale_esMX` = 'El objeto de juego (Entrada: {}) tiene datos inválidos y no puede generarse.' WHERE `entry` = 348; +UPDATE `acore_string` SET `locale_esES` = '{} (idx:{}) - |cffffffff|Htitle:{}|h[{} {}]|h|r {} {} ', `locale_esMX` = '{} (idx:{}) - |cffffffff|Htitle:{}|h[{} {}]|h|r {} {} ' WHERE `entry` = 349; +UPDATE `acore_string` SET `locale_esES` = '{} (idx:{}) - [{} {}] {} {} ', `locale_esMX` = '{} (idx:{}) - [{} {}] {} {} ' WHERE `entry` = 350; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron títulos!', `locale_esMX` = '¡No se encontraron títulos!' WHERE `entry` = 351; +UPDATE `acore_string` SET `locale_esES` = 'ID de título inválido: {}', `locale_esMX` = 'ID de título inválido: {}' WHERE `entry` = 352; +UPDATE `acore_string` SET `locale_esES` = 'Título {} ({}) añadido a la lista de títulos conocidos del jugador {}.', `locale_esMX` = 'Título {} ({}) añadido a la lista de títulos conocidos del jugador {}.' WHERE `entry` = 353; +UPDATE `acore_string` SET `locale_esES` = 'Título {} ({}) eliminado de la lista de títulos conocidos del jugador {}.', `locale_esMX` = 'Título {} ({}) eliminado de la lista de títulos conocidos del jugador {}.' WHERE `entry` = 354; +UPDATE `acore_string` SET `locale_esES` = 'Título {} ({}) establecido como título actual del jugador {}.', `locale_esMX` = 'Título {} ({}) establecido como título actual del jugador {}.' WHERE `entry` = 355; +UPDATE `acore_string` SET `locale_esES` = 'Título actual del jugador {} restablecido como no conocido.', `locale_esMX` = 'Título actual del jugador {} restablecido como no conocido.' WHERE `entry` = 356; +UPDATE `acore_string` SET `locale_esES` = 'Estado de comandos de trampa:', `locale_esMX` = 'Estado de comandos de trampa:' WHERE `entry` = 357; +UPDATE `acore_string` SET `locale_esES` = 'Modo dios: {}.', `locale_esMX` = 'Modo dios: {}.' WHERE `entry` = 358; +UPDATE `acore_string` SET `locale_esES` = 'Tiempo de lanzamiento: {}.', `locale_esMX` = 'Tiempo de lanzamiento: {}.' WHERE `entry` = 359; +UPDATE `acore_string` SET `locale_esES` = 'Enfriamiento: {}.', `locale_esMX` = 'Enfriamiento: {}.' WHERE `entry` = 360; +UPDATE `acore_string` SET `locale_esES` = 'Poder: {}.', `locale_esMX` = 'Poder: {}.' WHERE `entry` = 361; +UPDATE `acore_string` SET `locale_esES` = 'Caminar sobre agua: {}.', `locale_esMX` = 'Caminar sobre agua: {}.' WHERE `entry` = 362; +UPDATE `acore_string` SET `locale_esES` = 'El jugador {} ya no puede susurrarte.', `locale_esMX` = 'El jugador {} ya no puede susurrarte.' WHERE `entry` = 363; +UPDATE `acore_string` SET `locale_esES` = 'Puntos de taxi: {}.', `locale_esMX` = 'Puntos de taxi: {}.' WHERE `entry` = 364; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r objetos equipados eliminados para {}', `locale_esMX` = '|cffffffff{}|r objetos equipados eliminados para {}' WHERE `entry` = 365; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r objetos en las bolsas equipadas eliminados para {}', `locale_esMX` = '|cffffffff{}|r objetos en las bolsas equipadas eliminados para {}' WHERE `entry` = 366; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r objetos en el banco eliminados para {}', `locale_esMX` = '|cffffffff{}|r objetos en el banco eliminados para {}' WHERE `entry` = 367; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r llaves en llavero eliminadas para {}', `locale_esMX` = '|cffffffff{}|r llaves en llavero eliminadas para {}' WHERE `entry` = 368; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r monedas eliminadas para {}', `locale_esMX` = '|cffffffff{}|r monedas eliminadas para {}' WHERE `entry` = 369; +UPDATE `acore_string` SET `locale_esES` = '|cffffffff{}|r objetos en recompra de vendedores eliminados para {}', `locale_esMX` = '|cffffffff{}|r objetos en recompra de vendedores eliminados para {}' WHERE `entry` = 370; +UPDATE `acore_string` SET `locale_esES` = 'Todos los objetos de {} han sido eliminados:\n|cffffffff{}|r objetos equipados\n|cffffffff{}|r objetos en bolsas\n|cffffffff{}|r objetos en banco\n|cffffffff{}|r llaves en llavero\n|cffffffff{}|r tipos de moneda\n|cffffffff{}|r objetos en recompra de vendedores', `locale_esMX` = 'Todos los objetos de {} han sido eliminados:\n|cffffffff{}|r objetos equipados\n|cffffffff{}|r objetos en bolsas\n|cffffffff{}|r objetos en banco\n|cffffffff{}|r llaves en llavero\n|cffffffff{}|r tipos de moneda\n|cffffffff{}|r objetos en recompra de vendedores' WHERE `entry` = 371; +UPDATE `acore_string` SET `locale_esES` = 'Todos los objetos de {} han sido eliminados (bolsas incluidas):\n|cffffffff{}|r equipados\n|cffffffff{}|r objetos en bolsas\n|cffffffff{}|r objetos en banco\n|cffffffff{}|r llaves en llavero\n|cffffffff{}|r tipos de moneda\n|cffffffff{}|r objetos en recompra de vendedores\n|cffffffff{}|r bolsas estándar\n|cffffffff{}|r bolsas de banco', `locale_esMX` = 'Todos los objetos de {} han sido eliminados (bolsas incluidas):\n|cffffffff{}|r equipados\n|cffffffff{}|r objetos en bolsas\n|cffffffff{}|r objetos en banco\n|cffffffff{}|r llaves en llavero\n|cffffffff{}|r tipos de moneda\n|cffffffff{}|r objetos en recompra de vendedores\n|cffffffff{}|r bolsas estándar\n|cffffffff{}|r bolsas de banco' WHERE `entry` = 372; +UPDATE `acore_string` SET `locale_esES` = '¡La unidad objetivo no tiene el aura {}!', `locale_esMX` = '¡La unidad objetivo no tiene el aura {}!' WHERE `entry` = 373; +UPDATE `acore_string` SET `locale_esES` = '¡No se especificó cantidad de cargas!', `locale_esMX` = '¡No se especificó cantidad de cargas!' WHERE `entry` = 374; +UPDATE `acore_string` SET `locale_esES` = '¡El hechizo {} no puede tener cargas!', `locale_esMX` = '¡El hechizo {} no puede tener cargas!' WHERE `entry` = 375; +UPDATE `acore_string` SET `locale_esES` = 'La zona #{} no tiene cementerios vinculados.', `locale_esMX` = 'La zona #{} no tiene cementerios vinculados.' WHERE `entry` = 460; +UPDATE `acore_string` SET `locale_esES` = 'La zona #{} no tiene cementerios vinculados para la facción: {}.', `locale_esMX` = 'La zona #{} no tiene cementerios vinculados para la facción: {}.' WHERE `entry` = 461; +UPDATE `acore_string` SET `locale_esES` = 'id: {} {} effmask: {} cargas: {} pilas: {} ranura {} duración: {} duraciónmáx: {} {} {} lanzador: {} guid: {}', `locale_esMX` = 'id: {} {} effmask: {} cargas: {} pilas: {} ranura {} duración: {} duraciónmáx: {} {} {} lanzador: {} guid: {}' WHERE `entry` = 468; +UPDATE `acore_string` SET `locale_esES` = 'La unidad objetivo tiene {} auras del tipo {}:', `locale_esMX` = 'La unidad objetivo tiene {} auras del tipo {}:' WHERE `entry` = 469; +UPDATE `acore_string` SET `locale_esES` = 'id: {} eff: {} cantidad: {}', `locale_esMX` = 'id: {} eff: {} cantidad: {}' WHERE `entry` = 470; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) eliminada.', `locale_esMX` = 'Misión {} ({}) eliminada.' WHERE `entry` = 473; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) recompensada.', `locale_esMX` = 'Misión {} ({}) recompensada.' WHERE `entry` = 474; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) completada.', `locale_esMX` = 'Misión {} ({}) completada.' WHERE `entry` = 475; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) ya está activa.', `locale_esMX` = 'Misión {} ({}) ya está activa.' WHERE `entry` = 476; +UPDATE `acore_string` SET `locale_esES` = 'NPC seleccionado por el jugador\nGUID en DB: {}, GUID actual: {}.\nEntrada actual: {} de ({}, {}, {}).\nDisplayID: {} (Nativo: {}).\nFacción: {}.\nnpcFlags: {}.', `locale_esMX` = 'NPC seleccionado por el jugador\nGUID en DB: {}, GUID actual: {}.\nEntrada actual: {} de ({}, {}, {}).\nDisplayID: {} (Nativo: {}).\nFacción: {}.\nnpcFlags: {}.' WHERE `entry` = 539; +UPDATE `acore_string` SET `locale_esES` = 'Nivel: {}.', `locale_esMX` = 'Nivel: {}.' WHERE `entry` = 540; +UPDATE `acore_string` SET `locale_esES` = 'Salud (base): {}. (máx): {}. (actual): {}.', `locale_esMX` = 'Salud (base): {}. (máx): {}. (actual): {}.' WHERE `entry` = 541; +UPDATE `acore_string` SET `locale_esES` = 'Banderas de unidad: {}.\nBanderas de unidad 2: {}.\nBanderas dinámicas: {}.\nPlantilla de facción: {}.', `locale_esMX` = 'Banderas de unidad: {}.\nBanderas de unidad 2: {}.\nBanderas dinámicas: {}.\nPlantilla de facción: {}.' WHERE `entry` = 542; +UPDATE `acore_string` SET `locale_esES` = 'Botín: {} Ratero: {} Desuello: {}', `locale_esMX` = 'Botín: {} Ratero: {} Desuello: {}' WHERE `entry` = 543; +UPDATE `acore_string` SET `locale_esES` = 'Posición: {} {} {}.', `locale_esMX` = 'Posición: {} {} {}.' WHERE `entry` = 544; +UPDATE `acore_string` SET `locale_esES` = '* es vendedor ({})', `locale_esMX` = '* es vendedor ({})' WHERE `entry` = 545; +UPDATE `acore_string` SET `locale_esES` = '* es instructor ({})', `locale_esMX` = '* es instructor ({})' WHERE `entry` = 546; +UPDATE `acore_string` SET `locale_esES` = 'ID de instancia: {}', `locale_esMX` = 'ID de instancia: {}' WHERE `entry` = 547; +UPDATE `acore_string` SET `locale_esES` = 'Jugador{} {} (guid: {}) Cuenta: {} (id: {}) Email: {} NivelGM: {} Última IP: {} Último login: {} Latencia: {}ms', `locale_esMX` = 'Jugador{} {} (guid: {}) Cuenta: {} (id: {}) Email: {} NivelGM: {} Última IP: {} Último login: {} Latencia: {}ms' WHERE `entry` = 548; +UPDATE `acore_string` SET `locale_esES` = 'Raza: {} Clase: {} Tiempo jugado: {} Nivel: {} Dinero: {}o{}p{}c', `locale_esMX` = 'Raza: {} Clase: {} Tiempo jugado: {} Nivel: {} Dinero: {}o{}p{}c' WHERE `entry` = 549; +UPDATE `acore_string` SET `locale_esES` = 'Tiempo de silencio restante: {}, Por: {}, Razón: {}', `locale_esMX` = 'Tiempo de silencio restante: {}, Por: {}, Razón: {}' WHERE `entry` = 550; +UPDATE `acore_string` SET `locale_esES` = 'SetData ejecutado en [GUID: {}, entrada: {}, nombre: {}] Campo: {}, Dato: {}, con {}', `locale_esMX` = 'SetData ejecutado en [GUID: {}, entrada: {}, nombre: {}] Campo: {}, Dato: {}, con {}' WHERE `entry` = 555; +UPDATE `acore_string` SET `locale_esES` = 'Criaturas cercanas encontradas (distancia {}): {} ', `locale_esMX` = 'Criaturas cercanas encontradas (distancia {}): {} ' WHERE `entry` = 556; +UPDATE `acore_string` SET `locale_esES` = 'El evento {} ({}) ha comenzado.', `locale_esMX` = 'El evento {} ({}) ha comenzado.' WHERE `entry` = 600; +UPDATE `acore_string` SET `locale_esES` = 'El evento {} ({}) se ha detenido.', `locale_esMX` = 'El evento {} ({}) se ha detenido.' WHERE `entry` = 601; +UPDATE `acore_string` SET `locale_esES` = ' [recompensado]', `locale_esMX` = ' [recompensado]' WHERE `entry` = 602; +UPDATE `acore_string` SET `locale_esES` = 'Estado de cola para {} (escaramuza {}) (Nivel: {} a {})\nEn cola: {} (se necesitan al menos {} más)', `locale_esMX` = 'Estado de cola para {} (escaramuza {}) (Nivel: {} a {})\nEn cola: {} (se necesitan al menos {} más)' WHERE `entry` = 713; +UPDATE `acore_string` SET `locale_esES` = '|cffff0000[Cola de arena]:|r {} (escaramuza {}) -- [{}-{}] [{}/{}]|r', `locale_esMX` = '|cffff0000[Cola de arena]:|r {} (escaramuza {}) -- [{}-{}] [{}/{}]|r' WHERE `entry` = 726; +UPDATE `acore_string` SET `locale_esES` = 'Para entrar, debes completar la(s) siguiente(s) misión(es):', `locale_esMX` = 'Para entrar, debes completar la(s) siguiente(s) misión(es):' WHERE `entry` = 882; +UPDATE `acore_string` SET `locale_esES` = 'Para entrar, debes completar el/los siguiente(s) logro(s):', `locale_esMX` = 'Para entrar, debes completar el/los siguiente(s) logro(s):' WHERE `entry` = 883; +UPDATE `acore_string` SET `locale_esES` = 'Para entrar, debes tener el/los siguiente(s) objeto(s) en tu inventario:', `locale_esMX` = 'Para entrar, debes tener el/los siguiente(s) objeto(s) en tu inventario:' WHERE `entry` = 884; +UPDATE `acore_string` SET `locale_esES` = '- Nota:', `locale_esMX` = '- Nota:' WHERE `entry` = 885; +UPDATE `acore_string` SET `locale_esES` = 'No puedes entrar. No se cumplen los requisitos de acceso.', `locale_esMX` = 'No puedes entrar. No se cumplen los requisitos de acceso.' WHERE `entry` = 886; +UPDATE `acore_string` SET `locale_esES` = 'Para poder entrar, el nivel de objeto medio de tu equipo debe ser superior o igual a {}. El nivel de objeto medio actual de tu equipo es: {}.', `locale_esMX` = 'Para poder entrar, el nivel de objeto medio de tu equipo debe ser superior o igual a {}. El nivel de objeto medio actual de tu equipo es: {}.' WHERE `entry` = 887; +UPDATE `acore_string` SET `locale_esES` = 'Debes ser de nivel inferior a {} para entrar.', `locale_esMX` = 'Debes ser de nivel inferior a {} para entrar.' WHERE `entry` = 888; +UPDATE `acore_string` SET `locale_esES` = 'Para entrar, el líder del grupo ({}) debe haber completado la(s) siguiente(s) misión(es):', `locale_esMX` = 'Para entrar, el líder del grupo ({}) debe haber completado la(s) siguiente(s) misión(es):' WHERE `entry` = 889; +UPDATE `acore_string` SET `locale_esES` = 'Para entrar, el líder del grupo ({}) debe haber completado el/los siguiente(s) logro(s):', `locale_esMX` = 'Para entrar, el líder del grupo ({}) debe haber completado el/los siguiente(s) logro(s):' WHERE `entry` = 890; +UPDATE `acore_string` SET `locale_esES` = 'Para entrar, el líder del grupo ({}) debe tener el/los siguiente(s) objeto(s) en su inventario:', `locale_esMX` = 'Para entrar, el líder del grupo ({}) debe tener el/los siguiente(s) objeto(s) en su inventario:' WHERE `entry` = 891; +UPDATE `acore_string` SET `locale_esES` = 'La contraseña de una cuenta NO puede tener más de 16 caracteres (límite del cliente). Cuenta NO creada.', `locale_esMX` = 'La contraseña de una cuenta NO puede tener más de 16 caracteres (límite del cliente). Cuenta NO creada.' WHERE `entry` = 1031; +UPDATE `acore_string` SET `locale_esES` = 'Tu ticket ha sido cerrado.', `locale_esMX` = 'Tu ticket ha sido cerrado.' WHERE `entry` = 1334; +UPDATE `acore_string` SET `locale_esES` = 'Has recibido una respuesta al ticket.', `locale_esMX` = 'Has recibido una respuesta al ticket.' WHERE `entry` = 1335; +UPDATE `acore_string` SET `locale_esES` = 'O bien:', `locale_esMX` = 'O bien:' WHERE `entry` = 1500; +UPDATE `acore_string` SET `locale_esES` = 'O: ', `locale_esMX` = 'O: ' WHERE `entry` = 1501; +UPDATE `acore_string` SET `locale_esES` = 'El valor ''{}'' no es válido para el tipo {}.', `locale_esMX` = 'El valor ''{}'' no es válido para el tipo {}.' WHERE `entry` = 1502; +UPDATE `acore_string` SET `locale_esES` = 'Se encontraron secuencias UTF-8 inválidas en la cadena.', `locale_esMX` = 'Se encontraron secuencias UTF-8 inválidas en la cadena.' WHERE `entry` = 1503; +UPDATE `acore_string` SET `locale_esES` = 'El enlace proporcionado tiene datos de enlace inválidos.', `locale_esMX` = 'El enlace proporcionado tiene datos de enlace inválidos.' WHERE `entry` = 1504; +UPDATE `acore_string` SET `locale_esES` = 'La cuenta ''{}'' no existe.', `locale_esMX` = 'La cuenta ''{}'' no existe.' WHERE `entry` = 1505; +UPDATE `acore_string` SET `locale_esES` = 'El ID de cuenta {} no existe.', `locale_esMX` = 'El ID de cuenta {} no existe.' WHERE `entry` = 1506; +UPDATE `acore_string` SET `locale_esES` = '{} no existe.', `locale_esMX` = '{} no existe.' WHERE `entry` = 1507; +UPDATE `acore_string` SET `locale_esES` = 'El personaje ''{}'' no existe.', `locale_esMX` = 'El personaje ''{}'' no existe.' WHERE `entry` = 1508; +UPDATE `acore_string` SET `locale_esES` = '''{}'' no es un nombre de personaje válido.', `locale_esMX` = '''{}'' no es un nombre de personaje válido.' WHERE `entry` = 1509; +UPDATE `acore_string` SET `locale_esES` = 'El ID de logro {} no existe.', `locale_esMX` = 'El ID de logro {} no existe.' WHERE `entry` = 1510; +UPDATE `acore_string` SET `locale_esES` = 'La ubicación de teletransporte {} no existe.', `locale_esMX` = 'La ubicación de teletransporte {} no existe.' WHERE `entry` = 1511; +UPDATE `acore_string` SET `locale_esES` = 'La ubicación de teletransporte ''{}'' no existe.', `locale_esMX` = 'La ubicación de teletransporte ''{}'' no existe.' WHERE `entry` = 1512; +UPDATE `acore_string` SET `locale_esES` = 'El ID de objeto {} no existe.', `locale_esMX` = 'El ID de objeto {} no existe.' WHERE `entry` = 1513; +UPDATE `acore_string` SET `locale_esES` = 'El ID de hechizo {} no existe.', `locale_esMX` = 'El ID de hechizo {} no existe.' WHERE `entry` = 1514; +UPDATE `acore_string` SET `locale_esES` = 'Se esperaba ''{}'', se obtuvo ''{}''.', `locale_esMX` = 'Se esperaba ''{}'', se obtuvo ''{}''.' WHERE `entry` = 1515; +UPDATE `acore_string` SET `locale_esES` = 'El ID de misión {} no existe.', `locale_esMX` = 'El ID de misión {} no existe.' WHERE `entry` = 1516; +UPDATE `acore_string` SET `locale_esES` = '|cff00ff00Completado por|r:|cff00ccff {}|r', `locale_esMX` = '|cff00ff00Completado por|r:|cff00ccff {}|r' WHERE `entry` = 2030; +UPDATE `acore_string` SET `locale_esES` = '|cff00ff00Respuesta añadida|r:|cff00ccff [{}]|r', `locale_esMX` = '|cff00ff00Respuesta añadida|r:|cff00ccff [{}]|r' WHERE `entry` = 2031; +UPDATE `acore_string` SET `locale_esES` = '|cff00ff00Respuesta eliminada por|r:|cff00ccff {}|r', `locale_esMX` = '|cff00ff00Respuesta eliminada por|r:|cff00ccff {}|r' WHERE `entry` = 2032; +UPDATE `acore_string` SET `locale_esES` = 'Consola', `locale_esMX` = 'Consola' WHERE `entry` = 5039; +UPDATE `acore_string` SET `locale_esES` = 'Personaje', `locale_esMX` = 'Personaje' WHERE `entry` = 5040; +UPDATE `acore_string` SET `locale_esES` = 'Permanente', `locale_esMX` = 'Permanente' WHERE `entry` = 5041; +UPDATE `acore_string` SET `locale_esES` = 'Estás al aire libre.', `locale_esMX` = 'Estás al aire libre.' WHERE `entry` = 5042; +UPDATE `acore_string` SET `locale_esES` = 'Estás en interior.', `locale_esMX` = 'Estás en interior.' WHERE `entry` = 5043; +UPDATE `acore_string` SET `locale_esES` = 'No hay VMAP disponible para información del área.', `locale_esMX` = 'No hay VMAP disponible para información del área.' WHERE `entry` = 5044; +UPDATE `acore_string` SET `locale_esES` = 'Espectador GM activado.', `locale_esMX` = 'Espectador GM activado.' WHERE `entry` = 6617; +UPDATE `acore_string` SET `locale_esES` = 'Espectador GM desactivado.', `locale_esMX` = 'Espectador GM desactivado.' WHERE `entry` = 6618; +UPDATE `acore_string` SET `locale_esES` = 'Tipo de movimiento: {}', `locale_esMX` = 'Tipo de movimiento: {}' WHERE `entry` = 11008; +UPDATE `acore_string` SET `locale_esES` = 'Banderas extra: {}', `locale_esMX` = 'Banderas extra: {}' WHERE `entry` = 11009; +UPDATE `acore_string` SET `locale_esES` = 'Ya estás vinculado a {}.', `locale_esMX` = 'Ya estás vinculado a {}.' WHERE `entry` = 11014; +UPDATE `acore_string` SET `locale_esES` = 'Esta criatura no tiene un CreatureAI activo asignado.', `locale_esMX` = 'Esta criatura no tiene un CreatureAI activo asignado.' WHERE `entry` = 11015; +UPDATE `acore_string` SET `locale_esES` = 'Selecciona un jugador o mascota de jugador.', `locale_esMX` = 'Selecciona un jugador o mascota de jugador.' WHERE `entry` = 11016; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha expulsado a {}, razón: {}', `locale_esMX` = 'Servidor: {} ha expulsado a {}, razón: {}' WHERE `entry` = 11002; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha silenciado a {} durante {}, razón: {}', `locale_esMX` = 'Servidor: {} ha silenciado a {} durante {}, razón: {}' WHERE `entry` = 11003; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado al personaje {} durante {}, razón: {}', `locale_esMX` = 'Servidor: {} ha baneado al personaje {} durante {}, razón: {}' WHERE `entry` = 11004; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado permanentemente al personaje {}, razón: {}', `locale_esMX` = 'Servidor: {} ha baneado permanentemente al personaje {}, razón: {}' WHERE `entry` = 11005; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado la cuenta {} durante {}, razón: {}', `locale_esMX` = 'Servidor: {} ha baneado la cuenta {} durante {}, razón: {}' WHERE `entry` = 11006; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado permanentemente la cuenta {}, razón: {}', `locale_esMX` = 'Servidor: {} ha baneado permanentemente la cuenta {}, razón: {}' WHERE `entry` = 11007; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado la IP {} durante {}, razón: {}', `locale_esMX` = 'Servidor: {} ha baneado la IP {} durante {}, razón: {}' WHERE `entry` = 11017; +UPDATE `acore_string` SET `locale_esES` = 'Servidor: {} ha baneado permanentemente la IP {}, razón: {}', `locale_esMX` = 'Servidor: {} ha baneado permanentemente la IP {}, razón: {}' WHERE `entry` = 11018; +UPDATE `acore_string` SET `locale_esES` = 'Alternar vuelo instantáneo', `locale_esMX` = 'Alternar vuelo instantáneo' WHERE `entry` = 30077; +UPDATE `acore_string` SET `locale_esES` = 'Vuelo instantáneo activado', `locale_esMX` = 'Vuelo instantáneo activado' WHERE `entry` = 30078; +UPDATE `acore_string` SET `locale_esES` = 'Vuelo instantáneo desactivado', `locale_esMX` = 'Vuelo instantáneo desactivado' WHERE `entry` = 30079; +UPDATE `acore_string` SET `locale_esES` = 'El archivo ''opcode.txt'' no se encuentra en el directorio de trabajo del servidor.', `locale_esMX` = 'El archivo ''opcode.txt'' no se encuentra en el directorio de trabajo del servidor.' WHERE `entry` = 30080; +UPDATE `acore_string` SET `locale_esES` = '¦ Mapa: {}, Zona: {}, Área: {}', `locale_esMX` = '¦ Mapa: {}, Zona: {}, Área: {}' WHERE `entry` = 35409; + +-- More entries (guild, instance, mail, arena, etc.) +UPDATE `acore_string` SET `locale_esES` = 'Todas las configuraciones se han recargado desde el/los archivo(s) de configuración.', `locale_esMX` = 'Todas las configuraciones se han recargado desde el/los archivo(s) de configuración.' WHERE `entry` = 1157; +UPDATE `acore_string` SET `locale_esES` = '| | Alianza | Horda | Neutral | Total |', `locale_esMX` = '| | Alianza | Horda | Neutral | Total |' WHERE `entry` = 1160; +UPDATE `acore_string` SET `locale_esES` = 'Alianza/Horda/Neutral/Total', `locale_esMX` = 'Alianza/Horda/Neutral/Total' WHERE `entry` = 1161; +UPDATE `acore_string` SET `locale_esES` = 'Cantidad', `locale_esMX` = 'Cantidad' WHERE `entry` = 1164; +UPDATE `acore_string` SET `locale_esES` = 'Proporción de objetos', `locale_esMX` = 'Proporción de objetos' WHERE `entry` = 1165; +UPDATE `acore_string` SET `locale_esES` = 'Gris', `locale_esMX` = 'Gris' WHERE `entry` = 1168; +UPDATE `acore_string` SET `locale_esES` = 'Blanco', `locale_esMX` = 'Blanco' WHERE `entry` = 1169; +UPDATE `acore_string` SET `locale_esES` = 'Verde', `locale_esMX` = 'Verde' WHERE `entry` = 1170; +UPDATE `acore_string` SET `locale_esES` = 'Azul', `locale_esMX` = 'Azul' WHERE `entry` = 1171; +UPDATE `acore_string` SET `locale_esES` = 'Morado', `locale_esMX` = 'Morado' WHERE `entry` = 1172; +UPDATE `acore_string` SET `locale_esES` = 'Naranja', `locale_esMX` = 'Naranja' WHERE `entry` = 1173; +UPDATE `acore_string` SET `locale_esES` = 'Amarillo', `locale_esMX` = 'Amarillo' WHERE `entry` = 1174; +UPDATE `acore_string` SET `locale_esES` = 'Modo bestial: {}', `locale_esMX` = 'Modo bestial: {}' WHERE `entry` = 1186; +UPDATE `acore_string` SET `locale_esES` = 'Nombre AIName: {} ScriptName: {}', `locale_esMX` = 'Nombre AIName: {} ScriptName: {}' WHERE `entry` = 5031; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontró campo de batalla!', `locale_esMX` = '¡No se encontró campo de batalla!' WHERE `entry` = 5032; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontraron criterios de logro!', `locale_esMX` = '¡No se encontraron criterios de logro!' WHERE `entry` = 5033; +UPDATE `acore_string` SET `locale_esES` = '¡No se encontró PvP exterior!', `locale_esMX` = '¡No se encontró PvP exterior!' WHERE `entry` = 5034; +UPDATE `acore_string` SET `locale_esES` = 'EquipmentId: {} (Original: {}).', `locale_esMX` = 'EquipmentId: {} (Original: {}).' WHERE `entry` = 5036; +UPDATE `acore_string` SET `locale_esES` = 'MechanicImmuneMask: {}', `locale_esMX` = 'MechanicImmuneMask: {}' WHERE `entry` = 5037; +UPDATE `acore_string` SET `locale_esES` = 'Banderas de unidad: {}', `locale_esMX` = 'Banderas de unidad: {}' WHERE `entry` = 5038; +UPDATE `acore_string` SET `locale_esES` = 'Mapa: {} | ID: {} | perm: {} | extended: {} | diff: {} | canReset: {} | TTR: {}', `locale_esMX` = 'Mapa: {} | ID: {} | perm: {} | extended: {} | diff: {} | canReset: {} | TTR: {}' WHERE `entry` = 5045; +UPDATE `acore_string` SET `locale_esES` = 'Vinculaciones de jugador: {}', `locale_esMX` = 'Vinculaciones de jugador: {}' WHERE `entry` = 5046; +UPDATE `acore_string` SET `locale_esES` = 'Vinculaciones de grupo: {}', `locale_esMX` = 'Vinculaciones de grupo: {}' WHERE `entry` = 5047; +UPDATE `acore_string` SET `locale_esES` = 'Desvinculando mapa: {} inst: {} perm: {} diff: {} canReset: {} TTR: {}', `locale_esMX` = 'Desvinculando mapa: {} inst: {} perm: {} diff: {} canReset: {} TTR: {}' WHERE `entry` = 5048; +UPDATE `acore_string` SET `locale_esES` = 'Instancias desvinculadas: {}', `locale_esMX` = 'Instancias desvinculadas: {}' WHERE `entry` = 5049; +UPDATE `acore_string` SET `locale_esES` = 'Instancias cargadas: {}', `locale_esMX` = 'Instancias cargadas: {}' WHERE `entry` = 5050; +UPDATE `acore_string` SET `locale_esES` = 'Jugadores en instancias: {}', `locale_esMX` = 'Jugadores en instancias: {}' WHERE `entry` = 5051; +UPDATE `acore_string` SET `locale_esES` = 'Guardados de instancia: {}', `locale_esMX` = 'Guardados de instancia: {}' WHERE `entry` = 5052; +UPDATE `acore_string` SET `locale_esES` = 'Jugadores vinculados: {}', `locale_esMX` = 'Jugadores vinculados: {}' WHERE `entry` = 5053; +UPDATE `acore_string` SET `locale_esES` = 'Grupos vinculados: {}', `locale_esMX` = 'Grupos vinculados: {}' WHERE `entry` = 5054; +UPDATE `acore_string` SET `locale_esES` = 'El mapa no es una mazmorra.', `locale_esMX` = 'El mapa no es una mazmorra.' WHERE `entry` = 5055; +UPDATE `acore_string` SET `locale_esES` = 'El mapa no tiene datos de instancia.', `locale_esMX` = 'El mapa no tiene datos de instancia.' WHERE `entry` = 5056; +UPDATE `acore_string` SET `locale_esES` = 'Estado del jefe {} establecido a {} ({}).', `locale_esMX` = 'Estado del jefe {} establecido a {} ({}).' WHERE `entry` = 5057; +UPDATE `acore_string` SET `locale_esES` = 'Estado del jefe {} es {} ({}).', `locale_esMX` = 'Estado del jefe {} es {} ({}).' WHERE `entry` = 5058; +UPDATE `acore_string` SET `locale_esES` = 'Silencios para la cuenta: {}', `locale_esMX` = 'Silencios para la cuenta: {}' WHERE `entry` = 5059; +UPDATE `acore_string` SET `locale_esES` = 'No hay silencios para la cuenta: {}', `locale_esMX` = 'No hay silencios para la cuenta: {}' WHERE `entry` = 5060; +UPDATE `acore_string` SET `locale_esES` = 'Fecha silencio: {} Tiempo: {} min. Razón: {} Por: {}', `locale_esMX` = 'Fecha silencio: {} Tiempo: {} min. Razón: {} Por: {}' WHERE `entry` = 5061; +UPDATE `acore_string` SET `locale_esES` = 'SpellSchoolImmuneMask: {}', `locale_esMX` = 'SpellSchoolImmuneMask: {}' WHERE `entry` = 5062; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) añadida.', `locale_esMX` = 'Misión {} ({}) añadida.' WHERE `entry` = 5067; +UPDATE `acore_string` SET `locale_esES` = 'Misión {} ({}) no encontrada en el registro de misiones.', `locale_esMX` = 'Misión {} ({}) no encontrada en el registro de misiones.' WHERE `entry` = 5068; +UPDATE `acore_string` SET `locale_esES` = 'La misión debe estar activa y completada antes de recompensar.', `locale_esMX` = 'La misión debe estar activa y completada antes de recompensar.' WHERE `entry` = 5069; +UPDATE `acore_string` SET `locale_esES` = 'El comando está desactivado por configuración.', `locale_esMX` = 'El comando está desactivado por configuración.' WHERE `entry` = 5070; +UPDATE `acore_string` SET `locale_esES` = 'La entrada extendedcost proporcionada no existe.', `locale_esMX` = 'La entrada extendedcost proporcionada no existe.' WHERE `entry` = 5071; +UPDATE `acore_string` SET `locale_esES` = 'Reembolsar {} ({}) superaría el límite de puntos de honor del objetivo (límite: {}, honor actual: {}, honor a reembolsar: {}).', `locale_esMX` = 'Reembolsar {} ({}) superaría el límite de puntos de honor del objetivo (límite: {}, honor actual: {}, honor a reembolsar: {}).' WHERE `entry` = 5072; +UPDATE `acore_string` SET `locale_esES` = 'El objeto {} no se encontró en el inventario del personaje (banco incluido).', `locale_esMX` = 'El objeto {} no se encontró en el inventario del personaje (banco incluido).' WHERE `entry` = 5078; +UPDATE `acore_string` SET `locale_esES` = 'Debes ser al menos de nivel {} para desactivar los mensajes de autodifusión.', `locale_esMX` = 'Debes ser al menos de nivel {} para desactivar los mensajes de autodifusión.' WHERE `entry` = 5079; +UPDATE `acore_string` SET `locale_esES` = 'Ahora recibes mensajes globales {}.', `locale_esMX` = 'Ahora recibes mensajes globales {}.' WHERE `entry` = 5080; +UPDATE `acore_string` SET `locale_esES` = 'Ya no recibirás mensajes globales {}.', `locale_esMX` = 'Ya no recibirás mensajes globales {}.' WHERE `entry` = 5081; +UPDATE `acore_string` SET `locale_esES` = 'Sintaxis incorrecta. Especifica ''starter'' o ''ender''.', `locale_esMX` = 'Sintaxis incorrecta. Especifica ''starter'' o ''ender''.' WHERE `entry` = 5082; +UPDATE `acore_string` SET `locale_esES` = 'Personaje {} ({}) movido de la cuenta {} ({}) a la cuenta {} ({}).', `locale_esMX` = 'Personaje {} ({}) movido de la cuenta {} ({}) a la cuenta {} ({}).' WHERE `entry` = 5083; +UPDATE `acore_string` SET `locale_esES` = '¡Falló el lanzamiento del hechizo! SpellCastResult devolvió: {} ({}).', `locale_esMX` = '¡Falló el lanzamiento del hechizo! SpellCastResult devolvió: {} ({}).' WHERE `entry` = 5084; +UPDATE `acore_string` SET `locale_esES` = '¡Objeto {} (entrada: {} guid: {}) reaparecido!', `locale_esMX` = '¡Objeto {} (entrada: {} guid: {}) reaparecido!' WHERE `entry` = 5085; +UPDATE `acore_string` SET `locale_esES` = 'No se encontraron puertas en el rango ({} yardas).', `locale_esMX` = 'No se encontraron puertas en el rango ({} yardas).' WHERE `entry` = 5086; +UPDATE `acore_string` SET `locale_esES` = '¡Puerta {} (Entrada: {}) abierta!', `locale_esMX` = '¡Puerta {} (Entrada: {}) abierta!' WHERE `entry` = 5087; +UPDATE `acore_string` SET `locale_esES` = 'Misión: {} ({}) \nEstado: {}', `locale_esMX` = 'Misión: {} ({}) \nEstado: {}' WHERE `entry` = 5088; +UPDATE `acore_string` SET `locale_esES` = '¡No se puede aceptar la misión!', `locale_esMX` = '¡No se puede aceptar la misión!' WHERE `entry` = 5089; +UPDATE `acore_string` SET `locale_esES` = '{} no tiene itemID = {}, por tanto no puede eliminarse.', `locale_esMX` = '{} no tiene itemID = {}, por tanto no puede eliminarse.' WHERE `entry` = 30081; +UPDATE `acore_string` SET `locale_esES` = '{} no tiene tantos de itemID = {}, por tanto no se eliminó ninguno.', `locale_esMX` = '{} no tiene tantos de itemID = {}, por tanto no se eliminó ninguno.' WHERE `entry` = 30082; +UPDATE `acore_string` SET `locale_esES` = 'No puedes compartir misiones mientras estás en un campo de batalla.', `locale_esMX` = 'No puedes compartir misiones mientras estás en un campo de batalla.' WHERE `entry` = 30083; +UPDATE `acore_string` SET `locale_esES` = 'No puedes iniciar una comprobación de listos mientras estás en un campo de batalla.', `locale_esMX` = 'No puedes iniciar una comprobación de listos mientras estás en un campo de batalla.' WHERE `entry` = 30084; +UPDATE `acore_string` SET `locale_esES` = 'La depuración de campos de batalla ya está activada en la configuración.', `locale_esMX` = 'La depuración de campos de batalla ya está activada en la configuración.' WHERE `entry` = 30085; +UPDATE `acore_string` SET `locale_esES` = 'La depuración de arena ya está activada en la configuración.', `locale_esMX` = 'La depuración de arena ya está activada en la configuración.' WHERE `entry` = 30086; +UPDATE `acore_string` SET `locale_esES` = 'LFG está configurado para cola de 1 jugador (depuración).', `locale_esMX` = 'LFG está configurado para cola de 1 jugador (depuración).' WHERE `entry` = 30096; +UPDATE `acore_string` SET `locale_esES` = 'LFG está configurado para cola normal.', `locale_esMX` = 'LFG está configurado para cola normal.' WHERE `entry` = 30097; +UPDATE `acore_string` SET `locale_esES` = '¦ Jugador {} {} (guid: {})', `locale_esMX` = '¦ Jugador {} {} (guid: {})' WHERE `entry` = 35400; +UPDATE `acore_string` SET `locale_esES` = '¦ Modo GM activo, Fase: -1', `locale_esMX` = '¦ Modo GM activo, Fase: -1' WHERE `entry` = 35401; +UPDATE `acore_string` SET `locale_esES` = '├─ Baneado: (Tipo: {}, Razón: {}, Tiempo: {}, Por: {})', `locale_esMX` = '├─ Baneado: (Tipo: {}, Razón: {}, Tiempo: {}, Por: {})' WHERE `entry` = 35402; +UPDATE `acore_string` SET `locale_esES` = '├─ Silenciado: (Razón: {}, Tiempo: {}, Por: {})', `locale_esMX` = '├─ Silenciado: (Razón: {}, Tiempo: {}, Por: {})' WHERE `entry` = 35403; +UPDATE `acore_string` SET `locale_esES` = '¦ Cuenta: {} (ID: {}),\n\n NivelGM: {}', `locale_esMX` = '¦ Cuenta: {} (ID: {}),\n\n NivelGM: {}' WHERE `entry` = 35404; +UPDATE `acore_string` SET `locale_esES` = '¦ Último login: {} (Logins fallidos: {})', `locale_esMX` = '¦ Último login: {} (Logins fallidos: {})' WHERE `entry` = 35405; +UPDATE `acore_string` SET `locale_esES` = '¦ Email de registro: {} - Email: {}', `locale_esMX` = '¦ Email de registro: {} - Email: {}' WHERE `entry` = 35406; +UPDATE `acore_string` SET `locale_esES` = 'No se dio razón.', `locale_esMX` = 'No se dio razón.' WHERE `entry` = 35407; +UPDATE `acore_string` SET `locale_esES` = '', `locale_esMX` = '' WHERE `entry` = 35408; diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 6aee4e6a3..a6c64a631 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -3406,6 +3406,16 @@ DungeonFinder.CastDeserter = 1 DungeonFinder.AllowCompleted = 1 +# +# DungeonFinder.DungeonSelectionCooldown +# +# Description: Duration in minutes for the dungeon selection cooldown. Players who complete a +# random dungeon via LFG will not be assigned the same dungeon again for this +# duration. This reduces the chance of getting the same dungeon in a row. +# Default: 0 - (Disabled) + +DungeonFinder.DungeonSelectionCooldown = 0 + # ################################################################################################### @@ -4605,20 +4615,6 @@ Calculate.Creature.Zone.Area.Data = 0 Calculate.Gameoject.Zone.Area.Data = 0 -# -# TeleportTimeoutNear -# Description: No description -# Default: 25 - -TeleportTimeoutNear = 25 - -# -# TeleportTimeoutFar -# Description: No description -# Default: 45 - -TeleportTimeoutFar = 45 - # # DailyRBGArenaPoints.MinLevel # Description: Allows gaining arena points on the first RBG win at level 70. diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 41d22a86d..f33355455 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -503,6 +503,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE, "UPDATE characters SET totalHonorPoints = totalHonorPoints + ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UDP_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE, "UPDATE characters SET arenaPoints = arenaPoints + ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_ALL_HONOR_POINTS, "UPDATE characters SET totalHonorPoints = 0", CONNECTION_SYNCH); + PrepareStatement(CHAR_UPD_ALL_ARENA_POINTS, "UPDATE characters SET arenaPoints = 0", CONNECTION_SYNCH); PrepareStatement(CHAR_UDP_CHAR_MONEY, "UPDATE characters SET money = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UDP_CHAR_MONEY_ACCUMULATIVE, "UPDATE characters SET money = money + ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_REMOVE_GHOST, "UPDATE characters SET playerFlags = (playerFlags & (~16)) WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 0329464f6..a9a3c8fe1 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -427,6 +427,8 @@ enum CharacterDatabaseStatements : uint32 CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE, CHAR_UDP_CHAR_ARENA_POINTS, CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE, + CHAR_UPD_ALL_HONOR_POINTS, + CHAR_UPD_ALL_ARENA_POINTS, CHAR_UDP_CHAR_MONEY, CHAR_UDP_CHAR_MONEY_ACCUMULATIVE, CHAR_UPD_CHAR_REMOVE_GHOST, // pussywizard diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 1c8222126..c251edc5b 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -746,10 +746,15 @@ bool PetAI::CanAttack(Unit* target, SpellInfo const* spellInfo) // Check if our owner selected this target and clicked "attack" Unit* ownerTarget = nullptr; - if (Player* owner = me->GetCharmerOrOwner()->ToPlayer()) - ownerTarget = owner->GetSelectedUnit(); - else - ownerTarget = me->GetCharmerOrOwner()->GetVictim(); + Unit* charmerOrOwner = me->GetCharmerOrOwner(); + + if (charmerOrOwner) + { + if (Player* owner = charmerOrOwner->ToPlayer()) + ownerTarget = owner->GetSelectedUnit(); + else + ownerTarget = charmerOrOwner->GetVictim(); + } if (ownerTarget && me->GetCharmInfo()->IsCommandAttack()) return (target->GetGUID() == ownerTarget->GetGUID()); diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 2451aac3d..a3823112b 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -39,6 +39,7 @@ #include "MapMgr.h" #include "ObjectMgr.h" #include "Player.h" +#include "RaceMgr.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "SpellMgr.h" @@ -115,7 +116,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } - if (classRace.race_id && ((1 << (classRace.race_id - 1)) & RACEMASK_ALL_PLAYABLE) == 0) + if (classRace.race_id && ((1 << (classRace.race_id - 1)) & sRaceMgr->GetPlayableRaceMask()) == 0) { LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: {} Type: {}) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE ({}) has non-existing race in value2 ({}), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); @@ -275,7 +276,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } - if (classRace.race_id && ((1 << (classRace.race_id - 1)) & RACEMASK_ALL_PLAYABLE) == 0) + if (classRace.race_id && ((1 << (classRace.race_id - 1)) & sRaceMgr->GetPlayableRaceMask()) == 0) { LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: {} Type: {}) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE ({}) has non-existing race in value2 ({}), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index 7a52fb9c1..ace179e8f 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -17,6 +17,7 @@ #include "Battlefield.h" #include "BattlefieldMgr.h" +#include "ScriptMgr.h" #include "CellImpl.h" #include "CreatureTextMgr.h" #include "GameGraveyard.h" @@ -81,6 +82,10 @@ Battlefield::~Battlefield() // Called when a player enters the zone void Battlefield::HandlePlayerEnterZone(Player* player, uint32 /*zone*/) { + // Allow scripts to adjust the player's effective team or appearance before + // any team-based battlefield containers (such as player lists or queues) are updated. + sScriptMgr->OnBattlefieldPlayerEnterZone(this, player); + // Xinef: do not invite players on taxi if (!player->IsInFlight()) { @@ -126,6 +131,7 @@ void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/) group->RemoveMember(player->GetGUID()); OnPlayerLeaveWar(player); + sScriptMgr->OnBattlefieldPlayerLeaveWar(this, player); } } @@ -138,6 +144,10 @@ void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/) SendRemoveWorldStates(player); RemovePlayerFromResurrectQueue(player->GetGUID()); OnPlayerLeaveZone(player); + // Scripts must restore player->GetTeamId() here (e.g. ClearFakePlayer). + // All Battlefield data-structure cleanup above has already completed using + // the assigned team, so it is safe to restore the real team now. + sScriptMgr->OnBattlefieldPlayerLeaveZone(this, player); } bool Battlefield::Update(uint32 diff) @@ -302,6 +312,8 @@ void Battlefield::InvitePlayerToWar(Player* player) if (m_PlayersInWar[player->GetTeamId()].count(player->GetGUID()) || m_InvitedPlayers[player->GetTeamId()].count(player->GetGUID())) return; + sScriptMgr->OnBattlefieldBeforeInvitePlayerToWar(this, player); + m_PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID()); m_InvitedPlayers[player->GetTeamId()][player->GetGUID()] = GameTime::GetGameTime().count() + m_TimeForAcceptInvite; player->GetSession()->SendBfInvitePlayerToWar(m_BattleId, m_ZoneId, m_TimeForAcceptInvite); @@ -424,6 +436,8 @@ void Battlefield::PlayerAcceptInviteToWar(Player* player) if (!IsWarTime()) return; + sScriptMgr->OnBattlefieldPlayerJoinWar(this, player); + if (AddOrSetPlayerToCorrectBfGroup(player)) { player->GetSession()->SendBfEntered(m_BattleId); diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index f67e16862..0e767a441 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -354,6 +354,13 @@ public: uint32 GetTimer() { return m_Timer; } void SetTimer(uint32 timer) { m_Timer = timer; } + // Returns combined count of players in war + invited (per team) for balance checking + uint32 GetPlayersInWarCount(TeamId teamId) const { return static_cast(m_PlayersInWar[teamId].size() + m_InvitedPlayers[teamId].size()); } + // Returns total count of players in the battlefield zone per team + uint32 GetPlayersInZoneCount(TeamId teamId) const { return static_cast(m_players[teamId].size()); } + // Returns the maximum players allowed per team + uint32 GetMaxPlayersPerTeam() const { return m_MaxPlayer; } + void DoPlaySoundToAll(uint32 SoundID); void InvitePlayerToQueue(Player* player); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index ec5718d66..9d42e1965 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -718,6 +718,8 @@ void BattlegroundSA::DemolisherStartState(bool start) if (!BgCreatures[0]) return; + // Only lock demolishers during warmup - they are attacker vehicles. + // Cannons/turrets are defender weapons and must remain usable from the start. for (uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4; i++) if (Creature* dem = GetBGCreature(i)) { @@ -727,15 +729,6 @@ void BattlegroundSA::DemolisherStartState(bool start) dem->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); } - for (uint8 i = BG_SA_GUN_1; i <= BG_SA_GUN_10; i++) - if (Creature* gun = GetBGCreature(i)) - { - if (start) - gun->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - else - gun->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - } - // xinef: enable first gates damaging at start if (!start) { diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 688820001..213ee742f 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -24,6 +24,7 @@ #include "ObjectMgr.h" #include "Pet.h" #include "Player.h" +#include "RaceMgr.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" @@ -2082,9 +2083,9 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) } case CONDITION_RACE: { - if (!(cond->ConditionValue1 & RACEMASK_ALL_PLAYABLE)) + if (!(cond->ConditionValue1 & sRaceMgr->GetPlayableRaceMask())) { - LOG_ERROR("sql.sql", "Race condition has non existing racemask ({}), skipped", cond->ConditionValue1 & ~RACEMASK_ALL_PLAYABLE); + LOG_ERROR("sql.sql", "Race condition has non existing racemask ({}), skipped", cond->ConditionValue1 & ~sRaceMgr->GetPlayableRaceMask()); return false; } diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 61724fa25..9da1f9199 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -165,6 +165,87 @@ namespace lfg LOG_INFO("server.loading", " "); } + void LFGMgr::AddDungeonCooldown(ObjectGuid guid, uint32 dungeonId) + { + if (!sWorld->getIntConfig(CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN)) + return; + + DungeonCooldownStore[guid][dungeonId] = GameTime::Now(); + } + + void LFGMgr::CleanupDungeonCooldowns() + { + if (!sWorld->getIntConfig(CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN)) + return; + + Seconds cooldownDuration = GetDungeonCooldownDuration(); + + for (auto itPlayer = DungeonCooldownStore.begin(); itPlayer != DungeonCooldownStore.end(); ) + { + for (auto itDungeon = itPlayer->second.begin(); itDungeon != itPlayer->second.end(); ) + { + if (GameTime::HasElapsed(itDungeon->second, cooldownDuration)) + itDungeon = itPlayer->second.erase(itDungeon); + else + ++itDungeon; + } + + if (itPlayer->second.empty()) + itPlayer = DungeonCooldownStore.erase(itPlayer); + else + ++itPlayer; + } + } + + void LFGMgr::ClearDungeonCooldowns() + { + DungeonCooldownStore.clear(); + } + + Seconds LFGMgr::GetDungeonCooldownDuration() const + { + return Seconds(sWorld->getIntConfig(CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN) * MINUTE); + } + + LfgDungeonSet LFGMgr::FilterCooldownDungeons(LfgDungeonSet const& dungeons, LfgRolesMap const& players) + { + if (!sWorld->getIntConfig(CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN)) + return dungeons; + + Seconds cooldownDuration = GetDungeonCooldownDuration(); + + LfgDungeonSet filtered; + for (uint32 dungeonId : dungeons) + { + bool onCooldown = false; + for (auto const& playerPair : players) + { + auto itPlayer = DungeonCooldownStore.find(playerPair.first); + if (itPlayer != DungeonCooldownStore.end()) + { + auto itDungeon = itPlayer->second.find(dungeonId); + if (itDungeon != itPlayer->second.end() && !GameTime::HasElapsed(itDungeon->second, cooldownDuration)) + { + onCooldown = true; + break; + } + } + } + + if (!onCooldown) + filtered.insert(dungeonId); + } + + // If all dungeons are on cooldown, return original set to avoid blocking the queue + if (filtered.empty()) + { + LOG_DEBUG("lfg", "LFGMgr::FilterCooldownDungeons: All {} dungeons on cooldown for group, bypassing cooldown filter", dungeons.size()); + return dungeons; + } + + return filtered; + } + LFGDungeonData const* LFGMgr::GetLFGDungeon(uint32 id) { LFGDungeonContainer::const_iterator itr = LfgDungeonStore.find(id); @@ -329,6 +410,9 @@ namespace lfg BootsStore.erase(itBoot); } } + + // Cleanup expired dungeon cooldowns + CleanupDungeonCooldowns(); } else if (task == 1) { @@ -2263,6 +2347,9 @@ namespace lfg continue; } + // Record dungeon cooldown for this player (the actual dungeon completed, not the random entry) + AddDungeonCooldown(guid, dungeonId); + Player* player = ObjectAccessor::FindPlayer(guid); if (!player || player->FindMap() != currMap) // pussywizard: currMap - multithreading crash if on other map (map id check is not enough, binding system is not reliable) { diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 3d451e8eb..fe1a7852a 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -450,6 +450,10 @@ namespace lfg void LoadRewards(); /// Loads dungeons from dbc and adds teleport coords void LoadLFGDungeons(bool reload = false); + /// Filters out recently completed dungeons from the proposal set for the given players + LfgDungeonSet FilterCooldownDungeons(LfgDungeonSet const& dungeons, LfgRolesMap const& players); + /// Clears all dungeon cooldowns for all players + void ClearDungeonCooldowns(); // Multiple files /// Check if given guid applied for random dungeon @@ -636,6 +640,14 @@ namespace lfg LfgPlayerDataContainer PlayersStore; ///< Player data LfgGroupDataContainer GroupsStore; ///< Group data bool m_Testing; + + // Dungeon cooldown system - prevents same dungeon being assigned in a row + typedef std::unordered_map LfgDungeonCooldownMap; + typedef std::unordered_map LfgDungeonCooldownContainer; + LfgDungeonCooldownContainer DungeonCooldownStore; ///< Stores dungeon cooldowns per player + void AddDungeonCooldown(ObjectGuid guid, uint32 dungeonId); + void CleanupDungeonCooldowns(); + [[nodiscard]] Seconds GetDungeonCooldownDuration() const; }; template )> diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp index 6e7f99a32..3935bc43f 100644 --- a/src/server/game/DungeonFinding/LFGQueue.cpp +++ b/src/server/game/DungeonFinding/LFGQueue.cpp @@ -421,7 +421,10 @@ namespace lfg proposal.cancelTime = GameTime::GetGameTime().count() + LFG_TIME_PROPOSAL; proposal.state = LFG_PROPOSAL_INITIATING; proposal.leader.Clear(); - proposal.dungeonId = Acore::Containers::SelectRandomContainerElement(proposalDungeons); + + // Filter out recently completed dungeons to prevent same dungeon in a row + LfgDungeonSet filteredDungeons = sLFGMgr->FilterCooldownDungeons(proposalDungeons, proposalRoles); + proposal.dungeonId = Acore::Containers::SelectRandomContainerElement(filteredDungeons); uint32 completedEncounters = 0; bool leader = false; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 921eb4ff3..938086961 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1763,7 +1763,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo // pussywizard: arena spectator if (obj->IsPlayer()) - if (((Player const*)obj)->IsSpectator() && ((Player const*)obj)->FindMap()->IsBattleArena()) + if (((Player const*)obj)->IsSpectator() && ((Player const*)obj)->FindMap() && ((Player const*)obj)->FindMap()->IsBattleArena()) return false; bool corpseVisibility = false; @@ -1807,11 +1807,12 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo return false; // pussywizard: during arena preparation, don't allow to detect pets if can't see its owner (spoils enemy arena frames) - if (target->IsPet() && target->GetOwnerGUID() && target->FindMap()->IsBattleArena() && GetGUID() != target->GetOwnerGUID()) - if (BattlegroundMap* bgmap = target->FindMap()->ToBattlegroundMap()) - if (Battleground* bg = bgmap->GetBG()) - if (bg->GetStatus() < STATUS_IN_PROGRESS && !thisPlayer->HaveAtClient(target->GetOwnerGUID())) - return false; + if (Map* targetMap = target->FindMap()) + if (target->IsPet() && target->GetOwnerGUID() && targetMap->IsBattleArena() && GetGUID() != target->GetOwnerGUID()) + if (BattlegroundMap* bgmap = targetMap->ToBattlegroundMap()) + if (Battleground* bg = bgmap->GetBG()) + if (bg->GetStatus() < STATUS_IN_PROGRESS && !thisPlayer->HaveAtClient(target->GetOwnerGUID())) + return false; } if (thisPlayer->GetFarSightDistance() && !thisPlayer->isInFront(obj)) @@ -1856,7 +1857,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo // pussywizard: arena spectator if (this->IsPlayer()) - if (((Player const*)this)->IsSpectator() && ((Player const*)this)->FindMap()->IsBattleArena() && (obj->m_invisibility.GetFlags() || obj->m_stealth.GetFlags())) + if (((Player const*)this)->IsSpectator() && ((Player const*)this)->FindMap() && ((Player const*)this)->FindMap()->IsBattleArena() && (obj->m_invisibility.GetFlags() || obj->m_stealth.GetFlags())) return false; if (!CanDetect(obj, ignoreStealth, !distanceCheck, checkAlert)) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9738bdc77..389afd1fb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5375,7 +5375,10 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal) // remove all spells that related to this skill for (SkillLineAbilityEntry const* pAbility : GetSkillLineAbilitiesBySkillLine(id)) + { removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false); + RemoveAurasDueToSpell(pAbility->Spell); + } } } else if (newVal) //add @@ -7468,6 +7471,10 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 if (HasSpellCooldown(spellInfo->Id)) { + // Notify client so it can clean up the pending spell cast. + // Without this the client orphans the cast and blocks auto-attack. + Spell::SendCastResult(ToPlayer(), spellInfo, cast_count, + SPELL_FAILED_NOT_READY); continue; } @@ -7514,7 +7521,11 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 } if (HasSpellCooldown(spellInfo->Id)) + { + Spell::SendCastResult(ToPlayer(), spellInfo, cast_count, + SPELL_FAILED_NOT_READY); continue; + } Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); spell->m_CastItem = item; @@ -9999,14 +10010,6 @@ void Player::RemoveSpellMods(Spell* spell) if (roll_chance_i(aurEff->GetAmount())) continue; // don't consume charge } - // ROGUE MUTILATE WITH COLD BLOOD - if (spellInfo->Id == 5374) - { - SpellInfo const* sp = mod->ownerAura->GetSpellInfo(); - if (sp->Id == 14177) // Cold Blood - continue; // don't consume charge - } - if (mod->ownerAura->DropCharge(AURA_REMOVE_BY_EXPIRE)) itr = m_spellMods[i].begin(); } @@ -10036,9 +10039,10 @@ bool Player::HasSpellModApplied(SpellModifier* mod, Spell* spell) void Player::SetSpellModTakingSpell(Spell* spell, bool apply) { - if (apply && m_spellModTakingSpell && m_spellModTakingSpell != spell) + if (apply && m_spellModTakingSpell != nullptr) return; - else if (!apply && m_spellModTakingSpell != spell) + + if (!apply && (!m_spellModTakingSpell || m_spellModTakingSpell != spell)) return; m_spellModTakingSpell = apply ? spell : nullptr; @@ -11759,7 +11763,7 @@ void Player::ApplyEquipCooldown(Item* pItem) continue; if (Aura* itemAura = GetAura(spellData.SpellId, GetGUID(), pItem->GetGUID())) - itemAura->AddProcCooldown(std::chrono::steady_clock::now() + std::chrono::seconds(30)); + itemAura->AddProcCooldown(std::chrono::steady_clock::now() + procEntry->Cooldown); continue; } diff --git a/src/server/game/Entities/Player/RaceMgr.cpp b/src/server/game/Entities/Player/RaceMgr.cpp new file mode 100644 index 000000000..b1ac288cb --- /dev/null +++ b/src/server/game/Entities/Player/RaceMgr.cpp @@ -0,0 +1,77 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "RaceMgr.h" +#include "AccountMgr.h" +#include "DatabaseEnv.h" +#include "ObjectMgr.h" +#include "Player.h" +#include "Util.h" +#include "WorldPacket.h" +#include "WorldSession.h" + +uint8 RaceMgr::_maxRaces = 0; + +uint32 RaceMgr::_playableRaceMask = 0; +uint32 RaceMgr::_allianceRaceMask = 0; +uint32 RaceMgr::_hordeRaceMask = 0; + +RaceMgr::RaceMgr() +{ +} + +RaceMgr::~RaceMgr() +{ +} + +RaceMgr* RaceMgr::instance() +{ + static RaceMgr instance; + return &instance; +} + +void RaceMgr::LoadRaces() +{ + SetMaxRaces(0 + 1); + _playableRaceMask = 0; + _hordeRaceMask = 0; + _allianceRaceMask = 0; + + for (auto const& raceEntry : sChrRacesStore) + { + if (!raceEntry) + continue; + + uint8 alliance = raceEntry->alliance; + uint8 raceId = raceEntry->RaceID; + + if (raceEntry->Flags & CHRRACES_FLAGS_NOT_PLAYABLE) + continue; + + if (GetMaxRaces() <= raceId) + SetMaxRaces(raceId + 1); + + uint32 raceBit = (1 << (raceId - 1)); + + _playableRaceMask |= raceBit; + + if (alliance == ALLIANCE_HORDE) + _hordeRaceMask |= raceBit; + else if (alliance == ALLIANCE_ALLIANCE) + _allianceRaceMask |= raceBit; + } +} diff --git a/src/server/game/Entities/Player/RaceMgr.h b/src/server/game/Entities/Player/RaceMgr.h new file mode 100644 index 000000000..239e69070 --- /dev/null +++ b/src/server/game/Entities/Player/RaceMgr.h @@ -0,0 +1,54 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef __ACORE_RACEMGR_H +#define __ACORE_RACEMGR_H + +#include "DatabaseEnv.h" +#include "ObjectGuid.h" +#include "SharedDefines.h" +#include + +class Player; +class WorldPacket; + +class RaceMgr +{ +private: + RaceMgr(); + ~RaceMgr(); + +public: + static RaceMgr* instance(); + + static void LoadRaces(); + static uint8 GetMaxRaces() { return _maxRaces; } + static void SetMaxRaces(uint8 max) { _maxRaces = max; } + static uint32 GetPlayableRaceMask() { return _playableRaceMask; } + static uint32 GetAllianceRaceMask() { return _allianceRaceMask; } + static uint32 GetHordeRaceMask() { return _hordeRaceMask; } +private: + static uint8 _maxRaces; // Max playable race + 1 + + static uint32 _playableRaceMask; + static uint32 _allianceRaceMask; + static uint32 _hordeRaceMask; +}; + +#define sRaceMgr RaceMgr::instance() + +#endif diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 012f3fdde..c3b8d3ccb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13069,11 +13069,28 @@ void Unit::TriggerAurasProcOnEvent(std::list* myProcAuras, std void Unit::TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, AuraApplicationProcContainer& aurasTriggeringProc) { + Spell const* triggeringSpell = eventInfo.GetProcSpell(); + bool const disableProcs = triggeringSpell && triggeringSpell->IsProcDisabled(); + if (disableProcs) + SetCantProc(true); + for (auto const& [procEffectMask, aurApp] : aurasTriggeringProc) { - if (!aurApp->GetRemoveMode()) - aurApp->GetBase()->TriggerProcOnEvent(procEffectMask, aurApp, eventInfo); + if (aurApp->GetRemoveMode()) + continue; + + SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo(); + if (spellInfo->HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS)) + SetCantProc(true); + + aurApp->GetBase()->TriggerProcOnEvent(procEffectMask, aurApp, eventInfo); + + if (spellInfo->HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS)) + SetCantProc(false); } + + if (disableProcs) + SetCantProc(false); } Player* Unit::GetSpellModOwner() const diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 41fbafc9e..e319cdd09 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -38,6 +38,7 @@ #include "MapMgr.h" #include "Pet.h" #include "PoolMgr.h" +#include "RaceMgr.h" #include "ReputationMgr.h" #include "ScriptMgr.h" #include "Spell.h" @@ -308,8 +309,6 @@ ObjectMgr::ObjectMgr(): for (uint8 i = 0; i < MAX_CLASSES; ++i) { _playerClassInfo[i] = nullptr; - for (uint8 j = 0; j < MAX_RACES; ++j) - _playerInfo[j][i] = nullptr; } } @@ -329,7 +328,7 @@ ObjectMgr::~ObjectMgr() delete _playerClassInfo[class_]; } - for (int race = 0; race < MAX_RACES; ++race) + for (int race = 0; race < sRaceMgr->GetMaxRaces(); ++race) { for (int class_ = 0; class_ < MAX_CLASSES; ++class_) { @@ -1111,8 +1110,8 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) if (!cInfo->unit_class || ((1 << (cInfo->unit_class - 1)) & CLASSMASK_ALL_CREATURES) == 0) { - LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid unit_class ({}) in creature_template. Set to 1 (UNIT_CLASS_WARRIOR).", cInfo->Entry, cInfo->unit_class); - const_cast(cInfo)->unit_class = UNIT_CLASS_WARRIOR; + LOG_ERROR("sql.sql", "Creature (Entry: {}) has invalid unit_class ({}) in creature_template. Set to 1 (CLASS_WARRIOR).", cInfo->Entry, cInfo->unit_class); + const_cast(cInfo)->unit_class = CLASS_WARRIOR; } if (cInfo->dmgschool >= MAX_SPELL_SCHOOL) @@ -3492,7 +3491,7 @@ void ObjectMgr::LoadItemTemplates() if (!(itemTemplate.AllowableClass & CLASSMASK_ALL_PLAYABLE)) LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable classes ({}) in `AllowableClass` and can't be equipped or used.", entry, itemTemplate.AllowableClass); - if (!(itemTemplate.AllowableRace & RACEMASK_ALL_PLAYABLE)) + if (!(itemTemplate.AllowableRace & sRaceMgr->GetPlayableRaceMask())) LOG_ERROR("sql.sql", "Item (Entry: {}) does not have any playable races ({}) in `AllowableRace` and can't be equipped or used.", entry, itemTemplate.AllowableRace); } } @@ -4252,6 +4251,14 @@ void ObjectMgr::LoadPlayerInfo() { // Load playercreate { + if (_playerInfo.empty() || _playerInfo.size() != sRaceMgr->GetMaxRaces()) + { + _playerInfo.clear(); + _playerInfo.resize(sRaceMgr->GetMaxRaces()); + for (auto& classVec : _playerInfo) + classVec.resize(MAX_CLASSES, nullptr); + } + uint32 oldMSTime = getMSTime(); // 0 1 2 3 4 5 6 QueryResult result = WorldDatabase.Query("SELECT race, class, map, zone, position_x, position_y, position_z, orientation FROM playercreateinfo"); @@ -4279,7 +4286,7 @@ void ObjectMgr::LoadPlayerInfo() float positionZ = fields[6].Get(); float orientation = fields[7].Get(); - if (current_race >= MAX_RACES) + if (current_race >= sRaceMgr->GetMaxRaces()) { LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo` table, ignoring.", current_race); continue; @@ -4357,7 +4364,7 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = result->Fetch(); uint32 current_race = fields[0].Get(); - if (current_race >= MAX_RACES) + if (current_race >= sRaceMgr->GetMaxRaces()) { LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_item` table, ignoring.", current_race); continue; @@ -4389,7 +4396,7 @@ void ObjectMgr::LoadPlayerInfo() if (!current_race || !current_class) { uint32 min_race = current_race ? current_race : 1; - uint32 max_race = current_race ? current_race + 1 : MAX_RACES; + uint32 max_race = current_race ? current_race + 1 : sRaceMgr->GetMaxRaces(); uint32 min_class = current_class ? current_class : 1; uint32 max_class = current_class ? current_class + 1 : MAX_CLASSES; for (uint32 r = min_race; r < max_race; ++r) @@ -4437,7 +4444,7 @@ void ObjectMgr::LoadPlayerInfo() continue; } - if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE)) + if (raceMask != 0 && !(raceMask & sRaceMgr->GetPlayableRaceMask())) { LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_skills` table, ignoring.", raceMask); continue; @@ -4455,7 +4462,7 @@ void ObjectMgr::LoadPlayerInfo() continue; } - for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex) + for (uint32 raceIndex = RACE_HUMAN; raceIndex < sRaceMgr->GetMaxRaces(); ++raceIndex) { if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask)) { @@ -4504,7 +4511,7 @@ void ObjectMgr::LoadPlayerInfo() uint32 classMask = fields[1].Get(); uint32 spellId = fields[2].Get(); - if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE)) + if (raceMask != 0 && !(raceMask & sRaceMgr->GetPlayableRaceMask())) { LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_spell_custom` table, ignoring.", raceMask); continue; @@ -4516,7 +4523,7 @@ void ObjectMgr::LoadPlayerInfo() continue; } - for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex) + for (uint32 raceIndex = RACE_HUMAN; raceIndex < sRaceMgr->GetMaxRaces(); ++raceIndex) { if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask)) { @@ -4562,7 +4569,7 @@ void ObjectMgr::LoadPlayerInfo() uint32 classMask = fields[1].Get(); uint32 spellId = fields[2].Get(); - if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE)) + if (raceMask != 0 && !(raceMask & sRaceMgr->GetPlayableRaceMask())) { LOG_ERROR("sql.sql", "Wrong race mask {} in `playercreateinfo_cast_spell` table, ignoring.", raceMask); continue; @@ -4574,7 +4581,7 @@ void ObjectMgr::LoadPlayerInfo() continue; } - for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex) + for (uint32 raceIndex = RACE_HUMAN; raceIndex < sRaceMgr->GetMaxRaces(); ++raceIndex) { if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask)) { @@ -4620,7 +4627,7 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = result->Fetch(); uint32 current_race = fields[0].Get(); - if (current_race >= MAX_RACES) + if (current_race >= sRaceMgr->GetMaxRaces()) { LOG_ERROR("sql.sql", "Wrong race {} in `playercreateinfo_action` table, ignoring.", current_race); continue; @@ -4652,7 +4659,9 @@ void ObjectMgr::LoadPlayerInfo() int16 StatModifier[MAX_STATS]; }; - std::array raceStatModifiers; + std::vector raceStatModifiers; + + raceStatModifiers.resize(sRaceMgr->GetMaxRaces()); uint32 oldMSTime = getMSTime(); @@ -4671,7 +4680,7 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = raceStatsResult->Fetch(); uint32 current_race = fields[0].Get(); - if (current_race >= MAX_RACES) + if (current_race >= sRaceMgr->GetMaxRaces()) { LOG_ERROR("sql.sql", "Wrong race {} in `player_race_stats` table, ignoring.", current_race); continue; @@ -4745,7 +4754,7 @@ void ObjectMgr::LoadPlayerInfo() } while (result->NextRow()); // Fill gaps and check integrity - for (int race = 0; race < MAX_RACES; ++race) + for (int race = RACE_HUMAN; race < sRaceMgr->GetMaxRaces(); ++race) { // skip non existed races if (!sChrRacesStore.LookupEntry(race)) @@ -4884,7 +4893,7 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, PlayerClassL void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const { - if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES) + if (level < 1 || race >= sRaceMgr->GetMaxRaces() || class_ >= MAX_CLASSES) return; PlayerInfo const* pInfo = _playerInfo[race][class_]; @@ -5253,10 +5262,10 @@ void ObjectMgr::LoadQuests() qinfo->RequiredClasses = 0; } } - // AllowableRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race + // AllowableRaces, can be 0/PlayableRaceMask to allow any race if (qinfo->AllowableRaces) { - if (!(qinfo->AllowableRaces & RACEMASK_ALL_PLAYABLE)) + if (!(qinfo->AllowableRaces & sRaceMgr->GetPlayableRaceMask())) { LOG_ERROR("sql.sql", "Quest {} does not contain any playable races in `AllowableRaces` ({}), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces); qinfo->AllowableRaces = 0; @@ -9677,7 +9686,7 @@ void ObjectMgr::LoadMailLevelRewards() continue; } - if (!(raceMask & RACEMASK_ALL_PLAYABLE)) + if (!(raceMask & sRaceMgr->GetPlayableRaceMask())) { LOG_ERROR("sql.sql", "Table `mail_level_reward` have raceMask ({}) for level {} that not include any player races, ignoring.", raceMask, level); continue; @@ -10774,7 +10783,7 @@ VehicleAccessoryList const* ObjectMgr::GetVehicleAccessoryList(Vehicle* veh) con PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const { - if (race >= MAX_RACES) + if (race >= sRaceMgr->GetMaxRaces()) return nullptr; if (class_ >= MAX_CLASSES) return nullptr; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 5c05281f6..00400e456 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1603,7 +1603,7 @@ private: void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo* plinfo) const; - PlayerInfo* _playerInfo[MAX_RACES][MAX_CLASSES]; + std::vector> _playerInfo; typedef std::vector PlayerXPperLevel; // [level] PlayerXPperLevel _playerXPperLevel; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b23dc9244..66e8cb4bc 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -44,6 +44,7 @@ #include "Player.h" #include "PlayerDump.h" #include "QueryHolder.h" +#include "RaceMgr.h" #include "Realm.h" #include "ReputationMgr.h" #include "ScriptMgr.h" @@ -2025,7 +2026,7 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptrGetAuctionsMap(i == 0 ? 0 : (((1 << (playerData->Race - 1)) & RACEMASK_ALLIANCE) ? 12 : 29)); + AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(i == 0 ? 0 : (((1 << (playerData->Race - 1)) & sRaceMgr->GetAllianceRaceMask()) ? 12 : 29)); for (auto const& [auID, Aentry] : auctionHouse->GetAuctions()) { @@ -2413,7 +2414,7 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptrGetQuestTemplates()) { - uint32 newRaceMask = (newTeam == TEAM_ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE; + uint32 newRaceMask = (newTeam == TEAM_ALLIANCE) ? sRaceMgr->GetAllianceRaceMask() : sRaceMgr->GetHordeRaceMask(); if (quest->GetAllowableRaces() && !(quest->GetAllowableRaces() & newRaceMask)) { diff --git a/src/server/game/Mails/ServerMailMgr.cpp b/src/server/game/Mails/ServerMailMgr.cpp index 9f8d05377..571e1ab44 100644 --- a/src/server/game/Mails/ServerMailMgr.cpp +++ b/src/server/game/Mails/ServerMailMgr.cpp @@ -25,6 +25,7 @@ #include "ObjectMgr.h" #include "Player.h" #include "QuestDef.h" +#include "RaceMgr.h" #include "SharedDefines.h" #include "Timer.h" @@ -247,7 +248,7 @@ void ServerMailMgr::LoadMailServerTemplatesConditions() } break; case ServerMailConditionType::Race: - if (conditionValue & ~RACEMASK_ALL_PLAYABLE) + if (conditionValue & ~sRaceMgr->GetPlayableRaceMask()) { LOG_ERROR("sql.sql", "Table `mail_server_template_conditions` has conditionType 'Race' with invalid conditionValue ({}) for templateID {}, skipped.", conditionValue, templateID); continue; diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 29857eadf..035ba0dce 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -239,6 +239,7 @@ public: // some calls like isInWater should not use vmaps due to processor power // can return INVALID_HEIGHT if under z+2 z coord not found height [[nodiscard]] float GetHeight(float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const; + [[nodiscard]] float GetHeight(Position const& pos, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const { return GetHeight(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), checkVMap, maxSearchDist); } [[nodiscard]] float GetGridHeight(float x, float y) const; [[nodiscard]] float GetMinHeight(float x, float y) const; Transport* GetTransportForPos(uint32 phase, float x, float y, float z, WorldObject* worldobject = nullptr); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 7d76a57cc..7ba4c975a 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1183,7 +1183,18 @@ enum AcoreStrings LANG_CMD_QUEST_STATUS_LOG_FULL = 5109, LANG_CMD_QUEST_STATUS_COND_DETAIL = 5110, - // Room for more strings 5111-9999 + // Battlefield commands + LANG_BF_NOT_FOUND = 5111, + LANG_BF_STARTED = 5112, + LANG_BF_STOPPED = 5113, + LANG_BF_SWITCHED = 5114, + LANG_BF_TIMER_SET = 5115, + LANG_BF_ENABLED = 5116, + LANG_BF_DISABLED = 5117, + + LANG_RESETALL_HONOR = 5118, + LANG_RESETALL_ARENA = 5119, + // Room for more strings 5120-9999 // Level requirement notifications LANG_SAY_REQ = 6604, @@ -1347,6 +1358,8 @@ enum AcoreStrings LANG_BAN_IP_YOUBANNEDMESSAGE_WORLD = 11017, LANG_BAN_IP_YOUPERMBANNEDMESSAGE_WORLD = 11018, + LANG_LFG_COOLDOWN_CLEARED = 11019, + LANG_MUTED_PLAYER = 30000, // Mute for player 2 hour // Instant Flight diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 45b14e1ae..06d9b474c 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -240,7 +240,13 @@ void TimedFleeingMovementGenerator::Finalize(Unit* owner) if (Unit* victim = owner->GetVictim()) { - owner->SetTarget(victim->GetGUID()); + if (owner->IsAlive()) + { + owner->AttackStop(); + if (Creature* ownerCreature = owner->ToCreature()) + if (CreatureAI* AI = ownerCreature->AI()) + AI->AttackStart(victim); + } } if (Creature* ownerCreature = owner->ToCreature()) diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 56109087f..996544943 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -211,7 +211,8 @@ void RandomMovementGenerator::_setRandomLocation(Creature* creature) } _currentPoint = newPoint; - G3D::Vector3& finalPoint = finalPath[finalPath.size() - 1]; + ASSERT(!finalPath.empty()); + G3D::Vector3 finalPoint = finalPath.back(); _currDestPosition.Relocate(finalPoint.x, finalPoint.y, finalPoint.z); creature->AddUnitState(UNIT_STATE_ROAMING_MOVE); @@ -239,12 +240,13 @@ void RandomMovementGenerator::_setRandomLocation(Creature* creature) _moveCount = 0; _nextMoveTime.Reset(urand(4000, 8000)); } - if (sWorld->getBoolConfig(CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS)) - _preComputedPaths.erase(pathIdx); //Call for creature group update if (creature->GetFormation() && creature->GetFormation()->GetLeader() == creature) creature->GetFormation()->LeaderMoveTo(finalPoint.x, finalPoint.y, finalPoint.z, 0); + + if (sWorld->getBoolConfig(CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS)) + _preComputedPaths.erase(pathIdx); } template<> diff --git a/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h b/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h index 92dc41756..ce22bbad4 100644 --- a/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h +++ b/src/server/game/Scripting/ScriptDefines/AllScriptsObjects.h @@ -32,6 +32,7 @@ #include "ArenaScript.h" #include "ArenaTeamScript.h" #include "AuctionHouseScript.h" +#include "BattlefieldScript.h" #include "BattlegroundMapScript.h" #include "BattlegroundScript.h" #include "CommandScript.h" diff --git a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp new file mode 100644 index 000000000..d614f1a8d --- /dev/null +++ b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.cpp @@ -0,0 +1,58 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "BattlefieldScript.h" +#include "ScriptMgr.h" +#include "ScriptMgrMacros.h" + +void ScriptMgr::OnBattlefieldPlayerEnterZone(Battlefield* bf, Player* player) +{ + CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_PLAYER_ENTER_ZONE, script->OnBattlefieldPlayerEnterZone(bf, player)); +} + +void ScriptMgr::OnBattlefieldPlayerLeaveZone(Battlefield* bf, Player* player) +{ + CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_PLAYER_LEAVE_ZONE, script->OnBattlefieldPlayerLeaveZone(bf, player)); +} + +void ScriptMgr::OnBattlefieldPlayerJoinWar(Battlefield* bf, Player* player) +{ + CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_PLAYER_JOIN_WAR, script->OnBattlefieldPlayerJoinWar(bf, player)); +} + +void ScriptMgr::OnBattlefieldPlayerLeaveWar(Battlefield* bf, Player* player) +{ + CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_ON_PLAYER_LEAVE_WAR, script->OnBattlefieldPlayerLeaveWar(bf, player)); +} + +void ScriptMgr::OnBattlefieldBeforeInvitePlayerToWar(Battlefield* bf, Player* player) +{ + CALL_ENABLED_HOOKS(BattlefieldScript, BATTLEFIELDHOOK_BEFORE_INVITE_PLAYER_TO_WAR, script->OnBattlefieldBeforeInvitePlayerToWar(bf, player)); +} + +BattlefieldScript::BattlefieldScript(char const* name, std::vector enabledHooks) : + ScriptObject(name, BATTLEFIELDHOOK_END) +{ + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < BATTLEFIELDHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); +} + +template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h new file mode 100644 index 000000000..f2a4e19d9 --- /dev/null +++ b/src/server/game/Scripting/ScriptDefines/BattlefieldScript.h @@ -0,0 +1,92 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef SCRIPT_OBJECT_BATTLEFIELD_SCRIPT_H_ +#define SCRIPT_OBJECT_BATTLEFIELD_SCRIPT_H_ + +#include "ScriptObject.h" +#include + +enum BattlefieldHook +{ + BATTLEFIELDHOOK_ON_PLAYER_ENTER_ZONE, // 0 - fires at start of HandlePlayerEnterZone, before team assignment + BATTLEFIELDHOOK_ON_PLAYER_LEAVE_ZONE, // 1 - fires at end of HandlePlayerLeaveZone, after all cleanup + BATTLEFIELDHOOK_ON_PLAYER_JOIN_WAR, // 2 - fires after player is added to the active war + BATTLEFIELDHOOK_ON_PLAYER_LEAVE_WAR, // 3 - fires after player is removed from the active war + BATTLEFIELDHOOK_BEFORE_INVITE_PLAYER_TO_WAR, // 4 - fires in InvitePlayerToWar before InvitedPlayers insert + BATTLEFIELDHOOK_END +}; + +class Battlefield; +class Player; + +class BattlefieldScript : public ScriptObject +{ +protected: + BattlefieldScript(const char* name, std::vector enabledHooks = std::vector()); + +public: + [[nodiscard]] bool IsDatabaseBound() const override { return false; } + + /** + * @brief Called when a player enters the battlefield zone, before team-based data assignment. + * This is the ideal place to reassign a player's team for cross-faction purposes. + * + * @param bf The Battlefield instance + * @param player The player entering the zone + */ + virtual void OnBattlefieldPlayerEnterZone(Battlefield* /*bf*/, Player* /*player*/) { } + + /** + * @brief Called when a player leaves the battlefield zone, after all cleanup. + * This is the ideal place to restore a player's original team/faction. + * + * @param bf The Battlefield instance + * @param player The player leaving the zone + */ + virtual void OnBattlefieldPlayerLeaveZone(Battlefield* /*bf*/, Player* /*player*/) { } + + /** + * @brief Called after a player has been added to the active war (accepted the invitation). + * + * @param bf The Battlefield instance + * @param player The player joining the war + */ + virtual void OnBattlefieldPlayerJoinWar(Battlefield* /*bf*/, Player* /*player*/) { } + + /** + * @brief Called after a player has been removed from the active war. + * + * @param bf The Battlefield instance + * @param player The player leaving the war + */ + virtual void OnBattlefieldPlayerLeaveWar(Battlefield* /*bf*/, Player* /*player*/) { } + + /** + * @brief Called inside InvitePlayerToWar after the WillBeKick entry is erased + * (using the player's current team) and before the player is inserted into + * m_InvitedPlayers. This is the correct place to reassign a player's effective + * team for pre-war zone players: the invite bucket write that follows will use + * the newly assigned team, keeping all subsequent core operations consistent. + * + * @param bf The Battlefield instance + * @param player The player being invited to war + */ + virtual void OnBattlefieldBeforeInvitePlayerToWar(Battlefield* /*bf*/, Player* /*player*/) { } +}; + +#endif // SCRIPT_OBJECT_BATTLEFIELD_SCRIPT_H_ diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index e28d9e299..3574d2a26 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -43,6 +43,7 @@ class AuctionHouseObject; class AuraScript; +class Battlefield; class Battleground; class BattlegroundMap; class BattlegroundQueue; @@ -598,6 +599,13 @@ public: /* AllMapScript */ void OnBeforeCreateInstanceScript(InstanceMap* instanceMap, InstanceScript** instanceData, bool load, std::string data, uint32 completedEncounterMask); void OnDestroyInstance(MapInstanced* mapInstanced, Map* map); +public: /* BattlefieldScript */ + void OnBattlefieldPlayerEnterZone(Battlefield* bf, Player* player); + void OnBattlefieldPlayerLeaveZone(Battlefield* bf, Player* player); + void OnBattlefieldPlayerJoinWar(Battlefield* bf, Player* player); + void OnBattlefieldPlayerLeaveWar(Battlefield* bf, Player* player); + void OnBattlefieldBeforeInvitePlayerToWar(Battlefield* bf, Player* player); + public: /* BGScript */ void OnBattlegroundStart(Battleground* bg); void OnBattlegroundEndReward(Battleground* bg, Player* player, TeamId winnerTeamId); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 2cc592b3e..3a01fbdaa 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -379,8 +379,6 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) if (updater.ProcessUnsafe()) UpdateTimeOutTime(diff); - HandleTeleportTimeout(updater.ProcessUnsafe()); - ///- Retrieve packets from the receive queue and call the appropriate handlers /// not process packets if socket already closed WorldPacket* packet = nullptr; @@ -635,36 +633,6 @@ bool WorldSession::IsSocketClosed() const return !m_Socket || !m_Socket->IsOpen(); } -void WorldSession::HandleTeleportTimeout(bool updateInSessions) -{ - // pussywizard: handle teleport ack timeout - if (m_Socket && m_Socket->IsOpen() && GetPlayer() && GetPlayer()->IsBeingTeleported()) - { - time_t currTime = GameTime::GetGameTime().count(); - if (updateInSessions) // session update from World::UpdateSessions - { - if (GetPlayer()->IsBeingTeleportedFar() && GetPlayer()->GetSemaphoreTeleportFar() + sWorld->getIntConfig(CONFIG_TELEPORT_TIMEOUT_FAR) < currTime) - while (GetPlayer() && GetPlayer()->IsBeingTeleportedFar()) - HandleMoveWorldportAck(); - } - else // session update from Map::Update - { - if (GetPlayer()->IsBeingTeleportedNear() && GetPlayer()->GetSemaphoreTeleportNear() + sWorld->getIntConfig(CONFIG_TELEPORT_TIMEOUT_NEAR) < currTime) - while (GetPlayer() && GetPlayer()->IsInWorld() && GetPlayer()->IsBeingTeleportedNear()) - { - Player* plMover = GetPlayer()->m_mover->ToPlayer(); - if (!plMover) - break; - WorldPacket pkt(MSG_MOVE_TELEPORT_ACK, 20); - pkt << plMover->GetPackGUID(); - pkt << uint32(0); // flags - pkt << uint32(0); // time - HandleMoveTeleportAck(pkt); - } - } - } -} - /// %Log the player out void WorldSession::LogoutPlayer(bool save) { diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c63e707cc..08391493f 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -1157,7 +1157,6 @@ public: // opcodes handlers void HandleEnterPlayerVehicle(WorldPacket& data); void HandleUpdateProjectilePosition(WorldPacket& recvPacket); - void HandleTeleportTimeout(bool updateInSessions); bool HandleSocketClosed(); void SetOfflineTime(uint32 time) { _offlineTime = time; } uint32 GetOfflineTime() const { return _offlineTime; } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 5b8599136..045b21565 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -820,6 +820,17 @@ void AuraEffect::ApplySpellMod(Unit* target, bool apply) // Auras with charges do not mod amount of passive auras if (GetBase()->IsUsingCharges()) return; + + // Guard against infinite recursion: a spell mod recalculating an aura that + // triggers ApplySpellMod again (self-referencing or mutual spell mods). + if (m_isRecalculatingPassiveAuras) + { + LOG_DEBUG("spells.aura", "AuraEffect::ApplySpellMod: Recursion detected for spell {} effect {}, skipping passive aura recalculation", + GetId(), GetEffIndex()); + return; + } + m_isRecalculatingPassiveAuras = true; + // reapply some passive spells after add/remove related spellmods // Warning: it is a dead loop if 2 auras each other amount-shouldn't happen switch (GetMiscValue()) @@ -906,6 +917,8 @@ void AuraEffect::ApplySpellMod(Unit* target, bool apply) default: break; } + + m_isRecalculatingPassiveAuras = false; } void AuraEffect::Update(uint32 diff, Unit* caster) @@ -6756,7 +6769,9 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const // Set trigger flag uint32 procAttacker = PROC_FLAG_DONE_PERIODIC; uint32 procVictim = PROC_FLAG_TAKEN_PERIODIC; - uint32 procEx = (crit ? PROC_EX_CRITICAL_HIT : PROC_EX_NORMAL_HIT) | PROC_EX_INTERNAL_DOT; + uint32 procEx = PROC_EX_INTERNAL_DOT; + if (damage) + procEx |= crit ? PROC_EX_CRITICAL_HIT : PROC_EX_NORMAL_HIT; if (absorb > 0) procEx |= PROC_EX_ABSORB; @@ -6843,7 +6858,9 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c // Set trigger flag uint32 procAttacker = PROC_FLAG_DONE_PERIODIC; uint32 procVictim = PROC_FLAG_TAKEN_PERIODIC; - uint32 procEx = (crit ? PROC_EX_CRITICAL_HIT : PROC_EX_NORMAL_HIT) | PROC_EX_INTERNAL_DOT; + uint32 procEx = PROC_EX_INTERNAL_DOT; + if (dmgInfo.GetDamage()) + procEx |= crit ? PROC_EX_CRITICAL_HIT : PROC_EX_NORMAL_HIT; if (absorb > 0) procEx |= PROC_EX_ABSORB; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 960ded1dd..a4c8640c9 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -144,6 +144,7 @@ private: uint8 const m_effIndex; bool m_canBeRecalculated; bool m_isPeriodic; + bool m_isRecalculatingPassiveAuras = false; private: float CalcPeriodicCritChance(Unit const* caster, Unit const* target) const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 9a1c2dc5e..364155be2 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2559,11 +2559,15 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) if (effectUnit->IsAlive() != target->alive) return; - // Xinef: absorb delayed projectiles for 500ms - if (getState() == SPELL_STATE_DELAYED && !m_spellInfo->IsTargetingArea() && !m_spellInfo->IsPositive() && - (GameTime::GetGameTimeMS().count() - target->timeDelay) <= effectUnit->m_lastSanctuaryTime && GameTime::GetGameTimeMS().count() < (effectUnit->m_lastSanctuaryTime + 500) && - effectUnit->FindMap() && !effectUnit->FindMap()->IsDungeon() - ) + // Absorb delayed projectiles launched before Sanctuary (e.g. Vanish dodging a Frostbolt in flight) + if (getState() == SPELL_STATE_DELAYED && !m_spellInfo->IsPositive() && + (GameTime::GetGameTimeMS().count() - target->timeDelay) <= effectUnit->m_lastSanctuaryTime) + return; // No missinfo in that case + + // Absorb instant hostile spells on application within brief window after Sanctuary + if (getState() != SPELL_STATE_DELAYED && !m_spellInfo->IsPositive() && + effectUnit->m_lastSanctuaryTime && + GameTime::GetGameTimeMS().count() <= (effectUnit->m_lastSanctuaryTime + 400)) return; // No missinfo in that case // Get original caster (if exist) and calculate damage/healing from him data @@ -3069,9 +3073,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA } if (m_caster != unit && m_caster->IsHostileTo(unit) && !m_spellInfo->IsPositive() && !m_triggeredByAuraSpell && !m_spellInfo->HasAttribute(SPELL_ATTR0_CU_DONT_BREAK_STEALTH)) - { unit->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); - } if (aura_effmask) { @@ -3907,9 +3909,6 @@ void Spell::_cast(bool skipCheck) // we must send smsg_spell_go packet before m_castItem delete in TakeCastItem()... SendSpellGo(); - if (modOwner) - modOwner->SetSpellModTakingSpell(this, true); - bool resetAttackTimers = IsAutoActionResetSpell() && !m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS); if (resetAttackTimers) { @@ -4098,6 +4097,14 @@ void Spell::handle_immediate() // process immediate effects (items, ground, etc.) also initialize some variables _handle_immediate_phase(); + // Sync persistent area aura duration with hasted channel duration + if (m_spellInfo->IsChanneled() && m_spellAura && m_channeledDuration > 0 + && m_spellAura->GetType() == DYNOBJ_AURA_TYPE) + { + m_spellAura->SetMaxDuration(m_channeledDuration); + m_spellAura->SetDuration(m_channeledDuration); + } + for (std::list::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) DoAllEffectOnTarget(&(*ihit)); @@ -4472,10 +4479,6 @@ void Spell::finish(bool ok) if (m_spellInfo->IsCooldownStartedOnEvent()) m_caster->ToPlayer()->SendCooldownEvent(m_spellInfo, 0, 0, false); - // Rogue fix: Remove Cold Blood if Mutilate off-hand failed - if (m_spellInfo->Id == 27576) // Mutilate, off-hand - if (m_caster->HasAura(14177)) - m_caster->RemoveAura(14177); } return; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index a23d3b43c..603a5c923 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -509,6 +509,7 @@ public: void SendPetCastResult(SpellCastResult result); void SendSpellStart(); void SendSpellGo(); + void SendSpellCooldown(); void SendLogExecute(); void ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32 PowerType, uint32 powerTaken, float gainMultiplier); @@ -564,6 +565,7 @@ public: bool IsNextMeleeSwingSpell() const; bool IsTriggered() const { return HasTriggeredCastFlag(TRIGGERED_FULL_MASK); }; bool HasTriggeredCastFlag(TriggerCastFlags flag) const { return _triggeredCastFlags & flag; }; + [[nodiscard]] bool IsProcDisabled() const { return HasTriggeredCastFlag(TRIGGERED_DISALLOW_PROC_EVENTS); } bool IsChannelActive() const { return m_caster->GetUInt32Value(UNIT_CHANNEL_SPELL) != 0; } bool IsAutoActionResetSpell() const; bool IsIgnoringCooldowns() const; diff --git a/src/server/game/Spells/SpellInfoCorrections.cpp b/src/server/game/Spells/SpellInfoCorrections.cpp index 8553143a5..db178cd07 100644 --- a/src/server/game/Spells/SpellInfoCorrections.cpp +++ b/src/server/game/Spells/SpellInfoCorrections.cpp @@ -1885,9 +1885,8 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_1].Effect = 0; }); - // Ulduar, Mimiron, Magnetic Core (summon) // Meeting Stone Summon - ApplySpellFix({ 64444, 23598 }, [](SpellInfo* spellInfo) + ApplySpellFix({ 23598 }, [](SpellInfo* spellInfo) { spellInfo->Effects[EFFECT_0].TargetA = SpellImplicitTargetInfo(TARGET_DEST_CASTER); }); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index a179c1963..cb4f80d39 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -23,6 +23,7 @@ #include "InstanceScript.h" #include "ObjectMgr.h" #include "Player.h" +#include "RaceMgr.h" #include "ScriptMgr.h" #include "SharedDefines.h" #include "Spell.h" @@ -2028,6 +2029,24 @@ void SpellMgr::LoadSpellProcs() if (!addTriggerFlag && isAlwaysTriggeredAura[auraName]) addTriggerFlag = true; + + // Many proc auras with taken procFlag mask don't have + // attribute "can proc with triggered" — they should + // proc nevertheless (e.g. mage armor spells with + // judgement) + if (!addTriggerFlag + && (spellInfo->ProcFlags & TAKEN_HIT_PROC_FLAG_MASK)) + { + switch (auraName) + { + case SPELL_AURA_PROC_TRIGGER_SPELL: + case SPELL_AURA_PROC_TRIGGER_DAMAGE: + addTriggerFlag = true; + break; + default: + break; + } + } } if (!found) @@ -2779,7 +2798,7 @@ void SpellMgr::LoadSpellAreas() } } - if (spellArea.raceMask && (spellArea.raceMask & RACEMASK_ALL_PLAYABLE) == 0) + if (spellArea.raceMask && (spellArea.raceMask & sRaceMgr->GetPlayableRaceMask()) == 0) { LOG_ERROR("sql.sql", "Spell {} listed in `spell_area` have wrong race mask ({}) requirement", spell, spellArea.raceMask); continue; diff --git a/src/server/game/Time/GameTime.h b/src/server/game/Time/GameTime.h index 40d96f6a5..37ffb7bfb 100644 --- a/src/server/game/Time/GameTime.h +++ b/src/server/game/Time/GameTime.h @@ -41,6 +41,19 @@ namespace GameTime /// Uptime AC_GAME_API Seconds GetUptime(); + /// Uptime since a given time point + inline Microseconds Elapsed(TimePoint start) + { + return std::chrono::duration_cast(Now() - start); + } + + /// Check if a duration has elapsed since a given time point + template + inline bool HasElapsed(TimePoint start, T duration) + { + return (Now() - start) >= duration; + } + /// Update all timers void UpdateGameTimers(); } diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 1cad8c86b..ba9e6b3df 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -38,9 +38,12 @@ Warden::Warden() : _session(nullptr), _checkTimer(10000/*10 sec*/), _clientRespo Warden::~Warden() { - delete[] _module->CompressedData; - delete _module; - _module = nullptr; + if (_module) + { + delete[] _module->CompressedData; + delete _module; + _module = nullptr; + } _initialized = false; } diff --git a/src/server/game/Warden/WardenMac.cpp b/src/server/game/Warden/WardenMac.cpp index 75e25990b..f3cdf257f 100644 --- a/src/server/game/Warden/WardenMac.cpp +++ b/src/server/game/Warden/WardenMac.cpp @@ -72,9 +72,12 @@ ClientWardenModule* WardenMac::GetModuleForClient() { auto mod = new ClientWardenModule; + uint32 length = Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.size(); + // data assign - mod->CompressedSize = Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.size(); - mod->CompressedData = Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.data(); + mod->CompressedSize = length; + mod->CompressedData = new uint8[length]; + memcpy(mod->CompressedData, Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data.data(), length); // md5 hash mod->Id = Acore::Crypto::MD5::GetDigestOf(mod->CompressedData, mod->CompressedSize); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index c53b2a92d..a2fd63f44 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -72,6 +72,7 @@ #include "Player.h" #include "PlayerDump.h" #include "PoolMgr.h" +#include "RaceMgr.h" #include "Realm.h" #include "ScriptMgr.h" #include "ServerMailMgr.h" @@ -386,6 +387,9 @@ void World::SetInitialWorldSettings() // Load cinematic cameras LoadM2Cameras(_dataPath); + LOG_INFO("server.loading", "Loading Player race data..."); + sRaceMgr->LoadRaces(); + // Load IP Location Database sIPLocation->Load(); diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index 62759608b..adfed5cc1 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -304,8 +304,6 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_LOGDB_CLEARINTERVAL, "LogDB.Opt.ClearInterval", 10, ConfigValueCache::Reloadable::Yes, [](uint32 const& value) { return value > 0; }, "> 0"); SetConfigValue(CONFIG_LOGDB_CLEARTIME, "LogDB.Opt.ClearTime", 1209600); - SetConfigValue(CONFIG_TELEPORT_TIMEOUT_NEAR, "TeleportTimeoutNear", 25); - SetConfigValue(CONFIG_TELEPORT_TIMEOUT_FAR, "TeleportTimeoutFar", 45); SetConfigValue(CONFIG_MAX_ALLOWED_MMR_DROP, "MaxAllowedMMRDrop", 500); SetConfigValue(CONFIG_ENABLE_LOGIN_AFTER_DC, "EnableLoginAfterDC", true); SetConfigValue(CONFIG_DONT_CACHE_RANDOM_MOVEMENT_PATHS, "DontCacheRandomMovementPaths", false); @@ -562,6 +560,7 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_LFG_OPTIONSMASK, "DungeonFinder.OptionsMask", 5); SetConfigValue(CONFIG_LFG_CAST_DESERTER, "DungeonFinder.CastDeserter", true); SetConfigValue(CONFIG_LFG_ALLOW_COMPLETED, "DungeonFinder.AllowCompleted", true); + SetConfigValue(CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN, "DungeonFinder.DungeonSelectionCooldown", 0); // DBC_ItemAttributes SetConfigValue(CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, "DBC.EnforceItemAttributes", true); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index 3cf19aa21..fe3b9162f 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -300,8 +300,6 @@ enum ServerConfigs CONFIG_NUMTHREADS, CONFIG_LOGDB_CLEARINTERVAL, CONFIG_LOGDB_CLEARTIME, - CONFIG_TELEPORT_TIMEOUT_NEAR, - CONFIG_TELEPORT_TIMEOUT_FAR, CONFIG_MAX_ALLOWED_MMR_DROP, CONFIG_CLIENTCACHE_VERSION, CONFIG_GUILD_EVENT_LOG_COUNT, @@ -321,6 +319,7 @@ enum ServerConfigs CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION, CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS, CONFIG_LFG_OPTIONSMASK, + CONFIG_LFG_DUNGEON_SELECTION_COOLDOWN, CONFIG_MAX_INSTANCES_PER_HOUR, CONFIG_WINTERGRASP_PLR_MAX, CONFIG_WINTERGRASP_PLR_MIN, diff --git a/src/server/scripts/Commands/cs_bf.cpp b/src/server/scripts/Commands/cs_bf.cpp index 84df1c088..4224068b9 100644 --- a/src/server/scripts/Commands/cs_bf.cpp +++ b/src/server/scripts/Commands/cs_bf.cpp @@ -18,6 +18,7 @@ #include "BattlefieldMgr.h" #include "Chat.h" #include "CommandScript.h" +#include "Language.h" using namespace Acore::ChatCommands; @@ -30,11 +31,11 @@ public: { static ChatCommandTable battlefieldcommandTable = { - { "start", HandleBattlefieldStart, SEC_ADMINISTRATOR, Console::No }, - { "stop", HandleBattlefieldEnd, SEC_ADMINISTRATOR, Console::No }, - { "switch", HandleBattlefieldSwitch, SEC_ADMINISTRATOR, Console::No }, - { "timer", HandleBattlefieldTimer, SEC_ADMINISTRATOR, Console::No }, - { "enable", HandleBattlefieldEnable, SEC_ADMINISTRATOR, Console::No } + { "start", HandleBattlefieldStart, SEC_ADMINISTRATOR, Console::Yes }, + { "stop", HandleBattlefieldEnd, SEC_ADMINISTRATOR, Console::Yes }, + { "switch", HandleBattlefieldSwitch, SEC_ADMINISTRATOR, Console::Yes }, + { "timer", HandleBattlefieldTimer, SEC_ADMINISTRATOR, Console::Yes }, + { "enable", HandleBattlefieldEnable, SEC_ADMINISTRATOR, Console::Yes } }; static ChatCommandTable commandTable = { @@ -48,12 +49,15 @@ public: Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); if (!bf) + { + handler->SendErrorMessage(LANG_BF_NOT_FOUND, battleId); return false; + } bf->StartBattle(); - - if (battleId == 1) - handler->SendGlobalGMSysMessage("Wintergrasp (Command start used)"); + handler->SendWorldText(LANG_BF_STARTED, battleId); + if (handler->IsConsole()) + handler->PSendSysMessage(LANG_BF_STARTED, battleId); return true; } @@ -63,12 +67,15 @@ public: Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); if (!bf) + { + handler->SendErrorMessage(LANG_BF_NOT_FOUND, battleId); return false; + } bf->EndBattle(true); - - if (battleId == 1) - handler->SendGlobalGMSysMessage("Wintergrasp (Command stop used)"); + handler->SendWorldText(LANG_BF_STOPPED, battleId); + if (handler->IsConsole()) + handler->PSendSysMessage(LANG_BF_STOPPED, battleId); return true; } @@ -78,19 +85,24 @@ public: Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); if (!bf) + { + handler->SendErrorMessage(LANG_BF_NOT_FOUND, battleId); return false; + } if (bf->IsEnabled()) { bf->ToggleBattlefield(false); - if (battleId == 1) - handler->SendGlobalGMSysMessage("Wintergrasp is disabled"); + handler->SendWorldText(LANG_BF_DISABLED, battleId); + if (handler->IsConsole()) + handler->PSendSysMessage(LANG_BF_DISABLED, battleId); } else { bf->ToggleBattlefield(true); - if (battleId == 1) - handler->SendGlobalGMSysMessage("Wintergrasp is enabled"); + handler->SendWorldText(LANG_BF_ENABLED, battleId); + if (handler->IsConsole()) + handler->PSendSysMessage(LANG_BF_ENABLED, battleId); } return true; @@ -101,11 +113,15 @@ public: Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); if (!bf) + { + handler->SendErrorMessage(LANG_BF_NOT_FOUND, battleId); return false; + } bf->EndBattle(false); - if (battleId == 1) - handler->SendGlobalGMSysMessage("Wintergrasp (Command switch used)"); + handler->SendWorldText(LANG_BF_SWITCHED, battleId); + if (handler->IsConsole()) + handler->PSendSysMessage(LANG_BF_SWITCHED, battleId); return true; } @@ -138,12 +154,16 @@ public: Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId); if (!bf) + { + handler->SendErrorMessage(LANG_BF_NOT_FOUND, battleId); return false; + } bf->SetTimer(time * IN_MILLISECONDS); bf->SendInitWorldStatesToAll(); - if (battleId == 1) - handler->SendGlobalGMSysMessage("Wintergrasp (Command timer used)"); + handler->SendWorldText(LANG_BF_TIMER_SET, battleId, time); + if (handler->IsConsole()) + handler->PSendSysMessage(LANG_BF_TIMER_SET, battleId, time); return true; } diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp index bfdee4288..693ab1585 100644 --- a/src/server/scripts/Commands/cs_lfg.cpp +++ b/src/server/scripts/Commands/cs_lfg.cpp @@ -47,11 +47,12 @@ public: { static ChatCommandTable lfgCommandTable = { - { "player", HandleLfgPlayerInfoCommand, SEC_MODERATOR, Console::No }, - { "group", HandleLfgGroupInfoCommand, SEC_MODERATOR, Console::No }, - { "queue", HandleLfgQueueInfoCommand, SEC_MODERATOR, Console::Yes }, - { "clean", HandleLfgCleanCommand, SEC_ADMINISTRATOR, Console::Yes }, - { "options", HandleLfgOptionsCommand, SEC_GAMEMASTER, Console::Yes }, + { "player", HandleLfgPlayerInfoCommand, SEC_MODERATOR, Console::No }, + { "group", HandleLfgGroupInfoCommand, SEC_MODERATOR, Console::No }, + { "queue", HandleLfgQueueInfoCommand, SEC_MODERATOR, Console::Yes }, + { "clean", HandleLfgCleanCommand, SEC_ADMINISTRATOR, Console::Yes }, + { "options", HandleLfgOptionsCommand, SEC_GAMEMASTER, Console::Yes }, + { "cooldown", HandleLfgCooldownClearCommand, SEC_ADMINISTRATOR, Console::Yes }, }; static ChatCommandTable commandTable = @@ -126,6 +127,13 @@ public: sLFGMgr->Clean(); return true; } + + static bool HandleLfgCooldownClearCommand(ChatHandler* handler) + { + sLFGMgr->ClearDungeonCooldowns(); + handler->SendSysMessage(LANG_LFG_COOLDOWN_CLEARED); + return true; + } }; void AddSC_lfg_commandscript() diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index e99039bba..c3a6772cc 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -286,6 +286,34 @@ public: if (!handler->GetSession()) handler->SendSysMessage(LANG_RESETALL_TALENTS); } + else if (caseName == "honor") + { + CharacterDatabase.Execute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_ALL_HONOR_POINTS)); + + sWorldSessionMgr->DoForAllOnlinePlayers([](Player* player) + { + player->SetHonorPoints(0); + }); + + handler->SendWorldText(LANG_RESETALL_HONOR); + if (!handler->GetSession()) + handler->SendSysMessage(LANG_RESETALL_HONOR); + return true; + } + else if (caseName == "arena") + { + CharacterDatabase.Execute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_ALL_ARENA_POINTS)); + + sWorldSessionMgr->DoForAllOnlinePlayers([](Player* player) + { + player->SetArenaPoints(0); + }); + + handler->SendWorldText(LANG_RESETALL_ARENA); + if (!handler->GetSession()) + handler->SendSysMessage(LANG_RESETALL_ARENA); + return true; + } else { handler->SendErrorMessage(LANG_RESETALL_UNKNOWN_CASE, caseName); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 61aaed9aa..7b1728615 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -90,7 +90,6 @@ enum GosNpcs { NPC_FLAME_LEVIATHAN_TURRET = 33139, NPC_SEAT = 33114, - NPC_MECHANOLIFT = 33214, NPC_LIQUID = 33189, // Starting event @@ -116,14 +115,13 @@ enum Events EVENT_MISSILE = 2, EVENT_VENT = 3, EVENT_SPEED = 4, - EVENT_SUMMON = 5, - EVENT_REINSTALL = 6, - EVENT_HODIRS_FURY = 7, - EVENT_FREYA = 8, - EVENT_MIMIRONS_INFERNO = 9, - EVENT_THORIMS_HAMMER = 10, - EVENT_SOUND_BEGINNING = 11, - EVENT_POSITION_CHECK = 12, + EVENT_REINSTALL = 5, + EVENT_HODIRS_FURY = 6, + EVENT_FREYA = 7, + EVENT_MIMIRONS_INFERNO = 8, + EVENT_THORIMS_HAMMER = 9, + EVENT_SOUND_BEGINNING = 10, + EVENT_POSITION_CHECK = 11, }; enum Texts @@ -153,12 +151,6 @@ enum Texts BRANN_RADIO_SAY_FL_START_0 = 0, BRANN_RADIO_SAY_FL_START_1 = 1, BRANN_RADIO_SAY_FL_START_2 = 2, - BRANN_RADIO_SAY_GENERATORS = 3, - BRANN_RADIO_SAY_STATIONS = 4, - BRANN_RADIO_SAY_TOWER_THORIM = 5, - BRANN_RADIO_SAY_TOWER_HODIR = 6, - BRANN_RADIO_SAY_TOWER_FREYA = 7, - BRANN_RADIO_SAY_TOWER_MIMIRON = 8, // Vehicle Repair - Said by a spell, BroadcastTextID, same as FLAME_LEVIATHAN_EMOTE_REPAIR VEHICLE_EMOTE_REPAIR = 33538, @@ -413,13 +405,6 @@ struct boss_flame_leviathan : public BossAI me->CastSpell(me, SPELL_FLAME_VENTS, false); events.Repeat(20s); return; - case EVENT_SUMMON: - if (summons.size() < 20) - if (Creature* lift = DoSummonFlyer(NPC_MECHANOLIFT, me, 30.0f, 50.0f, 0)) - lift->GetMotionMaster()->MoveRandom(100); - - events.Repeat(4s); - return; case EVENT_SOUND_BEGINNING: if (_towersCount) Talk(FLAME_LEVIATHAN_SAY_HARDMODE); @@ -591,7 +576,6 @@ void boss_flame_leviathan::ScheduleEvents() events.RescheduleEvent(EVENT_MISSILE, 5s); events.RescheduleEvent(EVENT_VENT, 20s); events.RescheduleEvent(EVENT_SPEED, 15s); - events.RescheduleEvent(EVENT_SUMMON, 10s); events.RescheduleEvent(EVENT_SOUND_BEGINNING, 10s); events.RescheduleEvent(EVENT_POSITION_CHECK, 5s); @@ -1092,87 +1076,6 @@ struct npc_pool_of_tar : public NullCreatureAI } }; -struct npc_brann_radio : public NullCreatureAI -{ - npc_brann_radio(Creature* c) : NullCreatureAI(c) - { - _lock = (me->GetInstanceScript() && me->GetInstanceScript()->GetBossState(BOSS_LEVIATHAN) > NOT_STARTED); - _helpLock = _lock; - } - - bool _lock; - bool _helpLock; - - void Reset() override - { - me->SetReactState(REACT_AGGRESSIVE); - } - - void MoveInLineOfSight(Unit* who) override - { - if (!_lock) - { - if (!who->IsPlayer() && !who->IsVehicle()) - return; - - // MIMIRON - else if (me->GetDistance2d(-81.9207f, 111.432f) < 5.0f) - { - if (me->GetDistance2d(who) <= 60.0f && who->GetPositionZ() > 430.0f) - { - Talk(BRANN_RADIO_SAY_TOWER_MIMIRON); - _lock = true; - } - } - // FREYA - else if (me->GetDistance2d(-221.475f, -271.087f) < 5.0f) - { - if (me->GetDistance2d(who) <= 60.0f && who->GetPositionZ() < 380.0f) - { - Talk(BRANN_RADIO_SAY_TOWER_FREYA); - _lock = true; - } - } - // STATIONS - else if (me->GetDistance2d(73.8978f, -29.3306f) < 5.0f) - { - if (me->GetDistance2d(who) <= 40.0f) - { - Talk(BRANN_RADIO_SAY_STATIONS); - _lock = true; - } - } - // HODIR - else if (me->GetDistance2d(68.7679f, -325.026f) < 5.0f) - { - if (me->GetDistance2d(who) <= 40.0f) - { - Talk(BRANN_RADIO_SAY_TOWER_HODIR); - _lock = true; - } - } - // THORIM - else if (me->GetDistance2d(174.442f, 345.679f) < 5.0f) - { - if (me->GetDistance2d(who) <= 60.0f) - { - Talk(BRANN_RADIO_SAY_TOWER_THORIM); - _lock = true; - } - } - // COME A BIT CLOSER - else if (me->GetDistance2d(-508.898f, -32.9631f) < 5.0f) - { - if (who->GetPositionX() >= -480.0f) - { - Talk(BRANN_RADIO_SAY_GENERATORS); - _lock = true; - } - } - } - } -}; - struct npc_storm_beacon_spawn : public NullCreatureAI { npc_storm_beacon_spawn(Creature* c) : NullCreatureAI(c) @@ -1240,43 +1143,6 @@ struct boss_flame_leviathan_safety_container : public NullCreatureAI } }; -struct npc_mechanolift : public NullCreatureAI -{ - npc_mechanolift(Creature* c) : NullCreatureAI(c) - { - me->SetSpeed(MOVE_RUN, rand_norm() + 0.5f); - } - - int32 _startTimer; - uint32 _evadeTimer; - - void Reset() override - { - _startTimer = urand(1, 5000); - _evadeTimer = 0; - } - - void UpdateAI(uint32 diff) override - { - if (_startTimer) - { - _startTimer -= diff; - if (_startTimer <= 0) - { - me->GetMotionMaster()->MoveWaypoint(3000000 + urand(0, 11), true); - _startTimer = 0; - } - } - - _evadeTimer += diff; - if (_evadeTimer >= 10000) - { - _EnterEvadeMode(); - _evadeTimer = 0; - } - } -}; - class go_ulduar_tower : public GameObjectScript { public: @@ -1427,7 +1293,7 @@ public: bool operator()(WorldObject* target) const { - //! No players, only vehicles (todo: check if blizzlike) + //! No players, only vehicles. Pursue is never cast on players. Creature* creatureTarget = target->ToCreature(); if (!creatureTarget) return true; @@ -1462,12 +1328,7 @@ class spell_pursue : public SpellScript void FilterTargets(std::list& targets) { targets.remove_if(FlameLeviathanPursuedTargetSelector()); - if (targets.empty()) - { - if (Creature* caster = GetCaster()->ToCreature()) - caster->AI()->EnterEvadeMode(); - } - else + if (!targets.empty()) { //! In the end, only one target should be selected WorldObject* _target = Acore::Containers::SelectRandomContainerElement(targets); @@ -1877,10 +1738,8 @@ void AddSC_boss_flame_leviathan() RegisterUlduarCreatureAI(npc_hodirs_fury); // Helpers - RegisterUlduarCreatureAI(npc_brann_radio); RegisterUlduarCreatureAI(npc_storm_beacon_spawn); RegisterUlduarCreatureAI(boss_flame_leviathan_safety_container); - RegisterUlduarCreatureAI(npc_mechanolift); // GOs new go_ulduar_tower(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index e4c1367f9..8958c9af8 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -62,10 +62,12 @@ enum SpellData SPELL_SPINNING_UP = 63414, // PHASE 3: - SPELL_PLASMA_BALL = 63689, + SPELL_PLASMA_BALL_P1 = 63689, + SPELL_PLASMA_BALL_P2 = 65647, SPELL_MAGNETIC_CORE = 64436, - SPELL_SPINNING = 64438, + SPELL_MAGNETIC_CORE_VISUAL = 64438, + SPELL_MAGNETIC_CORE_SUMMON = 64444, SPELL_SUMMON_BOMB_BOT = 63811, SPELL_BB_EXPLODE = 63801, @@ -194,9 +196,6 @@ enum EVENTS EVENT_BOMB_BOT_RELOCATE = 30, EVENT_SUMMON_ASSAULT_BOT = 40, EVENT_SUMMON_JUNK_BOT = 41, - EVENT_MAGNETIC_CORE_PULL_DOWN = 42, - EVENT_MAGNETIC_CORE_FREE = 43, - EVENT_MAGNETIC_CORE_REMOVE_IMMOBILIZE = 44, // Hard mode: EVENT_COMPUTER_SAY_INITIATED = 60, @@ -212,6 +211,12 @@ enum EVENTS EVENT_EMERGENCY_BOT_ATTACK = 70, }; +enum Actions +{ + DO_DISABLE_AERIAL = 1, + DO_ENABLE_AERIAL, +}; + enum Texts { // Mimiron @@ -255,6 +260,8 @@ enum Texts #define GetVX001() instance->GetCreature(DATA_MIMIRON_VX001) #define GetACU() instance->GetCreature(DATA_MIMIRON_ACU) +Position const ACUSummonPos = { 2742.6265f, 2568.0571f, 377.22076f, 0.0f }; /// @todo: replace with sniffed position + struct boss_mimiron : public BossAI { boss_mimiron(Creature* pCreature) : BossAI(pCreature, BOSS_MIMIRON) @@ -563,12 +570,9 @@ struct boss_mimiron : public BossAI break; case EVENT_GET_OUT_VX001: if (Creature* VX001 = GetVX001()) - if (Creature* ACU = me->SummonCreature(NPC_AERIAL_COMMAND_UNIT, 2743.91f, 2568.78f, 391.34f, M_PI, TEMPSUMMON_MANUAL_DESPAWN)) + if (me->SummonCreature(NPC_AERIAL_COMMAND_UNIT, ACUSummonPos, TEMPSUMMON_MANUAL_DESPAWN)) { me->EnterVehicle(VX001, 4); - float speed = ACU->GetDistance(2737.75f, 2574.22f, 381.34f) / 2.0f; - ACU->GetMotionMaster()->MovePoint(0, 2737.75f, 2574.22f, 381.34f, FORCED_MOVEMENT_NONE, speed); - ACU->SetPosition(2737.75f, 2574.22f, 381.34f, M_PI); events.ScheduleEvent(EVENT_SAY_VX001_DEAD, 2s); break; } @@ -1499,7 +1503,6 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI { instance = me->GetInstanceScript(); bIsEvading = false; - immobilized = false; me->SetDisableGravity(true); } @@ -1508,19 +1511,13 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI SummonList summons; bool bIsEvading; uint8 Phase; - bool immobilized; void Reset() override { Phase = 0; events.Reset(); summons.DespawnAll(); - } - - void AttackStart(Unit* who) override - { - if (who) - me->Attack(who, true); // skip following + me->SetCombatMovement(false); /// @todo: research ACU behaviour } void SetData(uint32 id, uint32 value) override @@ -1532,16 +1529,12 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI case 0: Phase = 0; events.Reset(); - immobilized = false; break; case 3: Phase = 3; me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - if (Unit* target = SelectTargetFromPlayerList(75.0f)) - AttackStart(target); DoZoneInCombat(); events.Reset(); - events.ScheduleEvent(EVENT_SPELL_PLASMA_BALL, 0ms); events.ScheduleEvent(EVENT_SUMMON_BOMB_BOT, 15s); events.ScheduleEvent(EVENT_SUMMON_ASSAULT_BOT, 1s); events.ScheduleEvent(EVENT_SUMMON_JUNK_BOT, 10s); @@ -1561,17 +1554,31 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI events.ScheduleEvent(EVENT_SPELL_PLASMA_BALL, 0ms); } } - else if (id == 2 && !immobilized && Phase == 3) // magnetic core - { - immobilized = true; - events.ScheduleEvent(EVENT_MAGNETIC_CORE_PULL_DOWN, 2s); - } } void DoAction(int32 param) override { - if (param == 1337) - summons.DespawnAll(); + switch (param) + { + case DO_DISABLE_AERIAL: + me->CastStop(); + me->AttackStop(); + me->SetReactState(REACT_PASSIVE); + me->SetDisableGravity(false); + me->GetMotionMaster()->MoveFall(); + events.DelayEvents(25s); + break; + case DO_ENABLE_AERIAL: + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10.0f); + me->m_Events.AddEventAtOffset([&] { + me->SetReactState(REACT_AGGRESSIVE); + }, 2s); + break; + case 1337: + summons.DespawnAll(); + break; + } } void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override @@ -1624,42 +1631,11 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) + if (me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE) || me->HasAura(SPELL_MAGNETIC_CORE)) return; - // following :D - if (Phase == 3 && !immobilized) - if (Unit* victim = me->GetVictim()) - if (me->GetExactDist2d(victim) > 25.0f ) - { - float angle = victim->GetAngle(me->GetPositionX(), me->GetPositionY()); - me->SetOrientation( me->GetAngle(victim->GetPositionX(), victim->GetPositionY())); - float x = victim->GetPositionX() + 15.0f * cos(angle); - float y = victim->GetPositionY() + 15.0f * std::sin(angle); - - // check if there's magnetic core in line of movement - Creature* mc = nullptr; - std::list cl; - me->GetCreaturesWithEntryInRange(cl, me->GetExactDist2d(victim), NPC_MAGNETIC_CORE); - for( std::list::iterator itr = cl.begin(); itr != cl.end(); ++itr ) - { - if ((*itr)->IsInBetween(me, victim, 4.0f) && (*itr)->GetExactDist2d(victim) >= 10.0f) // don't come very close just because there's a magnetic core - { - x = (*itr)->GetPositionX(); - y = (*itr)->GetPositionY(); - mc = (*itr); - break; - } - } - - float speed = me->GetExactDist(x, y, 381.34f); - me->GetMotionMaster()->MovePoint(0, x, y, 381.34f, FORCED_MOVEMENT_NONE, speed); - if (mc) - { - mc->AI()->SetData(0, 0); - SetData(2, 1); - } - } + if (!UpdateVictim()) + return; events.Update(diff); @@ -1670,14 +1646,8 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI { case 0: break; - case EVENT_SPELL_PLASMA_BALL: - if (!immobilized) - DoCastVictim(SPELL_PLASMA_BALL); - events.Repeat(3s); - break; case EVENT_SUMMON_BOMB_BOT: - if (!immobilized) - me->CastSpell(me, SPELL_SUMMON_BOMB_BOT, false); + me->CastSpell(me, SPELL_SUMMON_BOMB_BOT, false); events.Repeat(15s); break; case EVENT_SUMMON_ASSAULT_BOT: @@ -1702,21 +1672,9 @@ struct npc_ulduar_aerial_command_unit : public ScriptedAI events.Repeat(45s); } break; - case EVENT_MAGNETIC_CORE_PULL_DOWN: - me->CastSpell(me, SPELL_MAGNETIC_CORE, true); - me->CastSpell(me, SPELL_SPINNING, true); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 365.34f, FORCED_MOVEMENT_NONE, me->GetExactDist(me->GetPositionX(), me->GetPositionY(), 365.34f)); - events.ScheduleEvent(EVENT_MAGNETIC_CORE_FREE, 20s); - break; - case EVENT_MAGNETIC_CORE_FREE: - me->RemoveAura(SPELL_SPINNING); - me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), 381.34f, FORCED_MOVEMENT_NONE, me->GetDistance(me->GetPositionX(), me->GetPositionY(), 381.34f)); - events.ScheduleEvent(EVENT_MAGNETIC_CORE_REMOVE_IMMOBILIZE, 1s); - break; - case EVENT_MAGNETIC_CORE_REMOVE_IMMOBILIZE: - immobilized = false; - break; } + + DoSpellAttackIfReady(Phase == 3 ? SPELL_PLASMA_BALL_P1 : SPELL_PLASMA_BALL_P2); } void MoveInLineOfSight(Unit* /*mover*/) override {} @@ -1871,44 +1829,6 @@ struct npc_ulduar_mimiron_rocket : public NullCreatureAI } }; -struct npc_ulduar_magnetic_core : public NullCreatureAI -{ - npc_ulduar_magnetic_core(Creature* pCreature) : NullCreatureAI(pCreature) - { - instance = me->GetInstanceScript(); - if (Creature* c = GetACU()) - if (c->GetExactDist2d(me) <= 10.0f) - { - me->SendMonsterMove(c->GetPositionX(), c->GetPositionY(), 364.313f, 1); - me->UpdatePosition(c->GetPositionX(), c->GetPositionY(), 364.313f, me->GetOrientation(), true); - me->StopMovingOnCurrentPos(); - c->AI()->SetData(2, 1); - despawnTimer = 20000; - return; - } - despawnTimer = 60000; - } - - InstanceScript* instance; - uint16 despawnTimer; - - void SetData(uint32 /*id*/, uint32 /*value*/) override - { - despawnTimer = 20000; - } - - void UpdateAI(uint32 diff) override - { - if (despawnTimer <= diff) - { - despawnTimer = 60000; - me->DespawnOrUnsummon(1ms); - } - else - despawnTimer -= diff; - } -}; - struct npc_ulduar_bot_summon_trigger : public NullCreatureAI { npc_ulduar_bot_summon_trigger(Creature* pCreature) : NullCreatureAI(pCreature) { } @@ -1965,6 +1885,67 @@ struct npc_ulduar_bot_summon_trigger : public NullCreatureAI } }; +// 64444 - Magnetic Core Summon +class spell_mimiron_magnetic_core_summon : public SpellScript +{ + PrepareSpellScript(spell_mimiron_magnetic_core_summon); + + void ModDest(SpellDestination& dest) + { + Unit* caster = GetCaster(); + Position pos = caster->GetPosition(); + pos.m_positionZ = caster->GetMap()->GetHeight(pos); + dest.Relocate(pos); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mimiron_magnetic_core_summon::ModDest, EFFECT_0, TARGET_DEST_NEARBY_ENTRY); + } +}; + +// 64436 - Magnetic Core (aura) +class spell_mimiron_magnetic_core_aura : public AuraScript +{ + PrepareAuraScript(spell_mimiron_magnetic_core_aura); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_MAGNETIC_CORE_VISUAL }); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + { + target->AI()->DoAction(DO_DISABLE_AERIAL); + target->CastSpell(target, SPELL_MAGNETIC_CORE_VISUAL, true); + } + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + { + target->AI()->DoAction(DO_ENABLE_AERIAL); + target->RemoveAurasDueToSpell(SPELL_MAGNETIC_CORE_VISUAL); + } + } + + void OnRemoveSelf(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (TempSummon* summ = GetTarget()->ToTempSummon()) + summ->DespawnOrUnsummon(); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_mimiron_magnetic_core_aura::OnApply, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_mimiron_magnetic_core_aura::OnRemove, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_mimiron_magnetic_core_aura::OnRemoveSelf, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + class spell_mimiron_rapid_burst_aura : public AuraScript { PrepareAuraScript(spell_mimiron_rapid_burst_aura); @@ -2325,8 +2306,9 @@ void AddSC_boss_mimiron() RegisterUlduarCreatureAI(npc_ulduar_proximity_mine); RegisterUlduarCreatureAI(npc_ulduar_mimiron_rocket); - RegisterUlduarCreatureAI(npc_ulduar_magnetic_core); RegisterUlduarCreatureAI(npc_ulduar_bot_summon_trigger); + RegisterSpellScript(spell_mimiron_magnetic_core_summon); + RegisterSpellScript(spell_mimiron_magnetic_core_aura); RegisterSpellScript(spell_mimiron_rapid_burst_aura); RegisterSpellScript(spell_mimiron_p3wx2_laser_barrage_aura); RegisterSpellScript(spell_ulduar_mimiron_mine_explosion); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 9a0315e9f..23c3d5549 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -170,6 +170,7 @@ struct boss_razorscale : public BossAI CommanderGUID.Clear(); bGroundPhase = false; flyTimes = 0; + me->SetAnimTier(AnimTier::Fly); } void AttackStart(Unit* who) override @@ -610,7 +611,7 @@ public: { razorscale->AI()->AttackStart(player); razorscale->GetMotionMaster()->MoveIdle(); - razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, 588.0f, -178.0f, 490.0f, FORCED_MOVEMENT_NONE, 0.f, 0.f, false, false); + razorscale->GetMotionMaster()->MovePoint(POINT_RAZORSCALE_INIT, CORDS_AIR.GetPositionX(), CORDS_AIR.GetPositionY(), CORDS_AIR.GetPositionZ(), FORCED_MOVEMENT_NONE, 0.f, 0.f, false, false, MOTION_SLOT_ACTIVE, AnimTier::Fly); } } } diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index 0c8aae002..770c8ae07 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -28,6 +28,7 @@ #include "ObjectMgr.h" #include "Player.h" #include "PoolMgr.h" +#include "RaceMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "SpellScript.h" @@ -859,8 +860,8 @@ public: bool IsFriendly(Unit* passenger) { - return ((me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_HORDE] && passenger->getRaceMask() & RACEMASK_HORDE) || - (me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_ALLIANCE] && passenger->getRaceMask() & RACEMASK_ALLIANCE)); + return ((me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_HORDE] && passenger->getRaceMask() & sRaceMgr->GetHordeRaceMask()) || + (me->GetUInt32Value(GAMEOBJECT_FACTION) == WintergraspFaction[TEAM_ALLIANCE] && passenger->getRaceMask() & sRaceMgr->GetAllianceRaceMask())); } Creature* IsValidVehicle(Creature* cVeh) diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp index 9aa769753..9fcbc68fc 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp @@ -401,6 +401,26 @@ class spell_lady_vashj_summons : public SpellScript } }; +// Spell 38132 - Paralyze (applied to player when looting Tainted Core item 31088) +class spell_lady_vashj_tainted_core_paralyze : public AuraScript +{ + PrepareAuraScript(spell_lady_vashj_tainted_core_paralyze); + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + return; + + if (Player* player = GetTarget()->ToPlayer()) + player->DestroyItemCount(ITEM_TAINTED_CORE, -1, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_lady_vashj_tainted_core_paralyze::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_boss_lady_vashj() { RegisterSerpentShrineAI(boss_lady_vashj); @@ -409,4 +429,5 @@ void AddSC_boss_lady_vashj() RegisterSpellScript(spell_lady_vashj_summon_sporebat); RegisterSpellScript(spell_lady_vashj_spore_drop_effect); RegisterSpellScript(spell_lady_vashj_summons); + RegisterSpellScript(spell_lady_vashj_tainted_core_paralyze); } diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index c3a3965d3..cafc40f25 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -20,11 +20,14 @@ #include "Group.h" #include "PassiveAI.h" #include "Player.h" +#include "RaceMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "SpellAuras.h" #include "SpellScript.h" #include "SpellScriptLoader.h" +#include + /* * Ordered alphabetically using scriptname. * Scriptnames of files in this file should be prefixed with "npc_pet_gen_". @@ -128,20 +131,17 @@ struct argentPonyBanner const char* text; }; -static argentPonyBanner argentBanners[MAX_RACES] = -{ - {0, 0, ""}, - {2781, 62594, "Stormwind Champion's Pennant"}, - {2783, 63433, "Orgrimmar Champion's Pennant"}, - {2780, 63427, "Ironforge Champion's Pennant"}, - {2777, 63406, "Darnassus Champion's Pennant"}, - {2787, 63430, "Forsaken Champion's Pennant"}, - {2786, 63436, "Thunder Bluff Champion's Pennant"}, - {2779, 63396, "Gnomeregan Champion's Pennant"}, - {2784, 63399, "Darkspear Champion's Pennant"}, - {0, 0, ""}, - {2785, 63403, "Silvermoon Champion's Pennant"}, - {2778, 63423, "Exodar Champion's Pennant"} +static std::unordered_map argentBanners = { + {RACE_HUMAN, {2781, 62594, "Stormwind Champion's Pennant"}}, + {RACE_ORC, {2783, 63433, "Orgrimmar Champion's Pennant"}}, + {RACE_DWARF, {2780, 63427, "Ironforge Champion's Pennant"}}, + {RACE_NIGHTELF, {2777, 63406, "Darnassus Champion's Pennant"}}, + {RACE_UNDEAD_PLAYER, {2787, 63430, "Forsaken Champion's Pennant"}}, + {RACE_TAUREN, {2786, 63436, "Thunder Bluff Champion's Pennant"}}, + {RACE_GNOME, {2779, 63396, "Gnomeregan Champion's Pennant"}}, + {RACE_TROLL, {2784, 63399, "Darkspear Champion's Pennant"}}, + {RACE_BLOODELF, {2785, 63403, "Silvermoon Champion's Pennant"}}, + {RACE_DRAENEI, {2778, 63423, "Exodar Champion's Pennant"}} }; struct npc_pet_gen_argent_pony_bridle : public ScriptedAI @@ -152,7 +152,6 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI _init = false; _mountTimer = 4000; _lastAura = 0; - memset(_banners, 0, sizeof(_banners)); } void EnterEvadeMode(EvadeReason /*why*/) override @@ -211,10 +210,12 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI } // Generate Banners - uint32 mask = player->GetTeamId(true) ? RACEMASK_HORDE : RACEMASK_ALLIANCE; - for (uint8 i = 1; i < MAX_RACES; ++i) - if (mask & (1 << (i - 1)) && player->HasAchieved(argentBanners[i].achievement)) - _banners[i] = true; + uint32 mask = player->GetTeamId(true) ? sRaceMgr->GetHordeRaceMask() : sRaceMgr->GetAllianceRaceMask(); + for (auto const& [raceId, banner] : argentBanners) + { + if ((mask & (1 << (raceId - 1))) && player->HasAchieved(banner.achievement)) + _banners[raceId] = true; + } } if (duration && aura) @@ -247,7 +248,8 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI if (param == 0) return _state; - return _banners[param]; + auto itr = _banners.find(param); + return (itr != _banners.end() && itr->second) ? 1 : 0; } void DoAction(int32 param) override @@ -279,9 +281,11 @@ struct npc_pet_gen_argent_pony_bridle : public ScriptedAI AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Visit a mailbox.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_MAILBOX); } - for (uint8 i = RACE_HUMAN; i < MAX_RACES; ++i) - if (creature->AI()->GetData(i) == uint32(true)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, argentBanners[i].text, GOSSIP_SENDER_MAIN, argentBanners[i].spell); + for (auto const& [raceId, banner] : argentBanners) + { + if (creature->AI()->GetData(raceId) == uint32(true)) + AddGossipItemFor(player, GOSSIP_ICON_CHAT, banner.text, GOSSIP_SENDER_MAIN, banner.spell); + } SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID()); return true; @@ -336,7 +340,7 @@ private: bool _init; uint8 _state; int32 _mountTimer; - bool _banners[MAX_RACES]; + std::unordered_map _banners; uint32 _lastAura; }; diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index b81ec36f1..7b72cf252 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -2559,7 +2559,7 @@ class spell_gen_vehicle_scaling_aura: public AuraScript bool Load() override { - return GetCaster() && GetCaster()->IsPlayer() && GetOwner()->IsCreature(); + return GetCaster() && GetCaster()->IsPlayer() && GetOwner() && GetOwner()->IsCreature(); } void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index fce48f898..9c19518e0 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -1518,6 +1518,30 @@ class spell_hun_explosive_shot : public SpellScript } }; +// 34026 - Kill Command +class spell_hun_kill_command : public SpellScript +{ + PrepareSpellScript(spell_hun_kill_command); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (!caster || !caster->IsPlayer()) + return SPELL_FAILED_NO_VALID_TARGETS; + + Pet* pet = caster->ToPlayer()->GetPet(); + if (!pet) + return SPELL_FAILED_NO_PET; + + return SPELL_CAST_OK; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_hun_kill_command::CheckCast); + } +}; + // 58914 - Kill Command (Pet Aura) class spell_hun_kill_command_pet : public AuraScript { @@ -1704,6 +1728,7 @@ void AddSC_hunter_spell_scripts() RegisterSpellScript(spell_hun_glyph_of_mend_pet); // Proc system scripts RegisterSpellScript(spell_hun_rapid_recuperation); + RegisterSpellScript(spell_hun_kill_command); RegisterSpellScript(spell_hun_kill_command_pet); RegisterSpellScript(spell_hun_piercing_shots); RegisterSpellScript(spell_hun_rapid_recuperation_trigger); diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 6c14b0563..a94ee8382 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -655,23 +655,11 @@ class spell_item_lil_phylactery : public AuraScript } }; +// 45042 - Power Circle (Shifting Naaru Sliver base aura) class spell_item_shifting_naaru_silver : public AuraScript { PrepareAuraScript(spell_item_shifting_naaru_silver); - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTarget() == GetCaster()) - if (Aura* aur = GetTarget()->AddAura(45044 /*Limitless Power*/, GetTarget())) - aur->SetDuration(GetDuration()); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Aura* aur = GetTarget()->GetAura(45044 /*Limitless Power*/, GetTarget()->GetGUID())) - aur->SetDuration(0); - } - void OnBaseRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { GetUnitOwner()->RemoveDynObject(45043); @@ -679,13 +667,7 @@ class spell_item_shifting_naaru_silver : public AuraScript void Register() override { - if (m_scriptSpellId == 45043) - { - OnEffectApply += AuraEffectApplyFn(spell_item_shifting_naaru_silver::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_item_shifting_naaru_silver::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - else - AfterEffectRemove += AuraEffectRemoveFn(spell_item_shifting_naaru_silver::OnBaseRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_item_shifting_naaru_silver::OnBaseRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; @@ -4879,7 +4861,7 @@ class spell_item_ultrasafe_transporter : public SpellScript } }; -// 45043 - Power Circle (Mage T5 Set Bonus) +// 45043 - Power Circle (Shifting Naaru Sliver) class spell_item_power_circle : public AuraScript { PrepareAuraScript(spell_item_power_circle); @@ -4889,23 +4871,28 @@ class spell_item_power_circle : public AuraScript return ValidateSpellInfo({ SPELL_LIMITLESS_POWER }); } - void OnAuraInit() + bool CheckCaster(Unit* target) { - Unit* caster = GetCaster(); - if (!caster) - return; - - caster->CastSpell(caster, SPELL_LIMITLESS_POWER, true); + return target->GetGUID() == GetCasterGUID(); } - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->CastSpell(GetTarget(), SPELL_LIMITLESS_POWER, true); + if (Aura* buff = GetTarget()->GetAura(SPELL_LIMITLESS_POWER)) + buff->SetDuration(GetDuration()); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { GetTarget()->RemoveAurasDueToSpell(SPELL_LIMITLESS_POWER); } void Register() override { - AfterEffectRemove += AuraEffectRemoveFn(spell_item_power_circle::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_item_power_circle::CheckCaster); + AfterEffectApply += AuraEffectApplyFn(spell_item_power_circle::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_item_power_circle::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 67cfc1bf1..593f685e9 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -71,7 +71,8 @@ enum MageSpells SPELL_MAGE_CHILLED_R3 = 12486, SPELL_MAGE_MANA_SURGE = 37445, SPELL_MAGE_FROST_NOVA = 122, - SPELL_MAGE_LIVING_BOMB_R1 = 44457 + SPELL_MAGE_LIVING_BOMB_R1 = 44457, + SPELL_MAGE_MISSILE_BARRAGE_PROC = 44401 }; enum MageSpellIcons @@ -1516,6 +1517,31 @@ class spell_mage_ice_block : public SpellScript } }; +// 12536 - Clearcasting +class spell_mage_clearcasting : public AuraScript +{ + PrepareAuraScript(spell_mage_clearcasting); + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return true; + + // Missile Barrage has priority over Clearcasting for Arcane Missiles + if (spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (spellInfo->SpellFamilyFlags[0] & 0x800)) + if (GetTarget()->HasAura(SPELL_MAGE_MISSILE_BARRAGE_PROC)) + return false; + + return true; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_clearcasting::CheckProc); + } +}; + // 44401 - Missile Barrage (proc buff) class spell_mage_missile_barrage_proc : public AuraScript { @@ -1587,6 +1613,7 @@ void AddSC_mage_spell_scripts() RegisterSpellScript(spell_mage_ice_block); RegisterSpellScript(spell_mage_imp_blizzard); RegisterSpellScript(spell_mage_imp_mana_gems); + RegisterSpellScript(spell_mage_clearcasting); RegisterSpellScript(spell_mage_missile_barrage); RegisterSpellScript(spell_mage_missile_barrage_proc); RegisterSpellScript(spell_mage_blast_wave); diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index 44b210542..acff77524 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -96,12 +96,15 @@ enum PaladinSpells SPELL_PALADIN_HOLY_VENGEANCE = 31803, SPELL_PALADIN_BLOOD_CORRUPTION = 53742, SPELL_PALADIN_SEAL_OF_VENGEANCE_EFFECT = 42463, - SPELL_PALADIN_SEAL_OF_CORRUPTION_EFFECT = 53739 + SPELL_PALADIN_SEAL_OF_CORRUPTION_EFFECT = 53739, + + SPELL_PALADIN_SEAL_OF_COMMAND = 20375 }; enum PaladinSpellIcons { PALADIN_ICON_ID_RETRIBUTION_AURA = 555, + PALADIN_ICON_JUDGEMENTS_OF_THE_JUST = 3015, PALADIN_ICON_JUDGEMENTS_OF_THE_WISE = 3017, PALADIN_ICON_HAMMER_OF_THE_RIGHTEOUS = 3023, PALADIN_ICON_RIGHTEOUS_VENGEANCE = 3025, @@ -148,6 +151,20 @@ enum PaladinProcSpells SPELL_PALADIN_T8_HOLY_4P_BONUS = 64895 }; +static bool IsJudgementDamageSpell(SpellInfo const* spellInfo) +{ + return spellInfo && + spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && + (spellInfo->SpellFamilyFlags[0] & 0x800000); +} + +static bool HasJudgementsOfTheJust(Unit const* caster) +{ + return caster && caster->GetAuraEffect( + SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_PALADIN, + PALADIN_ICON_JUDGEMENTS_OF_THE_JUST, 0) != nullptr; +} + class spell_pal_seal_of_command_aura : public AuraScript { PrepareAuraScript(spell_pal_seal_of_command_aura); @@ -173,13 +190,15 @@ class spell_pal_seal_of_command_aura : public AuraScript void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); + // All melee procs should cleave except Hammer of the Righteous. + // Judgement cleave is handled separately via JotJ code path. int32 targets = 3; if (SpellInfo const* procSpell = eventInfo.GetSpellInfo()) { - if (procSpell->IsAffectingArea()) - { + // HotR: flag1 0x40000, DS: flag1 0x20000 + if (procSpell->SpellFamilyName == SPELLFAMILY_PALADIN && + (procSpell->SpellFamilyFlags[1] & 0x60000)) targets = 1; - } } Unit* target = eventInfo.GetActionTarget(); @@ -959,27 +978,26 @@ public: GetCaster()->CastSpell(GetCaster(), SPELL_IMPROVED_JUDGEMENT_ENERGIZE, true); } - // Judgement of the Just - if (GetCaster()->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_PALADIN, 3015, 0)) + // Judgements of the Just + if (HasJudgementsOfTheJust(GetCaster())) { - if (GetCaster()->CastSpell(GetHitUnit(), SPELL_JUDGEMENTS_OF_THE_JUST, true) && (spellId2 == SPELL_JUDGEMENT_OF_VENGEANCE_EFFECT || spellId2 == SPELL_JUDGEMENT_OF_CORRUPTION_EFFECT)) - { - //hidden effect only cast when spellcast of judgements of the just is succesful - GetCaster()->CastSpell(GetHitUnit(), SealApplication(spellId2), true); //add hidden seal apply effect for vengeance and corruption - } - } - } + GetCaster()->CastSpell(GetHitUnit(), SPELL_JUDGEMENTS_OF_THE_JUST, true); - uint32 SealApplication(uint32 correspondingSpellId) - { - switch (correspondingSpellId) - { - case SPELL_JUDGEMENT_OF_VENGEANCE_EFFECT: - return SPELL_HOLY_VENGEANCE; - case SPELL_JUDGEMENT_OF_CORRUPTION_EFFECT: - return SPELL_BLOOD_CORRUPTION; - default: - return 0; + // JotJ makes Judgements trigger Seal of Command's + // cleave effect + if (AuraEffect const* socEff = + GetCaster()->GetAuraEffect( + SPELL_PALADIN_SEAL_OF_COMMAND, EFFECT_0)) + { + if (GetHitUnit()->IsAlive()) + { + GetCaster()->CastCustomSpell( + socEff->GetSpellInfo()->Effects[EFFECT_0] + .TriggerSpell, + SPELLVALUE_MAX_TARGETS, 3, + GetHitUnit(), true, nullptr, socEff); + } + } } } @@ -1164,11 +1182,14 @@ class spell_pal_seal_of_righteousness : public AuraScript DamageInfo* damageInfo = eventInfo.GetDamageInfo(); if (!damageInfo || !damageInfo->GetDamage()) - { return false; - } - return target->IsAlive() && !eventInfo.GetTriggerAuraSpell() && (damageInfo->GetDamage() || (eventInfo.GetHitMask() & PROC_EX_ABSORB)); + if (IsJudgementDamageSpell(eventInfo.GetSpellInfo())) + return target->IsAlive(); + + return target->IsAlive() && !eventInfo.GetTriggerAuraSpell() && + (damageInfo->GetDamage() || + (eventInfo.GetHitMask() & PROC_EX_ABSORB)); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) @@ -1187,6 +1208,17 @@ class spell_pal_seal_of_righteousness : public AuraScript int32 bp = std::max(0, int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000)); GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, nullptr, aurEff); + + // Judgements of the Just: Seal of Righteousness procs + // twice from Judgements + if (IsJudgementDamageSpell(eventInfo.GetSpellInfo()) && + HasJudgementsOfTheJust(GetTarget())) + { + GetTarget()->CastCustomSpell( + SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, + SPELLVALUE_BASE_POINT0, bp, + eventInfo.GetProcTarget(), true, nullptr, aurEff); + } } void Register() override @@ -1884,6 +1916,25 @@ class spell_pal_seal_of_vengeance_aura : public AuraScript return true; } + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + if (procSpell && + procSpell->SpellFamilyName == SPELLFAMILY_PALADIN) + { + // Block re-proc from seal damage effects + if ((procSpell->SpellFamilyFlags[1] & 0x800) && + !(procSpell->SpellFamilyFlags[0] & 0x800000)) + return false; + + // Judgements only trigger seal procs with JotJ + if (procSpell->SpellFamilyFlags[0] & 0x800000) + return HasJudgementsOfTheJust(eventInfo.GetActor()); + } + + return true; + } + void HandleApplyDoT(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { PreventDefaultAction(); @@ -1925,8 +1976,11 @@ class spell_pal_seal_of_vengeance_aura : public AuraScript void Register() override { - OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_aura::HandleApplyDoT, EFFECT_0, SPELL_AURA_DUMMY); + DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_vengeance_aura::CheckProc); + // HandleSeal reads stacks BEFORE HandleApplyDoT increments them, + // so the attacking hit does not benefit from its own stack application. OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_aura::HandleSeal, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_vengeance_aura::HandleApplyDoT, EFFECT_0, SPELL_AURA_DUMMY); } private: diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index a234dbb5d..8a0cc51cd 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -53,7 +53,8 @@ enum RogueSpells SPELL_ROGUE_TURN_THE_TABLES_R3 = 52915, SPELL_ROGUE_OVERKILL_TRIGGERED = 58427, SPELL_ROGUE_HONOR_AMONG_THIEVES_PROC = 52916, - SPELL_ROGUE_HONOR_AMONG_THIEVES_TRIGGERED = 51699 + SPELL_ROGUE_HONOR_AMONG_THIEVES_TRIGGERED = 51699, + SPELL_ROGUE_COLD_BLOOD = 14177 }; enum RogueSpellIcons @@ -1086,6 +1087,68 @@ class spell_rog_focused_attacks : public AuraScript } }; +// 14177 - Cold Blood +class spell_rog_cold_blood : public AuraScript +{ + PrepareAuraScript(spell_rog_cold_blood); + + bool _usedByMutilate = false; + +public: + bool WasUsedByMutilate() const { return _usedByMutilate; } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return true; + + // Block Mutilate MH (0x2) and OH (0x4) from consuming the charge + if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE + && (spellInfo->SpellFamilyFlags[1] & 0x6)) + { + _usedByMutilate = true; + return false; + } + + return true; + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_rog_cold_blood::CheckProc); + } +}; + +// 1329 - Mutilate (parent spell, all ranks) +class spell_rog_mutilate : public SpellScript +{ + PrepareSpellScript(spell_rog_mutilate); + + void HandleAfterCast() + { + Unit* caster = GetCaster(); + if (!caster) + return; + + Aura* cb = caster->GetAura(SPELL_ROGUE_COLD_BLOOD); + if (!cb) + return; + + auto* script = dynamic_cast( + cb->GetScriptByName("spell_rog_cold_blood")); + if (!script || !script->WasUsedByMutilate()) + return; + + cb->Remove(); + } + + void Register() override + { + AfterCast += SpellCastFn(spell_rog_mutilate::HandleAfterCast); + } +}; + void AddSC_rogue_spell_scripts() { RegisterSpellScript(spell_rog_savage_combat); @@ -1117,4 +1180,6 @@ void AddSC_rogue_spell_scripts() RegisterSpellScript(spell_rog_turn_the_tables); RegisterSpellScript(spell_rog_turn_the_tables_proc); RegisterSpellScript(spell_rog_focused_attacks); + RegisterSpellScript(spell_rog_mutilate); + RegisterSpellScript(spell_rog_cold_blood); } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 8490f4b34..cb7da23d9 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -1384,7 +1384,7 @@ class spell_sha_frozen_power : public AuraScript if (GetTarget()->GetDistance(target) < 15.0f) return false; - return roll_chance_i(GetEffect(EFFECT_0)->GetAmount()); + return roll_chance_i(GetEffect(EFFECT_1)->GetAmount()); } void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index fa120635b..59405ce01 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2674,7 +2674,8 @@ struct npc_controller : public PossessedAI { if (!apply) { - me->GetCharmerOrOwner()->InterruptNonMeleeSpells(false); + if (Unit* charmerOrOwner = me->GetCharmerOrOwner()) + charmerOrOwner->InterruptNonMeleeSpells(false); } } }; diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index 06f3bf153..3db5fe364 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -714,8 +714,8 @@ struct ChrRacesEntry uint32 TeamID; // 7 (7-Alliance 1-Horde) // 8-11 unused uint32 CinematicSequence; // 12 id from CinematicSequences.dbc - //uint32 alliance; // 13 faction (0 alliance, 1 horde, 2 not available?) - char const* name[16]; // 14-29 used for DBC language detection/selection + uint32 alliance; // 13 faction (0 alliance, 1 horde, 2 not available?) + char const* name[16]; // 14-29 used for DBC language detection/selection // 30 string flags, unused //char const* nameFemale[16]; // 31-46, if different from base (male) case // 47 string flags, unused diff --git a/src/server/shared/DataStores/DBCfmt.h b/src/server/shared/DataStores/DBCfmt.h index b87dddb52..a037847da 100644 --- a/src/server/shared/DataStores/DBCfmt.h +++ b/src/server/shared/DataStores/DBCfmt.h @@ -33,7 +33,7 @@ char constexpr CharSectionsEntryfmt[] = "diiixxxiii"; char constexpr CharTitlesEntryfmt[] = "nxssssssssssssssssxssssssssssssssssxi"; char constexpr ChatChannelsEntryfmt[] = "nixssssssssssssssssxxxxxxxxxxxxxxxxxx"; // ChatChannelsEntryfmt, index not used (more compact store) char constexpr ChrClassesEntryfmt[] = "nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixii"; -char constexpr ChrRacesEntryfmt[] = "niixiixixxxxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; +char constexpr ChrRacesEntryfmt[] = "niixiixixxxxiissssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; char constexpr CinematicCameraEntryfmt[] = "nsiffff"; char constexpr CinematicSequencesEntryfmt[] = "nxixxxxxxx"; char constexpr CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxx"; diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 1489fc977..5595b3874 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -91,21 +91,6 @@ enum Races //RACE_ICE_TROLL = 21 }; -// max+1 for player race -#define MAX_RACES 12 - -#define RACEMASK_ALL_PLAYABLE \ - ((1<<(RACE_HUMAN-1)) |(1<<(RACE_ORC-1)) |(1<<(RACE_DWARF-1)) | \ - (1<<(RACE_NIGHTELF-1))|(1<<(RACE_UNDEAD_PLAYER-1))|(1<<(RACE_TAUREN-1)) | \ - (1<<(RACE_GNOME-1)) |(1<<(RACE_TROLL-1)) |(1<<(RACE_BLOODELF-1))| \ - (1<<(RACE_DRAENEI-1))) - -#define RACEMASK_ALLIANCE \ - ((1<<(RACE_HUMAN-1)) | (1<<(RACE_DWARF-1)) | (1<<(RACE_NIGHTELF-1)) | \ - (1<<(RACE_GNOME-1)) | (1<<(RACE_DRAENEI-1))) - -#define RACEMASK_HORDE RACEMASK_ALL_PLAYABLE & ~RACEMASK_ALLIANCE - // DisplayRace values from CreatureDisplayInfoExtra.dbc enum class DisplayRace : uint8 { @@ -161,15 +146,7 @@ enum Classes (1<<(CLASS_DEATH_KNIGHT-1))) // valid classes for creature_template.unit_class -enum UnitClass -{ - UNIT_CLASS_WARRIOR = 1, - UNIT_CLASS_PALADIN = 2, - UNIT_CLASS_ROGUE = 4, - UNIT_CLASS_MAGE = 8, -}; - -#define CLASSMASK_ALL_CREATURES ((1<<(UNIT_CLASS_WARRIOR-1)) | (1<<(UNIT_CLASS_PALADIN-1)) | (1<<(UNIT_CLASS_ROGUE-1)) | (1<<(UNIT_CLASS_MAGE-1))) +#define CLASSMASK_ALL_CREATURES ((1<<(CLASS_WARRIOR-1)) | (1<<(CLASS_PALADIN-1)) | (1<<(CLASS_ROGUE-1)) | (1<<(CLASS_MAGE-1))) #define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1))) @@ -3698,6 +3675,13 @@ enum PvPTeamId PVP_TEAM_NEUTRAL = 2 // Battleground: Neutral, Arena: None }; +enum AllianceId +{ + ALLIANCE_ALLIANCE = 0, + ALLIANCE_HORDE = 1, + ALLIANCE_NEUTRAL = 2 +}; + uint8 constexpr PVP_TEAMS_COUNT = 2; inline PvPTeamId GetPvPTeamId(TeamId teamId) diff --git a/src/test/mocks/ProcChanceTestHelper.h b/src/test/mocks/ProcChanceTestHelper.h index 6ce878b8f..46c5100c4 100644 --- a/src/test/mocks/ProcChanceTestHelper.h +++ b/src/test/mocks/ProcChanceTestHelper.h @@ -492,6 +492,88 @@ public: } } + // ============================================================================= + // Cascade Proc Suppression - simulates Unit.cpp TriggerAurasProcOnEvent + // ============================================================================= + + /** + * @brief Configuration for simulating cascade proc suppression + * + * Models the two paths in TriggerAurasProcOnEvent that call SetCantProc(): + * 1. Outer check: triggering spell has TRIGGERED_DISALLOW_PROC_EVENTS + * 2. Per-aura check: aura has SPELL_ATTR3_INSTANT_TARGET_PROCS (0x80000) + */ + struct CascadeProcConfig + { + bool triggeringSpellIsProcDisabled = false; // Spell::IsProcDisabled() + bool auraHasDisableProcAttr = false; // SpellInfo::HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS) + }; + + /** + * @brief Returns true if cascading procs should be suppressed for this aura + * + * @param config Cascade proc configuration + * @return true if SetCantProc(true) would be active during this aura's proc + */ + static bool ShouldSuppressCascadingProc(CascadeProcConfig const& config) + { + // Outer check: triggering spell disables all cascading procs + if (config.triggeringSpellIsProcDisabled) + return true; + // Per-aura check: aura itself suppresses cascading + if (config.auraHasDisableProcAttr) + return true; + + return false; + } + + // ============================================================================= + // TAKEN Auto-Trigger Logic - simulates SpellMgr.cpp:2033-2049 + // ============================================================================= + + /** + * @brief Configuration for simulating the TAKEN auto-trigger logic + * from SpellMgr::LoadSpellProcs() auto-generation + */ + struct TakenAutoTriggerConfig + { + uint32 procFlags = 0; // SpellInfo::ProcFlags + uint32 auraName = 0; // Effect's ApplyAuraName + bool isAlwaysTriggeredAura = false; // Already set by isAlwaysTriggeredAura[] + }; + + /** + * @brief Simulate the TAKEN auto-trigger logic from SpellMgr::LoadSpellProcs() + * + * During auto-generation of proc entries, TAKEN-proc auras with + * SPELL_AURA_PROC_TRIGGER_SPELL or SPELL_AURA_PROC_TRIGGER_DAMAGE + * should get PROC_ATTR_TRIGGERED_CAN_PROC set automatically. + * + * @param config Configuration describing the aura + * @return true if addTriggerFlag should be set + */ + static bool ShouldAutoAddTriggeredCanProc(TakenAutoTriggerConfig const& config) + { + // If already marked as always-triggered, keep it + if (config.isAlwaysTriggeredAura) + return true; + + // TAKEN auto-trigger: TAKEN proc flags + PROC_TRIGGER_SPELL/DAMAGE + if (config.procFlags & TAKEN_HIT_PROC_FLAG_MASK) + { + switch (config.auraName) + { + case SPELL_AURA_PROC_TRIGGER_SPELL: + case SPELL_AURA_PROC_TRIGGER_DAMAGE: + return true; + default: + break; + } + } + + return false; + } + // ============================================================================= // Conditions System - simulates SpellAuras.cpp:2232-2236 // ============================================================================= @@ -607,4 +689,94 @@ private: std::unique_ptr _aura; }; +/** + * @brief Simulates the proc chain guard logic from Unit::TriggerAurasProcOnEvent + * + * Tracks the m_procDeep counter to verify that: + * - TRIGGERED_DISALLOW_PROC_EVENTS on the triggering spell disables procs + * for all auras in the container + * - SPELL_ATTR3_INSTANT_TARGET_PROCS on individual auras disables procs + * only during that specific aura's TriggerProcOnEvent call + * - The counter is properly balanced (returns to 0 after function exits) + */ +class ProcChainGuardSimulator +{ +public: + struct AuraConfig + { + uint32 spellId = 0; + bool hasInstantTargetProcs = false; // SPELL_ATTR3_INSTANT_TARGET_PROCS + bool isRemoved = false; // AuraApplication::GetRemoveMode() + }; + + struct ProcRecord + { + uint32 spellId; + bool canProcDuringTrigger; // CanProc() state when TriggerProcOnEvent fires + int32 procDeepDuringTrigger; // m_procDeep value during trigger + }; + + ProcChainGuardSimulator() : _procDeep(0) {} + + /** + * @brief Simulate Unit::TriggerAurasProcOnEvent + * + * @param triggeringSpellHasDisallowProcEvents Whether the triggering spell + * has TRIGGERED_DISALLOW_PROC_EVENTS cast flag + * @param auras List of auras in the proc container + */ + void SimulateTriggerAurasProc( + bool triggeringSpellHasDisallowProcEvents, + std::vector const& auras) + { + _records.clear(); + + bool const disableProcs = triggeringSpellHasDisallowProcEvents; + if (disableProcs) + SetCantProc(true); + + for (auto const& aura : auras) + { + if (aura.isRemoved) + continue; + + if (aura.hasInstantTargetProcs) + SetCantProc(true); + + // Record CanProc() state during TriggerProcOnEvent + _records.push_back({ + aura.spellId, + CanProc(), + _procDeep + }); + + if (aura.hasInstantTargetProcs) + SetCantProc(false); + } + + if (disableProcs) + SetCantProc(false); + } + + [[nodiscard]] std::vector const& GetRecords() const + { + return _records; + } + + [[nodiscard]] int32 GetProcDeep() const { return _procDeep; } + [[nodiscard]] bool CanProc() const { return _procDeep == 0; } + +private: + void SetCantProc(bool apply) + { + if (apply) + ++_procDeep; + else + --_procDeep; + } + + int32 _procDeep; + std::vector _records; +}; + #endif // AZEROTHCORE_PROC_CHANCE_TEST_HELPER_H diff --git a/src/test/mocks/SpellInfoTestHelper.h b/src/test/mocks/SpellInfoTestHelper.h index ce129b4d1..81e0c8b03 100644 --- a/src/test/mocks/SpellInfoTestHelper.h +++ b/src/test/mocks/SpellInfoTestHelper.h @@ -96,6 +96,12 @@ public: return *this; } + TestSpellEntryHelper& WithAttributesEx3(uint32 attr) + { + _entry.AttributesEx3 = attr; + return *this; + } + TestSpellEntryHelper& WithEffect(uint8 effIndex, uint32 effect, uint32 auraType = 0) { if (effIndex < MAX_SPELL_EFFECTS) @@ -183,6 +189,12 @@ public: return *this; } + SpellInfoBuilder& WithAttributesEx3(uint32 attr) + { + _entryHelper.WithAttributesEx3(attr); + return *this; + } + SpellInfoBuilder& WithEffect(uint8 effIndex, uint32 effect, uint32 auraType = 0) { _entryHelper.WithEffect(effIndex, effect, auraType); diff --git a/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp b/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp new file mode 100644 index 000000000..a04edbf2e --- /dev/null +++ b/src/test/server/game/Spells/CascadeProcSuppressionTest.cpp @@ -0,0 +1,213 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +/** + * @file CascadeProcSuppressionTest.cpp + * @brief Unit tests for cascade proc suppression via SPELL_ATTR3_INSTANT_TARGET_PROCS + * + * Tests the logic from Unit.cpp TriggerAurasProcOnEvent: + * - Outer check: Spell::IsProcDisabled() (TRIGGERED_DISALLOW_PROC_EVENTS) suppresses all cascade procs + * - Per-aura check: SPELL_ATTR3_INSTANT_TARGET_PROCS (0x80000) suppresses cascade for that aura + * - Normal spells/auras without these flags allow cascading + * - Both flags set simultaneously still suppresses correctly + */ + +#include "ProcChanceTestHelper.h" +#include "SpellInfoTestHelper.h" +#include "gtest/gtest.h" + +using namespace testing; + +class CascadeProcSuppressionTest : public ::testing::Test +{ +protected: + ProcChanceTestHelper::CascadeProcConfig MakeConfig( + bool isProcDisabled, bool hasDisableProcAttr) + { + ProcChanceTestHelper::CascadeProcConfig config; + config.triggeringSpellIsProcDisabled = isProcDisabled; + config.auraHasDisableProcAttr = hasDisableProcAttr; + return config; + } +}; + +// ============================================================================= +// Normal behavior (no suppression) +// ============================================================================= + +TEST_F(CascadeProcSuppressionTest, NormalSpellNormalAura_NotSuppressed) +{ + auto config = MakeConfig(false, false); + + EXPECT_FALSE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Normal spell + normal aura should not suppress cascading procs"; +} + +// ============================================================================= +// IsProcDisabled (outer check - TRIGGERED_DISALLOW_PROC_EVENTS) +// ============================================================================= + +TEST_F(CascadeProcSuppressionTest, ProcDisabledSpell_NormalAura_Suppressed) +{ + auto config = MakeConfig(true, false); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Triggered spell with DISALLOW_PROC_EVENTS should suppress all cascading procs"; +} + +TEST_F(CascadeProcSuppressionTest, ProcDisabledSpell_WithAttr_Suppressed) +{ + auto config = MakeConfig(true, true); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Both flags set should still suppress (double-suppress doesn't break)"; +} + +// ============================================================================= +// SPELL_ATTR3_INSTANT_TARGET_PROCS (per-aura check) +// ============================================================================= + +TEST_F(CascadeProcSuppressionTest, NormalSpell_AuraWithAttr_Suppressed) +{ + auto config = MakeConfig(false, true); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Aura with SPELL_ATTR3_INSTANT_TARGET_PROCS should suppress cascading procs"; +} + +// ============================================================================= +// SpellInfo attribute verification via SpellInfoBuilder +// ============================================================================= + +TEST_F(CascadeProcSuppressionTest, SpellInfo_WithAttr_HasAttributeReturnsTrue) +{ + auto spellInfo = SpellInfoBuilder() + .WithId(99001) + .WithAttributesEx3(SPELL_ATTR3_INSTANT_TARGET_PROCS) + .BuildUnique(); + + EXPECT_TRUE(spellInfo->HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS)) + << "SpellInfo built with 0x80000 should report HasAttribute true"; +} + +TEST_F(CascadeProcSuppressionTest, SpellInfo_WithoutAttr_HasAttributeReturnsFalse) +{ + auto spellInfo = SpellInfoBuilder() + .WithId(99002) + .WithAttributesEx3(0) + .BuildUnique(); + + EXPECT_FALSE(spellInfo->HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS)) + << "SpellInfo built with 0 should report HasAttribute false"; +} + +TEST_F(CascadeProcSuppressionTest, SpellInfo_WithMixedBits_HasAttributeReturnsTrue) +{ + // 0x80001 = SPELL_ATTR3_INSTANT_TARGET_PROCS | SPELL_ATTR3_PVP_ENABLING (bit 0) + auto spellInfo = SpellInfoBuilder() + .WithId(99003) + .WithAttributesEx3(0x00080001) + .BuildUnique(); + + EXPECT_TRUE(spellInfo->HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS)) + << "Other bits in AttributesEx3 should not interfere with attribute detection"; +} + +// ============================================================================= +// Real spell scenarios (data-driven) +// These spells have SPELL_ATTR3_INSTANT_TARGET_PROCS (0x80000) in DBC +// ============================================================================= + +struct RealSpellTestCase +{ + const char* name; + uint32 spellId; + bool hasAttr; // Whether the spell has SPELL_ATTR3_INSTANT_TARGET_PROCS +}; + +class CascadeProcRealSpellTest : public ::testing::TestWithParam {}; + +TEST_P(CascadeProcRealSpellTest, VerifySuppressionForRealSpell) +{ + auto const& tc = GetParam(); + + // Build a SpellInfo mimicking the real spell's AttributesEx3 + auto spellInfo = SpellInfoBuilder() + .WithId(tc.spellId) + .WithAttributesEx3(tc.hasAttr ? SPELL_ATTR3_INSTANT_TARGET_PROCS : 0) + .BuildUnique(); + + // Verify attribute detection matches expectation + EXPECT_EQ(spellInfo->HasAttribute(SPELL_ATTR3_INSTANT_TARGET_PROCS), tc.hasAttr) + << tc.name << " (spell " << tc.spellId << ") attribute detection mismatch"; + + // Verify cascade suppression matches attribute presence + ProcChanceTestHelper::CascadeProcConfig config; + config.triggeringSpellIsProcDisabled = false; + config.auraHasDisableProcAttr = tc.hasAttr; + + EXPECT_EQ(ProcChanceTestHelper::ShouldSuppressCascadingProc(config), tc.hasAttr) + << tc.name << " (spell " << tc.spellId << ") cascade suppression mismatch"; +} + +INSTANTIATE_TEST_SUITE_P( + CascadeProcSuppression, + CascadeProcRealSpellTest, + ::testing::Values( + // Spells WITH SPELL_ATTR3_INSTANT_TARGET_PROCS + RealSpellTestCase{"Seal Fate", 14195, true}, + RealSpellTestCase{"Sword Specialization", 12281, true}, + RealSpellTestCase{"Reckoning", 20178, true}, + RealSpellTestCase{"Flurry", 16257, true}, + // Counter-example: spell WITHOUT the attribute + RealSpellTestCase{"Eviscerate", 26865, false} + ), + [](testing::TestParamInfo const& info) { + // Generate readable test name from spell name (replace spaces) + std::string name = info.param.name; + std::replace(name.begin(), name.end(), ' ', '_'); + return name; + } +); + +// ============================================================================= +// Nesting behavior - both flags simultaneously +// ============================================================================= + +TEST_F(CascadeProcSuppressionTest, BothFlagsSet_StillSuppressed) +{ + auto config = MakeConfig(true, true); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Both IsProcDisabled and INSTANT_TARGET_PROCS set should still suppress"; +} + +TEST_F(CascadeProcSuppressionTest, OnlyOuterFlag_Suppressed) +{ + auto config = MakeConfig(true, false); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Only IsProcDisabled should be sufficient to suppress"; +} + +TEST_F(CascadeProcSuppressionTest, OnlyPerAuraFlag_Suppressed) +{ + auto config = MakeConfig(false, true); + + EXPECT_TRUE(ProcChanceTestHelper::ShouldSuppressCascadingProc(config)) + << "Only INSTANT_TARGET_PROCS should be sufficient to suppress"; +} diff --git a/src/test/server/game/Spells/PeriodicAbsorbStealthProcTest.cpp b/src/test/server/game/Spells/PeriodicAbsorbStealthProcTest.cpp new file mode 100644 index 000000000..c5b67586f --- /dev/null +++ b/src/test/server/game/Spells/PeriodicAbsorbStealthProcTest.cpp @@ -0,0 +1,156 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "ProcEventInfoHelper.h" +#include "SpellMgr.h" +#include "WorldMock.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +using namespace testing; + +/** + * @brief Tests for fully absorbed periodic damage not triggering TAKEN procs + * + * When periodic damage (e.g. Consecration ticks) is fully absorbed by an + * absorb shield (e.g. Power Word: Shield), the hit mask should only contain + * PROC_HIT_ABSORB (no PROC_HIT_NORMAL/CRITICAL). Since TAKEN procs default + * to requiring PROC_HIT_NORMAL | PROC_HIT_CRITICAL, fully absorbed ticks + * should not trigger victim procs like stealth charge consumption. + * + * This aligns with TrinityCore behavior where hitMask only gets NORMAL/CRITICAL + * added when damage > 0 in HandlePeriodicDamageAurasTick. + */ +class PeriodicAbsorbStealthProcTest : public ::testing::Test +{ +protected: + void SetUp() override + { + _originalWorld = sWorld.release(); + _worldMock = new NiceMock(); + sWorld.reset(_worldMock); + + static std::string emptyString; + ON_CALL(*_worldMock, GetDataPath()).WillByDefault(ReturnRef(emptyString)); + } + + void TearDown() override + { + IWorld* currentWorld = sWorld.release(); + delete currentWorld; + _worldMock = nullptr; + + sWorld.reset(_originalWorld); + _originalWorld = nullptr; + } + + IWorld* _originalWorld = nullptr; + NiceMock* _worldMock = nullptr; +}; + +// Stealth-like TAKEN periodic proc with default HitMask (0) should NOT +// trigger when the only hit flag is PROC_HIT_ABSORB (fully absorbed tick) +TEST_F(PeriodicAbsorbStealthProcTest, FullyAbsorbedPeriodicDoesNotTriggerTakenProc) +{ + // Stealth has ProcFlags including PROC_FLAG_TAKEN_PERIODIC, HitMask=0 + // Default TAKEN HitMask = PROC_HIT_NORMAL | PROC_HIT_CRITICAL (no ABSORB) + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(0) + .Build(); + + // Fully absorbed periodic tick: hitMask = PROC_HIT_ABSORB only + // (damage=0 so PROC_EX_NORMAL_HIT is NOT set) + auto eventInfo = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(PROC_HIT_ABSORB) + .Build(); + + EXPECT_FALSE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, eventInfo)); +} + +// Non-absorbed periodic tick (damage > 0) SHOULD trigger TAKEN procs +TEST_F(PeriodicAbsorbStealthProcTest, NonAbsorbedPeriodicTriggersTakenProc) +{ + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(0) + .Build(); + + // Normal periodic tick: hitMask includes PROC_HIT_NORMAL + auto eventInfo = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(PROC_HIT_NORMAL) + .Build(); + + EXPECT_TRUE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, eventInfo)); +} + +// Critical periodic tick SHOULD trigger TAKEN procs +TEST_F(PeriodicAbsorbStealthProcTest, CriticalPeriodicTriggersTakenProc) +{ + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(0) + .Build(); + + auto eventInfo = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(PROC_HIT_CRITICAL) + .Build(); + + EXPECT_TRUE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, eventInfo)); +} + +// Partially absorbed periodic tick (damage > 0, some absorbed) SHOULD trigger +// because PROC_HIT_NORMAL is set alongside PROC_HIT_ABSORB +TEST_F(PeriodicAbsorbStealthProcTest, PartiallyAbsorbedPeriodicTriggersTakenProc) +{ + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(0) + .Build(); + + // Partial absorb: both NORMAL and ABSORB flags set + auto eventInfo = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_TAKEN_PERIODIC) + .WithHitMask(PROC_HIT_NORMAL | PROC_HIT_ABSORB) + .Build(); + + EXPECT_TRUE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, eventInfo)); +} + +// DONE procs (attacker side) SHOULD trigger on fully absorbed damage +// because DONE default HitMask includes PROC_HIT_ABSORB +TEST_F(PeriodicAbsorbStealthProcTest, FullyAbsorbedPeriodicTriggersDoneProc) +{ + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_DONE_PERIODIC) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .WithHitMask(0) + .Build(); + + // Fully absorbed: only PROC_HIT_ABSORB + auto eventInfo = ProcEventInfoBuilder() + .WithTypeMask(PROC_FLAG_DONE_PERIODIC) + .WithSpellPhaseMask(PROC_SPELL_PHASE_HIT) + .WithHitMask(PROC_HIT_ABSORB) + .Build(); + + // DONE default includes ABSORB, so this SHOULD trigger + EXPECT_TRUE(sSpellMgr->CanSpellTriggerProcOnEvent(procEntry, eventInfo)); +} diff --git a/src/test/server/game/Spells/SpellProcChainGuardTest.cpp b/src/test/server/game/Spells/SpellProcChainGuardTest.cpp new file mode 100644 index 000000000..fed9908a8 --- /dev/null +++ b/src/test/server/game/Spells/SpellProcChainGuardTest.cpp @@ -0,0 +1,600 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +/** + * @file SpellProcChainGuardTest.cpp + * @brief Unit tests for proc chain guard and TAKEN auto-trigger logic + * + * Tests two fixes ported from TrinityCore: + * + * 1. Proc chain guard (Unit::TriggerAurasProcOnEvent): + * - TRIGGERED_DISALLOW_PROC_EVENTS on triggering spell blocks all + * cascading procs during the proc event + * - SPELL_ATTR3_INSTANT_TARGET_PROCS on individual auras blocks + * cascading procs during that specific aura's proc trigger + * - Prevents infinite proc loops between reactive damage auras + * (e.g. Molten Armor <-> Eye for an Eye) + * + * 2. TAKEN auto-trigger (SpellMgr::LoadSpellProcs auto-generation): + * - TAKEN-proc auras with SPELL_AURA_PROC_TRIGGER_SPELL or + * SPELL_AURA_PROC_TRIGGER_DAMAGE automatically get + * PROC_ATTR_TRIGGERED_CAN_PROC so they can proc from + * triggered spells (e.g. Mage Armor proccing from Judgement) + */ + +#include "ProcChanceTestHelper.h" +#include "ProcEventInfoHelper.h" +#include "gtest/gtest.h" + +using namespace testing; + +// ============================================================================= +// TAKEN Auto-Trigger Logic Tests +// Simulates SpellMgr.cpp:2033-2049 auto-generation +// ============================================================================= + +class TakenAutoTriggerTest : public ::testing::Test +{ +protected: + void SetUp() override {} +}; + +TEST_F(TakenAutoTriggerTest, TakenProcTriggerSpell_SetsTriggeredCanProc) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "TAKEN proc + PROC_TRIGGER_SPELL should auto-add TRIGGERED_CAN_PROC"; +} + +TEST_F(TakenAutoTriggerTest, TakenProcTriggerDamage_SetsTriggeredCanProc) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG; + config.auraName = SPELL_AURA_PROC_TRIGGER_DAMAGE; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "TAKEN proc + PROC_TRIGGER_DAMAGE should auto-add TRIGGERED_CAN_PROC"; +} + +TEST_F(TakenAutoTriggerTest, TakenProcOtherAura_DoesNotSetTriggeredCanProc) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_DUMMY; + config.isAlwaysTriggeredAura = false; + + EXPECT_FALSE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "TAKEN proc + DUMMY aura should NOT auto-add TRIGGERED_CAN_PROC"; +} + +TEST_F(TakenAutoTriggerTest, DoneProcTriggerSpell_DoesNotSetTriggeredCanProc) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_DONE_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_FALSE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "DONE-only proc flags should NOT trigger TAKEN auto-add logic"; +} + +TEST_F(TakenAutoTriggerTest, NoProcFlags_DoesNotSetTriggeredCanProc) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = 0; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_FALSE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "Zero proc flags should NOT auto-add TRIGGERED_CAN_PROC"; +} + +TEST_F(TakenAutoTriggerTest, AlwaysTriggeredAura_StaysTrue) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = 0; // No TAKEN flags + config.auraName = SPELL_AURA_DUMMY; + config.isAlwaysTriggeredAura = true; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "isAlwaysTriggeredAura should keep addTriggerFlag = true"; +} + +TEST_F(TakenAutoTriggerTest, TakenDamage_WithProcTriggerSpell_SetsFlag) +{ + // PROC_FLAG_TAKEN_DAMAGE is in TAKEN_HIT_PROC_FLAG_MASK + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_DAMAGE; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "PROC_FLAG_TAKEN_DAMAGE + PROC_TRIGGER_SPELL should set flag"; +} + +TEST_F(TakenAutoTriggerTest, TakenPeriodic_WithProcTriggerDamage_SetsFlag) +{ + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_PERIODIC; + config.auraName = SPELL_AURA_PROC_TRIGGER_DAMAGE; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "PROC_FLAG_TAKEN_PERIODIC + PROC_TRIGGER_DAMAGE should set flag"; +} + +TEST_F(TakenAutoTriggerTest, MixedDoneAndTaken_WithProcTriggerSpell_SetsFlag) +{ + // Both DONE and TAKEN flags present - TAKEN mask still matches + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_DONE_MELEE_AUTO_ATTACK + | PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "Mixed DONE+TAKEN flags should still trigger TAKEN auto-add"; +} + +TEST_F(TakenAutoTriggerTest, TakenProcModAura_DoesNotSetTriggeredCanProc) +{ + // SPELL_AURA_ADD_FLAT_MODIFIER is not PROC_TRIGGER_SPELL/DAMAGE + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_ADD_FLAT_MODIFIER; + config.isAlwaysTriggeredAura = false; + + EXPECT_FALSE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "TAKEN proc + modifier aura should NOT auto-add TRIGGERED_CAN_PROC"; +} + +// ============================================================================= +// Real spell scenarios for TAKEN auto-trigger +// ============================================================================= + +TEST_F(TakenAutoTriggerTest, Scenario_MoltenArmor_TakenAutoTrigger) +{ + // Molten Armor (30482): TAKEN_MELEE_AUTO_ATTACK + PROC_TRIGGER_DAMAGE + // Note: Molten Armor has an explicit spell_proc entry so auto-gen + // is skipped, but the logic should still apply if it didn't + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK + | PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS; + config.auraName = SPELL_AURA_PROC_TRIGGER_DAMAGE; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "Molten Armor-like aura should auto-add TRIGGERED_CAN_PROC"; +} + +TEST_F(TakenAutoTriggerTest, Scenario_Reckoning_TakenAutoTrigger) +{ + // Reckoning (20177): TAKEN_MELEE_AUTO_ATTACK + PROC_TRIGGER_SPELL + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "Reckoning-like aura should auto-add TRIGGERED_CAN_PROC"; +} + +TEST_F(TakenAutoTriggerTest, Scenario_Redoubt_TakenAutoTrigger) +{ + // Redoubt (20127): TAKEN_MELEE_AUTO_ATTACK + PROC_TRIGGER_SPELL + ProcChanceTestHelper::TakenAutoTriggerConfig config; + config.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + config.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + config.isAlwaysTriggeredAura = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(config)) + << "Redoubt-like aura should auto-add TRIGGERED_CAN_PROC"; +} + +// ============================================================================= +// Integration: TAKEN auto-trigger affects triggered spell filtering +// ============================================================================= + +TEST_F(TakenAutoTriggerTest, AutoGenTriggeredCanProc_AllowsTriggeredSpells) +{ + // Verify that when TAKEN auto-trigger sets addTriggerFlag, + // the resulting proc entry with PROC_ATTR_TRIGGERED_CAN_PROC + // allows triggered spells through the filter + + // Step 1: Auto-trigger logic says yes + ProcChanceTestHelper::TakenAutoTriggerConfig autoConfig; + autoConfig.procFlags = PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK; + autoConfig.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + ASSERT_TRUE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(autoConfig)); + + // Step 2: Build proc entry with the auto-added attribute + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK) + .WithAttributesMask(PROC_ATTR_TRIGGERED_CAN_PROC) + .WithChance(100.0f) + .Build(); + + // Step 3: Verify triggered spells pass through the filter + ProcChanceTestHelper::TriggeredSpellConfig trigConfig; + trigConfig.isTriggered = true; // e.g. Judgement damage is triggered + trigConfig.auraHasCanProcFromProcs = false; + trigConfig.spellHasNotAProc = false; + + EXPECT_FALSE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + trigConfig, procEntry, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK)) + << "Auto-generated TRIGGERED_CAN_PROC should allow triggered spells"; +} + +TEST_F(TakenAutoTriggerTest, WithoutAutoTrigger_TriggeredSpellsBlocked) +{ + // Without the TAKEN auto-trigger, DONE-only proc auras would block + // triggered spells (no TRIGGERED_CAN_PROC set) + + ProcChanceTestHelper::TakenAutoTriggerConfig autoConfig; + autoConfig.procFlags = PROC_FLAG_DONE_MELEE_AUTO_ATTACK; // DONE only + autoConfig.auraName = SPELL_AURA_PROC_TRIGGER_SPELL; + ASSERT_FALSE(ProcChanceTestHelper::ShouldAutoAddTriggeredCanProc(autoConfig)); + + // Build proc entry WITHOUT TRIGGERED_CAN_PROC + auto procEntry = SpellProcEntryBuilder() + .WithProcFlags(PROC_FLAG_DONE_MELEE_AUTO_ATTACK) + .WithAttributesMask(0) // No TRIGGERED_CAN_PROC + .WithChance(100.0f) + .Build(); + + // Triggered spells should be blocked + ProcChanceTestHelper::TriggeredSpellConfig trigConfig; + trigConfig.isTriggered = true; + trigConfig.auraHasCanProcFromProcs = false; + trigConfig.spellHasNotAProc = false; + + EXPECT_TRUE(ProcChanceTestHelper::ShouldBlockTriggeredSpell( + trigConfig, procEntry, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG)) + << "Without TRIGGERED_CAN_PROC, triggered spells should be blocked"; +} + +// ============================================================================= +// Proc Chain Guard Tests - simulates Unit::TriggerAurasProcOnEvent +// ============================================================================= + +class ProcChainGuardTest : public ::testing::Test +{ +protected: + void SetUp() override {} + + ProcChainGuardSimulator _sim; +}; + +// ----------------------------------------------------------------------------- +// TRIGGERED_DISALLOW_PROC_EVENTS behavior +// ----------------------------------------------------------------------------- + +TEST_F(ProcChainGuardTest, DisallowProcEvents_BlocksAllAuras) +{ + // When triggering spell has TRIGGERED_DISALLOW_PROC_EVENTS, + // all auras should fire with CanProc() == false + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = false}, + {.spellId = 200, .hasInstantTargetProcs = false}, + {.spellId = 300, .hasInstantTargetProcs = false}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/true, auras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 3u); + + for (auto const& rec : records) + { + EXPECT_FALSE(rec.canProcDuringTrigger) + << "Aura " << rec.spellId + << " should have CanProc()=false with DISALLOW_PROC_EVENTS"; + EXPECT_EQ(rec.procDeepDuringTrigger, 1) + << "m_procDeep should be 1 for all auras"; + } +} + +TEST_F(ProcChainGuardTest, DisallowProcEvents_CounterBalanced) +{ + std::vector auras = { + {.spellId = 100}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/true, auras); + + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "m_procDeep should return to 0 after function exits"; + EXPECT_TRUE(_sim.CanProc()) + << "CanProc() should be true after function exits"; +} + +TEST_F(ProcChainGuardTest, NoDisallowProcEvents_AllAurasCanProc) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = false}, + {.spellId = 200, .hasInstantTargetProcs = false}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 2u); + + for (auto const& rec : records) + { + EXPECT_TRUE(rec.canProcDuringTrigger) + << "Aura " << rec.spellId + << " should have CanProc()=true without DISALLOW_PROC_EVENTS"; + EXPECT_EQ(rec.procDeepDuringTrigger, 0); + } +} + +// ----------------------------------------------------------------------------- +// SPELL_ATTR3_INSTANT_TARGET_PROCS per-aura behavior +// ----------------------------------------------------------------------------- + +TEST_F(ProcChainGuardTest, InstantTargetProcs_BlocksDuringSpecificAura) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = false}, + {.spellId = 200, .hasInstantTargetProcs = true}, // This one blocks + {.spellId = 300, .hasInstantTargetProcs = false}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 3u); + + // Aura 100: normal, can proc + EXPECT_TRUE(records[0].canProcDuringTrigger) + << "First aura (no INSTANT_TARGET_PROCS) should allow procs"; + EXPECT_EQ(records[0].procDeepDuringTrigger, 0); + + // Aura 200: has INSTANT_TARGET_PROCS, blocked + EXPECT_FALSE(records[1].canProcDuringTrigger) + << "Aura with INSTANT_TARGET_PROCS should block procs during its trigger"; + EXPECT_EQ(records[1].procDeepDuringTrigger, 1); + + // Aura 300: normal again, can proc (counter was decremented) + EXPECT_TRUE(records[2].canProcDuringTrigger) + << "Next aura after INSTANT_TARGET_PROCS should allow procs again"; + EXPECT_EQ(records[2].procDeepDuringTrigger, 0); +} + +TEST_F(ProcChainGuardTest, InstantTargetProcs_CounterBalanced) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = true}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "m_procDeep should return to 0 after INSTANT_TARGET_PROCS aura"; + EXPECT_TRUE(_sim.CanProc()); +} + +TEST_F(ProcChainGuardTest, MultipleInstantTargetProcs_EachIndependent) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = true}, + {.spellId = 200, .hasInstantTargetProcs = true}, + {.spellId = 300, .hasInstantTargetProcs = true}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 3u); + + // Each aura should independently block during its own trigger + for (auto const& rec : records) + { + EXPECT_FALSE(rec.canProcDuringTrigger) + << "Aura " << rec.spellId + << " with INSTANT_TARGET_PROCS should block during trigger"; + EXPECT_EQ(rec.procDeepDuringTrigger, 1) + << "Each aura should increment to exactly 1 (not accumulate)"; + } + + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "Counter should be balanced after all auras processed"; +} + +// ----------------------------------------------------------------------------- +// Combined: DISALLOW_PROC_EVENTS + INSTANT_TARGET_PROCS +// ----------------------------------------------------------------------------- + +TEST_F(ProcChainGuardTest, Combined_DisallowAndInstantTarget_StackCorrectly) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = false}, + {.spellId = 200, .hasInstantTargetProcs = true}, + {.spellId = 300, .hasInstantTargetProcs = false}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/true, auras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 3u); + + // Aura 100: disableProcs active, procDeep=1 + EXPECT_FALSE(records[0].canProcDuringTrigger); + EXPECT_EQ(records[0].procDeepDuringTrigger, 1); + + // Aura 200: disableProcs + INSTANT_TARGET_PROCS, procDeep=2 + EXPECT_FALSE(records[1].canProcDuringTrigger); + EXPECT_EQ(records[1].procDeepDuringTrigger, 2) + << "DISALLOW_PROC_EVENTS + INSTANT_TARGET_PROCS should stack to 2"; + + // Aura 300: back to just disableProcs, procDeep=1 + EXPECT_FALSE(records[2].canProcDuringTrigger); + EXPECT_EQ(records[2].procDeepDuringTrigger, 1); + + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "Counter should be balanced after combined scenario"; +} + +// ----------------------------------------------------------------------------- +// Removed aura handling +// ----------------------------------------------------------------------------- + +TEST_F(ProcChainGuardTest, RemovedAura_SkippedInLoop) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = false, .isRemoved = false}, + {.spellId = 200, .hasInstantTargetProcs = true, .isRemoved = true}, + {.spellId = 300, .hasInstantTargetProcs = false, .isRemoved = false}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 2u) + << "Removed aura should be skipped"; + + EXPECT_EQ(records[0].spellId, 100u); + EXPECT_EQ(records[1].spellId, 300u); + + // The INSTANT_TARGET_PROCS aura was removed, so it shouldn't affect + // the counter for the next aura + EXPECT_TRUE(records[1].canProcDuringTrigger); +} + +TEST_F(ProcChainGuardTest, RemovedAuraWithInstantProcs_DoesNotAffectCounter) +{ + std::vector auras = { + {.spellId = 100, .hasInstantTargetProcs = true, .isRemoved = true}, + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + EXPECT_EQ(_sim.GetRecords().size(), 0u); + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "Removed aura should not touch the proc deep counter"; +} + +// ----------------------------------------------------------------------------- +// Empty container +// ----------------------------------------------------------------------------- + +TEST_F(ProcChainGuardTest, EmptyContainer_NoEffect) +{ + std::vector auras; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, auras); + + EXPECT_EQ(_sim.GetRecords().size(), 0u); + EXPECT_EQ(_sim.GetProcDeep(), 0); +} + +TEST_F(ProcChainGuardTest, EmptyContainer_WithDisallowProc_StillBalanced) +{ + std::vector auras; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/true, auras); + + EXPECT_EQ(_sim.GetRecords().size(), 0u); + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "Even with disableProcs and empty container, counter should balance"; +} + +// ============================================================================= +// Real spell scenarios for proc chain guard +// ============================================================================= + +TEST_F(ProcChainGuardTest, Scenario_MoltenArmorVsEyeForAnEye) +{ + // Molten Armor (43046) has SPELL_ATTR3_INSTANT_TARGET_PROCS + // When Molten Armor deals fire damage to an attacker, that damage + // should not trigger the attacker's reactive procs (Eye for an Eye) + // back on the mage, preventing infinite ping-pong + + // Mage's perspective: paladin hits mage, mage's auras proc + std::vector mageAuras = { + {.spellId = 43046, .hasInstantTargetProcs = true}, // Molten Armor + }; + + // The paladin's melee hit is NOT TRIGGERED_DISALLOW_PROC_EVENTS + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, mageAuras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 1u); + + // During Molten Armor's proc trigger, CanProc() is false + // This means the fire damage it deals cannot trigger further procs + EXPECT_FALSE(records[0].canProcDuringTrigger) + << "Molten Armor proc should block cascading procs (prevents EfaE loop)"; + + EXPECT_EQ(_sim.GetProcDeep(), 0) + << "Counter balanced after Molten Armor scenario"; +} + +TEST_F(ProcChainGuardTest, Scenario_SealOfRighteousness_TriggeredDamage) +{ + // SoR bonus damage is triggered with TRIGGERED_DISALLOW_PROC_EVENTS + // It should not trigger the target's reactive damage auras back + + std::vector targetAuras = { + {.spellId = 43046, .hasInstantTargetProcs = true}, // Molten Armor + {.spellId = 12345, .hasInstantTargetProcs = false}, // Some other aura + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/true, targetAuras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 2u); + + // All auras should see CanProc() = false + for (auto const& rec : records) + { + EXPECT_FALSE(rec.canProcDuringTrigger) + << "All target auras should be blocked when SoR damage" + << " has DISALLOW_PROC_EVENTS"; + } +} + +TEST_F(ProcChainGuardTest, Scenario_NormalMeleeHit_AurasCanProc) +{ + // A normal melee swing should allow all auras to proc normally + // (no DISALLOW_PROC_EVENTS, no INSTANT_TARGET_PROCS) + + std::vector targetAuras = { + {.spellId = 20177, .hasInstantTargetProcs = false}, // Reckoning + {.spellId = 20127, .hasInstantTargetProcs = false}, // Redoubt + {.spellId = 16958, .hasInstantTargetProcs = false}, // Blood Craze + }; + + _sim.SimulateTriggerAurasProc(/*disallowProcEvents=*/false, targetAuras); + + auto const& records = _sim.GetRecords(); + ASSERT_EQ(records.size(), 3u); + + for (auto const& rec : records) + { + EXPECT_TRUE(rec.canProcDuringTrigger) + << "Aura " << rec.spellId + << " should proc normally from a regular melee hit"; + EXPECT_EQ(rec.procDeepDuringTrigger, 0); + } +} diff --git a/src/test/server/game/Time/GameTime.cpp b/src/test/server/game/Time/GameTime.cpp new file mode 100644 index 000000000..ed6428d00 --- /dev/null +++ b/src/test/server/game/Time/GameTime.cpp @@ -0,0 +1,63 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "GameTime.h" +#include "gtest/gtest.h" + +#include + +TEST(GameTimeTest, Elapsed) +{ + GameTime::UpdateGameTimers(); + auto start = GameTime::Now(); + std::this_thread::sleep_for(50ms); + GameTime::UpdateGameTimers(); + auto elapsed = GameTime::Elapsed(start); + EXPECT_GE(elapsed, 50ms); +} + +TEST(GameTimeTest, HasElapsedTrue) +{ + GameTime::UpdateGameTimers(); + auto start = GameTime::Now(); + std::this_thread::sleep_for(50ms); + GameTime::UpdateGameTimers(); + EXPECT_TRUE(GameTime::HasElapsed(start, 25ms)); +} + +TEST(GameTimeTest, HasElapsedFalse) +{ + GameTime::UpdateGameTimers(); + auto start = GameTime::Now(); + EXPECT_FALSE(GameTime::HasElapsed(start, 10s)); +} + +TEST(GameTimeTest, HasElapsedWithSeconds) +{ + GameTime::UpdateGameTimers(); + auto start = GameTime::Now(); + EXPECT_FALSE(GameTime::HasElapsed(start, 1s)); +} + +TEST(GameTimeTest, HasElapsedWithMicroseconds) +{ + GameTime::UpdateGameTimers(); + auto start = GameTime::Now(); + std::this_thread::sleep_for(100us); + GameTime::UpdateGameTimers(); + EXPECT_TRUE(GameTime::HasElapsed(start, Microseconds(1))); +}