diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-08-13 00:31:39 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-08-13 00:31:39 +0200 |
commit | 5cf0c6c8bb2c4e58a2d66ba5f304af34d18a4782 (patch) | |
tree | 0616f3e83f511aae0e10916f0c22161017e09c24 | |
parent | 82f19c898815e3bc5bb6288b0191ee897594f9b5 (diff) |
Core: Updated to 11.2.0
83 files changed, 6582 insertions, 5606 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 3d28ebe8f6b..b31dd804ba1 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1188,7 +1188,35 @@ INSERT INTO `build_auth_key` VALUES (61967,'Mac','x64','WoWC',0x4DE3D440D1D46A38EC32D0D524004ABA), (61967,'Win','A64','WoW',0x7B443BB6B4F355B9E389F4F0ACB04FE8), (61967,'Win','x64','WoW',0x6E194B4B53038E76E01E9538107AFF4D), -(61967,'Win','x64','WoWC',0x9E135BF0B40BDD210EAF318AEB72801C); +(61967,'Win','x64','WoWC',0x9E135BF0B40BDD210EAF318AEB72801C), +(62213,'Mac','A64','WoW',0x4EB479A10C122085CFA59633DBCADA17), +(62213,'Mac','A64','WoWC',0x101F2207C5AB43A29762838FC4C460BA), +(62213,'Mac','x64','WoW',0x94D5B0A9620333C4F068A5F7FD5E16C6), +(62213,'Mac','x64','WoWC',0xBAA3BAFC4F9209AFB9EDA4C89DBB506C), +(62213,'Win','A64','WoW',0xF565E632CBC04516F235F2A412C61569), +(62213,'Win','x64','WoW',0x062594033EA9753E81240476AB4E21BC), +(62213,'Win','x64','WoWC',0x8584238F7E35711E8817CD53951478B2), +(62417,'Mac','A64','WoW',0x020BBBA62C6539043095AE1603FC3A1F), +(62417,'Mac','A64','WoWC',0xDA7BB5E78E98856A679EB442EB683DD5), +(62417,'Mac','x64','WoW',0x8D15525965A59F4C1A886E6BCC09D75A), +(62417,'Mac','x64','WoWC',0x02C9B276B11F9B175A59021B1EB7F9E3), +(62417,'Win','A64','WoW',0xDC74AF249532EF367023C78F11E6F709), +(62417,'Win','x64','WoW',0x702FC86D79262CD311393AEB3F5B88E6), +(62417,'Win','x64','WoWC',0xB97B257A3D69BBA321DEC1427591EAD6), +(62438,'Mac','A64','WoW',0x5C974D816F1D4806F77A60D125902B11), +(62438,'Mac','A64','WoWC',0x333EEF08165D098594D01993FB5566C4), +(62438,'Mac','x64','WoW',0x8EE8E906F3277B995C3FB76A9472316D), +(62438,'Mac','x64','WoWC',0x2D92FAC97BE1600E3CF7C41C260B90E3), +(62438,'Win','A64','WoW',0x5F43B9C77DA61431AAF5E527FC6BA0BA), +(62438,'Win','x64','WoW',0x54B80A79B8A5C515E25366AB57F0ACB0), +(62438,'Win','x64','WoWC',0xCAE41A1DD7CF9C2E850CE388BB1EEF6D), +(62493,'Mac','A64','WoW',0x35663EF5187F38257E9768481F1894DC), +(62493,'Mac','A64','WoWC',0x5A48D3A43278A6EA31B2E3AE0DE6E601), +(62493,'Mac','x64','WoW',0x1BEEC427C9F41184EFAAC048D51C5207), +(62493,'Mac','x64','WoWC',0x15B0A1D7EA355891634507CD840B2E16), +(62493,'Win','A64','WoW',0x043025D94567792FA8284C282E77E57F), +(62493,'Win','x64','WoW',0x5B038E707AB60E3A862C2E03A8487220), +(62493,'Win','x64','WoWC',0x1A65B9347FD44EF0A77479173D098226); /*!40000 ALTER TABLE `build_auth_key` ENABLE KEYS */; UNLOCK TABLES; @@ -1581,7 +1609,11 @@ INSERT INTO `build_info` VALUES (61491,11,1,7,NULL), (61559,11,1,7,NULL), (61609,11,1,7,NULL), -(61967,11,1,7,NULL); +(61967,11,1,7,NULL), +(62213,11,2,0,NULL), +(62417,11,2,0,NULL), +(62438,11,2,0,NULL), +(62493,11,2,0,NULL); /*!40000 ALTER TABLE `build_info` ENABLE KEYS */; UNLOCK TABLES; @@ -3194,7 +3226,7 @@ CREATE TABLE `realmlist` ( `timezone` tinyint unsigned NOT NULL DEFAULT '0', `allowedSecurityLevel` tinyint unsigned NOT NULL DEFAULT '0', `population` float NOT NULL DEFAULT '0', - `gamebuild` int unsigned NOT NULL DEFAULT '61967', + `gamebuild` int unsigned NOT NULL DEFAULT '62493', `Region` tinyint unsigned NOT NULL DEFAULT '1', `Battlegroup` tinyint unsigned NOT NULL DEFAULT '1', PRIMARY KEY (`id`), @@ -3209,7 +3241,7 @@ CREATE TABLE `realmlist` ( LOCK TABLES `realmlist` WRITE; /*!40000 ALTER TABLE `realmlist` DISABLE KEYS */; INSERT INTO `realmlist` VALUES -(1,'Trinity','127.0.0.1','127.0.0.1',NULL,NULL,'255.255.255.0',8085,0,0,1,0,0,61967,1,1); +(1,'Trinity','127.0.0.1','127.0.0.1',NULL,NULL,'255.255.255.0',8085,0,0,1,0,0,62493,1,1); /*!40000 ALTER TABLE `realmlist` ENABLE KEYS */; UNLOCK TABLES; @@ -3718,7 +3750,8 @@ INSERT INTO `updates` VALUES ('2025_06_25_00_auth.sql','27DC7FB423FFB3788082CCFC18D5432650B09FB3','ARCHIVED','2025-06-25 01:15:04',0), ('2025_06_27_00_auth.sql','243C89DFED0058323EF9690D124C1F20036D461B','ARCHIVED','2025-06-27 14:22:49',0), ('2025_07_14_00_auth.sql','5F975A202CF84F2BFEA366E0BEDF8FA63035CD62','ARCHIVED','2025-07-14 23:10:54',0), -('2025_07_21_00_auth.sql','44AA781EE1B1C66E8433E50A2E20916EB1BEFE23','ARCHIVED','2025-07-21 22:51:05',0); +('2025_07_21_00_auth.sql','44AA781EE1B1C66E8433E50A2E20916EB1BEFE23','ARCHIVED','2025-07-21 22:51:05',0), +('2025_08_13_00_auth.sql','5F67141AB407AEC202E8048765256AB11C5621EA','RELEASED','2025-08-12 19:26:13',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index be834419bdc..a70185ede3d 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -591,6 +591,33 @@ LOCK TABLES `character_aura_stored_location` WRITE; UNLOCK TABLES; -- +-- Table structure for table `character_bank_tab_settings` +-- + +DROP TABLE IF EXISTS `character_bank_tab_settings`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `character_bank_tab_settings` ( + `characterGuid` bigint unsigned NOT NULL, + `tabId` tinyint unsigned NOT NULL, + `name` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `icon` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `description` varchar(2048) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `depositFlags` int DEFAULT '0', + PRIMARY KEY (`characterGuid`,`tabId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `character_bank_tab_settings` +-- + +LOCK TABLES `character_bank_tab_settings` WRITE; +/*!40000 ALTER TABLE `character_bank_tab_settings` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_bank_tab_settings` ENABLE KEYS */; +UNLOCK TABLES; + +-- -- Table structure for table `character_banned` -- @@ -1913,39 +1940,6 @@ LOCK TABLES `character_transmog_outfits` WRITE; UNLOCK TABLES; -- --- Table structure for table `character_void_storage` --- - -DROP TABLE IF EXISTS `character_void_storage`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `character_void_storage` ( - `itemId` bigint unsigned NOT NULL, - `playerGuid` bigint unsigned NOT NULL, - `itemEntry` int unsigned NOT NULL, - `slot` tinyint unsigned NOT NULL, - `creatorGuid` bigint unsigned NOT NULL DEFAULT '0', - `randomBonusListId` int unsigned NOT NULL DEFAULT '0', - `fixedScalingLevel` int unsigned DEFAULT '0', - `artifactKnowledgeLevel` int unsigned DEFAULT '0', - `context` tinyint unsigned NOT NULL DEFAULT '0', - `bonusListIDs` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, - PRIMARY KEY (`itemId`), - UNIQUE KEY `idx_player_slot` (`playerGuid`,`slot`), - KEY `idx_player` (`playerGuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `character_void_storage` --- - -LOCK TABLES `character_void_storage` WRITE; -/*!40000 ALTER TABLE `character_void_storage` DISABLE KEYS */; -/*!40000 ALTER TABLE `character_void_storage` ENABLE KEYS */; -UNLOCK TABLES; - --- -- Table structure for table `characters` -- @@ -1971,14 +1965,8 @@ CREATE TABLE `characters` ( `bagSlotFlags4` int unsigned NOT NULL DEFAULT '0', `bagSlotFlags5` int unsigned NOT NULL DEFAULT '0', `bankSlots` tinyint unsigned NOT NULL DEFAULT '0', + `bankTabs` tinyint unsigned NOT NULL DEFAULT '0', `bankBagFlags` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags1` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags2` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags3` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags4` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags5` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags6` int unsigned NOT NULL DEFAULT '0', - `bankBagSlotFlags7` int unsigned NOT NULL DEFAULT '0', `restState` tinyint unsigned NOT NULL DEFAULT '0', `playerFlags` int unsigned NOT NULL DEFAULT '0', `playerFlagsEx` int unsigned NOT NULL DEFAULT '0', @@ -3832,7 +3820,8 @@ INSERT INTO `updates` VALUES ('2025_03_29_00_characters.sql','6A49C236D0B8CCD8A5B6B51F60E116B3380772D7','ARCHIVED','2025-03-29 01:12:13',0), ('2025_05_31_00_characters.sql','C240EB5C4008B6AA0514802A18D7DD875680DE82','ARCHIVED','2025-05-31 19:45:56',0), ('2025_06_27_00_characters.sql','35088BA5BA4BD3B7FAAD6FD4FAE38E52A5B71CD8','ARCHIVED','2025-06-27 14:22:08',0), -('2025_07_21_00_characters.sql','056A99B9AA90186E5B3177BF54C86607B6518BE9','ARCHIVED','2025-07-21 22:51:05',0); +('2025_07_21_00_characters.sql','056A99B9AA90186E5B3177BF54C86607B6518BE9','ARCHIVED','2025-07-21 22:51:05',0), +('2025_08_13_00_characters.sql','9C2321777E6C34F18799C8967B1CA0C44F17DA18','RELEASED','2025-08-12 20:17:45',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/master/2025_08_13_00_auth.sql b/sql/updates/auth/master/2025_08_13_00_auth.sql new file mode 100644 index 00000000000..8544b57cb5e --- /dev/null +++ b/sql/updates/auth/master/2025_08_13_00_auth.sql @@ -0,0 +1,41 @@ +DELETE FROM `build_info` WHERE `build` IN (62213,62417,62438,62493); +INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES +(62213,11,2,0,NULL), +(62417,11,2,0,NULL), +(62438,11,2,0,NULL), +(62493,11,2,0,NULL); + +DELETE FROM `build_auth_key` WHERE `build` IN (62213,62417,62438,62493); +INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES +(62213,'Mac','A64','WoW',0x4EB479A10C122085CFA59633DBCADA17), +(62213,'Mac','A64','WoWC',0x101F2207C5AB43A29762838FC4C460BA), +(62213,'Mac','x64','WoW',0x94D5B0A9620333C4F068A5F7FD5E16C6), +(62213,'Mac','x64','WoWC',0xBAA3BAFC4F9209AFB9EDA4C89DBB506C), +(62213,'Win','A64','WoW',0xF565E632CBC04516F235F2A412C61569), +(62213,'Win','x64','WoW',0x062594033EA9753E81240476AB4E21BC), +(62213,'Win','x64','WoWC',0x8584238F7E35711E8817CD53951478B2), +(62417,'Mac','A64','WoW',0x020BBBA62C6539043095AE1603FC3A1F), +(62417,'Mac','A64','WoWC',0xDA7BB5E78E98856A679EB442EB683DD5), +(62417,'Mac','x64','WoW',0x8D15525965A59F4C1A886E6BCC09D75A), +(62417,'Mac','x64','WoWC',0x02C9B276B11F9B175A59021B1EB7F9E3), +(62417,'Win','A64','WoW',0xDC74AF249532EF367023C78F11E6F709), +(62417,'Win','x64','WoW',0x702FC86D79262CD311393AEB3F5B88E6), +(62417,'Win','x64','WoWC',0xB97B257A3D69BBA321DEC1427591EAD6), +(62438,'Mac','A64','WoW',0x5C974D816F1D4806F77A60D125902B11), +(62438,'Mac','A64','WoWC',0x333EEF08165D098594D01993FB5566C4), +(62438,'Mac','x64','WoW',0x8EE8E906F3277B995C3FB76A9472316D), +(62438,'Mac','x64','WoWC',0x2D92FAC97BE1600E3CF7C41C260B90E3), +(62438,'Win','A64','WoW',0x5F43B9C77DA61431AAF5E527FC6BA0BA), +(62438,'Win','x64','WoW',0x54B80A79B8A5C515E25366AB57F0ACB0), +(62438,'Win','x64','WoWC',0xCAE41A1DD7CF9C2E850CE388BB1EEF6D), +(62493,'Mac','A64','WoW',0x35663EF5187F38257E9768481F1894DC), +(62493,'Mac','A64','WoWC',0x5A48D3A43278A6EA31B2E3AE0DE6E601), +(62493,'Mac','x64','WoW',0x1BEEC427C9F41184EFAAC048D51C5207), +(62493,'Mac','x64','WoWC',0x15B0A1D7EA355891634507CD840B2E16), +(62493,'Win','A64','WoW',0x043025D94567792FA8284C282E77E57F), +(62493,'Win','x64','WoW',0x5B038E707AB60E3A862C2E03A8487220), +(62493,'Win','x64','WoWC',0x1A65B9347FD44EF0A77479173D098226); + +UPDATE `realmlist` SET `gamebuild`=62493 WHERE `gamebuild`=61967; + +ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '62493'; diff --git a/sql/updates/characters/master/2025_08_13_00_characters.sql b/sql/updates/characters/master/2025_08_13_00_characters.sql new file mode 100644 index 00000000000..0fbb7311b12 --- /dev/null +++ b/sql/updates/characters/master/2025_08_13_00_characters.sql @@ -0,0 +1,128 @@ +ALTER TABLE `characters` + ADD `bankTabs` tinyint unsigned NOT NULL DEFAULT 0 AFTER `bankSlots`, + DROP `bankBagSlotFlags1`, + DROP `bankBagSlotFlags2`, + DROP `bankBagSlotFlags3`, + DROP `bankBagSlotFlags4`, + DROP `bankBagSlotFlags5`, + DROP `bankBagSlotFlags6`, + DROP `bankBagSlotFlags7`; + +UPDATE `characters` SET `bankTabs`=LEAST(6,GREATEST( + `bankSlots`, + IF((`playerFlags` & 0x20000000)<>0,6,0), -- unlocked void storage + IF((`playerFlagsEx` & 0x1)<>0,4,0), -- unlocked reagent bank + IF(`level`>=80,6,0) +)); + +-- +-- Table structure for table `character_bank_tab_settings` +-- +DROP TABLE IF EXISTS `character_bank_tab_settings`; +CREATE TABLE `character_bank_tab_settings` ( + `characterGuid` bigint unsigned NOT NULL, + `tabId` tinyint unsigned NOT NULL, + `name` varchar(16) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `icon` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `description` varchar(2048) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `depositFlags` int DEFAULT '0', + PRIMARY KEY (`characterGuid`,`tabId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `character_bank_tab_settings` SELECT `guid`,0,'Tab 1',NULL,NULL,0 FROM `characters` WHERE `bankTabs` >= 1; +INSERT INTO `character_bank_tab_settings` SELECT `guid`,1,'Tab 2',NULL,NULL,0 FROM `characters` WHERE `bankTabs` >= 2; +INSERT INTO `character_bank_tab_settings` SELECT `guid`,2,'Tab 3',NULL,NULL,0 FROM `characters` WHERE `bankTabs` >= 3; +INSERT INTO `character_bank_tab_settings` SELECT `guid`,3,'Reagents',NULL,NULL,0x80 FROM `characters` WHERE `bankTabs` >= 4; +INSERT INTO `character_bank_tab_settings` SELECT `guid`,4,'Void Storage 1',NULL,NULL,0 FROM `characters` WHERE `bankTabs` >= 5; +INSERT INTO `character_bank_tab_settings` SELECT `guid`,5,'Void Storage 2',NULL,NULL,0 FROM `characters` WHERE `bankTabs` >= 6; + +-- helper columns +-- character_inventory.bag_slot (inventory slot where the bag is stored) +-- character_inventory.new_slot +-- character_inventory.slot temporarily changed type to SMALLINT +ALTER TABLE `character_inventory` + ADD `bag_slot` INT, + ADD `new_slot` INT, + MODIFY `slot` SMALLINT UNSIGNED NOT NULL; + +UPDATE `character_inventory` ci1 +LEFT JOIN `character_inventory` ci2 ON ci1.bag = ci2.item +SET ci1.bag_slot = COALESCE(ci2.slot, 0); + +-- move items that need moving out of the way +UPDATE `character_inventory` SET `slot`=`slot`+1000 WHERE `bag`=0 AND `slot` BETWEEN 63 AND 97; -- BankItemSlots/BankBagSlots +UPDATE `character_inventory` SET `slot`=`slot`+1000 WHERE `bag`=0 AND `slot` BETWEEN 110 AND 207; -- ReagentSlots + +-- adjust BuyBackSlots/ChildEquipmentSlots/EquipableSpellSlots/AccountBankBagSlots +UPDATE `character_inventory` SET `slot`=`slot`-29 WHERE `bag`=0 AND `slot` BETWEEN 98 AND 109; -- BuyBackSlots +UPDATE `character_inventory` SET `slot`=`slot`-127 WHERE `bag`=0 AND `slot` BETWEEN 208 AND 231; -- ChildEquipmentSlots/EquipableSpellSlots/AccountBankBagSlots + +SET @item_guid := 0; +SELECT MAX(guid) INTO @item_guid FROM item_instance; + +-- create new bags +INSERT INTO `character_inventory` (`guid`,`bag`,`slot`,`item`) +SELECT cbts.characterGuid, 0, 63 + cbts.`tabId`, (@item_guid := @item_guid + 1) FROM `character_bank_tab_settings` cbts; + +INSERT INTO `item_instance` (`guid`,`itemEntry`,`owner_guid`,`charges`,`flags`,`enchantments`,`playedTime`,`createTime`,`text`,`bonusListIDs`) +SELECT ci.`item`, 242709, ci.`guid`, '', 0x1, '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ', c.totaltime, UNIX_TIMESTAMP(),'','' +FROM `character_inventory` ci +LEFT JOIN `characters` c ON c.`guid` = ci.`guid` +WHERE ci.`bag` = 0 AND ci.`slot` BETWEEN 63 AND 68; + +-- calculate new slots for old banked items +UPDATE `character_inventory` ci +LEFT JOIN ( + SELECT item, new_slot + FROM ( + SELECT guid, bag, slot, item, IF(@prev <> guid, @row_num:=0,@row_num:=@row_num+1) AS new_slot, @prev:=guid + FROM character_inventory, + (SELECT @row_num:=0) rn, + (SELECT @prev:='') prev + WHERE (bag_slot = 0 AND slot BETWEEN 1063 AND 1097) OR bag_slot BETWEEN 91 AND 97 + ORDER BY guid, bag_slot, slot + ) `window` +) new_slots ON new_slots.item = ci.item +SET ci.new_slot = new_slots.new_slot; + +-- assign new bags and slots +UPDATE `character_inventory` ci +LEFT JOIN `character_inventory` ci2 ON ci2.guid = ci.guid AND ci2.bag = 0 AND ci2.slot = (ci.new_slot DIV 98) + 63 +SET ci.bag = ci2.item, ci.slot = ci.new_slot MOD 98 +WHERE (ci.bag_slot = 0 AND ci.slot BETWEEN 1063 AND 1097) OR ci.bag_slot BETWEEN 91 AND 97; + +-- move reagents as-is (bag is the same size) +UPDATE `character_inventory` ci +LEFT JOIN `character_inventory` ci2 ON ci2.guid = ci.guid AND ci2.bag = 0 AND ci2.slot = 66 +SET ci.bag = ci2.item, ci.slot = ci.slot - 1110 +WHERE (ci.bag_slot = 0 AND ci.slot BETWEEN 1110 AND 1207); + +-- void storage +ALTER TABLE `character_void_storage` + ADD `itemGuid` BIGINT UNSIGNED, + ADD `bagGuid` BIGINT UNSIGNED; + +-- generate guids for void storage +UPDATE `character_void_storage` cvs +SET +cvs.`itemGuid` = (@item_guid := @item_guid + 1), +cvs.`bagGuid` = (SELECT ci.`item` FROM `character_inventory` ci WHERE ci.`guid` = cvs.`playerGuid` AND ci.`bag` = 0 AND ci.`slot` = 67 + (cvs.`slot` DIV 80)); + +-- create items from void storage +INSERT INTO `item_instance` (`guid`, `itemEntry`, `owner_guid`, `creatorGuid`, `charges`, `flags`, `enchantments`, `randomBonusListId`, `durability`, `playedTime`, `createTime`, `text`, `context`, `bonusListIDs`) +SELECT cvs.`itemGuid`, cvs.`itemEntry`, cvs.`playerGuid`, cvs.`creatorGuid`, '', 0x1, '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ', cvs.`randomBonusListId`, 999, c.`totaltime`, UNIX_TIMESTAMP(), '', cvs.context, cvs.bonusListIDs FROM `character_void_storage` cvs +LEFT JOIN `characters` c ON c.`guid` = cvs.`playerGuid`; + +INSERT INTO `item_instance_modifiers` (`itemGuid`, `fixedScalingLevel`, `artifactKnowledgeLevel`) +SELECT cvs.`itemGuid`, COALESCE(cvs.`fixedScalingLevel`, 0), COALESCE(cvs.`artifactKnowledgeLevel`, 0) FROM `character_void_storage` cvs +WHERE cvs.`fixedScalingLevel` > 0 OR cvs.`artifactKnowledgeLevel` > 0; + +INSERT INTO `character_inventory` (`guid`, `bag`, `slot`, `item`) +SELECT cvs.`playerGuid`, cvs.`bagGuid`, cvs.`slot` MOD 80, cvs.`itemGuid` FROM `character_void_storage` cvs; + +ALTER TABLE `character_inventory` + DROP `bag_slot`, + DROP `new_slot`, + MODIFY `slot` TINYINT UNSIGNED NOT NULL DEFAULT 0; + +DROP TABLE IF EXISTS `character_void_storage`; diff --git a/sql/updates/hotfixes/master/2025_08_13_00_hotfixes.sql b/sql/updates/hotfixes/master/2025_08_13_00_hotfixes.sql new file mode 100644 index 00000000000..9d6e1dec51c --- /dev/null +++ b/sql/updates/hotfixes/master/2025_08_13_00_hotfixes.sql @@ -0,0 +1,84 @@ + +ALTER TABLE `animation_data` MODIFY COLUMN `BehaviorTier` tinyint NOT NULL DEFAULT 0 AFTER `Fallback`; + +DROP TABLE IF EXISTS `bank_bag_slot_prices`; + +-- +-- Table structure for table `bank_tab` +-- +DROP TABLE IF EXISTS `bank_tab`; +CREATE TABLE `bank_tab` ( + `ID` int unsigned NOT NULL DEFAULT '0', + `Cost` bigint unsigned NOT NULL DEFAULT '0', + `BankType` tinyint unsigned NOT NULL DEFAULT '0', + `OrderIndex` tinyint NOT NULL DEFAULT '0', + `PlayerConditionID` int NOT NULL DEFAULT '0', + `PurchasePromptTitle` int NOT NULL DEFAULT '0', + `PurchasePromptBody` int NOT NULL DEFAULT '0', + `PurchasePromptConfirmation` int NOT NULL DEFAULT '0', + `TabCleanupConfirmation` int NOT NULL DEFAULT '0', + `TabNameEditBoxHeader` int NOT NULL DEFAULT '0', + `VerifiedBuild` int NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +ALTER TABLE `banned_addons` MODIFY COLUMN `Flags` int NOT NULL DEFAULT 0 AFTER `Version`; + +ALTER TABLE `cfg_regions` ADD COLUMN `TimeEventRegionGroupID` int NOT NULL DEFAULT 0 AFTER `ChallengeOrigin`; + +ALTER TABLE `char_titles` MODIFY COLUMN `Flags` int NOT NULL DEFAULT 0 AFTER `MaskID`; + +ALTER TABLE `chr_classes` + ADD COLUMN `StartingLevel` int NOT NULL DEFAULT 0 AFTER `Flags`, + ADD COLUMN `HasStrengthBonus` tinyint UNSIGNED NOT NULL DEFAULT 0 AFTER `ID`, + ADD COLUMN `DamageBonusStat` tinyint UNSIGNED NOT NULL DEFAULT 0 AFTER `RolesMask`, + ADD COLUMN `HasRelicSlot` tinyint UNSIGNED NOT NULL DEFAULT 0 AFTER `DamageBonusStat`; + +ALTER TABLE `creature_family` ADD COLUMN `CategoryEnumID` int NOT NULL DEFAULT 0 AFTER `PetTalentType`; + +ALTER TABLE `expected_stat` ADD COLUMN `ContentSetID` int NOT NULL DEFAULT 0 AFTER `CreatureSpellDamage`; + +ALTER TABLE `item` MODIFY COLUMN `ClassID` int NOT NULL DEFAULT 0 AFTER `ID`; + +ALTER TABLE `item_set_spell` ADD COLUMN `TraitSubTreeID` smallint UNSIGNED NOT NULL DEFAULT 0 AFTER `SpellID`; + +ALTER TABLE `map_challenge_mode` + ADD COLUMN `FirstRewardQuestID1` int NOT NULL DEFAULT 0 AFTER `CriteriaCount3`, + ADD COLUMN `FirstRewardQuestID2` int NOT NULL DEFAULT 0 AFTER `FirstRewardQuestID1`, + ADD COLUMN `FirstRewardQuestID3` int NOT NULL DEFAULT 0 AFTER `FirstRewardQuestID2`, + ADD COLUMN `FirstRewardQuestID4` int NOT NULL DEFAULT 0 AFTER `FirstRewardQuestID3`, + ADD COLUMN `FirstRewardQuestID5` int NOT NULL DEFAULT 0 AFTER `FirstRewardQuestID4`, + ADD COLUMN `FirstRewardQuestID6` int NOT NULL DEFAULT 0 AFTER `FirstRewardQuestID5`, + ADD COLUMN `RewardQuestID1` int NOT NULL DEFAULT 0 AFTER `FirstRewardQuestID6`, + ADD COLUMN `RewardQuestID2` int NOT NULL DEFAULT 0 AFTER `RewardQuestID1`, + ADD COLUMN `RewardQuestID3` int NOT NULL DEFAULT 0 AFTER `RewardQuestID2`, + ADD COLUMN `RewardQuestID4` int NOT NULL DEFAULT 0 AFTER `RewardQuestID3`, + ADD COLUMN `RewardQuestID5` int NOT NULL DEFAULT 0 AFTER `RewardQuestID4`, + ADD COLUMN `RewardQuestID6` int NOT NULL DEFAULT 0 AFTER `RewardQuestID5`; + +ALTER TABLE `map_challenge_mode` MODIFY COLUMN `Flags` int NOT NULL DEFAULT 0 AFTER `MapID`; + +ALTER TABLE `spell_category` + MODIFY COLUMN `UsesPerWeek` int NOT NULL DEFAULT 0 AFTER `Flags`, + MODIFY COLUMN `MaxCharges` int NOT NULL DEFAULT 0 AFTER `UsesPerWeek`; + +ALTER TABLE `spell_equipped_items` MODIFY COLUMN `EquippedItemClass` int NOT NULL DEFAULT 0 AFTER `SpellID`; + +ALTER TABLE `spell_visual_kit` + ADD COLUMN `MinimumSpellVisualDensityFilterType` int NOT NULL DEFAULT 0 AFTER `DelayMax`, + ADD COLUMN `MinimumSpellVisualDensityFilterParam` int NOT NULL DEFAULT 0 AFTER `MinimumSpellVisualDensityFilterType`, + ADD COLUMN `ReducedSpellVisualDensityFilterType` int NOT NULL DEFAULT 0 AFTER `MinimumSpellVisualDensityFilterParam`, + ADD COLUMN `ReducedSpellVisualDensityFilterParam` int NOT NULL DEFAULT 0 AFTER `ReducedSpellVisualDensityFilterType`; + +ALTER TABLE `unit_power_bar` MODIFY COLUMN `Flags` int NOT NULL DEFAULT 0 AFTER `BarType`; + +ALTER TABLE `warband_scene` + DROP COLUMN `Source`, + DROP COLUMN `SourceType`; + +ALTER TABLE `warband_scene_locale` DROP COLUMN `Source_lang`; + +DELETE FROM `item_sparse` WHERE `ID` IN (208392,242709); +INSERT INTO `item_sparse` (`ID`, `AllowableRace`, `Description`, `Display3`, `Display2`, `Display1`, `Display`, `ExpansionID`, `DmgVariance`, `LimitCategory`, `DurationInInventory`, `QualityModifier`, `BagFamily`, `StartQuestID`, `LanguageID`, `ItemRange`, `StatPercentageOfSocket1`, `StatPercentageOfSocket2`, `StatPercentageOfSocket3`, `StatPercentageOfSocket4`, `StatPercentageOfSocket5`, `StatPercentageOfSocket6`, `StatPercentageOfSocket7`, `StatPercentageOfSocket8`, `StatPercentageOfSocket9`, `StatPercentageOfSocket10`, `StatPercentEditor1`, `StatPercentEditor2`, `StatPercentEditor3`, `StatPercentEditor4`, `StatPercentEditor5`, `StatPercentEditor6`, `StatPercentEditor7`, `StatPercentEditor8`, `StatPercentEditor9`, `StatPercentEditor10`, `StatModifierBonusStat1`, `StatModifierBonusStat2`, `StatModifierBonusStat3`, `StatModifierBonusStat4`, `StatModifierBonusStat5`, `StatModifierBonusStat6`, `StatModifierBonusStat7`, `StatModifierBonusStat8`, `StatModifierBonusStat9`, `StatModifierBonusStat10`, `Stackable`, `MaxCount`, `MinReputation`, `RequiredAbility`, `SellPrice`, `BuyPrice`, `VendorStackCount`, `PriceVariance`, `PriceRandomValue`, `Flags1`, `Flags2`, `Flags3`, `Flags4`, `Flags5`, `FactionRelated`, `ModifiedCraftingReagentItemID`, `ContentTuningID`, `PlayerLevelToItemLevelCurveID`, `ItemNameDescriptionID`, `RequiredTransmogHoliday`, `RequiredHoliday`, `GemProperties`, `SocketMatchEnchantmentId`, `TotemCategoryID`, `InstanceBound`, `ZoneBound1`, `ZoneBound2`, `ItemSet`, `LockID`, `PageID`, `ItemDelay`, `MinFactionID`, `RequiredSkillRank`, `RequiredSkill`, `ItemLevel`, `AllowableClass`, `ArtifactID`, `SpellWeight`, `SpellWeightCategory`, `SocketType1`, `SocketType2`, `SocketType3`, `SheatheType`, `Material`, `PageMaterialID`, `Bonding`, `DamageDamageType`, `ContainerSlots`, `RequiredPVPMedal`, `RequiredPVPRank`, `RequiredLevel`, `InventoryType`, `OverallQualityID`, `VerifiedBuild`) VALUES +(208392,-1,'','','','','Account Bank Tab Bag (DNT)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,0,0,0,0,0,1,1,1.034399986267089843,0,0,67375104,268437504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,-1,0,0,0,0,0,0,0,0,0,0,0,98,0,0,0,18,1,62493), +(242709,-1,'','','','','Character Bank Tab Bag (DNT)',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,0,0,0,0,0,1,1,0.990899980068206787,0,0,67375104,268437504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,-1,0,0,0,0,0,0,0,0,0,0,0,98,0,0,0,18,1,62493); diff --git a/sql/updates/world/master/2025_08_13_00_world.sql b/sql/updates/world/master/2025_08_13_00_world.sql new file mode 100644 index 00000000000..ce62921b66e --- /dev/null +++ b/sql/updates/world/master/2025_08_13_00_world.sql @@ -0,0 +1,3 @@ +ALTER TABLE `areatrigger_create_properties_orbit` CHANGE `StartDelay` `ExtraTimeForBlending` INT NOT NULL DEFAULT 0; + +ALTER TABLE `creature_template_difficulty` ADD `TypeFlags3` INT UNSIGNED NOT NULL DEFAULT 0 AFTER `TypeFlags2`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 037155d610a..e04b164acf3 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -93,7 +93,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " - "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " + "bankSlots, bankTabs, bankBagFlags, restState, playerFlags, playerFlagsEx, " "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " @@ -476,7 +476,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // Player saving PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " - "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " + "bankSlots, bankTabs, bankBagFlags, restState, playerFlags, playerFlagsEx, " "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " "taximask, createTime, createMode, cinematic, " "totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " @@ -484,9 +484,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " "power4, power5, power6, power7, power8, power9, power10, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,inventoryBagFlags=?,bagSlotFlags1=?,bagSlotFlags2=?,bagSlotFlags3=?,bagSlotFlags4=?,bagSlotFlags5=?," - "bankSlots=?,bankBagFlags=?,bankBagSlotFlags1=?,bankBagSlotFlags2=?,bankBagSlotFlags3=?,bankBagSlotFlags4=?,bankBagSlotFlags5=?,bankBagSlotFlags6=?,bankBagSlotFlags7=?,restState=?,playerFlags=?,playerFlagsEx=?," + "bankSlots=?,bankTabs=?,bankBagFlags=?,restState=?,playerFlags=?,playerFlagsEx=?," "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,summonedPetNumber=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," @@ -682,12 +682,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS, "DELETE FROM character_trait_config WHERE guid = ? AND traitConfigId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS_BY_CHAR, "DELETE FROM character_trait_config WHERE guid = ?", CONNECTION_ASYNC); - // Void Storage - PrepareStatement(CHAR_SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?", CONNECTION_ASYNC); - // CompactUnitFrame profiles PrepareStatement(CHAR_SEL_CHAR_CUF_PROFILES, "SELECT id, name, frameHeight, frameWidth, sortBy, healthText, boolOptions, topPoint, bottomPoint, leftPoint, topOffset, bottomOffset, leftOffset FROM character_cuf_profiles WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_CHAR_CUF_PROFILES, "REPLACE INTO character_cuf_profiles (guid, id, name, frameHeight, frameWidth, sortBy, healthText, boolOptions, topPoint, bottomPoint, leftPoint, topOffset, bottomOffset, leftOffset) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); @@ -798,11 +792,17 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_INSTANCE, "INSERT INTO instance (instanceId, data, completedEncountersMask, entranceWorldSafeLocId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_PLAYER_DATA_ELEMENTS_CHARACTER, "SELECT playerDataElementCharacterId, floatValue, int64Value FROM character_player_data_element WHERE characterGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID, "DELETE FROM character_player_data_element WHERE characterGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PLAYER_DATA_ELEMENTS_CHARACTER, "DELETE FROM character_player_data_element WHERE characterGuid = ? AND playerDataElementCharacterId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PLAYER_DATA_ELEMENTS_CHARACTER, "INSERT INTO character_player_data_element (characterGuid, playerDataElementCharacterId, floatValue, int64Value) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_PLAYER_DATA_FLAGS_CHARACTER, "SELECT storageIndex, mask FROM character_player_data_flag WHERE characterGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID, "DELETE FROM character_player_data_flag WHERE characterGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PLAYER_DATA_FLAGS_CHARACTER, "DELETE FROM character_player_data_flag WHERE characterGuid = ? AND storageIndex = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PLAYER_DATA_FLAGS_CHARACTER, "INSERT INTO character_player_data_flag (characterGuid, storageIndex, mask) VALUES (?, ?, ?)", CONNECTION_ASYNC); + + PrepareStatement(CHAR_SEL_CHARACTER_BANK_TAB_SETTINGS, "SELECT tabId, name, icon, description, depositFlags FROM character_bank_tab_settings WHERE characterGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHARACTER_BANK_TAB_SETTINGS, "DELETE FROM character_bank_tab_settings WHERE characterGuid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHARACTER_BANK_TAB_SETTINGS, "INSERT INTO character_bank_tab_settings (characterGuid, tabId, name, icon, description, depositFlags) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); } CharacterDatabaseConnection::CharacterDatabaseConnection(MySQLConnectionInfo& connInfo, ConnectionFlags connectionFlags) : MySQLConnection(connInfo, connectionFlags) diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 98c80c96746..33205a47d39 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -550,11 +550,6 @@ enum CharacterDatabaseStatements : uint32 CHAR_DEL_CHAR_TRAIT_CONFIGS, CHAR_DEL_CHAR_TRAIT_CONFIGS_BY_CHAR, - CHAR_SEL_CHAR_VOID_STORAGE, - CHAR_REP_CHAR_VOID_STORAGE_ITEM, - CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, - CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, - CHAR_SEL_CHAR_CUF_PROFILES, CHAR_REP_CHAR_CUF_PROFILES, CHAR_DEL_CHAR_CUF_PROFILES_BY_ID, @@ -651,12 +646,18 @@ enum CharacterDatabaseStatements : uint32 CHAR_INS_INSTANCE, CHAR_SEL_PLAYER_DATA_ELEMENTS_CHARACTER, + CHAR_DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID, CHAR_DEL_PLAYER_DATA_ELEMENTS_CHARACTER, CHAR_INS_PLAYER_DATA_ELEMENTS_CHARACTER, CHAR_SEL_PLAYER_DATA_FLAGS_CHARACTER, + CHAR_DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID, CHAR_DEL_PLAYER_DATA_FLAGS_CHARACTER, CHAR_INS_PLAYER_DATA_FLAGS_CHARACTER, + CHAR_SEL_CHARACTER_BANK_TAB_SETTINGS, + CHAR_DEL_CHARACTER_BANK_TAB_SETTINGS, + CHAR_INS_CHARACTER_BANK_TAB_SETTINGS, + MAX_CHARACTERDATABASE_STATEMENTS }; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 308d83da6b9..d1842b927be 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -227,9 +227,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() "AzeriteUnlockMappingSetID FROM azerite_unlock_mapping WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_AZERITE_UNLOCK_MAPPING, "SELECT MAX(ID) + 1 FROM azerite_unlock_mapping", CONNECTION_SYNCH); - // BankBagSlotPrices.db2 - PrepareStatement(HOTFIX_SEL_BANK_BAG_SLOT_PRICES, "SELECT ID, Cost FROM bank_bag_slot_prices WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_BANK_BAG_SLOT_PRICES, "SELECT MAX(ID) + 1 FROM bank_bag_slot_prices", CONNECTION_SYNCH); + // BankTab.db2 + PrepareStatement(HOTFIX_SEL_BANK_TAB, "SELECT ID, Cost, BankType, OrderIndex, PlayerConditionID, PurchasePromptTitle, PurchasePromptBody, " + "PurchasePromptConfirmation, TabCleanupConfirmation, TabNameEditBoxHeader FROM bank_tab WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_BANK_TAB, "SELECT MAX(ID) + 1 FROM bank_tab", CONNECTION_SYNCH); // BannedAddons.db2 PrepareStatement(HOTFIX_SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); @@ -304,8 +305,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CFG_CATEGORIES, "SELECT ID, Name_lang FROM cfg_categories_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // CfgRegions.db2 - PrepareStatement(HOTFIX_SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin, TimeEventRegionGroupID" + " FROM cfg_regions WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CFG_REGIONS, "SELECT MAX(ID) + 1 FROM cfg_regions", CONNECTION_SYNCH); // ChallengeModeItemBonusOverride.db2 @@ -349,12 +350,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ChrClasses.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " "HyphenatedNameMale, HyphenatedNameFemale, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " - "SpellTextureBlobFileDataID, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " + "StartingLevel, SpellTextureBlobFileDataID, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " "MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " "CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " - "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, ID, PrimaryStatPriority, DisplayPower, " - "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ClassColorR, ClassColorG, ClassColorB, RolesMask" - " FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, ID, HasStrengthBonus, PrimaryStatPriority, DisplayPower, " + "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ClassColorR, ClassColorG, ClassColorB, RolesMask, " + "DamageBonusStat, HasRelicSlot FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT MAX(ID) + 1 FROM chr_classes", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " "DisabledString_lang, HyphenatedNameMale_lang, HyphenatedNameFemale_lang FROM chr_classes_locale WHERE (`VerifiedBuild` > 0) = ?" @@ -508,7 +509,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // CreatureFamily.db2 PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " - "IconFileID, SkillLine1, SkillLine2 FROM creature_family WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "CategoryEnumID, IconFileID, SkillLine1, SkillLine2 FROM creature_family WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT MAX(ID) + 1 FROM creature_family", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -618,7 +619,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ExpectedStat.db2 PrepareStatement(HOTFIX_SEL_EXPECTED_STAT, "SELECT ID, ExpansionID, CreatureHealth, PlayerHealth, CreatureAutoAttackDps, CreatureArmor, " - "PlayerMana, PlayerPrimaryStat, PlayerSecondaryStat, ArmorConstant, CreatureSpellDamage, Lvl FROM expected_stat" + "PlayerMana, PlayerPrimaryStat, PlayerSecondaryStat, ArmorConstant, CreatureSpellDamage, ContentSetID, Lvl FROM expected_stat" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_EXPECTED_STAT, "SELECT MAX(ID) + 1 FROM expected_stat", CONNECTION_SYNCH); @@ -1028,7 +1029,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name_lang FROM item_set_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // ItemSetSpell.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, Threshold, ItemSetID FROM item_set_spell" + PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, TraitSubTreeID, Threshold, ItemSetID FROM item_set_spell" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT MAX(ID) + 1 FROM item_set_spell", CONNECTION_SYNCH); @@ -1168,7 +1169,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() // MapChallengeMode.db2 PrepareStatement(HOTFIX_SEL_MAP_CHALLENGE_MODE, "SELECT Name, ID, MapID, Flags, ExpansionLevel, RequiredWorldStateID, CriteriaCount1, " - "CriteriaCount2, CriteriaCount3 FROM map_challenge_mode WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "CriteriaCount2, CriteriaCount3, FirstRewardQuestID1, FirstRewardQuestID2, FirstRewardQuestID3, FirstRewardQuestID4, FirstRewardQuestID5, " + "FirstRewardQuestID6, RewardQuestID1, RewardQuestID2, RewardQuestID3, RewardQuestID4, RewardQuestID5, RewardQuestID6 FROM map_challenge_mode" + " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_MAP_CHALLENGE_MODE, "SELECT MAX(ID) + 1 FROM map_challenge_mode", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP_CHALLENGE_MODE, "SELECT ID, Name_lang FROM map_challenge_mode_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); @@ -1755,8 +1758,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_VISUAL_EFFECT_NAME, "SELECT MAX(ID) + 1 FROM spell_visual_effect_name", CONNECTION_SYNCH); // SpellVisualKit.db2 - PrepareStatement(HOTFIX_SEL_SPELL_VISUAL_KIT, "SELECT ID, ClutterLevel, FallbackSpellVisualKitId, DelayMin, DelayMax, Flags1, Flags2" - " FROM spell_visual_kit WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_VISUAL_KIT, "SELECT ID, ClutterLevel, FallbackSpellVisualKitId, DelayMin, DelayMax, " + "MinimumSpellVisualDensityFilterType, MinimumSpellVisualDensityFilterParam, ReducedSpellVisualDensityFilterType, " + "ReducedSpellVisualDensityFilterParam, Flags1, Flags2 FROM spell_visual_kit WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_VISUAL_KIT, "SELECT MAX(ID) + 1 FROM spell_visual_kit", CONNECTION_SYNCH); // SpellVisualMissile.db2 @@ -2048,12 +2052,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_VIGNETTE, "SELECT ID, Name_lang FROM vignette_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); // WarbandScene.db2 - PrepareStatement(HOTFIX_SEL_WARBAND_SCENE, "SELECT Name, Description, Source, PositionX, PositionY, PositionZ, LookAtX, LookAtY, LookAtZ, ID, " - "MapID, Fov, TimeOfDay, Flags, SoundAmbienceID, Quality, TextureKit, DefaultScenePriority, SourceType FROM warband_scene" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WARBAND_SCENE, "SELECT Name, Description, PositionX, PositionY, PositionZ, LookAtX, LookAtY, LookAtZ, ID, MapID, Fov, " + "TimeOfDay, Flags, SoundAmbienceID, Quality, TextureKit, DefaultScenePriority FROM warband_scene WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_WARBAND_SCENE, "SELECT MAX(ID) + 1 FROM warband_scene", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_WARBAND_SCENE, "SELECT ID, Name_lang, Description_lang, Source_lang FROM warband_scene_locale" - " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_WARBAND_SCENE, "SELECT ID, Name_lang, Description_lang FROM warband_scene_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?", CONNECTION_SYNCH); // WmoAreaTable.db2 PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT AreaName, ID, WmoID, NameSetID, WmoGroupID, SoundProviderPref, SoundProviderPrefUnderwater, " diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 3748de79cad..3ac94d32d7a 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -147,8 +147,8 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_AZERITE_UNLOCK_MAPPING, HOTFIX_SEL_AZERITE_UNLOCK_MAPPING_MAX_ID, - HOTFIX_SEL_BANK_BAG_SLOT_PRICES, - HOTFIX_SEL_BANK_BAG_SLOT_PRICES_MAX_ID, + HOTFIX_SEL_BANK_TAB, + HOTFIX_SEL_BANK_TAB_MAX_ID, HOTFIX_SEL_BANNED_ADDONS, HOTFIX_SEL_BANNED_ADDONS_MAX_ID, diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index eacc492e97a..3e1b4887956 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -792,6 +792,19 @@ void CriteriaHandler::UpdateCriteria(Criteria const* criteria, uint64 miscValue1 case CriteriaType::GuildAttainedLevel: SetCriteriaProgress(criteria, miscValue1, referencePlayer); break; + case CriteriaType::BankTabPurchased: + switch (BankType(criteria->Entry->Asset.BankType)) + { + case BankType::Character: + SetCriteriaProgress(criteria, referencePlayer->GetCharacterBankTabCount(), referencePlayer); + break; + case BankType::Account: + SetCriteriaProgress(criteria, referencePlayer->GetAccountBankTabCount(), referencePlayer); + break; + default: + break; + } + break; // FIXME: not triggered in code as result, need to implement case CriteriaType::RunInstance: case CriteriaType::EarnTeamArenaRating: @@ -1237,6 +1250,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CriteriaType::SellItemsToVendors: case CriteriaType::GainLevels: case CriteriaType::ReachRenownLevel: + case CriteriaType::BankTabPurchased: case CriteriaType::LearnTaxiNode: return progress->Counter >= requiredAmount; case CriteriaType::EarnAchievement: @@ -1691,6 +1705,10 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis if (!referencePlayer->IsMaxLevel()) return false; break; + case CriteriaType::BankTabPurchased: + if (miscValue1 /*allow any at login*/ && miscValue1 != uint32(criteria->Entry->Asset.BankType)) + return false; + break; case CriteriaType::LearnTaxiNode: if (miscValue1 != uint32(criteria->Entry->Asset.TaxiNodesID)) return false; @@ -4546,8 +4564,8 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaType type) return "GainLevels"; case CriteriaType::CompleteQuestsCountOnAccount: return "CompleteQuestsCountOnAccount"; - case CriteriaType::WarbandBankTabPurchased: - return "WarbandBankTabPurchased"; + case CriteriaType::BankTabPurchased: + return "BankTabPurchased"; case CriteriaType::ReachRenownLevel: return "ReachRenownLevel"; case CriteriaType::LearnTaxiNode: @@ -5036,7 +5054,7 @@ std::span<CriteriaType const> CriteriaMgr::GetRetroactivelyUpdateableCriteriaTyp //CriteriaType::MythicPlusRatingAttained, /*NYI*/ //CriteriaType::MythicPlusDisplaySeasonEnded, /*NYI*/ //CriteriaType::CompleteTrackingQuest, /*NYI*/ - //CriteriaType::WarbandBankTabPurchased, /*NYI*/ + CriteriaType::BankTabPurchased, CriteriaType::LearnTaxiNode, CriteriaType::EarnAchievementPoints, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 926c5095f0a..65244d6ddf8 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -127,7 +127,7 @@ struct AnimationDataLoadInfo { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "Fallback" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "BehaviorTier" }, + { .IsSigned = true, .Type = FT_BYTE, .Name = "BehaviorTier" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "BehaviorID" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags1" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags2" }, @@ -606,15 +606,23 @@ struct AzeriteUnlockMappingLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 6, &AzeriteUnlockMappingMeta::Instance, HOTFIX_SEL_AZERITE_UNLOCK_MAPPING }; }; -struct BankBagSlotPricesLoadInfo +struct BankTabLoadInfo { - static constexpr DB2FieldMeta Fields[2] = + static constexpr DB2FieldMeta Fields[10] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, - { .IsSigned = false, .Type = FT_INT, .Name = "Cost" }, + { .IsSigned = false, .Type = FT_LONG, .Name = "Cost" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "BankType" }, + { .IsSigned = true, .Type = FT_BYTE, .Name = "OrderIndex" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PlayerConditionID" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PurchasePromptTitle" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PurchasePromptBody" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PurchasePromptConfirmation" }, + { .IsSigned = true, .Type = FT_INT, .Name = "TabCleanupConfirmation" }, + { .IsSigned = true, .Type = FT_INT, .Name = "TabNameEditBoxHeader" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 2, &BankBagSlotPricesMeta::Instance, HOTFIX_SEL_BANK_BAG_SLOT_PRICES }; + static constexpr DB2LoadInfo Instance{ Fields, 10, &BankTabMeta::Instance, HOTFIX_SEL_BANK_TAB }; }; struct BannedAddonsLoadInfo @@ -624,7 +632,7 @@ struct BannedAddonsLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Version" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, }; static constexpr DB2LoadInfo Instance{ Fields, 4, &BannedAddonsMeta::Instance, HOTFIX_SEL_BANNED_ADDONS }; @@ -819,7 +827,7 @@ struct CfgCategoriesLoadInfo struct CfgRegionsLoadInfo { - static constexpr DB2FieldMeta Fields[6] = + static constexpr DB2FieldMeta Fields[7] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Tag" }, @@ -827,9 +835,10 @@ struct CfgRegionsLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "Raidorigin" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "RegionGroupMask" }, { .IsSigned = false, .Type = FT_INT, .Name = "ChallengeOrigin" }, + { .IsSigned = true, .Type = FT_INT, .Name = "TimeEventRegionGroupID" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 6, &Cfg_RegionsMeta::Instance, HOTFIX_SEL_CFG_REGIONS }; + static constexpr DB2LoadInfo Instance{ Fields, 7, &Cfg_RegionsMeta::Instance, HOTFIX_SEL_CFG_REGIONS }; }; struct ChallengeModeItemBonusOverrideLoadInfo @@ -869,7 +878,7 @@ struct CharTitlesLoadInfo { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Name1" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "MaskID" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, }; static constexpr DB2LoadInfo Instance{ Fields, 5, &CharTitlesMeta::Instance, HOTFIX_SEL_CHAR_TITLES }; @@ -931,7 +940,7 @@ struct ChrClassUiDisplayLoadInfo struct ChrClassesLoadInfo { - static constexpr DB2FieldMeta Fields[39] = + static constexpr DB2FieldMeta Fields[43] = { { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Filename" }, @@ -948,6 +957,7 @@ struct ChrClassesLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "IconFileDataID" }, { .IsSigned = false, .Type = FT_INT, .Name = "LowResScreenFileDataID" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "StartingLevel" }, { .IsSigned = false, .Type = FT_INT, .Name = "SpellTextureBlobFileDataID" }, { .IsSigned = false, .Type = FT_INT, .Name = "ArmorTypeMask" }, { .IsSigned = true, .Type = FT_INT, .Name = "CharStartKitUnknown901" }, @@ -962,6 +972,7 @@ struct ChrClassesLoadInfo { .IsSigned = false, .Type = FT_SHORT, .Name = "CinematicSequenceID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "DefaultSpec" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "ID" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "HasStrengthBonus" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "PrimaryStatPriority" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "DisplayPower" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "RangedAttackPowerPerAgility" }, @@ -972,9 +983,11 @@ struct ChrClassesLoadInfo { .IsSigned = false, .Type = FT_BYTE, .Name = "ClassColorG" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "ClassColorB" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "RolesMask" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "DamageBonusStat" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "HasRelicSlot" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 39, &ChrClassesMeta::Instance, HOTFIX_SEL_CHR_CLASSES }; + static constexpr DB2LoadInfo Instance{ Fields, 43, &ChrClassesMeta::Instance, HOTFIX_SEL_CHR_CLASSES }; }; struct ChrClassesXPowerTypesLoadInfo @@ -1458,7 +1471,7 @@ struct CreatureDisplayInfoExtraLoadInfo struct CreatureFamilyLoadInfo { - static constexpr DB2FieldMeta Fields[11] = + static constexpr DB2FieldMeta Fields[12] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, @@ -1468,12 +1481,13 @@ struct CreatureFamilyLoadInfo { .IsSigned = true, .Type = FT_BYTE, .Name = "MaxScaleLevel" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "PetFoodMask" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "PetTalentType" }, + { .IsSigned = true, .Type = FT_INT, .Name = "CategoryEnumID" }, { .IsSigned = true, .Type = FT_INT, .Name = "IconFileID" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "SkillLine1" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "SkillLine2" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 11, &CreatureFamilyMeta::Instance, HOTFIX_SEL_CREATURE_FAMILY }; + static constexpr DB2LoadInfo Instance{ Fields, 12, &CreatureFamilyMeta::Instance, HOTFIX_SEL_CREATURE_FAMILY }; }; struct CreatureLabelLoadInfo @@ -1838,7 +1852,7 @@ struct EmotesTextSoundLoadInfo struct ExpectedStatLoadInfo { - static constexpr DB2FieldMeta Fields[12] = + static constexpr DB2FieldMeta Fields[13] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = true, .Type = FT_INT, .Name = "ExpansionID" }, @@ -1851,10 +1865,11 @@ struct ExpectedStatLoadInfo { .IsSigned = false, .Type = FT_FLOAT, .Name = "PlayerSecondaryStat" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "ArmorConstant" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "CreatureSpellDamage" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ContentSetID" }, { .IsSigned = false, .Type = FT_INT, .Name = "Lvl" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 12, &ExpectedStatMeta::Instance, HOTFIX_SEL_EXPECTED_STAT }; + static constexpr DB2LoadInfo Instance{ Fields, 13, &ExpectedStatMeta::Instance, HOTFIX_SEL_EXPECTED_STAT }; }; struct ExpectedStatModLoadInfo @@ -2667,7 +2682,7 @@ struct ItemLoadInfo static constexpr DB2FieldMeta Fields[12] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "ClassID" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ClassID" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "SubclassID" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "Material" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "InventoryType" }, @@ -3232,16 +3247,17 @@ struct ItemSetLoadInfo struct ItemSetSpellLoadInfo { - static constexpr DB2FieldMeta Fields[5] = + static constexpr DB2FieldMeta Fields[6] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "ChrSpecID" }, { .IsSigned = false, .Type = FT_INT, .Name = "SpellID" }, + { .IsSigned = false, .Type = FT_SHORT, .Name = "TraitSubTreeID" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "Threshold" }, { .IsSigned = false, .Type = FT_INT, .Name = "ItemSetID" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 5, &ItemSetSpellMeta::Instance, HOTFIX_SEL_ITEM_SET_SPELL }; + static constexpr DB2LoadInfo Instance{ Fields, 6, &ItemSetSpellMeta::Instance, HOTFIX_SEL_ITEM_SET_SPELL }; }; struct ItemSparseLoadInfo @@ -3809,20 +3825,32 @@ struct MapLoadInfo struct MapChallengeModeLoadInfo { - static constexpr DB2FieldMeta Fields[9] = + static constexpr DB2FieldMeta Fields[21] = { { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "MapID" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, { .IsSigned = false, .Type = FT_INT, .Name = "ExpansionLevel" }, { .IsSigned = true, .Type = FT_INT, .Name = "RequiredWorldStateID" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "CriteriaCount1" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "CriteriaCount2" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "CriteriaCount3" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID1" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID2" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID3" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID4" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID5" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID6" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID1" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID2" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID3" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID4" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID5" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID6" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 9, &MapChallengeModeMeta::Instance, HOTFIX_SEL_MAP_CHALLENGE_MODE }; + static constexpr DB2LoadInfo Instance{ Fields, 21, &MapChallengeModeMeta::Instance, HOTFIX_SEL_MAP_CHALLENGE_MODE }; }; struct MapDifficultyLoadInfo @@ -5131,8 +5159,8 @@ struct SpellCategoryLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "UsesPerWeek" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "MaxCharges" }, + { .IsSigned = true, .Type = FT_INT, .Name = "UsesPerWeek" }, + { .IsSigned = true, .Type = FT_INT, .Name = "MaxCharges" }, { .IsSigned = true, .Type = FT_INT, .Name = "ChargeRecoveryTime" }, { .IsSigned = true, .Type = FT_INT, .Name = "TypeMask" }, }; @@ -5261,7 +5289,7 @@ struct SpellEquippedItemsLoadInfo { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = true, .Type = FT_INT, .Name = "SpellID" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "EquippedItemClass" }, + { .IsSigned = true, .Type = FT_INT, .Name = "EquippedItemClass" }, { .IsSigned = true, .Type = FT_INT, .Name = "EquippedItemInvTypes" }, { .IsSigned = true, .Type = FT_INT, .Name = "EquippedItemSubclass" }, }; @@ -5783,18 +5811,22 @@ struct SpellVisualEffectNameLoadInfo struct SpellVisualKitLoadInfo { - static constexpr DB2FieldMeta Fields[7] = + static constexpr DB2FieldMeta Fields[11] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = true, .Type = FT_INT, .Name = "ClutterLevel" }, { .IsSigned = true, .Type = FT_INT, .Name = "FallbackSpellVisualKitId" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "DelayMin" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "DelayMax" }, + { .IsSigned = true, .Type = FT_INT, .Name = "MinimumSpellVisualDensityFilterType" }, + { .IsSigned = true, .Type = FT_INT, .Name = "MinimumSpellVisualDensityFilterParam" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ReducedSpellVisualDensityFilterType" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ReducedSpellVisualDensityFilterParam" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags1" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags2" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 7, &SpellVisualKitMeta::Instance, HOTFIX_SEL_SPELL_VISUAL_KIT }; + static constexpr DB2LoadInfo Instance{ Fields, 11, &SpellVisualKitMeta::Instance, HOTFIX_SEL_SPELL_VISUAL_KIT }; }; struct SpellVisualMissileLoadInfo @@ -6622,7 +6654,7 @@ struct UnitPowerBarLoadInfo { .IsSigned = false, .Type = FT_FLOAT, .Name = "RegenerationPeace" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "RegenerationCombat" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "BarType" }, - { .IsSigned = false, .Type = FT_SHORT, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "StartInset" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "EndInset" }, { .IsSigned = true, .Type = FT_INT, .Name = "FileDataID1" }, @@ -6778,11 +6810,10 @@ struct VignetteLoadInfo struct WarbandSceneLoadInfo { - static constexpr DB2FieldMeta Fields[19] = + static constexpr DB2FieldMeta Fields[17] = { { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Description" }, - { .IsSigned = false, .Type = FT_STRING, .Name = "Source" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" }, @@ -6798,10 +6829,9 @@ struct WarbandSceneLoadInfo { .IsSigned = true, .Type = FT_BYTE, .Name = "Quality" }, { .IsSigned = true, .Type = FT_INT, .Name = "TextureKit" }, { .IsSigned = true, .Type = FT_INT, .Name = "DefaultScenePriority" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "SourceType" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 19, &WarbandSceneMeta::Instance, HOTFIX_SEL_WARBAND_SCENE }; + static constexpr DB2LoadInfo Instance{ Fields, 17, &WarbandSceneMeta::Instance, HOTFIX_SEL_WARBAND_SCENE }; }; struct WmoAreaTableLoadInfo diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 33da4246e1f..aa6cf7289bb 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -718,7 +718,7 @@ struct AnimationDataMeta static constexpr DB2MetaField Fields[4] = { { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 2, .IsSigned = true }, }; @@ -730,7 +730,7 @@ struct AnimationDataMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0x18A959FC, + .LayoutHash = 0xBBF66A3C, .Fields = Fields }; }; @@ -1822,12 +1822,17 @@ struct BankBagSlotPricesMeta struct BankTabMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[9] = { { .Type = FT_LONG, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -1835,9 +1840,9 @@ struct BankTabMeta .FileDataId = 5242411, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 4, - .FileFieldCount = 4, - .LayoutHash = 0xD47B62CA, + .FieldCount = 9, + .FileFieldCount = 9, + .LayoutHash = 0x5B2F9B36, .Fields = Fields }; }; @@ -1848,7 +1853,7 @@ struct BannedAddonsMeta { { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -1858,7 +1863,7 @@ struct BannedAddonsMeta .ParentIndexField = -1, .FieldCount = 3, .FileFieldCount = 3, - .LayoutHash = 0xC7F734D9, + .LayoutHash = 0x56583F69, .Fields = Fields }; }; @@ -2778,13 +2783,14 @@ struct Cfg_GameRulesMeta struct Cfg_RegionsMeta { - static constexpr DB2MetaField Fields[5] = + static constexpr DB2MetaField Fields[6] = { { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -2792,9 +2798,28 @@ struct Cfg_RegionsMeta .FileDataId = 1082876, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 5, - .FileFieldCount = 5, - .LayoutHash = 0x8CDAAC27, + .FieldCount = 6, + .FileFieldCount = 6, + .LayoutHash = 0xFB9CBD8A, + .Fields = Fields + }; +}; + +struct Cfg_TimeEventRegionGroupMeta +{ + static constexpr DB2MetaField Fields[1] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 3055692, + .IndexField = -1, + .ParentIndexField = -1, + .FieldCount = 1, + .FileFieldCount = 1, + .LayoutHash = 0x5F8D94FE, .Fields = Fields }; }; @@ -2823,6 +2848,52 @@ struct ChallengeModeItemBonusOverrideMeta }; }; +struct ChallengeModeRewardMeta +{ + static constexpr DB2MetaField Fields[8] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6982016, + .IndexField = 0, + .ParentIndexField = -1, + .FieldCount = 8, + .FileFieldCount = 8, + .LayoutHash = 0xCBC6D48A, + .Fields = Fields + }; +}; + +struct ChallengeModeXRewardMeta +{ + static constexpr DB2MetaField Fields[2] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6984186, + .IndexField = -1, + .ParentIndexField = 1, + .FieldCount = 2, + .FileFieldCount = 1, + .LayoutHash = 0x186816F5, + .Fields = Fields + }; +}; + struct CharBaseInfoMeta { static constexpr DB2MetaField Fields[3] = @@ -3065,7 +3136,7 @@ struct CharTitlesMeta { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -3075,7 +3146,7 @@ struct CharTitlesMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0x1EEF17FF, + .LayoutHash = 0x2F5DFF7F, .Fields = Fields }; }; @@ -3352,7 +3423,7 @@ struct ChrClassVillainMeta struct ChrClassesMeta { - static constexpr DB2MetaField Fields[39] = + static constexpr DB2MetaField Fields[43] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, @@ -3369,6 +3440,7 @@ struct ChrClassesMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -3383,6 +3455,7 @@ struct ChrClassesMeta { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, @@ -3393,16 +3466,18 @@ struct ChrClassesMeta { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, }; static constexpr DB2Meta Instance = { .FileDataId = 1361031, - .IndexField = 28, + .IndexField = 29, .ParentIndexField = -1, - .FieldCount = 39, - .FileFieldCount = 39, - .LayoutHash = 0x03A0FD4D, + .FieldCount = 43, + .FileFieldCount = 43, + .LayoutHash = 0xAFC9B0C2, .Fields = Fields }; }; @@ -5523,7 +5598,7 @@ struct CreatureMeta { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 3, .IsSigned = true }, @@ -5536,7 +5611,7 @@ struct CreatureMeta .ParentIndexField = -1, .FieldCount = 11, .FileFieldCount = 11, - .LayoutHash = 0xAEA084C0, + .LayoutHash = 0x6E14C900, .Fields = Fields }; }; @@ -5549,7 +5624,7 @@ struct CreatureDifficultyMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_INT, .ArraySize = 8, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 9, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -5560,7 +5635,7 @@ struct CreatureDifficultyMeta .ParentIndexField = 5, .FieldCount = 6, .FileFieldCount = 5, - .LayoutHash = 0xFC42F936, + .LayoutHash = 0x29113DAF, .Fields = Fields }; }; @@ -5833,7 +5908,7 @@ struct CreatureDisplayXUIModelSceneMeta struct CreatureFamilyMeta { - static constexpr DB2MetaField Fields[9] = + static constexpr DB2MetaField Fields[10] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -5843,6 +5918,7 @@ struct CreatureFamilyMeta { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 2, .IsSigned = true }, }; @@ -5851,9 +5927,9 @@ struct CreatureFamilyMeta .FileDataId = 1351351, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 9, - .FileFieldCount = 9, - .LayoutHash = 0x4EBC1C18, + .FieldCount = 10, + .FileFieldCount = 10, + .LayoutHash = 0x7FE3CBA7, .Fields = Fields }; }; @@ -6387,7 +6463,7 @@ struct DeathThudLookupsMeta struct DecalPropertiesMeta { - static constexpr DB2MetaField Fields[25] = + static constexpr DB2MetaField Fields[28] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -6411,6 +6487,9 @@ struct DecalPropertiesMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, @@ -6421,9 +6500,9 @@ struct DecalPropertiesMeta .FileDataId = 1278176, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 25, - .FileFieldCount = 25, - .LayoutHash = 0x6F09046F, + .FieldCount = 28, + .FileFieldCount = 28, + .LayoutHash = 0xBED177F0, .Fields = Fields }; }; @@ -6984,7 +7063,7 @@ struct ExhaustionMeta struct ExpectedStatMeta { - static constexpr DB2MetaField Fields[11] = + static constexpr DB2MetaField Fields[12] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -6997,16 +7076,17 @@ struct ExpectedStatMeta { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = { .FileDataId = 1937326, .IndexField = -1, - .ParentIndexField = 10, - .FieldCount = 11, - .FileFieldCount = 10, - .LayoutHash = 0xFD4F2D39, + .ParentIndexField = 11, + .FieldCount = 12, + .FileFieldCount = 11, + .LayoutHash = 0x0FD90F9C, .Fields = Fields }; }; @@ -10024,10 +10104,32 @@ struct HolidayNamesMeta }; }; +struct HolidayXTimeEventMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6905813, + .IndexField = -1, + .ParentIndexField = 2, + .FieldCount = 3, + .FileFieldCount = 2, + .LayoutHash = 0x3341B6A4, + .Fields = Fields + }; +}; + struct HolidaysMeta { - static constexpr DB2MetaField Fields[11] = + static constexpr DB2MetaField Fields[12] = { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, @@ -10044,11 +10146,11 @@ struct HolidaysMeta static constexpr DB2Meta Instance = { .FileDataId = 996357, - .IndexField = -1, + .IndexField = 0, .ParentIndexField = -1, - .FieldCount = 11, - .FileFieldCount = 11, - .LayoutHash = 0xDB91019C, + .FieldCount = 12, + .FileFieldCount = 12, + .LayoutHash = 0xB3A34A20, .Fields = Fields }; }; @@ -10186,7 +10288,7 @@ struct ItemMeta { static constexpr DB2MetaField Fields[11] = { - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, @@ -10206,7 +10308,7 @@ struct ItemMeta .ParentIndexField = -1, .FieldCount = 11, .FileFieldCount = 11, - .LayoutHash = 0xD43146DA, + .LayoutHash = 0x12C03F1A, .Fields = Fields }; }; @@ -11571,10 +11673,11 @@ struct ItemSetMeta struct ItemSetSpellMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[5] = { { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -11583,10 +11686,10 @@ struct ItemSetSpellMeta { .FileDataId = 1314689, .IndexField = -1, - .ParentIndexField = 3, - .FieldCount = 4, - .FileFieldCount = 3, - .LayoutHash = 0xCDEF234D, + .ParentIndexField = 4, + .FieldCount = 5, + .FileFieldCount = 4, + .LayoutHash = 0x2666A73F, .Fields = Fields }; }; @@ -13180,25 +13283,6 @@ struct ManifestInterfaceItemIconMeta }; }; -struct ManifestInterfaceTOCDataMeta -{ - static constexpr DB2MetaField Fields[1] = - { - { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, - }; - - static constexpr DB2Meta Instance = - { - .FileDataId = 1267335, - .IndexField = -1, - .ParentIndexField = -1, - .FieldCount = 1, - .FileFieldCount = 1, - .LayoutHash = 0x4AB64495, - .Fields = Fields - }; -}; - struct MapMeta { static constexpr DB2MetaField Fields[25] = @@ -13265,15 +13349,17 @@ struct MapCelestialBodyMeta struct MapChallengeModeMeta { - static constexpr DB2MetaField Fields[7] = + static constexpr DB2MetaField Fields[9] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 3, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 6, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 6, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -13281,9 +13367,9 @@ struct MapChallengeModeMeta .FileDataId = 801709, .IndexField = 1, .ParentIndexField = 2, - .FieldCount = 7, - .FileFieldCount = 7, - .LayoutHash = 0xC31A3CC1, + .FieldCount = 9, + .FileFieldCount = 9, + .LayoutHash = 0x531A0D41, .Fields = Fields }; }; @@ -13600,7 +13686,7 @@ struct ModelFileDataMeta { { .Type = FT_FLOAT, .ArraySize = 6, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, }; @@ -13612,7 +13698,7 @@ struct ModelFileDataMeta .ParentIndexField = 4, .FieldCount = 5, .FileFieldCount = 5, - .LayoutHash = 0x1045BE38, + .LayoutHash = 0x2AE4E788, .Fields = Fields }; }; @@ -13771,7 +13857,7 @@ struct ModifiedCraftingReagentItemMeta struct ModifiedCraftingReagentSlotMeta { - static constexpr DB2MetaField Fields[6] = + static constexpr DB2MetaField Fields[7] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, @@ -13779,6 +13865,7 @@ struct ModifiedCraftingReagentSlotMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -13786,9 +13873,9 @@ struct ModifiedCraftingReagentSlotMeta .FileDataId = 3386488, .IndexField = 1, .ParentIndexField = -1, - .FieldCount = 6, - .FileFieldCount = 6, - .LayoutHash = 0x61863510, + .FieldCount = 7, + .FileFieldCount = 7, + .LayoutHash = 0x32F2149E, .Fields = Fields }; }; @@ -18402,7 +18489,7 @@ struct SoundKitMeta struct SoundKitAdvancedMeta { - static constexpr DB2MetaField Fields[56] = + static constexpr DB2MetaField Fields[57] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -18427,6 +18514,7 @@ struct SoundKitAdvancedMeta { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -18467,9 +18555,9 @@ struct SoundKitAdvancedMeta .FileDataId = 1237436, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 56, - .FileFieldCount = 56, - .LayoutHash = 0x3EE0D3A8, + .FieldCount = 57, + .FileFieldCount = 57, + .LayoutHash = 0xF65DB810, .Fields = Fields }; }; @@ -19019,8 +19107,8 @@ struct SpellCategoryMeta { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -19032,7 +19120,7 @@ struct SpellCategoryMeta .ParentIndexField = -1, .FieldCount = 6, .FileFieldCount = 6, - .LayoutHash = 0x1691EA31, + .LayoutHash = 0xB79B78E1, .Fields = Fields }; }; @@ -19391,7 +19479,7 @@ struct SpellEffectMeta .ParentIndexField = 28, .FieldCount = 29, .FileFieldCount = 28, - .LayoutHash = 0xE745F803, + .LayoutHash = 0x239B1B53, .Fields = Fields }; }; @@ -19492,7 +19580,7 @@ struct SpellEquippedItemsMeta static constexpr DB2MetaField Fields[4] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -19504,7 +19592,7 @@ struct SpellEquippedItemsMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0xEB6AC546, + .LayoutHash = 0xD9177916, .Fields = Fields }; }; @@ -20455,12 +20543,16 @@ struct SpellVisualEventMeta struct SpellVisualKitMeta { - static constexpr DB2MetaField Fields[5] = + static constexpr DB2MetaField Fields[9] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 2, .IsSigned = true }, }; @@ -20469,9 +20561,9 @@ struct SpellVisualKitMeta .FileDataId = 897949, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 5, - .FileFieldCount = 5, - .LayoutHash = 0x0B92E9E2, + .FieldCount = 9, + .FileFieldCount = 9, + .LayoutHash = 0x15838B24, .Fields = Fields }; }; @@ -20869,6 +20961,55 @@ struct TalentMeta }; }; +struct TalentTabMeta +{ + static constexpr DB2MetaField Fields[10] = + { + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 2, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 2178102, + .IndexField = -1, + .ParentIndexField = -1, + .FieldCount = 10, + .FileFieldCount = 10, + .LayoutHash = 0xB436F3C7, + .Fields = Fields + }; +}; + +struct TalentTreePrimarySpellsMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 5581887, + .IndexField = -1, + .ParentIndexField = -1, + .FieldCount = 3, + .FileFieldCount = 3, + .LayoutHash = 0x0C4D9DD6, + .Fields = Fields + }; +}; + struct TaxiNodesMeta { static constexpr DB2MetaField Fields[15] = @@ -21090,7 +21231,7 @@ struct TierTransitionMeta { static constexpr DB2MetaField Fields[4] = { - { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -21103,7 +21244,28 @@ struct TierTransitionMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0x2591A17F, + .LayoutHash = 0x6019C9CF, + .Fields = Fields + }; +}; + +struct TimeEventDataMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 3055910, + .IndexField = -1, + .ParentIndexField = 1, + .FieldCount = 3, + .FileFieldCount = 3, + .LayoutHash = 0x3E90B195, .Fields = Fields }; }; @@ -21661,11 +21823,12 @@ struct TraitSubTreeMeta struct TraitSystemMeta { - static constexpr DB2MetaField Fields[3] = + static constexpr DB2MetaField Fields[4] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -21673,9 +21836,9 @@ struct TraitSystemMeta .FileDataId = 4635649, .IndexField = 0, .ParentIndexField = -1, - .FieldCount = 3, - .FileFieldCount = 3, - .LayoutHash = 0x46225291, + .FieldCount = 4, + .FileFieldCount = 4, + .LayoutHash = 0xB304261C, .Fields = Fields }; }; @@ -22304,7 +22467,7 @@ struct UIEventToastMeta struct UIExpansionDisplayInfoMeta { - static constexpr DB2MetaField Fields[6] = + static constexpr DB2MetaField Fields[7] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -22312,6 +22475,7 @@ struct UIExpansionDisplayInfoMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -22319,9 +22483,9 @@ struct UIExpansionDisplayInfoMeta .FileDataId = 1729547, .IndexField = 0, .ParentIndexField = -1, - .FieldCount = 6, - .FileFieldCount = 6, - .LayoutHash = 0x4C41293C, + .FieldCount = 7, + .FileFieldCount = 7, + .LayoutHash = 0x788C5B88, .Fields = Fields }; }; @@ -23557,7 +23721,7 @@ struct UnitPowerBarMeta { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 6, .IsSigned = true }, @@ -23571,7 +23735,7 @@ struct UnitPowerBarMeta .ParentIndexField = -1, .FieldCount = 16, .FileFieldCount = 16, - .LayoutHash = 0x9840FB71, + .LayoutHash = 0x9F140C01, .Fields = Fields }; }; @@ -23968,13 +24132,35 @@ struct WMOMinimapTextureMeta }; }; +struct WarbandPlacementDisplayInfoMeta +{ + static constexpr DB2MetaField Fields[5] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6655794, + .IndexField = -1, + .ParentIndexField = 0, + .FieldCount = 5, + .FileFieldCount = 5, + .LayoutHash = 0x2998B81D, + .Fields = Fields + }; +}; + struct WarbandSceneMeta { - static constexpr DB2MetaField Fields[15] = + static constexpr DB2MetaField Fields[13] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 3, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 3, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, @@ -23986,17 +24172,16 @@ struct WarbandSceneMeta { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = { .FileDataId = 5736126, - .IndexField = 5, - .ParentIndexField = 6, - .FieldCount = 15, - .FileFieldCount = 15, - .LayoutHash = 0xF0593458, + .IndexField = 4, + .ParentIndexField = 5, + .FieldCount = 13, + .FileFieldCount = 13, + .LayoutHash = 0xDF56107A, .Fields = Fields }; }; @@ -24146,6 +24331,28 @@ struct WarbandScenePlcmntAnimOverrideMeta }; }; +struct WarbandSceneSourceInfoMeta +{ + static constexpr DB2MetaField Fields[4] = + { + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6388961, + .IndexField = 1, + .ParentIndexField = 2, + .FieldCount = 4, + .FileFieldCount = 4, + .LayoutHash = 0xEB093F55, + .Fields = Fields + }; +}; + struct WaterfallDataMeta { static constexpr DB2MetaField Fields[19] = @@ -24453,7 +24660,7 @@ struct WeatherMeta .ParentIndexField = -1, .FieldCount = 23, .FileFieldCount = 23, - .LayoutHash = 0x62855DFC, + .LayoutHash = 0x1628B83C, .Fields = Fields }; }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 0d26fbf5529..514cf7f9396 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -73,7 +73,7 @@ DB2Storage<AzeritePowerSetMemberEntry> sAzeritePowerSetMemberStore("Aze DB2Storage<AzeriteTierUnlockEntry> sAzeriteTierUnlockStore("AzeriteTierUnlock.db2", &AzeriteTierUnlockLoadInfo::Instance); DB2Storage<AzeriteTierUnlockSetEntry> sAzeriteTierUnlockSetStore("AzeriteTierUnlockSet.db2", &AzeriteTierUnlockSetLoadInfo::Instance); DB2Storage<AzeriteUnlockMappingEntry> sAzeriteUnlockMappingStore("AzeriteUnlockMapping.db2", &AzeriteUnlockMappingLoadInfo::Instance); -DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", &BankBagSlotPricesLoadInfo::Instance); +DB2Storage<BankTabEntry> sBankTabStore("BankTab.db2", &BankTabLoadInfo::Instance); DB2Storage<BannedAddonsEntry> sBannedAddonsStore("BannedAddons.db2", &BannedAddonsLoadInfo::Instance); DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", &BarberShopStyleLoadInfo::Instance); DB2Storage<BattlePetAbilityEntry> sBattlePetAbilityStore("BattlePetAbility.db2", &BattlePetAbilityLoadInfo::Instance); @@ -699,7 +699,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sAzeriteTierUnlockStore); LOAD_DB2(sAzeriteTierUnlockSetStore); LOAD_DB2(sAzeriteUnlockMappingStore); - LOAD_DB2(sBankBagSlotPricesStore); + LOAD_DB2(sBankTabStore); LOAD_DB2(sBannedAddonsStore); LOAD_DB2(sBarberShopStyleStore); LOAD_DB2(sBattlePetAbilityStore); @@ -1034,14 +1034,16 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } // Check loaded DB2 files proper version - if (!sAreaTableStore.LookupEntry(16108) || // last area added in 11.0.7 (58162) - !sCharTitlesStore.LookupEntry(876) || // last char title added in 11.0.7 (58162) + if (!sAreaTableStore.LookupEntry(16579) || // last area added in 11.2.0 (62213) + !sCharTitlesStore.LookupEntry(937) || // last char title added in 11.2.0 (62213) !sFlightCapabilityStore.LookupEntry(1) || // default flight capability (required) - !sGemPropertiesStore.LookupEntry(4266) || // last gem property added in 11.0.7 (58162) - !sItemStore.LookupEntry(235551) || // last item added in 11.0.7 (58162) - !sItemExtendedCostStore.LookupEntry(9918) || // last item extended cost added in 11.0.7 (58162) - !sMapStore.LookupEntry(2829) || // last map added in 11.0.7 (58162) - !sSpellNameStore.LookupEntry(1218101)) // last spell added in 11.0.7 (58162) + !sGemPropertiesStore.LookupEntry(4287) || // last gem property added in 11.2.0 (62213) + !sItemStore.LookupEntry(252009) || // last item added in 11.2.0 (62213) + !sItemSparseStore.LookupEntry(ITEM_ACCOUNT_BANK_TAB_BAG) || + !sItemSparseStore.LookupEntry(ITEM_CHARACTER_BANK_TAB_BAG) || + !sItemExtendedCostStore.LookupEntry(10637) || // last item extended cost added in 11.2.0 (62213) + !sMapStore.LookupEntry(2951) || // last map added in 11.2.0 (62213) + !sSpellNameStore.LookupEntry(1254022)) // last spell added in 11.2.0 (62213) { TC_LOG_FATAL("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); return 0; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index b90d247c83a..f5bef9577af 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -56,7 +56,7 @@ TC_GAME_API extern DB2Storage<AzeriteItemMilestonePowerEntry> sAzeriteItem TC_GAME_API extern DB2Storage<AzeriteLevelInfoEntry> sAzeriteLevelInfoStore; TC_GAME_API extern DB2Storage<AzeritePowerEntry> sAzeritePowerStore; TC_GAME_API extern DB2Storage<AzeriteUnlockMappingEntry> sAzeriteUnlockMappingStore; -TC_GAME_API extern DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore; +TC_GAME_API extern DB2Storage<BankTabEntry> sBankTabStore; TC_GAME_API extern DB2Storage<BannedAddonsEntry> sBannedAddonsStore; TC_GAME_API extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore; TC_GAME_API extern DB2Storage<BattlePetAbilityEntry> sBattlePetAbilityStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 3fe06f40106..c1f86a09c61 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -102,7 +102,7 @@ struct AnimationDataEntry { uint32 ID; uint16 Fallback; - uint8 BehaviorTier; + int8 BehaviorTier; int16 BehaviorID; std::array<int32, 2> Flags; }; @@ -425,10 +425,18 @@ struct AzeriteUnlockMappingEntry uint32 AzeriteUnlockMappingSetID; }; -struct BankBagSlotPricesEntry +struct BankTabEntry { uint32 ID; - uint32 Cost; + uint64 Cost; + uint8 BankType; + int8 OrderIndex; + int32 PlayerConditionID; + int32 PurchasePromptTitle; + int32 PurchasePromptBody; + int32 PurchasePromptConfirmation; + int32 TabCleanupConfirmation; + int32 TabNameEditBoxHeader; }; struct BannedAddonsEntry @@ -436,7 +444,7 @@ struct BannedAddonsEntry uint32 ID; char const* Name; char const* Version; - uint8 Flags; + int32 Flags; }; struct BarberShopStyleEntry @@ -585,6 +593,7 @@ struct Cfg_RegionsEntry uint32 Raidorigin; // Date of first raid reset, all other resets are calculated as this date plus interval uint8 RegionGroupMask; uint32 ChallengeOrigin; + int32 TimeEventRegionGroupID; }; struct ChallengeModeItemBonusOverrideEntry @@ -612,7 +621,7 @@ struct CharTitlesEntry LocalizedString Name; LocalizedString Name1; int16 MaskID; - int8 Flags; + int32 Flags; }; struct CharacterLoadoutEntry @@ -671,6 +680,7 @@ struct ChrClassesEntry uint32 IconFileDataID; uint32 LowResScreenFileDataID; int32 Flags; + int32 StartingLevel; uint32 SpellTextureBlobFileDataID; uint32 ArmorTypeMask; int32 CharStartKitUnknown901; @@ -685,6 +695,7 @@ struct ChrClassesEntry uint16 CinematicSequenceID; uint16 DefaultSpec; uint8 ID; + uint8 HasStrengthBonus; int8 PrimaryStatPriority; int8 DisplayPower; uint8 RangedAttackPowerPerAgility; @@ -695,6 +706,8 @@ struct ChrClassesEntry uint8 ClassColorG; uint8 ClassColorB; uint8 RolesMask; + uint8 DamageBonusStat; + uint8 HasRelicSlot; }; struct ChrClassesXPowerTypesEntry @@ -1025,7 +1038,7 @@ struct CraftingQualityEntry // int32 LevelDeltaMax; // uint16 FactionID; // int32 ContentTuningID; -// int32 Flags[8]; +// int32 Flags[9]; // uint32 CreatureID; //}; @@ -1082,6 +1095,7 @@ struct CreatureFamilyEntry int8 MaxScaleLevel; int16 PetFoodMask; int8 PetTalentType; + int32 CategoryEnumID; int32 IconFileID; std::array<int16, 2> SkillLine; }; @@ -1344,6 +1358,9 @@ struct CriteriaEntry // CriteriaType::MythicPlusRatingAttained = 230 int32 DungeonScore; + // CriteriaType::BankTabPurchased = 260 + int32 BankType; + // CriteriaType::LearnTaxiNode = 262 int32 TaxiNodesID; } Asset; @@ -1599,6 +1616,7 @@ struct ExpectedStatEntry float PlayerSecondaryStat; float ArmorConstant; float CreatureSpellDamage; + int32 ContentSetID; uint32 Lvl; }; @@ -2162,7 +2180,7 @@ struct ImportPriceWeaponEntry struct ItemEntry { uint32 ID; - uint8 ClassID; + int32 ClassID; uint8 SubclassID; uint8 Material; int8 InventoryType; @@ -2494,6 +2512,7 @@ struct ItemSetSpellEntry uint32 ID; uint16 ChrSpecID; uint32 SpellID; + uint16 TraitSubTreeID; uint8 Threshold; uint32 ItemSetID; }; @@ -2861,6 +2880,7 @@ struct MapEntry case 1643: case 2222: case 2444: + case 2601: return true; default: return false; @@ -2888,10 +2908,12 @@ struct MapChallengeModeEntry LocalizedString Name; uint32 ID; uint16 MapID; - uint8 Flags; + int32 Flags; uint32 ExpansionLevel; int32 RequiredWorldStateID; // maybe? std::array<int16, 3> CriteriaCount; + std::array<int32, 6> FirstRewardQuestID; + std::array<int32, 6> RewardQuestID; }; struct MapDifficultyEntry @@ -3743,8 +3765,8 @@ struct SpellCategoryEntry uint32 ID; LocalizedString Name; int32 Flags; - uint8 UsesPerWeek; - int8 MaxCharges; + int32 UsesPerWeek; + int32 MaxCharges; int32 ChargeRecoveryTime; int32 TypeMask; }; @@ -3831,7 +3853,7 @@ struct SpellEquippedItemsEntry { uint32 ID; int32 SpellID; - int8 EquippedItemClass; + int32 EquippedItemClass; int32 EquippedItemInvTypes; int32 EquippedItemSubclass; }; @@ -4149,6 +4171,10 @@ struct SpellVisualKitEntry int32 FallbackSpellVisualKitId; uint16 DelayMin; uint16 DelayMax; + int32 MinimumSpellVisualDensityFilterType; + int32 MinimumSpellVisualDensityFilterParam; + int32 ReducedSpellVisualDensityFilterType; + int32 ReducedSpellVisualDensityFilterParam; std::array<int32, 2> Flags; }; @@ -4707,7 +4733,7 @@ struct UnitPowerBarEntry float RegenerationPeace; float RegenerationCombat; uint8 BarType; - uint16 Flags; + int32 Flags; float StartInset; float EndInset; std::array<int32, 6> FileDataID; @@ -4841,7 +4867,6 @@ struct WarbandSceneEntry { LocalizedString Name; LocalizedString Description; - LocalizedString Source; DBCPosition3D Position; DBCPosition3D LookAt; uint32 ID; @@ -4853,7 +4878,6 @@ struct WarbandSceneEntry int8 Quality; int32 TextureKit; int32 DefaultScenePriority; - int8 SourceType; EnumFlag<WarbandSceneFlags> GetFlags() const { return static_cast<WarbandSceneFlags>(Flags); } }; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 518f6ed81df..a0b47fd550f 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -791,11 +791,11 @@ enum class CriteriaType : int16 CompleteQuestsCountOnAccount = 257, /*NYI*/ - WarbandBankTabPurchased = 260, /*NYI*/ + BankTabPurchased = 260, // Bank Tab Purchased in {#BankType} ReachRenownLevel = 261, LearnTaxiNode = 262, - Count = 264 + Count = 270 }; enum class CriteriaTreeFlags : uint16 diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 868ad6fbbc1..f1bff65dc63 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -24,6 +24,8 @@ #include "Containers.h" #include "CreatureAISelector.h" #include "DB2Stores.h" +#include "G3DPosition.hpp" +#include "GameTime.h" #include "GridNotifiersImpl.h" #include "Language.h" #include "Log.h" @@ -46,15 +48,14 @@ #include <bit> AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _spawnId(0), _aurEff(nullptr), - _duration(0), _totalDuration(0), _timeSinceCreated(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()), - _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0), + _duration(0), _totalDuration(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()), + _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr) { m_objectType |= TYPEMASK_AREATRIGGER; m_objectTypeId = TYPEID_AREATRIGGER; m_updateFlag.Stationary = true; - m_updateFlag.AreaTrigger = true; m_entityFragments.Add(WowCS::EntityFragment::Tag_AreaTrigger, false); } @@ -146,7 +147,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti SetObjectScale(1.0f); SetDuration(duration); - _shape = GetCreateProperties()->Shape; + SetShape(GetCreateProperties()->Shape); auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); if (caster) @@ -199,6 +200,33 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti if (GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::VisualAnimIsDecay)) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::IsDecay), true); + AreaTriggerFieldFlags fieldFlags = [flags = GetCreateProperties()->Flags]() + { + AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) + fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape)) + fieldFlags |= AreaTriggerFieldFlags::DynamicShape; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + fieldFlags |= AreaTriggerFieldFlags::Attached; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir)) + fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain)) + fieldFlags |= AreaTriggerFieldFlags::FollowsTerrain; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior)) + fieldFlags |= AreaTriggerFieldFlags::AlwaysExterior; + return fieldFlags; + }(); + ReplaceAllAreaTriggerFlags(fieldFlags); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreationTime), GameTime::GetGameTimeMS()); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ScaleCurveId), GetCreateProperties()->ScaleCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::FacingCurveId), GetCreateProperties()->FacingCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MorphCurveId), GetCreateProperties()->MorphCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MoveCurveId), GetCreateProperties()->MoveCurveId); + if (caster) PhasingHandler::InheritPhaseShift(this, caster); else if (IsStaticSpawn() && spawnData) @@ -207,7 +235,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti PhasingHandler::InitDbPhaseShift(GetPhaseShift(), spawnData->phaseUseFlags, spawnData->phaseId, spawnData->phaseGroup); } - if (target && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) m_movementInfo.transport.guid = target->GetGUID(); if (!IsStaticSpawn()) @@ -218,7 +246,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti if (GetCreateProperties()->OrbitInfo) { AreaTriggerOrbitInfo orbit = *GetCreateProperties()->OrbitInfo; - if (target && GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) orbit.PathTarget = target->GetGUID(); else orbit.Center = pos; @@ -229,6 +257,10 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti { InitSplineOffsets(GetCreateProperties()->SplinePoints); } + else + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), int32(AreaTriggerPathType::None)); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Facing), _stationaryPosition.GetOrientation()); // movement on transport of areatriggers on unit is handled by themself TransportBase* transport = nullptr; @@ -307,7 +339,6 @@ bool AreaTrigger::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool /*addTo void AreaTrigger::Update(uint32 diff) { WorldObject::Update(diff); - _timeSinceCreated += diff; if (!IsStaticSpawn()) { @@ -318,18 +349,17 @@ void AreaTrigger::Update(uint32 diff) } else if (HasOrbit()) { - UpdateOrbitPosition(*std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement), diff); + UpdateOrbitPosition(); } - else if (GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + else if (HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) { if (Unit* target = GetTarget()) { float orientation = 0.0f; - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->FacingCurveId) - orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); + if (m_areaTriggerData->FacingCurveId) + orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) orientation += target->GetOrientation(); GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), orientation); @@ -337,20 +367,17 @@ void AreaTrigger::Update(uint32 diff) } else if (HasSplines()) { - UpdateSplinePosition(*std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement), diff); + UpdateSplinePosition(*_spline); } else { - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) + if (m_areaTriggerData->FacingCurveId) { - if (createProperties->FacingCurveId) - { - float orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) - orientation += _stationaryPosition.GetOrientation(); + float orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) + orientation += m_areaTriggerData->Facing; - SetOrientation(orientation); - } + SetOrientation(orientation); } UpdateShape(); @@ -381,6 +408,14 @@ void AreaTrigger::Remove() } } +uint32 AreaTrigger::GetTimeSinceCreated() const +{ + uint32 now = GameTime::GetGameTimeMS(); + if (now >= *m_areaTriggerData->CreationTime) + return now - *m_areaTriggerData->CreationTime; + return 0; +} + void AreaTrigger::SetOverrideScaleCurve(float overrideScale) { SetScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), overrideScale); @@ -467,9 +502,8 @@ float AreaTrigger::CalcCurrentScale() const float scale = 1.0f; if (m_areaTriggerData->OverrideScaleCurve->OverrideActive) scale *= std::max(GetScaleCurveValue(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale), 0.000001f); - else if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->ScaleCurveId) - scale *= std::max(sDB2Manager.GetCurveValueAt(createProperties->ScaleCurveId, GetScaleCurveProgress(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale)), 0.000001f); + else if (m_areaTriggerData->ScaleCurveId) + scale *= std::max(sDB2Manager.GetCurveValueAt(m_areaTriggerData->ScaleCurveId, GetScaleCurveProgress(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale)), 0.000001f); scale *= std::max(GetScaleCurveValue(*m_areaTriggerData->ExtraScaleCurve, m_areaTriggerData->TimeToTargetExtraScale), 0.000001f); @@ -609,29 +643,21 @@ void AreaTrigger::UpdateTargetList() { std::vector<Unit*> targetList; - switch (_shape.Type) + m_areaTriggerData->ShapeData.Visit([&]<typename ShapeType>(ShapeType const& shape) { - case AreaTriggerShapeType::Sphere: - SearchUnitInSphere(targetList); - break; - case AreaTriggerShapeType::Box: - SearchUnitInBox(targetList); - break; - case AreaTriggerShapeType::Polygon: - SearchUnitInPolygon(targetList); - break; - case AreaTriggerShapeType::Cylinder: - SearchUnitInCylinder(targetList); - break; - case AreaTriggerShapeType::Disk: - SearchUnitInDisk(targetList); - break; - case AreaTriggerShapeType::BoundedPlane: - SearchUnitInBoundedPlane(targetList); - break; - default: - break; - } + if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerSphere>) + this->SearchUnitInSphere(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBox>) + this->SearchUnitInBox(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerPolygon>) + this->SearchUnitInPolygon(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerCylinder>) + this->SearchUnitInCylinder(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerDisk>) + this->SearchUnitInDisk(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBoundedPlane>) + this->SearchUnitInBoundedPlane(shape, targetList); + }); if (GetTemplate()) { @@ -704,30 +730,28 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool } } -void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float radius = G3D::lerp(_shape.SphereDatas.Radius, _shape.SphereDatas.RadiusTarget, progress) * scale; + float radius = G3D::lerp(sphere.Radius, sphere.RadiusTarget, progress) * scale; SearchUnits(targetList, radius, true); } -void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float extentsX = G3D::lerp(_shape.BoxDatas.Extents[0], _shape.BoxDatas.ExtentsTarget[0], progress) * scale; - float extentsY = G3D::lerp(_shape.BoxDatas.Extents[1], _shape.BoxDatas.ExtentsTarget[1], progress) * scale; - float extentsZ = G3D::lerp(_shape.BoxDatas.Extents[2], _shape.BoxDatas.ExtentsTarget[2], progress) * scale; + float extentsX = G3D::lerp(box.Extents->Pos.GetPositionX(), box.ExtentsTarget->Pos.GetPositionX(), progress) * scale; + float extentsY = G3D::lerp(box.Extents->Pos.GetPositionY(), box.ExtentsTarget->Pos.GetPositionY(), progress) * scale; + float extentsZ = G3D::lerp(box.Extents->Pos.GetPositionZ(), box.ExtentsTarget->Pos.GetPositionZ(), progress) * scale; float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY); SearchUnits(targetList, radius, false); @@ -739,14 +763,13 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); - float height = G3D::lerp(_shape.PolygonDatas.Height, _shape.PolygonDatas.HeightTarget, progress); + float height = G3D::lerp(polygon.Height, polygon.HeightTarget, progress); float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -760,17 +783,16 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float radius = G3D::lerp(_shape.CylinderDatas.Radius, _shape.CylinderDatas.RadiusTarget, progress) * scale; - float height = G3D::lerp(_shape.CylinderDatas.Height, _shape.CylinderDatas.HeightTarget, progress); - if (!m_areaTriggerData->HeightIgnoresScale) + float radius = G3D::lerp(cylinder.Radius, cylinder.RadiusTarget, progress) * scale; + float height = G3D::lerp(cylinder.Height, cylinder.HeightTarget, progress); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale)) height *= scale; float minZ = GetPositionZ() - height; @@ -785,18 +807,17 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float innerRadius = G3D::lerp(_shape.DiskDatas.InnerRadius, _shape.DiskDatas.InnerRadiusTarget, progress) * scale; - float outerRadius = G3D::lerp(_shape.DiskDatas.OuterRadius, _shape.DiskDatas.OuterRadiusTarget, progress) * scale; - float height = G3D::lerp(_shape.DiskDatas.Height, _shape.DiskDatas.HeightTarget, progress); - if (!m_areaTriggerData->HeightIgnoresScale) + float innerRadius = G3D::lerp(disk.InnerRadius, disk.InnerRadiusTarget, progress) * scale; + float outerRadius = G3D::lerp(disk.OuterRadius, disk.OuterRadiusTarget, progress) * scale; + float height = G3D::lerp(disk.Height, disk.HeightTarget, progress); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale)) height *= scale; float minZ = GetPositionZ() - height; @@ -810,16 +831,15 @@ void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInBoundedPlane(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float extentsX = G3D::lerp(_shape.BoundedPlaneDatas.Extents[0], _shape.BoundedPlaneDatas.ExtentsTarget[0], progress) * scale; - float extentsY = G3D::lerp(_shape.BoundedPlaneDatas.Extents[1], _shape.BoundedPlaneDatas.ExtentsTarget[1], progress) * scale; + float extentsX = G3D::lerp(boundedPlane.Extents->Pos.GetPositionX(), boundedPlane.ExtentsTarget->Pos.GetPositionX(), progress) * scale; + float extentsY = G3D::lerp(boundedPlane.Extents->Pos.GetPositionY(), boundedPlane.ExtentsTarget->Pos.GetPositionY(), progress) * scale; float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY); SearchUnits(targetList, radius, false); @@ -885,9 +905,10 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) } } - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumUnitsInside), _insideUnits.size()); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumPlayersInside), - std::ranges::count_if(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); })); + if (std::ranges::any_of(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); })) + SetAreaTriggerFlag(AreaTriggerFieldFlags::HasPlayers); + else + RemoveAreaTriggerFlag(AreaTriggerFieldFlags::HasPlayers); if (IsStaticSpawn()) setActive(!_insideUnits.empty()); @@ -928,6 +949,83 @@ uint32 AreaTrigger::GetFaction() const return 0; } +void AreaTrigger::SetShape(AreaTriggerShapeInfo const& shape) +{ + auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); + + switch (shape.Type) + { + case AreaTriggerShapeType::Sphere: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 0); + auto sphere = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerSphere>); + SetUpdateFieldValue(sphere.ModifyValue(&UF::AreaTriggerSphere::Radius), shape.SphereDatas.Radius); + SetUpdateFieldValue(sphere.ModifyValue(&UF::AreaTriggerSphere::RadiusTarget), shape.SphereDatas.RadiusTarget); + break; + } + case AreaTriggerShapeType::Box: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 1); + auto box = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerBox>); + SetUpdateFieldValue(box.ModifyValue(&UF::AreaTriggerBox::Extents), { shape.BoxDatas.Extents[0], shape.BoxDatas.Extents[1], shape.BoxDatas.Extents[2] }); + SetUpdateFieldValue(box.ModifyValue(&UF::AreaTriggerBox::ExtentsTarget), { shape.BoxDatas.ExtentsTarget[0], shape.BoxDatas.ExtentsTarget[1], shape.BoxDatas.ExtentsTarget[2] }); + break; + } + case AreaTriggerShapeType::Polygon: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 3); + auto polygon = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerPolygon>); + auto vertices = polygon.ModifyValue(&UF::AreaTriggerPolygon::Vertices); + ClearDynamicUpdateFieldValues(vertices); + for (TaggedPosition<XY> const& vertex : shape.PolygonVertices) + AddDynamicUpdateFieldValue(vertices) = vertex; + auto verticesTarget = polygon.ModifyValue(&UF::AreaTriggerPolygon::VerticesTarget); + ClearDynamicUpdateFieldValues(verticesTarget); + for (TaggedPosition<XY> const& vertex : shape.PolygonVerticesTarget) + AddDynamicUpdateFieldValue(verticesTarget) = vertex; + SetUpdateFieldValue(polygon.ModifyValue(&UF::AreaTriggerPolygon::Height), shape.PolygonDatas.Height); + SetUpdateFieldValue(polygon.ModifyValue(&UF::AreaTriggerPolygon::HeightTarget), shape.PolygonDatas.HeightTarget); + break; + } + case AreaTriggerShapeType::Cylinder: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 4); + auto cylinder = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerCylinder>); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::Radius), shape.CylinderDatas.Radius); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::RadiusTarget), shape.CylinderDatas.RadiusTarget); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::Height), shape.CylinderDatas.Height); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::HeightTarget), shape.CylinderDatas.HeightTarget); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::LocationZOffset), shape.CylinderDatas.LocationZOffset); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::LocationZOffsetTarget), shape.CylinderDatas.LocationZOffsetTarget); + break; + } + case AreaTriggerShapeType::Disk: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 7); + auto disk = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerDisk>); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::InnerRadius), shape.DiskDatas.InnerRadius); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::InnerRadiusTarget), shape.DiskDatas.InnerRadiusTarget); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::OuterRadius), shape.DiskDatas.OuterRadius); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::OuterRadiusTarget), shape.DiskDatas.OuterRadiusTarget); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::Height), shape.DiskDatas.Height); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::HeightTarget), shape.DiskDatas.HeightTarget); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::LocationZOffset), shape.DiskDatas.LocationZOffset); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::LocationZOffsetTarget), shape.DiskDatas.LocationZOffsetTarget); + break; + } + case AreaTriggerShapeType::BoundedPlane: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 8); + auto boundedPlane = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerBoundedPlane>); + SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::Extents), { shape.BoundedPlaneDatas.Extents[0], shape.BoundedPlaneDatas.Extents[1] }); + SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsTarget), { shape.BoundedPlaneDatas.ExtentsTarget[0], shape.BoundedPlaneDatas.ExtentsTarget[1] }); + break; + } + default: + break; + } +} + float AreaTrigger::GetMaxSearchRadius() const { return *m_areaTriggerData->BoundsRadius2D * CalcCurrentScale(); @@ -935,25 +1033,24 @@ float AreaTrigger::GetMaxSearchRadius() const void AreaTrigger::UpdatePolygonVertices() { - AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); - AreaTriggerShapeInfo const& shape = GetShape(); + UF::AreaTriggerPolygon const* shape = m_areaTriggerData->ShapeData.Get<UF::AreaTriggerPolygon>(); float newOrientation = GetOrientation(); // No need to recalculate, orientation didn't change - if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape.PolygonVerticesTarget.empty()) + if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape->VerticesTarget.empty()) return; - _polygonVertices.assign(shape.PolygonVertices.begin(), shape.PolygonVertices.end()); - if (!shape.PolygonVerticesTarget.empty()) + _polygonVertices.assign(shape->Vertices.begin(), shape->Vertices.end()); + if (!shape->VerticesTarget.empty()) { float progress = GetProgress(); - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); for (std::size_t i = 0; i < _polygonVertices.size(); ++i) { Position& vertex = _polygonVertices[i]; - Position const& vertexTarget = shape.PolygonVerticesTarget[i].Pos; + Position const& vertexTarget = shape->VerticesTarget[i].Pos; vertex.m_positionX = G3D::lerp(vertex.GetPositionX(), vertexTarget.GetPositionX(), progress); vertex.m_positionY = G3D::lerp(vertex.GetPositionY(), vertexTarget.GetPositionY(), progress); @@ -983,7 +1080,7 @@ bool AreaTrigger::HasOverridePosition() const void AreaTrigger::UpdateShape() { - if (_shape.IsPolygon()) + if (m_areaTriggerData->ShapeData.Is<UF::AreaTriggerPolygon>()) UpdatePolygonVertices(); } @@ -1120,8 +1217,6 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt if (splinePoints.size() < 2) return; - _movementTime = 0; - std::unique_ptr<Movement::Spline<float>> spline = std::make_unique<::Movement::Spline<float>>(); spline->init_spline(splinePoints.data(), splinePoints.size(), ::Movement::SplineBase::ModeLinear, _stationaryPosition.GetOrientation()); spline->initLengths(); @@ -1131,29 +1226,29 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt speed = 1.0f; uint32 timeToTarget = spline->length() / speed * float(IN_MILLISECONDS); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); - - if (IsInWorld()) - { - if (_reachedDestination) - { - WorldPackets::AreaTrigger::AreaTriggerRePath reshape; - reshape.TriggerGUID = GetGUID(); - SendMessageToSet(reshape.Write(), true); - } - WorldPackets::AreaTrigger::AreaTriggerRePath reshape; - reshape.TriggerGUID = GetGUID(); - reshape.AreaTriggerSpline.emplace(); - reshape.AreaTriggerSpline->ElapsedTimeForMovement = GetElapsedTimeForMovement(); - reshape.AreaTriggerSpline->TimeToTarget = timeToTarget; - reshape.AreaTriggerSpline->Points = spline.get(); + auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS()); - SendMessageToSet(reshape.Write(), true); - } + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::Spline)); + auto pathData = areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathData, UF::VariantCase<UF::AreaTriggerSplineCalculator>); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerSplineCalculator::Catmullrom), spline->getPointCount() >= 4); + auto points = pathData.ModifyValue(&UF::AreaTriggerSplineCalculator::Points); + ClearDynamicUpdateFieldValues(points); + for (G3D::Vector3 const& point : spline->getPoints()) + AddDynamicUpdateFieldValue(points) = Vector3ToPosition(point); _reachedDestination = false; - _movement = std::move(spline); + _spline = std::move(spline); +} + +uint32 AreaTrigger::GetElapsedTimeForMovement() const +{ + uint32 now = GameTime::GetGameTimeMS(); + if (now >= *m_areaTriggerData->MovementStartTime) + return now - *m_areaTriggerData->MovementStartTime; + return 0; } void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed) @@ -1167,40 +1262,37 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> o uint32 timeToTarget = static_cast<uint32>(orbit.Radius * 2.0f * static_cast<float>(M_PI) * static_cast<float>(IN_MILLISECONDS) / speed); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OrbitPathTarget), orbit.PathTarget.value_or(ObjectGuid::Empty)); - - std::unique_ptr<AreaTriggerOrbitInfo> movementOrbit = std::make_unique<AreaTriggerOrbitInfo>(); - - movementOrbit->TimeToTarget = timeToTarget; - movementOrbit->ElapsedTimeForMovement = 0; - - if (IsInWorld()) - { - WorldPackets::AreaTrigger::AreaTriggerRePath reshape; - reshape.TriggerGUID = GetGUID(); - reshape.AreaTriggerOrbit = *movementOrbit; - - SendMessageToSet(reshape.Write(), true); - } + auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OrbitPathTarget), orbit.PathTarget.value_or(ObjectGuid::Empty)); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ZOffset), orbit.ZOffset); + if (orbit.CanLoop) + SetAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop); + else + RemoveAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop); - _movement = std::move(movementOrbit); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::Orbit)); + auto pathData = areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathData, UF::VariantCase<UF::AreaTriggerOrbit>); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::CounterClockwise), orbit.CounterClockwise); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::Center), orbit.Center.value_or(Position())); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::Radius), orbit.Radius); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::InitialAngle), orbit.InitialAngle); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::BlendFromRadius), orbit.BlendFromRadius); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::ExtraTimeForBlending), orbit.ExtraTimeForBlending); } Position const* AreaTrigger::GetOrbitCenterPosition() const { - if (!HasOrbit()) + UF::AreaTriggerOrbit const* orbit = m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); + if (!orbit) return nullptr; - AreaTriggerOrbitInfo const& orbit = *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); - if (orbit.PathTarget) - if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *orbit.PathTarget)) + if (!m_areaTriggerData->OrbitPathTarget->IsEmpty()) + if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *m_areaTriggerData->OrbitPathTarget)) return center; - if (orbit.Center) - return &orbit.Center->Pos; - - return nullptr; + return &orbit->Center->Pos; } Position AreaTrigger::CalculateOrbitPosition() const @@ -1209,26 +1301,24 @@ Position AreaTrigger::CalculateOrbitPosition() const if (!centerPos) return GetPosition(); - AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); - AreaTriggerOrbitInfo const& cmi = GetOrbit(); + UF::AreaTriggerOrbit const& cmi = *m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); // AreaTrigger make exactly "Duration / TimeToTarget" loops during his life time - float pathProgress = float(cmi.ElapsedTimeForMovement) / float(cmi.TimeToTarget); - if (createProperties && createProperties->MoveCurveId) - pathProgress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, pathProgress); + float pathProgress = float(GetElapsedTimeForMovement() + *cmi.ExtraTimeForBlending) / float(GetTimeToTarget()); + if (m_areaTriggerData->MoveCurveId) + pathProgress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MoveCurveId, pathProgress); // We already made one circle and can't loop - if (!cmi.CanLoop) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop)) pathProgress = std::min(1.f, pathProgress); float radius = cmi.Radius; - if (G3D::fuzzyNe(cmi.BlendFromRadius, radius)) + if (pathProgress <= 1.0f && G3D::fuzzyNe(cmi.BlendFromRadius, radius)) { float blendCurve = (cmi.BlendFromRadius - radius) / radius; - // 4.f Defines four quarters - blendCurve = RoundToInterval(blendCurve, 1.f, 4.f) / 4.f; - float blendProgress = std::min(1.f, pathProgress / blendCurve); - radius = G3D::lerp(cmi.BlendFromRadius, cmi.Radius, blendProgress); + RoundToInterval(blendCurve, 1.f, 4.f); + float blendProgress = std::min(1.f, pathProgress / blendCurve * 0.63661975f); + radius = G3D::lerp(cmi.BlendFromRadius, radius, blendProgress); } // Adapt Path progress depending of circle direction @@ -1238,13 +1328,13 @@ Position AreaTrigger::CalculateOrbitPosition() const float angle = cmi.InitialAngle + 2.f * float(M_PI) * pathProgress; float x = centerPos->GetPositionX() + (radius * std::cos(angle)); float y = centerPos->GetPositionY() + (radius * std::sin(angle)); - float z = centerPos->GetPositionZ() + cmi.ZOffset; + float z = centerPos->GetPositionZ() + *m_areaTriggerData->ZOffset; float orientation = 0.0f; - if (createProperties && createProperties->FacingCurveId) - orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); + if (m_areaTriggerData->FacingCurveId) + orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) { orientation += angle; orientation += cmi.CounterClockwise ? float(M_PI_4) : -float(M_PI_4); @@ -1253,13 +1343,8 @@ Position AreaTrigger::CalculateOrbitPosition() const return { x, y, z, orientation }; } -void AreaTrigger::UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 /*diff*/) +void AreaTrigger::UpdateOrbitPosition() { - if (orbit.StartDelay > GetElapsedTimeForMovement()) - return; - - orbit.ElapsedTimeForMovement = GetElapsedTimeForMovement() - orbit.StartDelay; - Position pos = CalculateOrbitPosition(); GetMap()->AreaTriggerRelocation(this, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); @@ -1268,14 +1353,12 @@ void AreaTrigger::UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 /*diff #endif } -void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 diff) +void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline) { if (_reachedDestination) return; - _movementTime += diff; - - if (_movementTime >= GetTimeToTarget()) + if (GetElapsedTimeForMovement() >= GetTimeToTarget()) { _reachedDestination = true; _lastSplineIndex = int32(spline.last()); @@ -1291,19 +1374,19 @@ void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 d return; } - float currentTimePercent = float(_movementTime) / float(GetTimeToTarget()); + float currentTimePercent = float(GetElapsedTimeForMovement()) / float(GetTimeToTarget()); if (currentTimePercent <= 0.f) return; - AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); - if (createProperties && createProperties->MoveCurveId) + if (m_areaTriggerData->MoveCurveId) { - float progress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, currentTimePercent); + float progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MoveCurveId, currentTimePercent); if (progress < 0.f || progress > 1.f) { + AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})", - GetEntry(), createProperties->Id.Id, uint32(createProperties->Id.IsCustom), progress, createProperties->MoveCurveId); + GetEntry(), createProperties->Id.Id, uint32(createProperties->Id.IsCustom), progress, *m_areaTriggerData->MoveCurveId); } else currentTimePercent = progress; @@ -1317,10 +1400,10 @@ void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 d spline.evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition); float orientation = _stationaryPosition.GetOrientation(); - if (createProperties && createProperties->FacingCurveId) - orientation += sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); + if (m_areaTriggerData->FacingCurveId) + orientation += sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); - if (GetCreateProperties() && !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation) && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation) && HasAreaTriggerFlag(AreaTriggerFieldFlags::FaceMovementDir)) { G3D::Vector3 derivative; spline.evaluate_derivative(lastPositionIndex, percentFromLastPoint, derivative); @@ -1349,14 +1432,11 @@ void AreaTrigger::UpdateOverridePosition() float z = GetScaleCurveValueAtProgress(*m_areaTriggerData->OverrideMoveCurveZ, progress); float orientation = GetOrientation(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) + if (m_areaTriggerData->FacingCurveId) { - if (createProperties->FacingCurveId) - { - orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) - orientation += _stationaryPosition.GetOrientation(); - } + orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); + if (HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) + orientation += m_areaTriggerData->Facing; } GetMap()->AreaTriggerRelocation(this, x, y, z, orientation); diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 67074b04d36..6d10f853063 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -39,6 +39,32 @@ namespace Movement class Spline; } +enum class AreaTriggerFieldFlags : uint32 +{ + None = 0x0000, + HeightIgnoresScale = 0x0001, + WowLabsCircle = 0x0002, + CanLoop = 0x0004, + AbsoluteOrientation = 0x0008, + DynamicShape = 0x0010, + Attached = 0x0020, + FaceMovementDir = 0x0040, + FollowsTerrain = 0x0080, + Unknown1025 = 0x0100, + AlwaysExterior = 0x0200, + HasPlayers = 0x0400, +}; + +DEFINE_ENUM_FLAG(AreaTriggerFieldFlags); + +enum class AreaTriggerPathType : int32 +{ + Spline = 0, + Orbit = 1, + None = 2, + MovementScript = 3 +}; + class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<AreaTrigger>, public MapObject { public: @@ -97,9 +123,13 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area bool IsRemoved() const { return _isRemoved; } uint32 GetSpellId() const { return m_areaTriggerData->SpellID; } AuraEffect const* GetAuraEffect() const { return _aurEff; } - uint32 GetTimeSinceCreated() const { return _timeSinceCreated; } + uint32 GetTimeSinceCreated() const; - void SetHeightIgnoresScale(bool heightIgnoresScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::HeightIgnoresScale), heightIgnoresScale); } + EnumFlag<AreaTriggerFieldFlags> GetAreaTriggerFlags() const { return static_cast<AreaTriggerFieldFlags>(*m_areaTriggerData->Flags); } + bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) const { return GetAreaTriggerFlags().HasFlag(flag); } + void SetAreaTriggerFlag(AreaTriggerFieldFlags flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Flags), uint32(flag)); } + void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Flags), uint32(flag)); } + void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Flags), uint32(flag)); } void SetOverrideScaleCurve(float overrideScale); void SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear); @@ -147,19 +177,17 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area uint32 GetFaction() const override; - AreaTriggerShapeInfo const& GetShape() const { return _shape; } + void SetShape(AreaTriggerShapeInfo const& shape); float GetMaxSearchRadius() const; - Position const& GetRollPitchYaw() const { return _rollPitchYaw; } - Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; } void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {}); void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {}); - bool HasSplines() const { return std::holds_alternative<std::unique_ptr<::Movement::Spline<float>>>(_movement); } - ::Movement::Spline<float> const& GetSpline() const { return *std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement); } - uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); } /// @todo: research the right value, in sniffs both timers are nearly identical + bool HasSplines() const { return _spline != nullptr; } + ::Movement::Spline<float> const& GetSpline() const { return *_spline; } + uint32 GetElapsedTimeForMovement() const; void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {}); - bool HasOrbit() const { return std::holds_alternative<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); } - AreaTriggerOrbitInfo const& GetOrbit() const { return *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); } + bool HasOrbit() const { return m_areaTriggerData->PathData.Is<UF::AreaTriggerOrbit>(); } + UF::AreaTriggerOrbit const& GetOrbit() const { return *m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); } bool HasOverridePosition() const; @@ -184,20 +212,20 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area void UpdateTargetList(); void SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D); - void SearchUnitInSphere(std::vector<Unit*>& targetList); - void SearchUnitInBox(std::vector<Unit*>& targetList); - void SearchUnitInPolygon(std::vector<Unit*>& targetList); - void SearchUnitInCylinder(std::vector<Unit*>& targetList); - void SearchUnitInDisk(std::vector<Unit*>& targetList); - void SearchUnitInBoundedPlane(std::vector<Unit*>& targetList); + void SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList); + void SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList); + void SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList); + void SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList); + void SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList); + void SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList); void HandleUnitEnterExit(std::vector<Unit*> const& targetList); void DoActions(Unit* unit); void UndoActions(Unit* unit); void UpdatePolygonVertices(); - void UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 diff); - void UpdateSplinePosition(Movement::Spline<float>& spline, uint32 diff); + void UpdateOrbitPosition(); + void UpdateSplinePosition(Movement::Spline<float>& spline); void UpdateOverridePosition(); Position const* GetOrbitCenterPosition() const; @@ -212,21 +240,16 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area AuraEffect const* _aurEff; Position _stationaryPosition; - AreaTriggerShapeInfo _shape; int32 _duration; int32 _totalDuration; - uint32 _timeSinceCreated; float _verticesUpdatePreviousOrientation; bool _isRemoved; - Position _rollPitchYaw; - Position _targetRollPitchYaw; std::vector<Position> _polygonVertices; - std::variant<std::monostate, std::unique_ptr<::Movement::Spline<float>>, std::unique_ptr<AreaTriggerOrbitInfo>> _movement; + std::unique_ptr<::Movement::Spline<float>> _spline; bool _reachedDestination; int32 _lastSplineIndex; - uint32 _movementTime; AreaTriggerCreateProperties const* _areaTriggerCreateProperties; AreaTriggerTemplate const* _areaTriggerTemplate; diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 5dba3e6b499..74ce4e2be79 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -193,9 +193,7 @@ struct AreaTriggerOrbitInfo Optional<TaggedPosition<Position::XYZ>> Center; bool CounterClockwise = false; bool CanLoop = false; - uint32 TimeToTarget = 0; - int32 ElapsedTimeForMovement = 0; - uint32 StartDelay = 0; + int32 ExtraTimeForBlending = 0; float Radius = 0.0f; float BlendFromRadius = 0.0f; float InitialAngle = 0.0f; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 1331c819578..472610d4c0f 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -195,6 +195,7 @@ WorldPacket CreatureTemplate::BuildQueryData(LocaleConstant loc, Difficulty diff stats.Flags[0] = creatureDifficulty->TypeFlags; stats.Flags[1] = creatureDifficulty->TypeFlags2; + stats.Flags[2] = creatureDifficulty->TypeFlags3; stats.CreatureType = type; stats.CreatureFamily = family; @@ -273,6 +274,7 @@ CreatureDifficulty const* CreatureTemplate::GetDifficulty(Difficulty difficulty) CreatureDifficultyID = 0; TypeFlags = 0; TypeFlags2 = 0; + TypeFlags3 = 0; LootID = 0; PickPocketLootID = 0; SkinLootID = 0; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 1f4f4b5e216..81fcb06a14f 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -456,6 +456,7 @@ struct CreatureDifficulty int32 CreatureDifficultyID; uint32 TypeFlags; uint32 TypeFlags2; + uint32 TypeFlags3; uint32 LootID; uint32 PickPocketLootID; uint32 SkinLootID; diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 16f4896d968..1938d8d36d4 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -707,7 +707,7 @@ struct GameObjectTemplate uint32 radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10 uint32 InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0 - uint32 PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, PlaceholderType77, }; Default: None + uint32 PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, GuildRename, PlaceholderType76, }; Default: None } UILink; // 49 GAMEOBJECT_TYPE_KEYSTONE_RECEPTACLE struct @@ -838,6 +838,19 @@ struct GameObjectTemplate uint32 Script; // 0 Script, References: SpellScript, NoValue = 0 uint32 autoClose; // 1 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000 } PerksProgramChest; + // 63 GAMEOBJECT_TYPE_FUTURE_PATCH + struct + { + } futurePatchGameObject; + // 64 GAMEOBJECT_TYPE_ASSIST_ACTION + struct + { + uint32 AssistActionType; // 0 Assist Action Type, enum { None, Lounging Player, Grave Marker, Placed VO, Player Guardian, Player Slayer, Captured Buff, }; Default: None + uint32 cooldown; // 1 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000 + uint32 gossipID; // 2 gossipID, References: Gossip, NoValue = 0 + uint32 spell; // 3 spell, References: Spell, NoValue = 0 + uint32 playerCast; // 4 playerCast, enum { false, true, }; Default: false + } assistAction; struct { uint32 data[MAX_GAMEOBJECT_DATA]; @@ -1114,6 +1127,8 @@ struct GameObjectTemplate { case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.gossipID; case GAMEOBJECT_TYPE_GOOBER: return goober.gossipID; + case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.gossipID; + case GAMEOBJECT_TYPE_ASSIST_ACTION: return assistAction.gossipID; default: return 0; } } @@ -1216,8 +1231,9 @@ struct GameObjectTemplate { switch (type) { - case GAMEOBJECT_TYPE_TRAP: return trap.cooldown; - case GAMEOBJECT_TYPE_GOOBER: return goober.cooldown; + case GAMEOBJECT_TYPE_TRAP: return trap.cooldown; + case GAMEOBJECT_TYPE_GOOBER: return goober.cooldown; + case GAMEOBJECT_TYPE_ASSIST_ACTION: return assistAction.cooldown; default: return 0; } } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 247517163df..a3b1187cbff 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -141,9 +141,6 @@ void AddItemsSetItem(Player* player, Item const* item) if (itemSetSpell->Threshold > eff->EquippedItems.size()) continue; - if (eff->SetBonuses.count(itemSetSpell)) - continue; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE); if (!spellInfo) { @@ -151,10 +148,17 @@ void AddItemsSetItem(Player* player, Item const* item) continue; } - eff->SetBonuses.insert(itemSetSpell); + if (!eff->SetBonuses.insert(itemSetSpell).second) + continue; + // spell cast only if fit form requirement, in other case will cast at form change - if (!itemSetSpell->ChrSpecID || ChrSpecialization(itemSetSpell->ChrSpecID) == player->GetPrimarySpecialization()) - player->ApplyEquipSpell(spellInfo, nullptr, true); + if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization()) + continue; + + if (itemSetSpell->TraitSubTreeID && int32(itemSetSpell->TraitSubTreeID) != player->m_playerData->CurrentCombatTraitConfigSubTreeID) + continue; + + player->ApplyEquipSpell(spellInfo, nullptr, true); } } } @@ -196,11 +200,10 @@ void RemoveItemsSetItem(Player* player, Item const* item) if (itemSetSpell->Threshold <= eff->EquippedItems.size()) continue; - if (!eff->SetBonuses.count(itemSetSpell)) + if (!eff->SetBonuses.erase(itemSetSpell)) continue; player->ApplyEquipSpell(sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE), nullptr, false); - eff->SetBonuses.erase(itemSetSpell); } } @@ -224,7 +227,8 @@ void UpdateItemSetAuras(Player* player, bool formChange) { SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE); - if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization()) + if ((itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization()) + || (itemSetSpell->TraitSubTreeID && int32(itemSetSpell->TraitSubTreeID) != player->m_playerData->CurrentCombatTraitConfigSubTreeID)) player->ApplyEquipSpell(spellInfo, nullptr, false, false); // item set aura is not for current spec else { diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h index d3278c4987f..0df2bb3bba6 100644 --- a/src/server/game/Entities/Item/ItemDefines.h +++ b/src/server/game/Entities/Item/ItemDefines.h @@ -154,6 +154,8 @@ enum InventoryResult : uint8 EQUIP_ERR_BANK_NOT_ACCESSIBLE = 128,// This character does not have access to this bank. EQUIP_ERR_CANT_TRADE_ACCOUNT_ITEM = 129,// You can't trade an item from the Warband bank. EQUIP_ERR_ACCOUNT_MONEY_LOCKED = 130,// You cannot withdraw or deposit gold from the warband bank currently; please try again later. + EQUIP_ERR_CHARACTER_BANK_NOT_ACCESSIBLE = 131,// This character does not have access to this bank. + EQUIP_ERR_CHARACTER_BANK_NOT_CONVERTED = 132,// Your character's bank has not been converted. Please try again later. }; // EnumUtils: DESCRIBE THIS diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 42b23f04005..c7d97e22fd0 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -811,6 +811,9 @@ enum ItemIdConstants ITEM_PURPLE_RIBBONED_HOLIDAY_GIFT = 17308, // Purple Ribboned Holiday Gift ITEM_EMPTY_WRAPPER = 21830, // Empty Wrapper ITEM_WRAPPED_GIFT = 21831, // Wrappered Gift + + ITEM_ACCOUNT_BANK_TAB_BAG = 208392, // Account Bank Tab Bag (DNT) + ITEM_CHARACTER_BANK_TAB_BAG = 242709, // Character Bank Tab Bag (DNT) }; class Player; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index eaea679d01a..d5b732a145e 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -16,8 +16,6 @@ */ #include "Object.h" -#include "AreaTriggerPackets.h" -#include "AreaTriggerTemplate.h" #include "BattlefieldMgr.h" #include "CellImpl.h" #include "CinematicMgr.h" @@ -46,7 +44,6 @@ #include "SpellAuraEffects.h" #include "SpellMgr.h" #include "SpellPackets.h" -#include "StringConvert.h" #include "TemporarySummon.h" #include "Totem.h" #include "Transport.h" @@ -310,6 +307,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(flags.NoBirthAnim); data->WriteBit(flags.EnablePortals); data->WriteBit(flags.PlayHoverAnim); + data->WriteBit(flags.ThisIsYou); data->WriteBit(flags.MovementUpdate); data->WriteBit(flags.MovementTransport); data->WriteBit(flags.Stationary); @@ -318,10 +316,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(flags.Vehicle); data->WriteBit(flags.AnimKit); data->WriteBit(flags.Rotation); - data->WriteBit(flags.AreaTrigger); data->WriteBit(flags.GameObject); data->WriteBit(flags.SmoothPhasing); - data->WriteBit(flags.ThisIsYou); data->WriteBit(flags.SceneObject); data->WriteBit(flags.ActivePlayer); data->WriteBit(flags.Conversation); @@ -329,7 +325,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (flags.MovementUpdate) { - Unit const* unit = ToUnit(); + Unit const* unit = static_cast<Unit const*>(this); bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING); bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0; bool HasSpline = unit->IsSplineEnabled(); @@ -470,14 +466,17 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe } if (flags.CombatVictim) - *data << ToUnit()->GetVictim()->GetGUID(); // CombatVictim + { + Unit const* unit = static_cast<Unit const*>(this); + *data << unit->GetVictim()->GetGUID(); // CombatVictim + } if (flags.ServerTime) *data << uint32(GameTime::GetGameTimeMS()); if (flags.Vehicle) { - Unit const* unit = ToUnit(); + Unit const* unit = static_cast<Unit const*>(this); *data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->ID); // RecID *data << float(unit->GetOrientation()); // InitialRawFacing } @@ -491,7 +490,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe } if (flags.Rotation) - *data << uint64(ToGameObject()->GetPackedLocalRotation()); // Rotation + { + GameObject const* gameObject = static_cast<GameObject const*>(this); + *data << uint64(gameObject->GetPackedLocalRotation()); // Rotation + } if (PauseTimes && !PauseTimes->empty()) data->append(PauseTimes->data(), PauseTimes->size()); @@ -502,144 +504,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe *data << self->m_movementInfo.transport; } - if (flags.AreaTrigger) - { - AreaTrigger const* areaTrigger = static_cast<AreaTrigger const*>(this); - AreaTriggerCreateProperties const* createProperties = areaTrigger->GetCreateProperties(); - AreaTriggerShapeInfo const& shape = areaTrigger->GetShape(); - - *data << uint32(areaTrigger->GetTimeSinceCreated()); - - *data << areaTrigger->GetRollPitchYaw().PositionXYZStream(); - - switch (shape.Type) - { - case AreaTriggerShapeType::Sphere: - *data << int8(0); - *data << float(shape.SphereDatas.Radius); - *data << float(shape.SphereDatas.RadiusTarget); - break; - case AreaTriggerShapeType::Box: - *data << int8(1); - *data << float(shape.BoxDatas.Extents[0]); - *data << float(shape.BoxDatas.Extents[1]); - *data << float(shape.BoxDatas.Extents[2]); - *data << float(shape.BoxDatas.ExtentsTarget[0]); - *data << float(shape.BoxDatas.ExtentsTarget[1]); - *data << float(shape.BoxDatas.ExtentsTarget[2]); - break; - case AreaTriggerShapeType::Polygon: - *data << int8(3); - *data << int32(shape.PolygonVertices.size()); - *data << int32(shape.PolygonVerticesTarget.size()); - *data << float(shape.PolygonDatas.Height); - *data << float(shape.PolygonDatas.HeightTarget); - - for (TaggedPosition<Position::XY> const& vertice : shape.PolygonVertices) - *data << vertice; - - for (TaggedPosition<Position::XY> const& vertice : shape.PolygonVerticesTarget) - *data << vertice; - break; - case AreaTriggerShapeType::Cylinder: - *data << int8(4); - *data << float(shape.CylinderDatas.Radius); - *data << float(shape.CylinderDatas.RadiusTarget); - *data << float(shape.CylinderDatas.Height); - *data << float(shape.CylinderDatas.HeightTarget); - *data << float(shape.CylinderDatas.LocationZOffset); - *data << float(shape.CylinderDatas.LocationZOffsetTarget); - break; - case AreaTriggerShapeType::Disk: - *data << int8(7); - *data << float(shape.DiskDatas.InnerRadius); - *data << float(shape.DiskDatas.InnerRadiusTarget); - *data << float(shape.DiskDatas.OuterRadius); - *data << float(shape.DiskDatas.OuterRadiusTarget); - *data << float(shape.DiskDatas.Height); - *data << float(shape.DiskDatas.HeightTarget); - *data << float(shape.DiskDatas.LocationZOffset); - *data << float(shape.DiskDatas.LocationZOffsetTarget); - break; - case AreaTriggerShapeType::BoundedPlane: - *data << int8(8); - *data << float(shape.BoundedPlaneDatas.Extents[0]); - *data << float(shape.BoundedPlaneDatas.Extents[1]); - *data << float(shape.BoundedPlaneDatas.ExtentsTarget[0]); - *data << float(shape.BoundedPlaneDatas.ExtentsTarget[1]); - break; - default: - break; - } - - bool hasAbsoluteOrientation = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation); - bool hasDynamicShape = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape); - bool hasAttached = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached); - bool hasFaceMovementDir = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir); - bool hasFollowsTerrain = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain); - bool hasAlwaysExterior = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior); - bool hasUnknown1025 = false; - bool hasTargetRollPitchYaw = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasTargetRollPitchYaw); - bool hasScaleCurveID = createProperties && createProperties->ScaleCurveId != 0; - bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0; - bool hasFacingCurveID = createProperties && createProperties->FacingCurveId != 0; - bool hasMoveCurveID = createProperties && createProperties->MoveCurveId != 0; - bool hasMovementScript = false; - bool hasPositionalSoundKitID= false; - - data->WriteBit(hasAbsoluteOrientation); - data->WriteBit(hasDynamicShape); - data->WriteBit(hasAttached); - data->WriteBit(hasFaceMovementDir); - data->WriteBit(hasFollowsTerrain); - data->WriteBit(hasAlwaysExterior); - data->WriteBit(hasUnknown1025); - data->WriteBit(hasTargetRollPitchYaw); - data->WriteBit(hasScaleCurveID); - data->WriteBit(hasMorphCurveID); - data->WriteBit(hasFacingCurveID); - data->WriteBit(hasMoveCurveID); - data->WriteBit(hasPositionalSoundKitID); - data->WriteBit(areaTrigger->HasSplines()); - data->WriteBit(areaTrigger->HasOrbit()); - data->WriteBit(hasMovementScript); - - data->FlushBits(); - - if (areaTrigger->HasSplines()) - WorldPackets::AreaTrigger::WriteAreaTriggerSpline(*data, areaTrigger->GetTimeToTarget(), areaTrigger->GetElapsedTimeForMovement(), areaTrigger->GetSpline()); - - if (hasTargetRollPitchYaw) - *data << areaTrigger->GetTargetRollPitchYaw().PositionXYZStream(); - - if (hasScaleCurveID) - *data << uint32(createProperties->ScaleCurveId); - - if (hasMorphCurveID) - *data << uint32(createProperties->MorphCurveId); - - if (hasFacingCurveID) - *data << uint32(createProperties->FacingCurveId); - - if (hasMoveCurveID) - *data << uint32(createProperties->MoveCurveId); - - if (hasPositionalSoundKitID) - *data << uint32(0); - - //if (hasMovementScript) - // *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo - - if (areaTrigger->HasOrbit()) - { - using WorldPackets::AreaTrigger::operator<<; - *data << areaTrigger->GetOrbit(); - } - } - if (flags.GameObject) { - GameObject const* gameObject = ToGameObject(); + GameObject const* gameObject = static_cast<GameObject const*>(this); Transport const* transport = gameObject->ToTransport(); bool bit8 = false; @@ -794,10 +661,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (flags.ActivePlayer) { - Player const* player = ToPlayer(); + Player const* player = static_cast<Player const*>(this); bool HasSceneInstanceIDs = !player->GetSceneMgr().GetSceneTemplateByInstanceMap().empty(); - bool HasRuneState = ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS; + bool HasRuneState = player->GetPowerIndex(POWER_RUNES) != MAX_POWERS; data->WriteBit(HasSceneInstanceIDs); data->WriteBit(HasRuneState); @@ -805,8 +672,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (HasSceneInstanceIDs) { *data << uint32(player->GetSceneMgr().GetSceneTemplateByInstanceMap().size()); - for (auto const& itr : player->GetSceneMgr().GetSceneTemplateByInstanceMap()) - *data << uint32(itr.first); + for (auto const& [sceneInstanceId, _] : player->GetSceneMgr().GetSceneTemplateByInstanceMap()) + *data << uint32(sceneInstanceId); } if (HasRuneState) { @@ -823,7 +690,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (flags.Conversation) { - Conversation const* self = ToConversation(); + Conversation const* self = static_cast<Conversation const*>(this); if (data->WriteBit(self->GetTextureKitId() != 0)) *data << uint32(self->GetTextureKitId()); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index b5940dc0b73..971b74494e0 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -93,7 +93,6 @@ struct CreateObjectBits bool Vehicle : 1; bool AnimKit : 1; bool Rotation : 1; - bool AreaTrigger : 1; bool GameObject : 1; bool SmoothPhasing : 1; bool ThisIsYou : 1; diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index ef802f8447d..874b38d87d8 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -23,6 +23,7 @@ #include "UpdateMask.h" #include <algorithm> #include <memory> +#include <variant> #include <vector> class ByteBuffer; @@ -68,6 +69,15 @@ namespace UF template<typename T, int32 BlockBit, uint32 Bit> class OptionalUpdateField; + template<typename T> + inline constexpr std::type_identity<T> VariantCase; + + template<typename... Types> + class VariantUpdateFieldBase; + + template<int32 BlockBit, uint32 Bit, typename... Types> + class VariantUpdateField; + template<typename T, bool PublicSet> struct MutableFieldReferenceWithChangesMask; @@ -352,6 +362,24 @@ namespace UF return { *((_value.*field)._value) }; } + template<typename V, int32 BlockBit, uint32 Bit, typename... Types> + std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>, + MutableFieldReference<V, PublicSet>, + std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>, + MutableNestedFieldReference<V, PublicSet>, + UpdateFieldSetter<V, PublicSet>>> + ModifyValue(VariantUpdateField<BlockBit, Bit, Types...>(T::* field), [[maybe_unused]] std::type_identity<V> type) + { + if (!(_value.*field).template Is<V>()) + (_value.*field).template ConstructValue<V>(); + + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + + _value._changesMask.Set(Bit); + return { *((_value.*field).template Get<V>()) }; + } + private: T& _value; }; @@ -538,6 +566,17 @@ namespace UF _changesMask.Set(Bit); } + template<typename Derived, int32 BlockBit, uint32 Bit, typename... Types> + void MarkChanged(VariantUpdateField<BlockBit, Bit, Types...>(Derived::*)) + { + static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); + + if constexpr (BlockBit >= 0) + _changesMask.Set(BlockBit); + + _changesMask.Set(Bit); + } + template<typename Derived, typename T, int32 BlockBit, uint32 Bit> void ClearChanged(UpdateField<T, BlockBit, Bit>(Derived::*)) { @@ -578,6 +617,14 @@ namespace UF _changesMask.Reset(Bit); } + template<typename Derived, int32 BlockBit, uint32 Bit, typename... Types> + void ClearChanged(VariantUpdateField<BlockBit, Bit, Types...>(Derived::*)) + { + static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); + + _changesMask.Reset(Bit); + } + Mask const& GetChangesMask() const { return _changesMask; } protected: @@ -614,6 +661,17 @@ namespace UF field._value->ClearChangesMask(); } + template<int32 BlockBit, uint32 Bit, typename... Types> + static void ClearChangesMask(VariantUpdateField<BlockBit, Bit, Types...>& field) + { + if constexpr ((std::is_base_of_v<HasChangesMaskTag, Types> || ...)) + std::visit([]<typename T>(T& value) + { + if constexpr (std::is_base_of_v<HasChangesMaskTag, T>) + value.ClearChangesMask(); + }, field._value); + } + Mask _changesMask; }; @@ -894,6 +952,64 @@ namespace UF { }; + template<typename... Types> + class VariantUpdateFieldBase : public IsUpdateFieldHolderTag + { + template<typename F, bool PublicSet> + friend struct MutableFieldReferenceWithChangesMask; + + template<typename F, bool PublicSet> + friend struct MutableFieldReferenceNoChangesMask; + + template<typename F, bool PublicSet> + friend struct MutableNestedFieldReference; + + template<std::size_t Bits> + friend class HasChangesMask; + + friend class UpdateFieldHolder; + + public: + template<typename T> + bool Is() const { return std::holds_alternative<T>(_value); } + + template<typename T> + T const* Get() const noexcept + { + if (std::holds_alternative<T>(_value)) + return &std::get<T>(_value); + return nullptr; + } + + template<typename Visitor> + decltype(auto) Visit(Visitor&& visitor) const noexcept + { + return std::visit(std::forward<Visitor>(visitor), _value); + } + + private: + template<typename T> + void ConstructValue() + { + _value.template emplace<T>(); + } + + template<typename T> + T* Get() noexcept + { + if (std::holds_alternative<T>(_value)) + return &std::get<T>(_value); + return nullptr; + } + + std::variant<std::monostate, Types...> _value; + }; + + template<int32 BlockBit, uint32 Bit, typename... Types> + class VariantUpdateField : public VariantUpdateFieldBase<Types...> + { + }; + template<typename T> struct ViewerDependentValueTag { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index a86aa7f9988..f70dc26de37 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -20,6 +20,7 @@ #include "ByteBuffer.h" #include "Corpse.h" #include "DynamicObject.h" +#include "PacketOperators.h" #include "Player.h" #include "ViewerDependentValues.h" @@ -852,18 +853,24 @@ void UnitChannel::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* { data << int32(SpellID); SpellVisual.WriteCreate(data, owner, receiver); + data << uint32(StartTimeMs); + data << uint32(Duration); } void UnitChannel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const { data << int32(SpellID); SpellVisual.WriteUpdate(data, ignoreChangesMask, owner, receiver); + data << uint32(StartTimeMs); + data << uint32(Duration); } bool UnitChannel::operator==(UnitChannel const& right) const { return SpellID == right.SpellID - && SpellVisual == right.SpellVisual; + && SpellVisual == right.SpellVisual + && StartTimeMs == right.StartTimeMs + && Duration == right.Duration; } void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const @@ -937,6 +944,51 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const && AuraSpellID == right.AuraSpellID; } +void UnitAssistActionData::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const +{ + data << uint8(Type); + data << uint32(VirtualRealmAddress); + data.WriteBits(PlayerName->size(), 6); + data.FlushBits(); + data << WorldPackets::SizedString::Data(*PlayerName); +} + +void UnitAssistActionData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << uint8(Type); + } + if (changesMask[3]) + { + data << uint32(VirtualRealmAddress); + } + if (changesMask[2]) + { + data.WriteBits(PlayerName->size(), 6); + data.FlushBits(); + data << WorldPackets::SizedString::Data(*PlayerName); + } + } +} + +void UnitAssistActionData::ClearChangesMask() +{ + Base::ClearChangesMask(Type); + Base::ClearChangesMask(PlayerName); + Base::ClearChangesMask(VirtualRealmAddress); + _changesMask.ResetAll(); +} + void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; @@ -1148,18 +1200,24 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi { data << ChannelObjects[i]; } + data.FlushBits(); data.WriteBit(Field_314); + data.WriteBits(AssistActionData.has_value(), 1); + if (AssistActionData.has_value()) + { + AssistActionData->WriteCreate(data, owner, receiver); + } data.FlushBits(); } static constexpr void UnitDataAppendAllowedFieldsMaskForFlag(UnitData::Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xF0000080u, 0xFF80FFFFu, 0x3FFFFFFFu }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xE0000100u, 0xFF01FFFFu, 0x7FFFFFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF0000080u, 0x0000FFFFu, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xE0000100u, 0x0001FFFFu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0001FE00u }; } void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -1169,14 +1227,14 @@ void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFl void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u }); UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u }); UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1776,84 +1834,93 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor { data << *NameplateAttachToGUID; } + data.WriteBits(AssistActionData.has_value(), 1); + data.FlushBits(); + if (changesMask[135]) + { + if (AssistActionData.has_value()) + { + AssistActionData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[135]) + if (changesMask[136]) { for (uint32 i = 0; i < 10; ++i) { - if (changesMask[136 + i]) + if (changesMask[137 + i]) { data << int32(Power[i]); } - if (changesMask[146 + i]) + if (changesMask[147 + i]) { data << int32(MaxPower[i]); } - if (changesMask[156 + i]) + if (changesMask[157 + i]) { data << float(PowerRegenFlatModifier[i]); } - if (changesMask[166 + i]) + if (changesMask[167 + i]) { data << float(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[176]) + if (changesMask[177]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[177 + i]) + if (changesMask[178 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[180]) + if (changesMask[181]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[181 + i]) + if (changesMask[182 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[183]) + if (changesMask[184]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[184 + i]) + if (changesMask[185 + i]) { data << int32(Stats[i]); } - if (changesMask[188 + i]) + if (changesMask[189 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[192 + i]) + if (changesMask[193 + i]) { data << int32(StatNegBuff[i]); } - if (changesMask[196 + i]) + if (changesMask[197 + i]) { data << int32(StatSupportBuff[i]); } } } - if (changesMask[200]) + if (changesMask[201]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[201 + i]) + if (changesMask[202 + i]) { data << int32(Resistances[i]); } - if (changesMask[208 + i]) + if (changesMask[209 + i]) { data << int32(BonusResistanceMods[i]); } - if (changesMask[215 + i]) + if (changesMask[216 + i]) { data << int32(ManaCostModifier[i]); } @@ -1994,6 +2061,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(Field_31C); Base::ClearChangesMask(Field_320); Base::ClearChangesMask(NameplateAttachToGUID); + Base::ClearChangesMask(AssistActionData); Base::ClearChangesMask(Power); Base::ClearChangesMask(MaxPower); Base::ClearChangesMask(PowerRegenFlatModifier); @@ -2196,7 +2264,7 @@ void PetCreatureName::WriteCreate(ByteBuffer& data, Player const* owner, Player { data << uint32(CreatureID); data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); data.FlushBits(); } @@ -2218,7 +2286,7 @@ void PetCreatureName::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Play if (changesMask[2]) { data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } } data.FlushBits(); @@ -2252,6 +2320,50 @@ bool CTROptions::operator==(CTROptions const& right) const && ChromieTimeExpansionMask == right.ChromieTimeExpansionMask; } +void LeaverInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << BnetAccountGUID; + data << float(LeaveScore); + data << uint32(SeasonID); + data << uint32(TotalLeaves); + data << uint32(TotalSuccesses); + data << int32(ConsecutiveSuccesses); + data << int64(LastPenaltyTime); + data << int64(LeaverExpirationTime); + data << int32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); +} + +void LeaverInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << BnetAccountGUID; + data << float(LeaveScore); + data << uint32(SeasonID); + data << uint32(TotalLeaves); + data << uint32(TotalSuccesses); + data << int32(ConsecutiveSuccesses); + data << int64(LastPenaltyTime); + data << int64(LeaverExpirationTime); + data << int32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); +} + +bool LeaverInfo::operator==(LeaverInfo const& right) const +{ + return BnetAccountGUID == right.BnetAccountGUID + && LeaveScore == right.LeaveScore + && SeasonID == right.SeasonID + && TotalLeaves == right.TotalLeaves + && TotalSuccesses == right.TotalSuccesses + && ConsecutiveSuccesses == right.ConsecutiveSuccesses + && LastPenaltyTime == right.LastPenaltyTime + && LeaverExpirationTime == right.LeaverExpirationTime + && Unknown_1120 == right.Unknown_1120 + && LeaverStatus == right.LeaverStatus; +} + void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { for (uint32 i = 0; i < 5; ++i) @@ -2260,7 +2372,7 @@ void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player co } for (uint32 i = 0; i < 5; ++i) { - data.WriteString(Name[i]); + data << WorldPackets::SizedString::Data(Name[i]); } data.FlushBits(); } @@ -2292,7 +2404,7 @@ void DeclinedNames::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player { if (changesMask[1 + i]) { - data.WriteString(Name[i]); + data << WorldPackets::SizedString::Data(Name[i]); } } } @@ -2398,6 +2510,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << int32(FakeInebriation); data << uint32(VirtualPlayerRealm); data << uint32(CurrentSpecID); + data << int32(CurrentCombatTraitConfigSubTreeID); data << int32(TaxiMountAnimKitID); for (uint32 i = 0; i < 6; ++i) { @@ -2458,7 +2571,8 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data.WriteBit(HasLevelLink); data.WriteBits(DeclinedNames.has_value(), 1); data << *DungeonScore; - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); + LeaverInfo->WriteCreate(data, owner, receiver); for (uint32 i = 0; i < 16; ++i) { data << VisibleEquipableSpells[i]; @@ -2477,7 +2591,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi static constexpr void PlayerDataAppendAllowedFieldsMaskForFlag(PlayerData::Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= std::array<uint32, 11>{ 0x00000022u, 0xFFFE0000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u, 0x00000000u, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 11>{ 0x00000022u, 0xFFF80000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u }; } void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -2487,14 +2601,14 @@ void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, Enum void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0001FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFEu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000003u }); + Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu }); PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0001FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFEu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000003u }); + Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu }); PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2708,74 +2822,82 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } if (changesMask[29]) { - data << int32(TaxiMountAnimKitID); + data << int32(CurrentCombatTraitConfigSubTreeID); } if (changesMask[30]) { - data << uint8(CurrentBattlePetBreedQuality); + data << int32(TaxiMountAnimKitID); } if (changesMask[31]) { - data << int32(HonorLevel); + data << uint8(CurrentBattlePetBreedQuality); } } if (changesMask[32]) { if (changesMask[33]) { + data << int32(HonorLevel); + } + if (changesMask[34]) + { data << int64(LogoutTime); } - if (changesMask[35]) + if (changesMask[36]) { data << int32(Field_1AC); } - if (changesMask[36]) + if (changesMask[37]) { data << int32(Field_1B0); } - if (changesMask[37]) + if (changesMask[38]) { data << int32(CurrentBattlePetSpeciesID); } - if (changesMask[38]) + if (changesMask[39]) { CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[39]) + if (changesMask[40]) { data << int32(CovenantID); } - if (changesMask[40]) + if (changesMask[41]) { data << int32(SoulbindID); } - if (changesMask[42]) + if (changesMask[44]) { data << *SpectateTarget; } - if (changesMask[43]) + if (changesMask[45]) { data << int32(Field_200); } - if (changesMask[45]) + if (changesMask[47]) { PersonalTabard->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[34]) + if (changesMask[35]) { data.WriteBits(Name->size(), 6); } data.WriteBits(DeclinedNames.has_value(), 1); data.FlushBits(); - if (changesMask[41]) + if (changesMask[42]) { data << *DungeonScore; } - if (changesMask[34]) + if (changesMask[35]) { - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } - if (changesMask[44]) + if (changesMask[43]) + { + LeaverInfo->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[46]) { if (DeclinedNames.has_value()) { @@ -2783,21 +2905,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[46]) + if (changesMask[48]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[47 + i]) + if (changesMask[49 + i]) { data << uint8(PartyType[i]); } } } - if (changesMask[49]) + if (changesMask[51]) { for (uint32 i = 0; i < 175; ++i) { - if (changesMask[50 + i]) + if (changesMask[52 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2806,51 +2928,51 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[225]) + if (changesMask[227]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[226 + i]) + if (changesMask[228 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[245]) + if (changesMask[247]) { for (uint32 i = 0; i < 6; ++i) { - if (changesMask[246 + i]) + if (changesMask[248 + i]) { data << float(AvgItemLevel[i]); } } } - if (changesMask[252]) + if (changesMask[254]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[253 + i]) + if (changesMask[255 + i]) { ForcedReactions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[302]) + if (changesMask[304]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[303 + i]) + if (changesMask[305 + i]) { data << uint32(Field_3120[i]); } } } - if (changesMask[285]) + if (changesMask[287]) { for (uint32 i = 0; i < 16; ++i) { - if (changesMask[286 + i]) + if (changesMask[288 + i]) { data << VisibleEquipableSpells[i]; } @@ -2889,6 +3011,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(FakeInebriation); Base::ClearChangesMask(VirtualPlayerRealm); Base::ClearChangesMask(CurrentSpecID); + Base::ClearChangesMask(CurrentCombatTraitConfigSubTreeID); Base::ClearChangesMask(TaxiMountAnimKitID); Base::ClearChangesMask(CurrentBattlePetBreedQuality); Base::ClearChangesMask(HonorLevel); @@ -2901,6 +3024,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(CovenantID); Base::ClearChangesMask(SoulbindID); Base::ClearChangesMask(DungeonScore); + Base::ClearChangesMask(LeaverInfo); Base::ClearChangesMask(SpectateTarget); Base::ClearChangesMask(Field_200); Base::ClearChangesMask(DeclinedNames); @@ -3613,6 +3737,7 @@ void TraitEntry::WriteCreate(ByteBuffer& data, Player const* owner, Player const data << int32(TraitNodeEntryID); data << int32(Rank); data << int32(GrantedRanks); + data << int32(BonusRanks); } void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const @@ -3621,6 +3746,7 @@ void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player co data << int32(TraitNodeEntryID); data << int32(Rank); data << int32(GrantedRanks); + data << int32(BonusRanks); } bool TraitEntry::operator==(TraitEntry const& right) const @@ -3628,7 +3754,8 @@ bool TraitEntry::operator==(TraitEntry const& right) const return TraitNodeID == right.TraitNodeID && TraitNodeEntryID == right.TraitNodeEntryID && Rank == right.Rank - && GrantedRanks == right.GrantedRanks; + && GrantedRanks == right.GrantedRanks + && BonusRanks == right.BonusRanks; } void TraitSubTreeCache::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const @@ -3692,7 +3819,7 @@ void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player cons { SubTrees[i].WriteCreate(data, owner, receiver); } - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); data.FlushBits(); } @@ -3802,7 +3929,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c if (changesMask[5]) { data.WriteBits(Name->size(), 9); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } } data.FlushBits(); @@ -3987,7 +4114,7 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe { Reagents[i].WriteCreate(data, owner, receiver); } - data.WriteString(CustomerNotes); + data << WorldPackets::SizedString::Data(*CustomerNotes); if (Customer.has_value()) { Customer->WriteCreate(data, owner, receiver); @@ -4123,7 +4250,7 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl { if (changesMask[20]) { - data.WriteString(CustomerNotes); + data << WorldPackets::SizedString::Data(*CustomerNotes); } if (changesMask[21]) { @@ -4398,7 +4525,7 @@ void StablePetInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player co data << uint8(PetFlags); data << uint32(Specialization); data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); data.FlushBits(); } @@ -4444,7 +4571,7 @@ void StablePetInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player if (changesMask[6]) { data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } } data.FlushBits(); @@ -4565,9 +4692,9 @@ void BankTabSettings::WriteCreate(ByteBuffer& data, Player const* owner, Player data.WriteBits(Icon->size(), 9); data.WriteBits(Description->size(), 14); data << int32(DepositFlags); - data.WriteString(Name); - data.WriteString(Icon); - data.WriteString(Description); + data << WorldPackets::SizedString::Data(*Name); + data << WorldPackets::SizedString::Data(*Icon); + data << WorldPackets::SizedString::Data(*Description); data.FlushBits(); } @@ -4598,15 +4725,15 @@ void BankTabSettings::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Play } if (changesMask[0]) { - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } if (changesMask[1]) { - data.WriteString(Icon); + data << WorldPackets::SizedString::Data(*Icon); } if (changesMask[2]) { - data.WriteString(Description); + data << WorldPackets::SizedString::Data(*Description); } data.FlushBits(); } @@ -4687,6 +4814,47 @@ bool DelveData::operator==(DelveData const& right) const && Started == right.Started; } +void ChallengeModeData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(Unknown_1120_1); + data << int32(Unknown_1120_2); + data << uint64(Unknown_1120_3); + data << int64(Unknown_1120_4); + data << KeystoneOwnerGUID; + data << LeaverGUID; + data.WriteBits(IsActive, 1); + data.WriteBits(HasRestrictions, 1); + data.WriteBits(CanVoteAbandon, 1); + data.FlushBits(); +} + +void ChallengeModeData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(Unknown_1120_1); + data << int32(Unknown_1120_2); + data << uint64(Unknown_1120_3); + data << int64(Unknown_1120_4); + data << KeystoneOwnerGUID; + data << LeaverGUID; + data.WriteBits(IsActive, 1); + data.WriteBits(HasRestrictions, 1); + data.WriteBits(CanVoteAbandon, 1); + data.FlushBits(); +} + +bool ChallengeModeData::operator==(ChallengeModeData const& right) const +{ + return Unknown_1120_1 == right.Unknown_1120_1 + && Unknown_1120_2 == right.Unknown_1120_2 + && Unknown_1120_3 == right.Unknown_1120_3 + && Unknown_1120_4 == right.Unknown_1120_4 + && KeystoneOwnerGUID == right.KeystoneOwnerGUID + && LeaverGUID == right.LeaverGUID + && IsActive == right.IsActive + && HasRestrictions == right.HasRestrictions + && CanVoteAbandon == right.CanVoteAbandon; +} + void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int16(ResearchProjectID); @@ -4704,7 +4872,7 @@ bool Research::operator==(Research const& right) const void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 232; ++i) + for (uint32 i = 0; i < 105; ++i) { data << InvSlots[i]; } @@ -4819,14 +4987,11 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << uint32(BagSlotFlags[i]); } - for (uint32 i = 0; i < 7; ++i) - { - data << uint32(BankBagSlotFlags[i]); - } data << int32(Honor); data << int32(HonorNextLevel); data << int32(PerksProgramCurrency); data << uint8(NumBankSlots); + data << uint8(NumCharacterBankTabs); data << uint8(NumAccountBankTabs); for (uint32 i = 0; i < 1; ++i) { @@ -5017,9 +5182,11 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data.WriteBit(HasPerksProgramPendingReward); data.WriteBits(QuestSession.has_value(), 1); data.WriteBits(PetStable.has_value(), 1); + data.WriteBits(CharacterBankTabSettings.size(), 3); data.WriteBits(AccountBankTabSettings.size(), 3); data.WriteBits(WalkInData.has_value(), 1); data.WriteBits(DelveData.has_value(), 1); + data.WriteBits(ChallengeModeData.has_value(), 1); data.FlushBits(); ResearchHistory->WriteCreate(data, owner, receiver); if (QuestSession.has_value()) @@ -5049,6 +5216,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { PetStable->WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i) + { + CharacterBankTabSettings[i].WriteCreate(data, owner, receiver); + } for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) { AccountBankTabSettings[i].WriteCreate(data, owner, receiver); @@ -5061,6 +5232,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { DelveData->WriteCreate(data, owner, receiver); } + if (ChallengeModeData.has_value()) + { + ChallengeModeData->WriteCreate(data, owner, receiver); + } data.FlushBits(); } @@ -5071,8 +5246,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 17); - for (uint32 i = 0; i < 17; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 13); + for (uint32 i = 0; i < 13; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -5131,11 +5306,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data); } } - if (changesMask[42]) + if (changesMask[43]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { if (!ignoreNestedChangesMask) ResearchSites[i].WriteUpdateMask(data); @@ -5144,11 +5319,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[44]) + if (changesMask[45]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { if (!ignoreNestedChangesMask) ResearchSiteProgress[i].WriteUpdateMask(data); @@ -5157,11 +5332,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[46]) + if (changesMask[47]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[47]) + if (changesMask[48]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -5170,11 +5345,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[42]) + if (changesMask[43]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { for (uint32 j = 0; j < ResearchSites[i].size(); ++j) { @@ -5186,11 +5361,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[44]) + if (changesMask[45]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j) { @@ -5202,11 +5377,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[46]) + if (changesMask[47]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[47]) + if (changesMask[48]) { for (uint32 j = 0; j < Research[i].size(); ++j) { @@ -5731,6 +5906,13 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo if (changesMask[41]) { if (!ignoreNestedChangesMask) + CharacterBankTabSettings.WriteUpdateMask(data, 3); + else + WriteCompleteDynamicFieldUpdateMask(CharacterBankTabSettings.size(), data, 3); + } + if (changesMask[42]) + { + if (!ignoreNestedChangesMask) AccountBankTabSettings.WriteUpdateMask(data, 3); else WriteCompleteDynamicFieldUpdateMask(AccountBankTabSettings.size(), data, 3); @@ -5784,6 +5966,16 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[41]) { + for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i) + { + if (CharacterBankTabSettings.HasChanged(i) || ignoreNestedChangesMask) + { + CharacterBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[42]) + { for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) { if (AccountBankTabSettings.HasChanged(i) || ignoreNestedChangesMask) @@ -5792,364 +5984,368 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[48]) - { - data << *FarsightObject; - } if (changesMask[49]) { - data << *SummonedBattlePetGUID; + data << *FarsightObject; } if (changesMask[50]) { - data << uint64(Coinage); + data << *SummonedBattlePetGUID; } if (changesMask[51]) { - data << uint64(AccountBankCoinage); + data << uint64(Coinage); } if (changesMask[52]) { - data << int32(XP); + data << uint64(AccountBankCoinage); } if (changesMask[53]) { - data << int32(NextLevelXP); + data << int32(XP); } if (changesMask[54]) { - data << int32(TrialXP); + data << int32(NextLevelXP); } if (changesMask[55]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(TrialXP); } if (changesMask[56]) { - data << int32(CharacterPoints); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[57]) { - data << int32(MaxTalentTiers); + data << int32(CharacterPoints); } if (changesMask[58]) { - data << uint32(TrackCreatureMask); + data << int32(MaxTalentTiers); } if (changesMask[59]) { - data << float(MainhandExpertise); + data << uint32(TrackCreatureMask); } if (changesMask[60]) { - data << float(OffhandExpertise); + data << float(MainhandExpertise); } if (changesMask[61]) { - data << float(RangedExpertise); + data << float(OffhandExpertise); } if (changesMask[62]) { - data << float(CombatRatingExpertise); + data << float(RangedExpertise); } if (changesMask[63]) { - data << float(BlockPercentage); + data << float(CombatRatingExpertise); } if (changesMask[64]) { - data << float(DodgePercentage); + data << float(BlockPercentage); } if (changesMask[65]) { - data << float(DodgePercentageFromAttribute); + data << float(DodgePercentage); } if (changesMask[66]) { - data << float(ParryPercentage); + data << float(DodgePercentageFromAttribute); } if (changesMask[67]) { - data << float(ParryPercentageFromAttribute); + data << float(ParryPercentage); } if (changesMask[68]) { - data << float(CritPercentage); + data << float(ParryPercentageFromAttribute); } if (changesMask[69]) { - data << float(RangedCritPercentage); + data << float(CritPercentage); } } if (changesMask[70]) { if (changesMask[71]) { - data << float(OffhandCritPercentage); + data << float(RangedCritPercentage); } if (changesMask[72]) { - data << float(SpellCritPercentage); + data << float(OffhandCritPercentage); } if (changesMask[73]) { - data << int32(ShieldBlock); + data << float(SpellCritPercentage); } if (changesMask[74]) { - data << float(ShieldBlockCritPercentage); + data << int32(ShieldBlock); } if (changesMask[75]) { - data << float(Mastery); + data << float(ShieldBlockCritPercentage); } if (changesMask[76]) { - data << float(Speed); + data << float(Mastery); } if (changesMask[77]) { - data << float(Avoidance); + data << float(Speed); } if (changesMask[78]) { - data << float(Sturdiness); + data << float(Avoidance); } if (changesMask[79]) { - data << int32(Versatility); + data << float(Sturdiness); } if (changesMask[80]) { - data << float(VersatilityBonus); + data << int32(Versatility); } if (changesMask[81]) { - data << float(PvpPowerDamage); + data << float(VersatilityBonus); } if (changesMask[82]) { - data << float(PvpPowerHealing); + data << float(PvpPowerDamage); } if (changesMask[83]) { - BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << float(PvpPowerHealing); } if (changesMask[84]) { - data << int32(ModHealingDonePos); + BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[85]) { - data << float(ModHealingPercent); + data << int32(ModHealingDonePos); } if (changesMask[86]) { - data << float(ModPeriodicHealingDonePercent); + data << float(ModHealingPercent); } if (changesMask[87]) { - data << float(ModSpellPowerPercent); + data << float(ModPeriodicHealingDonePercent); } if (changesMask[88]) { - data << float(ModResiliencePercent); + data << float(ModSpellPowerPercent); } if (changesMask[89]) { - data << float(OverrideSpellPowerByAPPercent); + data << float(ModResiliencePercent); } if (changesMask[90]) { - data << float(OverrideAPBySpellPowerPercent); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[91]) { - data << int32(ModTargetResistance); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[92]) { - data << int32(ModTargetPhysicalResistance); + data << int32(ModTargetResistance); } if (changesMask[93]) { - data << uint32(LocalFlags); + data << int32(ModTargetPhysicalResistance); } if (changesMask[94]) { - data << uint8(GrantableLevels); + data << uint32(LocalFlags); } if (changesMask[95]) { - data << uint8(MultiActionBars); + data << uint8(GrantableLevels); } if (changesMask[96]) { - data << uint8(LifetimeMaxRank); + data << uint8(MultiActionBars); } if (changesMask[97]) { - data << uint8(NumRespecs); + data << uint8(LifetimeMaxRank); } if (changesMask[98]) { - data << uint32(PvpMedals); + data << uint8(NumRespecs); } if (changesMask[99]) { - data << uint16(TodayHonorableKills); + data << uint32(PvpMedals); } if (changesMask[100]) { - data << uint16(YesterdayHonorableKills); + data << uint16(TodayHonorableKills); } if (changesMask[101]) { - data << uint32(LifetimeHonorableKills); + data << uint16(YesterdayHonorableKills); } } if (changesMask[102]) { if (changesMask[103]) { - data << int32(WatchedFactionIndex); + data << uint32(LifetimeHonorableKills); } if (changesMask[104]) { - data << int32(MaxLevel); + data << int32(WatchedFactionIndex); } if (changesMask[105]) { - data << int32(ScalingPlayerLevelDelta); + data << int32(MaxLevel); } if (changesMask[106]) { - data << int32(MaxCreatureScalingLevel); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[107]) { - data << int32(PetSpellPower); + data << int32(MaxCreatureScalingLevel); } if (changesMask[108]) { - data << float(UiHitModifier); + data << int32(PetSpellPower); } if (changesMask[109]) { - data << float(UiSpellHitModifier); + data << float(UiHitModifier); } if (changesMask[110]) { - data << int32(HomeRealmTimeOffset); + data << float(UiSpellHitModifier); } if (changesMask[111]) { - data << float(ModPetHaste); + data << int32(HomeRealmTimeOffset); } if (changesMask[112]) { - data << int8(JailersTowerLevelMax); + data << float(ModPetHaste); } if (changesMask[113]) { - data << int8(JailersTowerLevel); + data << int8(JailersTowerLevelMax); } if (changesMask[114]) { - data << uint8(LocalRegenFlags); + data << int8(JailersTowerLevel); } if (changesMask[115]) { - data << uint8(AuraVision); + data << uint8(LocalRegenFlags); } if (changesMask[116]) { - data << uint8(NumBackpackSlots); + data << uint8(AuraVision); } if (changesMask[117]) { - data << int32(OverrideSpellsID); + data << uint8(NumBackpackSlots); } if (changesMask[118]) { - data << uint16(LootSpecID); + data << int32(OverrideSpellsID); } if (changesMask[119]) { - data << uint32(OverrideZonePVPType); + data << uint16(LootSpecID); } if (changesMask[120]) { - data << int32(Honor); + data << uint32(OverrideZonePVPType); } if (changesMask[121]) { - data << int32(HonorNextLevel); + data << int32(Honor); } if (changesMask[122]) { - data << int32(PerksProgramCurrency); + data << int32(HonorNextLevel); } if (changesMask[123]) { - data << uint8(NumBankSlots); + data << int32(PerksProgramCurrency); } if (changesMask[124]) { - data << uint8(NumAccountBankTabs); + data << uint8(NumBankSlots); } - if (changesMask[129]) + if (changesMask[125]) { - data << int32(UiChromieTimeExpansionID); + data << uint8(NumCharacterBankTabs); } - if (changesMask[130]) + if (changesMask[126]) { - data << int32(TimerunningSeasonID); + data << uint8(NumAccountBankTabs); } if (changesMask[131]) { - data << int32(TransportServerTime); + data << int32(UiChromieTimeExpansionID); } if (changesMask[132]) { - data << uint32(WeeklyRewardsPeriodSinceOrigin); + data << int32(TimerunningSeasonID); } if (changesMask[133]) { - data << int16(DEBUGSoulbindConduitRank); + data << int32(TransportServerTime); } } if (changesMask[134]) { + if (changesMask[135]) + { + data << uint32(WeeklyRewardsPeriodSinceOrigin); + } if (changesMask[136]) { + data << int16(DEBUGSoulbindConduitRank); + } + if (changesMask[138]) + { data << uint32(ActiveCombatTraitConfigID); } - if (changesMask[137]) + if (changesMask[139]) { data << int32(ItemUpgradeHighOnehandWeaponItemID); } - if (changesMask[138]) + if (changesMask[140]) { data << int32(ItemUpgradeHighFingerItemID); } - if (changesMask[139]) + if (changesMask[141]) { data << float(ItemUpgradeHighFingerWatermark); } - if (changesMask[140]) + if (changesMask[142]) { data << int32(ItemUpgradeHighTrinketItemID); } - if (changesMask[141]) + if (changesMask[143]) { data << float(ItemUpgradeHighTrinketWatermark); } - if (changesMask[142]) + if (changesMask[144]) { data << uint64(LootHistoryInstanceID); } - if (changesMask[144]) + if (changesMask[146]) { data << uint8(RequiredMountCapabilityFlags); } @@ -6163,183 +6359,181 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.WriteBits(PetStable.has_value(), 1); data.WriteBits(WalkInData.has_value(), 1); data.WriteBits(DelveData.has_value(), 1); + data.WriteBits(ChallengeModeData.has_value(), 1); } data.FlushBits(); if (changesMask[102]) { - if (changesMask[125]) + if (changesMask[127]) { ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[127]) + if (changesMask[129]) { if (QuestSession.has_value()) { QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[126]) + if (changesMask[128]) { data << *FrozenPerksVendorItem; } - if (changesMask[128]) + if (changesMask[130]) { Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } if (changesMask[134]) { - if (changesMask[135]) + if (changesMask[137]) { data << *DungeonScore; } - if (changesMask[143]) + if (changesMask[145]) { if (PetStable.has_value()) { PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[145]) + if (changesMask[147]) { if (WalkInData.has_value()) { WalkInData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[146]) + if (changesMask[148]) { if (DelveData.has_value()) { DelveData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } + if (changesMask[149]) + { + if (ChallengeModeData.has_value()) + { + ChallengeModeData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[147]) + if (changesMask[150]) { - for (uint32 i = 0; i < 232; ++i) + for (uint32 i = 0; i < 105; ++i) { - if (changesMask[148 + i]) + if (changesMask[151 + i]) { data << InvSlots[i]; } } } - if (changesMask[380]) + if (changesMask[256]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[381 + i]) + if (changesMask[257 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[383]) + if (changesMask[259]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[384 + i]) + if (changesMask[260 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[391 + i]) + if (changesMask[267 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[398 + i]) + if (changesMask[274 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[405 + i]) + if (changesMask[281 + i]) { data << float(ModHealingDonePercent[i]); } } } - if (changesMask[412]) + if (changesMask[288]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[413 + i]) + if (changesMask[289 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[416 + i]) + if (changesMask[292 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[419]) + if (changesMask[295]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[420 + i]) + if (changesMask[296 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[432 + i]) + if (changesMask[308 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[444]) + if (changesMask[320]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[445 + i]) + if (changesMask[321 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[477]) + if (changesMask[353]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[478 + i]) + if (changesMask[354 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[482]) + if (changesMask[358]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[483 + i]) + if (changesMask[359 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[485]) + if (changesMask[361]) { for (uint32 i = 0; i < 5; ++i) { - if (changesMask[486 + i]) + if (changesMask[362 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[491]) - { - for (uint32 i = 0; i < 7; ++i) - { - if (changesMask[492 + i]) - { - data << uint32(BankBagSlotFlags[i]); - } - } - } - if (changesMask[499]) + if (changesMask[367]) { for (uint32 i = 0; i < 17; ++i) { - if (changesMask[500 + i]) + if (changesMask[368 + i]) { data << float(ItemUpgradeHighWatermark[i]); } @@ -6392,6 +6586,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(CharacterRestrictions); Base::ClearChangesMask(TraitConfigs); Base::ClearChangesMask(CraftingOrders); + Base::ClearChangesMask(CharacterBankTabSettings); Base::ClearChangesMask(AccountBankTabSettings); Base::ClearChangesMask(FarsightObject); Base::ClearChangesMask(SummonedBattlePetGUID); @@ -6467,6 +6662,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(HonorNextLevel); Base::ClearChangesMask(PerksProgramCurrency); Base::ClearChangesMask(NumBankSlots); + Base::ClearChangesMask(NumCharacterBankTabs); Base::ClearChangesMask(NumAccountBankTabs); Base::ClearChangesMask(ResearchHistory); Base::ClearChangesMask(FrozenPerksVendorItem); @@ -6489,6 +6685,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(RequiredMountCapabilityFlags); Base::ClearChangesMask(WalkInData); Base::ClearChangesMask(DelveData); + Base::ClearChangesMask(ChallengeModeData); Base::ClearChangesMask(InvSlots); Base::ClearChangesMask(RestInfo); Base::ClearChangesMask(ModDamageDonePos); @@ -6503,11 +6700,44 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(NoReagentCostMask); Base::ClearChangesMask(ProfessionSkillLine); Base::ClearChangesMask(BagSlotFlags); - Base::ClearChangesMask(BankBagSlotFlags); Base::ClearChangesMask(ItemUpgradeHighWatermark); _changesMask.ResetAll(); } +void GameObjectAssistActionData::WriteCreate(ByteBuffer& data, GameObject const* owner, Player const* receiver) const +{ + data.WriteBits(PlayerName.size(), 6); + data.WriteBits(MonsterName.size() + 1, 11); + data << uint32(VirtualRealmAddress); + data << uint8(Sex); + data << int64(Time); + data << int32(DelveTier); + data << WorldPackets::SizedString::Data(PlayerName); + data << WorldPackets::SizedCString::Data(MonsterName); +} + +void GameObjectAssistActionData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, GameObject const* owner, Player const* receiver) const +{ + data.WriteBits(PlayerName.size(), 6); + data.WriteBits(MonsterName.size() + 1, 11); + data << uint32(VirtualRealmAddress); + data << uint8(Sex); + data << int64(Time); + data << int32(DelveTier); + data << WorldPackets::SizedString::Data(PlayerName); + data << WorldPackets::SizedCString::Data(MonsterName); +} + +bool GameObjectAssistActionData::operator==(GameObjectAssistActionData const& right) const +{ + return PlayerName == right.PlayerName + && MonsterName == right.MonsterName + && VirtualRealmAddress == right.VirtualRealmAddress + && Sex == right.Sex + && Time == right.Time + && DelveTier == right.DelveTier; +} + void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const { ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; @@ -6552,6 +6782,12 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie { data << int32(WorldEffects[i]); } + data.WriteBits(AssistActionData.has_value(), 1); + data.FlushBits(); + if (AssistActionData.has_value()) + { + AssistActionData->WriteCreate(data, owner, receiver); + } } void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const @@ -6561,7 +6797,7 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 25); + data.WriteBits(changesMask.GetBlock(0), 26); ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; @@ -6705,6 +6941,15 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool { data << uint32(UiWidgetItemUnknown1000); } + data.WriteBits(AssistActionData.has_value(), 1); + data.FlushBits(); + if (changesMask[25]) + { + if (AssistActionData.has_value()) + { + AssistActionData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } } @@ -6734,6 +6979,7 @@ void GameObjectData::ClearChangesMask() Base::ClearChangesMask(UiWidgetItemID); Base::ClearChangesMask(UiWidgetItemQuality); Base::ClearChangesMask(UiWidgetItemUnknown1000); + Base::ClearChangesMask(AssistActionData); _changesMask.ResetAll(); } @@ -7044,6 +7290,514 @@ void VisualAnim::ClearChangesMask() _changesMask.ResetAll(); } +void ForceSetAreaTriggerPositionAndRotation::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << TriggerGUID; + data << Position; + data << float(Rotation.x); + data << float(Rotation.y); + data << float(Rotation.z); + data << float(Rotation.w); +} + +void ForceSetAreaTriggerPositionAndRotation::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + data << TriggerGUID; + data << Position; + data << float(Rotation.x); + data << float(Rotation.y); + data << float(Rotation.z); + data << float(Rotation.w); +} + +bool ForceSetAreaTriggerPositionAndRotation::operator==(ForceSetAreaTriggerPositionAndRotation const& right) const +{ + return TriggerGUID == right.TriggerGUID + && Position == right.Position + && Rotation == right.Rotation; +} + +void AreaTriggerSplineCalculator::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data.WriteBits(Points.size(), 16); + data.WriteBit(Catmullrom); + for (uint32 i = 0; i < Points.size(); ++i) + { + data << Points[i]; + } + data.FlushBits(); +} + +void AreaTriggerSplineCalculator::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(Catmullrom); + } + if (changesMask[2]) + { + if (!ignoreChangesMask) + Points.WriteUpdateMask(data, 16); + else + WriteCompleteDynamicFieldUpdateMask(Points.size(), data, 16); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[2]) + { + for (uint32 i = 0; i < Points.size(); ++i) + { + if (Points.HasChanged(i) || ignoreChangesMask) + { + data << Points[i]; + } + } + } + } + data.FlushBits(); +} + +void AreaTriggerSplineCalculator::ClearChangesMask() +{ + Base::ClearChangesMask(Catmullrom); + Base::ClearChangesMask(Points); + _changesMask.ResetAll(); +} + +void AreaTriggerOrbit::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << *Center; + data << float(Radius); + data << float(InitialAngle); + data << float(BlendFromRadius); + data << int32(ExtraTimeForBlending); + data.WriteBit(CounterClockwise); + data.FlushBits(); +} + +void AreaTriggerOrbit::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(CounterClockwise); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data << *Center; + } + if (changesMask[3]) + { + data << float(Radius); + } + if (changesMask[4]) + { + data << float(InitialAngle); + } + if (changesMask[5]) + { + data << float(BlendFromRadius); + } + if (changesMask[6]) + { + data << int32(ExtraTimeForBlending); + } + } + data.FlushBits(); +} + +void AreaTriggerOrbit::ClearChangesMask() +{ + Base::ClearChangesMask(CounterClockwise); + Base::ClearChangesMask(Center); + Base::ClearChangesMask(Radius); + Base::ClearChangesMask(InitialAngle); + Base::ClearChangesMask(BlendFromRadius); + Base::ClearChangesMask(ExtraTimeForBlending); + _changesMask.ResetAll(); +} + +void AreaTriggerMovementScript::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << int32(SpellScriptID); + data << *Center; + data << uint32(CreationTime); +} + +void AreaTriggerMovementScript::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << int32(SpellScriptID); + } + if (changesMask[2]) + { + data << *Center; + } + if (changesMask[3]) + { + data << uint32(CreationTime); + } + } +} + +void AreaTriggerMovementScript::ClearChangesMask() +{ + Base::ClearChangesMask(SpellScriptID); + Base::ClearChangesMask(Center); + Base::ClearChangesMask(CreationTime); + _changesMask.ResetAll(); +} + +void AreaTriggerSphere::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << float(Radius); + data << float(RadiusTarget); +} + +void AreaTriggerSphere::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << float(Radius); + } + if (changesMask[2]) + { + data << float(RadiusTarget); + } + } +} + +void AreaTriggerSphere::ClearChangesMask() +{ + Base::ClearChangesMask(Radius); + Base::ClearChangesMask(RadiusTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerBox::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << *Extents; + data << *ExtentsTarget; +} + +void AreaTriggerBox::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << *Extents; + } + if (changesMask[2]) + { + data << *ExtentsTarget; + } + } +} + +void AreaTriggerBox::ClearChangesMask() +{ + Base::ClearChangesMask(Extents); + Base::ClearChangesMask(ExtentsTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerPolygon::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << uint32(Vertices.size()); + data << uint32(VerticesTarget.size()); + data << float(Height); + data << float(HeightTarget); + for (uint32 i = 0; i < Vertices.size(); ++i) + { + data << Vertices[i]; + } + for (uint32 i = 0; i < VerticesTarget.size(); ++i) + { + data << VerticesTarget[i]; + } +} + +void AreaTriggerPolygon::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 5); + + if (changesMask[0]) + { + if (changesMask[1]) + { + if (!ignoreChangesMask) + Vertices.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Vertices.size(), data); + } + if (changesMask[2]) + { + if (!ignoreChangesMask) + VerticesTarget.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(VerticesTarget.size(), data); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (uint32 i = 0; i < Vertices.size(); ++i) + { + if (Vertices.HasChanged(i) || ignoreChangesMask) + { + data << Vertices[i]; + } + } + } + if (changesMask[2]) + { + for (uint32 i = 0; i < VerticesTarget.size(); ++i) + { + if (VerticesTarget.HasChanged(i) || ignoreChangesMask) + { + data << VerticesTarget[i]; + } + } + } + if (changesMask[3]) + { + data << float(Height); + } + if (changesMask[4]) + { + data << float(HeightTarget); + } + } +} + +void AreaTriggerPolygon::ClearChangesMask() +{ + Base::ClearChangesMask(Vertices); + Base::ClearChangesMask(VerticesTarget); + Base::ClearChangesMask(Height); + Base::ClearChangesMask(HeightTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerCylinder::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << float(Radius); + data << float(RadiusTarget); + data << float(Height); + data << float(HeightTarget); + data << float(LocationZOffset); + data << float(LocationZOffsetTarget); +} + +void AreaTriggerCylinder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << float(Radius); + } + if (changesMask[2]) + { + data << float(RadiusTarget); + } + if (changesMask[3]) + { + data << float(Height); + } + if (changesMask[4]) + { + data << float(HeightTarget); + } + if (changesMask[5]) + { + data << float(LocationZOffset); + } + if (changesMask[6]) + { + data << float(LocationZOffsetTarget); + } + } +} + +void AreaTriggerCylinder::ClearChangesMask() +{ + Base::ClearChangesMask(Radius); + Base::ClearChangesMask(RadiusTarget); + Base::ClearChangesMask(Height); + Base::ClearChangesMask(HeightTarget); + Base::ClearChangesMask(LocationZOffset); + Base::ClearChangesMask(LocationZOffsetTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerDisk::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << float(InnerRadius); + data << float(InnerRadiusTarget); + data << float(OuterRadius); + data << float(OuterRadiusTarget); + data << float(Height); + data << float(HeightTarget); + data << float(LocationZOffset); + data << float(LocationZOffsetTarget); +} + +void AreaTriggerDisk::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 9); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << float(InnerRadius); + } + if (changesMask[2]) + { + data << float(InnerRadiusTarget); + } + if (changesMask[3]) + { + data << float(OuterRadius); + } + if (changesMask[4]) + { + data << float(OuterRadiusTarget); + } + if (changesMask[5]) + { + data << float(Height); + } + if (changesMask[6]) + { + data << float(HeightTarget); + } + if (changesMask[7]) + { + data << float(LocationZOffset); + } + if (changesMask[8]) + { + data << float(LocationZOffsetTarget); + } + } +} + +void AreaTriggerDisk::ClearChangesMask() +{ + Base::ClearChangesMask(InnerRadius); + Base::ClearChangesMask(InnerRadiusTarget); + Base::ClearChangesMask(OuterRadius); + Base::ClearChangesMask(OuterRadiusTarget); + Base::ClearChangesMask(Height); + Base::ClearChangesMask(HeightTarget); + Base::ClearChangesMask(LocationZOffset); + Base::ClearChangesMask(LocationZOffsetTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerBoundedPlane::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << *Extents; + data << *ExtentsTarget; +} + +void AreaTriggerBoundedPlane::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << *Extents; + } + if (changesMask[2]) + { + data << *ExtentsTarget; + } + } +} + +void AreaTriggerBoundedPlane::ClearChangesMask() +{ + Base::ClearChangesMask(Extents); + Base::ClearChangesMask(ExtentsTarget); + _changesMask.ResetAll(); +} + void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { OverrideScaleCurve->WriteCreate(data, owner, receiver); @@ -7059,20 +7813,72 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << float(BoundsRadius2D); data << uint32(DecalPropertiesID); data << *CreatingEffectGUID; - data << uint32(NumUnitsInside); - data << uint32(NumPlayersInside); data << *OrbitPathTarget; data << *RollPitchYaw; data << int32(PositionalSoundKitID); + data << uint32(MovementStartTime); + data << uint32(CreationTime); + data << float(ZOffset); + data << uint32(Flags); + data << uint32(ScaleCurveId); + data << uint32(FacingCurveId); + data << uint32(MorphCurveId); + data << uint32(MoveCurveId); + data << float(Facing); + data << int32(PathType); + data << uint8(ShapeType); + if (PathType == 3) + { + PathData.Get<UF::AreaTriggerMovementScript>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 0) + { + ShapeData.Get<UF::AreaTriggerSphere>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 1) + { + ShapeData.Get<UF::AreaTriggerBox>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 3) + { + ShapeData.Get<UF::AreaTriggerPolygon>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 4) + { + ShapeData.Get<UF::AreaTriggerCylinder>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 7) + { + ShapeData.Get<UF::AreaTriggerDisk>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 8) + { + ShapeData.Get<UF::AreaTriggerBoundedPlane>()->WriteCreate(data, owner, receiver); + } ExtraScaleCurve->WriteCreate(data, owner, receiver); data.FlushBits(); - data.WriteBit(HeightIgnoresScale); - data.WriteBit(Field_261); + data.WriteBits(TargetRollPitchYaw.has_value(), 1); + data.WriteBits(ForcedPositionAndRotation.has_value(), 1); OverrideMoveCurveX->WriteCreate(data, owner, receiver); + if (TargetRollPitchYaw.has_value()) + { + data << *TargetRollPitchYaw; + } + if (ForcedPositionAndRotation.has_value()) + { + ForcedPositionAndRotation->WriteCreate(data, owner, receiver); + } OverrideMoveCurveY->WriteCreate(data, owner, receiver); OverrideMoveCurveZ->WriteCreate(data, owner, receiver); VisualAnim->WriteCreate(data, owner, receiver); - data.FlushBits(); + if (PathType == 0) + { + PathData.Get<UF::AreaTriggerSplineCalculator>()->WriteCreate(data, owner, receiver); + } + if (PathType == 1) + { + PathData.Get<UF::AreaTriggerOrbit>()->WriteCreate(data, owner, receiver); + } } void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const @@ -7082,122 +7888,232 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 26); + data << uint32(changesMask.GetBlock(0)); + data.WriteBits(changesMask.GetBlock(1), 4); + data.FlushBits(); if (changesMask[0]) { if (changesMask[1]) { - data.WriteBit(HeightIgnoresScale); + OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[2]) + if (changesMask[6]) { - data.WriteBit(Field_261); + data << *Caster; } - } - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[3]) + if (changesMask[7]) { - OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << uint32(Duration); } if (changesMask[8]) { - data << *Caster; + data << uint32(TimeToTarget); } if (changesMask[9]) { - data << uint32(Duration); + data << uint32(TimeToTargetScale); } if (changesMask[10]) { - data << uint32(TimeToTarget); + data << uint32(TimeToTargetExtraScale); } if (changesMask[11]) { - data << uint32(TimeToTargetScale); + data << uint32(TimeToTargetPos); } if (changesMask[12]) { - data << uint32(TimeToTargetExtraScale); + data << int32(SpellID); } if (changesMask[13]) { - data << uint32(TimeToTargetPos); + data << int32(SpellForVisuals); } if (changesMask[14]) { - data << int32(SpellID); + SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[15]) { - data << int32(SpellForVisuals); + data << float(BoundsRadius2D); } if (changesMask[16]) { - SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << uint32(DecalPropertiesID); } if (changesMask[17]) { - data << float(BoundsRadius2D); + data << *CreatingEffectGUID; } if (changesMask[18]) { - data << uint32(DecalPropertiesID); + data << *OrbitPathTarget; } if (changesMask[19]) { - data << *CreatingEffectGUID; + data << *RollPitchYaw; } if (changesMask[20]) { - data << uint32(NumUnitsInside); + data << int32(PositionalSoundKitID); } if (changesMask[21]) { - data << uint32(NumPlayersInside); + data << uint32(MovementStartTime); } if (changesMask[22]) { - data << *OrbitPathTarget; + data << uint32(CreationTime); } if (changesMask[23]) { - data << *RollPitchYaw; + data << float(ZOffset); } - if (changesMask[24]) + if (changesMask[25]) { - data << int32(PositionalSoundKitID); + data << uint32(Flags); } - if (changesMask[4]) + if (changesMask[27]) + { + data << uint32(ScaleCurveId); + } + if (changesMask[28]) + { + data << uint32(FacingCurveId); + } + if (changesMask[29]) + { + data << uint32(MorphCurveId); + } + if (changesMask[30]) + { + data << uint32(MoveCurveId); + } + if (changesMask[31]) + { + data << float(Facing); + } + } + if (changesMask[32]) + { + if (changesMask[34]) + { + data << int32(PathType); + } + if (changesMask[35]) + { + data << uint8(ShapeType); + } + if (changesMask[34]) + { + if (PathType == 3) + { + PathData.Get<UF::AreaTriggerMovementScript>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + if (changesMask[35]) + { + if (ShapeType == 0) + { + ShapeData.Get<UF::AreaTriggerSphere>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 1) + { + ShapeData.Get<UF::AreaTriggerBox>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 3) + { + ShapeData.Get<UF::AreaTriggerPolygon>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 4) + { + ShapeData.Get<UF::AreaTriggerCylinder>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 7) + { + ShapeData.Get<UF::AreaTriggerDisk>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 8) + { + ShapeData.Get<UF::AreaTriggerBoundedPlane>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[0]) + { + if (changesMask[2]) { ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[5]) + } + data.FlushBits(); + if (changesMask[0]) + { + data.WriteBits(TargetRollPitchYaw.has_value(), 1); + } + if (changesMask[32]) + { + data.WriteBits(ForcedPositionAndRotation.has_value(), 1); + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[3]) { OverrideMoveCurveX->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[6]) + if (changesMask[24]) + { + if (TargetRollPitchYaw.has_value()) + { + data << *TargetRollPitchYaw; + } + } + } + if (changesMask[32]) + { + if (changesMask[33]) + { + if (ForcedPositionAndRotation.has_value()) + { + ForcedPositionAndRotation->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[0]) + { + if (changesMask[4]) { OverrideMoveCurveY->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[7]) + if (changesMask[5]) { OverrideMoveCurveZ->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[25]) + if (changesMask[26]) { VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - data.FlushBits(); + if (changesMask[32]) + { + if (changesMask[34]) + { + if (PathType == 0) + { + PathData.Get<UF::AreaTriggerSplineCalculator>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (PathType == 1) + { + PathData.Get<UF::AreaTriggerOrbit>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } } void AreaTriggerData::ClearChangesMask() { - Base::ClearChangesMask(HeightIgnoresScale); - Base::ClearChangesMask(Field_261); Base::ClearChangesMask(OverrideScaleCurve); Base::ClearChangesMask(ExtraScaleCurve); Base::ClearChangesMask(OverrideMoveCurveX); @@ -7215,12 +8131,25 @@ void AreaTriggerData::ClearChangesMask() Base::ClearChangesMask(BoundsRadius2D); Base::ClearChangesMask(DecalPropertiesID); Base::ClearChangesMask(CreatingEffectGUID); - Base::ClearChangesMask(NumUnitsInside); - Base::ClearChangesMask(NumPlayersInside); Base::ClearChangesMask(OrbitPathTarget); Base::ClearChangesMask(RollPitchYaw); Base::ClearChangesMask(PositionalSoundKitID); + Base::ClearChangesMask(MovementStartTime); + Base::ClearChangesMask(CreationTime); + Base::ClearChangesMask(ZOffset); + Base::ClearChangesMask(TargetRollPitchYaw); + Base::ClearChangesMask(Flags); Base::ClearChangesMask(VisualAnim); + Base::ClearChangesMask(ScaleCurveId); + Base::ClearChangesMask(FacingCurveId); + Base::ClearChangesMask(MorphCurveId); + Base::ClearChangesMask(MoveCurveId); + Base::ClearChangesMask(Facing); + Base::ClearChangesMask(ForcedPositionAndRotation); + Base::ClearChangesMask(PathType); + Base::ClearChangesMask(ShapeType); + Base::ClearChangesMask(PathData); + Base::ClearChangesMask(ShapeData); _changesMask.ResetAll(); } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 6635950cc62..db0f1859545 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -227,6 +227,8 @@ struct UnitChannel : public IsUpdateFieldStructureTag { int32 SpellID; UF::SpellCastVisual SpellVisual; + uint32 StartTimeMs; + uint32 Duration; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; @@ -258,7 +260,18 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<222> +struct UnitAssistActionData : public IsUpdateFieldStructureTag, public HasChangesMask<4> +{ + UpdateField<uint8, 0, 1> Type; + UpdateField<std::string, 0, 2> PlayerName; + UpdateField<uint32, 0, 3> VirtualRealmAddress; + + void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<223> { UpdateField<bool, 0, 1> Field_314; UpdateField<std::vector<uint32>, 0, 2> StateWorldEffectIDs; @@ -406,19 +419,20 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<222> UpdateField<float, 128, 132> Field_31C; UpdateField<float, 128, 133> Field_320; // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount UpdateField<ObjectGuid, 128, 134> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object - UpdateFieldArray<int32, 10, 135, 136> Power; - UpdateFieldArray<int32, 10, 135, 146> MaxPower; - UpdateFieldArray<float, 10, 135, 156> PowerRegenFlatModifier; - UpdateFieldArray<float, 10, 135, 166> PowerRegenInterruptedFlatModifier; - UpdateFieldArray<UF::VisibleItem, 3, 176, 177> VirtualItems; - UpdateFieldArray<uint32, 2, 180, 181> AttackRoundBaseTime; - UpdateFieldArray<int32, 4, 183, 184> Stats; - UpdateFieldArray<int32, 4, 183, 188> StatPosBuff; - UpdateFieldArray<int32, 4, 183, 192> StatNegBuff; - UpdateFieldArray<int32, 4, 183, 196> StatSupportBuff; - UpdateFieldArray<int32, 7, 200, 201> Resistances; - UpdateFieldArray<int32, 7, 200, 208> BonusResistanceMods; - UpdateFieldArray<int32, 7, 200, 215> ManaCostModifier; + OptionalUpdateField<UF::UnitAssistActionData, 128, 135> AssistActionData; + UpdateFieldArray<int32, 10, 136, 137> Power; + UpdateFieldArray<int32, 10, 136, 147> MaxPower; + UpdateFieldArray<float, 10, 136, 157> PowerRegenFlatModifier; + UpdateFieldArray<float, 10, 136, 167> PowerRegenInterruptedFlatModifier; + UpdateFieldArray<UF::VisibleItem, 3, 177, 178> VirtualItems; + UpdateFieldArray<uint32, 2, 181, 182> AttackRoundBaseTime; + UpdateFieldArray<int32, 4, 184, 185> Stats; + UpdateFieldArray<int32, 4, 184, 189> StatPosBuff; + UpdateFieldArray<int32, 4, 184, 193> StatNegBuff; + UpdateFieldArray<int32, 4, 184, 197> StatSupportBuff; + UpdateFieldArray<int32, 7, 201, 202> Resistances; + UpdateFieldArray<int32, 7, 201, 209> BonusResistanceMods; + UpdateFieldArray<int32, 7, 201, 216> ManaCostModifier; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; @@ -499,6 +513,25 @@ struct CTROptions : public IsUpdateFieldStructureTag bool operator!=(CTROptions const& right) const { return !(*this == right); } }; +struct LeaverInfo : public IsUpdateFieldStructureTag +{ + ObjectGuid BnetAccountGUID; + float LeaveScore; + uint32 SeasonID; + uint32 TotalLeaves; + uint32 TotalSuccesses; + int32 ConsecutiveSuccesses; + int64 LastPenaltyTime; + int64 LeaverExpirationTime; + int32 Unknown_1120; + uint32 LeaverStatus; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(LeaverInfo const& right) const; + bool operator!=(LeaverInfo const& right) const { return !(*this == right); } +}; + struct DeclinedNames : public IsUpdateFieldStructureTag, public HasChangesMask<6> { UpdateFieldArray<std::string, 5, 0, 1> Name; @@ -521,7 +554,7 @@ struct CustomTabardInfo : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<322> +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<324> { UpdateField<bool, 0, 1> HasQuestSession; UpdateField<bool, 0, 2> HasLevelLink; @@ -551,29 +584,31 @@ struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<322> UpdateField<int32, 0, 26> FakeInebriation; UpdateField<uint32, 0, 27> VirtualPlayerRealm; UpdateField<uint32, 0, 28> CurrentSpecID; - UpdateField<int32, 0, 29> TaxiMountAnimKitID; - UpdateField<uint8, 0, 30> CurrentBattlePetBreedQuality; - UpdateField<int32, 0, 31> HonorLevel; - UpdateField<int64, 32, 33> LogoutTime; - UpdateField<std::string, 32, 34> Name; - UpdateField<int32, 32, 35> Field_1AC; - UpdateField<int32, 32, 36> Field_1B0; - UpdateField<int32, 32, 37> CurrentBattlePetSpeciesID; - UpdateField<UF::CTROptions, 32, 38> CtrOptions; - UpdateField<int32, 32, 39> CovenantID; - UpdateField<int32, 32, 40> SoulbindID; - UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 41> DungeonScore; - UpdateField<ObjectGuid, 32, 42> SpectateTarget; - UpdateField<int32, 32, 43> Field_200; - OptionalUpdateField<UF::DeclinedNames, 32, 44> DeclinedNames; - UpdateField<UF::CustomTabardInfo, 32, 45> PersonalTabard; - UpdateFieldArray<uint8, 2, 46, 47> PartyType; - UpdateFieldArray<UF::QuestLog, 175, 49, 50> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 225, 226> VisibleItems; - UpdateFieldArray<float, 6, 245, 246> AvgItemLevel; - UpdateFieldArray<UF::ZonePlayerForcedReaction, 32, 252, 253> ForcedReactions; - UpdateFieldArray<WorldPackets::Item::ItemInstance, 16, 285, 286> VisibleEquipableSpells; - UpdateFieldArray<uint32, 19, 302, 303> Field_3120; + UpdateField<int32, 0, 29> CurrentCombatTraitConfigSubTreeID; + UpdateField<int32, 0, 30> TaxiMountAnimKitID; + UpdateField<uint8, 0, 31> CurrentBattlePetBreedQuality; + UpdateField<int32, 32, 33> HonorLevel; + UpdateField<int64, 32, 34> LogoutTime; + UpdateField<std::string, 32, 35> Name; + UpdateField<int32, 32, 36> Field_1AC; + UpdateField<int32, 32, 37> Field_1B0; + UpdateField<int32, 32, 38> CurrentBattlePetSpeciesID; + UpdateField<UF::CTROptions, 32, 39> CtrOptions; + UpdateField<int32, 32, 40> CovenantID; + UpdateField<int32, 32, 41> SoulbindID; + UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 42> DungeonScore; + UpdateField<UF::LeaverInfo, 32, 43> LeaverInfo; + UpdateField<ObjectGuid, 32, 44> SpectateTarget; + UpdateField<int32, 32, 45> Field_200; + OptionalUpdateField<UF::DeclinedNames, 32, 46> DeclinedNames; + UpdateField<UF::CustomTabardInfo, 32, 47> PersonalTabard; + UpdateFieldArray<uint8, 2, 48, 49> PartyType; + UpdateFieldArray<UF::QuestLog, 175, 51, 52> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 227, 228> VisibleItems; + UpdateFieldArray<float, 6, 247, 248> AvgItemLevel; + UpdateFieldArray<UF::ZonePlayerForcedReaction, 32, 254, 255> ForcedReactions; + UpdateFieldArray<WorldPackets::Item::ItemInstance, 16, 287, 288> VisibleEquipableSpells; + UpdateFieldArray<uint32, 19, 304, 305> Field_3120; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -791,6 +826,7 @@ struct TraitEntry : public IsUpdateFieldStructureTag int32 TraitNodeEntryID; int32 Rank; int32 GrantedRanks; + int32 BonusRanks; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -1025,6 +1061,24 @@ struct DelveData : public IsUpdateFieldStructureTag bool operator!=(DelveData const& right) const { return !(*this == right); } }; +struct ChallengeModeData : public IsUpdateFieldStructureTag +{ + int32 Unknown_1120_1; + int32 Unknown_1120_2; + uint64 Unknown_1120_3; + int64 Unknown_1120_4; + ObjectGuid KeystoneOwnerGUID; + ObjectGuid LeaverGUID; + uint32 IsActive; + uint32 HasRestrictions; + uint32 CanVoteAbandon; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(ChallengeModeData const& right) const; + bool operator!=(ChallengeModeData const& right) const { return !(*this == right); } +}; + struct Research : public IsUpdateFieldStructureTag { int16 ResearchProjectID; @@ -1035,7 +1089,7 @@ struct Research : public IsUpdateFieldStructureTag bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<517> +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<385> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BackpackSellJunkDisabled; @@ -1043,9 +1097,9 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField<bool, 0, 4> SortBagsRightToLeft; UpdateField<bool, 0, 5> InsertItemsLeftToRight; UpdateField<bool, 0, 6> HasPerksProgramPendingReward; - UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 42, 43> ResearchSites; - UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 44, 45> ResearchSiteProgress; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 46, 47> Research; + UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 43, 44> ResearchSites; + UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 45, 46> ResearchSiteProgress; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 47, 48> Research; DynamicUpdateField<uint64, 0, 7> KnownTitles; DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements; DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements; @@ -1079,119 +1133,121 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField<UF::CharacterRestriction, 0, 24> CharacterRestrictions; DynamicUpdateField<UF::TraitConfig, 32, 34> TraitConfigs; DynamicUpdateField<UF::CraftingOrder, 32, 35> CraftingOrders; - DynamicUpdateField<UF::BankTabSettings, 32, 41> AccountBankTabSettings; - UpdateField<ObjectGuid, 32, 48> FarsightObject; - UpdateField<ObjectGuid, 32, 49> SummonedBattlePetGUID; - UpdateField<uint64, 32, 50> Coinage; - UpdateField<uint64, 32, 51> AccountBankCoinage; - UpdateField<int32, 32, 52> XP; - UpdateField<int32, 32, 53> NextLevelXP; - UpdateField<int32, 32, 54> TrialXP; - UpdateField<UF::SkillInfo, 32, 55> Skill; - UpdateField<int32, 32, 56> CharacterPoints; - UpdateField<int32, 32, 57> MaxTalentTiers; - UpdateField<uint32, 32, 58> TrackCreatureMask; - UpdateField<float, 32, 59> MainhandExpertise; - UpdateField<float, 32, 60> OffhandExpertise; - UpdateField<float, 32, 61> RangedExpertise; - UpdateField<float, 32, 62> CombatRatingExpertise; - UpdateField<float, 32, 63> BlockPercentage; - UpdateField<float, 32, 64> DodgePercentage; - UpdateField<float, 32, 65> DodgePercentageFromAttribute; - UpdateField<float, 32, 66> ParryPercentage; - UpdateField<float, 32, 67> ParryPercentageFromAttribute; - UpdateField<float, 32, 68> CritPercentage; - UpdateField<float, 32, 69> RangedCritPercentage; - UpdateField<float, 70, 71> OffhandCritPercentage; - UpdateField<float, 70, 72> SpellCritPercentage; - UpdateField<int32, 70, 73> ShieldBlock; - UpdateField<float, 70, 74> ShieldBlockCritPercentage; - UpdateField<float, 70, 75> Mastery; - UpdateField<float, 70, 76> Speed; - UpdateField<float, 70, 77> Avoidance; - UpdateField<float, 70, 78> Sturdiness; - UpdateField<int32, 70, 79> Versatility; - UpdateField<float, 70, 80> VersatilityBonus; - UpdateField<float, 70, 81> PvpPowerDamage; - UpdateField<float, 70, 82> PvpPowerHealing; - UpdateField<UF::BitVectors, 70, 83> BitVectors; - UpdateField<int32, 70, 84> ModHealingDonePos; - UpdateField<float, 70, 85> ModHealingPercent; - UpdateField<float, 70, 86> ModPeriodicHealingDonePercent; - UpdateField<float, 70, 87> ModSpellPowerPercent; - UpdateField<float, 70, 88> ModResiliencePercent; - UpdateField<float, 70, 89> OverrideSpellPowerByAPPercent; - UpdateField<float, 70, 90> OverrideAPBySpellPowerPercent; - UpdateField<int32, 70, 91> ModTargetResistance; - UpdateField<int32, 70, 92> ModTargetPhysicalResistance; - UpdateField<uint32, 70, 93> LocalFlags; - UpdateField<uint8, 70, 94> GrantableLevels; - UpdateField<uint8, 70, 95> MultiActionBars; - UpdateField<uint8, 70, 96> LifetimeMaxRank; - UpdateField<uint8, 70, 97> NumRespecs; - UpdateField<uint32, 70, 98> PvpMedals; - UpdateField<uint16, 70, 99> TodayHonorableKills; - UpdateField<uint16, 70, 100> YesterdayHonorableKills; - UpdateField<uint32, 70, 101> LifetimeHonorableKills; - UpdateField<int32, 102, 103> WatchedFactionIndex; - UpdateField<int32, 102, 104> MaxLevel; - UpdateField<int32, 102, 105> ScalingPlayerLevelDelta; - UpdateField<int32, 102, 106> MaxCreatureScalingLevel; - UpdateField<int32, 102, 107> PetSpellPower; - UpdateField<float, 102, 108> UiHitModifier; - UpdateField<float, 102, 109> UiSpellHitModifier; - UpdateField<int32, 102, 110> HomeRealmTimeOffset; - UpdateField<float, 102, 111> ModPetHaste; - UpdateField<int8, 102, 112> JailersTowerLevelMax; - UpdateField<int8, 102, 113> JailersTowerLevel; - UpdateField<uint8, 102, 114> LocalRegenFlags; - UpdateField<uint8, 102, 115> AuraVision; - UpdateField<uint8, 102, 116> NumBackpackSlots; - UpdateField<int32, 102, 117> OverrideSpellsID; - UpdateField<uint16, 102, 118> LootSpecID; - UpdateField<uint32, 102, 119> OverrideZonePVPType; - UpdateField<int32, 102, 120> Honor; - UpdateField<int32, 102, 121> HonorNextLevel; - UpdateField<int32, 102, 122> PerksProgramCurrency; - UpdateField<uint8, 102, 123> NumBankSlots; - UpdateField<uint8, 102, 124> NumAccountBankTabs; - UpdateField<UF::ResearchHistory, 102, 125> ResearchHistory; - UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 126> FrozenPerksVendorItem; - UpdateField<UF::ActivePlayerUnk901, 102, 128> Field_1410; - OptionalUpdateField<UF::QuestSession, 102, 127> QuestSession; - UpdateField<int32, 102, 129> UiChromieTimeExpansionID; - UpdateField<int32, 102, 130> TimerunningSeasonID; - UpdateField<int32, 102, 131> TransportServerTime; - UpdateField<uint32, 102, 132> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField<int16, 102, 133> DEBUGSoulbindConduitRank; - UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 134, 135> DungeonScore; - UpdateField<uint32, 134, 136> ActiveCombatTraitConfigID; - UpdateField<int32, 134, 137> ItemUpgradeHighOnehandWeaponItemID; - UpdateField<int32, 134, 138> ItemUpgradeHighFingerItemID; - UpdateField<float, 134, 139> ItemUpgradeHighFingerWatermark; - UpdateField<int32, 134, 140> ItemUpgradeHighTrinketItemID; - UpdateField<float, 134, 141> ItemUpgradeHighTrinketWatermark; - UpdateField<uint64, 134, 142> LootHistoryInstanceID; - OptionalUpdateField<UF::StableInfo, 134, 143> PetStable; - UpdateField<uint8, 134, 144> RequiredMountCapabilityFlags; - OptionalUpdateField<UF::WalkInData, 134, 145> WalkInData; - OptionalUpdateField<UF::DelveData, 134, 146> DelveData; - UpdateFieldArray<ObjectGuid, 232, 147, 148> InvSlots; - UpdateFieldArray<UF::RestInfo, 2, 380, 381> RestInfo; - UpdateFieldArray<int32, 7, 383, 384> ModDamageDonePos; - UpdateFieldArray<int32, 7, 383, 391> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 383, 398> ModDamageDonePercent; - UpdateFieldArray<float, 7, 383, 405> ModHealingDonePercent; - UpdateFieldArray<float, 3, 412, 413> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 412, 416> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 419, 420> BuybackPrice; - UpdateFieldArray<int64, 12, 419, 432> BuybackTimestamp; - UpdateFieldArray<int32, 32, 444, 445> CombatRatings; - UpdateFieldArray<uint32, 4, 477, 478> NoReagentCostMask; - UpdateFieldArray<int32, 2, 482, 483> ProfessionSkillLine; - UpdateFieldArray<uint32, 5, 485, 486> BagSlotFlags; - UpdateFieldArray<uint32, 7, 491, 492> BankBagSlotFlags; - UpdateFieldArray<float, 17, 499, 500> ItemUpgradeHighWatermark; + DynamicUpdateField<UF::BankTabSettings, 32, 41> CharacterBankTabSettings; + DynamicUpdateField<UF::BankTabSettings, 32, 42> AccountBankTabSettings; + UpdateField<ObjectGuid, 32, 49> FarsightObject; + UpdateField<ObjectGuid, 32, 50> SummonedBattlePetGUID; + UpdateField<uint64, 32, 51> Coinage; + UpdateField<uint64, 32, 52> AccountBankCoinage; + UpdateField<int32, 32, 53> XP; + UpdateField<int32, 32, 54> NextLevelXP; + UpdateField<int32, 32, 55> TrialXP; + UpdateField<UF::SkillInfo, 32, 56> Skill; + UpdateField<int32, 32, 57> CharacterPoints; + UpdateField<int32, 32, 58> MaxTalentTiers; + UpdateField<uint32, 32, 59> TrackCreatureMask; + UpdateField<float, 32, 60> MainhandExpertise; + UpdateField<float, 32, 61> OffhandExpertise; + UpdateField<float, 32, 62> RangedExpertise; + UpdateField<float, 32, 63> CombatRatingExpertise; + UpdateField<float, 32, 64> BlockPercentage; + UpdateField<float, 32, 65> DodgePercentage; + UpdateField<float, 32, 66> DodgePercentageFromAttribute; + UpdateField<float, 32, 67> ParryPercentage; + UpdateField<float, 32, 68> ParryPercentageFromAttribute; + UpdateField<float, 32, 69> CritPercentage; + UpdateField<float, 70, 71> RangedCritPercentage; + UpdateField<float, 70, 72> OffhandCritPercentage; + UpdateField<float, 70, 73> SpellCritPercentage; + UpdateField<int32, 70, 74> ShieldBlock; + UpdateField<float, 70, 75> ShieldBlockCritPercentage; + UpdateField<float, 70, 76> Mastery; + UpdateField<float, 70, 77> Speed; + UpdateField<float, 70, 78> Avoidance; + UpdateField<float, 70, 79> Sturdiness; + UpdateField<int32, 70, 80> Versatility; + UpdateField<float, 70, 81> VersatilityBonus; + UpdateField<float, 70, 82> PvpPowerDamage; + UpdateField<float, 70, 83> PvpPowerHealing; + UpdateField<UF::BitVectors, 70, 84> BitVectors; + UpdateField<int32, 70, 85> ModHealingDonePos; + UpdateField<float, 70, 86> ModHealingPercent; + UpdateField<float, 70, 87> ModPeriodicHealingDonePercent; + UpdateField<float, 70, 88> ModSpellPowerPercent; + UpdateField<float, 70, 89> ModResiliencePercent; + UpdateField<float, 70, 90> OverrideSpellPowerByAPPercent; + UpdateField<float, 70, 91> OverrideAPBySpellPowerPercent; + UpdateField<int32, 70, 92> ModTargetResistance; + UpdateField<int32, 70, 93> ModTargetPhysicalResistance; + UpdateField<uint32, 70, 94> LocalFlags; + UpdateField<uint8, 70, 95> GrantableLevels; + UpdateField<uint8, 70, 96> MultiActionBars; + UpdateField<uint8, 70, 97> LifetimeMaxRank; + UpdateField<uint8, 70, 98> NumRespecs; + UpdateField<uint32, 70, 99> PvpMedals; + UpdateField<uint16, 70, 100> TodayHonorableKills; + UpdateField<uint16, 70, 101> YesterdayHonorableKills; + UpdateField<uint32, 102, 103> LifetimeHonorableKills; + UpdateField<int32, 102, 104> WatchedFactionIndex; + UpdateField<int32, 102, 105> MaxLevel; + UpdateField<int32, 102, 106> ScalingPlayerLevelDelta; + UpdateField<int32, 102, 107> MaxCreatureScalingLevel; + UpdateField<int32, 102, 108> PetSpellPower; + UpdateField<float, 102, 109> UiHitModifier; + UpdateField<float, 102, 110> UiSpellHitModifier; + UpdateField<int32, 102, 111> HomeRealmTimeOffset; + UpdateField<float, 102, 112> ModPetHaste; + UpdateField<int8, 102, 113> JailersTowerLevelMax; + UpdateField<int8, 102, 114> JailersTowerLevel; + UpdateField<uint8, 102, 115> LocalRegenFlags; + UpdateField<uint8, 102, 116> AuraVision; + UpdateField<uint8, 102, 117> NumBackpackSlots; + UpdateField<int32, 102, 118> OverrideSpellsID; + UpdateField<uint16, 102, 119> LootSpecID; + UpdateField<uint32, 102, 120> OverrideZonePVPType; + UpdateField<int32, 102, 121> Honor; + UpdateField<int32, 102, 122> HonorNextLevel; + UpdateField<int32, 102, 123> PerksProgramCurrency; + UpdateField<uint8, 102, 124> NumBankSlots; + UpdateField<uint8, 102, 125> NumCharacterBankTabs; + UpdateField<uint8, 102, 126> NumAccountBankTabs; + UpdateField<UF::ResearchHistory, 102, 127> ResearchHistory; + UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 128> FrozenPerksVendorItem; + UpdateField<UF::ActivePlayerUnk901, 102, 130> Field_1410; + OptionalUpdateField<UF::QuestSession, 102, 129> QuestSession; + UpdateField<int32, 102, 131> UiChromieTimeExpansionID; + UpdateField<int32, 102, 132> TimerunningSeasonID; + UpdateField<int32, 102, 133> TransportServerTime; + UpdateField<uint32, 134, 135> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin + UpdateField<int16, 134, 136> DEBUGSoulbindConduitRank; + UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 134, 137> DungeonScore; + UpdateField<uint32, 134, 138> ActiveCombatTraitConfigID; + UpdateField<int32, 134, 139> ItemUpgradeHighOnehandWeaponItemID; + UpdateField<int32, 134, 140> ItemUpgradeHighFingerItemID; + UpdateField<float, 134, 141> ItemUpgradeHighFingerWatermark; + UpdateField<int32, 134, 142> ItemUpgradeHighTrinketItemID; + UpdateField<float, 134, 143> ItemUpgradeHighTrinketWatermark; + UpdateField<uint64, 134, 144> LootHistoryInstanceID; + OptionalUpdateField<UF::StableInfo, 134, 145> PetStable; + UpdateField<uint8, 134, 146> RequiredMountCapabilityFlags; + OptionalUpdateField<UF::WalkInData, 134, 147> WalkInData; + OptionalUpdateField<UF::DelveData, 134, 148> DelveData; + OptionalUpdateField<UF::ChallengeModeData, 134, 149> ChallengeModeData; + UpdateFieldArray<ObjectGuid, 105, 150, 151> InvSlots; + UpdateFieldArray<UF::RestInfo, 2, 256, 257> RestInfo; + UpdateFieldArray<int32, 7, 259, 260> ModDamageDonePos; + UpdateFieldArray<int32, 7, 259, 267> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 259, 274> ModDamageDonePercent; + UpdateFieldArray<float, 7, 259, 281> ModHealingDonePercent; + UpdateFieldArray<float, 3, 288, 289> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 288, 292> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 295, 296> BuybackPrice; + UpdateFieldArray<int64, 12, 295, 308> BuybackTimestamp; + UpdateFieldArray<int32, 32, 320, 321> CombatRatings; + UpdateFieldArray<uint32, 4, 353, 354> NoReagentCostMask; + UpdateFieldArray<int32, 2, 358, 359> ProfessionSkillLine; + UpdateFieldArray<uint32, 5, 361, 362> BagSlotFlags; + UpdateFieldArray<float, 17, 367, 368> ItemUpgradeHighWatermark; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -1199,7 +1255,22 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<25> +struct GameObjectAssistActionData : public IsUpdateFieldStructureTag +{ + std::string PlayerName; + std::string MonsterName; + uint32 VirtualRealmAddress; + uint8 Sex; + int64 Time; + int32 DelveTier; + + void WriteCreate(ByteBuffer& data, GameObject const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, GameObject const* owner, Player const* receiver) const; + bool operator==(GameObjectAssistActionData const& right) const; + bool operator!=(GameObjectAssistActionData const& right) const { return !(*this == right); } +}; + +struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<26> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; struct StateWorldEffectIDsTag : ViewerDependentValueTag<std::vector<uint32>> {}; @@ -1232,6 +1303,7 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask< UpdateField<uint32, 0, 22> UiWidgetItemID; UpdateField<uint32, 0, 23> UiWidgetItemQuality; UpdateField<uint32, 0, 24> UiWidgetItemUnknown1000; + OptionalUpdateField<UF::GameObjectAssistActionData, 0, 25> AssistActionData; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; @@ -1300,33 +1372,163 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5> void ClearChangesMask(); }; -struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<26> -{ - UpdateField<bool, 0, 1> HeightIgnoresScale; - UpdateField<bool, 0, 2> Field_261; - UpdateField<UF::ScaleCurve, 0, 3> OverrideScaleCurve; - UpdateField<UF::ScaleCurve, 0, 4> ExtraScaleCurve; - UpdateField<UF::ScaleCurve, 0, 5> OverrideMoveCurveX; - UpdateField<UF::ScaleCurve, 0, 6> OverrideMoveCurveY; - UpdateField<UF::ScaleCurve, 0, 7> OverrideMoveCurveZ; - UpdateField<ObjectGuid, 0, 8> Caster; - UpdateField<uint32, 0, 9> Duration; - UpdateField<uint32, 0, 10> TimeToTarget; - UpdateField<uint32, 0, 11> TimeToTargetScale; - UpdateField<uint32, 0, 12> TimeToTargetExtraScale; - UpdateField<uint32, 0, 13> TimeToTargetPos; // Linked to m_overrideMoveCurve - UpdateField<int32, 0, 14> SpellID; - UpdateField<int32, 0, 15> SpellForVisuals; - UpdateField<UF::SpellCastVisual, 0, 16> SpellVisual; - UpdateField<float, 0, 17> BoundsRadius2D; - UpdateField<uint32, 0, 18> DecalPropertiesID; - UpdateField<ObjectGuid, 0, 19> CreatingEffectGUID; - UpdateField<uint32, 0, 20> NumUnitsInside; - UpdateField<uint32, 0, 21> NumPlayersInside; // When not 0 this causes SpellVisualEvent 14 to trigger, playing alternate visuals, typically used by "SOAK THIS" areatriggers - UpdateField<ObjectGuid, 0, 22> OrbitPathTarget; - UpdateField<TaggedPosition<Position::XYZ>, 0, 23> RollPitchYaw; - UpdateField<int32, 0, 24> PositionalSoundKitID; - UpdateField<UF::VisualAnim, 0, 25> VisualAnim; +struct ForceSetAreaTriggerPositionAndRotation : public IsUpdateFieldStructureTag +{ + ObjectGuid TriggerGUID; + TaggedPosition<::Position::XYZ> Position; + QuaternionData Rotation; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + bool operator==(ForceSetAreaTriggerPositionAndRotation const& right) const; + bool operator!=(ForceSetAreaTriggerPositionAndRotation const& right) const { return !(*this == right); } +}; + +struct AreaTriggerSplineCalculator : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<bool, 0, 1> Catmullrom; + DynamicUpdateField<TaggedPosition<Position::XYZ>, 0, 2> Points; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerOrbit : public IsUpdateFieldStructureTag, public HasChangesMask<7> +{ + UpdateField<bool, 0, 1> CounterClockwise; + UpdateField<TaggedPosition<Position::XYZ>, 0, 2> Center; + UpdateField<float, 0, 3> Radius; + UpdateField<float, 0, 4> InitialAngle; + UpdateField<float, 0, 5> BlendFromRadius; + UpdateField<int32, 0, 6> ExtraTimeForBlending; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerMovementScript : public IsUpdateFieldStructureTag, public HasChangesMask<4> +{ + UpdateField<int32, 0, 1> SpellScriptID; + UpdateField<TaggedPosition<Position::XYZ>, 0, 2> Center; + UpdateField<uint32, 0, 3> CreationTime; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerSphere : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<float, 0, 1> Radius; + UpdateField<float, 0, 2> RadiusTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerBox : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<TaggedPosition<Position::XYZ>, 0, 1> Extents; + UpdateField<TaggedPosition<Position::XYZ>, 0, 2> ExtentsTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerPolygon : public IsUpdateFieldStructureTag, public HasChangesMask<5> +{ + DynamicUpdateField<TaggedPosition<Position::XY>, 0, 1> Vertices; + DynamicUpdateField<TaggedPosition<Position::XY>, 0, 2> VerticesTarget; + UpdateField<float, 0, 3> Height; + UpdateField<float, 0, 4> HeightTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerCylinder : public IsUpdateFieldStructureTag, public HasChangesMask<7> +{ + UpdateField<float, 0, 1> Radius; + UpdateField<float, 0, 2> RadiusTarget; + UpdateField<float, 0, 3> Height; + UpdateField<float, 0, 4> HeightTarget; + UpdateField<float, 0, 5> LocationZOffset; + UpdateField<float, 0, 6> LocationZOffsetTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerDisk : public IsUpdateFieldStructureTag, public HasChangesMask<9> +{ + UpdateField<float, 0, 1> InnerRadius; + UpdateField<float, 0, 2> InnerRadiusTarget; + UpdateField<float, 0, 3> OuterRadius; + UpdateField<float, 0, 4> OuterRadiusTarget; + UpdateField<float, 0, 5> Height; + UpdateField<float, 0, 6> HeightTarget; + UpdateField<float, 0, 7> LocationZOffset; + UpdateField<float, 0, 8> LocationZOffsetTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerBoundedPlane : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<TaggedPosition<Position::XY>, 0, 1> Extents; + UpdateField<TaggedPosition<Position::XY>, 0, 2> ExtentsTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<36> +{ + UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve; + UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve; + UpdateField<UF::ScaleCurve, 0, 3> OverrideMoveCurveX; + UpdateField<UF::ScaleCurve, 0, 4> OverrideMoveCurveY; + UpdateField<UF::ScaleCurve, 0, 5> OverrideMoveCurveZ; + UpdateField<ObjectGuid, 0, 6> Caster; + UpdateField<uint32, 0, 7> Duration; + UpdateField<uint32, 0, 8> TimeToTarget; + UpdateField<uint32, 0, 9> TimeToTargetScale; + UpdateField<uint32, 0, 10> TimeToTargetExtraScale; + UpdateField<uint32, 0, 11> TimeToTargetPos; // Linked to m_overrideMoveCurve + UpdateField<int32, 0, 12> SpellID; + UpdateField<int32, 0, 13> SpellForVisuals; + UpdateField<UF::SpellCastVisual, 0, 14> SpellVisual; + UpdateField<float, 0, 15> BoundsRadius2D; + UpdateField<uint32, 0, 16> DecalPropertiesID; + UpdateField<ObjectGuid, 0, 17> CreatingEffectGUID; + UpdateField<ObjectGuid, 0, 18> OrbitPathTarget; + UpdateField<TaggedPosition<Position::XYZ>, 0, 19> RollPitchYaw; + UpdateField<int32, 0, 20> PositionalSoundKitID; + UpdateField<uint32, 0, 21> MovementStartTime; + UpdateField<uint32, 0, 22> CreationTime; + UpdateField<float, 0, 23> ZOffset; + OptionalUpdateField<TaggedPosition<Position::XYZ>, 0, 24> TargetRollPitchYaw; + UpdateField<uint32, 0, 25> Flags; + UpdateField<UF::VisualAnim, 0, 26> VisualAnim; + UpdateField<uint32, 0, 27> ScaleCurveId; + UpdateField<uint32, 0, 28> FacingCurveId; + UpdateField<uint32, 0, 29> MorphCurveId; + UpdateField<uint32, 0, 30> MoveCurveId; + UpdateField<float, 0, 31> Facing; + OptionalUpdateField<UF::ForceSetAreaTriggerPositionAndRotation, 32, 33> ForcedPositionAndRotation; + UpdateField<int32, 32, 34> PathType; + UpdateField<uint8, 32, 35> ShapeType; + VariantUpdateField<32, 34, UF::AreaTriggerSplineCalculator, UF::AreaTriggerOrbit, UF::AreaTriggerMovementScript> PathData; + VariantUpdateField<32, 35, UF::AreaTriggerSphere, UF::AreaTriggerBox, UF::AreaTriggerPolygon, UF::AreaTriggerCylinder, UF::AreaTriggerDisk, UF::AreaTriggerBoundedPlane> ShapeData; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3ac1815f4f6..1d28e4f8aac 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -337,8 +337,6 @@ Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) healthBeforeDuel = 0; manaBeforeDuel = 0; - memset(_voidStorageItems, 0, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*)); - _cinematicMgr = std::make_unique<CinematicMgr>(this); m_achievementMgr = std::make_unique<PlayerAchievementMgr>(this); @@ -374,9 +372,6 @@ Player::~Player() for (ItemSetEffect* itemSetEff : ItemSetEff) DeleteItemSetEffects(itemSetEff); - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - delete _voidStorageItems[i]; - sWorld->DecreasePlayerCount(); } @@ -3719,21 +3714,9 @@ void Player::DestroyForPlayer(Player* target) const if (target == this) { - for (uint8 i = EQUIPMENT_SLOT_START; i < BANK_SLOT_BAG_END; ++i) - { - if (m_items[i] == nullptr) - continue; - - m_items[i]->DestroyForPlayer(target); - } - - for (uint8 i = REAGENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) - { - if (m_items[i] == nullptr) - continue; - - m_items[i]->DestroyForPlayer(target); - } + for (Item* item : m_items) + if (item) + item->DestroyForPlayer(target); } } @@ -4195,10 +4178,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID); - stmt->setUInt64(0, guid); - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_FISHINGSTEPS); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4233,6 +4212,18 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID); + stmt->setUInt64(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID); + stmt->setUInt64(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, guid); + trans->Append(stmt); + sCharacterCache->DeleteCharacterCacheEntry(playerguid, name); break; } @@ -9488,10 +9479,6 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location / if (location.HasFlag(ItemSearchLocation::Bank)) { - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) - if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - ++freeSlotCount; - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) if (Bag* bag = GetBagByPos(i)) for (uint32 j = 0; j < GetBagSize(bag); ++j) @@ -9506,10 +9493,6 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location / for (uint32 j = 0; j < GetBagSize(bag); ++j) if (!GetItemInBag(bag, j)) ++freeSlotCount; - - for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) - if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - ++freeSlotCount; } return freeSlotCount; @@ -9759,21 +9742,10 @@ bool Player::IsEquipmentPos(uint8 bag, uint8 slot) bool Player::IsBankPos(uint8 bag, uint8 slot) { - if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)) - return true; if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)) return true; if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END) return true; - if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END)) - return true; - return false; -} - -bool Player::IsReagentBankPos(uint8 bag, uint8 slot) -{ - if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END)) - return true; return false; } @@ -9795,6 +9767,13 @@ bool Player::IsChildEquipmentPos(uint8 bag, uint8 slot) return bag == INVENTORY_SLOT_BAG_0 && (slot >= CHILD_EQUIPMENT_SLOT_START && slot < CHILD_EQUIPMENT_SLOT_END); } +bool Player::IsAccountBankPos(uint8 bag, uint8 /*slot*/) +{ + if (bag >= ACCOUNT_BANK_SLOT_BAG_START && bag < ACCOUNT_BANK_SLOT_BAG_END) + return true; + return false; +} + bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const { // post selected @@ -9827,18 +9806,10 @@ bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const if (slot >= INVENTORY_SLOT_ITEM_START && slot < INVENTORY_SLOT_ITEM_START + GetInventorySlotCount()) return true; - // bank main slots - if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END) - return true; - // bank bag slots if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END) return true; - // reagent bank bag slots - if (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END) - return true; - return false; } @@ -10126,10 +10097,6 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP // prevent cheating if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END) return EQUIP_ERR_WRONG_BAG_TYPE; - - // can't store anything else than crafting reagents in Reagent Bank - if (IsReagentBankPos(bag, slot) && (!IsReagentBankUnlocked() || !pProto->IsCraftingReagent())) - return EQUIP_ERR_WRONG_BAG_TYPE; } else { @@ -11072,12 +11039,6 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest ASSERT(bag == NULL_BAG && slot == NULL_SLOT); // when reagentBankOnly is true then bag & slot must be hardcoded constants, not client input } - if ((IsReagentBankPos(bag, slot) || reagentBankOnly) && !IsReagentBankUnlocked()) - return EQUIP_ERR_REAGENT_BANK_LOCKED; - - uint8 slotStart = reagentBankOnly ? uint8(REAGENT_SLOT_START) : uint8(BANK_SLOT_ITEM_START); - uint8 slotEnd = reagentBankOnly ? uint8(REAGENT_SLOT_END) : uint8(BANK_SLOT_ITEM_END); - uint32 count = pItem->GetCount(); TC_LOG_DEBUG("entities.player.items", "Player::CanBankItem: Player '{}' ({}), Bag: {}, Slot: {}, Item: {}, Count: {}", @@ -11114,7 +11075,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest if (!pItem->IsBag()) return EQUIP_ERR_WRONG_SLOT; - if (slot - BANK_SLOT_BAG_START >= GetBankBagSlotCount()) + if (slot - BANK_SLOT_BAG_START >= GetCharacterBankTabCount()) return EQUIP_ERR_NO_BANK_SLOT; res = CanUseItem(pItem, not_loading); @@ -11143,12 +11104,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest { if (bag == INVENTORY_SLOT_BAG_0) { - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; + return EQUIP_ERR_WRONG_SLOT; // TODO: check if INVENTORY_SLOT_BAG_0 condition is neccessary } else { @@ -11167,12 +11123,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest // search free slot in bag if (bag == INVENTORY_SLOT_BAG_0) { - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, false, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; + return EQUIP_ERR_WRONG_SLOT; // TODO: check if INVENTORY_SLOT_BAG_0 condition is neccessary } else { @@ -11193,50 +11144,14 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest // search stack for merge to if (pProto->GetMaxStackSize() != 1) { - // in slots - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; - - // don't try to store reagents anywhere else than in Reagent Bank if we're on it - if (!reagentBankOnly) - { - // in special bags - if (pProto->GetBagFamily()) - { - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - continue; - - if (count == 0) - return EQUIP_ERR_OK; - } - } - - // in regular bags - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - continue; - - if (count == 0) - return EQUIP_ERR_OK; - } - } - } - - // search free space in special bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it) - if (!reagentBankOnly && pProto->GetBagFamily()) - { + // in regular bags for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { - res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot); + // only consider tabs marked as reagents if requested + if (reagentBankOnly && !(*m_activePlayerData->CharacterBankTabSettings[i - BANK_SLOT_BAG_START].DepositFlags & AsUnderlyingType(BagSlotFlags::PriorityReagents))) + continue; + + res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot); if (res != EQUIP_ERR_OK) continue; @@ -11245,26 +11160,19 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest } } - // search free space - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, false, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; - - // search free space in regular bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it) - if (!reagentBankOnly) + // search free space in regular bags + for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - continue; + // only consider tabs marked as reagents if requested + if (reagentBankOnly && !(*m_activePlayerData->CharacterBankTabSettings[i - BANK_SLOT_BAG_START].DepositFlags & AsUnderlyingType(BagSlotFlags::PriorityReagents))) + continue; - if (count == 0) - return EQUIP_ERR_OK; - } + res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + continue; + + if (count == 0) + return EQUIP_ERR_OK; } return reagentBankOnly ? EQUIP_ERR_REAGENT_BANK_FULL : EQUIP_ERR_BANK_FULL; @@ -12272,33 +12180,6 @@ uint32 Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, boo } } - // in bank - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; i++) - { - if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - { - if (item->GetEntry() == itemEntry && !item->IsInTrade()) - { - if (item->GetCount() + remcount <= count) - { - remcount += item->GetCount(); - DestroyItem(INVENTORY_SLOT_BAG_0, i, update); - if (remcount >= count) - return remcount; - } - else - { - item->SetCount(item->GetCount() - count + remcount); - ItemRemovedQuestCheck(item->GetEntry(), count - remcount); - if (IsInWorld() && update) - item->SendUpdateToPlayer(this); - item->SetState(ITEM_CHANGED, this); - return count; - } - } - } - } - // in bank bags for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { @@ -12364,34 +12245,6 @@ uint32 Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, boo } } - for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) - { - if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - { - if (item->GetEntry() == itemEntry && !item->IsInTrade()) - { - if (item->GetCount() + remcount <= count) - { - // all keys can be unequipped - remcount += item->GetCount(); - DestroyItem(INVENTORY_SLOT_BAG_0, i, update); - - if (remcount >= count) - return remcount; - } - else - { - item->SetCount(item->GetCount() - count + remcount); - ItemRemovedQuestCheck(item->GetEntry(), count - remcount); - if (IsInWorld() && update) - item->SendUpdateToPlayer(this); - item->SetState(ITEM_CHANGED, this); - return count; - } - } - } - } - for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) { if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) @@ -12746,12 +12599,6 @@ void Player::SwapItem(uint16 src, uint16 dst) } } - if (IsReagentBankPos(dst) && !IsReagentBankUnlocked()) - { - SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED, pSrcItem, pDstItem); - return; - } - // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions) // or swap empty bag with another empty or not empty bag (with items exchange) @@ -12785,8 +12632,7 @@ void Player::SwapItem(uint16 src, uint16 dst) RemoveItem(srcbag, srcslot, true); BankItem(dest, pSrcItem, true); - if (!IsReagentBankPos(dst)) - ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount()); + ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount()); } else if (IsEquipmentPos(dst)) { @@ -17819,7 +17665,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol struct PlayerLoadData { // "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " - // "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " + // "bankSlots, bankTabs, bankBagFlags, restState, playerFlags, playerFlagsEx, " // "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " // "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " // "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " @@ -17841,8 +17687,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol EnumFlag<BagSlotFlags> inventoryBagFlags = BagSlotFlags::None; std::array<BagSlotFlags, 5> bagSlotFlags; uint8 bankSlots; + uint8 bankTabs; EnumFlag<BagSlotFlags> bankBagFlags = BagSlotFlags::None; - std::array<BagSlotFlags, 7> bankBagSlotFlags; PlayerRestState restState; PlayerFlags playerFlags; PlayerFlagsEx playerFlagsEx; @@ -17921,9 +17767,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol for (BagSlotFlags& flags : bagSlotFlags) flags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); bankSlots = fields[i++].GetUInt8(); + bankTabs = fields[i++].GetUInt8(); bankBagFlags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); - for (BagSlotFlags& flags : bankBagSlotFlags) - flags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); restState = PlayerRestState(fields[i++].GetUInt8()); playerFlags = PlayerFlags(fields[i++].GetUInt32()); playerFlagsEx = PlayerFlagsEx(fields[i++].GetUInt32()); @@ -18083,9 +17928,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol for (uint32 bagIndex = 0; bagIndex < fields.bagSlotFlags.size(); ++bagIndex) ReplaceAllBagSlotFlags(bagIndex, fields.bagSlotFlags[bagIndex]); SetBankBagSlotCount(fields.bankSlots); + SetCharacterBankTabCount(fields.bankTabs); SetBankAutoSortDisabled(fields.bankBagFlags.HasFlag(BagSlotFlags::DisableAutoSort)); - for (uint32 bagIndex = 0; bagIndex < fields.bankBagSlotFlags.size(); ++bagIndex) - ReplaceAllBankBagSlotFlags(bagIndex, fields.bankBagSlotFlags[bagIndex]); SetNativeGender(fields.gender); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Inebriation), fields.drunk); ReplaceAllPlayerFlags(fields.playerFlags); @@ -18520,6 +18364,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol // must be before inventory (some items required reputation check) m_reputationMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_REPUTATION)); + _LoadCharacterBankTabSettings(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANK_TAB_SETTINGS)); + _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ARTIFACTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE), @@ -18528,9 +18374,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED), time_diff); - if (IsVoidStorageUnlocked()) - _LoadVoidStorage(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE)); - // update items with duration and realtime UpdateItemDuration(time_diff, true); @@ -19195,63 +19038,6 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti ApplyAllAzeriteItemMods(true); } -void Player::_LoadVoidStorage(PreparedQueryResult result) -{ - if (!result) - return; - - do - { - // SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? - Field* fields = result->Fetch(); - - uint64 itemId = fields[0].GetUInt64(); - uint32 itemEntry = fields[1].GetUInt32(); - uint8 slot = fields[2].GetUInt8(); - ObjectGuid creatorGuid = fields[3].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()) : ObjectGuid::Empty; - ItemRandomBonusListId randomBonusListId = fields[4].GetUInt32(); - uint32 fixedScalingLevel = fields[5].GetUInt32(); - uint32 artifactKnowledgeLevel = fields[6].GetUInt32(); - ItemContext context = ItemContext(fields[7].GetUInt8()); - std::vector<int32> bonusListIDs; - for (std::string_view bonusListIDtoken : Trinity::Tokenize(fields[8].GetStringView(), ' ', false)) - if (Optional<int32> bonusListID = Trinity::StringTo<int32>(bonusListIDtoken)) - bonusListIDs.push_back(*bonusListID); - - if (!itemId) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '{}' ({}) has an item with an invalid id (item id: {}, entry: {}).", - GetName(), GetGUID().ToString(), itemId, itemEntry); - continue; - } - - if (!sObjectMgr->GetItemTemplate(itemEntry)) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '{}' ({}) has an item with an invalid entry (item id: {}, entry: {}).", - GetName(), GetGUID().ToString(), itemId, itemEntry); - continue; - } - - if (slot >= VOID_STORAGE_MAX_SLOT) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '{}' ({}) has an item with an invalid slot (item id: {}, entry: {}, slot: {}).", - GetName(), GetGUID().ToString(), itemId, itemEntry, slot); - continue; - } - - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, - context, bonusListIDs); - - WorldPackets::Item::ItemInstance voidInstance; - voidInstance.Initialize(_voidStorageItems[slot]); - BonusData bonus; - bonus.Initialize(voidInstance); - - GetSession()->GetCollectionMgr()->AddItemAppearance(itemEntry, bonus.AppearanceModID); - } - while (result->NextRow()); -} - Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field* fields) { Item* item = nullptr; @@ -20300,6 +20086,27 @@ void Player::_LoadPlayerData(PreparedQueryResult elementsResult, PreparedQueryRe } } +void Player::_LoadCharacterBankTabSettings(PreparedQueryResult result) +{ + if (result) + { + do + { + DEFINE_FIELD_ACCESSOR_CACHE_ANONYMOUS(PreparedResultSet, (tabId)(name)(icon)(description)(depositFlags)) fields { *result }; + + if (fields.tabId().GetUInt8() >= (BANK_SLOT_BAG_END - BANK_SLOT_BAG_START)) + continue; + + SetCharacterBankTabSettings(fields.tabId().GetUInt8(), fields.name().GetString(), fields.icon().GetString(), + fields.description().GetString(), static_cast<BagSlotFlags>(fields.depositFlags().GetUInt32())); + + } while (result->NextRow()); + } + + while (m_activePlayerData->CharacterBankTabSettings.size() < *m_activePlayerData->NumCharacterBankTabs) + AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterBankTabSettings)); +} + /*********************************************************/ /*** SAVE SYSTEM ***/ /*********************************************************/ @@ -20372,6 +20179,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba for (uint32 bagSlotFlag : m_activePlayerData->BagSlotFlags) stmt->setUInt32(index++, bagSlotFlag); stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt8(index++, GetCharacterBankTabCount()); stmt->setUInt32(index++, [&] { BagSlotFlags inventoryFlags = BagSlotFlags::None; @@ -20379,8 +20187,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba inventoryFlags |= BagSlotFlags::DisableAutoSort; return AsUnderlyingType(inventoryFlags); }()); - for (uint32 bankBagSlotFlag : m_activePlayerData->BankBagSlotFlags) - stmt->setUInt32(index++, bankBagSlotFlag); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); stmt->setUInt32(index++, m_playerData->PlayerFlags); stmt->setUInt32(index++, m_playerData->PlayerFlagsEx); @@ -20512,6 +20318,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba for (uint32 bagSlotFlag : m_activePlayerData->BagSlotFlags) stmt->setUInt32(index++, bagSlotFlag); stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt8(index++, GetCharacterBankTabCount()); stmt->setUInt32(index++, [&] { BagSlotFlags inventoryFlags = BagSlotFlags::None; @@ -20519,8 +20326,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba inventoryFlags |= BagSlotFlags::DisableAutoSort; return AsUnderlyingType(inventoryFlags); }()); - for (uint32 bankBagSlotFlag : m_activePlayerData->BankBagSlotFlags) - stmt->setUInt32(index++, bankBagSlotFlag); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); stmt->setUInt32(index++, m_playerData->PlayerFlags); stmt->setUInt32(index++, m_playerData->PlayerFlagsEx); @@ -20675,7 +20480,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba _SaveCustomizations(trans); _SaveBGData(trans); _SaveInventory(trans); - _SaveVoidStorage(trans); _SaveQuestStatus(trans); _SaveDailyQuestStatus(trans); _SaveWeeklyQuestStatus(trans); @@ -20699,6 +20503,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba _SaveCurrency(trans); _SaveCUFProfiles(trans); _SavePlayerData(trans); + _SaveCharacterBankTabSettings(trans); if (_garrison) _garrison->SaveToDB(trans); @@ -21044,42 +20849,6 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) m_itemUpdateQueue.clear(); } -void Player::_SaveVoidStorage(CharacterDatabaseTransaction trans) -{ - CharacterDatabasePreparedStatement* stmt = nullptr; - - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - { - if (!_voidStorageItems[i]) // unused item - { - // DELETE FROM void_storage WHERE slot = ? AND playerGuid = ? - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT); - stmt->setUInt8(0, i); - stmt->setUInt64(1, GetGUID().GetCounter()); - } - else - { - // REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM); - stmt->setUInt64(0, _voidStorageItems[i]->ItemId); - stmt->setUInt64(1, GetGUID().GetCounter()); - stmt->setUInt32(2, _voidStorageItems[i]->ItemEntry); - stmt->setUInt8(3, i); - stmt->setUInt64(4, _voidStorageItems[i]->CreatorGuid.GetCounter()); - stmt->setUInt32(5, _voidStorageItems[i]->RandomBonusListId); - stmt->setUInt32(6, _voidStorageItems[i]->FixedScalingLevel); - stmt->setUInt32(7, _voidStorageItems[i]->ArtifactKnowledgeLevel); - stmt->setUInt8(8, AsUnderlyingType(_voidStorageItems[i]->Context)); - std::ostringstream bonusListIDs; - for (int32 bonusListID : _voidStorageItems[i]->BonusListIDs) - bonusListIDs << bonusListID << ' '; - stmt->setString(9, bonusListIDs.str()); - } - - trans->Append(stmt); - } -} - void Player::_SaveCUFProfiles(CharacterDatabaseTransaction trans) { CharacterDatabasePreparedStatement* stmt; @@ -21666,6 +21435,26 @@ void Player::_SavePlayerData(CharacterDatabaseTransaction trans) _playerDataFlagsNeedSave.clear(); } +void Player::_SaveCharacterBankTabSettings(CharacterDatabaseTransaction trans) const +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + for (std::size_t i = 0; i < m_activePlayerData->CharacterBankTabSettings.size(); ++i) + { + UF::BankTabSettings const& tabSetting = m_activePlayerData->CharacterBankTabSettings[i]; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, GetGUID().GetCounter()); + stmt->setUInt8(1, i); + stmt->setString(2, *tabSetting.Name); + stmt->setString(3, *tabSetting.Icon); + stmt->setString(4, *tabSetting.Description); + stmt->setInt32(5, *tabSetting.DepositFlags); + trans->Append(stmt); + } +} + void Player::outDebugValues() const { if (!sLog->ShouldLog("entities.unit", LOG_LEVEL_DEBUG)) @@ -28387,7 +28176,13 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult }); if (activeConfig >= 0) - SetActiveCombatTraitConfigID(m_activePlayerData->TraitConfigs[activeConfig].ID); + { + UF::TraitConfig const& activeTraitConfig = m_activePlayerData->TraitConfigs[activeConfig]; + SetActiveCombatTraitConfigID(activeTraitConfig.ID); + int32 activeSubTree = activeTraitConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); + } for (UF::TraitConfig const& traitConfig : m_activePlayerData->TraitConfigs) { @@ -28657,9 +28452,20 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec) && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None; }); if (specTraitConfigIndex >= 0) - SetActiveCombatTraitConfigID(m_activePlayerData->TraitConfigs[specTraitConfigIndex].ID); + { + UF::TraitConfig const& activeTraitConfig = m_activePlayerData->TraitConfigs[specTraitConfigIndex]; + SetActiveCombatTraitConfigID(activeTraitConfig.ID); + int32 activeSubTree = activeTraitConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); + else + SetCurrentCombatTraitConfigSubTreeID(0); + } else + { SetActiveCombatTraitConfigID(0); + SetCurrentCombatTraitConfigSubTreeID(0); + } for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { @@ -29097,6 +28903,17 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits:: } } + if (applyTraits) + { + int32 activeSubTree = editedConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(editedConfig.SubTrees[activeSubTree].TraitSubTreeID); + else + SetCurrentCombatTraitConfigSubTreeID(0); + + UpdateItemSetAuras(this, false); + } + m_traitConfigStates[editedConfigId] = PLAYERSPELL_CHANGED; } @@ -29856,86 +29673,6 @@ bool Player::IsInWhisperWhiteList(ObjectGuid guid) return false; } -uint8 Player::GetNextVoidStorageFreeSlot() const -{ - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - if (!_voidStorageItems[i]) // unused item - return i; - - return VOID_STORAGE_MAX_SLOT; -} - -uint8 Player::GetNumOfVoidStorageFreeSlots() const -{ - uint8 count = 0; - - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - if (!_voidStorageItems[i]) - count++; - - return count; -} - -uint8 Player::AddVoidStorageItem(VoidStorageItem&& item) -{ - uint8 slot = GetNextVoidStorageFreeSlot(); - - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); - return 255; - } - - _voidStorageItems[slot] = new VoidStorageItem(std::move(item)); - return slot; -} - -void Player::DeleteVoidStorageItem(uint8 slot) -{ - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return; - } - - delete _voidStorageItems[slot]; - _voidStorageItems[slot] = nullptr; -} - -bool Player::SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot) -{ - if (oldSlot >= VOID_STORAGE_MAX_SLOT || newSlot >= VOID_STORAGE_MAX_SLOT || oldSlot == newSlot) - return false; - - std::swap(_voidStorageItems[newSlot], _voidStorageItems[oldSlot]); - return true; -} - -VoidStorageItem* Player::GetVoidStorageItem(uint8 slot) const -{ - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return nullptr; - } - - return _voidStorageItems[slot]; -} - -VoidStorageItem* Player::GetVoidStorageItem(uint64 id, uint8& slot) const -{ - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - { - if (_voidStorageItems[i] && _voidStorageItems[i]->ItemId == id) - { - slot = i; - return _voidStorageItems[i]; - } - } - - return nullptr; -} - void Player::CreateGarrison(uint32 garrSiteId) { std::unique_ptr<Garrison> garrison(new Garrison(this)); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2a51422b9a7..2a28c516dc0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -511,21 +511,24 @@ DEFINE_ENUM_FLAG(PlayerFlagsEx); enum PlayerLocalFlags { - PLAYER_LOCAL_FLAG_CONTROLLING_PET = 0x00000001, // Displays "You have an active summon already" when trying to tame new pet - PLAYER_LOCAL_FLAG_TRACK_STEALTHED = 0x00000002, - PLAYER_LOCAL_FLAG_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit - PLAYER_LOCAL_FLAG_NO_RELEASE_WINDOW = 0x00000010, // Display no "release spirit" window at all - PLAYER_LOCAL_FLAG_NO_PET_BAR = 0x00000020, // CGPetInfo::IsPetBarUsed - PLAYER_LOCAL_FLAG_OVERRIDE_CAMERA_MIN_HEIGHT = 0x00000040, - PLAYER_LOCAL_FLAG_NEWLY_BOOSTED_CHARACTER = 0x00000080, - PLAYER_LOCAL_FLAG_USING_PARTY_GARRISON = 0x00000100, - PLAYER_LOCAL_FLAG_CAN_USE_OBJECTS_MOUNTED = 0x00000200, - PLAYER_LOCAL_FLAG_CAN_VISIT_PARTY_GARRISON = 0x00000400, - PLAYER_LOCAL_FLAG_WAR_MODE = 0x00000800, - PLAYER_LOCAL_FLAG_ACCOUNT_SECURED = 0x00001000, // Script_IsAccountSecured - PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME= 0x00008000, - PLAYER_LOCAL_FLAG_MENTOR_RESTRICTED = 0x00020000, - PLAYER_LOCAL_FLAG_WEEKLY_REWARD_AVAILABLE = 0x00040000, + PLAYER_LOCAL_FLAG_CONTROLLING_PET = 0x00000001, // Displays "You have an active summon already" when trying to tame new pet + PLAYER_LOCAL_FLAG_TRACK_STEALTHED = 0x00000002, + PLAYER_LOCAL_FLAG_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit + PLAYER_LOCAL_FLAG_NO_RELEASE_WINDOW = 0x00000010, // Display no "release spirit" window at all + PLAYER_LOCAL_FLAG_NO_PET_BAR = 0x00000020, // CGPetInfo::IsPetBarUsed + PLAYER_LOCAL_FLAG_OVERRIDE_CAMERA_MIN_HEIGHT = 0x00000040, + PLAYER_LOCAL_FLAG_NEWLY_BOOSTED_CHARACTER = 0x00000080, + PLAYER_LOCAL_FLAG_USING_PARTY_GARRISON = 0x00000100, + PLAYER_LOCAL_FLAG_CAN_USE_OBJECTS_MOUNTED = 0x00000200, + PLAYER_LOCAL_FLAG_CAN_VISIT_PARTY_GARRISON = 0x00000400, + PLAYER_LOCAL_FLAG_WAR_MODE = 0x00000800, + PLAYER_LOCAL_FLAG_ACCOUNT_SECURED = 0x00001000, // Script_IsAccountSecured + PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME = 0x00008000, + PLAYER_LOCAL_FLAG_MENTOR_RESTRICTED = 0x00020000, + PLAYER_LOCAL_FLAG_HAS_ACCOUNT_BANK_LOCK = 0x00040000, + PLAYER_LOCAL_FLAG_CHARACTER_BANK_DISABLED = 0x00080000, + PLAYER_LOCAL_FLAG_CHARACTER_BANK_CONVERSION_FAILED = 0x00100000, + PLAYER_LOCAL_FLAG_ACCOUNT_BANK_DISABLED = 0x00200000, }; DEFINE_ENUM_FLAG(PlayerLocalFlags); @@ -642,7 +645,6 @@ typedef std::unordered_map<uint32, SkillStatusData> SkillStatusMap; class Quest; class Spell; -class Item; class WorldSession; enum PlayerSlots @@ -650,7 +652,7 @@ enum PlayerSlots // first slot for item stored (in any way in player m_items data) PLAYER_SLOT_START = 0, // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 232, + PLAYER_SLOT_END = 105, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -722,61 +724,49 @@ enum InventoryPackSlots : uint8 // 28 slots INVENTORY_SLOT_ITEM_END = 63 }; -enum BankItemSlots // 28 slots -{ - BANK_SLOT_ITEM_START = 63, - BANK_SLOT_ITEM_END = 91 -}; - -enum BankBagSlots // 7 slots +enum BankBagSlots // 6 slots { - BANK_SLOT_BAG_START = 91, - BANK_SLOT_BAG_END = 98 + BANK_SLOT_BAG_START = 63, + BANK_SLOT_BAG_END = 69 }; enum BuyBackSlots // 12 slots { // stored in m_buybackitems - BUYBACK_SLOT_START = 98, - BUYBACK_SLOT_END = 110 -}; - -enum ReagentSlots // 98 slots -{ - REAGENT_SLOT_START = 110, - REAGENT_SLOT_END = 208, + BUYBACK_SLOT_START = 69, + BUYBACK_SLOT_END = 81 }; enum ChildEquipmentSlots { - CHILD_EQUIPMENT_SLOT_START = 208, - CHILD_EQUIPMENT_SLOT_END = 211, + CHILD_EQUIPMENT_SLOT_START = 81, + CHILD_EQUIPMENT_SLOT_END = 84, }; enum EquipableSpellSlots { - EQUIPABLE_SPELL_OFFENSIVE_SLOT1 = 211, - EQUIPABLE_SPELL_OFFENSIVE_SLOT2 = 212, - EQUIPABLE_SPELL_OFFENSIVE_SLOT3 = 213, - EQUIPABLE_SPELL_OFFENSIVE_SLOT4 = 214, - EQUIPABLE_SPELL_UTILITY_SLOT1 = 215, - EQUIPABLE_SPELL_UTILITY_SLOT2 = 216, - EQUIPABLE_SPELL_UTILITY_SLOT3 = 217, - EQUIPABLE_SPELL_UTILITY_SLOT4 = 218, - EQUIPABLE_SPELL_DEFENSIVE_SLOT1 = 219, - EQUIPABLE_SPELL_DEFENSIVE_SLOT2 = 220, - EQUIPABLE_SPELL_DEFENSIVE_SLOT3 = 221, - EQUIPABLE_SPELL_DEFENSIVE_SLOT4 = 222, - EQUIPABLE_SPELL_WEAPON_SLOT1 = 223, - EQUIPABLE_SPELL_WEAPON_SLOT2 = 224, - EQUIPABLE_SPELL_WEAPON_SLOT3 = 225, - EQUIPABLE_SPELL_WEAPON_SLOT4 = 226, + EQUIPABLE_SPELL_OFFENSIVE_SLOT1 = 84, + EQUIPABLE_SPELL_OFFENSIVE_SLOT2 = 85, + EQUIPABLE_SPELL_OFFENSIVE_SLOT3 = 86, + EQUIPABLE_SPELL_OFFENSIVE_SLOT4 = 87, + EQUIPABLE_SPELL_UTILITY_SLOT1 = 88, + EQUIPABLE_SPELL_UTILITY_SLOT2 = 89, + EQUIPABLE_SPELL_UTILITY_SLOT3 = 90, + EQUIPABLE_SPELL_UTILITY_SLOT4 = 91, + EQUIPABLE_SPELL_DEFENSIVE_SLOT1 = 92, + EQUIPABLE_SPELL_DEFENSIVE_SLOT2 = 93, + EQUIPABLE_SPELL_DEFENSIVE_SLOT3 = 94, + EQUIPABLE_SPELL_DEFENSIVE_SLOT4 = 95, + EQUIPABLE_SPELL_WEAPON_SLOT1 = 96, + EQUIPABLE_SPELL_WEAPON_SLOT2 = 97, + EQUIPABLE_SPELL_WEAPON_SLOT3 = 98, + EQUIPABLE_SPELL_WEAPON_SLOT4 = 99, }; enum AccountBankBagSlots { - ACCOUNT_BANK_SLOT_BAG_START = 227, - ACCOUNT_BANK_SLOT_BAG_END = 232 + ACCOUNT_BANK_SLOT_BAG_START = 100, + ACCOUNT_BANK_SLOT_BAG_END = 105 }; struct ItemPosCount @@ -810,14 +800,17 @@ enum class ItemSearchCallbackResult enum class BagSlotFlags : uint32 { - None = 0x00, - DisableAutoSort = 0x01, - PriorityEquipment = 0x02, - PriorityConsumables = 0x04, - PriorityTradeGoods = 0x08, - PriorityJunk = 0x10, - PriorityQuestItems = 0x20, - ExcludeJunkSell = 0x40, + None = 0x0000, + DisableAutoSort = 0x0001, + PriorityEquipment = 0x0002, + PriorityConsumables = 0x0004, + PriorityTradeGoods = 0x0008, + PriorityJunk = 0x0010, + PriorityQuestItems = 0x0020, + ExcludeJunkSell = 0x0040, + PriorityReagents = 0x0080, + ExpansionCurrent = 0x0100, + ExpansionLegacy = 0x0200, }; DEFINE_ENUM_FLAG(BagSlotFlags); @@ -939,7 +932,6 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, - PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE, PLAYER_LOGIN_QUERY_LOAD_CURRENCY, PLAYER_LOGIN_QUERY_LOAD_CUF_PROFILES, PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION, @@ -953,6 +945,7 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_TRAIT_CONFIGS, PLAYER_LOGIN_QUERY_LOAD_DATA_ELEMENTS, PLAYER_LOGIN_QUERY_LOAD_DATA_FLAGS, + PLAYER_LOGIN_QUERY_LOAD_BANK_TAB_SETTINGS, MAX_PLAYER_LOGIN_QUERY }; @@ -1084,29 +1077,6 @@ struct BGData bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; } }; -struct VoidStorageItem -{ - VoidStorageItem() : ItemId(0), ItemEntry(0), RandomBonusListId(0), FixedScalingLevel(0), ArtifactKnowledgeLevel(0), Context(ItemContext::NONE) { } - VoidStorageItem(uint64 id, uint32 entry, ObjectGuid const& creator, ItemRandomBonusListId randomBonusListId, - uint32 fixedScalingLevel, uint32 artifactKnowledgeLevel, ItemContext context, std::vector<int32> const& bonuses) - : ItemId(id), ItemEntry(entry), CreatorGuid(creator), RandomBonusListId(randomBonusListId), - FixedScalingLevel(fixedScalingLevel), ArtifactKnowledgeLevel(artifactKnowledgeLevel), Context(context) - { - BonusListIDs.insert(BonusListIDs.end(), bonuses.begin(), bonuses.end()); - } - VoidStorageItem(VoidStorageItem&& vsi) noexcept : ItemId(vsi.ItemId), ItemEntry(vsi.ItemEntry), CreatorGuid(vsi.CreatorGuid), RandomBonusListId(vsi.RandomBonusListId), - FixedScalingLevel(vsi.FixedScalingLevel), ArtifactKnowledgeLevel(vsi.ArtifactKnowledgeLevel), Context(vsi.Context), BonusListIDs(std::move(vsi.BonusListIDs)) { } - - uint64 ItemId; - uint32 ItemEntry; - ObjectGuid CreatorGuid; - ItemRandomBonusListId RandomBonusListId; - uint32 FixedScalingLevel; - uint32 ArtifactKnowledgeLevel; - ItemContext Context; - std::vector<int32> BonusListIDs; -}; - struct ResurrectionData { ObjectGuid GUID; @@ -1391,11 +1361,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> if (flag.HasFlag(ItemSearchLocation::Bank)) { - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) - if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - if (callback(pItem) == ItemSearchCallbackResult::Stop) - return false; - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) if (Bag* pBag = GetBagByPos(i)) for (uint32 j = 0; j < GetBagSize(pBag); ++j) @@ -1412,11 +1377,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> if (Item* pItem = GetItemInBag(bag, j)) if (callback(pItem) == ItemSearchCallbackResult::Stop) return false; - - for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) - if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - if (callback(pItem) == ItemSearchCallbackResult::Stop) - return false; } return true; @@ -1450,16 +1410,37 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> static bool IsBagPos(uint16 pos); static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); } static bool IsBankPos(uint8 bag, uint8 slot); - static bool IsReagentBankPos(uint16 pos) { return IsReagentBankPos(pos >> 8, pos & 255); } - static bool IsReagentBankPos(uint8 bag, uint8 slot); static bool IsChildEquipmentPos(uint16 pos) { return IsChildEquipmentPos(pos >> 8, pos & 255); } static bool IsChildEquipmentPos(uint8 bag, uint8 slot); + static bool IsAccountBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); } + static bool IsAccountBankPos(uint8 bag, uint8 slot); bool IsValidPos(uint16 pos, bool explicit_pos) const { return IsValidPos(pos >> 8, pos & 255, explicit_pos); } bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const; uint8 GetInventorySlotCount() const { return m_activePlayerData->NumBackpackSlots; } void SetInventorySlotCount(uint8 slots); uint8 GetBankBagSlotCount() const { return m_activePlayerData->NumBankSlots; } void SetBankBagSlotCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumBankSlots), count); } + uint8 GetCharacterBankTabCount() const { return m_activePlayerData->NumCharacterBankTabs; } + void SetCharacterBankTabCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumCharacterBankTabs), count); } + uint8 GetAccountBankTabCount() const { return m_activePlayerData->NumAccountBankTabs; } + void SetAccountBankTabCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumAccountBankTabs), count); } + void SetCharacterBankTabSettings(uint32 tabId, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + { + auto setter = m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterBankTabSettings, tabId); + SetBankTabSettings(setter, name, icon, description, depositFlags); + } + void SetAccountBankTabSettings(uint32 tabId, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + { + auto setter = m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AccountBankTabSettings, tabId); + SetBankTabSettings(setter, name, icon, description, depositFlags); + } + void SetBankTabSettings(UF::MutableFieldReferenceWithChangesMask<UF::BankTabSettings, false> setter, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + { + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Name), name); + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Icon), icon); + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Description), description); + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::DepositFlags), int32(depositFlags)); + } bool IsBackpackAutoSortDisabled() const { return m_activePlayerData->BackpackAutoSortDisabled; } void SetBackpackAutoSortDisabled(bool disabled) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BackpackAutoSortDisabled), disabled); } bool IsBackpackSellJunkDisabled() const { return m_activePlayerData->BackpackSellJunkDisabled; } @@ -1470,10 +1451,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } void RemoveBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } void ReplaceAllBagSlotFlags(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } - EnumFlag<BagSlotFlags> GetBankBagSlotFlags(uint32 bagIndex) const { return static_cast<BagSlotFlags>(m_activePlayerData->BankBagSlotFlags[bagIndex]); } - void SetBankBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } - void RemoveBankBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } - void ReplaceAllBankBagSlotFlags(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const; bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const; bool CanNoReagentCast(SpellInfo const* spellInfo) const; @@ -1998,6 +1975,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void ApplyTraitConfig(int32 configId, bool apply); void ApplyTraitEntry(int32 traitNodeEntryId, int32 rank, int32 grantedRanks, bool apply); void SetActiveCombatTraitConfigID(int32 traitConfigId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ActiveCombatTraitConfigID), traitConfigId); } + void SetCurrentCombatTraitConfigSubTreeID(int32 traitSubTreeId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::CurrentCombatTraitConfigSubTreeID), traitSubTreeId); } void SetTraitConfigUseStarterBuild(int32 traitConfigId, bool useStarterBuild); void SetTraitConfigUseSharedActionBars(int32 traitConfigId, bool usesSharedActionBars, bool isLastSelectedSavedConfig); Optional<PlayerSpellTrait> GetTraitInfoForSpell(uint32 spellId) const; @@ -2807,18 +2785,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> std::string GetMapAreaAndZoneString() const; std::string GetCoordsMapAreaAndZoneString() const; - // Void Storage - bool IsVoidStorageUnlocked() const { return HasPlayerFlag(PLAYER_FLAGS_VOID_UNLOCKED); } - void UnlockVoidStorage() { SetPlayerFlag(PLAYER_FLAGS_VOID_UNLOCKED); } - void LockVoidStorage() { RemovePlayerFlag(PLAYER_FLAGS_VOID_UNLOCKED); } - uint8 GetNextVoidStorageFreeSlot() const; - uint8 GetNumOfVoidStorageFreeSlots() const; - uint8 AddVoidStorageItem(VoidStorageItem&& item); - void DeleteVoidStorageItem(uint8 slot); - bool SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot); - VoidStorageItem* GetVoidStorageItem(uint8 slot) const; - VoidStorageItem* GetVoidStorageItem(uint64 id, uint8& slot) const; - // Reagent Bank bool IsReagentBankUnlocked() const { return HasPlayerFlagEx(PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED); } void UnlockReagentBank() { SetPlayerFlagEx(PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED); } @@ -3058,7 +3024,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _LoadInventory(PreparedQueryResult result, PreparedQueryResult artifactsResult, PreparedQueryResult azeriteResult, PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult, uint32 timeDiff); - void _LoadVoidStorage(PreparedQueryResult result); void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult); static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint64 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData); @@ -3090,6 +3055,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _LoadCurrency(PreparedQueryResult result); void _LoadCUFProfiles(PreparedQueryResult result); void _LoadPlayerData(PreparedQueryResult elementsResult, PreparedQueryResult flagsResult); + void _LoadCharacterBankTabSettings(PreparedQueryResult result); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -3099,7 +3065,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _SaveActions(CharacterDatabaseTransaction trans); void _SaveAuras(CharacterDatabaseTransaction trans); void _SaveInventory(CharacterDatabaseTransaction trans); - void _SaveVoidStorage(CharacterDatabaseTransaction trans); void _SaveMail(CharacterDatabaseTransaction trans); void _SaveQuestStatus(CharacterDatabaseTransaction trans); void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans); @@ -3119,6 +3084,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _SaveCurrency(CharacterDatabaseTransaction trans); void _SaveCUFProfiles(CharacterDatabaseTransaction trans); void _SavePlayerData(CharacterDatabaseTransaction trans); + void _SaveCharacterBankTabSettings(CharacterDatabaseTransaction trans) const; /*********************************************************/ /*** ENVIRONMENTAL SYSTEM ***/ @@ -3151,8 +3117,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> PlayerCurrenciesMap _currencyStorage; - VoidStorageItem* _voidStorageItems[VOID_STORAGE_MAX_SLOT]; - std::vector<Item*> m_itemUpdateQueue; bool m_itemUpdateQueueBlocked; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f6917ee88f7..ab91bf1f62b 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1433,6 +1433,12 @@ class TC_GAME_API Unit : public WorldObject void SetChannelObject(uint32 slot, ObjectGuid guid); void RemoveChannelObject(ObjectGuid guid); void ClearChannelObjects(); + void SetChannelSpellData(uint32 startTimeMs, uint32 durationMs) + { + auto channelData = m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ChannelData); + SetUpdateFieldValue(channelData.ModifyValue(&UF::UnitChannel::StartTimeMs), startTimeMs); + SetUpdateFieldValue(channelData.ModifyValue(&UF::UnitChannel::Duration), durationMs); + } int8 GetSpellEmpowerStage() const { return m_unitData->SpellEmpowerStage; } void SetSpellEmpowerStage(int8 stage) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::SpellEmpowerStage), stage); } diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp index 9b67fef4467..a9ed6d056f9 100644 --- a/src/server/game/Globals/AreaTriggerDataStore.cpp +++ b/src/server/game/Globals/AreaTriggerDataStore.cpp @@ -272,8 +272,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() TC_LOG_INFO("server.loading", ">> Loaded 0 AreaTrigger create properties. DB table `areatrigger_create_properties` is empty."); } - // 0 1 2 3 4 5 6 7 8 - if (QueryResult circularMovementInfos = WorldDatabase.Query("SELECT AreaTriggerCreatePropertiesId, IsCustom, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit`")) + // 0 1 2 3 4 5 6 7 8 + if (QueryResult circularMovementInfos = WorldDatabase.Query("SELECT AreaTriggerCreatePropertiesId, IsCustom, ExtraTimeForBlending, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit`")) { do { @@ -289,7 +289,7 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() createProperties->OrbitInfo.emplace(); - createProperties->OrbitInfo->StartDelay = circularMovementInfoFields[2].GetUInt32(); + createProperties->OrbitInfo->ExtraTimeForBlending = circularMovementInfoFields[2].GetInt32(); #define VALIDATE_AND_SET_FLOAT(Float, Value) \ createProperties->OrbitInfo->Float = Value; \ diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6d24e727a39..f75382bc474 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -226,7 +226,6 @@ ObjectMgr::ObjectMgr(): _hiPetNumber(1), _creatureSpawnId(1), _gameObjectSpawnId(1), - _voidItemId(1), DBCLocaleIndex(LOCALE_enUS) { } @@ -923,11 +922,11 @@ void ObjectMgr::LoadCreatureTemplateDifficulty() // 0 1 2 3 4 5 QueryResult result = WorldDatabase.Query("SELECT Entry, DifficultyID, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID, HealthScalingExpansion, " - // 6 7 8 9 10 11 12 - "HealthModifier, ManaModifier, ArmorModifier, DamageModifier, CreatureDifficultyID, TypeFlags, TypeFlags2, " - // 13 14 15 16 17 + // 6 7 8 9 10 11 12 13 + "HealthModifier, ManaModifier, ArmorModifier, DamageModifier, CreatureDifficultyID, TypeFlags, TypeFlags2, TypeFlags3, " + // 14 15 16 17 18 "LootID, PickPocketLootID, SkinLootID, GoldMin, GoldMax," - // 18 19 20 21 22 23 24 25 + // 19 20 21 22 23 24 25 26 "StaticFlags1, StaticFlags2, StaticFlags3, StaticFlags4, StaticFlags5, StaticFlags6, StaticFlags7, StaticFlags8 " "FROM creature_template_difficulty ORDER BY Entry"); @@ -964,14 +963,15 @@ void ObjectMgr::LoadCreatureTemplateDifficulty() creatureDifficulty.CreatureDifficultyID = fields[10].GetInt32(); creatureDifficulty.TypeFlags = fields[11].GetUInt32(); creatureDifficulty.TypeFlags2 = fields[12].GetUInt32(); - creatureDifficulty.LootID = fields[13].GetUInt32(); - creatureDifficulty.PickPocketLootID = fields[14].GetUInt32(); - creatureDifficulty.SkinLootID = fields[15].GetUInt32(); - creatureDifficulty.GoldMin = fields[16].GetUInt32(); - creatureDifficulty.GoldMax = fields[17].GetUInt32(); - creatureDifficulty.StaticFlags = CreatureStaticFlagsHolder(CreatureStaticFlags(fields[18].GetUInt32()), CreatureStaticFlags2(fields[19].GetUInt32()), - CreatureStaticFlags3(fields[20].GetUInt32()), CreatureStaticFlags4(fields[21].GetUInt32()), CreatureStaticFlags5(fields[22].GetUInt32()), - CreatureStaticFlags6(fields[23].GetUInt32()), CreatureStaticFlags7(fields[24].GetUInt32()), CreatureStaticFlags8(fields[25].GetUInt32())); + creatureDifficulty.TypeFlags3 = fields[13].GetUInt32(); + creatureDifficulty.LootID = fields[14].GetUInt32(); + creatureDifficulty.PickPocketLootID = fields[15].GetUInt32(); + creatureDifficulty.SkinLootID = fields[16].GetUInt32(); + creatureDifficulty.GoldMin = fields[17].GetUInt32(); + creatureDifficulty.GoldMax = fields[18].GetUInt32(); + creatureDifficulty.StaticFlags = CreatureStaticFlagsHolder(CreatureStaticFlags(fields[19].GetUInt32()), CreatureStaticFlags2(fields[20].GetUInt32()), + CreatureStaticFlags3(fields[21].GetUInt32()), CreatureStaticFlags4(fields[22].GetUInt32()), CreatureStaticFlags5(fields[23].GetUInt32()), + CreatureStaticFlags6(fields[24].GetUInt32()), CreatureStaticFlags7(fields[25].GetUInt32()), CreatureStaticFlags8(fields[26].GetUInt32())); // TODO: Check if this still applies creatureDifficulty.DamageModifier *= Creature::GetDamageMod(itr->second.Classification); @@ -7448,10 +7448,6 @@ void ObjectMgr::SetHighestGuids() if (result) sGroupMgr->SetGroupDbStoreSize((*result)[0].GetUInt32()+1); - result = CharacterDatabase.Query("SELECT MAX(itemId) from character_void_storage"); - if (result) - _voidItemId = (*result)[0].GetUInt64()+1; - result = WorldDatabase.Query("SELECT MAX(guid) FROM creature"); if (result) _creatureSpawnId = (*result)[0].GetUInt64() + 1; @@ -7506,16 +7502,6 @@ uint32 ObjectMgr::GeneratePetNumber() return _hiPetNumber++; } -uint64 ObjectMgr::GenerateVoidStorageItemId() -{ - if (_voidItemId >= uint64(0xFFFFFFFFFFFFFFFELL)) - { - TC_LOG_ERROR("misc", "_voidItemId overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } - return _voidItemId++; -} - uint64 ObjectMgr::GenerateCreatureSpawnId() { if (_creatureSpawnId >= uint64(0xFFFFFFFFFFFFFFFELL)) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index a5684df7b94..b8c4cc292ff 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1366,7 +1366,6 @@ class TC_GAME_API ObjectMgr uint64 GenerateEquipmentSetGuid(); uint64 GenerateMailID(); uint32 GeneratePetNumber(); - uint64 GenerateVoidStorageItemId(); ObjectGuid::LowType GenerateCreatureSpawnId(); ObjectGuid::LowType GenerateGameObjectSpawnId(); @@ -1701,7 +1700,6 @@ class TC_GAME_API ObjectMgr std::atomic<uint32> _hiPetNumber; ObjectGuid::LowType _creatureSpawnId; ObjectGuid::LowType _gameObjectSpawnId; - uint64 _voidItemId; // first free low guid for selected guid type ObjectGuidGenerator& GetGuidSequenceGenerator(HighGuid high); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 4a270a005f9..28230a309b0 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -52,11 +52,13 @@ uint32 const EMBLEM_PRICE = 10 * GOLD; inline uint64 GetGuildBankTabPrice(uint8 tabId) { - // these prices are in gold units, not copper - static uint64 const tabPrices[GUILD_BANK_MAX_TABS] = { 100, 250, 500, 1000, 2500, 5000, 0, 0 }; - ASSERT(tabId < GUILD_BANK_MAX_TABS); + auto bankTab = std::ranges::find(sBankTabStore, std::pair(BankType::Guild, int8(tabId)), + [](BankTabEntry const* bankTab) { return std::pair(BankType(bankTab->BankType), bankTab->OrderIndex); }); - return tabPrices[tabId]; + if (bankTab != sBankTabStore.end()) + return bankTab->Cost; + + return 0; } void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string_view param) @@ -1659,7 +1661,7 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); // Remove money from bank - uint64 tabCost = GetGuildBankTabPrice(tabId) * GOLD; + uint64 tabCost = GetGuildBankTabPrice(tabId); if (tabCost && !_ModifyBankMoney(trans, tabCost, false)) // Should not happen, this is checked by client return; diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp index 91a65dfb58b..db3a34e0403 100644 --- a/src/server/game/Handlers/BankHandler.cpp +++ b/src/server/game/Handlers/BankHandler.cpp @@ -31,7 +31,7 @@ void WorldSession::HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& pa if (!CanUseBank()) { - TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); + TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid); return; } @@ -106,7 +106,7 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa if (!CanUseBank()) { - TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); + TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid); return; } @@ -144,67 +144,129 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa } } -void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet) +void WorldSession::HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBankTab) { - if (!CanUseBank(packet.Guid)) + if (!CanUseBank(buyBankTab.Banker)) { - TC_LOG_ERROR("network", "WORLD: HandleBuyBankSlotOpcode - {} not found or you can't interact with him.", packet.Guid.ToString()); + TC_LOG_ERROR("network", "WorldSession::HandleBuyBankTab {} - Banker {} not found or can't interact with him.", + _player->GetGUID(), buyBankTab.Banker); return; } - uint32 slot = _player->GetBankBagSlotCount(); + if (buyBankTab.BankType != BankType::Character) + { + TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.", + _player->GetGUID(), buyBankTab.BankType); + return; + } + + uint32 itemId = 0; + uint8 slot = 0; + uint8 inventorySlot = 0; + + switch (buyBankTab.BankType) + { + case BankType::Character: + itemId = ITEM_CHARACTER_BANK_TAB_BAG; + slot = _player->GetCharacterBankTabCount(); + inventorySlot = BANK_SLOT_BAG_START; + break; + case BankType::Account: + itemId = ITEM_ACCOUNT_BANK_TAB_BAG; + slot = _player->GetAccountBankTabCount(); + inventorySlot = ACCOUNT_BANK_SLOT_BAG_START; + break; + default: + TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.", + _player->GetGUID(), buyBankTab.BankType); + return; + } // next slot ++slot; - TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = {}", slot); + auto bankTab = std::ranges::find(sBankTabStore, std::pair(buyBankTab.BankType, int8(slot)), + [](BankTabEntry const* bankTab) { return std::pair(BankType(bankTab->BankType), bankTab->OrderIndex); }); - BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot); - if (!slotEntry) + if (bankTab == sBankTabStore.end()) return; - uint32 price = slotEntry->Cost; - - if (!_player->HasEnoughMoney(uint64(price))) + uint64 price = bankTab->Cost; + if (!_player->HasEnoughMoney(price)) return; - _player->SetBankBagSlotCount(slot); - _player->ModifyMoney(-int64(price)); - - _player->UpdateCriteria(CriteriaType::BankSlotsPurchased); -} - -void WorldSession::HandleBuyReagentBankOpcode(WorldPackets::Bank::ReagentBank& reagentBank) -{ - if (!CanUseBank(reagentBank.Banker)) + uint16 inventoryPos = 0; + InventoryResult msg = _player->CanEquipNewItem(inventorySlot, inventoryPos, itemId, false); + if (msg != EQUIP_ERR_OK) { - TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - {} not found or you can't interact with him.", reagentBank.Banker.ToString()); + _player->SendEquipError(msg, nullptr, nullptr, itemId); return; } - if (_player->IsReagentBankUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - Player ({}, name: {}) tried to unlock reagent bank a 2nd time.", _player->GetGUID().ToString(), _player->GetName()); + Item* bag = _player->EquipNewItem(inventoryPos, itemId, ItemContext::NONE, true); + if (!bag) return; + + switch (buyBankTab.BankType) + { + case BankType::Character: + _player->SetCharacterBankTabCount(slot); + break; + case BankType::Account: + _player->SetAccountBankTabCount(slot); + break; + default: + break; } - constexpr int64 price = 100 * GOLD; + _player->ModifyMoney(-int64(price)); - if (!_player->HasEnoughMoney(price)) + _player->UpdateCriteria(CriteriaType::BankTabPurchased, uint64(buyBankTab.BankType)); +} + +void WorldSession::HandleUpdateBankTabSettings(WorldPackets::Bank::UpdateBankTabSettings const& updateBankTabSettings) +{ + if (!CanUseBank(updateBankTabSettings.Banker)) { - TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - Player ({}, name: {}) without enough gold.", _player->GetGUID().ToString(), _player->GetName()); + TC_LOG_ERROR("network", "WorldSession::HandleUpdateBankTabSettings {} - Banker {} not found or can't interact with him.", + _player->GetGUID(), updateBankTabSettings.Banker); return; } - _player->ModifyMoney(-price); - _player->UnlockReagentBank(); + switch (updateBankTabSettings.BankType) + { + case BankType::Character: + if (updateBankTabSettings.Tab >= _player->m_activePlayerData->CharacterBankTabSettings.size()) + { + TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} doesn't have bank tab {} in bank type {}.", + _player->GetGUID(), updateBankTabSettings.Tab, updateBankTabSettings.BankType); + return; + } + _player->SetCharacterBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name, + updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags); + break; + case BankType::Account: + if (updateBankTabSettings.Tab >= _player->m_activePlayerData->AccountBankTabSettings.size()) + { + TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} doesn't have bank tab {} in bank type {}.", + _player->GetGUID(), updateBankTabSettings.Tab, updateBankTabSettings.BankType); + return; + } + _player->SetAccountBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name, + updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags); + break; + default: + TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} - Bank type {} is not supported.", + _player->GetGUID(), updateBankTabSettings.BankType); + break; + } } -void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBank& reagentBank) +void WorldSession::HandleAutoDepositCharacterBank(WorldPackets::Bank::AutoDepositCharacterBank const& autoDepositCharacterBank) { - if (!CanUseBank(reagentBank.Banker)) + if (!CanUseBank(autoDepositCharacterBank.Banker)) { - TC_LOG_DEBUG("network", "WORLD: HandleReagentBankDepositOpcode - {} not found or you can't interact with him.", reagentBank.Banker.ToString()); + TC_LOG_DEBUG("network", "WORLD: HandleReagentBankDepositOpcode - {} not found or you can't interact with him.", autoDepositCharacterBank.Banker); return; } @@ -240,88 +302,6 @@ void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBan } } -void WorldSession::HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReagent& autoBankReagent) -{ - if (!CanUseBank()) - { - TC_LOG_DEBUG("network", "WORLD: HandleAutoBankReagentOpcode - {} not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); - return; - } - - if (!_player->IsReagentBankUnlocked()) - { - _player->SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED); - return; - } - - Item* item = _player->GetItemByPos(autoBankReagent.PackSlot, autoBankReagent.Slot); - if (!item) - return; - - ItemPosCountVec dest; - InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true, true); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, item, nullptr); - return; - } - - if (dest.size() == 1 && dest[0].pos == item->GetPos()) - { - _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, nullptr); - return; - } - - _player->RemoveItem(autoBankReagent.PackSlot, autoBankReagent.Slot, true); - _player->BankItem(dest, item, true); -} - -void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStoreBankReagent& autoStoreBankReagent) -{ - if (!CanUseBank()) - { - TC_LOG_DEBUG("network", "WORLD: HandleAutoBankReagentOpcode - {} not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); - return; - } - - if (!_player->IsReagentBankUnlocked()) - { - _player->SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED); - return; - } - - Item* pItem = _player->GetItemByPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot); - if (!pItem) - return; - - if (_player->IsReagentBankPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot)) - { - ItemPosCountVec dest; - InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, pItem, false); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, nullptr); - return; - } - - _player->RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true); - _player->StoreItem(dest, pItem, true); - } - else - { - ItemPosCountVec dest; - InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false, true, true); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, nullptr); - return; - } - - _player->RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true); - _player->BankItem(dest, pItem, true); - } -} - void WorldSession::SendShowBank(ObjectGuid guid, PlayerInteractionType interactionType) { _player->PlayerTalkClass->GetInteractionData().StartInteraction(guid, interactionType); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 116390128d2..f0f60870bf1 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -182,10 +182,6 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_VOID_STORAGE); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAILS, stmt); @@ -353,6 +349,10 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_DATA_FLAGS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_BANK_TAB_SETTINGS, stmt); + return res; } @@ -1504,7 +1504,6 @@ void WorldSession::SendFeatureSystemStatus() features.CfgRealmRecID = 0; features.CommercePricePollTimeSeconds = 300; features.VoiceEnabled = false; - features.BrowserEnabled = false; // Has to be false, otherwise client will crash if "Customer Support" is opened // Enable guilds only. // This is required to restore old guild channel behavior for GMs. diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index e63ed58e7e4..a8602605c7d 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1251,13 +1251,6 @@ void WorldSession::HandleSortBankBags(WorldPackets::Item::SortBankBags& /*sortBa SendPacket(WorldPackets::Item::BagCleanupFinished().Write()); } -void WorldSession::HandleSortReagentBankBags(WorldPackets::Item::SortReagentBankBags& /*sortReagentBankBags*/) -{ - // TODO: Implement sorting - // Placeholder to prevent completely locking out bags clientside - SendPacket(WorldPackets::Item::BagCleanupFinished().Write()); -} - void WorldSession::HandleRemoveNewItem(WorldPackets::Item::RemoveNewItem& removeNewItem) { Item* item = _player->GetItemByGuid(removeNewItem.ItemGuid); @@ -1285,17 +1278,6 @@ void WorldSession::HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag _player->RemoveBagSlotFlag(changeBagSlotFlag.BagIndex, changeBagSlotFlag.FlagToChange); } -void WorldSession::HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag) -{ - if (changeBankBagSlotFlag.BagIndex >= _player->m_activePlayerData->BankBagSlotFlags.size()) - return; - - if (changeBankBagSlotFlag.On) - _player->SetBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); - else - _player->RemoveBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); -} - void WorldSession::HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled) { _player->SetBackpackAutoSortDisabled(setBackpackAutosortDisabled.Disable); diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 4012ccff590..37fda27000e 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -322,6 +322,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc SendTradeStatus(info); return; } + + if (Player::IsAccountBankPos(item->GetSlot(), item->GetBagSlot())) + { + info.Status = TRADE_STATUS_FAILED; + info.BagResult = EQUIP_ERR_CANT_TRADE_ACCOUNT_ITEM; + SendTradeStatus(info); + return; + } } if (Item* item = his_trade->GetItem(TradeSlots(i))) @@ -338,6 +346,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc // his_trade->SetAccepted(false, true); // return; //} + + if (Player::IsAccountBankPos(item->GetSlot(), item->GetBagSlot())) + { + info.Status = TRADE_STATUS_FAILED; + info.BagResult = EQUIP_ERR_CANT_TRADE_ACCOUNT_ITEM; + SendTradeStatus(info); + return; + } } } diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp deleted file mode 100644 index 2ab4ee8fb8f..00000000000 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "WorldSession.h" -#include "Bag.h" -#include "CollectionMgr.h" -#include "Common.h" -#include "Log.h" -#include "ObjectAccessor.h" -#include "ObjectMgr.h" -#include "Player.h" -#include "VoidStoragePackets.h" - -void WorldSession::SendVoidStorageTransferResult(VoidTransferError result) -{ - SendPacket(WorldPackets::VoidStorage::VoidTransferResult(result).Write()); -} - -void WorldSession::HandleVoidStorageUnlock(WorldPackets::VoidStorage::UnlockVoidStorage& unlockVoidStorage) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(unlockVoidStorage.Npc, UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageUnlock - {} not found or player can't interact with it.", unlockVoidStorage.Npc.ToString()); - return; - } - - if (_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageUnlock - Player ({}, name: {}) tried to unlock void storage a 2nd time.", _player->GetGUID().ToString(), _player->GetName()); - return; - } - - _player->ModifyMoney(-int64(VOID_STORAGE_UNLOCK_COST)); - _player->UnlockVoidStorage(); -} - -void WorldSession::HandleVoidStorageQuery(WorldPackets::VoidStorage::QueryVoidStorage& queryVoidStorage) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(queryVoidStorage.Npc, UNIT_NPC_FLAG_TRANSMOGRIFIER | UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageQuery - {} not found or player can't interact with it.", queryVoidStorage.Npc.ToString()); - SendPacket(WorldPackets::VoidStorage::VoidStorageFailed().Write()); - return; - } - - if (!_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageQuery - Player ({}, name: {}) queried void storage without unlocking it.", _player->GetGUID().ToString(), _player->GetName()); - SendPacket(WorldPackets::VoidStorage::VoidStorageFailed().Write()); - return; - } - - WorldPackets::VoidStorage::VoidStorageContents voidStorageContents; - voidStorageContents.Items.reserve(VOID_STORAGE_MAX_SLOT); - - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - { - VoidStorageItem* item = _player->GetVoidStorageItem(i); - if (!item) - continue; - - WorldPackets::VoidStorage::VoidItem voidItem; - voidItem.Guid = ObjectGuid::Create<HighGuid::Item>(item->ItemId); - voidItem.Creator = item->CreatorGuid; - voidItem.Slot = i; - voidItem.Item.Initialize(item); - - voidStorageContents.Items.push_back(voidItem); - } - - SendPacket(voidStorageContents.Write()); -} - -void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStorageTransfer& voidStorageTransfer) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(voidStorageTransfer.Npc, UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} not found or player can't interact with it.", voidStorageTransfer.Npc.ToString()); - return; - } - - if (!_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - Player ({}, name: {}) queried void storage without unlocking it.", _player->GetGUID().ToString(), _player->GetName()); - return; - } - - if (voidStorageTransfer.Deposits.size() > _player->GetNumOfVoidStorageFreeSlots()) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); - return; - } - - if (!voidStorageTransfer.Withdrawals.empty() && voidStorageTransfer.Withdrawals.size() > _player->GetFreeInventorySlotCount(ItemSearchLocation::Inventory)) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); - return; - } - - if (!_player->HasEnoughMoney(uint64(voidStorageTransfer.Deposits.size() * VOID_STORAGE_STORE_ITEM_COST))) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_NOT_ENOUGH_MONEY); - return; - } - - WorldPackets::VoidStorage::VoidStorageTransferChanges voidStorageTransferChanges; - voidStorageTransferChanges.AddedItems.reserve(VOID_STORAGE_MAX_DEPOSIT); - voidStorageTransferChanges.RemovedItems.reserve(VOID_STORAGE_MAX_DEPOSIT); - - uint8 depositCount = 0; - for (uint32 i = 0; i < voidStorageTransfer.Deposits.size(); ++i) - { - Item* item = _player->GetItemByGuid(voidStorageTransfer.Deposits[i]); - if (!item) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} {} wants to deposit an invalid item ({}).", _player->GetGUID().ToString(), _player->GetName(), voidStorageTransfer.Deposits[i].ToString()); - continue; - } - - VoidStorageItem itemVS(sObjectMgr->GenerateVoidStorageItemId(), item->GetEntry(), item->GetCreator(), - item->GetItemRandomBonusListId(), item->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), item->GetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL), - item->GetContext(), item->GetBonusListIDs()); - - WorldPackets::VoidStorage::VoidItem voidItem; - voidItem.Guid = ObjectGuid::Create<HighGuid::Item>(itemVS.ItemId); - voidItem.Creator = item->GetCreator(); - voidItem.Item.Initialize(&itemVS); - voidItem.Slot = _player->AddVoidStorageItem(std::move(itemVS)); - - voidStorageTransferChanges.AddedItems.push_back(voidItem); - - _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); - ++depositCount; - } - - int64 cost = depositCount * VOID_STORAGE_STORE_ITEM_COST; - - _player->ModifyMoney(-cost); - - for (uint32 i = 0; i < voidStorageTransfer.Withdrawals.size(); ++i) - { - uint8 slot = 0; - VoidStorageItem* itemVS = _player->GetVoidStorageItem(voidStorageTransfer.Withdrawals[i].GetCounter(), slot); - if (!itemVS) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} {} tried to withdraw an invalid item (id: {})", _player->GetGUID().ToString(), _player->GetName(), voidStorageTransfer.Withdrawals[i].ToString()); - continue; - } - - ItemPosCountVec dest; - InventoryResult msg = _player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemVS->ItemEntry, 1); - if (msg != EQUIP_ERR_OK) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} {} couldn't withdraw item id {} because inventory was full.", _player->GetGUID().ToString(), _player->GetName(), voidStorageTransfer.Withdrawals[i].ToString()); - return; - } - - if (Item* item = _player->StoreNewItem(dest, itemVS->ItemEntry, true, itemVS->RandomBonusListId, GuidSet(), itemVS->Context, &itemVS->BonusListIDs)) - { - item->SetCreator(itemVS->CreatorGuid); - item->SetBinding(true); - GetCollectionMgr()->AddItemAppearance(item); - } - - voidStorageTransferChanges.RemovedItems.push_back(ObjectGuid::Create<HighGuid::Item>(itemVS->ItemId)); - - _player->DeleteVoidStorageItem(slot); - } - - SendPacket(voidStorageTransferChanges.Write()); - - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_NO_ERROR); -} - -void WorldSession::HandleVoidSwapItem(WorldPackets::VoidStorage::SwapVoidItem& swapVoidItem) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(swapVoidItem.Npc, UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidSwapItem - {} not found or player can't interact with it.", swapVoidItem.Npc.ToString()); - return; - } - - if (!_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidSwapItem - Player ({}, name: {}) queried void storage without unlocking it.", _player->GetGUID().ToString(), _player->GetName()); - return; - } - - uint8 oldSlot; - if (!_player->GetVoidStorageItem(swapVoidItem.VoidItemGuid.GetCounter(), oldSlot)) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidSwapItem - {} {} requested swapping an invalid item (slot: {}, itemid: {}).", _player->GetGUID().ToString(), _player->GetName(), swapVoidItem.DstSlot, swapVoidItem.VoidItemGuid.ToString()); - return; - } - - bool usedDestSlot = _player->GetVoidStorageItem(swapVoidItem.DstSlot) != nullptr; - ObjectGuid itemIdDest; - if (usedDestSlot) - itemIdDest = ObjectGuid::Create<HighGuid::Item>(_player->GetVoidStorageItem(swapVoidItem.DstSlot)->ItemId); - - if (!_player->SwapVoidStorageItem(oldSlot, swapVoidItem.DstSlot)) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return; - } - - WorldPackets::VoidStorage::VoidItemSwapResponse voidItemSwapResponse; - voidItemSwapResponse.VoidItemA = swapVoidItem.VoidItemGuid; - voidItemSwapResponse.VoidItemSlotA = swapVoidItem.DstSlot; - if (usedDestSlot) - { - voidItemSwapResponse.VoidItemB = itemIdDest; - voidItemSwapResponse.VoidItemSlotB = oldSlot; - } - - SendPacket(voidItemSwapResponse.Write()); -} diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 8afe51bbdf9..8664db8e3bb 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1635,6 +1635,10 @@ enum SpellEffectName SPELL_EFFECT_UI_ACTION = 339, SPELL_EFFECT_340 = 340, SPELL_EFFECT_LEARN_WARBAND_SCENE = 341, + SPELL_EFFECT_342 = 342, + SPELL_EFFECT_343 = 343, + SPELL_EFFECT_344 = 344, // some kind of teleport + SPELL_EFFECT_ASSIST_ACTION = 345, // MiscValue[0] = AssistActionType, MiscValue[1] = ID, depends on type TOTAL_SPELL_EFFECTS }; @@ -3151,9 +3155,11 @@ enum GameobjectTypes : uint8 GAMEOBJECT_TYPE_CLIENT_MODEL = 60, GAMEOBJECT_TYPE_CRAFTING_TABLE = 61, GAMEOBJECT_TYPE_PERKS_PROGRAM_CHEST = 62, + GAMEOBJECT_TYPE_FUTURE_PATCH = 63, + GAMEOBJECT_TYPE_ASSIST_ACTION = 64, }; -#define MAX_GAMEOBJECT_TYPE 63 // sending to client this or greater value can crash client. +#define MAX_GAMEOBJECT_TYPE 65 // sending to client this or greater value can crash client. #define MAX_GAMEOBJECT_DATA 35 // Max number of uint32 vars in gameobject_template data field enum GameObjectFlags @@ -6952,29 +6958,6 @@ enum DungeonStatusFlag RAID_STATUSFLAG_25MAN_HEROIC = 0x08 }; -enum VoidStorageConstants -{ - VOID_STORAGE_UNLOCK_COST = 100 * GOLD, - VOID_STORAGE_STORE_ITEM_COST = 10 * GOLD, - VOID_STORAGE_MAX_DEPOSIT = 9, - VOID_STORAGE_MAX_WITHDRAW = 9, - VOID_STORAGE_MAX_SLOT = 160 -}; - -enum VoidTransferError -{ - VOID_TRANSFER_ERROR_NO_ERROR = 0, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_1 = 1, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_2 = 2, - VOID_TRANSFER_ERROR_FULL = 3, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_3 = 4, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_4 = 5, - VOID_TRANSFER_ERROR_NOT_ENOUGH_MONEY = 6, - VOID_TRANSFER_ERROR_INVENTORY_FULL = 7, - VOID_TRANSFER_ERROR_ITEM_INVALID = 8, - VOID_TRANSFER_ERROR_TRANSFER_UNKNOWN = 9 -}; - enum class CurrencyDbFlags : uint8 { None = 0x00, @@ -7516,903 +7499,910 @@ enum class GameError : uint32 ERR_SET_LOOT_ROUNDROBIN = 294, ERR_SET_LOOT_MASTER = 295, ERR_SET_LOOT_GROUP = 296, - ERR_SET_LOOT_THRESHOLD_S = 297, - ERR_NEW_LOOT_MASTER_S = 298, - ERR_SPECIFY_MASTER_LOOTER = 299, - ERR_LOOT_SPEC_CHANGED_S = 300, - ERR_TAME_FAILED = 301, - ERR_CHAT_WHILE_DEAD = 302, - ERR_CHAT_PLAYER_NOT_FOUND_S = 303, - ERR_NEWTAXIPATH = 304, - ERR_NO_PET = 305, - ERR_NOTYOURPET = 306, - ERR_PET_NOT_RENAMEABLE = 307, - ERR_QUEST_OBJECTIVE_COMPLETE_S = 308, - ERR_QUEST_UNKNOWN_COMPLETE = 309, - ERR_QUEST_ADD_KILL_SII = 310, - ERR_QUEST_ADD_FOUND_SII = 311, - ERR_QUEST_ADD_ITEM_SII = 312, - ERR_QUEST_ADD_PLAYER_KILL_SII = 313, - ERR_CANNOTCREATEDIRECTORY = 314, - ERR_CANNOTCREATEFILE = 315, - ERR_PLAYER_WRONG_FACTION = 316, - ERR_PLAYER_IS_NEUTRAL = 317, - ERR_BANKSLOT_FAILED_TOO_MANY = 318, - ERR_BANKSLOT_INSUFFICIENT_FUNDS = 319, - ERR_BANKSLOT_NOTBANKER = 320, - ERR_FRIEND_DB_ERROR = 321, - ERR_FRIEND_LIST_FULL = 322, - ERR_FRIEND_ADDED_S = 323, - ERR_BATTLETAG_FRIEND_ADDED_S = 324, - ERR_FRIEND_ONLINE_SS = 325, - ERR_FRIEND_OFFLINE_S = 326, - ERR_FRIEND_NOT_FOUND = 327, - ERR_FRIEND_WRONG_FACTION = 328, - ERR_FRIEND_REMOVED_S = 329, - ERR_BATTLETAG_FRIEND_REMOVED_S = 330, - ERR_FRIEND_ERROR = 331, - ERR_FRIEND_ALREADY_S = 332, - ERR_FRIEND_SELF = 333, - ERR_FRIEND_DELETED = 334, - ERR_IGNORE_FULL = 335, - ERR_IGNORE_SELF = 336, - ERR_IGNORE_NOT_FOUND = 337, - ERR_IGNORE_ALREADY_S = 338, - ERR_IGNORE_ADDED_S = 339, - ERR_IGNORE_REMOVED_S = 340, - ERR_IGNORE_AMBIGUOUS = 341, - ERR_IGNORE_DELETED = 342, - ERR_ONLY_ONE_BOLT = 343, - ERR_ONLY_ONE_AMMO = 344, - ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM = 345, - ERR_WRONG_BAG_TYPE_SUBCLASS = 346, - ERR_CANT_WRAP_STACKABLE = 347, - ERR_CANT_WRAP_EQUIPPED = 348, - ERR_CANT_WRAP_WRAPPED = 349, - ERR_CANT_WRAP_BOUND = 350, - ERR_CANT_WRAP_UNIQUE = 351, - ERR_CANT_WRAP_BAGS = 352, - ERR_OUT_OF_MANA = 353, - ERR_OUT_OF_RAGE = 354, - ERR_OUT_OF_FOCUS = 355, - ERR_OUT_OF_ENERGY = 356, - ERR_OUT_OF_CHI = 357, - ERR_OUT_OF_HEALTH = 358, - ERR_OUT_OF_RUNES = 359, - ERR_OUT_OF_RUNIC_POWER = 360, - ERR_OUT_OF_SOUL_SHARDS = 361, - ERR_OUT_OF_LUNAR_POWER = 362, - ERR_OUT_OF_HOLY_POWER = 363, - ERR_OUT_OF_MAELSTROM = 364, - ERR_OUT_OF_COMBO_POINTS = 365, - ERR_OUT_OF_INSANITY = 366, - ERR_OUT_OF_ESSENCE = 367, - ERR_OUT_OF_ARCANE_CHARGES = 368, - ERR_OUT_OF_FURY = 369, - ERR_OUT_OF_PAIN = 370, - ERR_OUT_OF_POWER_DISPLAY = 371, - ERR_OUT_OF_RUNE_BLOOD = 372, - ERR_OUT_OF_RUNE_FROST = 373, - ERR_OUT_OF_RUNE_UNHOLY = 374, - ERR_OUT_OF_ALTERNATE_QUEST = 375, - ERR_OUT_OF_ALTERNATE_ENCOUNTER = 376, - ERR_OUT_OF_ALTERNATE_MOUNT = 377, - ERR_OUT_OF_BALANCE = 378, - ERR_OUT_OF_HAPPINESS = 379, - ERR_OUT_OF_SHADOW_ORBS = 380, - ERR_OUT_OF_RUNE_CHROMATIC = 381, - ERR_LOOT_GONE = 382, - ERR_MOUNT_FORCEDDISMOUNT = 383, - ERR_AUTOFOLLOW_TOO_FAR = 384, - ERR_UNIT_NOT_FOUND = 385, - ERR_INVALID_FOLLOW_TARGET = 386, - ERR_INVALID_FOLLOW_PVP_COMBAT = 387, - ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT = 388, - ERR_INVALID_INSPECT_TARGET = 389, - ERR_GUILDEMBLEM_SUCCESS = 390, - ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 391, - ERR_GUILDEMBLEM_NOGUILD = 392, - ERR_GUILDEMBLEM_NOTGUILDMASTER = 393, - ERR_GUILDEMBLEM_NOTENOUGHMONEY = 394, - ERR_GUILDEMBLEM_INVALIDVENDOR = 395, - ERR_EMBLEMERROR_NOTABARDGEOSET = 396, - ERR_SPELL_OUT_OF_RANGE = 397, - ERR_COMMAND_NEEDS_TARGET = 398, - ERR_NOAMMO_S = 399, - ERR_TOOBUSYTOFOLLOW = 400, - ERR_DUEL_REQUESTED = 401, - ERR_DUEL_CANCELLED = 402, - ERR_DEATHBINDALREADYBOUND = 403, - ERR_DEATHBIND_SUCCESS_S = 404, - ERR_NOEMOTEWHILERUNNING = 405, - ERR_ZONE_EXPLORED = 406, - ERR_ZONE_EXPLORED_XP = 407, - ERR_INVALID_ITEM_TARGET = 408, - ERR_INVALID_QUEST_TARGET = 409, - ERR_IGNORING_YOU_S = 410, - ERR_FISH_NOT_HOOKED = 411, - ERR_FISH_ESCAPED = 412, - ERR_SPELL_FAILED_NOTUNSHEATHED = 413, - ERR_PETITION_OFFERED_S = 414, - ERR_PETITION_SIGNED = 415, - ERR_PETITION_SIGNED_S = 416, - ERR_PETITION_DECLINED_S = 417, - ERR_PETITION_ALREADY_SIGNED = 418, - ERR_PETITION_RESTRICTED_ACCOUNT_TRIAL = 419, - ERR_PETITION_ALREADY_SIGNED_OTHER = 420, - ERR_PETITION_IN_GUILD = 421, - ERR_PETITION_CREATOR = 422, - ERR_PETITION_NOT_ENOUGH_SIGNATURES = 423, - ERR_PETITION_NOT_SAME_SERVER = 424, - ERR_PETITION_FULL = 425, - ERR_PETITION_ALREADY_SIGNED_BY_S = 426, - ERR_GUILD_NAME_INVALID = 427, - ERR_SPELL_UNLEARNED_S = 428, - ERR_PET_SPELL_ROOTED = 429, - ERR_PET_SPELL_AFFECTING_COMBAT = 430, - ERR_PET_SPELL_OUT_OF_RANGE = 431, - ERR_PET_SPELL_NOT_BEHIND = 432, - ERR_PET_SPELL_TARGETS_DEAD = 433, - ERR_PET_SPELL_DEAD = 434, - ERR_PET_SPELL_NOPATH = 435, - ERR_ITEM_CANT_BE_DESTROYED = 436, - ERR_TICKET_ALREADY_EXISTS = 437, - ERR_TICKET_CREATE_ERROR = 438, - ERR_TICKET_UPDATE_ERROR = 439, - ERR_TICKET_DB_ERROR = 440, - ERR_TICKET_NO_TEXT = 441, - ERR_TICKET_TEXT_TOO_LONG = 442, - ERR_OBJECT_IS_BUSY = 443, - ERR_EXHAUSTION_WELLRESTED = 444, - ERR_EXHAUSTION_RESTED = 445, - ERR_EXHAUSTION_NORMAL = 446, - ERR_EXHAUSTION_TIRED = 447, - ERR_EXHAUSTION_EXHAUSTED = 448, - ERR_NO_ITEMS_WHILE_SHAPESHIFTED = 449, - ERR_CANT_INTERACT_SHAPESHIFTED = 450, - ERR_REALM_NOT_FOUND = 451, - ERR_MAIL_QUEST_ITEM = 452, - ERR_MAIL_BOUND_ITEM = 453, - ERR_MAIL_CONJURED_ITEM = 454, - ERR_MAIL_BAG = 455, - ERR_MAIL_TO_SELF = 456, - ERR_MAIL_TARGET_NOT_FOUND = 457, - ERR_MAIL_DATABASE_ERROR = 458, - ERR_MAIL_DELETE_ITEM_ERROR = 459, - ERR_MAIL_WRAPPED_COD = 460, - ERR_MAIL_CANT_SEND_REALM = 461, - ERR_MAIL_TEMP_RETURN_OUTAGE = 462, - ERR_MAIL_RECEPIENT_CANT_RECEIVE_MAIL = 463, - ERR_MAIL_SENT = 464, - ERR_MAIL_TARGET_IS_TRIAL = 465, - ERR_NOT_HAPPY_ENOUGH = 466, - ERR_USE_CANT_IMMUNE = 467, - ERR_CANT_BE_DISENCHANTED = 468, - ERR_CANT_USE_DISARMED = 469, - ERR_AUCTION_DATABASE_ERROR = 470, - ERR_AUCTION_HIGHER_BID = 471, - ERR_AUCTION_ALREADY_BID = 472, - ERR_AUCTION_OUTBID_S = 473, - ERR_AUCTION_WON_S = 474, - ERR_AUCTION_REMOVED_S = 475, - ERR_AUCTION_BID_PLACED = 476, - ERR_LOGOUT_FAILED = 477, - ERR_QUEST_PUSH_SUCCESS_S = 478, - ERR_QUEST_PUSH_INVALID_S = 479, - ERR_QUEST_PUSH_INVALID_TO_RECIPIENT_S = 480, - ERR_QUEST_PUSH_ACCEPTED_S = 481, - ERR_QUEST_PUSH_DECLINED_S = 482, - ERR_QUEST_PUSH_BUSY_S = 483, - ERR_QUEST_PUSH_DEAD_S = 484, - ERR_QUEST_PUSH_DEAD_TO_RECIPIENT_S = 485, - ERR_QUEST_PUSH_LOG_FULL_S = 486, - ERR_QUEST_PUSH_LOG_FULL_TO_RECIPIENT_S = 487, - ERR_QUEST_PUSH_ONQUEST_S = 488, - ERR_QUEST_PUSH_ONQUEST_TO_RECIPIENT_S = 489, - ERR_QUEST_PUSH_ALREADY_DONE_S = 490, - ERR_QUEST_PUSH_ALREADY_DONE_TO_RECIPIENT_S = 491, - ERR_QUEST_PUSH_NOT_DAILY_S = 492, - ERR_QUEST_PUSH_TIMER_EXPIRED_S = 493, - ERR_QUEST_PUSH_NOT_IN_PARTY_S = 494, - ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_S = 495, - ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_TO_RECIPIENT_S = 496, - ERR_QUEST_PUSH_NOT_ALLOWED_S = 497, - ERR_QUEST_PUSH_PREREQUISITE_S = 498, - ERR_QUEST_PUSH_PREREQUISITE_TO_RECIPIENT_S = 499, - ERR_QUEST_PUSH_LOW_LEVEL_S = 500, - ERR_QUEST_PUSH_LOW_LEVEL_TO_RECIPIENT_S = 501, - ERR_QUEST_PUSH_HIGH_LEVEL_S = 502, - ERR_QUEST_PUSH_HIGH_LEVEL_TO_RECIPIENT_S = 503, - ERR_QUEST_PUSH_CLASS_S = 504, - ERR_QUEST_PUSH_CLASS_TO_RECIPIENT_S = 505, - ERR_QUEST_PUSH_RACE_S = 506, - ERR_QUEST_PUSH_RACE_TO_RECIPIENT_S = 507, - ERR_QUEST_PUSH_LOW_FACTION_S = 508, - ERR_QUEST_PUSH_LOW_FACTION_TO_RECIPIENT_S = 509, - ERR_QUEST_PUSH_HIGH_FACTION_S = 510, - ERR_QUEST_PUSH_HIGH_FACTION_TO_RECIPIENT_S = 511, - ERR_QUEST_PUSH_EXPANSION_S = 512, - ERR_QUEST_PUSH_EXPANSION_TO_RECIPIENT_S = 513, - ERR_QUEST_PUSH_NOT_GARRISON_OWNER_S = 514, - ERR_QUEST_PUSH_NOT_GARRISON_OWNER_TO_RECIPIENT_S = 515, - ERR_QUEST_PUSH_WRONG_COVENANT_S = 516, - ERR_QUEST_PUSH_WRONG_COVENANT_TO_RECIPIENT_S = 517, - ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_S = 518, - ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_TO_RECIPIENT_S = 519, - ERR_QUEST_PUSH_WRONG_FACTION_S = 520, - ERR_QUEST_PUSH_WRONG_FACTION_TO_RECIPIENT_S = 521, - ERR_QUEST_PUSH_CROSS_FACTION_RESTRICTED_S = 522, - ERR_RAID_GROUP_LOWLEVEL = 523, - ERR_RAID_GROUP_ONLY = 524, - ERR_RAID_GROUP_FULL = 525, - ERR_RAID_GROUP_REQUIREMENTS_UNMATCH = 526, - ERR_CORPSE_IS_NOT_IN_INSTANCE = 527, - ERR_PVP_KILL_HONORABLE = 528, - ERR_PVP_KILL_DISHONORABLE = 529, - ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 530, - ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA = 531, - ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S = 532, - ERR_AUTOLOOT_MONEY_S = 533, - ERR_GENERIC_STUNNED = 534, - ERR_GENERIC_THROTTLE = 535, - ERR_CLUB_FINDER_SEARCHING_TOO_FAST = 536, - ERR_TARGET_STUNNED = 537, - ERR_MUST_REPAIR_DURABILITY = 538, - ERR_RAID_YOU_JOINED = 539, - ERR_RAID_YOU_LEFT = 540, - ERR_INSTANCE_GROUP_JOINED_WITH_PARTY = 541, - ERR_INSTANCE_GROUP_JOINED_WITH_RAID = 542, - ERR_RAID_MEMBER_ADDED_S = 543, - ERR_RAID_MEMBER_REMOVED_S = 544, - ERR_INSTANCE_GROUP_ADDED_S = 545, - ERR_INSTANCE_GROUP_REMOVED_S = 546, - ERR_CLICK_ON_ITEM_TO_FEED = 547, - ERR_TOO_MANY_CHAT_CHANNELS = 548, - ERR_LOOT_ROLL_PENDING = 549, - ERR_LOOT_PLAYER_NOT_FOUND = 550, - ERR_NOT_IN_RAID = 551, - ERR_LOGGING_OUT = 552, - ERR_TARGET_LOGGING_OUT = 553, - ERR_NOT_WHILE_MOUNTED = 554, - ERR_NOT_WHILE_SHAPESHIFTED = 555, - ERR_NOT_IN_COMBAT = 556, - ERR_NOT_WHILE_DISARMED = 557, - ERR_PET_BROKEN = 558, - ERR_TALENT_WIPE_ERROR = 559, - ERR_SPEC_WIPE_ERROR = 560, - ERR_GLYPH_WIPE_ERROR = 561, - ERR_PET_SPEC_WIPE_ERROR = 562, - ERR_FEIGN_DEATH_RESISTED = 563, - ERR_MEETING_STONE_IN_QUEUE_S = 564, - ERR_MEETING_STONE_LEFT_QUEUE_S = 565, - ERR_MEETING_STONE_OTHER_MEMBER_LEFT = 566, - ERR_MEETING_STONE_PARTY_KICKED_FROM_QUEUE = 567, - ERR_MEETING_STONE_MEMBER_STILL_IN_QUEUE = 568, - ERR_MEETING_STONE_SUCCESS = 569, - ERR_MEETING_STONE_IN_PROGRESS = 570, - ERR_MEETING_STONE_MEMBER_ADDED_S = 571, - ERR_MEETING_STONE_GROUP_FULL = 572, - ERR_MEETING_STONE_NOT_LEADER = 573, - ERR_MEETING_STONE_INVALID_LEVEL = 574, - ERR_MEETING_STONE_TARGET_NOT_IN_PARTY = 575, - ERR_MEETING_STONE_TARGET_INVALID_LEVEL = 576, - ERR_MEETING_STONE_MUST_BE_LEADER = 577, - ERR_MEETING_STONE_NO_RAID_GROUP = 578, - ERR_MEETING_STONE_NEED_PARTY = 579, - ERR_MEETING_STONE_NOT_FOUND = 580, - ERR_MEETING_STONE_TARGET_IN_VEHICLE = 581, - ERR_GUILDEMBLEM_SAME = 582, - ERR_EQUIP_TRADE_ITEM = 583, - ERR_PVP_TOGGLE_ON = 584, - ERR_PVP_TOGGLE_OFF = 585, - ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS = 586, - ERR_GROUP_JOIN_BATTLEGROUND_DEAD = 587, - ERR_GROUP_JOIN_BATTLEGROUND_S = 588, - ERR_GROUP_JOIN_BATTLEGROUND_FAIL = 589, - ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY = 590, - ERR_SOLO_JOIN_BATTLEGROUND_S = 591, - ERR_JOIN_SINGLE_SCENARIO_S = 592, - ERR_BATTLEGROUND_TOO_MANY_QUEUES = 593, - ERR_BATTLEGROUND_CANNOT_QUEUE_FOR_RATED = 594, - ERR_BATTLEDGROUND_QUEUED_FOR_RATED = 595, - ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 596, - ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 597, - ERR_ALREADY_IN_ARENA_TEAM_S = 598, - ERR_INVALID_PROMOTION_CODE = 599, - ERR_BG_PLAYER_JOINED_SS = 600, - ERR_BG_PLAYER_LEFT_S = 601, - ERR_RESTRICTED_ACCOUNT = 602, - ERR_RESTRICTED_ACCOUNT_TRIAL = 603, - ERR_NOT_ENOUGH_PURCHASED_GAME_TIME = 604, - ERR_PLAY_TIME_EXCEEDED = 605, - ERR_APPROACHING_PARTIAL_PLAY_TIME = 606, - ERR_APPROACHING_PARTIAL_PLAY_TIME_2 = 607, - ERR_APPROACHING_NO_PLAY_TIME = 608, - ERR_APPROACHING_NO_PLAY_TIME_2 = 609, - ERR_UNHEALTHY_TIME = 610, - ERR_CHAT_RESTRICTED_TRIAL = 611, - ERR_CHAT_THROTTLED = 612, - ERR_MAIL_REACHED_CAP = 613, - ERR_INVALID_RAID_TARGET = 614, - ERR_RAID_LEADER_READY_CHECK_START_S = 615, - ERR_READY_CHECK_IN_PROGRESS = 616, - ERR_READY_CHECK_THROTTLED = 617, - ERR_DUNGEON_DIFFICULTY_FAILED = 618, - ERR_DUNGEON_DIFFICULTY_CHANGED_S = 619, - ERR_TRADE_WRONG_REALM = 620, - ERR_TRADE_NOT_ON_TAPLIST = 621, - ERR_CHAT_PLAYER_AMBIGUOUS_S = 622, - ERR_LOOT_CANT_LOOT_THAT_NOW = 623, - ERR_LOOT_MASTER_INV_FULL = 624, - ERR_LOOT_MASTER_UNIQUE_ITEM = 625, - ERR_LOOT_MASTER_OTHER = 626, - ERR_FILTERING_YOU_S = 627, - ERR_USE_PREVENTED_BY_MECHANIC_S = 628, - ERR_ITEM_UNIQUE_EQUIPPABLE = 629, - ERR_LFG_LEADER_IS_LFM_S = 630, - ERR_LFG_PENDING = 631, - ERR_CANT_SPEAK_LANGAGE = 632, - ERR_VENDOR_MISSING_TURNINS = 633, - ERR_BATTLEGROUND_NOT_IN_TEAM = 634, - ERR_NOT_IN_BATTLEGROUND = 635, - ERR_NOT_ENOUGH_HONOR_POINTS = 636, - ERR_NOT_ENOUGH_ARENA_POINTS = 637, - ERR_SOCKETING_REQUIRES_META_GEM = 638, - ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT = 639, - ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM = 640, - ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT = 641, - ERR_SOCKETING_REQUIRES_COGWHEEL_GEM = 642, - ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT = 643, - ERR_SOCKETING_ITEM_TOO_LOW_LEVEL = 644, - ERR_ITEM_MAX_COUNT_SOCKETED = 645, - ERR_SYSTEM_DISABLED = 646, - ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I = 647, - ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 648, - ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 649, - ERR_USER_SQUELCHED = 650, - ERR_ACCOUNT_SILENCED = 651, - ERR_PARTY_MEMBER_SILENCED = 652, - ERR_PARTY_MEMBER_SILENCED_LFG_DELIST = 653, - ERR_TOO_MUCH_GOLD = 654, - ERR_NOT_BARBER_SITTING = 655, - ERR_QUEST_FAILED_CAIS = 656, - ERR_INVITE_RESTRICTED_TRIAL = 657, - ERR_VOICE_IGNORE_FULL = 658, - ERR_VOICE_IGNORE_SELF = 659, - ERR_VOICE_IGNORE_NOT_FOUND = 660, - ERR_VOICE_IGNORE_ALREADY_S = 661, - ERR_VOICE_IGNORE_ADDED_S = 662, - ERR_VOICE_IGNORE_REMOVED_S = 663, - ERR_VOICE_IGNORE_AMBIGUOUS = 664, - ERR_VOICE_IGNORE_DELETED = 665, - ERR_UNKNOWN_MACRO_OPTION_S = 666, - ERR_NOT_DURING_ARENA_MATCH = 667, - ERR_NOT_IN_RATED_BATTLEGROUND = 668, - ERR_PLAYER_SILENCED = 669, - ERR_PLAYER_UNSILENCED = 670, - ERR_COMSAT_DISCONNECT = 671, - ERR_COMSAT_RECONNECT_ATTEMPT = 672, - ERR_COMSAT_CONNECT_FAIL = 673, - ERR_MAIL_INVALID_ATTACHMENT_SLOT = 674, - ERR_MAIL_TOO_MANY_ATTACHMENTS = 675, - ERR_MAIL_INVALID_ATTACHMENT = 676, - ERR_MAIL_ATTACHMENT_EXPIRED = 677, - ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC = 678, - ERR_PROFANE_CHAT_NAME = 679, - ERR_PLAYER_SILENCED_ECHO = 680, - ERR_PLAYER_UNSILENCED_ECHO = 681, - ERR_LOOT_CANT_LOOT_THAT = 682, - ERR_ARENA_EXPIRED_CAIS = 683, - ERR_GROUP_ACTION_THROTTLED = 684, - ERR_ALREADY_PICKPOCKETED = 685, - ERR_NAME_INVALID = 686, - ERR_NAME_NO_NAME = 687, - ERR_NAME_TOO_SHORT = 688, - ERR_NAME_TOO_LONG = 689, - ERR_NAME_MIXED_LANGUAGES = 690, - ERR_NAME_PROFANE = 691, - ERR_NAME_RESERVED = 692, - ERR_NAME_THREE_CONSECUTIVE = 693, - ERR_NAME_INVALID_SPACE = 694, - ERR_NAME_CONSECUTIVE_SPACES = 695, - ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 696, - ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 697, - ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 698, - ERR_RECRUIT_A_FRIEND_NOT_LINKED = 699, - ERR_RECRUIT_A_FRIEND_NOT_NOW = 700, - ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX = 701, - ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN = 702, - ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE = 703, - ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL = 704, - ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 705, - ERR_NOT_SAME_ACCOUNT = 706, - ERR_BAD_ON_USE_ENCHANT = 707, - ERR_TRADE_SELF = 708, - ERR_TOO_MANY_SOCKETS = 709, - ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 710, - ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 711, - ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 712, - ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 713, - ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 714, - ERR_ITEM_INVENTORY_FULL_SATCHEL = 715, - ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 716, - ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 717, - ERR_PURCHASE_LEVEL_TOO_LOW = 718, - ERR_GROUP_SWAP_FAILED = 719, - ERR_INVITE_IN_COMBAT = 720, - ERR_INVALID_GLYPH_SLOT = 721, - ERR_GENERIC_NO_VALID_TARGETS = 722, - ERR_CALENDAR_EVENT_ALERT_S = 723, - ERR_PET_LEARN_SPELL_S = 724, - ERR_PET_LEARN_ABILITY_S = 725, - ERR_PET_SPELL_UNLEARNED_S = 726, - ERR_INVITE_UNKNOWN_REALM = 727, - ERR_INVITE_NO_PARTY_SERVER = 728, - ERR_INVITE_PARTY_BUSY = 729, - ERR_INVITE_PARTY_BUSY_PENDING_REQUEST = 730, - ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST = 731, - ERR_PARTY_TARGET_AMBIGUOUS = 732, - ERR_PARTY_LFG_INVITE_RAID_LOCKED = 733, - ERR_PARTY_LFG_BOOT_LIMIT = 734, - ERR_PARTY_LFG_BOOT_COOLDOWN_S = 735, - ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 736, - ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S = 737, - ERR_PARTY_LFG_BOOT_IN_PROGRESS = 738, - ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 739, - ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED = 740, - ERR_PARTY_LFG_BOOT_VOTE_FAILED = 741, - ERR_PARTY_LFG_BOOT_DISALLOWED_BY_MAP = 742, - ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 743, - ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 744, - ERR_PARTY_LFG_BOOT_VOTE_REGISTERED = 745, - ERR_PARTY_PRIVATE_GROUP_ONLY = 746, - ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 747, - ERR_PARTY_TIME_RUNNING_SEASON_ID_MUST_MATCH = 748, - ERR_RAID_DISALLOWED_BY_LEVEL = 749, - ERR_RAID_DISALLOWED_BY_CROSS_REALM = 750, - ERR_PARTY_ROLE_NOT_AVAILABLE = 751, - ERR_JOIN_LFG_OBJECT_FAILED = 752, - ERR_LFG_REMOVED_LEVELUP = 753, - ERR_LFG_REMOVED_XP_TOGGLE = 754, - ERR_LFG_REMOVED_FACTION_CHANGE = 755, - ERR_BATTLEGROUND_INFO_THROTTLED = 756, - ERR_BATTLEGROUND_ALREADY_IN = 757, - ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED = 758, - ERR_ARENA_TEAM_PERMISSIONS = 759, - ERR_NOT_WHILE_FALLING = 760, - ERR_NOT_WHILE_MOVING = 761, - ERR_NOT_WHILE_FATIGUED = 762, - ERR_MAX_SOCKETS = 763, - ERR_MULTI_CAST_ACTION_TOTEM_S = 764, - ERR_BATTLEGROUND_JOIN_LEVELUP = 765, - ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN = 766, - ERR_BATTLEGROUND_JOIN_XP_GAIN = 767, - ERR_BATTLEGROUND_JOIN_MERCENARY = 768, - ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS = 769, - ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS = 770, - ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS = 771, - ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE = 772, - ERR_RAID_DIFFICULTY_FAILED = 773, - ERR_RAID_DIFFICULTY_CHANGED_S = 774, - ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S = 775, - ERR_RAID_LOCKOUT_CHANGED_S = 776, - ERR_RAID_CONVERTED_TO_PARTY = 777, - ERR_PARTY_CONVERTED_TO_RAID = 778, - ERR_PLAYER_DIFFICULTY_CHANGED_S = 779, - ERR_GMRESPONSE_DB_ERROR = 780, - ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 781, - ERR_ARENA_JOIN_RANGE_INDEX = 782, - ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 783, - ERR_BATTLEGROUND_JOIN_FAILED = 784, - ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 785, - ERR_BATTLEGROUND_JOIN_RESPEC = 786, - ERR_BATTLEGROUND_INVITATION_DECLINED = 787, - ERR_BATTLEGROUND_INVITATION_DECLINED_BY = 788, - ERR_BATTLEGROUND_JOIN_TIMED_OUT = 789, - ERR_BATTLEGROUND_DUPE_QUEUE = 790, - ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 791, - ERR_IN_BATTLEGROUND_RESPEC = 792, - ERR_MAIL_LIMITED_DURATION_ITEM = 793, - ERR_YELL_RESTRICTED_TRIAL = 794, - ERR_CHAT_RAID_RESTRICTED_TRIAL = 795, - ERR_LFG_ROLE_CHECK_FAILED = 796, - ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT = 797, - ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE = 798, - ERR_LFG_READY_CHECK_FAILED = 799, - ERR_LFG_READY_CHECK_FAILED_TIMEOUT = 800, - ERR_LFG_GROUP_FULL = 801, - ERR_LFG_NO_LFG_OBJECT = 802, - ERR_LFG_NO_SLOTS_PLAYER = 803, - ERR_LFG_NO_SLOTS_PARTY = 804, - ERR_LFG_NO_SPEC = 805, - ERR_LFG_MISMATCHED_SLOTS = 806, - ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM = 807, - ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 808, - ERR_LFG_MEMBERS_NOT_PRESENT = 809, - ERR_LFG_GET_INFO_TIMEOUT = 810, - ERR_LFG_INVALID_SLOT = 811, - ERR_LFG_DESERTER_PLAYER = 812, - ERR_LFG_DESERTER_PARTY = 813, - ERR_LFG_DEAD = 814, - ERR_LFG_RANDOM_COOLDOWN_PLAYER = 815, - ERR_LFG_RANDOM_COOLDOWN_PARTY = 816, - ERR_LFG_TOO_MANY_MEMBERS = 817, - ERR_LFG_TOO_FEW_MEMBERS = 818, - ERR_LFG_PROPOSAL_FAILED = 819, - ERR_LFG_PROPOSAL_DECLINED_SELF = 820, - ERR_LFG_PROPOSAL_DECLINED_PARTY = 821, - ERR_LFG_NO_SLOTS_SELECTED = 822, - ERR_LFG_NO_ROLES_SELECTED = 823, - ERR_LFG_ROLE_CHECK_INITIATED = 824, - ERR_LFG_READY_CHECK_INITIATED = 825, - ERR_LFG_PLAYER_DECLINED_ROLE_CHECK = 826, - ERR_LFG_PLAYER_DECLINED_READY_CHECK = 827, - ERR_LFG_LOREWALKING = 828, - ERR_LFG_JOINED_QUEUE = 829, - ERR_LFG_JOINED_FLEX_QUEUE = 830, - ERR_LFG_JOINED_RF_QUEUE = 831, - ERR_LFG_JOINED_SCENARIO_QUEUE = 832, - ERR_LFG_JOINED_WORLD_PVP_QUEUE = 833, - ERR_LFG_JOINED_BATTLEFIELD_QUEUE = 834, - ERR_LFG_JOINED_LIST = 835, - ERR_QUEUED_PLUNDERSTORM = 836, - ERR_LFG_LEFT_QUEUE = 837, - ERR_LFG_LEFT_LIST = 838, - ERR_LFG_ROLE_CHECK_ABORTED = 839, - ERR_LFG_READY_CHECK_ABORTED = 840, - ERR_LFG_CANT_USE_BATTLEGROUND = 841, - ERR_LFG_CANT_USE_DUNGEONS = 842, - ERR_LFG_REASON_TOO_MANY_LFG = 843, - ERR_LFG_FARM_LIMIT = 844, - ERR_LFG_NO_CROSS_FACTION_PARTIES = 845, - ERR_INVALID_TELEPORT_LOCATION = 846, - ERR_TOO_FAR_TO_INTERACT = 847, - ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS = 848, - ERR_DIFFICULTY_CHANGE_COOLDOWN_S = 849, - ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S = 850, - ERR_DIFFICULTY_CHANGE_WORLDSTATE = 851, - ERR_DIFFICULTY_CHANGE_ENCOUNTER = 852, - ERR_DIFFICULTY_CHANGE_COMBAT = 853, - ERR_DIFFICULTY_CHANGE_PLAYER_BUSY = 854, - ERR_DIFFICULTY_CHANGE_PLAYER_ON_VEHICLE = 855, - ERR_DIFFICULTY_CHANGE_ALREADY_STARTED = 856, - ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S = 857, - ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING = 858, - ERR_ARENA_TEAM_PARTY_SIZE = 859, - ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 860, - ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 861, - ERR_SOLO_RBG_WARGAME_GROUP_SIZE = 862, - ERR_SOLO_RBG_WARGAME_GROUP_COMP = 863, - ERR_SOLO_MIN_ITEM_LEVEL = 864, - ERR_PVP_PLAYER_ABANDONED = 865, - ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER = 866, - ERR_QUEST_FORCE_REMOVED_S = 867, - ERR_ATTACK_NO_ACTIONS = 868, - ERR_IN_RANDOM_BG = 869, - ERR_IN_NON_RANDOM_BG = 870, - ERR_BN_FRIEND_SELF = 871, - ERR_BN_FRIEND_ALREADY = 872, - ERR_BN_FRIEND_BLOCKED = 873, - ERR_BN_FRIEND_LIST_FULL = 874, - ERR_BN_FRIEND_REQUEST_SENT = 875, - ERR_BN_BROADCAST_THROTTLE = 876, - ERR_BG_DEVELOPER_ONLY = 877, - ERR_CURRENCY_SPELL_SLOT_MISMATCH = 878, - ERR_CURRENCY_NOT_TRADABLE = 879, - ERR_REQUIRES_EXPANSION_S = 880, - ERR_QUEST_FAILED_SPELL = 881, - ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 882, - ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 883, - ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 884, - ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 885, - ERR_TALENT_FAILED_UNKNOWN = 886, - ERR_TALENT_FAILED_IN_COMBAT = 887, - ERR_TALENT_FAILED_IN_PVP_MATCH = 888, - ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 889, - ERR_WARGAME_REQUEST_FAILURE = 890, - ERR_RANK_REQUIRES_AUTHENTICATOR = 891, - ERR_GUILD_BANK_VOUCHER_FAILED = 892, - ERR_WARGAME_REQUEST_SENT = 893, - ERR_REQUIRES_ACHIEVEMENT_I = 894, - ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 895, - ERR_CANT_BUY_QUANTITY = 896, - ERR_ITEM_IS_BATTLE_PAY_LOCKED = 897, - ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 898, - ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 899, - ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 900, - ERR_INSUFF_TRACKED_CURRENCY_IS = 901, - ERR_NOT_ON_TOURNAMENT_REALM = 902, - ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 903, - ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 904, - ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 905, - ERR_CANT_DO_THAT_IN_A_GROUP = 906, - ERR_GUILD_LEADER_REPLACED = 907, - ERR_TRANSMOGRIFY_CANT_EQUIP = 908, - ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 909, - ERR_TRANSMOGRIFY_NOT_SOULBOUND = 910, - ERR_TRANSMOGRIFY_INVALID_SOURCE = 911, - ERR_TRANSMOGRIFY_INVALID_DESTINATION = 912, - ERR_TRANSMOGRIFY_MISMATCH = 913, - ERR_TRANSMOGRIFY_LEGENDARY = 914, - ERR_TRANSMOGRIFY_SAME_ITEM = 915, - ERR_TRANSMOGRIFY_SAME_APPEARANCE = 916, - ERR_TRANSMOGRIFY_NOT_EQUIPPED = 917, - ERR_VOID_DEPOSIT_FULL = 918, - ERR_VOID_WITHDRAW_FULL = 919, - ERR_VOID_STORAGE_WRAPPED = 920, - ERR_VOID_STORAGE_STACKABLE = 921, - ERR_VOID_STORAGE_UNBOUND = 922, - ERR_VOID_STORAGE_REPAIR = 923, - ERR_VOID_STORAGE_CHARGES = 924, - ERR_VOID_STORAGE_QUEST = 925, - ERR_VOID_STORAGE_CONJURED = 926, - ERR_VOID_STORAGE_MAIL = 927, - ERR_VOID_STORAGE_BAG = 928, - ERR_VOID_TRANSFER_STORAGE_FULL = 929, - ERR_VOID_TRANSFER_INV_FULL = 930, - ERR_VOID_TRANSFER_INTERNAL_ERROR = 931, - ERR_VOID_TRANSFER_ITEM_INVALID = 932, - ERR_DIFFICULTY_DISABLED_IN_LFG = 933, - ERR_VOID_STORAGE_UNIQUE = 934, - ERR_VOID_STORAGE_LOOT = 935, - ERR_VOID_STORAGE_HOLIDAY = 936, - ERR_VOID_STORAGE_DURATION = 937, - ERR_VOID_STORAGE_LOAD_FAILED = 938, - ERR_VOID_STORAGE_INVALID_ITEM = 939, - ERR_VOID_STORAGE_ACCOUNT_ITEM = 940, - ERR_PARENTAL_CONTROLS_CHAT_MUTED = 941, - ERR_SOR_START_EXPERIENCE_INCOMPLETE = 942, - ERR_SOR_INVALID_EMAIL = 943, - ERR_SOR_INVALID_COMMENT = 944, - ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 945, - ERR_CHALLENGE_MODE_RESET_KEYSTONE = 946, - ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 947, - ERR_REPORT_SUBMITTED_SUCCESSFULLY = 948, - ERR_REPORT_SUBMISSION_FAILED = 949, - ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 950, - ERR_BUG_SUBMITTED_SUCCESSFULLY = 951, - ERR_CHALLENGE_MODE_ENABLED = 952, - ERR_CHALLENGE_MODE_DISABLED = 953, - ERR_PETBATTLE_CREATE_FAILED = 954, - ERR_PETBATTLE_NOT_HERE = 955, - ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 956, - ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 957, - ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 958, - ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 959, - ERR_PETBATTLE_NOT_WHILE_DEAD = 960, - ERR_PETBATTLE_NOT_WHILE_FLYING = 961, - ERR_PETBATTLE_TARGET_INVALID = 962, - ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 963, - ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 964, - ERR_PETBATTLE_NOT_A_TRAINER = 965, - ERR_PETBATTLE_DECLINED = 966, - ERR_PETBATTLE_IN_BATTLE = 967, - ERR_PETBATTLE_INVALID_LOADOUT = 968, - ERR_PETBATTLE_ALL_PETS_DEAD = 969, - ERR_PETBATTLE_NO_PETS_IN_SLOTS = 970, - ERR_PETBATTLE_NO_ACCOUNT_LOCK = 971, - ERR_PETBATTLE_WILD_PET_TAPPED = 972, - ERR_PETBATTLE_RESTRICTED_ACCOUNT = 973, - ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 974, - ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 975, - ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 976, - ERR_CANT_HAVE_MORE_PETS = 977, - ERR_PVP_MAP_NOT_FOUND = 978, - ERR_PVP_MAP_NOT_SET = 979, - ERR_PETBATTLE_QUEUE_QUEUED = 980, - ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 981, - ERR_PETBATTLE_QUEUE_JOIN_FAILED = 982, - ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 983, - ERR_PETBATTLE_QUEUE_REMOVED = 984, - ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 985, - ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 986, - ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 987, - ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 988, - ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 989, - ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 990, - ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 991, - ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 992, - ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 993, - ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 994, - ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 995, - ERR_PETBATTLE_QUEUE_SLOT_DEAD = 996, - ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 997, - ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 998, - ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 999, - ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 1000, - ERR_HAS_RESTRICTION = 1001, - ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 1002, - ERR_ITEM_UPGRADE_NO_PATH = 1003, - ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 1004, - ERR_BONUS_ROLL_EMPTY = 1005, - ERR_CHALLENGE_MODE_FULL = 1006, - ERR_CHALLENGE_MODE_IN_PROGRESS = 1007, - ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 1008, - ERR_BATTLETAG_FRIEND_NOT_FOUND = 1009, - ERR_BATTLETAG_FRIEND_NOT_VALID = 1010, - ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 1011, - ERR_BATTLETAG_FRIEND_THROTTLED = 1012, - ERR_BATTLETAG_FRIEND_SUCCESS = 1013, - ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 1014, - ERR_PETBATTLE_INTERNAL = 1015, - ERR_CANT_CAGE_PET_YET = 1016, - ERR_NO_LOOT_IN_CHALLENGE_MODE = 1017, - ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 1018, - ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 1019, - ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 1020, - ERR_RECRUIT_A_FRIEND_FAILED = 1021, - ERR_SET_LOOT_PERSONAL = 1022, - ERR_SET_LOOT_METHOD_FAILED_COMBAT = 1023, - ERR_REAGENT_BANK_FULL = 1024, - ERR_REAGENT_BANK_LOCKED = 1025, - ERR_GARRISON_BUILDING_EXISTS = 1026, - ERR_GARRISON_INVALID_PLOT = 1027, - ERR_GARRISON_INVALID_BUILDINGID = 1028, - ERR_GARRISON_INVALID_PLOT_BUILDING = 1029, - ERR_GARRISON_REQUIRES_BLUEPRINT = 1030, - ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1031, - ERR_GARRISON_NOT_ENOUGH_GOLD = 1032, - ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1033, - ERR_ALREADY_USING_LFG_LIST = 1034, - ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1035, - ERR_TOY_USE_LIMIT_REACHED = 1036, - ERR_TOY_ALREADY_KNOWN = 1037, - ERR_TRANSMOG_SET_ALREADY_KNOWN = 1038, - ERR_NOT_ENOUGH_CURRENCY = 1039, - ERR_SPEC_IS_DISABLED = 1040, - ERR_FEATURE_RESTRICTED_TRIAL = 1041, - ERR_CANT_BE_OBLITERATED = 1042, - ERR_CANT_BE_SCRAPPED = 1043, - ERR_CANT_BE_RECRAFTED = 1044, - ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1045, - ERR_MUST_EQUIP_ARTIFACT = 1046, - ERR_CANT_DO_THAT_RIGHT_NOW = 1047, - ERR_AFFECTING_COMBAT = 1048, - ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1049, - ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1050, - ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1051, - ERR_MOVIE_RECORDING_WARNING_PERF = 1052, - ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1053, - ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1054, - ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1055, - ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1056, - ERR_NO_CHALLENGE_MODE_REWARD = 1057, - ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1058, - ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1059, - ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1060, - ERR_TALENT_FAILED_REST_AREA = 1061, - ERR_CANNOT_ABANDON_LAST_PET = 1062, - ERR_TEST_CVAR_SET_SSS = 1063, - ERR_QUEST_TURN_IN_FAIL_REASON = 1064, - ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1065, - ERR_TALENT_GRANTED_BY_AURA = 1066, - ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1067, - ERR_GLYPH_TARGET_NOT_AVAILABLE = 1068, - ERR_PVP_WARMODE_TOGGLE_ON = 1069, - ERR_PVP_WARMODE_TOGGLE_OFF = 1070, - ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1071, - ERR_SPELL_FAILED_CANT_FLY_HERE = 1072, - ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1073, - ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1074, - ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1075, - ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1076, - ERR_VOICE_CHAT_SERVICE_LOST = 1077, - ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1078, - ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1079, - ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1080, - ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1081, - ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1082, - ERR_VOICE_CHAT_PLAYER_SILENCED = 1083, - ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1084, - ERR_VOICE_CHAT_DISABLED = 1085, - ERR_NO_PVP_REWARD = 1086, - ERR_CLAIMED_PVP_REWARD = 1087, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1088, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1089, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1090, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1091, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1092, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1093, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1094, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1095, - ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1096, - ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1097, - ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1098, - ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1099, - ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1100, - ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1101, - ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1102, - ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1103, - ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1104, - ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1105, - ERR_SOCKETING_REQUIRES_TINKER_GEM = 1106, - ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1107, - ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM = 1108, - ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT = 1109, - ERR_SOCKETING_REQUIRES_FRAGRANCE_GEM = 1110, - ERR_SOCKETING_FRAGRANCE_GEM_ONLY_IN_FRAGRANCESLOT = 1111, - ERR_SOCKETING_REQUIRES_SINGING_THUNDER_GEM = 1112, - ERR_SOCKETING_SINGINGTHUNDER_GEM_ONLY_IN_SINGINGTHUNDERSLOT = 1113, - ERR_SOCKETING_REQUIRES_SINGING_SEA_GEM = 1114, - ERR_SOCKETING_SINGINGSEA_GEM_ONLY_IN_SINGINGSEASLOT = 1115, - ERR_SOCKETING_REQUIRES_SINGING_WIND_GEM = 1116, - ERR_SOCKETING_SINGINGWIND_GEM_ONLY_IN_SINGINGWINDSLOT = 1117, - ERR_LEVEL_LINKING_RESULT_LINKED = 1118, - ERR_LEVEL_LINKING_RESULT_UNLINKED = 1119, - ERR_CLUB_FINDER_ERROR_POST_CLUB = 1120, - ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1121, - ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1122, - ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1123, - ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1124, - ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1125, - ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1126, - ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1127, - ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1128, - ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1129, - ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1130, - ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1131, - ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1132, - ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1133, - ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1134, - ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1135, - ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1136, - ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT = 1137, - ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1138, - ERR_SOULBIND_INVALID_CONDUIT = 1139, - ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1140, - ERR_SOULBIND_INVALID_TALENT = 1141, - ERR_SOULBIND_DUPLICATE_CONDUIT = 1142, - ERR_ACTIVATE_SOULBIND_S = 1143, - ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1144, - ERR_CANT_USE_PROFANITY = 1145, - ERR_NOT_IN_PET_BATTLE = 1146, - ERR_NOT_IN_NPE = 1147, - ERR_NO_SPEC = 1148, - ERR_NO_DOMINATIONSHARD_OVERWRITE = 1149, - ERR_USE_WEEKLY_REWARDS_DISABLED = 1150, - ERR_CROSS_FACTION_GROUP_JOINED = 1151, - ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1152, - ERR_EQUIPABLESPELLS_SLOTS_FULL = 1153, - ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN = 1154, - ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 1155, - ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK = 1156, - ERR_NO_REFUNDABLE_ITEM_IN_ACCOUNT_BANK = 1157, - ERR_CANT_DELETE_IN_ACCOUNT_BANK = 1158, - ERR_NO_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1159, - ERR_NO_OPEN_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1160, - ERR_CANT_TRADE_ACCOUNT_ITEM = 1161, - ERR_NO_ACCOUNT_INVENTORY_LOCK = 1162, - ERR_BANK_NOT_ACCESSIBLE = 1163, - ERR_TOO_MANY_ACCOUNT_BANK_TABS = 1164, - ERR_ACCOUNT_BANK_TAB_NOT_UNLOCKED = 1165, - ERR_ACCOUNT_MONEY_LOCKED = 1166, - ERR_BANK_TAB_INVALID_NAME = 1167, - ERR_BANK_TAB_INVALID_TEXT = 1168, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL = 1169, - ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT = 1170, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED = 1171, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID = 1172, - ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED = 1173, - ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED = 1174, - ERR_WOW_LABS_SET_WOW_LABS_AREA_ID_FAILED = 1175, - ERR_PLUNDERSTORM_CANNOT_QUEUE = 1176, - ERR_TARGET_IS_SELF_FOUND_CANNOT_TRADE = 1177, - ERR_PLAYER_IS_SELF_FOUND_CANNOT_TRADE = 1178, - ERR_MAIL_RECEPIENT_IS_SELF_FOUND_CANNOT_RECEIVE_MAIL = 1179, - ERR_PLAYER_IS_SELF_FOUND_CANNOT_SEND_MAIL = 1180, - ERR_PLAYER_IS_SELF_FOUND_CANNOT_USE_AUCTION_HOUSE = 1181, - ERR_MAIL_TARGET_CANNOT_RECEIVE_MAIL = 1182, - ERR_REMIX_INVALID_TRANSFER_REQUEST = 1183, - ERR_CURRENCY_TRANSFER_INVALID_CHARACTER = 1184, - ERR_CURRENCY_TRANSFER_INVALID_CURRENCY = 1185, - ERR_CURRENCY_TRANSFER_INSUFFICIENT_CURRENCY = 1186, - ERR_CURRENCY_TRANSFER_MAX_QUANTITY = 1187, - ERR_CURRENCY_TRANSFER_NO_VALID_SOURCE = 1188, - ERR_CURRENCY_TRANSFER_CHARACTER_LOGGED_IN = 1189, - ERR_CURRENCY_TRANSFER_SERVER_ERROR = 1190, - ERR_CURRENCY_TRANSFER_UNMET_REQUIREMENTS = 1191, - ERR_CURRENCY_TRANSFER_TRANSACTION_IN_PROGRESS = 1192, - ERR_CURRENCY_TRANSFER_DISABLED = 1193, + ERR_SET_LOOT_NBG = 297, + ERR_SET_LOOT_THRESHOLD_S = 298, + ERR_NEW_LOOT_MASTER_S = 299, + ERR_SPECIFY_MASTER_LOOTER = 300, + ERR_LOOT_SPEC_CHANGED_S = 301, + ERR_TAME_FAILED = 302, + ERR_CHAT_WHILE_DEAD = 303, + ERR_CHAT_PLAYER_NOT_FOUND_S = 304, + ERR_NEWTAXIPATH = 305, + ERR_NO_PET = 306, + ERR_NOTYOURPET = 307, + ERR_PET_NOT_RENAMEABLE = 308, + ERR_QUEST_OBJECTIVE_COMPLETE_S = 309, + ERR_QUEST_UNKNOWN_COMPLETE = 310, + ERR_QUEST_ADD_KILL_SII = 311, + ERR_QUEST_ADD_FOUND_SII = 312, + ERR_QUEST_ADD_ITEM_SII = 313, + ERR_QUEST_ADD_PLAYER_KILL_SII = 314, + ERR_CANNOTCREATEDIRECTORY = 315, + ERR_CANNOTCREATEFILE = 316, + ERR_PLAYER_WRONG_FACTION = 317, + ERR_PLAYER_IS_NEUTRAL = 318, + ERR_BANKSLOT_FAILED_TOO_MANY = 319, + ERR_BANKSLOT_INSUFFICIENT_FUNDS = 320, + ERR_BANKSLOT_NOTBANKER = 321, + ERR_FRIEND_DB_ERROR = 322, + ERR_FRIEND_LIST_FULL = 323, + ERR_FRIEND_ADDED_S = 324, + ERR_BATTLETAG_FRIEND_ADDED_S = 325, + ERR_FRIEND_ONLINE_SS = 326, + ERR_FRIEND_OFFLINE_S = 327, + ERR_FRIEND_NOT_FOUND = 328, + ERR_FRIEND_WRONG_FACTION = 329, + ERR_FRIEND_REMOVED_S = 330, + ERR_BATTLETAG_FRIEND_REMOVED_S = 331, + ERR_FRIEND_ERROR = 332, + ERR_FRIEND_ALREADY_S = 333, + ERR_FRIEND_SELF = 334, + ERR_FRIEND_DELETED = 335, + ERR_IGNORE_FULL = 336, + ERR_IGNORE_SELF = 337, + ERR_IGNORE_NOT_FOUND = 338, + ERR_IGNORE_ALREADY_S = 339, + ERR_IGNORE_ADDED_S = 340, + ERR_IGNORE_REMOVED_S = 341, + ERR_IGNORE_AMBIGUOUS = 342, + ERR_IGNORE_DELETED = 343, + ERR_ONLY_ONE_BOLT = 344, + ERR_ONLY_ONE_AMMO = 345, + ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM = 346, + ERR_WRONG_BAG_TYPE_SUBCLASS = 347, + ERR_CANT_WRAP_STACKABLE = 348, + ERR_CANT_WRAP_EQUIPPED = 349, + ERR_CANT_WRAP_WRAPPED = 350, + ERR_CANT_WRAP_BOUND = 351, + ERR_CANT_WRAP_UNIQUE = 352, + ERR_CANT_WRAP_BAGS = 353, + ERR_OUT_OF_MANA = 354, + ERR_OUT_OF_RAGE = 355, + ERR_OUT_OF_FOCUS = 356, + ERR_OUT_OF_ENERGY = 357, + ERR_OUT_OF_CHI = 358, + ERR_OUT_OF_HEALTH = 359, + ERR_OUT_OF_RUNES = 360, + ERR_OUT_OF_RUNIC_POWER = 361, + ERR_OUT_OF_SOUL_SHARDS = 362, + ERR_OUT_OF_LUNAR_POWER = 363, + ERR_OUT_OF_HOLY_POWER = 364, + ERR_OUT_OF_MAELSTROM = 365, + ERR_OUT_OF_COMBO_POINTS = 366, + ERR_OUT_OF_INSANITY = 367, + ERR_OUT_OF_ESSENCE = 368, + ERR_OUT_OF_ARCANE_CHARGES = 369, + ERR_OUT_OF_FURY = 370, + ERR_OUT_OF_PAIN = 371, + ERR_OUT_OF_POWER_DISPLAY = 372, + ERR_OUT_OF_RUNE_BLOOD = 373, + ERR_OUT_OF_RUNE_FROST = 374, + ERR_OUT_OF_RUNE_UNHOLY = 375, + ERR_OUT_OF_ALTERNATE_QUEST = 376, + ERR_OUT_OF_ALTERNATE_ENCOUNTER = 377, + ERR_OUT_OF_ALTERNATE_MOUNT = 378, + ERR_OUT_OF_BALANCE = 379, + ERR_OUT_OF_HAPPINESS = 380, + ERR_OUT_OF_SHADOW_ORBS = 381, + ERR_OUT_OF_RUNE_CHROMATIC = 382, + ERR_LOOT_GONE = 383, + ERR_MOUNT_FORCEDDISMOUNT = 384, + ERR_AUTOFOLLOW_TOO_FAR = 385, + ERR_UNIT_NOT_FOUND = 386, + ERR_INVALID_FOLLOW_TARGET = 387, + ERR_INVALID_FOLLOW_PVP_COMBAT = 388, + ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT = 389, + ERR_INVALID_INSPECT_TARGET = 390, + ERR_GUILDEMBLEM_SUCCESS = 391, + ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 392, + ERR_GUILDEMBLEM_NOGUILD = 393, + ERR_GUILDEMBLEM_NOTGUILDMASTER = 394, + ERR_GUILDEMBLEM_NOTENOUGHMONEY = 395, + ERR_GUILDEMBLEM_INVALIDVENDOR = 396, + ERR_EMBLEMERROR_NOTABARDGEOSET = 397, + ERR_SPELL_OUT_OF_RANGE = 398, + ERR_COMMAND_NEEDS_TARGET = 399, + ERR_NOAMMO_S = 400, + ERR_TOOBUSYTOFOLLOW = 401, + ERR_DUEL_REQUESTED = 402, + ERR_DUEL_CANCELLED = 403, + ERR_DEATHBINDALREADYBOUND = 404, + ERR_DEATHBIND_SUCCESS_S = 405, + ERR_NOEMOTEWHILERUNNING = 406, + ERR_ZONE_EXPLORED = 407, + ERR_ZONE_EXPLORED_XP = 408, + ERR_INVALID_ITEM_TARGET = 409, + ERR_INVALID_QUEST_TARGET = 410, + ERR_IGNORING_YOU_S = 411, + ERR_FISH_NOT_HOOKED = 412, + ERR_FISH_ESCAPED = 413, + ERR_SPELL_FAILED_NOTUNSHEATHED = 414, + ERR_PETITION_OFFERED_S = 415, + ERR_PETITION_SIGNED = 416, + ERR_PETITION_SIGNED_S = 417, + ERR_PETITION_DECLINED_S = 418, + ERR_PETITION_ALREADY_SIGNED = 419, + ERR_PETITION_RESTRICTED_ACCOUNT_TRIAL = 420, + ERR_PETITION_ALREADY_SIGNED_OTHER = 421, + ERR_PETITION_IN_GUILD = 422, + ERR_PETITION_CREATOR = 423, + ERR_PETITION_NOT_ENOUGH_SIGNATURES = 424, + ERR_PETITION_NOT_SAME_SERVER = 425, + ERR_PETITION_FULL = 426, + ERR_PETITION_ALREADY_SIGNED_BY_S = 427, + ERR_GUILD_NAME_INVALID = 428, + ERR_SPELL_UNLEARNED_S = 429, + ERR_PET_SPELL_ROOTED = 430, + ERR_PET_SPELL_AFFECTING_COMBAT = 431, + ERR_PET_SPELL_OUT_OF_RANGE = 432, + ERR_PET_SPELL_NOT_BEHIND = 433, + ERR_PET_SPELL_TARGETS_DEAD = 434, + ERR_PET_SPELL_DEAD = 435, + ERR_PET_SPELL_NOPATH = 436, + ERR_ITEM_CANT_BE_DESTROYED = 437, + ERR_TICKET_ALREADY_EXISTS = 438, + ERR_TICKET_CREATE_ERROR = 439, + ERR_TICKET_UPDATE_ERROR = 440, + ERR_TICKET_DB_ERROR = 441, + ERR_TICKET_NO_TEXT = 442, + ERR_TICKET_TEXT_TOO_LONG = 443, + ERR_OBJECT_IS_BUSY = 444, + ERR_EXHAUSTION_WELLRESTED = 445, + ERR_EXHAUSTION_RESTED = 446, + ERR_EXHAUSTION_NORMAL = 447, + ERR_EXHAUSTION_TIRED = 448, + ERR_EXHAUSTION_EXHAUSTED = 449, + ERR_NO_ITEMS_WHILE_SHAPESHIFTED = 450, + ERR_CANT_INTERACT_SHAPESHIFTED = 451, + ERR_REALM_NOT_FOUND = 452, + ERR_MAIL_QUEST_ITEM = 453, + ERR_MAIL_BOUND_ITEM = 454, + ERR_MAIL_CONJURED_ITEM = 455, + ERR_MAIL_BAG = 456, + ERR_MAIL_TO_SELF = 457, + ERR_MAIL_TARGET_NOT_FOUND = 458, + ERR_MAIL_DATABASE_ERROR = 459, + ERR_MAIL_DELETE_ITEM_ERROR = 460, + ERR_MAIL_WRAPPED_COD = 461, + ERR_MAIL_CANT_SEND_REALM = 462, + ERR_MAIL_TEMP_RETURN_OUTAGE = 463, + ERR_MAIL_RECEPIENT_CANT_RECEIVE_MAIL = 464, + ERR_MAIL_SENT = 465, + ERR_MAIL_TARGET_IS_TRIAL = 466, + ERR_NOT_HAPPY_ENOUGH = 467, + ERR_USE_CANT_IMMUNE = 468, + ERR_CANT_BE_DISENCHANTED = 469, + ERR_CANT_USE_DISARMED = 470, + ERR_AUCTION_DATABASE_ERROR = 471, + ERR_AUCTION_HIGHER_BID = 472, + ERR_AUCTION_ALREADY_BID = 473, + ERR_AUCTION_OUTBID_S = 474, + ERR_AUCTION_WON_S = 475, + ERR_AUCTION_REMOVED_S = 476, + ERR_AUCTION_BID_PLACED = 477, + ERR_LOGOUT_FAILED = 478, + ERR_QUEST_PUSH_SUCCESS_S = 479, + ERR_QUEST_PUSH_INVALID_S = 480, + ERR_QUEST_PUSH_INVALID_TO_RECIPIENT_S = 481, + ERR_QUEST_PUSH_ACCEPTED_S = 482, + ERR_QUEST_PUSH_DECLINED_S = 483, + ERR_QUEST_PUSH_BUSY_S = 484, + ERR_QUEST_PUSH_DEAD_S = 485, + ERR_QUEST_PUSH_DEAD_TO_RECIPIENT_S = 486, + ERR_QUEST_PUSH_LOG_FULL_S = 487, + ERR_QUEST_PUSH_LOG_FULL_TO_RECIPIENT_S = 488, + ERR_QUEST_PUSH_ONQUEST_S = 489, + ERR_QUEST_PUSH_ONQUEST_TO_RECIPIENT_S = 490, + ERR_QUEST_PUSH_ALREADY_DONE_S = 491, + ERR_QUEST_PUSH_ALREADY_DONE_TO_RECIPIENT_S = 492, + ERR_QUEST_PUSH_NOT_DAILY_S = 493, + ERR_QUEST_PUSH_TIMER_EXPIRED_S = 494, + ERR_QUEST_PUSH_NOT_IN_PARTY_S = 495, + ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_S = 496, + ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_TO_RECIPIENT_S = 497, + ERR_QUEST_PUSH_NOT_ALLOWED_S = 498, + ERR_QUEST_PUSH_PREREQUISITE_S = 499, + ERR_QUEST_PUSH_PREREQUISITE_TO_RECIPIENT_S = 500, + ERR_QUEST_PUSH_LOW_LEVEL_S = 501, + ERR_QUEST_PUSH_LOW_LEVEL_TO_RECIPIENT_S = 502, + ERR_QUEST_PUSH_HIGH_LEVEL_S = 503, + ERR_QUEST_PUSH_HIGH_LEVEL_TO_RECIPIENT_S = 504, + ERR_QUEST_PUSH_CLASS_S = 505, + ERR_QUEST_PUSH_CLASS_TO_RECIPIENT_S = 506, + ERR_QUEST_PUSH_RACE_S = 507, + ERR_QUEST_PUSH_RACE_TO_RECIPIENT_S = 508, + ERR_QUEST_PUSH_LOW_FACTION_S = 509, + ERR_QUEST_PUSH_LOW_FACTION_TO_RECIPIENT_S = 510, + ERR_QUEST_PUSH_HIGH_FACTION_S = 511, + ERR_QUEST_PUSH_HIGH_FACTION_TO_RECIPIENT_S = 512, + ERR_QUEST_PUSH_EXPANSION_S = 513, + ERR_QUEST_PUSH_EXPANSION_TO_RECIPIENT_S = 514, + ERR_QUEST_PUSH_NOT_GARRISON_OWNER_S = 515, + ERR_QUEST_PUSH_NOT_GARRISON_OWNER_TO_RECIPIENT_S = 516, + ERR_QUEST_PUSH_WRONG_COVENANT_S = 517, + ERR_QUEST_PUSH_WRONG_COVENANT_TO_RECIPIENT_S = 518, + ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_S = 519, + ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_TO_RECIPIENT_S = 520, + ERR_QUEST_PUSH_WRONG_FACTION_S = 521, + ERR_QUEST_PUSH_WRONG_FACTION_TO_RECIPIENT_S = 522, + ERR_QUEST_PUSH_CROSS_FACTION_RESTRICTED_S = 523, + ERR_RAID_GROUP_LOWLEVEL = 524, + ERR_RAID_GROUP_ONLY = 525, + ERR_RAID_GROUP_FULL = 526, + ERR_RAID_GROUP_REQUIREMENTS_UNMATCH = 527, + ERR_CORPSE_IS_NOT_IN_INSTANCE = 528, + ERR_PVP_KILL_HONORABLE = 529, + ERR_PVP_KILL_DISHONORABLE = 530, + ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 531, + ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA = 532, + ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S = 533, + ERR_AUTOLOOT_MONEY_S = 534, + ERR_GENERIC_STUNNED = 535, + ERR_GENERIC_THROTTLE = 536, + ERR_CLUB_FINDER_SEARCHING_TOO_FAST = 537, + ERR_TARGET_STUNNED = 538, + ERR_MUST_REPAIR_DURABILITY = 539, + ERR_RAID_YOU_JOINED = 540, + ERR_RAID_YOU_LEFT = 541, + ERR_INSTANCE_GROUP_JOINED_WITH_PARTY = 542, + ERR_INSTANCE_GROUP_JOINED_WITH_RAID = 543, + ERR_RAID_MEMBER_ADDED_S = 544, + ERR_RAID_MEMBER_REMOVED_S = 545, + ERR_INSTANCE_GROUP_ADDED_S = 546, + ERR_INSTANCE_GROUP_REMOVED_S = 547, + ERR_CLICK_ON_ITEM_TO_FEED = 548, + ERR_TOO_MANY_CHAT_CHANNELS = 549, + ERR_LOOT_ROLL_PENDING = 550, + ERR_LOOT_PLAYER_NOT_FOUND = 551, + ERR_NOT_IN_RAID = 552, + ERR_LOGGING_OUT = 553, + ERR_TARGET_LOGGING_OUT = 554, + ERR_NOT_WHILE_MOUNTED = 555, + ERR_NOT_WHILE_SHAPESHIFTED = 556, + ERR_NOT_IN_COMBAT = 557, + ERR_NOT_WHILE_DISARMED = 558, + ERR_PET_BROKEN = 559, + ERR_TALENT_WIPE_ERROR = 560, + ERR_SPEC_WIPE_ERROR = 561, + ERR_GLYPH_WIPE_ERROR = 562, + ERR_PET_SPEC_WIPE_ERROR = 563, + ERR_FEIGN_DEATH_RESISTED = 564, + ERR_MEETING_STONE_IN_QUEUE_S = 565, + ERR_MEETING_STONE_LEFT_QUEUE_S = 566, + ERR_MEETING_STONE_OTHER_MEMBER_LEFT = 567, + ERR_MEETING_STONE_PARTY_KICKED_FROM_QUEUE = 568, + ERR_MEETING_STONE_MEMBER_STILL_IN_QUEUE = 569, + ERR_MEETING_STONE_SUCCESS = 570, + ERR_MEETING_STONE_IN_PROGRESS = 571, + ERR_MEETING_STONE_MEMBER_ADDED_S = 572, + ERR_MEETING_STONE_GROUP_FULL = 573, + ERR_MEETING_STONE_NOT_LEADER = 574, + ERR_MEETING_STONE_INVALID_LEVEL = 575, + ERR_MEETING_STONE_TARGET_NOT_IN_PARTY = 576, + ERR_MEETING_STONE_TARGET_INVALID_LEVEL = 577, + ERR_MEETING_STONE_MUST_BE_LEADER = 578, + ERR_MEETING_STONE_NO_RAID_GROUP = 579, + ERR_MEETING_STONE_NEED_PARTY = 580, + ERR_MEETING_STONE_NOT_FOUND = 581, + ERR_MEETING_STONE_TARGET_IN_VEHICLE = 582, + ERR_GUILDEMBLEM_SAME = 583, + ERR_EQUIP_TRADE_ITEM = 584, + ERR_PVP_TOGGLE_ON = 585, + ERR_PVP_TOGGLE_OFF = 586, + ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS = 587, + ERR_GROUP_JOIN_BATTLEGROUND_DEAD = 588, + ERR_GROUP_JOIN_BATTLEGROUND_S = 589, + ERR_GROUP_JOIN_BATTLEGROUND_FAIL = 590, + ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY = 591, + ERR_SOLO_JOIN_BATTLEGROUND_S = 592, + ERR_JOIN_SINGLE_SCENARIO_S = 593, + ERR_BATTLEGROUND_TOO_MANY_QUEUES = 594, + ERR_BATTLEGROUND_CANNOT_QUEUE_FOR_RATED = 595, + ERR_BATTLEDGROUND_QUEUED_FOR_RATED = 596, + ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 597, + ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 598, + ERR_ALREADY_IN_ARENA_TEAM_S = 599, + ERR_INVALID_PROMOTION_CODE = 600, + ERR_BG_PLAYER_JOINED_SS = 601, + ERR_BG_PLAYER_LEFT_S = 602, + ERR_RESTRICTED_ACCOUNT = 603, + ERR_RESTRICTED_ACCOUNT_TRIAL = 604, + ERR_NOT_ENOUGH_PURCHASED_GAME_TIME = 605, + ERR_PLAY_TIME_EXCEEDED = 606, + ERR_APPROACHING_PARTIAL_PLAY_TIME = 607, + ERR_APPROACHING_PARTIAL_PLAY_TIME_2 = 608, + ERR_APPROACHING_NO_PLAY_TIME = 609, + ERR_APPROACHING_NO_PLAY_TIME_2 = 610, + ERR_UNHEALTHY_TIME = 611, + ERR_CHAT_RESTRICTED_TRIAL = 612, + ERR_CHAT_THROTTLED = 613, + ERR_MAIL_REACHED_CAP = 614, + ERR_INVALID_RAID_TARGET = 615, + ERR_RAID_LEADER_READY_CHECK_START_S = 616, + ERR_READY_CHECK_IN_PROGRESS = 617, + ERR_READY_CHECK_THROTTLED = 618, + ERR_VOTE_TO_ABANDON_NOT_YET = 619, + ERR_DUNGEON_DIFFICULTY_FAILED = 620, + ERR_DUNGEON_DIFFICULTY_CHANGED_S = 621, + ERR_TRADE_WRONG_REALM = 622, + ERR_TRADE_NOT_ON_TAPLIST = 623, + ERR_CHAT_PLAYER_AMBIGUOUS_S = 624, + ERR_LOOT_CANT_LOOT_THAT_NOW = 625, + ERR_LOOT_MASTER_INV_FULL = 626, + ERR_LOOT_MASTER_UNIQUE_ITEM = 627, + ERR_LOOT_MASTER_OTHER = 628, + ERR_FILTERING_YOU_S = 629, + ERR_USE_PREVENTED_BY_MECHANIC_S = 630, + ERR_ITEM_UNIQUE_EQUIPPABLE = 631, + ERR_LFG_LEADER_IS_LFM_S = 632, + ERR_LFG_PENDING = 633, + ERR_CANT_SPEAK_LANGAGE = 634, + ERR_VENDOR_MISSING_TURNINS = 635, + ERR_BATTLEGROUND_NOT_IN_TEAM = 636, + ERR_NOT_IN_BATTLEGROUND = 637, + ERR_NOT_ENOUGH_HONOR_POINTS = 638, + ERR_NOT_ENOUGH_ARENA_POINTS = 639, + ERR_SOCKETING_REQUIRES_META_GEM = 640, + ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT = 641, + ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM = 642, + ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT = 643, + ERR_SOCKETING_REQUIRES_COGWHEEL_GEM = 644, + ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT = 645, + ERR_SOCKETING_ITEM_TOO_LOW_LEVEL = 646, + ERR_ITEM_MAX_COUNT_SOCKETED = 647, + ERR_SYSTEM_DISABLED = 648, + ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I = 649, + ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 650, + ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 651, + ERR_USER_SQUELCHED = 652, + ERR_ACCOUNT_SILENCED = 653, + ERR_PARTY_MEMBER_SILENCED = 654, + ERR_PARTY_MEMBER_SILENCED_LFG_DELIST = 655, + ERR_TOO_MUCH_GOLD = 656, + ERR_NOT_BARBER_SITTING = 657, + ERR_QUEST_FAILED_CAIS = 658, + ERR_INVITE_RESTRICTED_TRIAL = 659, + ERR_VOICE_IGNORE_FULL = 660, + ERR_VOICE_IGNORE_SELF = 661, + ERR_VOICE_IGNORE_NOT_FOUND = 662, + ERR_VOICE_IGNORE_ALREADY_S = 663, + ERR_VOICE_IGNORE_ADDED_S = 664, + ERR_VOICE_IGNORE_REMOVED_S = 665, + ERR_VOICE_IGNORE_AMBIGUOUS = 666, + ERR_VOICE_IGNORE_DELETED = 667, + ERR_UNKNOWN_MACRO_OPTION_S = 668, + ERR_NOT_DURING_ARENA_MATCH = 669, + ERR_NOT_IN_RATED_BATTLEGROUND = 670, + ERR_PLAYER_SILENCED = 671, + ERR_PLAYER_UNSILENCED = 672, + ERR_COMSAT_DISCONNECT = 673, + ERR_COMSAT_RECONNECT_ATTEMPT = 674, + ERR_COMSAT_CONNECT_FAIL = 675, + ERR_MAIL_INVALID_ATTACHMENT_SLOT = 676, + ERR_MAIL_TOO_MANY_ATTACHMENTS = 677, + ERR_MAIL_INVALID_ATTACHMENT = 678, + ERR_MAIL_ATTACHMENT_EXPIRED = 679, + ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC = 680, + ERR_PROFANE_CHAT_NAME = 681, + ERR_PLAYER_SILENCED_ECHO = 682, + ERR_PLAYER_UNSILENCED_ECHO = 683, + ERR_LOOT_CANT_LOOT_THAT = 684, + ERR_ARENA_EXPIRED_CAIS = 685, + ERR_GROUP_ACTION_THROTTLED = 686, + ERR_ALREADY_PICKPOCKETED = 687, + ERR_NAME_INVALID = 688, + ERR_NAME_NO_NAME = 689, + ERR_NAME_TOO_SHORT = 690, + ERR_NAME_TOO_LONG = 691, + ERR_NAME_MIXED_LANGUAGES = 692, + ERR_NAME_PROFANE = 693, + ERR_NAME_RESERVED = 694, + ERR_NAME_THREE_CONSECUTIVE = 695, + ERR_NAME_INVALID_SPACE = 696, + ERR_NAME_CONSECUTIVE_SPACES = 697, + ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 698, + ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 699, + ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 700, + ERR_RECRUIT_A_FRIEND_NOT_LINKED = 701, + ERR_RECRUIT_A_FRIEND_NOT_NOW = 702, + ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX = 703, + ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN = 704, + ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE = 705, + ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL = 706, + ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 707, + ERR_NOT_SAME_ACCOUNT = 708, + ERR_BAD_ON_USE_ENCHANT = 709, + ERR_TRADE_SELF = 710, + ERR_TOO_MANY_SOCKETS = 711, + ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 712, + ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 713, + ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 714, + ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 715, + ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 716, + ERR_ITEM_INVENTORY_FULL_SATCHEL = 717, + ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 718, + ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 719, + ERR_PURCHASE_LEVEL_TOO_LOW = 720, + ERR_GROUP_SWAP_FAILED = 721, + ERR_INVITE_IN_COMBAT = 722, + ERR_INVALID_GLYPH_SLOT = 723, + ERR_GENERIC_NO_VALID_TARGETS = 724, + ERR_CALENDAR_EVENT_ALERT_S = 725, + ERR_PET_LEARN_SPELL_S = 726, + ERR_PET_LEARN_ABILITY_S = 727, + ERR_PET_SPELL_UNLEARNED_S = 728, + ERR_INVITE_UNKNOWN_REALM = 729, + ERR_INVITE_NO_PARTY_SERVER = 730, + ERR_INVITE_PARTY_BUSY = 731, + ERR_INVITE_PARTY_BUSY_PENDING_REQUEST = 732, + ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST = 733, + ERR_PARTY_TARGET_AMBIGUOUS = 734, + ERR_PARTY_LFG_INVITE_RAID_LOCKED = 735, + ERR_PARTY_LFG_BOOT_LIMIT = 736, + ERR_PARTY_LFG_BOOT_COOLDOWN_S = 737, + ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 738, + ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S = 739, + ERR_PARTY_LFG_BOOT_IN_PROGRESS = 740, + ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 741, + ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED = 742, + ERR_PARTY_LFG_BOOT_VOTE_FAILED = 743, + ERR_PARTY_LFG_BOOT_DISALLOWED_BY_MAP = 744, + ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 745, + ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 746, + ERR_PARTY_LFG_BOOT_VOTE_REGISTERED = 747, + ERR_PARTY_PRIVATE_GROUP_ONLY = 748, + ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 749, + ERR_PARTY_TIME_RUNNING_SEASON_ID_MUST_MATCH = 750, + ERR_RAID_DISALLOWED_BY_LEVEL = 751, + ERR_RAID_DISALLOWED_BY_CROSS_REALM = 752, + ERR_PARTY_ROLE_NOT_AVAILABLE = 753, + ERR_JOIN_LFG_OBJECT_FAILED = 754, + ERR_LFG_REMOVED_LEVELUP = 755, + ERR_LFG_REMOVED_XP_TOGGLE = 756, + ERR_LFG_REMOVED_FACTION_CHANGE = 757, + ERR_BATTLEGROUND_INFO_THROTTLED = 758, + ERR_BATTLEGROUND_ALREADY_IN = 759, + ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED = 760, + ERR_ARENA_TEAM_PERMISSIONS = 761, + ERR_NOT_WHILE_FALLING = 762, + ERR_NOT_WHILE_MOVING = 763, + ERR_NOT_WHILE_FATIGUED = 764, + ERR_MAX_SOCKETS = 765, + ERR_MULTI_CAST_ACTION_TOTEM_S = 766, + ERR_BATTLEGROUND_JOIN_LEVELUP = 767, + ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN = 768, + ERR_BATTLEGROUND_JOIN_XP_GAIN = 769, + ERR_BATTLEGROUND_JOIN_MERCENARY = 770, + ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS = 771, + ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS = 772, + ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS = 773, + ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE = 774, + ERR_RAID_DIFFICULTY_FAILED = 775, + ERR_RAID_DIFFICULTY_CHANGED_S = 776, + ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S = 777, + ERR_RAID_LOCKOUT_CHANGED_S = 778, + ERR_RAID_CONVERTED_TO_PARTY = 779, + ERR_PARTY_CONVERTED_TO_RAID = 780, + ERR_PLAYER_DIFFICULTY_CHANGED_S = 781, + ERR_GMRESPONSE_DB_ERROR = 782, + ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 783, + ERR_ARENA_JOIN_RANGE_INDEX = 784, + ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 785, + ERR_BATTLEGROUND_JOIN_FAILED = 786, + ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 787, + ERR_BATTLEGROUND_JOIN_RESPEC = 788, + ERR_BATTLEGROUND_INVITATION_DECLINED = 789, + ERR_BATTLEGROUND_INVITATION_DECLINED_BY = 790, + ERR_BATTLEGROUND_JOIN_TIMED_OUT = 791, + ERR_BATTLEGROUND_DUPE_QUEUE = 792, + ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 793, + ERR_IN_BATTLEGROUND_RESPEC = 794, + ERR_MAIL_LIMITED_DURATION_ITEM = 795, + ERR_YELL_RESTRICTED_TRIAL = 796, + ERR_CHAT_RAID_RESTRICTED_TRIAL = 797, + ERR_LFG_ROLE_CHECK_FAILED = 798, + ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT = 799, + ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE = 800, + ERR_LFG_READY_CHECK_FAILED = 801, + ERR_LFG_READY_CHECK_FAILED_TIMEOUT = 802, + ERR_LFG_GROUP_FULL = 803, + ERR_LFG_NO_LFG_OBJECT = 804, + ERR_LFG_NO_SLOTS_PLAYER = 805, + ERR_LFG_NO_SLOTS_PARTY = 806, + ERR_LFG_NO_SPEC = 807, + ERR_LFG_MISMATCHED_SLOTS = 808, + ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM = 809, + ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 810, + ERR_LFG_MEMBERS_NOT_PRESENT = 811, + ERR_LFG_GET_INFO_TIMEOUT = 812, + ERR_LFG_INVALID_SLOT = 813, + ERR_LFG_DESERTER_PLAYER = 814, + ERR_LFG_DESERTER_PARTY = 815, + ERR_LFG_DEAD = 816, + ERR_LFG_RANDOM_COOLDOWN_PLAYER = 817, + ERR_LFG_RANDOM_COOLDOWN_PARTY = 818, + ERR_LFG_TOO_MANY_MEMBERS = 819, + ERR_LFG_TOO_FEW_MEMBERS = 820, + ERR_LFG_PROPOSAL_FAILED = 821, + ERR_LFG_PROPOSAL_DECLINED_SELF = 822, + ERR_LFG_PROPOSAL_DECLINED_PARTY = 823, + ERR_LFG_NO_SLOTS_SELECTED = 824, + ERR_LFG_NO_ROLES_SELECTED = 825, + ERR_LFG_ROLE_CHECK_INITIATED = 826, + ERR_LFG_READY_CHECK_INITIATED = 827, + ERR_LFG_PLAYER_DECLINED_ROLE_CHECK = 828, + ERR_LFG_PLAYER_DECLINED_READY_CHECK = 829, + ERR_LFG_LOREWALKING = 830, + ERR_LFG_JOINED_QUEUE = 831, + ERR_LFG_JOINED_FLEX_QUEUE = 832, + ERR_LFG_JOINED_RF_QUEUE = 833, + ERR_LFG_JOINED_SCENARIO_QUEUE = 834, + ERR_LFG_JOINED_WORLD_PVP_QUEUE = 835, + ERR_LFG_JOINED_BATTLEFIELD_QUEUE = 836, + ERR_LFG_JOINED_LIST = 837, + ERR_QUEUED_PLUNDERSTORM = 838, + ERR_LFG_LEFT_QUEUE = 839, + ERR_LFG_LEFT_LIST = 840, + ERR_LFG_ROLE_CHECK_ABORTED = 841, + ERR_LFG_READY_CHECK_ABORTED = 842, + ERR_LFG_CANT_USE_BATTLEGROUND = 843, + ERR_LFG_CANT_USE_DUNGEONS = 844, + ERR_LFG_REASON_TOO_MANY_LFG = 845, + ERR_LFG_FARM_LIMIT = 846, + ERR_LFG_NO_CROSS_FACTION_PARTIES = 847, + ERR_INVALID_TELEPORT_LOCATION = 848, + ERR_TOO_FAR_TO_INTERACT = 849, + ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS = 850, + ERR_DIFFICULTY_CHANGE_COOLDOWN_S = 851, + ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S = 852, + ERR_DIFFICULTY_CHANGE_WORLDSTATE = 853, + ERR_DIFFICULTY_CHANGE_ENCOUNTER = 854, + ERR_DIFFICULTY_CHANGE_COMBAT = 855, + ERR_DIFFICULTY_CHANGE_PLAYER_BUSY = 856, + ERR_DIFFICULTY_CHANGE_PLAYER_ON_VEHICLE = 857, + ERR_DIFFICULTY_CHANGE_ALREADY_STARTED = 858, + ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S = 859, + ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING = 860, + ERR_ARENA_TEAM_PARTY_SIZE = 861, + ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 862, + ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 863, + ERR_SOLO_RBG_WARGAME_GROUP_SIZE = 864, + ERR_SOLO_RBG_WARGAME_GROUP_COMP = 865, + ERR_SOLO_MIN_ITEM_LEVEL = 866, + ERR_PVP_PLAYER_ABANDONED = 867, + ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER = 868, + ERR_QUEST_FORCE_REMOVED_S = 869, + ERR_ATTACK_NO_ACTIONS = 870, + ERR_IN_RANDOM_BG = 871, + ERR_IN_NON_RANDOM_BG = 872, + ERR_BN_FRIEND_SELF = 873, + ERR_BN_FRIEND_ALREADY = 874, + ERR_BN_FRIEND_BLOCKED = 875, + ERR_BN_FRIEND_LIST_FULL = 876, + ERR_BN_FRIEND_REQUEST_SENT = 877, + ERR_BN_BROADCAST_THROTTLE = 878, + ERR_BG_DEVELOPER_ONLY = 879, + ERR_CURRENCY_SPELL_SLOT_MISMATCH = 880, + ERR_CURRENCY_NOT_TRADABLE = 881, + ERR_REQUIRES_EXPANSION_S = 882, + ERR_QUEST_FAILED_SPELL = 883, + ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 884, + ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 885, + ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 886, + ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 887, + ERR_TALENT_FAILED_UNKNOWN = 888, + ERR_TALENT_FAILED_IN_COMBAT = 889, + ERR_TALENT_FAILED_IN_PVP_MATCH = 890, + ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 891, + ERR_WARGAME_REQUEST_FAILURE = 892, + ERR_RANK_REQUIRES_AUTHENTICATOR = 893, + ERR_GUILD_BANK_VOUCHER_FAILED = 894, + ERR_WARGAME_REQUEST_SENT = 895, + ERR_REQUIRES_ACHIEVEMENT_I = 896, + ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 897, + ERR_CANT_BUY_QUANTITY = 898, + ERR_ITEM_IS_BATTLE_PAY_LOCKED = 899, + ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 900, + ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 901, + ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 902, + ERR_INSUFF_TRACKED_CURRENCY_IS = 903, + ERR_NOT_ON_TOURNAMENT_REALM = 904, + ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 905, + ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 906, + ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 907, + ERR_CANT_DO_THAT_IN_A_GROUP = 908, + ERR_GUILD_LEADER_REPLACED = 909, + ERR_TRANSMOGRIFY_CANT_EQUIP = 910, + ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 911, + ERR_TRANSMOGRIFY_NOT_SOULBOUND = 912, + ERR_TRANSMOGRIFY_INVALID_SOURCE = 913, + ERR_TRANSMOGRIFY_INVALID_DESTINATION = 914, + ERR_TRANSMOGRIFY_MISMATCH = 915, + ERR_TRANSMOGRIFY_LEGENDARY = 916, + ERR_TRANSMOGRIFY_SAME_ITEM = 917, + ERR_TRANSMOGRIFY_SAME_APPEARANCE = 918, + ERR_TRANSMOGRIFY_NOT_EQUIPPED = 919, + ERR_VOID_DEPOSIT_FULL = 920, + ERR_VOID_WITHDRAW_FULL = 921, + ERR_VOID_STORAGE_WRAPPED = 922, + ERR_VOID_STORAGE_STACKABLE = 923, + ERR_VOID_STORAGE_UNBOUND = 924, + ERR_VOID_STORAGE_REPAIR = 925, + ERR_VOID_STORAGE_CHARGES = 926, + ERR_VOID_STORAGE_QUEST = 927, + ERR_VOID_STORAGE_CONJURED = 928, + ERR_VOID_STORAGE_MAIL = 929, + ERR_VOID_STORAGE_BAG = 930, + ERR_VOID_TRANSFER_STORAGE_FULL = 931, + ERR_VOID_TRANSFER_INV_FULL = 932, + ERR_VOID_TRANSFER_INTERNAL_ERROR = 933, + ERR_VOID_TRANSFER_ITEM_INVALID = 934, + ERR_DIFFICULTY_DISABLED_IN_LFG = 935, + ERR_VOID_STORAGE_UNIQUE = 936, + ERR_VOID_STORAGE_LOOT = 937, + ERR_VOID_STORAGE_HOLIDAY = 938, + ERR_VOID_STORAGE_DURATION = 939, + ERR_VOID_STORAGE_LOAD_FAILED = 940, + ERR_VOID_STORAGE_INVALID_ITEM = 941, + ERR_VOID_STORAGE_ACCOUNT_ITEM = 942, + ERR_PARENTAL_CONTROLS_CHAT_MUTED = 943, + ERR_SOR_START_EXPERIENCE_INCOMPLETE = 944, + ERR_SOR_INVALID_EMAIL = 945, + ERR_SOR_INVALID_COMMENT = 946, + ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 947, + ERR_CHALLENGE_MODE_RESET_KEYSTONE = 948, + ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 949, + ERR_REPORT_SUBMITTED_SUCCESSFULLY = 950, + ERR_REPORT_SUBMISSION_FAILED = 951, + ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 952, + ERR_BUG_SUBMITTED_SUCCESSFULLY = 953, + ERR_CHALLENGE_MODE_ENABLED = 954, + ERR_CHALLENGE_MODE_DISABLED = 955, + ERR_PETBATTLE_CREATE_FAILED = 956, + ERR_PETBATTLE_NOT_HERE = 957, + ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 958, + ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 959, + ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 960, + ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 961, + ERR_PETBATTLE_NOT_WHILE_DEAD = 962, + ERR_PETBATTLE_NOT_WHILE_FLYING = 963, + ERR_PETBATTLE_TARGET_INVALID = 964, + ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 965, + ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 966, + ERR_PETBATTLE_NOT_A_TRAINER = 967, + ERR_PETBATTLE_DECLINED = 968, + ERR_PETBATTLE_IN_BATTLE = 969, + ERR_PETBATTLE_INVALID_LOADOUT = 970, + ERR_PETBATTLE_ALL_PETS_DEAD = 971, + ERR_PETBATTLE_NO_PETS_IN_SLOTS = 972, + ERR_PETBATTLE_NO_ACCOUNT_LOCK = 973, + ERR_PETBATTLE_WILD_PET_TAPPED = 974, + ERR_PETBATTLE_RESTRICTED_ACCOUNT = 975, + ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 976, + ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 977, + ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 978, + ERR_CANT_HAVE_MORE_PETS = 979, + ERR_PVP_MAP_NOT_FOUND = 980, + ERR_PVP_MAP_NOT_SET = 981, + ERR_PETBATTLE_QUEUE_QUEUED = 982, + ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 983, + ERR_PETBATTLE_QUEUE_JOIN_FAILED = 984, + ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 985, + ERR_PETBATTLE_QUEUE_REMOVED = 986, + ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 987, + ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 988, + ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 989, + ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 990, + ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 991, + ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 992, + ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 993, + ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 994, + ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 995, + ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 996, + ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 997, + ERR_PETBATTLE_QUEUE_SLOT_DEAD = 998, + ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 999, + ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 1000, + ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 1001, + ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 1002, + ERR_HAS_RESTRICTION = 1003, + ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 1004, + ERR_ITEM_UPGRADE_NO_PATH = 1005, + ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 1006, + ERR_BONUS_ROLL_EMPTY = 1007, + ERR_CHALLENGE_MODE_FULL = 1008, + ERR_CHALLENGE_MODE_IN_PROGRESS = 1009, + ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 1010, + ERR_START_RESTRICTED_CHALLENGE_MODE = 1011, + ERR_BATTLETAG_FRIEND_NOT_FOUND = 1012, + ERR_BATTLETAG_FRIEND_NOT_VALID = 1013, + ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 1014, + ERR_BATTLETAG_FRIEND_THROTTLED = 1015, + ERR_BATTLETAG_FRIEND_SUCCESS = 1016, + ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 1017, + ERR_PETBATTLE_INTERNAL = 1018, + ERR_CANT_CAGE_PET_YET = 1019, + ERR_NO_LOOT_IN_CHALLENGE_MODE = 1020, + ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 1021, + ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 1022, + ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 1023, + ERR_RECRUIT_A_FRIEND_FAILED = 1024, + ERR_SET_LOOT_PERSONAL = 1025, + ERR_SET_LOOT_METHOD_FAILED_COMBAT = 1026, + ERR_REAGENT_BANK_FULL = 1027, + ERR_REAGENT_BANK_LOCKED = 1028, + ERR_GARRISON_BUILDING_EXISTS = 1029, + ERR_GARRISON_INVALID_PLOT = 1030, + ERR_GARRISON_INVALID_BUILDINGID = 1031, + ERR_GARRISON_INVALID_PLOT_BUILDING = 1032, + ERR_GARRISON_REQUIRES_BLUEPRINT = 1033, + ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1034, + ERR_GARRISON_NOT_ENOUGH_GOLD = 1035, + ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1036, + ERR_ALREADY_USING_LFG_LIST = 1037, + ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1038, + ERR_TOY_USE_LIMIT_REACHED = 1039, + ERR_TOY_ALREADY_KNOWN = 1040, + ERR_TRANSMOG_SET_ALREADY_KNOWN = 1041, + ERR_NOT_ENOUGH_CURRENCY = 1042, + ERR_SPEC_IS_DISABLED = 1043, + ERR_FEATURE_RESTRICTED_TRIAL = 1044, + ERR_CANT_BE_OBLITERATED = 1045, + ERR_CANT_BE_SCRAPPED = 1046, + ERR_CANT_BE_RECRAFTED = 1047, + ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1048, + ERR_MUST_EQUIP_ARTIFACT = 1049, + ERR_CANT_DO_THAT_RIGHT_NOW = 1050, + ERR_AFFECTING_COMBAT = 1051, + ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1052, + ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1053, + ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1054, + ERR_MOVIE_RECORDING_WARNING_PERF = 1055, + ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1056, + ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1057, + ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1058, + ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1059, + ERR_NO_CHALLENGE_MODE_REWARD = 1060, + ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1061, + ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1062, + ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1063, + ERR_TALENT_FAILED_REST_AREA = 1064, + ERR_CANNOT_ABANDON_LAST_PET = 1065, + ERR_TEST_CVAR_SET_SSS = 1066, + ERR_QUEST_TURN_IN_FAIL_REASON = 1067, + ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1068, + ERR_TALENT_GRANTED_BY_AURA = 1069, + ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1070, + ERR_GLYPH_TARGET_NOT_AVAILABLE = 1071, + ERR_PVP_WARMODE_TOGGLE_ON = 1072, + ERR_PVP_WARMODE_TOGGLE_OFF = 1073, + ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1074, + ERR_SPELL_FAILED_CANT_FLY_HERE = 1075, + ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1076, + ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1077, + ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1078, + ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1079, + ERR_VOICE_CHAT_SERVICE_LOST = 1080, + ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1081, + ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1082, + ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1083, + ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1084, + ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1085, + ERR_VOICE_CHAT_PLAYER_SILENCED = 1086, + ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1087, + ERR_VOICE_CHAT_DISABLED = 1088, + ERR_NO_PVP_REWARD = 1089, + ERR_CLAIMED_PVP_REWARD = 1090, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1091, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1092, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1093, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1094, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1095, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1096, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1097, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1098, + ERR_SOCKETING_GENERIC_FAILURE = 1099, + ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1100, + ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1101, + ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1102, + ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1103, + ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1104, + ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1105, + ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1106, + ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1107, + ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1108, + ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1109, + ERR_SOCKETING_REQUIRES_TINKER_GEM = 1110, + ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1111, + ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM = 1112, + ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT = 1113, + ERR_SOCKETING_REQUIRES_FRAGRANCE_GEM = 1114, + ERR_SOCKETING_FRAGRANCE_GEM_ONLY_IN_FRAGRANCESLOT = 1115, + ERR_SOCKETING_REQUIRES_SINGING_THUNDER_GEM = 1116, + ERR_SOCKETING_SINGINGTHUNDER_GEM_ONLY_IN_SINGINGTHUNDERSLOT = 1117, + ERR_SOCKETING_REQUIRES_SINGING_SEA_GEM = 1118, + ERR_SOCKETING_SINGINGSEA_GEM_ONLY_IN_SINGINGSEASLOT = 1119, + ERR_SOCKETING_REQUIRES_SINGING_WIND_GEM = 1120, + ERR_SOCKETING_SINGINGWIND_GEM_ONLY_IN_SINGINGWINDSLOT = 1121, + ERR_SOCKETING_REQUIRES_FIBER_GEM = 1122, + ERR_SOCKETING_FIBER_GEM_ONLY_IN_FIBERSLOT = 1123, + ERR_LEVEL_LINKING_RESULT_LINKED = 1124, + ERR_LEVEL_LINKING_RESULT_UNLINKED = 1125, + ERR_CLUB_FINDER_ERROR_POST_CLUB = 1126, + ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1127, + ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1128, + ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1129, + ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1130, + ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1131, + ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1132, + ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1133, + ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1134, + ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1135, + ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1136, + ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1137, + ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1138, + ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1139, + ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1140, + ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1141, + ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1142, + ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT = 1143, + ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1144, + ERR_SOULBIND_INVALID_CONDUIT = 1145, + ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1146, + ERR_SOULBIND_INVALID_TALENT = 1147, + ERR_SOULBIND_DUPLICATE_CONDUIT = 1148, + ERR_ACTIVATE_SOULBIND_S = 1149, + ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1150, + ERR_CANT_USE_PROFANITY = 1151, + ERR_NOT_IN_PET_BATTLE = 1152, + ERR_NOT_IN_NPE = 1153, + ERR_NO_SPEC = 1154, + ERR_NO_DOMINATIONSHARD_OVERWRITE = 1155, + ERR_USE_WEEKLY_REWARDS_DISABLED = 1156, + ERR_CROSS_FACTION_GROUP_JOINED = 1157, + ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1158, + ERR_EQUIPABLESPELLS_SLOTS_FULL = 1159, + ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN = 1160, + ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 1161, + ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK = 1162, + ERR_NO_REFUNDABLE_ITEM_IN_ACCOUNT_BANK = 1163, + ERR_CANT_DELETE_IN_ACCOUNT_BANK = 1164, + ERR_NO_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1165, + ERR_NO_OPEN_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1166, + ERR_CANT_TRADE_ACCOUNT_ITEM = 1167, + ERR_NO_ACCOUNT_INVENTORY_LOCK = 1168, + ERR_BANK_NOT_ACCESSIBLE = 1169, + ERR_TOO_MANY_ACCOUNT_BANK_TABS = 1170, + ERR_BANK_TAB_NOT_UNLOCKED = 1171, + ERR_ACCOUNT_MONEY_LOCKED = 1172, + ERR_BANK_TAB_INVALID_NAME = 1173, + ERR_BANK_TAB_INVALID_TEXT = 1174, + ERR_CHARACTER_BANK_NOT_CONVERTED = 1175, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL = 1176, + ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT = 1177, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED = 1178, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID = 1179, + ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED = 1180, + ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED = 1181, + ERR_WOW_LABS_SET_WOW_LABS_AREA_ID_FAILED = 1182, + ERR_PLUNDERSTORM_CANNOT_QUEUE = 1183, + ERR_TARGET_IS_SELF_FOUND_CANNOT_TRADE = 1184, + ERR_PLAYER_IS_SELF_FOUND_CANNOT_TRADE = 1185, + ERR_MAIL_RECEPIENT_IS_SELF_FOUND_CANNOT_RECEIVE_MAIL = 1186, + ERR_PLAYER_IS_SELF_FOUND_CANNOT_SEND_MAIL = 1187, + ERR_PLAYER_IS_SELF_FOUND_CANNOT_USE_AUCTION_HOUSE = 1188, + ERR_MAIL_TARGET_CANNOT_RECEIVE_MAIL = 1189, + ERR_REMIX_INVALID_TRANSFER_REQUEST = 1190, + ERR_CURRENCY_TRANSFER_INVALID_CHARACTER = 1191, + ERR_CURRENCY_TRANSFER_INVALID_CURRENCY = 1192, + ERR_CURRENCY_TRANSFER_INSUFFICIENT_CURRENCY = 1193, + ERR_CURRENCY_TRANSFER_MAX_QUANTITY = 1194, + ERR_CURRENCY_TRANSFER_NO_VALID_SOURCE = 1195, + ERR_CURRENCY_TRANSFER_CHARACTER_LOGGED_IN = 1196, + ERR_CURRENCY_TRANSFER_SERVER_ERROR = 1197, + ERR_CURRENCY_TRANSFER_UNMET_REQUIREMENTS = 1198, + ERR_CURRENCY_TRANSFER_TRANSACTION_IN_PROGRESS = 1199, + ERR_CURRENCY_TRANSFER_DISABLED = 1200, }; enum class MountResult : uint32 diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 211c1bcb38b..1450dab14dd 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -79,7 +79,6 @@ #include "TransmogrificationPackets.h" #include "VehiclePackets.h" #include "VignettePackets.h" -#include "VoidStoragePackets.h" #include "WardenPackets.h" #include "WhoPackets.h" #include "WorldStatePackets.h" diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp index c063b19305e..34c98aabcf4 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.cpp +++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp @@ -17,57 +17,9 @@ #include "AreaTriggerPackets.h" #include "PacketOperators.h" -#include "Spline.h" namespace WorldPackets::AreaTrigger { -void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline) -{ - data << uint32(timeToTarget); - data << uint32(elapsedTimeForMovement); - - data << BitsSize<16>(areaTriggerSpline.getPoints()); - data.append(reinterpret_cast<float const*>(areaTriggerSpline.getPoints().data()), areaTriggerSpline.getPoints().size() * 3); -} - -ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerSplineInfo const& areaTriggerSpline) -{ - WriteAreaTriggerSpline(data, areaTriggerSpline.TimeToTarget, areaTriggerSpline.ElapsedTimeForMovement, *areaTriggerSpline.Points); - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerOrbitInfo const& areaTriggerCircularMovement) -{ - data << OptionalInit(areaTriggerCircularMovement.PathTarget); - data << OptionalInit(areaTriggerCircularMovement.Center); - data << Bits<1>(areaTriggerCircularMovement.CounterClockwise); - data << Bits<1>(areaTriggerCircularMovement.CanLoop); - - data << uint32(areaTriggerCircularMovement.TimeToTarget); - data << int32(areaTriggerCircularMovement.ElapsedTimeForMovement); - data << uint32(areaTriggerCircularMovement.StartDelay); - data << float(areaTriggerCircularMovement.Radius); - data << float(areaTriggerCircularMovement.BlendFromRadius); - data << float(areaTriggerCircularMovement.InitialAngle); - data << float(areaTriggerCircularMovement.ZOffset); - - if (areaTriggerCircularMovement.PathTarget) - data << *areaTriggerCircularMovement.PathTarget; - - if (areaTriggerCircularMovement.Center) - data << *areaTriggerCircularMovement.Center; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerMovementScriptInfo const& areaTriggerMovementScript) -{ - data << int32(areaTriggerMovementScript.SpellScriptID); - data << areaTriggerMovementScript.Center; - - return data; -} - void AreaTrigger::Read() { _worldPacket >> AreaTriggerID; @@ -84,28 +36,6 @@ WorldPacket const* AreaTriggerDenied::Write() return &_worldPacket; } -WorldPacket const* AreaTriggerRePath::Write() -{ - _worldPacket << TriggerGUID; - _worldPacket << Unused_1100; - - _worldPacket << OptionalInit(AreaTriggerSpline); - _worldPacket << OptionalInit(AreaTriggerOrbit); - _worldPacket << OptionalInit(AreaTriggerMovementScript); - _worldPacket.FlushBits(); - - if (AreaTriggerSpline) - _worldPacket << *AreaTriggerSpline; - - if (AreaTriggerMovementScript) - _worldPacket << *AreaTriggerMovementScript; - - if (AreaTriggerOrbit) - _worldPacket << *AreaTriggerOrbit; - - return &_worldPacket; -} - WorldPacket const* AreaTriggerPlaySpellVisual::Write() { _worldPacket << AreaTriggerGUID; diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h index b0742733857..ac1defafc8f 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.h +++ b/src/server/game/Server/Packets/AreaTriggerPackets.h @@ -19,34 +19,13 @@ #define TRINITYCORE_AREA_TRIGGER_PACKETS_H #include "Packet.h" -#include "AreaTriggerTemplate.h" #include "CombatLogPacketsCommon.h" #include "ObjectGuid.h" -#include "Optional.h" - -namespace Movement -{ -template<class index_type> -class Spline; -} namespace WorldPackets { namespace AreaTrigger { - struct AreaTriggerSplineInfo - { - uint32 TimeToTarget = 0; - uint32 ElapsedTimeForMovement = 0; - ::Movement::Spline<float>* Points = nullptr; - }; - - struct AreaTriggerMovementScriptInfo - { - uint32 SpellScriptID = 0; - TaggedPosition<Position::XYZ> Center; - }; - class AreaTrigger final : public ClientPacket { public: @@ -78,20 +57,6 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; - class AreaTriggerRePath final : public ServerPacket - { - public: - explicit AreaTriggerRePath() : ServerPacket(SMSG_AREA_TRIGGER_RE_PATH, 17) { } - - WorldPacket const* Write() override; - - Optional<AreaTriggerSplineInfo> AreaTriggerSpline; - Optional<AreaTriggerOrbitInfo> AreaTriggerOrbit; - Optional<AreaTriggerMovementScriptInfo> AreaTriggerMovementScript; - ObjectGuid TriggerGUID; - ObjectGuid Unused_1100; - }; - class AreaTriggerPlaySpellVisual final : public ServerPacket { public: @@ -114,9 +79,6 @@ namespace WorldPackets Spells::SpellCastVisual Visual; ObjectGuid TargetGUID; }; - - void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline); - ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerOrbitInfo const& areaTriggerCircularMovement); } } diff --git a/src/server/game/Server/Packets/BankPackets.cpp b/src/server/game/Server/Packets/BankPackets.cpp index c30fed72584..59ddb9be346 100644 --- a/src/server/game/Server/Packets/BankPackets.cpp +++ b/src/server/game/Server/Packets/BankPackets.cpp @@ -18,47 +18,60 @@ #include "BankPackets.h" #include "PacketOperators.h" -void WorldPackets::Bank::AutoBankItem::Read() +namespace WorldPackets::Bank { - _worldPacket >> Inv - >> As<int8>(BankType) - >> Bag - >> Slot; +void AutoBankItem::Read() +{ + _worldPacket >> Inv; + _worldPacket >> As<uint8>(BankType); + _worldPacket >> Bag; + _worldPacket >> Slot; } -void WorldPackets::Bank::AutoStoreBankItem::Read() +void AutoStoreBankItem::Read() { - _worldPacket >> Inv - >> Bag - >> Slot; + _worldPacket >> Inv; + _worldPacket >> Bag; + _worldPacket >> Slot; } -void WorldPackets::Bank::BuyBankSlot::Read() +void BuyBankTab::Read() { - _worldPacket >> Guid; + _worldPacket >> Banker; + _worldPacket >> As<uint8>(BankType); } -void WorldPackets::Bank::AutoBankReagent::Read() +void AutoDepositCharacterBank::Read() { - _worldPacket >> Inv; - _worldPacket >> PackSlot; - _worldPacket >> Slot; + _worldPacket >> Banker; } -void WorldPackets::Bank::AutoStoreBankReagent::Read() +void BankerActivate::Read() { - _worldPacket >> Inv; - _worldPacket >> Slot; - _worldPacket >> PackSlot; + _worldPacket >> Banker; + _worldPacket >> As<int32>(InteractionType); } -void WorldPackets::Bank::ReagentBank::Read() +ByteBuffer& operator>>(ByteBuffer& data, BankTabSettings& settings) { - _worldPacket >> Banker; + data.ResetBitPos(); + data >> SizedString::BitsSize<7>(settings.Name); + data >> SizedString::BitsSize<9>(settings.Icon); + data >> SizedString::BitsSize<14>(settings.Description); + data >> As<int32>(settings.DepositFlags); + + data >> SizedString::Data(settings.Name); + data >> SizedString::Data(settings.Icon); + data >> SizedString::Data(settings.Description); + + return data; } -void WorldPackets::Bank::BankerActivate::Read() +void UpdateBankTabSettings::Read() { _worldPacket >> Banker; - _worldPacket >> As<int32>(InteractionType); + _worldPacket >> As<uint8>(BankType); + _worldPacket >> Tab; + _worldPacket >> Settings; +} } diff --git a/src/server/game/Server/Packets/BankPackets.h b/src/server/game/Server/Packets/BankPackets.h index 047b5085c2d..04a0f694bd3 100644 --- a/src/server/game/Server/Packets/BankPackets.h +++ b/src/server/game/Server/Packets/BankPackets.h @@ -22,6 +22,7 @@ #include "ItemPacketsCommon.h" #include "ObjectGuid.h" +enum class BagSlotFlags : uint32; enum class PlayerInteractionType : int32; namespace WorldPackets @@ -53,61 +54,57 @@ namespace WorldPackets uint8 Slot = 0; }; - class BuyBankSlot final : public ClientPacket + class BuyBankTab final : public ClientPacket { public: - explicit BuyBankSlot(WorldPacket&& packet) : ClientPacket(CMSG_BUY_BANK_SLOT, std::move(packet)) { } + explicit BuyBankTab(WorldPacket&& packet) : ClientPacket(CMSG_BUY_ACCOUNT_BANK_TAB, std::move(packet)) { } void Read() override; - ObjectGuid Guid; + ObjectGuid Banker; + ::BankType BankType = ::BankType::Character; }; - class AutoBankReagent final : public ClientPacket + class AutoDepositCharacterBank final : public ClientPacket { public: - explicit AutoBankReagent(WorldPacket&& packet) : ClientPacket(CMSG_AUTOBANK_REAGENT, std::move(packet)) { } + explicit AutoDepositCharacterBank(WorldPacket&& packet) : ClientPacket(CMSG_AUTO_DEPOSIT_CHARACTER_BANK, std::move(packet)) { } void Read() override; - WorldPackets::Item::InvUpdate Inv; - uint8 Slot = 0; - uint8 PackSlot = 0; + ObjectGuid Banker; }; - class AutoStoreBankReagent final : public ClientPacket + class BankerActivate final : public ClientPacket { public: - explicit AutoStoreBankReagent(WorldPacket&& packet) : ClientPacket(CMSG_AUTOSTORE_BANK_REAGENT, std::move(packet)) { } + explicit BankerActivate(WorldPacket&& packet) : ClientPacket(CMSG_BANKER_ACTIVATE, std::move(packet)) { } void Read() override; - WorldPackets::Item::InvUpdate Inv; - uint8 Slot = 0; - uint8 PackSlot = 0; + ObjectGuid Banker; + PlayerInteractionType InteractionType = { }; }; - // CMSG_BUY_REAGENT_BANK - // CMSG_REAGENT_BANK_DEPOSIT - class ReagentBank final : public ClientPacket + struct BankTabSettings { - public: - explicit ReagentBank(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } - - void Read() override; - - ObjectGuid Banker; + std::string Name; + std::string Icon; + std::string Description; + BagSlotFlags DepositFlags = { }; }; - class BankerActivate final : public ClientPacket + class UpdateBankTabSettings final : public ClientPacket { public: - explicit BankerActivate(WorldPacket&& packet) : ClientPacket(CMSG_BANKER_ACTIVATE, std::move(packet)) { } + explicit UpdateBankTabSettings(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, std::move(packet)) { } void Read() override; ObjectGuid Banker; - PlayerInteractionType InteractionType = { }; + ::BankType BankType = ::BankType::Character; + uint8 Tab = 0; + BankTabSettings Settings; }; } } diff --git a/src/server/game/Server/Packets/DuelPackets.h b/src/server/game/Server/Packets/DuelPackets.h index efa8b970d11..f2ec5c9fff4 100644 --- a/src/server/game/Server/Packets/DuelPackets.h +++ b/src/server/game/Server/Packets/DuelPackets.h @@ -96,7 +96,7 @@ namespace WorldPackets bool ToTheDeath = false; }; - class DuelResponse : public ClientPacket + class DuelResponse final : public ClientPacket { public: explicit DuelResponse(WorldPacket&& packet) : ClientPacket(CMSG_DUEL_RESPONSE, std::move(packet)) { } diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 3841fffd092..566830dfa7c 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -605,7 +605,7 @@ namespace WorldPackets ObjectGuid Promotee; }; - class GuildOfficerRemoveMember : public ClientPacket + class GuildOfficerRemoveMember final : public ClientPacket { public: explicit GuildOfficerRemoveMember(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_OFFICER_REMOVE_MEMBER, std::move(packet)) { } diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index ddebb53d225..75d3b6d784a 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -225,6 +225,8 @@ WorldPacket const* InspectResult::Write() if (!PvpTalents.empty()) _worldPacket.append(PvpTalents.data(), PvpTalents.size()); + _worldPacket << TalentInfo; + _worldPacket << OptionalInit(GuildData); _worldPacket << OptionalInit(AzeriteLevel); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index d78ffbe78da..de9d4c61ae7 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -25,6 +25,7 @@ #include "ObjectGuid.h" #include "RaceMask.h" #include "SharedDefines.h" +#include "TalentPackets.h" #include "TraitPacketsCommon.h" class Item; @@ -145,6 +146,7 @@ namespace WorldPackets uint16 TodayHK = 0; uint16 YesterdayHK = 0; uint8 LifetimeMaxRank = 0; + Talent::ClassicTalentInfoUpdate TalentInfo; TraitInspectInfo TraitsInfo; }; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 637b1ae8755..0dcf8eacb17 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -385,13 +385,6 @@ void ChangeBagSlotFlag::Read() _worldPacket >> Bits<1>(On); } -void ChangeBankBagSlotFlag::Read() -{ - _worldPacket >> BagIndex; - _worldPacket >> As<uint32>(FlagToChange); - _worldPacket >> Bits<1>(On); -} - void SetBackpackAutosortDisabled::Read() { _worldPacket >> Bits<1>(Disable); diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index 825e452f5cd..b783d6cc5a9 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -513,14 +513,6 @@ namespace WorldPackets void Read() override { } }; - class SortReagentBankBags final : public ClientPacket - { - public: - explicit SortReagentBankBags(WorldPacket&& packet) : ClientPacket(CMSG_SORT_REAGENT_BANK_BAGS, std::move(packet)) { } - - void Read() override { } - }; - class BagCleanupFinished final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp index 08edcc0bc0c..d1dae8ae299 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -19,7 +19,6 @@ #include "Item.h" #include "Loot.h" #include "PacketOperators.h" -#include "Player.h" namespace WorldPackets::Item { @@ -79,24 +78,6 @@ void ItemInstance::Initialize(::LootItem const& lootItem) } } -void ItemInstance::Initialize(::VoidStorageItem const* voidItem) -{ - ItemID = voidItem->ItemEntry; - - if (voidItem->FixedScalingLevel) - Modifications.Values.push_back({ .Value = int32(voidItem->FixedScalingLevel), .Type = ITEM_MODIFIER_TIMEWALKER_LEVEL }); - - if (voidItem->ArtifactKnowledgeLevel) - Modifications.Values.push_back({ .Value = int32(voidItem->ArtifactKnowledgeLevel), .Type = ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL }); - - if (!voidItem->BonusListIDs.empty()) - { - ItemBonus.emplace(); - ItemBonus->Context = voidItem->Context; - ItemBonus->BonusListIDs = voidItem->BonusListIDs; - } -} - bool ItemInstance::operator==(ItemInstance const& r) const { if (ItemID != r.ItemID) diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h index 552d25623e3..e54353fcbaf 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.h +++ b/src/server/game/Server/Packets/ItemPacketsCommon.h @@ -66,7 +66,6 @@ namespace WorldPackets void Initialize(::Item const* item); void Initialize(UF::SocketedGem const* gem); void Initialize(::LootItem const& lootItem); - void Initialize(::VoidStorageItem const* voidItem); uint32 ItemID = 0; Optional<ItemBonuses> ItemBonus; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index f6351382dd5..4f2a5bd132f 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -182,6 +182,7 @@ WorldPacket const* TriggerMovie::Write() return &_worldPacket; } + WorldPacket const* TriggerCinematic::Write() { _worldPacket << uint32(CinematicID); diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index b9796743e6c..629544a68de 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -318,9 +318,9 @@ ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineTurnData const& turnData) ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineAnimTierTransition const& animTierTransition) { data << int32(animTierTransition.TierTransitionID); + data << uint8(animTierTransition.AnimTier); data << uint32(animTierTransition.StartTime); data << uint32(animTierTransition.EndTime); - data << uint8(animTierTransition.AnimTier); return data; } @@ -518,9 +518,9 @@ void CommonMovement::WriteCreateObjectSplineDataBlock(::Movement::MoveSpline con if (moveSpline.anim_tier) { data << int32(moveSpline.anim_tier->TierTransitionId); + data << uint8(moveSpline.anim_tier->AnimTier); data << uint32(moveSpline.effect_start_time); data << uint32(0); - data << uint8(moveSpline.anim_tier->AnimTier); } //if (HasUnknown901) diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index fa559dbef04..1c329d41239 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -458,6 +458,23 @@ WorldPacket const* GroupNewLeader::Write() return &_worldPacket; } +ByteBuffer& operator<<(ByteBuffer& data, LeaverInfo const& leaverInfo) +{ + data << leaverInfo.BnetAccountGUID; + data << float(leaverInfo.LeaveScore); + data << uint32(leaverInfo.SeasonID); + data << uint32(leaverInfo.TotalLeaves); + data << uint32(leaverInfo.TotalSuccesses); + data << int32(leaverInfo.ConsecutiveSuccesses); + data << leaverInfo.LastPenaltyTime; + data << leaverInfo.LeaverExpirationTime; + data << int32(leaverInfo.Unknown_1120); + data << Bits<1>(leaverInfo.LeaverStatus); + data.FlushBits(); + + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, PartyPlayerInfo const& playerInfo) { data << SizedString::BitsSize<6>(playerInfo.Name); @@ -465,6 +482,7 @@ ByteBuffer& operator<<(ByteBuffer& data, PartyPlayerInfo const& playerInfo) data << Bits<1>(playerInfo.Connected); data << Bits<1>(playerInfo.VoiceChatSilenced); data << Bits<1>(playerInfo.FromSocialQueue); + data << playerInfo.Leaver; data << playerInfo.GUID; data << uint8(playerInfo.Subgroup); data << uint8(playerInfo.Flags); @@ -477,6 +495,22 @@ ByteBuffer& operator<<(ByteBuffer& data, PartyPlayerInfo const& playerInfo) return data; } +ByteBuffer& operator<<(ByteBuffer& data, ChallengeModeData const& challengeMode) +{ + data << int32(challengeMode.Unknown_1120_1); + data << int32(challengeMode.Unknown_1120_2); + data << uint64(challengeMode.Unknown_1120_3); + data << int64(challengeMode.Unknown_1120_4); + data << challengeMode.KeystoneOwnerGUID; + data << challengeMode.LeaverGUID; + data << Bits<1>(challengeMode.IsActive); + data << Bits<1>(challengeMode.HasRestrictions); + data << Bits<1>(challengeMode.CanVoteAbandon); + data.FlushBits(); + + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, PartyLFGInfo const& lfgInfos) { data << uint32(lfgInfos.Slot); @@ -524,6 +558,7 @@ WorldPacket const* PartyUpdate::Write() _worldPacket << uint8(LeaderFactionGroup); _worldPacket << int32(PingRestriction); _worldPacket << Size<uint32>(PlayerList); + _worldPacket << OptionalInit(ChallengeMode); _worldPacket << OptionalInit(LfgInfos); _worldPacket << OptionalInit(LootSettings); _worldPacket << OptionalInit(DifficultySettings); @@ -538,6 +573,9 @@ WorldPacket const* PartyUpdate::Write() if (DifficultySettings) _worldPacket << *DifficultySettings; + if (ChallengeMode) + _worldPacket << *ChallengeMode; + if (LfgInfos) _worldPacket << *LfgInfos; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 8c287fe8b12..5b8e4c2ca1e 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -508,11 +508,26 @@ namespace WorldPackets std::string Name; }; + struct LeaverInfo + { + ObjectGuid BnetAccountGUID; + float LeaveScore = 0.0f; + uint32 SeasonID = 0; + uint32 TotalLeaves = 0; + uint32 TotalSuccesses = 0; + int32 ConsecutiveSuccesses = 0; + Timestamp<> LastPenaltyTime; + Timestamp<> LeaverExpirationTime; + int32 Unknown_1120 = 0; + bool LeaverStatus = false; + }; + struct PartyPlayerInfo { ObjectGuid GUID; std::string Name; std::string VoiceStateID; // same as bgs.protocol.club.v1.MemberVoiceState.id + LeaverInfo Leaver; uint8 Class = 0u; uint8 Subgroup = 0u; uint8 Flags = 0u; @@ -551,6 +566,19 @@ namespace WorldPackets uint32 LegacyRaidDifficultyID = 0u; }; + struct ChallengeModeData + { + int32 Unknown_1120_1 = 0; + int32 Unknown_1120_2 = 0; + uint64 Unknown_1120_3 = 0; + int64 Unknown_1120_4 = 0; + ObjectGuid KeystoneOwnerGUID; + ObjectGuid LeaverGUID; + bool IsActive = false; + bool HasRestrictions = false; + bool CanVoteAbandon = false; + }; + class PartyUpdate final : public ServerPacket { public: @@ -573,6 +601,7 @@ namespace WorldPackets std::vector<PartyPlayerInfo> PlayerList; + Optional<ChallengeModeData> ChallengeMode; Optional<PartyLFGInfo> LfgInfos; Optional<PartyLootSettings> LootSettings; Optional<PartyDifficultySettings> DifficultySettings; diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 633cae4f340..4d30b3b6fdc 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -83,7 +83,7 @@ namespace WorldPackets int32 CreatureDifficultyID = 0; int32 WidgetSetID = 0; int32 WidgetSetUnitConditionID = 0; - std::array<uint32, 2> Flags = { }; + std::array<uint32, 3> Flags = { }; std::array<uint32, 2> ProxyCreatureID = { }; std::array<std::string, 4> Name = { }; std::array<std::string, 4> NameAlt = { }; diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index d3414c11436..ee5c38e7b2f 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -127,8 +127,6 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket << uint32(KioskSessionDurationMinutes); _worldPacket << int64(RedeemForBalanceAmount); - _worldPacket << uint32(BpayStorePurchaseTimeout); - _worldPacket << uint32(ClubsPresenceDelay); _worldPacket << uint32(ClubPresenceUnsubscribeDelay); @@ -156,60 +154,58 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket << Bits<1>(VoiceEnabled); _worldPacket << OptionalInit(EuropaTicketSystemStatus); - _worldPacket << Bits<1>(BpayStoreEnabled); _worldPacket << Bits<1>(BpayStoreAvailable); _worldPacket << Bits<1>(BpayStoreDisabledByParentalControls); _worldPacket << Bits<1>(ItemRestorationButtonEnabled); - _worldPacket << Bits<1>(BrowserEnabled); _worldPacket << OptionalInit(SessionAlert); - _worldPacket << Bits<1>(RAFSystem.Enabled); _worldPacket << Bits<1>(RAFSystem.RecruitingEnabled); + _worldPacket << Bits<1>(CharUndeleteEnabled); _worldPacket << Bits<1>(RestrictedAccount); _worldPacket << Bits<1>(CommerceServerEnabled); _worldPacket << Bits<1>(TutorialEnabled); _worldPacket << Bits<1>(VeteranTokenRedeemWillKick); _worldPacket << Bits<1>(WorldTokenRedeemWillKick); - _worldPacket << Bits<1>(KioskModeEnabled); _worldPacket << Bits<1>(CompetitiveModeEnabled); + _worldPacket << Bits<1>(RedeemForBalanceAvailable); _worldPacket << Bits<1>(WarModeEnabled); _worldPacket << Bits<1>(CommunitiesEnabled); _worldPacket << Bits<1>(BnetGroupsEnabled); _worldPacket << Bits<1>(CharacterCommunitiesEnabled); _worldPacket << Bits<1>(ClubPresenceAllowSubscribeAll); - _worldPacket << Bits<1>(VoiceChatParentalDisabled); _worldPacket << Bits<1>(VoiceChatParentalMuted); + _worldPacket << Bits<1>(QuestSessionEnabled); _worldPacket << Bits<1>(IsChatMuted); _worldPacket << Bits<1>(ClubFinderEnabled); _worldPacket << Bits<1>(CommunityFinderEnabled); _worldPacket << Bits<1>(BrowserCrashReporterEnabled); _worldPacket << Bits<1>(SpeakForMeAllowed); - _worldPacket << Bits<1>(DoesAccountNeedAADCPrompt); _worldPacket << Bits<1>(IsAccountOptedInToAADC); + _worldPacket << Bits<1>(LfgRequireAuthenticatorEnabled); _worldPacket << Bits<1>(ScriptsDisallowedForBeta); _worldPacket << Bits<1>(TimerunningEnabled); _worldPacket << Bits<1>(WarGamesEnabled); _worldPacket << Bits<1>(IsPlayerContentTrackingEnabled); _worldPacket << Bits<1>(SellAllJunkEnabled); - _worldPacket << Bits<1>(GroupFinderEnabled); _worldPacket << Bits<1>(IsPremadeGroupEnabled); + _worldPacket << Bits<1>(false); // unused 10.2.7 _worldPacket << Bits<1>(GuildEventsEditsEnabled); _worldPacket << Bits<1>(GuildTradeSkillsEnabled); - _worldPacket << SizedString::BitsSize<7>(Unknown1027); + _worldPacket << SizedString::BitsSize<10>(Unknown1027); _worldPacket << Bits<1>(BNSendWhisperUseV2Services); _worldPacket << Bits<1>(BNSendGameDataUseV2Services); _worldPacket << Bits<1>(IsAccountCurrencyTransferEnabled); - _worldPacket << Bits<1>(false); // unused 11.0.7 + _worldPacket << Bits<1>(false); // unused 11.0.7 _worldPacket << Bits<1>(LobbyMatchmakerQueueFromMainlineEnabled); _worldPacket << Bits<1>(CanSendLobbyMatchmakerPartyCustomizations); _worldPacket << Bits<1>(AddonProfilerEnabled); @@ -235,7 +231,6 @@ WorldPacket const* FeatureSystemStatus::Write() WorldPacket const* FeatureSystemStatusGlueScreen::Write() { - _worldPacket << Bits<1>(BpayStoreEnabled); _worldPacket << Bits<1>(BpayStoreAvailable); _worldPacket << Bits<1>(BpayStoreDisabledByParentalControls); _worldPacket << Bits<1>(CharUndeleteEnabled); @@ -243,8 +238,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << Bits<1>(VeteranTokenRedeemWillKick); _worldPacket << Bits<1>(WorldTokenRedeemWillKick); _worldPacket << Bits<1>(ExpansionPreorderInStore); - _worldPacket << Bits<1>(KioskModeEnabled); + _worldPacket << Bits<1>(CompetitiveModeEnabled); _worldPacket << Bits<1>(BoostEnabled); _worldPacket << Bits<1>(TrialBoostEnabled); @@ -252,8 +247,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << Bits<1>(PaidCharacterTransfersBetweenBnetAccountsEnabled); _worldPacket << Bits<1>(LiveRegionCharacterListEnabled); _worldPacket << Bits<1>(LiveRegionCharacterCopyEnabled); - _worldPacket << Bits<1>(LiveRegionAccountCopyEnabled); + _worldPacket << Bits<1>(LiveRegionKeyBindingsCopyEnabled); _worldPacket << Bits<1>(BrowserCrashReporterEnabled); _worldPacket << Bits<1>(IsEmployeeAccount); @@ -261,8 +256,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << Bits<1>(NameReservationOnly); _worldPacket << OptionalInit(LaunchDurationETA); _worldPacket << Bits<1>(TimerunningEnabled); - _worldPacket << Bits<1>(ScriptsDisallowedForBeta); + _worldPacket << Bits<1>(PlayerIdentityOptionsEnabled); _worldPacket << Bits<1>(AccountExportEnabled); _worldPacket << Bits<1>(AccountLockedPostExport); @@ -270,8 +265,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << SizedCString::BitsSize<11>(RealmHiddenAlert); _worldPacket << Bits<1>(BNSendWhisperUseV2Services); - _worldPacket << Bits<1>(BNSendGameDataUseV2Services); + _worldPacket << Bits<1>(CharacterSelectListModeRealmless); _worldPacket << Bits<1>(WowTokenLimitedMode); _worldPacket << Bits<1>(false); // unused 11.1.7 @@ -288,7 +283,6 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << int64(RedeemForBalanceAmount); _worldPacket << int32(MaxCharactersOnThisRealm); _worldPacket << Size<uint32>(LiveRegionCharacterCopySourceRegions); - _worldPacket << uint32(BpayStorePurchaseTimeout); _worldPacket << int32(ActiveBoostType); _worldPacket << int32(TrialBoostType); _worldPacket << int32(MinimumExpansionLevel); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 9a3cd43350d..b74adbc0fca 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -119,9 +119,7 @@ namespace WorldPackets WorldPacket const* Write() override; bool VoiceEnabled = false; - bool BrowserEnabled = false; bool BpayStoreAvailable = false; - bool BpayStoreEnabled = false; Optional<SessionAlertConfig> SessionAlert; Optional<EuropaTicketConfig> EuropaTicketSystemStatus; uint32 CfgRealmID = 0; @@ -211,7 +209,6 @@ namespace WorldPackets bool BpayStoreAvailable = false; // NYI bool BpayStoreDisabledByParentalControls = false; // NYI bool CharUndeleteEnabled = false; - bool BpayStoreEnabled = false; bool CommerceServerEnabled = false; // NYI bool VeteranTokenRedeemWillKick = false; // NYI bool WorldTokenRedeemWillKick = false; // NYI @@ -244,7 +241,6 @@ namespace WorldPackets uint32 CommercePricePollTimeSeconds = 0; // NYI int64 RedeemForBalanceAmount = 0; // NYI int32 MaxCharactersOnThisRealm = 0; - uint32 BpayStorePurchaseTimeout = 0; // NYI int32 ActiveBoostType = 0; // NYI int32 TrialBoostType = 0; // NYI int32 MinimumExpansionLevel = 0; diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index 6fd35cc00c0..63487076b02 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -36,6 +36,49 @@ ByteBuffer& operator<<(ByteBuffer& data, PvPTalent const& pvpTalent) return data; } +ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentEntry const& talentEntry) +{ + data << int32(talentEntry.TalentID); + data << int32(talentEntry.Rank); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentGroupInfo const& talentGroupInfo) +{ + data << uint8(talentGroupInfo.NumTalents); + data << Size<uint32>(talentGroupInfo.Talents); + + data << uint8(talentGroupInfo.NumGlyphs); + data << Size<uint32>(talentGroupInfo.GlyphIDs); + + data << int8(talentGroupInfo.Role); + data << int32(talentGroupInfo.PrimarySpecialization); + + for (ClassicTalentEntry const& talentEntry : talentGroupInfo.Talents) + data << talentEntry; + + if (!talentGroupInfo.GlyphIDs.empty()) + data.append(talentGroupInfo.GlyphIDs.data(), talentGroupInfo.GlyphIDs.size()); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentInfoUpdate const& talentInfoUpdate) +{ + data << int32(talentInfoUpdate.UnspentTalentPoints); + data << uint8(talentInfoUpdate.ActiveGroup); + data << Size<uint32>(talentInfoUpdate.Talents); + + for (ClassicTalentGroupInfo const& talents : talentInfoUpdate.Talents) + data << talents; + + data << Bits<1>(talentInfoUpdate.IsPetTalents); + data.FlushBits(); + + return data; +} + WorldPacket const* UpdateTalentData::Write() { _worldPacket << uint8(Info.ActiveGroup); @@ -47,12 +90,16 @@ WorldPacket const* UpdateTalentData::Write() _worldPacket << uint32(talentGroupInfo.SpecID); _worldPacket << Size<uint32>(talentGroupInfo.TalentIDs); _worldPacket << Size<uint32>(talentGroupInfo.PvPTalents); + _worldPacket << Size<uint32>(talentGroupInfo.GlyphIDs); for (uint16 talent : talentGroupInfo.TalentIDs) _worldPacket << uint16(talent); for (PvPTalent talent : talentGroupInfo.PvPTalents) _worldPacket << talent; + + for (uint32 talent : talentGroupInfo.GlyphIDs) + _worldPacket << uint16(talent); } return &_worldPacket; diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index 8b342345109..5b9566e83c2 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -38,6 +38,7 @@ namespace WorldPackets uint32 SpecID = 0; std::vector<uint16> TalentIDs; std::vector<PvPTalent> PvPTalents; + std::vector<uint32> GlyphIDs; }; struct TalentInfoUpdate @@ -47,6 +48,30 @@ namespace WorldPackets std::vector<TalentGroupInfo> TalentGroups; }; + struct ClassicTalentEntry + { + int32 TalentID = 0; + int32 Rank = 0; + }; + + struct ClassicTalentGroupInfo + { + uint8 NumTalents = 0; + std::vector<ClassicTalentEntry> Talents; + uint8 NumGlyphs = 0; + std::vector<uint16> GlyphIDs; + int8 Role = 0; + int32 PrimarySpecialization = 0; + }; + + struct ClassicTalentInfoUpdate + { + int32 UnspentTalentPoints = 0; + uint8 ActiveGroup = 0; + bool IsPetTalents = false; + std::vector<ClassicTalentGroupInfo> Talents; + }; + class UpdateTalentData final : public ServerPacket { public: @@ -141,6 +166,8 @@ namespace WorldPackets int32 SpellID = 0; std::vector<PvPTalent> Talents; }; + + ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentInfoUpdate const& talentInfoInfo); } } diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.cpp b/src/server/game/Server/Packets/TraitPacketsCommon.cpp index 704d6bc6bf8..692ed9cb330 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.cpp +++ b/src/server/game/Server/Packets/TraitPacketsCommon.cpp @@ -66,6 +66,7 @@ ByteBuffer& operator>>(ByteBuffer& data, TraitEntry& traitEntry) data >> traitEntry.TraitNodeEntryID; data >> traitEntry.Rank; data >> traitEntry.GrantedRanks; + data >> traitEntry.BonusRanks; return data; } @@ -76,6 +77,7 @@ ByteBuffer& operator<<(ByteBuffer& data, TraitEntry const& traitEntry) data << int32(traitEntry.TraitNodeEntryID); data << int32(traitEntry.Rank); data << int32(traitEntry.GrantedRanks); + data << int32(traitEntry.BonusRanks); return data; } diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.h b/src/server/game/Server/Packets/TraitPacketsCommon.h index 8cf075bc7a8..94b88e29746 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.h +++ b/src/server/game/Server/Packets/TraitPacketsCommon.h @@ -41,6 +41,7 @@ struct TraitEntry int32 TraitNodeEntryID = 0; int32 Rank = 0; int32 GrantedRanks = 0; + int32 BonusRanks = 0; }; struct TraitSubTreeCache diff --git a/src/server/game/Server/Packets/VoidStoragePackets.cpp b/src/server/game/Server/Packets/VoidStoragePackets.cpp deleted file mode 100644 index 0b7cef0f6be..00000000000 --- a/src/server/game/Server/Packets/VoidStoragePackets.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "VoidStoragePackets.h" -#include "PacketOperators.h" - -namespace WorldPackets::VoidStorage -{ -WorldPacket const* VoidTransferResult::Write() -{ - _worldPacket << int32(Result); - - return &_worldPacket; -} - -void UnlockVoidStorage::Read() -{ - _worldPacket >> Npc; -} - -void QueryVoidStorage::Read() -{ - _worldPacket >> Npc; -} - -WorldPacket const* VoidStorageFailed::Write() -{ - _worldPacket << uint8(Reason); - - return &_worldPacket; -} - -ByteBuffer& operator<<(ByteBuffer& data, VoidItem const& voidItem) -{ - data << voidItem.Guid; - data << voidItem.Creator; - data << uint32(voidItem.Slot); - data << voidItem.Item; - - return data; -} - -WorldPacket const* VoidStorageContents::Write() -{ - _worldPacket.reserve(1 + Items.size() * sizeof(VoidItem)); - - _worldPacket << BitsSize<8>(Items); - _worldPacket.FlushBits(); - - for (VoidItem const& voidItem : Items) - _worldPacket << voidItem; - - return &_worldPacket; -} - -void VoidStorageTransfer::Read() -{ - _worldPacket >> Npc; - _worldPacket >> Size<uint32>(Deposits); - _worldPacket >> Size<uint32>(Withdrawals); - - for (ObjectGuid& deposit : Deposits) - _worldPacket >> deposit; - - for (ObjectGuid& withdrawal : Withdrawals) - _worldPacket >> withdrawal; -} - -WorldPacket const* VoidStorageTransferChanges::Write() -{ - _worldPacket.reserve(1 + AddedItems.size() * sizeof(VoidItem) + RemovedItems.size() * 16); - - _worldPacket << BitsSize<4>(AddedItems); - _worldPacket << BitsSize<4>(RemovedItems); - _worldPacket.FlushBits(); - - for (VoidItem const& addedItem : AddedItems) - _worldPacket << addedItem; - - for (ObjectGuid const& removedItem : RemovedItems) - _worldPacket << removedItem; - - return &_worldPacket; -} - -void SwapVoidItem::Read() -{ - _worldPacket >> Npc; - _worldPacket >> VoidItemGuid; - _worldPacket >> DstSlot; -} - -WorldPacket const* VoidItemSwapResponse::Write() -{ - _worldPacket << VoidItemA << uint32(VoidItemSlotA); - _worldPacket << VoidItemB << uint32(VoidItemSlotB); - - return &_worldPacket; -} -} diff --git a/src/server/game/Server/Packets/VoidStoragePackets.h b/src/server/game/Server/Packets/VoidStoragePackets.h deleted file mode 100644 index c7a9793cd0b..00000000000 --- a/src/server/game/Server/Packets/VoidStoragePackets.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TRINITYCORE_VOID_STORAGE_PACKETS_H -#define TRINITYCORE_VOID_STORAGE_PACKETS_H - -#include "Packet.h" -#include "ItemPacketsCommon.h" -#include "ObjectGuid.h" -#include "SharedDefines.h" - -namespace WorldPackets -{ - namespace VoidStorage - { - class VoidTransferResult final : public ServerPacket - { - public: - explicit VoidTransferResult(int32 result) : ServerPacket(SMSG_VOID_TRANSFER_RESULT, 4), Result(result) { } - - WorldPacket const* Write() override; - - int32 Result; - }; - - class UnlockVoidStorage final : public ClientPacket - { - public: - explicit UnlockVoidStorage(WorldPacket&& packet) : ClientPacket(CMSG_UNLOCK_VOID_STORAGE, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - }; - - class QueryVoidStorage final : public ClientPacket - { - public: - explicit QueryVoidStorage(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_VOID_STORAGE, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - }; - - class VoidStorageFailed final : public ServerPacket - { - public: - explicit VoidStorageFailed() : ServerPacket(SMSG_VOID_STORAGE_FAILED, 1) { } - - WorldPacket const* Write() override; - - uint8 Reason = 0; - }; - - struct VoidItem - { - ObjectGuid Guid; - ObjectGuid Creator; - uint32 Slot = 0; - WorldPackets::Item::ItemInstance Item; - }; - - class VoidStorageContents final : public ServerPacket - { - public: - explicit VoidStorageContents() : ServerPacket(SMSG_VOID_STORAGE_CONTENTS, 0) { } - - WorldPacket const* Write() override; - - std::vector<VoidItem> Items; - }; - - class VoidStorageTransfer final : public ClientPacket - { - public: - explicit VoidStorageTransfer(WorldPacket&& packet) : ClientPacket(CMSG_VOID_STORAGE_TRANSFER, std::move(packet)) { } - - void Read() override; - - Array<ObjectGuid, VOID_STORAGE_MAX_WITHDRAW> Withdrawals; - Array<ObjectGuid, VOID_STORAGE_MAX_DEPOSIT> Deposits; - ObjectGuid Npc; - }; - - class VoidStorageTransferChanges final : public ServerPacket - { - public: - explicit VoidStorageTransferChanges() : ServerPacket(SMSG_VOID_STORAGE_TRANSFER_CHANGES, 0) { } - - WorldPacket const* Write() override; - - std::vector<ObjectGuid> RemovedItems; - std::vector<VoidItem> AddedItems; - }; - - class SwapVoidItem final : public ClientPacket - { - public: - explicit SwapVoidItem(WorldPacket&& packet) : ClientPacket(CMSG_SWAP_VOID_ITEM, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - ObjectGuid VoidItemGuid; - uint32 DstSlot = 0; - }; - - class VoidItemSwapResponse final : public ServerPacket - { - public: - explicit VoidItemSwapResponse() : ServerPacket(SMSG_VOID_ITEM_SWAP_RESPONSE, 16 + 16 + 4 + 4) { } - - WorldPacket const* Write() override; - - ObjectGuid VoidItemA; - ObjectGuid VoidItemB; - uint32 VoidItemSlotA = 0; - uint32 VoidItemSlotB = 0; - }; - } -} - -#endif // TRINITYCORE_VOID_STORAGE_PACKETS_H diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ec6d0792dbc..23add3e1448 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -195,10 +195,9 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoBankItemOpcode); - DEFINE_HANDLER(CMSG_AUTOBANK_REAGENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankReagentOpcode); DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoStoreBankItemOpcode); - DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_REAGENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankReagentOpcode); DEFINE_HANDLER(CMSG_AUTO_DEPOSIT_ACCOUNT_BANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_AUTO_DEPOSIT_CHARACTER_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoDepositCharacterBank); DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoEquipItemOpcode); DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoEquipItemSlotOpcode); DEFINE_HANDLER(CMSG_AUTO_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoGuildBankItem); @@ -251,11 +250,9 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_BONUS_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBugReportOpcode); DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode); - DEFINE_HANDLER(CMSG_BUY_ACCOUNT_BANK_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BUY_ACCOUNT_BANK_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankTab); DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuybackItem); - DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyBankSlotOpcode); DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyItemOpcode); - DEFINE_HANDLER(CMSG_BUY_REAGENT_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyReagentBankOpcode); DEFINE_HANDLER(CMSG_CAGE_BATTLE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCageBattlePet); DEFINE_HANDLER(CMSG_CALENDAR_ADD_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent); DEFINE_HANDLER(CMSG_CALENDAR_COMMUNITY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCommunityInvite); @@ -288,7 +285,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode); DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeBagSlotFlag); - DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeBankBagSlotFlag); + DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_REALM_TICKET, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlenetChangeRealmTicket); DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSubGroupOpcode); @@ -426,7 +423,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_DELVE_TELEPORT_OUT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode); DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode); - DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReagentBankDepositOpcode); DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleDestroyItemOpcode); DEFINE_HANDLER(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode); DEFINE_HANDLER(CMSG_DF_CONFIRM_EXPAND_SEARCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -557,6 +553,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateRolePoll); DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode); DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleInspectOpcode); + DEFINE_HANDLER(CMSG_INSTANCE_ABANDON_VOTE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse); DEFINE_HANDLER(CMSG_ISLAND_QUEUE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ITEM_PURCHASE_REFUND, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefund); @@ -795,7 +792,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_QUERY_SELECTED_WOW_LABS_AREA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTimeOpcode); DEFINE_HANDLER(CMSG_QUERY_TREASURE_PICKER, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTreasurePicker); - DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageQuery); DEFINE_HANDLER(CMSG_QUERY_WOW_LABS_AREA_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept); DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); @@ -951,7 +947,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SORT_ACCOUNT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortAccountBankBags); DEFINE_HANDLER(CMSG_SORT_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortBags); DEFINE_HANDLER(CMSG_SORT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortBankBags); - DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortReagentBankBags); DEFINE_HANDLER(CMSG_SPECTATE_CHANGE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SPAWN_TRACKING_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSpawnTrackingUpdate); DEFINE_HANDLER(CMSG_SPELL_CLICK, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSpellClick); @@ -964,6 +959,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SPLIT_ITEM_TO_GUILD_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitItemToGuildBank); DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleStandStateChangeOpcode); DEFINE_HANDLER(CMSG_START_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_START_INSTANCE_ABANDON_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_STORE_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleStoreGuildBankItem); @@ -979,7 +975,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSwapItem); DEFINE_HANDLER(CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapItemWithGuildBankItem); DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapSubGroupsOpcode); - DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidSwapItem); DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTabardVendorActivateOpcode); DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGossipHelloOpcode); DEFINE_HANDLER(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode); @@ -1007,9 +1002,8 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUnlearnSkillOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageUnlock); DEFINE_HANDLER(CMSG_UPDATE_AADC_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChatUpdateAADCStatus); - DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateBankTabSettings); DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData); DEFINE_HANDLER(CMSG_UPDATE_AREA_TRIGGER_VISUAL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateAreaTriggerVisual); DEFINE_HANDLER(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -1032,7 +1026,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_CHAT_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_CHAT_LOGIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleVoidStorageTransfer); DEFINE_HANDLER(CMSG_WARDEN3_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenData); DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoIsOpcode); @@ -1096,12 +1089,8 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_POI_UPDATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_UNATTACH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CLEAR_OPPONENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1246,6 +1235,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_SET_LEAVER_PENALTY_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1415,7 +1405,6 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIMATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_OBJECT_RELINK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_RANDOM_TRANSMOG_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_SPAWN_TRACKING_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1599,6 +1588,10 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_END, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1712,6 +1705,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_VARS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -2097,6 +2091,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_INSTANCE_LEAVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LOOT_METHOD_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -2210,6 +2205,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLOAD_CHILD_MAP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNSET_INSTANCE_LEAVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_AADC_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 475bf20ab3e..65ea46c0c86 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -36,2191 +36,2188 @@ constexpr uint32 UNKNOWN_OPCODE = 0xBADD; // special marker value for uninitia enum OpcodeClient : uint32 { - CMSG_ABANDON_NPE_RESPONSE = 0x31029A, - CMSG_ACCEPT_GUILD_INVITE = 0x360029, - CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x31025B, - CMSG_ACCEPT_SOCIAL_CONTRACT = 0x360172, - CMSG_ACCEPT_TRADE = 0x310004, - CMSG_ACCEPT_WARGAME_INVITE = 0x36000C, - CMSG_ACCOUNT_BANK_DEPOSIT_MONEY = 0x3102DD, - CMSG_ACCOUNT_BANK_WITHDRAW_MONEY = 0x3102DE, - CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x36015E, - CMSG_ACCOUNT_STORE_BEGIN_PURCHASE_OR_REFUND = 0x3600BE, - CMSG_ACTIVATE_SOULBIND = 0x310289, - CMSG_ACTIVATE_TAXI = 0x32003E, - CMSG_ADDON_LIST = 0x360004, - CMSG_ADD_ACCOUNT_COSMETIC = 0x310170, - CMSG_ADD_BATTLENET_FRIEND = 0x360084, - CMSG_ADD_FRIEND = 0x3600FC, - CMSG_ADD_IGNORE = 0x360100, - CMSG_ADD_TOY = 0x31016F, - CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3100B3, - CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x31028C, - CMSG_ADVENTURE_MAP_START_QUEST = 0x31022C, - CMSG_ALTER_APPEARANCE = 0x32008F, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x320043, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x320044, - CMSG_AREA_TRIGGER = 0x310086, - CMSG_ARTIFACT_ADD_POWER = 0x310056, - CMSG_ARTIFACT_SET_APPEARANCE = 0x310058, - CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x3100BF, - CMSG_ATTACK_STOP = 0x31011D, - CMSG_ATTACK_SWING = 0x31011C, - CMSG_AUCTIONABLE_TOKEN_SELL = 0x360112, - CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x360113, - CMSG_AUCTION_BROWSE_QUERY = 0x320063, - CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x32006B, - CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x32006A, - CMSG_AUCTION_GET_COMMODITY_QUOTE = 0x320069, - CMSG_AUCTION_HELLO_REQUEST = 0x32005E, - CMSG_AUCTION_LIST_BIDDED_ITEMS = 0x320067, - CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0x320068, - CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0x320064, - CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0x320065, - CMSG_AUCTION_LIST_OWNED_ITEMS = 0x320066, - CMSG_AUCTION_PLACE_BID = 0x320062, - CMSG_AUCTION_REMOVE_ITEM = 0x320060, - CMSG_AUCTION_REPLICATE_ITEMS = 0x320061, - CMSG_AUCTION_SELL_COMMODITY = 0x32006C, - CMSG_AUCTION_SELL_ITEM = 0x32005F, - CMSG_AUCTION_SET_FAVORITE_ITEM = 0x36015F, - CMSG_AUTH_CONTINUED_SESSION = 0x370002, - CMSG_AUTH_SESSION = 0x370001, - CMSG_AUTOBANK_ITEM = 0x330003, - CMSG_AUTOBANK_REAGENT = 0x330005, - CMSG_AUTOSTORE_BANK_ITEM = 0x330002, - CMSG_AUTOSTORE_BANK_REAGENT = 0x330004, - CMSG_AUTO_DEPOSIT_ACCOUNT_BANK = 0x3102E7, - CMSG_AUTO_EQUIP_ITEM = 0x330006, - CMSG_AUTO_EQUIP_ITEM_SLOT = 0x33000B, - CMSG_AUTO_GUILD_BANK_ITEM = 0x32004A, - CMSG_AUTO_STORE_BAG_ITEM = 0x330007, - CMSG_AUTO_STORE_GUILD_BANK_ITEM = 0x320053, - CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x310257, - CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x310238, - CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x310259, - CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x310258, - CMSG_BANKER_ACTIVATE = 0x320046, - CMSG_BATTLEFIELD_LEAVE = 0x31001F, - CMSG_BATTLEFIELD_LIST = 0x31002A, - CMSG_BATTLEFIELD_PORT = 0x3200C5, - CMSG_BATTLEMASTER_HELLO = 0x31018E, - CMSG_BATTLEMASTER_JOIN = 0x3200BC, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x3200BD, - CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3200C3, - CMSG_BATTLEMASTER_JOIN_RATED_BG_BLITZ = 0x3200BF, - CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = 0x3200BE, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3200C0, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x3600FF, - CMSG_BATTLENET_REQUEST = 0x360120, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x3600F9, - CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x36013C, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x3600F8, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x3600EF, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS = 0x360162, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x3600E6, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x3600E7, - CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x360135, - CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x360131, - CMSG_BATTLE_PAY_START_PURCHASE = 0x3600F7, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36011E, - CMSG_BATTLE_PET_CLEAR_FANFARE = 0x2B0002, - CMSG_BATTLE_PET_DELETE_PET = 0x36004F, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x360050, - CMSG_BATTLE_PET_MODIFY_NAME = 0x360052, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x36004E, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x36004D, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x360057, - CMSG_BATTLE_PET_SET_FLAGS = 0x36005A, - CMSG_BATTLE_PET_SUMMON = 0x360053, - CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x310090, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31008F, - CMSG_BEGIN_TRADE = 0x310001, - CMSG_BINDER_ACTIVATE = 0x320045, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3200CD, - CMSG_BLACK_MARKET_OPEN = 0x3200CB, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3200CC, - CMSG_BONUS_ROLL = 0x31025A, - CMSG_BUG_REPORT = 0x3600AF, - CMSG_BUSY_TRADE = 0x310002, - CMSG_BUY_ACCOUNT_BANK_TAB = 0x320122, - CMSG_BUY_BACK_ITEM = 0x320037, - CMSG_BUY_BANK_SLOT = 0x320047, - CMSG_BUY_ITEM = 0x320036, - CMSG_BUY_REAGENT_BANK = 0x320048, - CMSG_CAGE_BATTLE_PET = 0x3100A3, - CMSG_CALENDAR_ADD_EVENT = 0x3600A7, - CMSG_CALENDAR_COMMUNITY_INVITE = 0x36009B, - CMSG_CALENDAR_COMPLAIN = 0x3600A3, - CMSG_CALENDAR_COPY_EVENT = 0x3600A2, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x3600A5, - CMSG_CALENDAR_GET = 0x360099, - CMSG_CALENDAR_GET_EVENT = 0x36009A, - CMSG_CALENDAR_GET_NUM_PENDING = 0x3600A4, - CMSG_CALENDAR_INVITE = 0x36009C, - CMSG_CALENDAR_MODERATOR_STATUS = 0x3600A0, - CMSG_CALENDAR_REMOVE_EVENT = 0x3600A1, - CMSG_CALENDAR_REMOVE_INVITE = 0x36009D, - CMSG_CALENDAR_RSVP = 0x36009E, - CMSG_CALENDAR_STATUS = 0x36009F, - CMSG_CALENDAR_UPDATE_EVENT = 0x3600A8, - CMSG_CANCEL_AURA = 0x31005A, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x320081, - CMSG_CANCEL_CAST = 0x310176, - CMSG_CANCEL_CHANNELLING = 0x310137, - CMSG_CANCEL_GROWTH_AURA = 0x31013F, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3100CC, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x310059, - CMSG_CANCEL_MOUNT_AURA = 0x310152, - CMSG_CANCEL_QUEUED_SPELL = 0x31002B, - CMSG_CANCEL_TEMP_ENCHANTMENT = 0x32008C, - CMSG_CANCEL_TRADE = 0x310006, - CMSG_CAN_DUEL = 0x36008C, - CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x360130, - CMSG_CAST_SPELL = 0x310173, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x2E0002, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x310210, - CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x310211, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3101F1, - CMSG_CHANGE_REALM_TICKET = 0x360125, - CMSG_CHANGE_SUB_GROUP = 0x360076, - CMSG_CHARACTER_CHECK_UPGRADE = 0x3600F2, - CMSG_CHARACTER_RENAME_REQUEST = 0x3600ED, - CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x3600F0, - CMSG_CHARACTER_UPGRADE_START = 0x3600F1, - CMSG_CHAR_CUSTOMIZE = 0x3600B6, - CMSG_CHAR_DELETE = 0x3600C8, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3600BC, - CMSG_CHAT_ADDON_MESSAGE = 0x2D002A, - CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x2D002B, - CMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_REQUEST = 0x2D0032, - CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x2D001F, - CMSG_CHAT_CHANNEL_BAN = 0x2D001D, - CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x2D0022, - CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x2D0012, - CMSG_CHAT_CHANNEL_INVITE = 0x2D001B, - CMSG_CHAT_CHANNEL_KICK = 0x2D001C, - CMSG_CHAT_CHANNEL_LIST = 0x2D0011, - CMSG_CHAT_CHANNEL_MODERATE = 0x2D0016, - CMSG_CHAT_CHANNEL_MODERATOR = 0x2D0017, - CMSG_CHAT_CHANNEL_OWNER = 0x2D0015, - CMSG_CHAT_CHANNEL_PASSWORD = 0x2D0013, - CMSG_CHAT_CHANNEL_SET_OWNER = 0x2D0014, - CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x2D0020, - CMSG_CHAT_CHANNEL_UNBAN = 0x2D001E, - CMSG_CHAT_CHANNEL_UNMODERATOR = 0x2D0018, - CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x2D0021, - CMSG_CHAT_DROP_CAUTIONARY_CHAT_MESSAGE = 0x2D000A, - CMSG_CHAT_JOIN_CHANNEL = 0x2D0000, - CMSG_CHAT_LEAVE_CHANNEL = 0x2D0001, - CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_INSTANCE_CHAT = 0x2D0031, - CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_PARTY = 0x2D0030, - CMSG_CHAT_MESSAGE_AFK = 0x2D000F, - CMSG_CHAT_MESSAGE_CHANNEL = 0x2D0007, - CMSG_CHAT_MESSAGE_DND = 0x2D0010, - CMSG_CHAT_MESSAGE_EMOTE = 0x2D0024, - CMSG_CHAT_MESSAGE_GUILD = 0x2D000D, - CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x2D0028, - CMSG_CHAT_MESSAGE_OFFICER = 0x2D000E, - CMSG_CHAT_MESSAGE_PARTY = 0x2D0026, - CMSG_CHAT_MESSAGE_RAID = 0x2D0027, - CMSG_CHAT_MESSAGE_RAID_WARNING = 0x2D0029, - CMSG_CHAT_MESSAGE_SAY = 0x2D0023, - CMSG_CHAT_MESSAGE_WHISPER = 0x2D0008, - CMSG_CHAT_MESSAGE_YELL = 0x2D0025, - CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x2D0005, - CMSG_CHAT_REPORT_FILTERED = 0x2D0004, - CMSG_CHAT_REPORT_IGNORED = 0x2D0003, - CMSG_CHAT_SEND_CAUTIONARY_CHANNEL_MESSAGE = 0x2D000B, - CMSG_CHAT_SEND_CAUTIONARY_CHAT_MESSAGE = 0x2D0009, - CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x2D0006, - CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x36006F, - CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x31010E, - CMSG_CHOICE_RESPONSE = 0x31017B, - CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x310288, - CMSG_CLAIM_WEEKLY_REWARD = 0x310265, - CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x3102C2, - CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0x3100C3, - CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x3102C4, - CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x3102C1, - CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x3102C0, - CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x3102C5, - CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0x3100C2, - CMSG_CLEAR_NEW_APPEARANCE = 0x2B0005, - CMSG_CLEAR_RAID_MARKER = 0x310052, - CMSG_CLEAR_TRADE_ITEM = 0x310008, - CMSG_CLIENT_PORT_GRAVEYARD = 0x3200C7, - CMSG_CLOSE_INTERACTION = 0x320025, - CMSG_CLOSE_QUEST_CHOICE = 0x31017C, - CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x310290, - CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x3102C6, - CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x360147, - CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x360145, - CMSG_CLUB_FINDER_POST = 0x360142, - CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x360149, - CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x360143, - CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x360144, - CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x360148, - CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x36014A, - CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x360146, - CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST = 0x360165, - CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x360122, - CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x36005D, - CMSG_COMMENTATOR_ENABLE = 0x36001C, - CMSG_COMMENTATOR_ENTER_INSTANCE = 0x360020, - CMSG_COMMENTATOR_EXIT_INSTANCE = 0x360021, - CMSG_COMMENTATOR_GET_MAP_INFO = 0x36001D, - CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x36001F, - CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x36001E, - CMSG_COMMENTATOR_SPECTATE = 0x360163, - CMSG_COMMENTATOR_START_WARGAME = 0x36001B, - CMSG_COMMERCE_TOKEN_GET_COUNT = 0x360110, - CMSG_COMMERCE_TOKEN_GET_LOG = 0x36011A, - CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x360111, - CMSG_COMPLAINT = 0x360096, - CMSG_COMPLETE_CINEMATIC = 0x3200E5, - CMSG_COMPLETE_MOVIE = 0x320077, - CMSG_CONFIRM_ARTIFACT_RESPEC = 0x310057, - CMSG_CONFIRM_PROFESSION_RESPEC = 0x3100C6, - CMSG_CONFIRM_RESPEC_WIPE = 0x3100C5, - CMSG_CONNECT_TO_FAILED = 0x360000, - CMSG_CONSUMABLE_TOKEN_BUY = 0x360115, - CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x360116, - CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x360114, - CMSG_CONSUMABLE_TOKEN_REDEEM = 0x360118, - CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x360119, - CMSG_CONTENT_TRACKING_START_TRACKING = 0x3102D6, - CMSG_CONTENT_TRACKING_STOP_TRACKING = 0x3102D7, - CMSG_CONTRIBUTION_CONTRIBUTE = 0x3200FA, - CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x3200FB, - CMSG_CONVERSATION_CINEMATIC_READY = 0x3200E7, - CMSG_CONVERSATION_LINE_STARTED = 0x3200E6, - CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT = 0x3102E6, - CMSG_CONVERT_RAID = 0x360078, - CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x32010E, - CMSG_CRAFTING_ORDER_CANCEL = 0x32011A, - CMSG_CRAFTING_ORDER_CLAIM = 0x320117, - CMSG_CRAFTING_ORDER_CREATE = 0x320113, - CMSG_CRAFTING_ORDER_FULFILL = 0x320119, - CMSG_CRAFTING_ORDER_GET_NPC_REWARD_INFO = 0x320116, - CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x320115, - CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x320114, - CMSG_CRAFTING_ORDER_REJECT = 0x32011B, - CMSG_CRAFTING_ORDER_RELEASE = 0x320118, - CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0x32011C, - CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x32011D, - CMSG_CREATE_CHARACTER = 0x36006E, - CMSG_CREATE_SHIPMENT = 0x3101DA, - CMSG_DB_QUERY_BULK = 0x360010, - CMSG_DECLINE_GUILD_INVITES = 0x3200B9, - CMSG_DECLINE_PETITION = 0x3200D4, - CMSG_DELETE_EQUIPMENT_SET = 0x3200A5, - CMSG_DELVE_TELEPORT_OUT = 0x320129, - CMSG_DEL_FRIEND = 0x3600FD, - CMSG_DEL_IGNORE = 0x360101, - CMSG_DEPOSIT_REAGENT_BANK = 0x31021A, - CMSG_DESTROY_ITEM = 0x310169, - CMSG_DF_BOOT_PLAYER_VOTE = 0x360044, - CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x360036, - CMSG_DF_GET_JOIN_STATUS = 0x360042, - CMSG_DF_GET_SYSTEM_INFO = 0x360041, - CMSG_DF_JOIN = 0x360037, - CMSG_DF_LEAVE = 0x360040, - CMSG_DF_PROPOSAL_RESPONSE = 0x360035, - CMSG_DF_READY_CHECK_RESPONSE = 0x360048, - CMSG_DF_SET_ROLES = 0x360043, - CMSG_DF_TELEPORT = 0x360045, - CMSG_DISCARDED_TIME_SYNC_ACKS = 0x34005E, - CMSG_DISMISS_CRITTER = 0x320093, - CMSG_DO_COUNTDOWN = 0x360141, - CMSG_DO_MASTER_LOOT_ROLL = 0x3100CB, - CMSG_DO_READY_CHECK = 0x36005E, - CMSG_DUEL_RESPONSE = 0x32007C, - CMSG_EJECT_PASSENGER = 0x310103, - CMSG_EMOTE = 0x3200E1, - CMSG_ENABLE_NAGLE = 0x370007, - CMSG_ENABLE_TAXI_NODE = 0x32003C, - CMSG_ENGINE_SURVEY = 0x36010F, - CMSG_ENTER_ENCRYPTED_MODE_ACK = 0x370003, - CMSG_ENUM_CHARACTERS = 0x360014, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x360109, - CMSG_FAR_SIGHT = 0x320082, - CMSG_GAME_EVENT_DEBUG_DISABLE = 0x31005E, - CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31005D, - CMSG_GAME_OBJ_REPORT_USE = 0x320089, - CMSG_GAME_OBJ_USE = 0x320088, - CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x3101D5, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x3101BB, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x3101A8, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x31020C, - CMSG_GARRISON_COMPLETE_MISSION = 0x3101FE, - CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x3101D6, - CMSG_GARRISON_GENERATE_RECRUITS = 0x3101BE, - CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x3101CD, - CMSG_GARRISON_GET_MAP_DATA = 0x3101D4, - CMSG_GARRISON_GET_MISSION_REWARD = 0x310230, - CMSG_GARRISON_LEARN_TALENT = 0x3101C9, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x310200, - CMSG_GARRISON_PURCHASE_BUILDING = 0x3101A4, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x3101C0, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x3101F5, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x3101BC, - CMSG_GARRISON_RENAME_FOLLOWER = 0x3101BD, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x3101A3, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x3101D8, - CMSG_GARRISON_RESEARCH_TALENT = 0x3101C1, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x3101A5, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x3101B9, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x3101B1, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x3101BF, - CMSG_GARRISON_SOCKET_TALENT = 0x31029D, - CMSG_GARRISON_START_MISSION = 0x3101FD, - CMSG_GARRISON_SWAP_BUILDINGS = 0x3101A9, - CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x360013, - CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x3600E1, - CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x36015D, - CMSG_GET_GARRISON_INFO = 0x31019E, - CMSG_GET_ITEM_PURCHASE_DATA = 0x3200CF, - CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x3101D9, - CMSG_GET_MIRROR_IMAGE_DATA = 0x31016D, - CMSG_GET_PVP_OPTIONS_ENABLED = 0x36001A, - CMSG_GET_RAF_ACCOUNT_INFO = 0x36014B, - CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA = 0x36018E, - CMSG_GET_REMAINING_GAME_TIME = 0x360117, - CMSG_GET_TROPHY_LIST = 0x3101EE, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36010B, - CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36011C, - CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36011D, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3600BA, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x3600B9, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3600B8, - CMSG_GOSSIP_REFRESH_OPTIONS = 0x32010D, - CMSG_GOSSIP_SELECT_OPTION = 0x320026, - CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x2F0020, - CMSG_GUILD_ADD_RANK = 0x2F0005, - CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x2F0002, - CMSG_GUILD_BANK_ACTIVATE = 0x320049, - CMSG_GUILD_BANK_BUY_TAB = 0x320057, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x320059, - CMSG_GUILD_BANK_LOG_QUERY = 0x2F0019, - CMSG_GUILD_BANK_QUERY_TAB = 0x320056, - CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x2F001A, - CMSG_GUILD_BANK_SET_TAB_TEXT = 0x2F001D, - CMSG_GUILD_BANK_TEXT_QUERY = 0x2F001E, - CMSG_GUILD_BANK_UPDATE_TAB = 0x320058, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x32005A, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x2F0017, - CMSG_GUILD_CHANGE_NAME_REQUEST = 0x2F0018, - CMSG_GUILD_DECLINE_INVITATION = 0x36002A, - CMSG_GUILD_DELETE = 0x2F0009, - CMSG_GUILD_DELETE_RANK = 0x2F0006, - CMSG_GUILD_DEMOTE_MEMBER = 0x2F0001, - CMSG_GUILD_EVENT_LOG_QUERY = 0x2F001C, - CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x2F0012, - CMSG_GUILD_GET_RANKS = 0x2F000E, - CMSG_GUILD_GET_ROSTER = 0x2F0014, - CMSG_GUILD_INVITE_BY_NAME = 0x360034, - CMSG_GUILD_LEAVE = 0x2F0003, - CMSG_GUILD_NEWS_UPDATE_STICKY = 0x2F000F, - CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x2F0004, - CMSG_GUILD_PERMISSIONS_QUERY = 0x2F001B, - CMSG_GUILD_PROMOTE_MEMBER = 0x2F0000, - CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x2F000C, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x2F000A, - CMSG_GUILD_QUERY_NEWS = 0x2F000D, - CMSG_GUILD_QUERY_RECIPES = 0x2F000B, - CMSG_GUILD_REPLACE_GUILD_MASTER = 0x2F001F, - CMSG_GUILD_REQUEST_RENAME = 0x2F0023, - CMSG_GUILD_REQUEST_RENAME_NAME_CHECK = 0x2F0022, - CMSG_GUILD_REQUEST_RENAME_REFUND = 0x2F0024, - CMSG_GUILD_REQUEST_RENAME_STATUS = 0x2F0021, - CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x2F0010, - CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x2F0011, - CMSG_GUILD_SET_GUILD_MASTER = 0x3600F4, - CMSG_GUILD_SET_MEMBER_NOTE = 0x2F0013, - CMSG_GUILD_SET_RANK_PERMISSIONS = 0x2F0008, - CMSG_GUILD_SHIFT_RANK = 0x2F0007, - CMSG_GUILD_UPDATE_INFO_TEXT = 0x2F0016, - CMSG_GUILD_UPDATE_MOTD_TEXT = 0x2F0015, - CMSG_HEARTH_AND_RESURRECT = 0x3200A1, - CMSG_HIDE_QUEST_CHOICE = 0x31017D, - CMSG_HOTFIX_REQUEST = 0x360011, - CMSG_IGNORE_TRADE = 0x310003, - CMSG_INITIATE_ROLE_POLL = 0x360006, - CMSG_INITIATE_TRADE = 0x310000, - CMSG_INSPECT = 0x3200C9, - CMSG_INSTANCE_LOCK_RESPONSE = 0x3200A6, - CMSG_ISLAND_QUEUE = 0x310261, - CMSG_ITEM_PURCHASE_REFUND = 0x3200D0, - CMSG_ITEM_TEXT_QUERY = 0x31020D, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x31008D, - CMSG_JOIN_RATED_BATTLEGROUND = 0x310025, - CMSG_KEEP_ALIVE = 0x3600A9, - CMSG_KEYBOUND_OVERRIDE = 0x3100E1, - CMSG_LATENCY_REPORT = 0x37000D, - CMSG_LEARN_PVP_TALENTS = 0x3200F9, - CMSG_LEARN_TALENTS = 0x3200F7, - CMSG_LEAVE_GROUP = 0x360073, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31008E, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x36003B, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x36003C, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x36003D, - CMSG_LFG_LIST_GET_STATUS = 0x360039, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x36003E, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x36003F, - CMSG_LFG_LIST_JOIN = 0x310255, - CMSG_LFG_LIST_LEAVE = 0x360038, - CMSG_LFG_LIST_SEARCH = 0x36003A, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x310256, - CMSG_LIST_INVENTORY = 0x320033, - CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x3600E4, - CMSG_LIVE_REGION_CHARACTER_COPY = 0x3600E3, - CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x3600E2, - CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x3600E5, - CMSG_LOADING_SCREEN_NOTIFY = 0x360024, - CMSG_LOAD_SELECTED_TROPHY = 0x3101EF, - CMSG_LOBBY_MATCHMAKER_ABANDON_QUEUE = 0x360170, - CMSG_LOBBY_MATCHMAKER_ACCEPT_PARTY_INVITE = 0x360167, - CMSG_LOBBY_MATCHMAKER_CREATE_CHARACTER = 0x360179, - CMSG_LOBBY_MATCHMAKER_ENTER_QUEUE = 0x36016E, - CMSG_LOBBY_MATCHMAKER_LEAVE_PARTY = 0x36016A, - CMSG_LOBBY_MATCHMAKER_PARTY_INVITE = 0x360166, - CMSG_LOBBY_MATCHMAKER_PARTY_UNINVITE = 0x360169, - CMSG_LOBBY_MATCHMAKER_QUEUE_PROPSAL_RESPONSE = 0x36016F, - CMSG_LOBBY_MATCHMAKER_REJECT_PARTY_INVITE = 0x360168, - CMSG_LOBBY_MATCHMAKER_SET_PARTY_PLAYLIST_ENTRY = 0x36016B, - CMSG_LOBBY_MATCHMAKER_SET_PLAYER_READY = 0x36016C, - CMSG_LOGOUT_CANCEL = 0x320072, - CMSG_LOGOUT_INSTANT = 0x320073, - CMSG_LOGOUT_LOBBY_MATCHMAKER = 0x320121, - CMSG_LOGOUT_REQUEST = 0x320071, - CMSG_LOG_DISCONNECT = 0x370005, - CMSG_LOG_STREAMING_ERROR = 0x370009, - CMSG_LOOT_ITEM = 0x3100C9, - CMSG_LOOT_MONEY = 0x3100C8, - CMSG_LOOT_RELEASE = 0x3100CD, - CMSG_LOOT_ROLL = 0x3100CE, - CMSG_LOOT_UNIT = 0x3100C7, - CMSG_LOW_LEVEL_RAID1 = 0x3600CC, - CMSG_LOW_LEVEL_RAID2 = 0x3200AD, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x3200DB, - CMSG_MAIL_DELETE = 0x3100E3, - CMSG_MAIL_GET_LIST = 0x3200D6, - CMSG_MAIL_MARK_AS_READ = 0x3200DA, - CMSG_MAIL_RETURN_TO_SENDER = 0x36007F, - CMSG_MAIL_TAKE_ITEM = 0x3200D8, - CMSG_MAIL_TAKE_MONEY = 0x3200D7, - CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x3100E4, - CMSG_MASTER_LOOT_ITEM = 0x3100CA, - CMSG_MERGE_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x320054, - CMSG_MERGE_GUILD_BANK_ITEM_WITH_ITEM = 0x320051, - CMSG_MERGE_ITEM_WITH_GUILD_BANK_ITEM = 0x32004F, - CMSG_MINIMAP_PING = 0x360075, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0x310036, - CMSG_MOUNT_CLEAR_FANFARE = 0x2B0003, - CMSG_MOUNT_SET_FAVORITE = 0x36005C, - CMSG_MOUNT_SPECIAL_ANIM = 0x310153, - CMSG_MOVE_ADD_IMPULSE_ACK = 0x34006D, - CMSG_MOVE_APPLY_INERTIA_ACK = 0x34006B, - CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x340031, - CMSG_MOVE_CHANGE_TRANSPORT = 0x34004C, - CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x340051, - CMSG_MOVE_COLLISION_DISABLE_ACK = 0x340056, - CMSG_MOVE_COLLISION_ENABLE_ACK = 0x340057, - CMSG_MOVE_DISMISS_VEHICLE = 0x340050, - CMSG_MOVE_DOUBLE_JUMP = 0x340007, - CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x34003A, - CMSG_MOVE_ENABLE_FULL_SPEED_TURNING_ACK = 0x340083, - CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x340040, - CMSG_MOVE_FALL_LAND = 0x340017, - CMSG_MOVE_FALL_RESET = 0x340035, - CMSG_MOVE_FEATHER_FALL_ACK = 0x340038, - CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x34004B, - CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x34004A, - CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x34004F, - CMSG_MOVE_FORCE_ROOT_ACK = 0x34002A, - CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x340028, - CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x340027, - CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x34003E, - CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x340029, - CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x34003F, - CMSG_MOVE_FORCE_UNROOT_ACK = 0x34002B, - CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x34003D, - CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x340052, - CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x340053, - CMSG_MOVE_GUILD_BANK_ITEM = 0x32004E, - CMSG_MOVE_HEARTBEAT = 0x34002C, - CMSG_MOVE_HOVER_ACK = 0x34002F, - CMSG_MOVE_INERTIA_DISABLE_ACK = 0x340054, - CMSG_MOVE_INERTIA_ENABLE_ACK = 0x340055, - CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE = 0x340063, - CMSG_MOVE_JUMP = 0x340006, - CMSG_MOVE_KNOCK_BACK_ACK = 0x34002E, - CMSG_MOVE_REMOVE_INERTIA_ACK = 0x34006C, - CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x340033, - CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x340032, - CMSG_MOVE_SET_ADV_FLY = 0x34006F, - CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK = 0x340077, - CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK = 0x340072, - CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK = 0x340078, - CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK = 0x340075, - CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK = 0x340076, - CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK = 0x34007F, - CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK = 0x340074, - CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK = 0x340073, - CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK = 0x34007D, - CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK = 0x340079, - CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK = 0x34007A, - CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK = 0x34007C, - CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK = 0x34007B, - CMSG_MOVE_SET_CAN_ADV_FLY_ACK = 0x34006E, - CMSG_MOVE_SET_CAN_DRIVE_ACK = 0x340070, - CMSG_MOVE_SET_CAN_FLY_ACK = 0x340043, - CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x340041, - CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x340058, - CMSG_MOVE_SET_FACING = 0x340025, - CMSG_MOVE_SET_FACING_HEARTBEAT = 0x34007E, - CMSG_MOVE_SET_FLY = 0x340045, - CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x340042, - CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x34005F, - CMSG_MOVE_SET_PITCH = 0x340026, - CMSG_MOVE_SET_RUN_MODE = 0x34000E, - CMSG_MOVE_SET_TURN_RATE_CHEAT = 0x340022, - CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x340030, - CMSG_MOVE_SET_WALK_MODE = 0x34000F, - CMSG_MOVE_SPLINE_DONE = 0x340034, - CMSG_MOVE_START_ASCEND = 0x340046, - CMSG_MOVE_START_BACKWARD = 0x340001, - CMSG_MOVE_START_DESCEND = 0x34004D, - CMSG_MOVE_START_DRIVE_FORWARD = 0x340071, - CMSG_MOVE_START_FORWARD = 0x340000, - CMSG_MOVE_START_PITCH_DOWN = 0x34000C, - CMSG_MOVE_START_PITCH_UP = 0x34000B, - CMSG_MOVE_START_STRAFE_LEFT = 0x340003, - CMSG_MOVE_START_STRAFE_RIGHT = 0x340004, - CMSG_MOVE_START_SWIM = 0x340018, - CMSG_MOVE_START_TURN_LEFT = 0x340008, - CMSG_MOVE_START_TURN_RIGHT = 0x340009, - CMSG_MOVE_STOP = 0x340002, - CMSG_MOVE_STOP_ASCEND = 0x340047, - CMSG_MOVE_STOP_PITCH = 0x34000D, - CMSG_MOVE_STOP_STRAFE = 0x340005, - CMSG_MOVE_STOP_SWIM = 0x340019, - CMSG_MOVE_STOP_TURN = 0x34000A, - CMSG_MOVE_TELEPORT_ACK = 0x340016, - CMSG_MOVE_TIME_SKIPPED = 0x340037, - CMSG_MOVE_UPDATE_FALL_SPEED = 0x340036, - CMSG_MOVE_WATER_WALK_ACK = 0x340039, - CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0x2E0001, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x310083, - CMSG_NEXT_CINEMATIC_CAMERA = 0x3200E4, - CMSG_OBJECT_UPDATE_FAILED = 0x31002C, - CMSG_OBJECT_UPDATE_RESCUED = 0x31002D, - CMSG_OFFER_PETITION = 0x310287, - CMSG_OPENING_CINEMATIC = 0x3200E3, - CMSG_OPEN_ITEM = 0x31020E, - CMSG_OPEN_MISSION_NPC = 0x3101CF, - CMSG_OPEN_SHIPMENT_NPC = 0x3101D7, - CMSG_OPEN_TRADESKILL_NPC = 0x3101E2, - CMSG_OPT_OUT_OF_LOOT = 0x320090, - CMSG_OVERRIDE_SCREEN_FLASH = 0x3200BA, - CMSG_PARTY_INVITE = 0x360030, - CMSG_PARTY_INVITE_RESPONSE = 0x360032, - CMSG_PARTY_UNINVITE = 0x360071, - CMSG_PERFORM_ITEM_INTERACTION = 0x3100EC, - CMSG_PERKS_PROGRAM_ITEMS_REFRESHED = 0x3102AF, - CMSG_PERKS_PROGRAM_REQUEST_CART_CHECKOUT = 0x3102B2, - CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = 0x2B0012, - CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0x3102B1, - CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0x3102B3, - CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0x3102B4, - CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0x3102B0, - CMSG_PETITION_BUY = 0x32005C, - CMSG_PETITION_RENAME_GUILD = 0x3600F5, - CMSG_PETITION_SHOW_LIST = 0x32005B, - CMSG_PETITION_SHOW_SIGNATURES = 0x32005D, - CMSG_PET_ABANDON = 0x32001E, - CMSG_PET_ABANDON_BY_NUMBER = 0x32001F, - CMSG_PET_ACTION = 0x32001C, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x310092, - CMSG_PET_BATTLE_INPUT = 0x36006B, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3100E2, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x310091, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x36006C, - CMSG_PET_BATTLE_REQUEST_PVP = 0x31008B, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31008C, - CMSG_PET_BATTLE_REQUEST_WILD = 0x310089, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x310093, - CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31008A, - CMSG_PET_CANCEL_AURA = 0x320020, - CMSG_PET_CAST_SPELL = 0x310172, - CMSG_PET_RENAME = 0x3600AE, - CMSG_PET_SET_ACTION = 0x32001B, - CMSG_PET_SPELL_AUTOCAST = 0x320021, - CMSG_PET_STOP_ATTACK = 0x32001D, - CMSG_PING = 0x370004, - CMSG_PLAYER_LOGIN = 0x360016, - CMSG_PUSH_QUEST_TO_PARTY = 0x320031, - CMSG_PVP_LOG_DATA = 0x310028, - CMSG_QUERY_BATTLE_PET_NAME = 0x310146, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x36008A, - CMSG_QUERY_CORPSE_TRANSPORT = 0x36008B, - CMSG_QUERY_COUNTDOWN_TIMER = 0x310055, - CMSG_QUERY_CREATURE = 0x310140, - CMSG_QUERY_GAME_OBJECT = 0x310141, - CMSG_QUERY_GARRISON_PET_NAME = 0x310147, - CMSG_QUERY_GUILD_INFO = 0x3600B4, - CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x32009A, - CMSG_QUERY_NEXT_MAIL_TIME = 0x3200D9, - CMSG_QUERY_NPC_TEXT = 0x310142, - CMSG_QUERY_PAGE_TEXT = 0x310144, - CMSG_QUERY_PETITION = 0x310148, - CMSG_QUERY_PET_NAME = 0x310145, - CMSG_QUERY_PLAYER_NAMES = 0x37000E, - CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY = 0x37000C, - CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID = 0x37000B, - CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x310021, - CMSG_QUERY_QUEST_INFO = 0x310143, - CMSG_QUERY_QUEST_ITEM_USABILITY = 0x310022, - CMSG_QUERY_REALM_NAME = 0x3600B3, - CMSG_QUERY_SCENARIO_POI = 0x360080, - CMSG_QUERY_SELECTED_WOW_LABS_AREA = 0x3102EB, - CMSG_QUERY_TIME = 0x320070, - CMSG_QUERY_TREASURE_PICKER = 0x310233, - CMSG_QUERY_VOID_STORAGE = 0x31004E, - CMSG_QUERY_WOW_LABS_AREA_INFO = 0x3102EC, - CMSG_QUEST_CONFIRM_ACCEPT = 0x320030, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x32002A, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x32002C, - CMSG_QUEST_GIVER_CLOSE_QUEST = 0x3200EA, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x32002B, - CMSG_QUEST_GIVER_HELLO = 0x320028, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x320029, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x32002D, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x32002F, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x32002E, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x3200CE, - CMSG_QUEST_POI_QUERY = 0x3600DB, - CMSG_QUEST_PUSH_RESULT = 0x320032, - CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x310279, - CMSG_QUEST_SESSION_REQUEST_START = 0x310278, - CMSG_QUEST_SESSION_REQUEST_STOP = 0x360156, - CMSG_QUEUED_MESSAGES_END = 0x370008, - CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x36012E, - CMSG_QUICK_JOIN_REQUEST_INVITE = 0x36012D, - CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x36015B, - CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x36012C, - CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x36012B, - CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x32009E, - CMSG_RAF_CLAIM_NEXT_REWARD = 0x36014C, - CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x36014E, - CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x36014D, - CMSG_RANDOM_ROLL = 0x36007E, - CMSG_READY_CHECK_RESPONSE = 0x36005F, - CMSG_READ_ITEM = 0x31020F, - CMSG_RECLAIM_CORPSE = 0x320075, - CMSG_REMOVE_NEW_ITEM = 0x310237, - CMSG_REMOVE_RAF_RECRUIT = 0x36014F, - CMSG_REORDER_CHARACTERS = 0x360015, - CMSG_REPAIR_ITEM = 0x320086, - CMSG_REPLACE_TROPHY = 0x3101F0, - CMSG_REPOP_REQUEST = 0x3200C6, - CMSG_REPORT_PVP_PLAYER_AFK = 0x32008E, - CMSG_REPORT_SERVER_LAG = 0x310271, - CMSG_REPORT_STUCK_IN_COMBAT = 0x310272, - CMSG_REQUEST_ACCOUNT_DATA = 0x3600C0, - CMSG_REQUEST_AREA_POI_UPDATE = 0x310235, - CMSG_REQUEST_BATTLEFIELD_STATUS = 0x360008, - CMSG_REQUEST_CEMETERY_LIST = 0x310023, - CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x3600B5, - CMSG_REQUEST_COVENANT_CALLINGS = 0x310263, - CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x3200CA, - CMSG_REQUEST_CURRENCY_DATA_FOR_ACCOUNT_CHARACTERS = 0x2B0019, - CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x31029C, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x310054, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x310053, - CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x310273, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x31017E, - CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x3100B7, - CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x3100B8, - CMSG_REQUEST_PARTY_ELIGIBILITY_FOR_DELVE_TIERS = 0x3102EA, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x360023, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x36007D, - CMSG_REQUEST_PET_INFO = 0x320022, - CMSG_REQUEST_PLAYED_TIME = 0x31014B, - CMSG_REQUEST_PVP_REWARDS = 0x310041, - CMSG_REQUEST_RAID_INFO = 0x3600F6, - CMSG_REQUEST_RATED_PVP_INFO = 0x36000F, - CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x360191, - CMSG_REQUEST_SCHEDULED_AREA_POI_UPDATE = 0x310236, - CMSG_REQUEST_SCHEDULED_PVP_INFO = 0x310042, - CMSG_REQUEST_STABLED_PETS = 0x320023, - CMSG_REQUEST_STORE_FRONT_INFO_UPDATE = 0x2B001E, - CMSG_REQUEST_VEHICLE_EXIT = 0x3100FE, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x310100, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3100FF, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x310101, - CMSG_REQUEST_WEEKLY_REWARDS = 0x310266, - CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x310234, - CMSG_RESET_CHALLENGE_MODE = 0x3100B5, - CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3100B6, - CMSG_RESET_INSTANCES = 0x360092, - CMSG_RESURRECT_RESPONSE = 0x3600AD, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x3101F2, - CMSG_RIDE_VEHICLE_INTERACT = 0x310102, - CMSG_RPE_RESET_CHARACTER = 0x36017C, - CMSG_SAVE_ACCOUNT_DATA_EXPORT = 0x360176, - CMSG_SAVE_CUF_PROFILES = 0x310037, - CMSG_SAVE_EQUIPMENT_SET = 0x3200A4, - CMSG_SAVE_GUILD_EMBLEM = 0x310183, - CMSG_SAVE_PERSONAL_EMBLEM = 0x310184, - CMSG_SCENE_PLAYBACK_CANCELED = 0x3100DE, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x3100DD, - CMSG_SCENE_TRIGGER_EVENT = 0x3100DF, - CMSG_SEAMLESS_TRANSFER_COMPLETE = 0x3102D9, - CMSG_SELECT_WOW_LABS_AREA = 0x3102ED, - CMSG_SELF_RES = 0x3200D1, - CMSG_SELL_ALL_JUNK_ITEMS = 0x320035, - CMSG_SELL_ITEM = 0x320034, - CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x360124, - CMSG_SEND_CONTACT_LIST = 0x3600FB, - CMSG_SEND_MAIL = 0x360026, - CMSG_SEND_PING_UNIT = 0x3102DB, - CMSG_SEND_PING_WORLD_POINT = 0x3102DC, - CMSG_SEND_TEXT_EMOTE = 0x320019, - CMSG_SERVER_TIME_OFFSET_REQUEST = 0x3600C7, - CMSG_SETUP_WARBAND_GROUPS = 0x36018A, - CMSG_SET_ACTION_BAR_TOGGLES = 0x3200D2, - CMSG_SET_ACTION_BUTTON = 0x360060, - CMSG_SET_ACTIVE_MOVER = 0x340059, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x310191, - CMSG_SET_ASSISTANT_LEADER = 0x360079, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x310212, - CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0x310213, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x310214, - CMSG_SET_CONTACT_NOTES = 0x3600FE, - CMSG_SET_CURRENCY_FLAGS = 0x310015, - CMSG_SET_DIFFICULTY_ID = 0x3100E0, - CMSG_SET_DUNGEON_DIFFICULTY = 0x3600AC, - CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = 0x31013A, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x360046, - CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES = 0x36012F, - CMSG_SET_FACTION_AT_WAR = 0x320078, - CMSG_SET_FACTION_INACTIVE = 0x32007A, - CMSG_SET_FACTION_NOT_AT_WAR = 0x320079, - CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x310065, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x310216, - CMSG_SET_LOOT_METHOD = 0x360072, - CMSG_SET_LOOT_SPECIALIZATION = 0x3200DF, - CMSG_SET_PARTY_ASSIGNMENT = 0x36007B, - CMSG_SET_PARTY_LEADER = 0x360074, - CMSG_SET_PET_FAVORITE = 0x310012, - CMSG_SET_PET_SLOT = 0x310011, - CMSG_SET_PET_SPECIALIZATION = 0x310013, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x3600B2, - CMSG_SET_PREFERRED_CEMETERY = 0x310024, - CMSG_SET_PVP = 0x310188, - CMSG_SET_RAID_DIFFICULTY = 0x360107, - CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = 0x360047, - CMSG_SET_ROLE = 0x360005, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3600B0, - CMSG_SET_SELECTION = 0x3200C8, - CMSG_SET_SHEATHED = 0x32001A, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x310215, - CMSG_SET_TAXI_BENCHMARK_MODE = 0x32008D, - CMSG_SET_TITLE = 0x310151, - CMSG_SET_TRADE_CURRENCY = 0x31000A, - CMSG_SET_TRADE_GOLD = 0x310009, - CMSG_SET_TRADE_ITEM = 0x310007, - CMSG_SET_USING_PARTY_GARRISON = 0x3101D1, - CMSG_SET_WAR_MODE = 0x310189, - CMSG_SET_WATCHED_FACTION = 0x32007B, - CMSG_SHOW_TRADE_SKILL = 0x3600EE, - CMSG_SIGN_PETITION = 0x3200D3, - CMSG_SILENCE_PARTY_TALKER = 0x36007C, - CMSG_SOCIAL_CONTRACT_REQUEST = 0x360171, - CMSG_SOCKET_GEMS = 0x320085, - CMSG_SORT_ACCOUNT_BANK_BAGS = 0x3102DF, - CMSG_SORT_BAGS = 0x310217, - CMSG_SORT_BANK_BAGS = 0x310218, - CMSG_SORT_REAGENT_BANK_BAGS = 0x310219, - CMSG_SPAWN_TRACKING_UPDATE = 0x310166, - CMSG_SPECTATE_CHANGE = 0x3102D2, - CMSG_SPELL_CLICK = 0x320027, - CMSG_SPELL_EMPOWER_RELEASE = 0x310138, - CMSG_SPELL_EMPOWER_RESTART = 0x310139, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x320042, - CMSG_SPLIT_GUILD_BANK_ITEM = 0x320055, - CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY = 0x320052, - CMSG_SPLIT_ITEM = 0x33000A, - CMSG_SPLIT_ITEM_TO_GUILD_BANK = 0x320050, - CMSG_STAND_STATE_CHANGE = 0x310035, - CMSG_START_CHALLENGE_MODE = 0x3200EB, - CMSG_START_SPECTATOR_WAR_GAME = 0x36000B, - CMSG_START_WAR_GAME = 0x36000A, - CMSG_STORE_GUILD_BANK_ITEM = 0x32004B, - CMSG_SUBMIT_USER_FEEDBACK = 0x3600BF, - CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x310291, - CMSG_SUMMON_RESPONSE = 0x360094, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x360070, - CMSG_SURRENDER_ARENA = 0x310020, - CMSG_SUSPEND_COMMS_ACK = 0x370000, - CMSG_SUSPEND_TOKEN_RESPONSE = 0x370006, - CMSG_SWAP_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x32004D, - CMSG_SWAP_INV_ITEM = 0x330009, - CMSG_SWAP_ITEM = 0x330008, - CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM = 0x32004C, - CMSG_SWAP_SUB_GROUPS = 0x360077, - CMSG_SWAP_VOID_ITEM = 0x310050, - CMSG_TABARD_VENDOR_ACTIVATE = 0x310185, - CMSG_TALK_TO_GOSSIP = 0x320024, - CMSG_TAXI_NODE_STATUS_QUERY = 0x32003B, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x32003D, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x32003F, - CMSG_TIME_ADJUSTMENT_RESPONSE = 0x34005D, - CMSG_TIME_SYNC_RESPONSE = 0x34005A, - CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x34005C, - CMSG_TIME_SYNC_RESPONSE_FAILED = 0x34005B, - CMSG_TOGGLE_DIFFICULTY = 0x360081, - CMSG_TOGGLE_PVP = 0x310187, - CMSG_TOTEM_DESTROYED = 0x320092, - CMSG_TOY_CLEAR_FANFARE = 0x2B0004, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x310232, - CMSG_TRAINER_BUY_SPELL = 0x320041, - CMSG_TRAINER_LIST = 0x320040, - CMSG_TRAITS_COMMIT_CONFIG = 0x3102BA, - CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x3102B8, - CMSG_TRANSFER_CURRENCY_FROM_ACCOUNT_CHARACTER = 0x3102E8, - CMSG_TRANSMOGRIFY_ITEMS = 0x310043, - CMSG_TURN_IN_PETITION = 0x3200D5, - CMSG_TUTORIAL = 0x360108, - CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x310262, - CMSG_UNACCEPT_TRADE = 0x310005, - CMSG_UNDELETE_CHARACTER = 0x36010A, - CMSG_UNLEARN_SKILL = 0x32007F, - CMSG_UNLEARN_SPECIALIZATION = 0x310051, - CMSG_UNLOCK_VOID_STORAGE = 0x31004D, - CMSG_UPDATE_AADC_STATUS = 0x360161, - CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS = 0x320128, - CMSG_UPDATE_ACCOUNT_DATA = 0x3600C1, - CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x310175, - CMSG_UPDATE_CLIENT_SETTINGS = 0x36008E, - CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x3101E3, - CMSG_UPDATE_MISSILE_TRAJECTORY = 0x340060, - CMSG_UPDATE_RAID_TARGET = 0x36007A, - CMSG_UPDATE_SPELL_VISUAL = 0x310174, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36011F, - CMSG_UPGRADE_GARRISON = 0x310199, - CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x31028F, - CMSG_USED_FOLLOW = 0x310032, - CMSG_USE_CRITTER_ITEM = 0x310108, - CMSG_USE_EQUIPMENT_SET = 0x330001, - CMSG_USE_ITEM = 0x31016E, - CMSG_USE_TOY = 0x310171, - CMSG_VAS_CHECK_TRANSFER_OK = 0x360134, - CMSG_VAS_GET_QUEUE_MINUTES = 0x360133, - CMSG_VAS_GET_SERVICE_STATUS = 0x360132, - CMSG_VIOLENCE_LEVEL = 0x310030, - CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST = 0x360138, - CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x360139, - CMSG_VOICE_CHAT_LOGIN = 0x360137, - CMSG_VOID_STORAGE_TRANSFER = 0x31004F, - CMSG_WARDEN3_DATA = 0x360018, - CMSG_WHO = 0x3600AB, - CMSG_WHO_IS = 0x3600AA, - CMSG_WORLD_LOOT_OBJECT_CLICK = 0x3102D5, - CMSG_WORLD_PORT_RESPONSE = 0x360025, - CMSG_WRAP_ITEM = 0x330000, + CMSG_ABANDON_NPE_RESPONSE = 0x2F0299, + CMSG_ACCEPT_GUILD_INVITE = 0x340029, + CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x2F025A, + CMSG_ACCEPT_SOCIAL_CONTRACT = 0x340174, + CMSG_ACCEPT_TRADE = 0x2F0004, + CMSG_ACCEPT_WARGAME_INVITE = 0x34000C, + CMSG_ACCOUNT_BANK_DEPOSIT_MONEY = 0x2F02DC, + CMSG_ACCOUNT_BANK_WITHDRAW_MONEY = 0x2F02DD, + CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x340160, + CMSG_ACCOUNT_STORE_BEGIN_PURCHASE_OR_REFUND = 0x3400C0, + CMSG_ACTIVATE_SOULBIND = 0x2F0288, + CMSG_ACTIVATE_TAXI = 0x30003E, + CMSG_ADDON_LIST = 0x340004, + CMSG_ADD_ACCOUNT_COSMETIC = 0x2F0171, + CMSG_ADD_BATTLENET_FRIEND = 0x340086, + CMSG_ADD_FRIEND = 0x3400FE, + CMSG_ADD_IGNORE = 0x340102, + CMSG_ADD_TOY = 0x2F0170, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x2F00B3, + CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x2F028B, + CMSG_ADVENTURE_MAP_START_QUEST = 0x2F022B, + CMSG_ALTER_APPEARANCE = 0x30008D, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x300043, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x300044, + CMSG_AREA_TRIGGER = 0x2F0086, + CMSG_ARTIFACT_ADD_POWER = 0x2F0056, + CMSG_ARTIFACT_SET_APPEARANCE = 0x2F0058, + CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x2F00BF, + CMSG_ATTACK_STOP = 0x2F011D, + CMSG_ATTACK_SWING = 0x2F011C, + CMSG_AUCTIONABLE_TOKEN_SELL = 0x340114, + CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x340115, + CMSG_AUCTION_BROWSE_QUERY = 0x300061, + CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x300069, + CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x300068, + CMSG_AUCTION_GET_COMMODITY_QUOTE = 0x300067, + CMSG_AUCTION_HELLO_REQUEST = 0x30005C, + CMSG_AUCTION_LIST_BIDDED_ITEMS = 0x300065, + CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0x300066, + CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0x300062, + CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0x300063, + CMSG_AUCTION_LIST_OWNED_ITEMS = 0x300064, + CMSG_AUCTION_PLACE_BID = 0x300060, + CMSG_AUCTION_REMOVE_ITEM = 0x30005E, + CMSG_AUCTION_REPLICATE_ITEMS = 0x30005F, + CMSG_AUCTION_SELL_COMMODITY = 0x30006A, + CMSG_AUCTION_SELL_ITEM = 0x30005D, + CMSG_AUCTION_SET_FAVORITE_ITEM = 0x340161, + CMSG_AUTH_CONTINUED_SESSION = 0x350002, + CMSG_AUTH_SESSION = 0x350001, + CMSG_AUTOBANK_ITEM = 0x310003, + CMSG_AUTOSTORE_BANK_ITEM = 0x310002, + CMSG_AUTO_DEPOSIT_ACCOUNT_BANK = 0x2F02E6, + CMSG_AUTO_DEPOSIT_CHARACTER_BANK = 0x2F02EE, + CMSG_AUTO_EQUIP_ITEM = 0x310004, + CMSG_AUTO_EQUIP_ITEM_SLOT = 0x310009, + CMSG_AUTO_GUILD_BANK_ITEM = 0x300048, + CMSG_AUTO_STORE_BAG_ITEM = 0x310005, + CMSG_AUTO_STORE_GUILD_BANK_ITEM = 0x300051, + CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x2F0256, + CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x2F0237, + CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x2F0258, + CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x2F0257, + CMSG_BANKER_ACTIVATE = 0x300046, + CMSG_BATTLEFIELD_LEAVE = 0x2F001F, + CMSG_BATTLEFIELD_LIST = 0x2F002A, + CMSG_BATTLEFIELD_PORT = 0x3000C3, + CMSG_BATTLEMASTER_HELLO = 0x2F018F, + CMSG_BATTLEMASTER_JOIN = 0x3000BA, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x3000BB, + CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3000C1, + CMSG_BATTLEMASTER_JOIN_RATED_BG_BLITZ = 0x3000BD, + CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = 0x3000BC, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3000BE, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x340101, + CMSG_BATTLENET_REQUEST = 0x340122, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x3400FB, + CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x34013E, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x3400FA, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x3400F1, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS = 0x340164, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x3400E8, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x3400E9, + CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x340137, + CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x340133, + CMSG_BATTLE_PAY_START_PURCHASE = 0x3400F9, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x340120, + CMSG_BATTLE_PET_CLEAR_FANFARE = 0x290002, + CMSG_BATTLE_PET_DELETE_PET = 0x34004F, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x340050, + CMSG_BATTLE_PET_MODIFY_NAME = 0x340052, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x34004E, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x34004D, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x340057, + CMSG_BATTLE_PET_SET_FLAGS = 0x34005A, + CMSG_BATTLE_PET_SUMMON = 0x340053, + CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x2F0090, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x2F008F, + CMSG_BEGIN_TRADE = 0x2F0001, + CMSG_BINDER_ACTIVATE = 0x300045, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3000CB, + CMSG_BLACK_MARKET_OPEN = 0x3000C9, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3000CA, + CMSG_BONUS_ROLL = 0x2F0259, + CMSG_BUG_REPORT = 0x3400B1, + CMSG_BUSY_TRADE = 0x2F0002, + CMSG_BUY_ACCOUNT_BANK_TAB = 0x300123, + CMSG_BUY_BACK_ITEM = 0x300037, + CMSG_BUY_ITEM = 0x300036, + CMSG_CAGE_BATTLE_PET = 0x2F00A3, + CMSG_CALENDAR_ADD_EVENT = 0x3400A9, + CMSG_CALENDAR_COMMUNITY_INVITE = 0x34009D, + CMSG_CALENDAR_COMPLAIN = 0x3400A5, + CMSG_CALENDAR_COPY_EVENT = 0x3400A4, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x3400A7, + CMSG_CALENDAR_GET = 0x34009B, + CMSG_CALENDAR_GET_EVENT = 0x34009C, + CMSG_CALENDAR_GET_NUM_PENDING = 0x3400A6, + CMSG_CALENDAR_INVITE = 0x34009E, + CMSG_CALENDAR_MODERATOR_STATUS = 0x3400A2, + CMSG_CALENDAR_REMOVE_EVENT = 0x3400A3, + CMSG_CALENDAR_REMOVE_INVITE = 0x34009F, + CMSG_CALENDAR_RSVP = 0x3400A0, + CMSG_CALENDAR_STATUS = 0x3400A1, + CMSG_CALENDAR_UPDATE_EVENT = 0x3400AA, + CMSG_CANCEL_AURA = 0x2F005A, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x30007F, + CMSG_CANCEL_CAST = 0x2F0177, + CMSG_CANCEL_CHANNELLING = 0x2F0138, + CMSG_CANCEL_GROWTH_AURA = 0x2F0140, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x2F00CC, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x2F0059, + CMSG_CANCEL_MOUNT_AURA = 0x2F0153, + CMSG_CANCEL_QUEUED_SPELL = 0x2F002B, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x30008A, + CMSG_CANCEL_TRADE = 0x2F0006, + CMSG_CAN_DUEL = 0x34008E, + CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x340132, + CMSG_CAST_SPELL = 0x2F0174, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x2C0002, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x2F0211, + CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x2F0212, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x2F01F2, + CMSG_CHANGE_REALM_TICKET = 0x340127, + CMSG_CHANGE_SUB_GROUP = 0x340078, + CMSG_CHARACTER_CHECK_UPGRADE = 0x3400F4, + CMSG_CHARACTER_RENAME_REQUEST = 0x3400EF, + CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x3400F2, + CMSG_CHARACTER_UPGRADE_START = 0x3400F3, + CMSG_CHAR_CUSTOMIZE = 0x3400B8, + CMSG_CHAR_DELETE = 0x3400CA, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3400BE, + CMSG_CHAT_ADDON_MESSAGE = 0x2B002A, + CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x2B002B, + CMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_REQUEST = 0x2B0032, + CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x2B001F, + CMSG_CHAT_CHANNEL_BAN = 0x2B001D, + CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x2B0022, + CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x2B0012, + CMSG_CHAT_CHANNEL_INVITE = 0x2B001B, + CMSG_CHAT_CHANNEL_KICK = 0x2B001C, + CMSG_CHAT_CHANNEL_LIST = 0x2B0011, + CMSG_CHAT_CHANNEL_MODERATE = 0x2B0016, + CMSG_CHAT_CHANNEL_MODERATOR = 0x2B0017, + CMSG_CHAT_CHANNEL_OWNER = 0x2B0015, + CMSG_CHAT_CHANNEL_PASSWORD = 0x2B0013, + CMSG_CHAT_CHANNEL_SET_OWNER = 0x2B0014, + CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x2B0020, + CMSG_CHAT_CHANNEL_UNBAN = 0x2B001E, + CMSG_CHAT_CHANNEL_UNMODERATOR = 0x2B0018, + CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x2B0021, + CMSG_CHAT_DROP_CAUTIONARY_CHAT_MESSAGE = 0x2B000A, + CMSG_CHAT_JOIN_CHANNEL = 0x2B0000, + CMSG_CHAT_LEAVE_CHANNEL = 0x2B0001, + CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_INSTANCE_CHAT = 0x2B0031, + CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_PARTY = 0x2B0030, + CMSG_CHAT_MESSAGE_AFK = 0x2B000F, + CMSG_CHAT_MESSAGE_CHANNEL = 0x2B0007, + CMSG_CHAT_MESSAGE_DND = 0x2B0010, + CMSG_CHAT_MESSAGE_EMOTE = 0x2B0024, + CMSG_CHAT_MESSAGE_GUILD = 0x2B000D, + CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x2B0028, + CMSG_CHAT_MESSAGE_OFFICER = 0x2B000E, + CMSG_CHAT_MESSAGE_PARTY = 0x2B0026, + CMSG_CHAT_MESSAGE_RAID = 0x2B0027, + CMSG_CHAT_MESSAGE_RAID_WARNING = 0x2B0029, + CMSG_CHAT_MESSAGE_SAY = 0x2B0023, + CMSG_CHAT_MESSAGE_WHISPER = 0x2B0008, + CMSG_CHAT_MESSAGE_YELL = 0x2B0025, + CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x2B0005, + CMSG_CHAT_REPORT_FILTERED = 0x2B0004, + CMSG_CHAT_REPORT_IGNORED = 0x2B0003, + CMSG_CHAT_SEND_CAUTIONARY_CHANNEL_MESSAGE = 0x2B000B, + CMSG_CHAT_SEND_CAUTIONARY_CHAT_MESSAGE = 0x2B0009, + CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x2B0006, + CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x340071, + CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x2F010E, + CMSG_CHOICE_RESPONSE = 0x2F017C, + CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x2F0287, + CMSG_CLAIM_WEEKLY_REWARD = 0x2F0264, + CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x2F02C1, + CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0x2F00C3, + CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x2F02C3, + CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x2F02C0, + CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x2F02BF, + CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x2F02C4, + CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0x2F00C2, + CMSG_CLEAR_NEW_APPEARANCE = 0x290005, + CMSG_CLEAR_RAID_MARKER = 0x2F0052, + CMSG_CLEAR_TRADE_ITEM = 0x2F0008, + CMSG_CLIENT_PORT_GRAVEYARD = 0x3000C5, + CMSG_CLOSE_INTERACTION = 0x300025, + CMSG_CLOSE_QUEST_CHOICE = 0x2F017D, + CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x2F028F, + CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x2F02C5, + CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x340149, + CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x340147, + CMSG_CLUB_FINDER_POST = 0x340144, + CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x34014B, + CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x340145, + CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x340146, + CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x34014A, + CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x34014C, + CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x340148, + CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST = 0x340167, + CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x340124, + CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x34005D, + CMSG_COMMENTATOR_ENABLE = 0x34001C, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x340020, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x340021, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x34001D, + CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x34001F, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x34001E, + CMSG_COMMENTATOR_SPECTATE = 0x340165, + CMSG_COMMENTATOR_START_WARGAME = 0x34001B, + CMSG_COMMERCE_TOKEN_GET_COUNT = 0x340112, + CMSG_COMMERCE_TOKEN_GET_LOG = 0x34011C, + CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x340113, + CMSG_COMPLAINT = 0x340098, + CMSG_COMPLETE_CINEMATIC = 0x3000E3, + CMSG_COMPLETE_MOVIE = 0x300075, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x2F0057, + CMSG_CONFIRM_PROFESSION_RESPEC = 0x2F00C6, + CMSG_CONFIRM_RESPEC_WIPE = 0x2F00C5, + CMSG_CONNECT_TO_FAILED = 0x340000, + CMSG_CONSUMABLE_TOKEN_BUY = 0x340117, + CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x340118, + CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x340116, + CMSG_CONSUMABLE_TOKEN_REDEEM = 0x34011A, + CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x34011B, + CMSG_CONTENT_TRACKING_START_TRACKING = 0x2F02D5, + CMSG_CONTENT_TRACKING_STOP_TRACKING = 0x2F02D6, + CMSG_CONTRIBUTION_CONTRIBUTE = 0x3000FB, + CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x3000FC, + CMSG_CONVERSATION_CINEMATIC_READY = 0x3000E5, + CMSG_CONVERSATION_LINE_STARTED = 0x3000E4, + CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT = 0x2F02E5, + CMSG_CONVERT_RAID = 0x34007A, + CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x30010F, + CMSG_CRAFTING_ORDER_CANCEL = 0x30011B, + CMSG_CRAFTING_ORDER_CLAIM = 0x300118, + CMSG_CRAFTING_ORDER_CREATE = 0x300114, + CMSG_CRAFTING_ORDER_FULFILL = 0x30011A, + CMSG_CRAFTING_ORDER_GET_NPC_REWARD_INFO = 0x300117, + CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x300116, + CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x300115, + CMSG_CRAFTING_ORDER_REJECT = 0x30011C, + CMSG_CRAFTING_ORDER_RELEASE = 0x300119, + CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0x30011D, + CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x30011E, + CMSG_CREATE_CHARACTER = 0x340070, + CMSG_CREATE_SHIPMENT = 0x2F01DB, + CMSG_DB_QUERY_BULK = 0x340010, + CMSG_DECLINE_GUILD_INVITES = 0x3000B7, + CMSG_DECLINE_PETITION = 0x3000D2, + CMSG_DELETE_EQUIPMENT_SET = 0x3000A3, + CMSG_DELVE_TELEPORT_OUT = 0x30012B, + CMSG_DEL_FRIEND = 0x3400FF, + CMSG_DEL_IGNORE = 0x340103, + CMSG_DESTROY_ITEM = 0x2F016A, + CMSG_DF_BOOT_PLAYER_VOTE = 0x340044, + CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x340036, + CMSG_DF_GET_JOIN_STATUS = 0x340042, + CMSG_DF_GET_SYSTEM_INFO = 0x340041, + CMSG_DF_JOIN = 0x340037, + CMSG_DF_LEAVE = 0x340040, + CMSG_DF_PROPOSAL_RESPONSE = 0x340035, + CMSG_DF_READY_CHECK_RESPONSE = 0x340048, + CMSG_DF_SET_ROLES = 0x340043, + CMSG_DF_TELEPORT = 0x340045, + CMSG_DISCARDED_TIME_SYNC_ACKS = 0x32005E, + CMSG_DISMISS_CRITTER = 0x300091, + CMSG_DO_COUNTDOWN = 0x340143, + CMSG_DO_MASTER_LOOT_ROLL = 0x2F00CB, + CMSG_DO_READY_CHECK = 0x34005E, + CMSG_DUEL_RESPONSE = 0x30007A, + CMSG_EJECT_PASSENGER = 0x2F0103, + CMSG_EMOTE = 0x3000DF, + CMSG_ENABLE_NAGLE = 0x350007, + CMSG_ENABLE_TAXI_NODE = 0x30003C, + CMSG_ENGINE_SURVEY = 0x340111, + CMSG_ENTER_ENCRYPTED_MODE_ACK = 0x350003, + CMSG_ENUM_CHARACTERS = 0x340014, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x34010B, + CMSG_FAR_SIGHT = 0x300080, + CMSG_GAME_EVENT_DEBUG_DISABLE = 0x2F005E, + CMSG_GAME_EVENT_DEBUG_ENABLE = 0x2F005D, + CMSG_GAME_OBJ_REPORT_USE = 0x300087, + CMSG_GAME_OBJ_USE = 0x300086, + CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x2F01D6, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x2F01BC, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x2F01A9, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x2F020D, + CMSG_GARRISON_COMPLETE_MISSION = 0x2F01FF, + CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x2F01D7, + CMSG_GARRISON_GENERATE_RECRUITS = 0x2F01BF, + CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x2F01CE, + CMSG_GARRISON_GET_MAP_DATA = 0x2F01D5, + CMSG_GARRISON_GET_MISSION_REWARD = 0x2F022F, + CMSG_GARRISON_LEARN_TALENT = 0x2F01CA, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x2F0201, + CMSG_GARRISON_PURCHASE_BUILDING = 0x2F01A5, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x2F01C1, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x2F01F6, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x2F01BD, + CMSG_GARRISON_RENAME_FOLLOWER = 0x2F01BE, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x2F01A4, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x2F01D9, + CMSG_GARRISON_RESEARCH_TALENT = 0x2F01C2, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x2F01A6, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x2F01BA, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x2F01B2, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x2F01C0, + CMSG_GARRISON_SOCKET_TALENT = 0x2F029C, + CMSG_GARRISON_START_MISSION = 0x2F01FE, + CMSG_GARRISON_SWAP_BUILDINGS = 0x2F01AA, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x340013, + CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x3400E3, + CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x34015F, + CMSG_GET_GARRISON_INFO = 0x2F019F, + CMSG_GET_ITEM_PURCHASE_DATA = 0x3000CD, + CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x2F01DA, + CMSG_GET_MIRROR_IMAGE_DATA = 0x2F016E, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x34001A, + CMSG_GET_RAF_ACCOUNT_INFO = 0x34014D, + CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA = 0x340190, + CMSG_GET_REMAINING_GAME_TIME = 0x340119, + CMSG_GET_TROPHY_LIST = 0x2F01EF, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x34010D, + CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x34011E, + CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x34011F, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3400BC, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x3400BB, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3400BA, + CMSG_GOSSIP_REFRESH_OPTIONS = 0x30010E, + CMSG_GOSSIP_SELECT_OPTION = 0x300026, + CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x2D0020, + CMSG_GUILD_ADD_RANK = 0x2D0005, + CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x2D0002, + CMSG_GUILD_BANK_ACTIVATE = 0x300047, + CMSG_GUILD_BANK_BUY_TAB = 0x300055, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x300057, + CMSG_GUILD_BANK_LOG_QUERY = 0x2D0019, + CMSG_GUILD_BANK_QUERY_TAB = 0x300054, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x2D001A, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x2D001D, + CMSG_GUILD_BANK_TEXT_QUERY = 0x2D001E, + CMSG_GUILD_BANK_UPDATE_TAB = 0x300056, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x300058, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x2D0017, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x2D0018, + CMSG_GUILD_DECLINE_INVITATION = 0x34002A, + CMSG_GUILD_DELETE = 0x2D0009, + CMSG_GUILD_DELETE_RANK = 0x2D0006, + CMSG_GUILD_DEMOTE_MEMBER = 0x2D0001, + CMSG_GUILD_EVENT_LOG_QUERY = 0x2D001C, + CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x2D0012, + CMSG_GUILD_GET_RANKS = 0x2D000E, + CMSG_GUILD_GET_ROSTER = 0x2D0014, + CMSG_GUILD_INVITE_BY_NAME = 0x340034, + CMSG_GUILD_LEAVE = 0x2D0003, + CMSG_GUILD_NEWS_UPDATE_STICKY = 0x2D000F, + CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x2D0004, + CMSG_GUILD_PERMISSIONS_QUERY = 0x2D001B, + CMSG_GUILD_PROMOTE_MEMBER = 0x2D0000, + CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x2D000C, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x2D000A, + CMSG_GUILD_QUERY_NEWS = 0x2D000D, + CMSG_GUILD_QUERY_RECIPES = 0x2D000B, + CMSG_GUILD_REPLACE_GUILD_MASTER = 0x2D001F, + CMSG_GUILD_REQUEST_RENAME = 0x2D0023, + CMSG_GUILD_REQUEST_RENAME_NAME_CHECK = 0x2D0022, + CMSG_GUILD_REQUEST_RENAME_REFUND = 0x2D0024, + CMSG_GUILD_REQUEST_RENAME_STATUS = 0x2D0021, + CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x2D0010, + CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x2D0011, + CMSG_GUILD_SET_GUILD_MASTER = 0x3400F6, + CMSG_GUILD_SET_MEMBER_NOTE = 0x2D0013, + CMSG_GUILD_SET_RANK_PERMISSIONS = 0x2D0008, + CMSG_GUILD_SHIFT_RANK = 0x2D0007, + CMSG_GUILD_UPDATE_INFO_TEXT = 0x2D0016, + CMSG_GUILD_UPDATE_MOTD_TEXT = 0x2D0015, + CMSG_HEARTH_AND_RESURRECT = 0x30009F, + CMSG_HIDE_QUEST_CHOICE = 0x2F017E, + CMSG_HOTFIX_REQUEST = 0x340011, + CMSG_IGNORE_TRADE = 0x2F0003, + CMSG_INITIATE_ROLE_POLL = 0x340006, + CMSG_INITIATE_TRADE = 0x2F0000, + CMSG_INSPECT = 0x3000C7, + CMSG_INSTANCE_ABANDON_VOTE_RESPONSE = 0x340061, + CMSG_INSTANCE_LOCK_RESPONSE = 0x3000A4, + CMSG_ISLAND_QUEUE = 0x2F0260, + CMSG_ITEM_PURCHASE_REFUND = 0x3000CE, + CMSG_ITEM_TEXT_QUERY = 0x2F020E, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x2F008D, + CMSG_JOIN_RATED_BATTLEGROUND = 0x2F0025, + CMSG_KEEP_ALIVE = 0x3400AB, + CMSG_KEYBOUND_OVERRIDE = 0x2F00E1, + CMSG_LATENCY_REPORT = 0x35000D, + CMSG_LEARN_PVP_TALENTS = 0x3000FA, + CMSG_LEARN_TALENTS = 0x3000F8, + CMSG_LEAVE_GROUP = 0x340075, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x2F008E, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x34003B, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x34003C, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x34003D, + CMSG_LFG_LIST_GET_STATUS = 0x340039, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x34003E, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x34003F, + CMSG_LFG_LIST_JOIN = 0x2F0254, + CMSG_LFG_LIST_LEAVE = 0x340038, + CMSG_LFG_LIST_SEARCH = 0x34003A, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x2F0255, + CMSG_LIST_INVENTORY = 0x300033, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x3400E6, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x3400E5, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x3400E4, + CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x3400E7, + CMSG_LOADING_SCREEN_NOTIFY = 0x340024, + CMSG_LOAD_SELECTED_TROPHY = 0x2F01F0, + CMSG_LOBBY_MATCHMAKER_ABANDON_QUEUE = 0x340172, + CMSG_LOBBY_MATCHMAKER_ACCEPT_PARTY_INVITE = 0x340169, + CMSG_LOBBY_MATCHMAKER_CREATE_CHARACTER = 0x34017B, + CMSG_LOBBY_MATCHMAKER_ENTER_QUEUE = 0x340170, + CMSG_LOBBY_MATCHMAKER_LEAVE_PARTY = 0x34016C, + CMSG_LOBBY_MATCHMAKER_PARTY_INVITE = 0x340168, + CMSG_LOBBY_MATCHMAKER_PARTY_UNINVITE = 0x34016B, + CMSG_LOBBY_MATCHMAKER_QUEUE_PROPSAL_RESPONSE = 0x340171, + CMSG_LOBBY_MATCHMAKER_REJECT_PARTY_INVITE = 0x34016A, + CMSG_LOBBY_MATCHMAKER_SET_PARTY_PLAYLIST_ENTRY = 0x34016D, + CMSG_LOBBY_MATCHMAKER_SET_PLAYER_READY = 0x34016E, + CMSG_LOGOUT_CANCEL = 0x300070, + CMSG_LOGOUT_INSTANT = 0x300071, + CMSG_LOGOUT_LOBBY_MATCHMAKER = 0x300122, + CMSG_LOGOUT_REQUEST = 0x30006F, + CMSG_LOG_DISCONNECT = 0x350005, + CMSG_LOG_STREAMING_ERROR = 0x350009, + CMSG_LOOT_ITEM = 0x2F00C9, + CMSG_LOOT_MONEY = 0x2F00C8, + CMSG_LOOT_RELEASE = 0x2F00CD, + CMSG_LOOT_ROLL = 0x2F00CE, + CMSG_LOOT_UNIT = 0x2F00C7, + CMSG_LOW_LEVEL_RAID1 = 0x3400CE, + CMSG_LOW_LEVEL_RAID2 = 0x3000AB, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x3000D9, + CMSG_MAIL_DELETE = 0x2F00E3, + CMSG_MAIL_GET_LIST = 0x3000D4, + CMSG_MAIL_MARK_AS_READ = 0x3000D8, + CMSG_MAIL_RETURN_TO_SENDER = 0x340081, + CMSG_MAIL_TAKE_ITEM = 0x3000D6, + CMSG_MAIL_TAKE_MONEY = 0x3000D5, + CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x2F00E4, + CMSG_MASTER_LOOT_ITEM = 0x2F00CA, + CMSG_MERGE_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x300052, + CMSG_MERGE_GUILD_BANK_ITEM_WITH_ITEM = 0x30004F, + CMSG_MERGE_ITEM_WITH_GUILD_BANK_ITEM = 0x30004D, + CMSG_MINIMAP_PING = 0x340077, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x2F0036, + CMSG_MOUNT_CLEAR_FANFARE = 0x290003, + CMSG_MOUNT_SET_FAVORITE = 0x34005C, + CMSG_MOUNT_SPECIAL_ANIM = 0x2F0154, + CMSG_MOVE_ADD_IMPULSE_ACK = 0x32006D, + CMSG_MOVE_APPLY_INERTIA_ACK = 0x32006B, + CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x320031, + CMSG_MOVE_CHANGE_TRANSPORT = 0x32004C, + CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x320051, + CMSG_MOVE_COLLISION_DISABLE_ACK = 0x320056, + CMSG_MOVE_COLLISION_ENABLE_ACK = 0x320057, + CMSG_MOVE_DISMISS_VEHICLE = 0x320050, + CMSG_MOVE_DOUBLE_JUMP = 0x320007, + CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x32003A, + CMSG_MOVE_ENABLE_FULL_SPEED_TURNING_ACK = 0x320083, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x320040, + CMSG_MOVE_FALL_LAND = 0x320017, + CMSG_MOVE_FALL_RESET = 0x320035, + CMSG_MOVE_FEATHER_FALL_ACK = 0x320038, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x32004B, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x32004A, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x32004F, + CMSG_MOVE_FORCE_ROOT_ACK = 0x32002A, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x320028, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x320027, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x32003E, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x320029, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x32003F, + CMSG_MOVE_FORCE_UNROOT_ACK = 0x32002B, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x32003D, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x320052, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x320053, + CMSG_MOVE_GUILD_BANK_ITEM = 0x30004C, + CMSG_MOVE_HEARTBEAT = 0x32002C, + CMSG_MOVE_HOVER_ACK = 0x32002F, + CMSG_MOVE_INERTIA_DISABLE_ACK = 0x320054, + CMSG_MOVE_INERTIA_ENABLE_ACK = 0x320055, + CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE = 0x320063, + CMSG_MOVE_JUMP = 0x320006, + CMSG_MOVE_KNOCK_BACK_ACK = 0x32002E, + CMSG_MOVE_REMOVE_INERTIA_ACK = 0x32006C, + CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x320033, + CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x320032, + CMSG_MOVE_SET_ADV_FLY = 0x32006F, + CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK = 0x320077, + CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK = 0x320072, + CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK = 0x320078, + CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK = 0x320075, + CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK = 0x320076, + CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK = 0x32007F, + CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK = 0x320074, + CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK = 0x320073, + CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK = 0x32007D, + CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK = 0x320079, + CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK = 0x32007A, + CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK = 0x32007C, + CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK = 0x32007B, + CMSG_MOVE_SET_CAN_ADV_FLY_ACK = 0x32006E, + CMSG_MOVE_SET_CAN_DRIVE_ACK = 0x320070, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x320043, + CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x320041, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x320058, + CMSG_MOVE_SET_FACING = 0x320025, + CMSG_MOVE_SET_FACING_HEARTBEAT = 0x32007E, + CMSG_MOVE_SET_FLY = 0x320045, + CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x320042, + CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x32005F, + CMSG_MOVE_SET_PITCH = 0x320026, + CMSG_MOVE_SET_RUN_MODE = 0x32000E, + CMSG_MOVE_SET_TURN_RATE_CHEAT = 0x320022, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x320030, + CMSG_MOVE_SET_WALK_MODE = 0x32000F, + CMSG_MOVE_SPLINE_DONE = 0x320034, + CMSG_MOVE_START_ASCEND = 0x320046, + CMSG_MOVE_START_BACKWARD = 0x320001, + CMSG_MOVE_START_DESCEND = 0x32004D, + CMSG_MOVE_START_DRIVE_FORWARD = 0x320071, + CMSG_MOVE_START_FORWARD = 0x320000, + CMSG_MOVE_START_PITCH_DOWN = 0x32000C, + CMSG_MOVE_START_PITCH_UP = 0x32000B, + CMSG_MOVE_START_STRAFE_LEFT = 0x320003, + CMSG_MOVE_START_STRAFE_RIGHT = 0x320004, + CMSG_MOVE_START_SWIM = 0x320018, + CMSG_MOVE_START_TURN_LEFT = 0x320008, + CMSG_MOVE_START_TURN_RIGHT = 0x320009, + CMSG_MOVE_STOP = 0x320002, + CMSG_MOVE_STOP_ASCEND = 0x320047, + CMSG_MOVE_STOP_PITCH = 0x32000D, + CMSG_MOVE_STOP_STRAFE = 0x320005, + CMSG_MOVE_STOP_SWIM = 0x320019, + CMSG_MOVE_STOP_TURN = 0x32000A, + CMSG_MOVE_TELEPORT_ACK = 0x320016, + CMSG_MOVE_TIME_SKIPPED = 0x320037, + CMSG_MOVE_UPDATE_FALL_SPEED = 0x320036, + CMSG_MOVE_WATER_WALK_ACK = 0x320039, + CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0x2C0001, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x2F0083, + CMSG_NEXT_CINEMATIC_CAMERA = 0x3000E2, + CMSG_OBJECT_UPDATE_FAILED = 0x2F002C, + CMSG_OBJECT_UPDATE_RESCUED = 0x2F002D, + CMSG_OFFER_PETITION = 0x2F0286, + CMSG_OPENING_CINEMATIC = 0x3000E1, + CMSG_OPEN_ITEM = 0x2F020F, + CMSG_OPEN_MISSION_NPC = 0x2F01D0, + CMSG_OPEN_SHIPMENT_NPC = 0x2F01D8, + CMSG_OPEN_TRADESKILL_NPC = 0x2F01E3, + CMSG_OPT_OUT_OF_LOOT = 0x30008E, + CMSG_OVERRIDE_SCREEN_FLASH = 0x3000B8, + CMSG_PARTY_INVITE = 0x340030, + CMSG_PARTY_INVITE_RESPONSE = 0x340032, + CMSG_PARTY_UNINVITE = 0x340073, + CMSG_PERFORM_ITEM_INTERACTION = 0x2F00EC, + CMSG_PERKS_PROGRAM_ITEMS_REFRESHED = 0x2F02AE, + CMSG_PERKS_PROGRAM_REQUEST_CART_CHECKOUT = 0x2F02B1, + CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = 0x290012, + CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0x2F02B0, + CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0x2F02B2, + CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0x2F02B3, + CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0x2F02AF, + CMSG_PETITION_BUY = 0x30005A, + CMSG_PETITION_RENAME_GUILD = 0x3400F7, + CMSG_PETITION_SHOW_LIST = 0x300059, + CMSG_PETITION_SHOW_SIGNATURES = 0x30005B, + CMSG_PET_ABANDON = 0x30001E, + CMSG_PET_ABANDON_BY_NUMBER = 0x30001F, + CMSG_PET_ACTION = 0x30001C, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x2F0092, + CMSG_PET_BATTLE_INPUT = 0x34006D, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x2F00E2, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x2F0091, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x34006E, + CMSG_PET_BATTLE_REQUEST_PVP = 0x2F008B, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x2F008C, + CMSG_PET_BATTLE_REQUEST_WILD = 0x2F0089, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x2F0093, + CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x3D008A, + CMSG_PET_CANCEL_AURA = 0x300020, + CMSG_PET_CAST_SPELL = 0x2F0173, + CMSG_PET_RENAME = 0x3400B0, + CMSG_PET_SET_ACTION = 0x30001B, + CMSG_PET_SPELL_AUTOCAST = 0x300021, + CMSG_PET_STOP_ATTACK = 0x30001D, + CMSG_PING = 0x350004, + CMSG_PLAYER_LOGIN = 0x340016, + CMSG_PUSH_QUEST_TO_PARTY = 0x300031, + CMSG_PVP_LOG_DATA = 0x2F0028, + CMSG_QUERY_BATTLE_PET_NAME = 0x2F0147, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x34008C, + CMSG_QUERY_CORPSE_TRANSPORT = 0x34008D, + CMSG_QUERY_COUNTDOWN_TIMER = 0x2F0055, + CMSG_QUERY_CREATURE = 0x2F0141, + CMSG_QUERY_GAME_OBJECT = 0x2F0142, + CMSG_QUERY_GARRISON_PET_NAME = 0x2F0148, + CMSG_QUERY_GUILD_INFO = 0x3400B6, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x300098, + CMSG_QUERY_NEXT_MAIL_TIME = 0x3000D7, + CMSG_QUERY_NPC_TEXT = 0x2F0143, + CMSG_QUERY_PAGE_TEXT = 0x2F0145, + CMSG_QUERY_PETITION = 0x2F0149, + CMSG_QUERY_PET_NAME = 0x2F0146, + CMSG_QUERY_PLAYER_NAMES = 0x35000E, + CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY = 0x35000C, + CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID = 0x35000B, + CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x2F0021, + CMSG_QUERY_QUEST_INFO = 0x2F0144, + CMSG_QUERY_QUEST_ITEM_USABILITY = 0x2F0022, + CMSG_QUERY_REALM_NAME = 0x3400B5, + CMSG_QUERY_SCENARIO_POI = 0x340082, + CMSG_QUERY_SELECTED_WOW_LABS_AREA = 0x2F02EA, + CMSG_QUERY_TIME = 0x30006E, + CMSG_QUERY_TREASURE_PICKER = 0x2F0232, + CMSG_QUERY_WOW_LABS_AREA_INFO = 0x2F02EB, + CMSG_QUEST_CONFIRM_ACCEPT = 0x300030, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x30002A, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x30002C, + CMSG_QUEST_GIVER_CLOSE_QUEST = 0x3000E8, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x30002B, + CMSG_QUEST_GIVER_HELLO = 0x300028, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x300029, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x30002D, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x30002F, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x30002E, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x3000CC, + CMSG_QUEST_POI_QUERY = 0x3400DD, + CMSG_QUEST_PUSH_RESULT = 0x300032, + CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x2F0278, + CMSG_QUEST_SESSION_REQUEST_START = 0x2F0277, + CMSG_QUEST_SESSION_REQUEST_STOP = 0x340158, + CMSG_QUEUED_MESSAGES_END = 0x350008, + CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x340130, + CMSG_QUICK_JOIN_REQUEST_INVITE = 0x34012F, + CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x34015D, + CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x34012E, + CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x34012D, + CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x30009C, + CMSG_RAF_CLAIM_NEXT_REWARD = 0x34014E, + CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x340150, + CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x34014F, + CMSG_RANDOM_ROLL = 0x340080, + CMSG_READY_CHECK_RESPONSE = 0x34005F, + CMSG_READ_ITEM = 0x2F0210, + CMSG_RECLAIM_CORPSE = 0x300073, + CMSG_REMOVE_NEW_ITEM = 0x2F0236, + CMSG_REMOVE_RAF_RECRUIT = 0x340151, + CMSG_REORDER_CHARACTERS = 0x340015, + CMSG_REPAIR_ITEM = 0x300084, + CMSG_REPLACE_TROPHY = 0x2F01F1, + CMSG_REPOP_REQUEST = 0x3000C4, + CMSG_REPORT_PVP_PLAYER_AFK = 0x30008C, + CMSG_REPORT_SERVER_LAG = 0x2F0270, + CMSG_REPORT_STUCK_IN_COMBAT = 0x2F0271, + CMSG_REQUEST_ACCOUNT_DATA = 0x3400C2, + CMSG_REQUEST_AREA_POI_UPDATE = 0x2F0234, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x340008, + CMSG_REQUEST_CEMETERY_LIST = 0x2F0023, + CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x3400B7, + CMSG_REQUEST_COVENANT_CALLINGS = 0x2F0262, + CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x3000C8, + CMSG_REQUEST_CURRENCY_DATA_FOR_ACCOUNT_CHARACTERS = 0x290019, + CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x2F029B, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x2F0054, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x2F0053, + CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x2F0272, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x2F017F, + CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x2F00B7, + CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x2F00B8, + CMSG_REQUEST_PARTY_ELIGIBILITY_FOR_DELVE_TIERS = 0x2F02E9, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x340023, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x34007F, + CMSG_REQUEST_PET_INFO = 0x300022, + CMSG_REQUEST_PLAYED_TIME = 0x2F014C, + CMSG_REQUEST_PVP_REWARDS = 0x2F0041, + CMSG_REQUEST_RAID_INFO = 0x3400F8, + CMSG_REQUEST_RATED_PVP_INFO = 0x34000F, + CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x340193, + CMSG_REQUEST_SCHEDULED_AREA_POI_UPDATE = 0x2F0235, + CMSG_REQUEST_SCHEDULED_PVP_INFO = 0x2F0042, + CMSG_REQUEST_STABLED_PETS = 0x300023, + CMSG_REQUEST_STORE_FRONT_INFO_UPDATE = 0x29001E, + CMSG_REQUEST_VEHICLE_EXIT = 0x2F00FE, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x2F0100, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x2F00FF, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x2F0101, + CMSG_REQUEST_WEEKLY_REWARDS = 0x2F0265, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x2F0233, + CMSG_RESET_CHALLENGE_MODE = 0x2F00B5, + CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x2F00B6, + CMSG_RESET_INSTANCES = 0x340094, + CMSG_RESURRECT_RESPONSE = 0x3400AF, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x2F01F3, + CMSG_RIDE_VEHICLE_INTERACT = 0x2F0102, + CMSG_RPE_RESET_CHARACTER = 0x34017E, + CMSG_SAVE_ACCOUNT_DATA_EXPORT = 0x340178, + CMSG_SAVE_CUF_PROFILES = 0x2F0037, + CMSG_SAVE_EQUIPMENT_SET = 0x3000A2, + CMSG_SAVE_GUILD_EMBLEM = 0x2F0184, + CMSG_SAVE_PERSONAL_EMBLEM = 0x2F0185, + CMSG_SCENE_PLAYBACK_CANCELED = 0x2F00DE, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x2F00DD, + CMSG_SCENE_TRIGGER_EVENT = 0x2F00DF, + CMSG_SEAMLESS_TRANSFER_COMPLETE = 0x2F02D8, + CMSG_SELECT_WOW_LABS_AREA = 0x2F02EC, + CMSG_SELF_RES = 0x3000CF, + CMSG_SELL_ALL_JUNK_ITEMS = 0x300035, + CMSG_SELL_ITEM = 0x300034, + CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x340126, + CMSG_SEND_CONTACT_LIST = 0x3400FD, + CMSG_SEND_MAIL = 0x340026, + CMSG_SEND_PING_UNIT = 0x2F02DA, + CMSG_SEND_PING_WORLD_POINT = 0x2F02DB, + CMSG_SEND_TEXT_EMOTE = 0x300019, + CMSG_SERVER_TIME_OFFSET_REQUEST = 0x3400C9, + CMSG_SETUP_WARBAND_GROUPS = 0x34018C, + CMSG_SET_ACTION_BAR_TOGGLES = 0x3000D0, + CMSG_SET_ACTION_BUTTON = 0x340062, + CMSG_SET_ACTIVE_MOVER = 0x320059, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x2F0192, + CMSG_SET_ASSISTANT_LEADER = 0x34007B, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x2F0213, + CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0x2F0214, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x2F0215, + CMSG_SET_CONTACT_NOTES = 0x340100, + CMSG_SET_CURRENCY_FLAGS = 0x2F0015, + CMSG_SET_DIFFICULTY_ID = 0x2F00E0, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3400AE, + CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = 0x2F013B, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x340046, + CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES = 0x340131, + CMSG_SET_FACTION_AT_WAR = 0x300076, + CMSG_SET_FACTION_INACTIVE = 0x300078, + CMSG_SET_FACTION_NOT_AT_WAR = 0x300077, + CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x2F0065, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x2F0217, + CMSG_SET_LOOT_METHOD = 0x340074, + CMSG_SET_LOOT_SPECIALIZATION = 0x3000DD, + CMSG_SET_PARTY_ASSIGNMENT = 0x34007D, + CMSG_SET_PARTY_LEADER = 0x340076, + CMSG_SET_PET_FAVORITE = 0x2F0012, + CMSG_SET_PET_SLOT = 0x2F0011, + CMSG_SET_PET_SPECIALIZATION = 0x2F0013, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x3400B4, + CMSG_SET_PREFERRED_CEMETERY = 0x2F0024, + CMSG_SET_PVP = 0x2F0189, + CMSG_SET_RAID_DIFFICULTY = 0x340109, + CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = 0x340047, + CMSG_SET_ROLE = 0x340005, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3400B2, + CMSG_SET_SELECTION = 0x3000C6, + CMSG_SET_SHEATHED = 0x30001A, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x2F0216, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x30008B, + CMSG_SET_TITLE = 0x2F0152, + CMSG_SET_TRADE_CURRENCY = 0x2F000A, + CMSG_SET_TRADE_GOLD = 0x2F0009, + CMSG_SET_TRADE_ITEM = 0x2F0007, + CMSG_SET_USING_PARTY_GARRISON = 0x2F01D2, + CMSG_SET_WAR_MODE = 0x2F018A, + CMSG_SET_WATCHED_FACTION = 0x300079, + CMSG_SHOW_TRADE_SKILL = 0x3400F0, + CMSG_SIGN_PETITION = 0x3000D1, + CMSG_SILENCE_PARTY_TALKER = 0x34007E, + CMSG_SOCIAL_CONTRACT_REQUEST = 0x340173, + CMSG_SOCKET_GEMS = 0x300083, + CMSG_SORT_ACCOUNT_BANK_BAGS = 0x2F02DE, + CMSG_SORT_BAGS = 0x2F0218, + CMSG_SORT_BANK_BAGS = 0x2F0219, + CMSG_SPAWN_TRACKING_UPDATE = 0x2F0167, + CMSG_SPECTATE_CHANGE = 0x2F02D1, + CMSG_SPELL_CLICK = 0x300027, + CMSG_SPELL_EMPOWER_RELEASE = 0x2F0139, + CMSG_SPELL_EMPOWER_RESTART = 0x2F013A, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x300042, + CMSG_SPLIT_GUILD_BANK_ITEM = 0x300053, + CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY = 0x300050, + CMSG_SPLIT_ITEM = 0x310008, + CMSG_SPLIT_ITEM_TO_GUILD_BANK = 0x30004E, + CMSG_STAND_STATE_CHANGE = 0x2F0035, + CMSG_START_CHALLENGE_MODE = 0x3000E9, + CMSG_START_INSTANCE_ABANDON_VOTE = 0x340060, + CMSG_START_SPECTATOR_WAR_GAME = 0x34000B, + CMSG_START_WAR_GAME = 0x34000A, + CMSG_STORE_GUILD_BANK_ITEM = 0x300049, + CMSG_SUBMIT_USER_FEEDBACK = 0x3400C1, + CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x2F0290, + CMSG_SUMMON_RESPONSE = 0x340096, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x340072, + CMSG_SURRENDER_ARENA = 0x2F0020, + CMSG_SUSPEND_COMMS_ACK = 0x350000, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x350006, + CMSG_SWAP_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x30004B, + CMSG_SWAP_INV_ITEM = 0x310007, + CMSG_SWAP_ITEM = 0x310006, + CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM = 0x30004A, + CMSG_SWAP_SUB_GROUPS = 0x340079, + CMSG_TABARD_VENDOR_ACTIVATE = 0x2F0186, + CMSG_TALK_TO_GOSSIP = 0x300024, + CMSG_TAXI_NODE_STATUS_QUERY = 0x30003B, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x30003D, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x30003F, + CMSG_TIME_ADJUSTMENT_RESPONSE = 0x32005D, + CMSG_TIME_SYNC_RESPONSE = 0x32005A, + CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x32005C, + CMSG_TIME_SYNC_RESPONSE_FAILED = 0x32005B, + CMSG_TOGGLE_DIFFICULTY = 0x340083, + CMSG_TOGGLE_PVP = 0x2F0188, + CMSG_TOTEM_DESTROYED = 0x300090, + CMSG_TOY_CLEAR_FANFARE = 0x290004, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x2F0231, + CMSG_TRAINER_BUY_SPELL = 0x300041, + CMSG_TRAINER_LIST = 0x300040, + CMSG_TRAITS_COMMIT_CONFIG = 0x2F02B9, + CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x2F02B7, + CMSG_TRANSFER_CURRENCY_FROM_ACCOUNT_CHARACTER = 0x2F02E7, + CMSG_TRANSMOGRIFY_ITEMS = 0x2F0043, + CMSG_TURN_IN_PETITION = 0x3000D3, + CMSG_TUTORIAL = 0x34010A, + CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x2F0261, + CMSG_UNACCEPT_TRADE = 0x2F0005, + CMSG_UNDELETE_CHARACTER = 0x34010C, + CMSG_UNLEARN_SKILL = 0x30007D, + CMSG_UNLEARN_SPECIALIZATION = 0x2F0051, + CMSG_UPDATE_AADC_STATUS = 0x340163, + CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS = 0x30012A, + CMSG_UPDATE_ACCOUNT_DATA = 0x3400C3, + CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x2F0176, + CMSG_UPDATE_CLIENT_SETTINGS = 0x340090, + CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x2F01E4, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x320060, + CMSG_UPDATE_RAID_TARGET = 0x34007C, + CMSG_UPDATE_SPELL_VISUAL = 0x2F0175, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x340121, + CMSG_UPGRADE_GARRISON = 0x2F019A, + CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x2F028E, + CMSG_USED_FOLLOW = 0x2F0032, + CMSG_USE_CRITTER_ITEM = 0x2F0108, + CMSG_USE_EQUIPMENT_SET = 0x310001, + CMSG_USE_ITEM = 0x2F016F, + CMSG_USE_TOY = 0x2F0172, + CMSG_VAS_CHECK_TRANSFER_OK = 0x340136, + CMSG_VAS_GET_QUEUE_MINUTES = 0x340135, + CMSG_VAS_GET_SERVICE_STATUS = 0x340134, + CMSG_VIOLENCE_LEVEL = 0x2F0030, + CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST = 0x34013A, + CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x34013B, + CMSG_VOICE_CHAT_LOGIN = 0x340139, + CMSG_WARDEN3_DATA = 0x340018, + CMSG_WHO = 0x3400AD, + CMSG_WHO_IS = 0x3400AC, + CMSG_WORLD_LOOT_OBJECT_CLICK = 0x2F02D4, + CMSG_WORLD_PORT_RESPONSE = 0x340025, + CMSG_WRAP_ITEM = 0x310000, }; -inline constexpr std::size_t NUM_CMSG_OPCODES = 1732; +inline constexpr std::size_t NUM_CMSG_OPCODES = 1735; inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode) { uint32 idInGroup = opcode & 0xFFFF; switch (opcode >> 16) { - case 0x2B: return idInGroup < 31 ? idInGroup + 0 : -1; - case 0x2D: return idInGroup < 51 ? idInGroup + 31 : -1; - case 0x2E: return idInGroup < 3 ? idInGroup + 82 : -1; - case 0x2F: return idInGroup < 37 ? idInGroup + 85 : -1; - case 0x31: return idInGroup < 750 ? idInGroup + 122 : -1; - case 0x32: return idInGroup < 299 ? idInGroup + 872 : -1; - case 0x33: return idInGroup < 12 ? idInGroup + 1171 : -1; - case 0x34: return idInGroup < 132 ? idInGroup + 1183 : -1; - case 0x36: return idInGroup < 402 ? idInGroup + 1315 : -1; - case 0x37: return idInGroup < 15 ? idInGroup + 1717 : -1; + case 0x29: return idInGroup < 31 ? idInGroup + 0 : -1; + case 0x2B: return idInGroup < 51 ? idInGroup + 31 : -1; + case 0x2C: return idInGroup < 3 ? idInGroup + 82 : -1; + case 0x2D: return idInGroup < 37 ? idInGroup + 85 : -1; + case 0x2F: return idInGroup < 751 ? idInGroup + 122 : -1; + case 0x30: return idInGroup < 301 ? idInGroup + 873 : -1; + case 0x31: return idInGroup < 10 ? idInGroup + 1174 : -1; + case 0x32: return idInGroup < 132 ? idInGroup + 1184 : -1; + case 0x34: return idInGroup < 404 ? idInGroup + 1316 : -1; + case 0x35: return idInGroup < 15 ? idInGroup + 1720 : -1; default: return -1; } } enum OpcodeServer : uint32 { - SMSG_ABORT_NEW_WORLD = 0x380030, - SMSG_ACCOUNT_CHARACTER_CURRENCY_LISTS = 0x380342, - SMSG_ACCOUNT_CONVERSION_STATE_UPDATE = 0x380347, - SMSG_ACCOUNT_COSMETIC_ADDED = 0x3802FB, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x3802E3, - SMSG_ACCOUNT_DATA_TIMES = 0x3801A4, - SMSG_ACCOUNT_EXPORT_RESPONSE = 0x380333, - SMSG_ACCOUNT_ITEM_COLLECTION_DATA = 0x38034D, - SMSG_ACCOUNT_MOUNT_REMOVED = 0x380047, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x380046, - SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x3802FA, - SMSG_ACCOUNT_STORE_CURRENCY_UPDATE = 0x38031C, - SMSG_ACCOUNT_STORE_FRONT_UPDATE = 0x38031D, - SMSG_ACCOUNT_STORE_ITEM_STATE_CHANGED = 0x38031E, - SMSG_ACCOUNT_STORE_RESULT = 0x38031F, - SMSG_ACCOUNT_TOY_UPDATE = 0x380048, - SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x38004C, - SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x38004B, - SMSG_ACCOUNT_WARBAND_SCENE_UPDATE = 0x38004E, - SMSG_ACHIEVEMENT_DELETED = 0x380181, - SMSG_ACHIEVEMENT_EARNED = 0x3800DB, - SMSG_ACTIVATE_ESSENCE_FAILED = 0x4B0020, - SMSG_ACTIVATE_SOULBIND_FAILED = 0x4B0022, - SMSG_ACTIVATE_TAXI_REPLY = 0x380118, - SMSG_ACTIVE_GLYPHS = 0x4E0045, - SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0x3801DF, - SMSG_ADDON_LIST_REQUEST = 0x3800DA, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x3800D5, - SMSG_ADD_ITEM_PASSIVE = 0x380042, - SMSG_ADD_LOSS_OF_CONTROL = 0x38010B, - SMSG_ADD_RUNE_POWER = 0x380152, - SMSG_ADJUST_SPLINE_DURATION = 0x380069, - SMSG_ADVANCED_COMBAT_LOG = 0x3802F8, - SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x3802F3, - SMSG_AE_LOOT_TARGETS = 0x3800B0, - SMSG_AE_LOOT_TARGET_ACK = 0x3800B1, - SMSG_AI_REACTION = 0x38014F, - SMSG_ALLIED_RACE_DETAILS = 0x38028D, - SMSG_ALL_ACCOUNT_CRITERIA = 0x380005, - SMSG_ALL_ACHIEVEMENT_DATA = 0x380004, - SMSG_ALL_GUILD_ACHIEVEMENTS = 0x440000, - SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x3802D0, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x38001D, - SMSG_AREA_POI_UPDATE_RESPONSE = 0x4B0018, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x3801D8, - SMSG_AREA_TRIGGER_DENIED = 0x390009, - SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING = 0x390006, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x3801B0, - SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x390004, - SMSG_AREA_TRIGGER_RE_PATH = 0x390003, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x390008, - SMSG_AREA_TRIGGER_UNATTACH = 0x390007, - SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = 0x390005, - SMSG_ARENA_CLEAR_OPPONENTS = 0x3800E1, - SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x3800CA, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x3800E0, - SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x38023A, - SMSG_ARTIFACT_FORGE_ERROR = 0x380238, - SMSG_ARTIFACT_RESPEC_PROMPT = 0x380239, - SMSG_ARTIFACT_XP_GAIN = 0x380280, - SMSG_ATTACKER_STATE_UPDATE = 0x3E002C, - SMSG_ATTACK_START = 0x3E0017, - SMSG_ATTACK_STOP = 0x3E0018, - SMSG_ATTACK_SWING_ERROR = 0x3E0026, - SMSG_ATTACK_SWING_LANDED_LOG = 0x3E0027, - SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x380269, - SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x380268, - SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x380267, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x38018C, - SMSG_AUCTION_COMMAND_RESULT = 0x380189, - SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x380320, - SMSG_AUCTION_FAVORITE_LIST = 0x3802EA, - SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x3802E2, - SMSG_AUCTION_HELLO_RESPONSE = 0x380187, - SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x3802E1, - SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x3802DD, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x3802DE, - SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x3802E0, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x38018B, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x38018D, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x380188, - SMSG_AUCTION_WON_NOTIFICATION = 0x38018A, - SMSG_AURA_POINTS_DEPLETED = 0x4E0012, - SMSG_AURA_UPDATE = 0x4E0011, - SMSG_AUTH_CHALLENGE = 0x3F0000, - SMSG_AUTH_FAILED = 0x380000, - SMSG_AUTH_RESPONSE = 0x380001, - SMSG_AVAILABLE_HOTFIXES = 0x3C0001, - SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0x380321, - SMSG_BAG_CLEANUP_FINISHED = 0x4F0007, - SMSG_BARBER_SHOP_RESULT = 0x380157, - SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x3802C1, - SMSG_BATTLEFIELD_LIST = 0x3E0005, - SMSG_BATTLEFIELD_PORT_DENIED = 0x3E000B, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x3E0001, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x3E0004, - SMSG_BATTLEFIELD_STATUS_GROUP_PROPOSAL_FAILED = 0x3E000E, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x3E0000, - SMSG_BATTLEFIELD_STATUS_NONE = 0x3E0003, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x3E0002, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x3E000D, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x3E000C, - SMSG_BATTLEGROUND_INIT = 0x3E0029, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x3E0009, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x3E000A, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x3E0006, - SMSG_BATTLEGROUND_POINTS = 0x3E0028, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x380222, - SMSG_BATTLENET_CHALLENGE_START = 0x380221, - SMSG_BATTLENET_NOTIFICATION = 0x380299, - SMSG_BATTLENET_RESPONSE = 0x380298, - SMSG_BATTLE_NET_CONNECTION_STATUS = 0x38029A, - SMSG_BATTLE_PAY_ACK_FAILED = 0x38021D, - SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x380212, - SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x380213, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x38021C, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x380210, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x38020F, - SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x380300, - SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x38020D, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x38020E, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x38020C, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x38020A, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x38020B, - SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x380211, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x38021B, - SMSG_BATTLE_PAY_START_CHECKOUT = 0x3802B5, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x380219, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x380218, - SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x3802A9, - SMSG_BATTLE_PETS_HEALED = 0x38008B, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x380113, - SMSG_BATTLE_PET_DELETED = 0x380088, - SMSG_BATTLE_PET_ERROR = 0x3800D0, - SMSG_BATTLE_PET_JOURNAL = 0x380087, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x380085, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x380086, - SMSG_BATTLE_PET_RESTORED = 0x38008A, - SMSG_BATTLE_PET_REVOKED = 0x380089, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x380083, - SMSG_BATTLE_PET_UPDATES = 0x380082, - SMSG_BIND_POINT_UPDATE = 0x380011, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x3800C0, - SMSG_BLACK_MARKET_OUTBID = 0x3800C1, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x3800BF, - SMSG_BLACK_MARKET_WON = 0x3800C2, - SMSG_BONUS_ROLL_EMPTY = 0x3800DD, - SMSG_BOSS_KILL = 0x3E002B, - SMSG_BREAK_TARGET = 0x3E0016, - SMSG_BROADCAST_ACHIEVEMENT = 0x3D0012, - SMSG_BROADCAST_SUMMON_CAST = 0x3802C3, - SMSG_BROADCAST_SUMMON_RESPONSE = 0x3802C4, - SMSG_BUY_FAILED = 0x380160, - SMSG_BUY_SUCCEEDED = 0x38015F, - SMSG_CACHE_INFO = 0x3C000F, - SMSG_CACHE_VERSION = 0x3C000E, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x380138, - SMSG_CALENDAR_COMMAND_RESULT = 0x380139, - SMSG_CALENDAR_COMMUNITY_INVITE = 0x380128, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x380130, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x380131, - SMSG_CALENDAR_INVITE_ADDED = 0x380129, - SMSG_CALENDAR_INVITE_ALERT = 0x38012D, - SMSG_CALENDAR_INVITE_NOTES = 0x380132, - SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x380133, - SMSG_CALENDAR_INVITE_REMOVED = 0x38012A, - SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x38012F, - SMSG_CALENDAR_INVITE_STATUS = 0x38012B, - SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x38012E, - SMSG_CALENDAR_MODERATOR_STATUS = 0x38012C, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x380134, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x380135, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x380136, - SMSG_CALENDAR_SEND_CALENDAR = 0x380126, - SMSG_CALENDAR_SEND_EVENT = 0x380127, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x380137, - SMSG_CAMERA_EFFECT = 0x3801BE, - SMSG_CANCEL_AUTO_REPEAT = 0x380177, - SMSG_CANCEL_COMBAT = 0x3E0025, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x4E0037, - SMSG_CANCEL_PING_PIN = 0x38003B, - SMSG_CANCEL_PRELOAD_WORLD = 0x38002E, - SMSG_CANCEL_SCENE = 0x3800CF, - SMSG_CANCEL_SPELL_VISUAL = 0x4E0035, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x4E0039, - SMSG_CAN_DUEL_RESULT = 0x3E0021, - SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x3802A8, - SMSG_CAPTURE_POINT_REMOVED = 0x3E0008, - SMSG_CAST_FAILED = 0x4E0048, - SMSG_CAS_REFRESH_REMOTE_DATA = 0x380111, - SMSG_CAUTIONARY_CHANNEL_MESSAGE = 0x3D0009, - SMSG_CAUTIONARY_CHAT_MESSAGE = 0x3D0008, - SMSG_CHAIN_MISSILE_BOUNCE = 0x380061, - SMSG_CHALLENGE_MODE_COMPLETE = 0x3800A2, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x3800A8, - SMSG_CHALLENGE_MODE_RESET = 0x3800A1, - SMSG_CHALLENGE_MODE_START = 0x38009F, - SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x3800A0, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x4B000C, - SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x38029B, - SMSG_CHANNEL_LIST = 0x3D001B, - SMSG_CHANNEL_NOTIFY = 0x3D0017, - SMSG_CHANNEL_NOTIFY_JOINED = 0x3D0019, - SMSG_CHANNEL_NOTIFY_LEFT = 0x3D001A, - SMSG_CHANNEL_NOTIFY_NPE_JOINED_BATCH = 0x3D0018, - SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x380255, - SMSG_CHARACTER_LOGIN_FAILED = 0x38019E, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x380220, - SMSG_CHARACTER_RENAME_RESULT = 0x3801FB, - SMSG_CHARACTER_UPGRADE_ABORTED = 0x380254, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x380253, - SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x380256, - SMSG_CHARACTER_UPGRADE_STARTED = 0x380252, - SMSG_CHAR_CUSTOMIZE_FAILURE = 0x38017B, - SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x38017C, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x38023F, - SMSG_CHAT = 0x3D0001, - SMSG_CHAT_AUTO_RESPONDED = 0x3D000E, - SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = 0x3D0022, - SMSG_CHAT_DOWN = 0x3D0014, - SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x3D0000, - SMSG_CHAT_IS_DOWN = 0x3D0015, - SMSG_CHAT_NOT_IN_GUILD = 0x3D0023, - SMSG_CHAT_NOT_IN_PARTY = 0x3D0006, - SMSG_CHAT_PLAYER_AMBIGUOUS = 0x3D0004, - SMSG_CHAT_PLAYER_NOTFOUND = 0x3D000D, - SMSG_CHAT_RECONNECT = 0x3D0016, - SMSG_CHAT_REGIONAL_SERVICE_STATUS = 0x3D001D, - SMSG_CHAT_RESTRICTED = 0x3D0007, - SMSG_CHAT_SERVER_MESSAGE = 0x3D001C, - SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x4E0002, - SMSG_CHECK_ABANDON_NPE = 0x4B0023, - SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0x38001B, - SMSG_CHECK_WARGAME_ENTRY = 0x380027, - SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x3802ED, - SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x3802D4, - SMSG_CLEAR_ALL_SPELL_CHARGES = 0x4E0016, - SMSG_CLEAR_BOSS_EMOTES = 0x380054, - SMSG_CLEAR_COOLDOWN = 0x380154, - SMSG_CLEAR_COOLDOWNS = 0x4E0015, - SMSG_CLEAR_RESURRECT = 0x380013, - SMSG_CLEAR_SPELL_CHARGES = 0x4E0017, - SMSG_CLEAR_TARGET = 0x3E0022, - SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x4C0022, - SMSG_CLOSE_ARTIFACT_FORGE = 0x380237, - SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x3802CC, - SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x3802CF, - SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x3802CD, - SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x3802CA, - SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x3802CE, - SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x3802CB, - SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x38030C, - SMSG_COIN_REMOVED = 0x3800AF, - SMSG_COMBAT_EVENT_FAILED = 0x3E0019, - SMSG_COMMENTATOR_MAP_INFO = 0x3801A0, - SMSG_COMMENTATOR_PLAYER_INFO = 0x3801A1, - SMSG_COMMENTATOR_STATE_CHANGED = 0x38019F, - SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x380264, - SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x380270, - SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x380266, - SMSG_COMMERCE_TOKEN_UPDATE = 0x380265, - SMSG_COMPLAINT_RESULT = 0x380146, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x380230, - SMSG_CONFIRM_PARTY_INVITE = 0x3802A7, - SMSG_CONNECT_TO = 0x3F0005, - SMSG_CONSOLE_WRITE = 0x3800CD, - SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x38026C, - SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x38026B, - SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x38026A, - SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x38026E, - SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x38026F, - SMSG_CONTACT_LIST = 0x38021E, - SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x3802AE, - SMSG_CONTROL_UPDATE = 0x3800DF, - SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x3802F6, - SMSG_COOLDOWN_CHEAT = 0x3801D1, - SMSG_COOLDOWN_EVENT = 0x380153, - SMSG_CORPSE_LOCATION = 0x3800E7, - SMSG_CORPSE_RECLAIM_DELAY = 0x3801E2, - SMSG_CORPSE_TRANSPORT_QUERY = 0x3801AC, - SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0x4C0024, - SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x380290, - SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x3802F7, - SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x38032D, - SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x380329, - SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x380325, - SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x380327, - SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x380323, - SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x380328, - SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x380324, - SMSG_CRAFTING_ORDER_NPC_REWARD_INFO = 0x38032F, - SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x38032B, - SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x380326, - SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x38032E, - SMSG_CRAFT_ENCHANT_RESULT = 0x38032C, - SMSG_CREATE_CHAR = 0x38019A, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x38022F, - SMSG_CREATOR_VISUALS_OVERRIDE = 0x380332, - SMSG_CRITERIA_DELETED = 0x380180, - SMSG_CRITERIA_UPDATE = 0x38017A, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x38015B, - SMSG_CURRENCY_TRANSFER_LOG = 0x380344, - SMSG_CURRENCY_TRANSFER_RESULT = 0x380343, - SMSG_CUSTOM_LOAD_SCREEN = 0x380064, - SMSG_DAILY_QUESTS_RESET = 0x4C0000, - SMSG_DAMAGE_CALC_LOG = 0x4E0054, - SMSG_DB_REPLY = 0x3C0000, - SMSG_DEATH_RELEASE_LOC = 0x38016D, - SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x3800EF, - SMSG_DEFENSE_MESSAGE = 0x3D000C, - SMSG_DELETE_CHAR = 0x38019B, - SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x420022, - SMSG_DELVES_ACCOUNT_DATA_ELEMENT_CHANGED = 0x380349, - SMSG_DESTROY_ARENA_UNIT = 0x3801DA, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x380192, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x380020, - SMSG_DISENCHANT_CREDIT = 0x38003F, - SMSG_DISMOUNT_RESULT = 0x380010, - SMSG_DISPEL_FAILED = 0x4E001E, - SMSG_DISPLAY_GAME_ERROR = 0x380035, - SMSG_DISPLAY_PLAYER_CHOICE = 0x4B0004, - SMSG_DISPLAY_PROMOTION = 0x3800E4, - SMSG_DISPLAY_QUEST_POPUP = 0x4C001E, - SMSG_DISPLAY_TOAST = 0x3800BC, - SMSG_DISPLAY_WORLD_TEXT = 0x380281, - SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x4E0053, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x380079, - SMSG_DROP_NEW_CONNECTION = 0x3F0004, - SMSG_DUEL_ARRANGED = 0x3E001B, - SMSG_DUEL_COMPLETE = 0x3E001F, - SMSG_DUEL_COUNTDOWN = 0x3E001E, - SMSG_DUEL_IN_BOUNDS = 0x3E001D, - SMSG_DUEL_OUT_OF_BOUNDS = 0x3E001C, - SMSG_DUEL_REQUESTED = 0x3E001A, - SMSG_DUEL_WINNER = 0x3E0020, - SMSG_DURABILITY_DAMAGE_DEATH = 0x3801DD, - SMSG_EMOTE = 0x38025C, - SMSG_ENABLE_BARBER_SHOP = 0x380156, - SMSG_ENCHANTMENT_LOG = 0x3801AD, - SMSG_ENCOUNTER_END = 0x380217, - SMSG_ENCOUNTER_START = 0x380216, - SMSG_END_LIGHTNING_STORM = 0x380143, - SMSG_ENTER_ENCRYPTED_MODE = 0x3F0001, - SMSG_ENUM_CHARACTERS_RESULT = 0x380018, - SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x380286, - SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x4E000E, - SMSG_EQUIPMENT_SET_ID = 0x38014C, - SMSG_EXPECTED_SPAM_RECORDS = 0x3D0005, - SMSG_EXPLORATION_EXPERIENCE = 0x3801F7, - SMSG_EXPORT_ACCOUNT_PROFILE = 0x3800EC, - SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x3802F4, - SMSG_FACTION_BONUS_INFO = 0x3801BD, - SMSG_FAILED_PLAYER_CONDITION = 0x4B0002, - SMSG_FAILED_QUEST_TURN_IN = 0x3802A4, - SMSG_FEATURE_SYSTEM_STATUS = 0x380058, - SMSG_FEATURE_SYSTEM_STATUS2 = 0x380341, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x380059, - SMSG_FEIGN_DEATH_RESISTED = 0x3801DC, - SMSG_FISH_ESCAPED = 0x38016A, - SMSG_FISH_NOT_HOOKED = 0x380169, - SMSG_FLIGHT_SPLINE_SYNC = 0x49005B, - SMSG_FLUSH_COMBAT_LOG_FILE = 0x4E0010, - SMSG_FORCED_DEATH_UPDATE = 0x38016E, - SMSG_FORCE_ANIM = 0x3801E9, - SMSG_FORCE_ANIMATIONS = 0x3801EA, - SMSG_FORCE_OBJECT_RELINK = 0x3800E3, - SMSG_FORCE_RANDOM_TRANSMOG_TOAST = 0x38004A, - SMSG_FORCE_SPAWN_TRACKING_UPDATE = 0x4C0021, - SMSG_FRIEND_STATUS = 0x38021F, - SMSG_GAIN_MAW_POWER = 0x380275, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x38005C, - SMSG_GAME_OBJECT_BASE = 0x3802BB, - SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x38030B, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x38005D, - SMSG_GAME_OBJECT_DESPAWN = 0x38005E, - SMSG_GAME_OBJECT_INTERACTION = 0x38030A, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x4E003C, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x4E003B, - SMSG_GAME_OBJECT_RESET_STATE = 0x3801B7, - SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x380297, - SMSG_GAME_SPEED_SET = 0x38011C, - SMSG_GAME_TIME_SET = 0x3801A6, - SMSG_GAME_TIME_UPDATE = 0x3801A5, - SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x420024, - SMSG_GARRISON_ADD_EVENT = 0x420048, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x420016, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x42001A, - SMSG_GARRISON_ADD_SPEC_GROUPS = 0x42004B, - SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0x42004F, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x42002C, - SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0x420051, - SMSG_GARRISON_BUILDING_ACTIVATED = 0x42000B, - SMSG_GARRISON_BUILDING_REMOVED = 0x420004, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x420006, - SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0x42001D, - SMSG_GARRISON_CLEAR_COLLECTION = 0x420047, - SMSG_GARRISON_CLEAR_EVENT_LIST = 0x42004A, - SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0x42004C, - SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x420046, - SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x420045, - SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x42003D, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x42001C, - SMSG_GARRISON_CREATE_RESULT = 0x42000C, - SMSG_GARRISON_DELETE_MISSION_RESULT = 0x420023, - SMSG_GARRISON_DELETE_RESULT = 0x420035, - SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = 0x42002B, - SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = 0x420029, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x420027, - SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = 0x420028, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x420026, - SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = 0x42002A, - SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0x420033, - SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0x420015, - SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0x42001E, - SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x42003F, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x420007, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x420005, - SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x420040, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x420019, - SMSG_GARRISON_MAP_DATA_RESPONSE = 0x420042, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x420020, - SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x420043, - SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0x420025, - SMSG_GARRISON_OPEN_CRAFTER = 0x420037, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x420030, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x420003, - SMSG_GARRISON_PLOT_PLACED = 0x420001, - SMSG_GARRISON_PLOT_REMOVED = 0x420002, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x420034, - SMSG_GARRISON_REMOTE_INFO = 0x42000A, - SMSG_GARRISON_REMOVE_EVENT = 0x420049, - SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0x42002F, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x42002D, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x420017, - SMSG_GARRISON_RENAME_FOLLOWER_RESULT = 0x42002E, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x420009, - SMSG_GARRISON_RESEARCH_TALENT_RESULT = 0x42000E, - SMSG_GARRISON_RESET_TALENT_TREE = 0x420013, - SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0x420014, - SMSG_GARRISON_START_MISSION_RESULT = 0x42001B, - SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x42003C, - SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x42004D, - SMSG_GARRISON_TALENT_COMPLETED = 0x42000F, - SMSG_GARRISON_TALENT_REMOVED = 0x420010, - SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0x420012, - SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0x420011, - SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0x42004E, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x420008, - SMSG_GARRISON_UPDATE_FOLLOWER = 0x420018, - SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x42003E, - SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0x420050, - SMSG_GARRISON_UPGRADE_RESULT = 0x42000D, - SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x42001F, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x38001C, - SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x3802AF, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3801F9, - SMSG_GET_GARRISON_INFO_RESULT = 0x420000, - SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x380232, - SMSG_GET_REALM_HIDDEN_RESULT = 0x380338, - SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x38026D, - SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x38025A, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x380231, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x38022D, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x380259, - SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x380282, - SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x380283, - SMSG_GM_PLAYER_INFO = 0x4B000D, - SMSG_GM_REQUEST_PLAYER_INFO = 0x4B0003, - SMSG_GM_TICKET_CASE_STATUS = 0x38013E, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x38013D, - SMSG_GOD_MODE = 0x380195, - SMSG_GOSSIP_COMPLETE = 0x4C0017, - SMSG_GOSSIP_MESSAGE = 0x4C0018, - SMSG_GOSSIP_OPTION_NPC_INTERACTION = 0x4C0028, - SMSG_GOSSIP_POI = 0x38022A, - SMSG_GOSSIP_QUEST_UPDATE = 0x4C0019, - SMSG_GOSSIP_REFRESH_OPTIONS = 0x4C0027, - SMSG_GROUP_ACTION_THROTTLED = 0x380024, - SMSG_GROUP_AUTO_KICK = 0x380227, - SMSG_GROUP_DECLINE = 0x380223, - SMSG_GROUP_DESTROYED = 0x380226, - SMSG_GROUP_NEW_LEADER = 0x3800C5, - SMSG_GROUP_REQUEST_DECLINE = 0x380224, - SMSG_GROUP_UNINVITE = 0x380225, - SMSG_GUILD_ACHIEVEMENT_DELETED = 0x44000D, - SMSG_GUILD_ACHIEVEMENT_EARNED = 0x44000C, - SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x44000F, - SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x440027, - SMSG_GUILD_BANK_QUERY_RESULTS = 0x440026, - SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x440028, - SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x44002B, - SMSG_GUILD_CHALLENGE_COMPLETED = 0x44001B, - SMSG_GUILD_CHALLENGE_UPDATE = 0x44001A, - SMSG_GUILD_CHANGE_NAME_RESULT = 0x440025, - SMSG_GUILD_COMMAND_RESULT = 0x440002, - SMSG_GUILD_CRITERIA_DELETED = 0x44000E, - SMSG_GUILD_CRITERIA_UPDATE = 0x44000B, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x440040, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x44003F, - SMSG_GUILD_EVENT_DISBANDED = 0x440035, - SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x44002A, - SMSG_GUILD_EVENT_MOTD = 0x440036, - SMSG_GUILD_EVENT_NEW_LEADER = 0x440034, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x440032, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x440033, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x440037, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x440039, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x44003A, - SMSG_GUILD_EVENT_STATUS_CHANGE = 0x440038, - SMSG_GUILD_EVENT_TAB_ADDED = 0x44003B, - SMSG_GUILD_EVENT_TAB_DELETED = 0x44003C, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x44003D, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x44003E, - SMSG_GUILD_FLAGGED_FOR_RENAME = 0x440024, - SMSG_GUILD_HARDCORE_MEMBER_DEATH = 0x440004, - SMSG_GUILD_INVITE = 0x440012, - SMSG_GUILD_INVITE_DECLINED = 0x440030, - SMSG_GUILD_INVITE_EXPIRED = 0x440031, - SMSG_GUILD_ITEM_LOOTED_NOTIFY = 0x44001C, - SMSG_GUILD_KNOWN_RECIPES = 0x440006, - SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x440007, - SMSG_GUILD_MEMBER_DAILY_RESET = 0x44002C, - SMSG_GUILD_MEMBER_RECIPES = 0x440005, - SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x440011, - SMSG_GUILD_MOVED = 0x440022, - SMSG_GUILD_MOVE_STARTING = 0x440021, - SMSG_GUILD_NAME_CHANGED = 0x440023, - SMSG_GUILD_NEWS = 0x440009, - SMSG_GUILD_NEWS_DELETED = 0x44000A, - SMSG_GUILD_PARTY_STATE = 0x440013, - SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x440029, - SMSG_GUILD_RANKS = 0x440010, - SMSG_GUILD_RENAME_NAME_CHECK = 0x440044, - SMSG_GUILD_RENAME_REFUND_RESULT = 0x440046, - SMSG_GUILD_RENAME_REQUESTED_RESULT = 0x440045, - SMSG_GUILD_RENAME_STATUS_UPDATE = 0x440043, - SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x440014, - SMSG_GUILD_RESET = 0x440020, - SMSG_GUILD_REWARD_LIST = 0x440008, - SMSG_GUILD_ROSTER = 0x440003, - SMSG_GUILD_SEND_RANK_CHANGE = 0x440001, - SMSG_HARDCORE_DEATH_ALERT = 0x380340, - SMSG_HEALTH_UPDATE = 0x38016B, - SMSG_HIGHEST_THREAT_UPDATE = 0x380173, - SMSG_HOTFIX_CONNECT = 0x3C0003, - SMSG_HOTFIX_MESSAGE = 0x3C0002, - SMSG_INITIALIZE_FACTIONS = 0x3801BC, - SMSG_INITIAL_SETUP = 0x380014, - SMSG_INIT_WORLD_STATES = 0x3801DE, - SMSG_INSPECT_RESULT = 0x3800C9, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x380245, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x380244, - SMSG_INSTANCE_ENCOUNTER_END = 0x38024D, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x380243, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x38024F, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x38024E, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x380248, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x380247, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x38024C, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x380250, - SMSG_INSTANCE_ENCOUNTER_START = 0x380249, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x380246, - SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x38024B, - SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x38024A, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x380193, - SMSG_INSTANCE_INFO = 0x3800CC, - SMSG_INSTANCE_RESET = 0x380121, - SMSG_INSTANCE_RESET_FAILED = 0x380122, - SMSG_INSTANCE_SAVE_CREATED = 0x380215, - SMSG_INTERRUPT_POWER_REGEN = 0x4E004A, - SMSG_INVALIDATE_PAGE_TEXT = 0x3C000A, - SMSG_INVALIDATE_PLAYER = 0x4B0007, - SMSG_INVALID_PROMOTION_CODE = 0x3801EB, - SMSG_INVENTORY_CHANGE_FAILURE = 0x4F0005, - SMSG_INVENTORY_FIXUP_COMPLETE = 0x3802A6, - SMSG_INVENTORY_FULL_OVERFLOW = 0x3802B7, - SMSG_ISLAND_AZERITE_GAIN = 0x3801F4, - SMSG_ISLAND_COMPLETE = 0x3801F5, - SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x4C0004, - SMSG_ITEM_CHANGED = 0x380184, - SMSG_ITEM_COOLDOWN = 0x38025B, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x3801ED, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x380034, - SMSG_ITEM_INTERACTION_COMPLETE = 0x3802EC, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x380032, - SMSG_ITEM_PUSH_RESULT = 0x3800BB, - SMSG_ITEM_TIME_UPDATE = 0x3801EC, - SMSG_KICK_REASON = 0x380124, - SMSG_LATENCY_REPORT_PING = 0x3802FC, - SMSG_LEARNED_SPELLS = 0x4E003E, - SMSG_LEARN_PVP_TALENT_FAILED = 0x38006D, - SMSG_LEARN_TALENT_FAILED = 0x38006C, - SMSG_LEGACY_LOOT_RULES = 0x3802BC, - SMSG_LEVEL_LINKING_RESULT = 0x3802D2, - SMSG_LEVEL_UP_INFO = 0x380182, - SMSG_LFG_BOOT_PLAYER = 0x460019, - SMSG_LFG_DISABLED = 0x460017, - SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x46001F, - SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x460009, - SMSG_LFG_JOIN_LOBBY_MATCHMAKER_QUEUE = 0x460020, - SMSG_LFG_JOIN_RESULT = 0x460000, - SMSG_LFG_LIST_APPLICANT_LIST_UPDATE = 0x46000F, - SMSG_LFG_LIST_APPLICATION_STATUS_UPDATE = 0x46000C, - SMSG_LFG_LIST_APPLY_TO_GROUP_RESULT = 0x46000D, - SMSG_LFG_LIST_JOIN_RESULT = 0x460001, - SMSG_LFG_LIST_SEARCH_RESULTS = 0x460002, - SMSG_LFG_LIST_SEARCH_RESULTS_UPDATE = 0x460010, - SMSG_LFG_LIST_SEARCH_STATUS = 0x460003, - SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x46000E, - SMSG_LFG_LIST_UPDATE_EXPIRATION = 0x46000B, - SMSG_LFG_LIST_UPDATE_STATUS = 0x46000A, - SMSG_LFG_OFFER_CONTINUE = 0x460018, - SMSG_LFG_PARTY_INFO = 0x46001A, - SMSG_LFG_PLAYER_INFO = 0x46001B, - SMSG_LFG_PLAYER_REWARD = 0x46001C, - SMSG_LFG_PROPOSAL_UPDATE = 0x460011, - SMSG_LFG_QUEUE_STATUS = 0x460004, - SMSG_LFG_READY_CHECK_RESULT = 0x46001E, - SMSG_LFG_READY_CHECK_UPDATE = 0x460006, - SMSG_LFG_ROLE_CHECK_UPDATE = 0x460005, - SMSG_LFG_SLOT_INVALID = 0x460014, - SMSG_LFG_TELEPORT_DENIED = 0x460016, - SMSG_LFG_UPDATE_STATUS = 0x460008, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x380207, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x380206, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3801FA, - SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x380208, - SMSG_LOAD_CUF_PROFILES = 0x380055, - SMSG_LOAD_EQUIPMENT_SET = 0x3801A8, - SMSG_LOBBY_MATCHMAKER_LOBBY_ACQUIRED_SERVER = 0x38030D, - SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x38030E, - SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED = 0x38030F, - SMSG_LOBBY_MATCHMAKER_QUEUE_PROPOSED = 0x380311, - SMSG_LOBBY_MATCHMAKER_QUEUE_RESULT = 0x380312, - SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE = 0x380310, - SMSG_LOGIN_SET_TIME_SPEED = 0x3801A7, - SMSG_LOGIN_VERIFY_WORLD = 0x38002F, - SMSG_LOGOUT_CANCEL_ACK = 0x380120, - SMSG_LOGOUT_COMPLETE = 0x38011F, - SMSG_LOGOUT_RESPONSE = 0x38011E, - SMSG_LOG_XP_GAIN = 0x38017E, - SMSG_LOOT_ALL_PASSED = 0x3800B9, - SMSG_LOOT_LIST = 0x3801D9, - SMSG_LOOT_MONEY_NOTIFY = 0x3800B4, - SMSG_LOOT_RELEASE = 0x3800B3, - SMSG_LOOT_RELEASE_ALL = 0x3800B2, - SMSG_LOOT_REMOVED = 0x3800AE, - SMSG_LOOT_RESPONSE = 0x3800AD, - SMSG_LOOT_ROLL = 0x3800B6, - SMSG_LOOT_ROLLS_COMPLETE = 0x3800B8, - SMSG_LOOT_ROLL_WON = 0x3800BA, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x38010A, - SMSG_MAIL_COMMAND_RESULT = 0x3800D3, - SMSG_MAIL_LIST_RESULT = 0x3801EE, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x3801EF, - SMSG_MAP_OBJECTIVES_INIT = 0x3E002A, - SMSG_MAP_OBJ_EVENTS = 0x38005F, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x3800B7, - SMSG_MEETING_STONE_FAILED = 0x380313, - SMSG_MESSAGE_BOX = 0x38000A, - SMSG_MINIMAP_PING = 0x380168, - SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x4E0004, - SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x4E0003, - SMSG_MISSILE_CANCEL = 0x380060, - SMSG_MODIFY_COOLDOWN = 0x3801FC, - SMSG_MOTD = 0x3D0003, - SMSG_MOUNT_RESULT = 0x38000F, - SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x3802C2, - SMSG_MOVE_ADD_IMPULSE = 0x490062, - SMSG_MOVE_APPLY_INERTIA = 0x49005E, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x490045, - SMSG_MOVE_DISABLE_COLLISION = 0x490041, - SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x49002B, - SMSG_MOVE_DISABLE_FULL_SPEED_TURNING = 0x490075, - SMSG_MOVE_DISABLE_GRAVITY = 0x49003D, - SMSG_MOVE_DISABLE_INERTIA = 0x49003F, - SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x49003C, - SMSG_MOVE_ENABLE_COLLISION = 0x490042, - SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x49002A, - SMSG_MOVE_ENABLE_FULL_SPEED_TURNING = 0x490074, - SMSG_MOVE_ENABLE_GRAVITY = 0x49003E, - SMSG_MOVE_ENABLE_INERTIA = 0x490040, - SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x49003B, - SMSG_MOVE_KNOCK_BACK = 0x490031, - SMSG_MOVE_REMOVE_INERTIA = 0x49005F, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x490046, - SMSG_MOVE_ROOT = 0x490027, - SMSG_MOVE_SET_ACTIVE_MOVER = 0x490003, - SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 0x49006B, - SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = 0x490066, - SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = 0x49006C, - SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 0x490069, - SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = 0x49006A, - SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 0x490072, - SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = 0x490068, - SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = 0x490067, - SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = 0x490071, - SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = 0x49006D, - SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0x49006E, - SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0x490070, - SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0x49006F, - SMSG_MOVE_SET_CANT_SWIM = 0x490035, - SMSG_MOVE_SET_CAN_ADV_FLY = 0x490064, - SMSG_MOVE_SET_CAN_DRIVE = 0x490076, - SMSG_MOVE_SET_CAN_FLY = 0x490033, - SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x490037, - SMSG_MOVE_SET_COLLISION_HEIGHT = 0x490043, - SMSG_MOVE_SET_COMPOUND_STATE = 0x490047, - SMSG_MOVE_SET_FEATHER_FALL = 0x49002D, - SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x490023, - SMSG_MOVE_SET_FLIGHT_SPEED = 0x490022, - SMSG_MOVE_SET_HOVERING = 0x49002F, - SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x490039, - SMSG_MOVE_SET_LAND_WALK = 0x49002C, - SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x490014, - SMSG_MOVE_SET_NORMAL_FALL = 0x49002E, - SMSG_MOVE_SET_PITCH_RATE = 0x490026, - SMSG_MOVE_SET_RUN_BACK_SPEED = 0x49001F, - SMSG_MOVE_SET_RUN_SPEED = 0x49001E, - SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x490021, - SMSG_MOVE_SET_SWIM_SPEED = 0x490020, - SMSG_MOVE_SET_TURN_RATE = 0x490025, - SMSG_MOVE_SET_VEHICLE_REC_ID = 0x490044, - SMSG_MOVE_SET_WALK_SPEED = 0x490024, - SMSG_MOVE_SET_WATER_WALK = 0x490029, - SMSG_MOVE_SKIP_TIME = 0x490048, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x49004D, - SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x49004B, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x49004E, - SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x49004C, - SMSG_MOVE_SPLINE_ROOT = 0x490049, - SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x49004F, - SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x49001A, - SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x490019, - SMSG_MOVE_SPLINE_SET_FLYING = 0x490059, - SMSG_MOVE_SPLINE_SET_HOVER = 0x490051, - SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x490054, - SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x490050, - SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x49001D, - SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x490016, - SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x490057, - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x490015, - SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x490018, - SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x490017, - SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x49001C, - SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x490058, - SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x49001B, - SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x490053, - SMSG_MOVE_SPLINE_START_SWIM = 0x490055, - SMSG_MOVE_SPLINE_STOP_SWIM = 0x490056, - SMSG_MOVE_SPLINE_UNROOT = 0x49004A, - SMSG_MOVE_SPLINE_UNSET_FLYING = 0x49005A, - SMSG_MOVE_SPLINE_UNSET_HOVER = 0x490052, - SMSG_MOVE_TELEPORT = 0x490032, - SMSG_MOVE_UNROOT = 0x490028, - SMSG_MOVE_UNSET_CANT_SWIM = 0x490036, - SMSG_MOVE_UNSET_CAN_ADV_FLY = 0x490065, - SMSG_MOVE_UNSET_CAN_DRIVE = 0x490077, - SMSG_MOVE_UNSET_CAN_FLY = 0x490034, - SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x490038, - SMSG_MOVE_UNSET_HOVERING = 0x490030, - SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x49003A, - SMSG_MOVE_UPDATE = 0x49000E, - SMSG_MOVE_UPDATE_ADD_IMPULSE = 0x490063, - SMSG_MOVE_UPDATE_APPLY_INERTIA = 0x490060, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x490012, - SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x49000D, - SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x49000A, - SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x490009, - SMSG_MOVE_UPDATE_KNOCK_BACK = 0x490010, - SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x490011, - SMSG_MOVE_UPDATE_PITCH_RATE = 0x49000C, - SMSG_MOVE_UPDATE_REMOVE_INERTIA = 0x490061, - SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x490013, - SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x490005, - SMSG_MOVE_UPDATE_RUN_SPEED = 0x490004, - SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x490008, - SMSG_MOVE_UPDATE_SWIM_SPEED = 0x490007, - SMSG_MOVE_UPDATE_TELEPORT = 0x49000F, - SMSG_MOVE_UPDATE_TURN_RATE = 0x49000B, - SMSG_MOVE_UPDATE_WALK_SPEED = 0x490006, - SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x380272, - SMSG_MULTI_FLOOR_NEW_FLOOR = 0x380271, - SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x3800A3, - SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x3800A5, - SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x3800AA, - SMSG_MYTHIC_PLUS_SEASON_DATA = 0x3800A4, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x380074, - SMSG_NEW_DATA_BUILD = 0x380337, - SMSG_NEW_TAXI_PATH = 0x380119, - SMSG_NEW_WORLD = 0x38002B, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x4E0034, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x380145, - SMSG_NOTIFY_MONEY = 0x380031, - SMSG_NOTIFY_RECEIVED_MAIL = 0x3800D4, - SMSG_NPC_INTERACTION_OPEN_RESULT = 0x380309, - SMSG_OFFER_PETITION_ERROR = 0x380150, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x38017F, - SMSG_ON_MONSTER_MOVE = 0x490002, - SMSG_OPEN_ARTIFACT_FORGE = 0x380236, - SMSG_OPEN_CONTAINER = 0x4F0006, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x460015, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x38022E, - SMSG_OVERRIDE_LIGHT = 0x380155, - SMSG_PAGE_TEXT = 0x3801B3, - SMSG_PARTY_COMMAND_RESULT = 0x380228, - SMSG_PARTY_ELIGIBILITY_FOR_DELVE_TIERS_RESPONSE = 0x38034C, - SMSG_PARTY_INVITE = 0x380056, - SMSG_PARTY_KILL_LOG = 0x3801F2, - SMSG_PARTY_MEMBER_FULL_STATE = 0x3801F1, - SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x3801F0, - SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x3802F2, - SMSG_PARTY_UPDATE = 0x38008C, - SMSG_PAST_TIME_EVENTS = 0x38005B, - SMSG_PAUSE_MIRROR_TIMER = 0x3801AA, - SMSG_PENDING_RAID_LOCK = 0x380191, - SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0x380306, - SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = 0x380302, - SMSG_PERKS_PROGRAM_DISABLED = 0x380307, - SMSG_PERKS_PROGRAM_RESULT = 0x380303, - SMSG_PERKS_PROGRAM_VENDOR_UPDATE = 0x380301, - SMSG_PETITION_ALREADY_SIGNED = 0x380037, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x440042, - SMSG_PETITION_SHOW_LIST = 0x380158, - SMSG_PETITION_SHOW_SIGNATURES = 0x380159, - SMSG_PETITION_SIGN_RESULTS = 0x3801E4, - SMSG_PET_ACTION_FEEDBACK = 0x3801E1, - SMSG_PET_ACTION_SOUND = 0x38013B, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x38009A, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x38010F, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x380093, - SMSG_PET_BATTLE_FINAL_ROUND = 0x380098, - SMSG_PET_BATTLE_FINISHED = 0x380099, - SMSG_PET_BATTLE_FIRST_ROUND = 0x380095, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x380094, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x38009B, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x380092, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x3800D1, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x3800D2, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x380097, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x380091, - SMSG_PET_BATTLE_ROUND_RESULT = 0x380096, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x380084, - SMSG_PET_CAST_FAILED = 0x4E0049, - SMSG_PET_CLEAR_SPELLS = 0x4E0013, - SMSG_PET_DISMISS_SOUND = 0x38013C, - SMSG_PET_GOD_MODE = 0x380116, - SMSG_PET_GUIDS = 0x38019D, - SMSG_PET_LEARNED_SPELLS = 0x4E0040, - SMSG_PET_MODE = 0x38001F, - SMSG_PET_NAME_INVALID = 0x38015D, - SMSG_PET_NEWLY_TAMED = 0x38001E, - SMSG_PET_SPELLS_MESSAGE = 0x4E0014, - SMSG_PET_STABLE_RESULT = 0x38002A, - SMSG_PET_TAME_FAILURE = 0x38014D, - SMSG_PET_UNLEARNED_SPELLS = 0x4E0041, - SMSG_PHASE_SHIFT_CHANGE = 0x38000C, - SMSG_PLAYED_TIME = 0x38016F, - SMSG_PLAYER_ACKOWLEDGE_ARROW_CALLOUT = 0x4B002D, - SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x4B001F, - SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x4B001E, - SMSG_PLAYER_BONUS_ROLL_FAILED = 0x4B0021, - SMSG_PLAYER_BOUND = 0x4B0000, - SMSG_PLAYER_CHOICE_CLEAR = 0x4B0006, - SMSG_PLAYER_CHOICE_DISPLAY_ERROR = 0x4B0005, - SMSG_PLAYER_CONDITION_RESULT = 0x4B0012, - SMSG_PLAYER_END_OF_MATCH_DETAILS = 0x4B002F, - SMSG_PLAYER_HIDE_ARROW_CALLOUT = 0x4B002C, - SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x4B0011, - SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x4B0016, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x440041, - SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = 0x4B002E, - SMSG_PLAYER_SHOW_ARROW_CALLOUT = 0x4B002B, - SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY = 0x4B0029, - SMSG_PLAYER_SHOW_PARTY_POSE_UI = 0x4B002A, - SMSG_PLAYER_SHOW_UI_EVENT_TOAST = 0x4B0024, - SMSG_PLAYER_SKINNED = 0x4B000E, - SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x4B0015, - SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x4B0014, - SMSG_PLAY_MUSIC = 0x380201, - SMSG_PLAY_OBJECT_SOUND = 0x380203, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x3801C9, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x4E0038, - SMSG_PLAY_SCENE = 0x3800CE, - SMSG_PLAY_SOUND = 0x380200, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x380204, - SMSG_PLAY_SPELL_VISUAL = 0x4E0036, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x4E003A, - SMSG_PLAY_TIME_WARNING = 0x380197, - SMSG_PONG = 0x3F0006, - SMSG_POWER_UPDATE = 0x38016C, - SMSG_PRELOAD_CHILD_MAP = 0x38000D, - SMSG_PRELOAD_WORLD = 0x38002C, - SMSG_PREPOPULATE_NAME_CACHE = 0x3802C5, - SMSG_PRE_RESSURECT = 0x3801FF, - SMSG_PRINT_NOTIFICATION = 0x380063, - SMSG_PROC_RESIST = 0x3801F3, - SMSG_PROFESSION_GOSSIP = 0x380292, - SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x4E0042, - SMSG_PVP_CREDIT = 0x3E0024, - SMSG_PVP_MATCH_COMPLETE = 0x3E002F, - SMSG_PVP_MATCH_INITIALIZE = 0x3E0030, - SMSG_PVP_MATCH_SET_STATE = 0x3E002E, - SMSG_PVP_MATCH_START = 0x3E002D, - SMSG_PVP_MATCH_STATISTICS = 0x3E0010, - SMSG_PVP_OPTIONS_ENABLED = 0x3E0013, - SMSG_PVP_TIER_RECORD = 0x3802FD, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x3C000C, - SMSG_QUERY_CREATURE_RESPONSE = 0x3C0006, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x3C0007, - SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x420041, - SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = 0x44002F, - SMSG_QUERY_GUILD_INFO_RESPONSE = 0x44002D, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x3C0010, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x3C0008, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x3C0009, - SMSG_QUERY_PETITION_RESPONSE = 0x3C000D, - SMSG_QUERY_PET_NAME_RESPONSE = 0x3C000B, - SMSG_QUERY_PLAYER_NAMES_RESPONSE = 0x4B0026, - SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x4B000A, - SMSG_QUERY_QUEST_INFO_RESPONSE = 0x4C0016, - SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0x44002E, - SMSG_QUERY_TIME_RESPONSE = 0x38017D, - SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x4C0001, - SMSG_QUEST_CONFIRM_ACCEPT = 0x4C000F, - SMSG_QUEST_FORCE_REMOVED = 0x4C001C, - SMSG_QUEST_GIVER_INVALID_QUEST = 0x4C0005, - SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x4C0014, - SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x4C0003, - SMSG_QUEST_GIVER_QUEST_DETAILS = 0x4C0012, - SMSG_QUEST_GIVER_QUEST_FAILED = 0x4C0006, - SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x4C001A, - SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x4C0013, - SMSG_QUEST_GIVER_STATUS = 0x4C001B, - SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x4C0011, - SMSG_QUEST_ITEM_USABILITY_RESPONSE = 0x4C0002, - SMSG_QUEST_LOG_FULL = 0x4C0007, - SMSG_QUEST_NON_LOG_UPDATE_COMPLETE = 0x4C0008, - SMSG_QUEST_POI_QUERY_RESPONSE = 0x4C001D, - SMSG_QUEST_POI_UPDATE_RESPONSE = 0x4C001F, - SMSG_QUEST_PUSH_RESULT = 0x4C0010, - SMSG_QUEST_SESSION_INFO_RESPONSE = 0x3802E8, - SMSG_QUEST_SESSION_READY_CHECK = 0x3802D6, - SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x3802D7, - SMSG_QUEST_SESSION_RESULT = 0x3802D5, - SMSG_QUEST_UPDATE_ADD_CREDIT = 0x4C000C, - SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x4C000D, - SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x4C000E, - SMSG_QUEST_UPDATE_COMPLETE = 0x4C0009, - SMSG_QUEST_UPDATE_FAILED = 0x4C000A, - SMSG_QUEST_UPDATE_FAILED_TIMER = 0x4C000B, - SMSG_QUEUE_SUMMARY_UPDATE = 0x3802A5, - SMSG_RAF_ACCOUNT_INFO = 0x3802D3, - SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x3802E4, - SMSG_RAF_DEBUG_FRIEND_MONTHS = 0x380334, - SMSG_RAID_DIFFICULTY_SET = 0x380240, - SMSG_RAID_GROUP_ONLY = 0x380242, - SMSG_RAID_INSTANCE_MESSAGE = 0x3D000A, - SMSG_RAID_MARKERS_CHANGED = 0x380038, - SMSG_RANDOM_ROLL = 0x3800C8, - SMSG_RATED_PVP_INFO = 0x3E000F, - SMSG_READY_CHECK_COMPLETED = 0x380090, - SMSG_READY_CHECK_RESPONSE = 0x38008F, - SMSG_READY_CHECK_STARTED = 0x38008E, - SMSG_READ_ITEM_RESULT_FAILED = 0x38023C, - SMSG_READ_ITEM_RESULT_OK = 0x380233, - SMSG_REALM_QUERY_RESPONSE = 0x3C0005, - SMSG_REATTACH_RESURRECT = 0x3801E3, - SMSG_RECEIVE_PING_UNIT = 0x380039, - SMSG_RECEIVE_PING_WORLD_POINT = 0x38003A, - SMSG_RECRAFT_ITEM_RESULT = 0x38032A, - SMSG_RECRUIT_A_FRIEND_FAILURE = 0x38015A, - SMSG_REFRESH_COMPONENT = 0x3800E9, - SMSG_REGIONWIDE_CHARACTER_MAIL_DATA = 0x38001A, - SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA = 0x380019, - SMSG_REMOVE_ITEM_PASSIVE = 0x380043, - SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x4E0043, - SMSG_REPLACE_TROPHY_RESPONSE = 0x380258, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x4B0009, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x380025, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x3E0014, - SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x3E0015, - SMSG_RESET_COMPRESSION_CONTEXT = 0x3F0007, - SMSG_RESET_FAILED_NOTIFY = 0x380151, - SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x380331, - SMSG_RESET_QUEST_POI = 0x4C0020, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x3E0023, - SMSG_RESET_WEEKLY_CURRENCY = 0x380009, - SMSG_RESPEC_WIPE_CONFIRM = 0x3800AB, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x380006, - SMSG_RESPONSE_PERK_PENDING_REWARDS = 0x380304, - SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0x380305, - SMSG_RESTART_GLOBAL_COOLDOWN = 0x4E0052, - SMSG_RESTRICTED_ACCOUNT_WARNING = 0x380052, - SMSG_RESUME_CAST = 0x4E002C, - SMSG_RESUME_CAST_BAR = 0x4E002F, - SMSG_RESUME_COMMS = 0x3F0003, - SMSG_RESUME_TOKEN = 0x380041, - SMSG_RESURRECT_REQUEST = 0x380012, - SMSG_RESYNC_RUNES = 0x4E0050, - SMSG_RETURNING_PLAYER_PROMPT = 0x38023B, - SMSG_RETURN_APPLICANT_LIST = 0x3802C9, - SMSG_RETURN_RECRUITING_CLUBS = 0x3802C8, - SMSG_ROLE_CHANGED_INFORM = 0x380021, - SMSG_ROLE_CHOSEN = 0x46001D, - SMSG_ROLE_POLL_INFORM = 0x380022, - SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x380291, - SMSG_RUNE_REGEN_DEBUG = 0x38004F, - SMSG_SCENARIO_COMPLETED = 0x38027F, - SMSG_SCENARIO_POIS = 0x3800CB, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x3800C4, - SMSG_SCENARIO_SHOW_CRITERIA = 0x380295, - SMSG_SCENARIO_STATE = 0x3800C3, - SMSG_SCENARIO_UI_UPDATE = 0x380294, - SMSG_SCENARIO_VACATE = 0x38023D, - SMSG_SCENE_OBJECT_EVENT = 0x38007A, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x38007F, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x380080, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x38007C, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x38007B, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x38007E, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x38007D, - SMSG_SCHEDULED_AREA_POI_UPDATE_RESPONSE = 0x4B0019, - SMSG_SCRIPT_CAST = 0x4E0047, - SMSG_SEASON_INFO = 0x38005A, - SMSG_SELL_RESPONSE = 0x38015E, - SMSG_SEND_ITEM_PASSIVES = 0x380044, - SMSG_SEND_KNOWN_SPELLS = 0x4E0019, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x3800C6, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x3800C7, - SMSG_SEND_SPELL_CHARGES = 0x4E001B, - SMSG_SEND_SPELL_HISTORY = 0x4E001A, - SMSG_SEND_UNLEARN_SPELLS = 0x4E001C, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x3800E6, - SMSG_SERVER_TIME = 0x38011D, - SMSG_SERVER_TIME_OFFSET = 0x3801AE, - SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = 0x4E000F, - SMSG_SETUP_CURRENCY = 0x380007, - SMSG_SET_AI_ANIM_KIT = 0x3801C8, - SMSG_SET_ANIM_TIER = 0x3801CC, - SMSG_SET_CHR_UPGRADE_TIER = 0x380077, - SMSG_SET_CURRENCY = 0x380008, - SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x460012, - SMSG_SET_DUNGEON_DIFFICULTY = 0x38013F, - SMSG_SET_FACTION_AT_WAR = 0x380199, - SMSG_SET_FACTION_NOT_VISIBLE = 0x3801C3, - SMSG_SET_FACTION_STANDING = 0x3801C4, - SMSG_SET_FACTION_VISIBLE = 0x3801C2, - SMSG_SET_FLAT_SPELL_MODIFIER = 0x4E0027, - SMSG_SET_ITEM_PURCHASE_DATA = 0x380033, - SMSG_SET_LOOT_METHOD_FAILED = 0x380263, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x380036, - SMSG_SET_MELEE_ANIM_KIT = 0x3801CB, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x3801CA, - SMSG_SET_PCT_SPELL_MODIFIER = 0x4E0028, - SMSG_SET_PET_SPECIALIZATION = 0x3800BD, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x4B000B, - SMSG_SET_PLAY_HOVER_ANIM = 0x380053, - SMSG_SET_PROFICIENCY = 0x3801CD, - SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x3802DC, - SMSG_SET_SHIPMENT_READY_RESPONSE = 0x42003A, - SMSG_SET_SPELL_CHARGES = 0x4E0018, - SMSG_SET_TIME_ZONE_INFORMATION = 0x380112, - SMSG_SET_VEHICLE_REC_ID = 0x380190, - SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x380308, - SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x42003B, - SMSG_SHOW_DELVES_COMPANION_CONFIGURATION_UI = 0x38034A, - SMSG_SHOW_DELVES_DISPLAY_UI = 0x380348, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x380073, - SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x4C0015, - SMSG_SHOW_TAXI_NODES = 0x380167, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x380209, - SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x380314, - SMSG_SOCKET_GEMS_FAILURE = 0x3801C0, - SMSG_SOCKET_GEMS_SUCCESS = 0x3801BF, - SMSG_SPECIAL_MOUNT_ANIM = 0x38013A, - SMSG_SPECTATE_END = 0x380336, - SMSG_SPECTATE_PLAYER = 0x380335, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x3801B2, - SMSG_SPELL_ABSORB_LOG = 0x4E000C, - SMSG_SPELL_CATEGORY_COOLDOWN = 0x4E0006, - SMSG_SPELL_CHANNEL_START = 0x4E0022, - SMSG_SPELL_CHANNEL_UPDATE = 0x4E0023, - SMSG_SPELL_COOLDOWN = 0x4E0005, - SMSG_SPELL_DAMAGE_SHIELD = 0x4E001F, - SMSG_SPELL_DELAYED = 0x4E0030, - SMSG_SPELL_DISPELL_LOG = 0x4E0007, - SMSG_SPELL_EMPOWER_SET_STAGE = 0x4E0026, - SMSG_SPELL_EMPOWER_START = 0x4E0024, - SMSG_SPELL_EMPOWER_UPDATE = 0x4E0025, - SMSG_SPELL_ENERGIZE_LOG = 0x4E0009, - SMSG_SPELL_EXECUTE_LOG = 0x4E0031, - SMSG_SPELL_FAILED_OTHER = 0x4E0046, - SMSG_SPELL_FAILURE = 0x4E0044, - SMSG_SPELL_FAILURE_MESSAGE = 0x4E004B, - SMSG_SPELL_GO = 0x4E002A, - SMSG_SPELL_HEAL_ABSORB_LOG = 0x4E000B, - SMSG_SPELL_HEAL_LOG = 0x4E000A, - SMSG_SPELL_INSTAKILL_LOG = 0x4E0021, - SMSG_SPELL_INTERRUPT_LOG = 0x4E000D, - SMSG_SPELL_MISS_LOG = 0x4E0032, - SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x4E0020, - SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x4E001D, - SMSG_SPELL_PERIODIC_AURA_LOG = 0x4E0008, - SMSG_SPELL_PREPARE = 0x4E0029, - SMSG_SPELL_START = 0x4E002B, - SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x380065, - SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x3802EE, - SMSG_STAND_STATE_UPDATE = 0x3801B6, - SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0x38006B, - SMSG_START_ELAPSED_TIMER = 0x38009C, - SMSG_START_ELAPSED_TIMERS = 0x38009E, - SMSG_START_LIGHTNING_STORM = 0x380142, - SMSG_START_LOOT_ROLL = 0x3800B5, - SMSG_START_MIRROR_TIMER = 0x3801A9, - SMSG_START_TIMER = 0x38003D, - SMSG_STOP_ELAPSED_TIMER = 0x38009D, - SMSG_STOP_MIRROR_TIMER = 0x3801AB, - SMSG_STOP_SPEAKERBOT_SOUND = 0x380205, - SMSG_STOP_TIMER = 0x38003E, - SMSG_STREAMING_MOVIES = 0x38003C, - SMSG_SUGGEST_INVITE_INFORM = 0x380229, - SMSG_SUMMON_CANCEL = 0x38014B, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x380023, - SMSG_SUMMON_REQUEST = 0x3801BA, - SMSG_SUPERCEDED_SPELLS = 0x4E003D, - SMSG_SUSPEND_COMMS = 0x3F0002, - SMSG_SUSPEND_TOKEN = 0x380040, - SMSG_SYNC_WOW_ENTITLEMENTS = 0x3802E6, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x3801B1, - SMSG_TAXI_NODE_STATUS = 0x380117, - SMSG_TEXT_EMOTE = 0x380115, - SMSG_THREAT_CLEAR = 0x380176, - SMSG_THREAT_REMOVE = 0x380175, - SMSG_THREAT_UPDATE = 0x380174, - SMSG_TIMERUNNING_SEASON_ENDED = 0x38034B, - SMSG_TIME_ADJUSTMENT = 0x490001, - SMSG_TIME_SYNC_REQUEST = 0x490000, - SMSG_TITLE_EARNED = 0x380171, - SMSG_TITLE_LOST = 0x380172, - SMSG_TOTEM_CREATED = 0x380161, - SMSG_TOTEM_DURATION_CHANGED = 0x380163, - SMSG_TOTEM_MOVED = 0x380164, - SMSG_TOTEM_REMOVED = 0x380162, - SMSG_TRADE_STATUS = 0x380017, - SMSG_TRADE_UPDATED = 0x380016, - SMSG_TRAINER_BUY_FAILED = 0x380179, - SMSG_TRAINER_LIST = 0x380178, - SMSG_TRAIT_CONFIG_COMMIT_FAILED = 0x38006A, - SMSG_TRANSFER_ABORTED = 0x38019C, - SMSG_TRANSFER_PENDING = 0x380066, - SMSG_TREASURE_PICKER_RESPONSE = 0x3C0011, - SMSG_TRIGGER_CINEMATIC = 0x38025D, - SMSG_TRIGGER_MOVIE = 0x380165, - SMSG_TURN_IN_PETITION_RESULT = 0x3801E6, - SMSG_TUTORIAL_FLAGS = 0x380251, - SMSG_UI_ACTION = 0x380202, - SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x4C0023, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x38025E, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x38025F, - SMSG_UNLEARNED_SPELLS = 0x4E003F, - SMSG_UNLOAD_CHILD_MAP = 0x38000E, - SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x3802FE, - SMSG_UPDATE_ACCOUNT_DATA = 0x3801A2, - SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x3801A3, - SMSG_UPDATE_ACTION_BUTTONS = 0x380078, - SMSG_UPDATE_BNET_SESSION_KEY = 0x3802B6, - SMSG_UPDATE_CAPTURE_POINT = 0x3E0007, - SMSG_UPDATE_CELESTIAL_BODY = 0x3802B2, - SMSG_UPDATE_CHARACTER_FLAGS = 0x380257, - SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x3801FE, - SMSG_UPDATE_COOLDOWN = 0x3801FD, - SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x420038, - SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x420021, - SMSG_UPDATE_EXPANSION_LEVEL = 0x3800DE, - SMSG_UPDATE_GAME_TIME_STATE = 0x3802B9, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x380144, - SMSG_UPDATE_LAST_INSTANCE = 0x380123, - SMSG_UPDATE_OBJECT = 0x480000, - SMSG_UPDATE_PRIMARY_SPEC = 0x380070, - SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x38008D, - SMSG_UPDATE_TALENT_DATA = 0x38006F, - SMSG_UPDATE_WORLD_STATE = 0x3801E0, - SMSG_USERLIST_ADD = 0x3D000F, - SMSG_USERLIST_REMOVE = 0x3D0010, - SMSG_USERLIST_UPDATE = 0x3D0011, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x3801E7, - SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x3802AD, - SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x3802AB, - SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x3802AA, - SMSG_VAS_PURCHASE_COMPLETE = 0x380285, - SMSG_VAS_PURCHASE_STATE_UPDATE = 0x380284, - SMSG_VENDOR_INVENTORY = 0x380051, - SMSG_VIGNETTE_UPDATE = 0x4B0010, - SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x3802B1, - SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE = 0x3802F9, - SMSG_VOICE_LOGIN_RESPONSE = 0x3802B0, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x4F0004, - SMSG_VOID_STORAGE_CONTENTS = 0x4F0001, - SMSG_VOID_STORAGE_FAILED = 0x4F0000, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x4F0002, - SMSG_VOID_TRANSFER_RESULT = 0x4F0003, - SMSG_WAIT_QUEUE_FINISH = 0x380003, - SMSG_WAIT_QUEUE_UPDATE = 0x380002, - SMSG_WARDEN3_DATA = 0x38000B, - SMSG_WARDEN3_DISABLED = 0x3802B4, - SMSG_WARDEN3_ENABLED = 0x3802B3, - SMSG_WARFRONT_COMPLETE = 0x3801F6, - SMSG_WARGAME_REQUEST_OPPONENT_RESPONSE = 0x3E0012, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x3E0011, - SMSG_WEATHER = 0x380141, - SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x3802F1, - SMSG_WEEKLY_REWARDS_RESULT = 0x3802EF, - SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x3802F0, - SMSG_WHO = 0x3D0002, - SMSG_WHO_IS = 0x380140, - SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x3802B8, - SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x4B0017, - SMSG_WORLD_SERVER_INFO = 0x380045, - SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x3802E7, - SMSG_WOW_LABS_AREA_INFO = 0x380319, - SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_END = 0x380315, - SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_STATE_CHANGED = 0x380316, - SMSG_WOW_LABS_PARTY_ERROR = 0x380322, - SMSG_WOW_LABS_SET_AREA_ID_RESULT = 0x380317, - SMSG_WOW_LABS_SET_PREDICTION_CIRCLE = 0x38031B, - SMSG_WOW_LABS_SET_SELECTED_AREA_ID = 0x380318, - SMSG_XP_AWARDED_FROM_CURRENCY = 0x380330, - SMSG_XP_GAIN_ABORTED = 0x380062, - SMSG_XP_GAIN_ENABLED = 0x380241, - SMSG_ZONE_UNDER_ATTACK = 0x3D000B, + SMSG_ABORT_NEW_WORLD = 0x360030, + SMSG_ACCOUNT_CHARACTER_CURRENCY_LISTS = 0x360346, + SMSG_ACCOUNT_CONVERSION_STATE_UPDATE = 0x36034B, + SMSG_ACCOUNT_COSMETIC_ADDED = 0x3602FF, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x3602E7, + SMSG_ACCOUNT_DATA_TIMES = 0x3601A8, + SMSG_ACCOUNT_EXPORT_RESPONSE = 0x360337, + SMSG_ACCOUNT_ITEM_COLLECTION_DATA = 0x360351, + SMSG_ACCOUNT_MOUNT_REMOVED = 0x360047, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x360046, + SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x3602FE, + SMSG_ACCOUNT_STORE_CURRENCY_UPDATE = 0x360320, + SMSG_ACCOUNT_STORE_FRONT_UPDATE = 0x360321, + SMSG_ACCOUNT_STORE_ITEM_STATE_CHANGED = 0x360322, + SMSG_ACCOUNT_STORE_RESULT = 0x360323, + SMSG_ACCOUNT_TOY_UPDATE = 0x360048, + SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x36004C, + SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x36004B, + SMSG_ACCOUNT_WARBAND_SCENE_UPDATE = 0x36004E, + SMSG_ACHIEVEMENT_DELETED = 0x360185, + SMSG_ACHIEVEMENT_EARNED = 0x3600E0, + SMSG_ACTIVATE_ESSENCE_FAILED = 0x4A0020, + SMSG_ACTIVATE_SOULBIND_FAILED = 0x4A0022, + SMSG_ACTIVATE_TAXI_REPLY = 0x36011C, + SMSG_ACTIVE_GLYPHS = 0x4D0045, + SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0x3601E3, + SMSG_ADDON_LIST_REQUEST = 0x3600DF, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x3600DA, + SMSG_ADD_ITEM_PASSIVE = 0x360042, + SMSG_ADD_LOSS_OF_CONTROL = 0x36010F, + SMSG_ADD_RUNE_POWER = 0x360156, + SMSG_ADJUST_SPLINE_DURATION = 0x360069, + SMSG_ADVANCED_COMBAT_LOG = 0x3602FC, + SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x3602F7, + SMSG_AE_LOOT_TARGETS = 0x3600B5, + SMSG_AE_LOOT_TARGET_ACK = 0x3600B6, + SMSG_AI_REACTION = 0x360153, + SMSG_ALLIED_RACE_DETAILS = 0x360291, + SMSG_ALL_ACCOUNT_CRITERIA = 0x360005, + SMSG_ALL_ACHIEVEMENT_DATA = 0x360004, + SMSG_ALL_GUILD_ACHIEVEMENTS = 0x420000, + SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x3602D4, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x36001D, + SMSG_AREA_POI_UPDATE_RESPONSE = 0x4A0018, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x3601DC, + SMSG_AREA_TRIGGER_DENIED = 0x370004, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x3601B4, + SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x370002, + SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = 0x370003, + SMSG_ARENA_CLEAR_OPPONENTS = 0x3600E6, + SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x3600CF, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x3600E5, + SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x36023E, + SMSG_ARTIFACT_FORGE_ERROR = 0x36023C, + SMSG_ARTIFACT_RESPEC_PROMPT = 0x36023D, + SMSG_ARTIFACT_XP_GAIN = 0x360284, + SMSG_ATTACKER_STATE_UPDATE = 0x3C002C, + SMSG_ATTACK_START = 0x3C0017, + SMSG_ATTACK_STOP = 0x3C0018, + SMSG_ATTACK_SWING_ERROR = 0x3C0026, + SMSG_ATTACK_SWING_LANDED_LOG = 0x3C0027, + SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x36026D, + SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x36026C, + SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x36026B, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x360190, + SMSG_AUCTION_COMMAND_RESULT = 0x36018D, + SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x360324, + SMSG_AUCTION_FAVORITE_LIST = 0x3602EE, + SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x3602E6, + SMSG_AUCTION_HELLO_RESPONSE = 0x36018B, + SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x3602E5, + SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x3602E1, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x3602E2, + SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x3602E4, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x36018F, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x360191, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x36018C, + SMSG_AUCTION_WON_NOTIFICATION = 0x36018E, + SMSG_AURA_POINTS_DEPLETED = 0x4D0012, + SMSG_AURA_UPDATE = 0x4D0011, + SMSG_AUTH_CHALLENGE = 0x3D0000, + SMSG_AUTH_FAILED = 0x360000, + SMSG_AUTH_RESPONSE = 0x360001, + SMSG_AVAILABLE_HOTFIXES = 0x3A0001, + SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0x360325, + SMSG_BAG_CLEANUP_FINISHED = 0x4E0007, + SMSG_BARBER_SHOP_RESULT = 0x36015B, + SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x3602C5, + SMSG_BATTLEFIELD_LIST = 0x3C0005, + SMSG_BATTLEFIELD_PORT_DENIED = 0x3C000B, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x3C0001, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x3C0004, + SMSG_BATTLEFIELD_STATUS_GROUP_PROPOSAL_FAILED = 0x3C000E, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x3C0000, + SMSG_BATTLEFIELD_STATUS_NONE = 0x3C0003, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x3C0002, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x3C000D, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x3C000C, + SMSG_BATTLEGROUND_INIT = 0x3C0029, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x3C0009, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x3C000A, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x3C0006, + SMSG_BATTLEGROUND_POINTS = 0x3C0028, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x360226, + SMSG_BATTLENET_CHALLENGE_START = 0x360225, + SMSG_BATTLENET_NOTIFICATION = 0x36029D, + SMSG_BATTLENET_RESPONSE = 0x36029C, + SMSG_BATTLE_NET_CONNECTION_STATUS = 0x36029E, + SMSG_BATTLE_PAY_ACK_FAILED = 0x360221, + SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x360216, + SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x360217, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x360220, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x360214, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x360213, + SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x360304, + SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x360211, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x360212, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x360210, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x36020E, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x36020F, + SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x360215, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x36021F, + SMSG_BATTLE_PAY_START_CHECKOUT = 0x3602B9, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x36021D, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x36021C, + SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x3602AD, + SMSG_BATTLE_PETS_HEALED = 0x36008B, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x360117, + SMSG_BATTLE_PET_DELETED = 0x360088, + SMSG_BATTLE_PET_ERROR = 0x3600D5, + SMSG_BATTLE_PET_JOURNAL = 0x360087, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x360085, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x360086, + SMSG_BATTLE_PET_RESTORED = 0x36008A, + SMSG_BATTLE_PET_REVOKED = 0x360089, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x360083, + SMSG_BATTLE_PET_UPDATES = 0x360082, + SMSG_BIND_POINT_UPDATE = 0x360011, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x3600C5, + SMSG_BLACK_MARKET_OUTBID = 0x3600C6, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x3600C4, + SMSG_BLACK_MARKET_WON = 0x3600C7, + SMSG_BONUS_ROLL_EMPTY = 0x3600E2, + SMSG_BOSS_KILL = 0x3C002B, + SMSG_BREAK_TARGET = 0x3C0016, + SMSG_BROADCAST_ACHIEVEMENT = 0x3B0012, + SMSG_BROADCAST_SUMMON_CAST = 0x3602C7, + SMSG_BROADCAST_SUMMON_RESPONSE = 0x3602C8, + SMSG_BUY_FAILED = 0x360164, + SMSG_BUY_SUCCEEDED = 0x360163, + SMSG_CACHE_INFO = 0x3A000F, + SMSG_CACHE_VERSION = 0x3A000E, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x36013C, + SMSG_CALENDAR_COMMAND_RESULT = 0x36013D, + SMSG_CALENDAR_COMMUNITY_INVITE = 0x36012C, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x360134, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x360135, + SMSG_CALENDAR_INVITE_ADDED = 0x36012D, + SMSG_CALENDAR_INVITE_ALERT = 0x360131, + SMSG_CALENDAR_INVITE_NOTES = 0x360136, + SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x360137, + SMSG_CALENDAR_INVITE_REMOVED = 0x36012E, + SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x360133, + SMSG_CALENDAR_INVITE_STATUS = 0x36012F, + SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x360132, + SMSG_CALENDAR_MODERATOR_STATUS = 0x360130, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x360138, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x360139, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x36013A, + SMSG_CALENDAR_SEND_CALENDAR = 0x36012A, + SMSG_CALENDAR_SEND_EVENT = 0x36012B, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x36013B, + SMSG_CAMERA_EFFECT = 0x3601C2, + SMSG_CANCEL_AUTO_REPEAT = 0x36017B, + SMSG_CANCEL_COMBAT = 0x3C0025, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x4D0037, + SMSG_CANCEL_PING_PIN = 0x36003B, + SMSG_CANCEL_PRELOAD_WORLD = 0x36002E, + SMSG_CANCEL_SCENE = 0x3600D4, + SMSG_CANCEL_SPELL_VISUAL = 0x4D0035, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x4D0039, + SMSG_CAN_DUEL_RESULT = 0x3C0021, + SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x3602AC, + SMSG_CAPTURE_POINT_REMOVED = 0x3C0008, + SMSG_CAST_FAILED = 0x4D0048, + SMSG_CAS_REFRESH_REMOTE_DATA = 0x360115, + SMSG_CAUTIONARY_CHANNEL_MESSAGE = 0x3B0009, + SMSG_CAUTIONARY_CHAT_MESSAGE = 0x3B0008, + SMSG_CHAIN_MISSILE_BOUNCE = 0x360061, + SMSG_CHALLENGE_MODE_COMPLETE = 0x3600A6, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x3600A7, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x3600AD, + SMSG_CHALLENGE_MODE_RESET = 0x3600A5, + SMSG_CHALLENGE_MODE_SET_LEAVER_PENALTY_TIMER = 0x4A0030, + SMSG_CHALLENGE_MODE_START = 0x3600A3, + SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x3600A4, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x4A000C, + SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x36029F, + SMSG_CHANNEL_LIST = 0x3B001B, + SMSG_CHANNEL_NOTIFY = 0x3B0017, + SMSG_CHANNEL_NOTIFY_JOINED = 0x3B0019, + SMSG_CHANNEL_NOTIFY_LEFT = 0x3B001A, + SMSG_CHANNEL_NOTIFY_NPE_JOINED_BATCH = 0x3B0018, + SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x360259, + SMSG_CHARACTER_LOGIN_FAILED = 0x3601A2, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x360224, + SMSG_CHARACTER_RENAME_RESULT = 0x3601FF, + SMSG_CHARACTER_UPGRADE_ABORTED = 0x360258, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x360257, + SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x36025A, + SMSG_CHARACTER_UPGRADE_STARTED = 0x360256, + SMSG_CHAR_CUSTOMIZE_FAILURE = 0x36017F, + SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x360180, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x360243, + SMSG_CHAT = 0x3B0001, + SMSG_CHAT_AUTO_RESPONDED = 0x3B000E, + SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = 0x3B0022, + SMSG_CHAT_DOWN = 0x3B0014, + SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x3B0000, + SMSG_CHAT_IS_DOWN = 0x3B0015, + SMSG_CHAT_NOT_IN_GUILD = 0x3B0023, + SMSG_CHAT_NOT_IN_PARTY = 0x3B0006, + SMSG_CHAT_PLAYER_AMBIGUOUS = 0x3B0004, + SMSG_CHAT_PLAYER_NOTFOUND = 0x3B000D, + SMSG_CHAT_RECONNECT = 0x3B0016, + SMSG_CHAT_REGIONAL_SERVICE_STATUS = 0x3B001D, + SMSG_CHAT_RESTRICTED = 0x3B0007, + SMSG_CHAT_SERVER_MESSAGE = 0x3B001C, + SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x4D0002, + SMSG_CHECK_ABANDON_NPE = 0x4A0023, + SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0x36001B, + SMSG_CHECK_WARGAME_ENTRY = 0x360027, + SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x3602F1, + SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x3602D8, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x4D0016, + SMSG_CLEAR_BOSS_EMOTES = 0x360054, + SMSG_CLEAR_COOLDOWN = 0x360158, + SMSG_CLEAR_COOLDOWNS = 0x4D0015, + SMSG_CLEAR_RESURRECT = 0x360013, + SMSG_CLEAR_SPELL_CHARGES = 0x4D0017, + SMSG_CLEAR_TARGET = 0x3C0022, + SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x4B0022, + SMSG_CLOSE_ARTIFACT_FORGE = 0x36023B, + SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x3602D0, + SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x3602D3, + SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x3602D1, + SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x3602CE, + SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x3602D2, + SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x3602CF, + SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x360310, + SMSG_COIN_REMOVED = 0x3600B4, + SMSG_COMBAT_EVENT_FAILED = 0x3C0019, + SMSG_COMMENTATOR_MAP_INFO = 0x3601A4, + SMSG_COMMENTATOR_PLAYER_INFO = 0x3601A5, + SMSG_COMMENTATOR_STATE_CHANGED = 0x3601A3, + SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x360268, + SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x360274, + SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x36026A, + SMSG_COMMERCE_TOKEN_UPDATE = 0x360269, + SMSG_COMPLAINT_RESULT = 0x36014A, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x360234, + SMSG_CONFIRM_PARTY_INVITE = 0x3602AB, + SMSG_CONNECT_TO = 0x3D0005, + SMSG_CONSOLE_WRITE = 0x3600D2, + SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x360270, + SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x36026F, + SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x36026E, + SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x360272, + SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x360273, + SMSG_CONTACT_LIST = 0x360222, + SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x3602B2, + SMSG_CONTROL_UPDATE = 0x3600E4, + SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x3602FA, + SMSG_COOLDOWN_CHEAT = 0x3601D5, + SMSG_COOLDOWN_EVENT = 0x360157, + SMSG_CORPSE_LOCATION = 0x3600EB, + SMSG_CORPSE_RECLAIM_DELAY = 0x3601E6, + SMSG_CORPSE_TRANSPORT_QUERY = 0x3601B0, + SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0x4B0024, + SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x360294, + SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x3602FB, + SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x360331, + SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x36032D, + SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x360329, + SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x36032B, + SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x360327, + SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x36032C, + SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x360328, + SMSG_CRAFTING_ORDER_NPC_REWARD_INFO = 0x360333, + SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x36032F, + SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x36032A, + SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x360332, + SMSG_CRAFT_ENCHANT_RESULT = 0x360330, + SMSG_CREATE_CHAR = 0x36019E, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x360233, + SMSG_CREATOR_VISUALS_OVERRIDE = 0x360336, + SMSG_CRITERIA_DELETED = 0x360184, + SMSG_CRITERIA_UPDATE = 0x36017E, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x36015F, + SMSG_CURRENCY_TRANSFER_LOG = 0x360348, + SMSG_CURRENCY_TRANSFER_RESULT = 0x360347, + SMSG_CUSTOM_LOAD_SCREEN = 0x360064, + SMSG_DAILY_QUESTS_RESET = 0x4B0000, + SMSG_DAMAGE_CALC_LOG = 0x4D0054, + SMSG_DB_REPLY = 0x3A0000, + SMSG_DEATH_RELEASE_LOC = 0x360171, + SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x3600F3, + SMSG_DEFENSE_MESSAGE = 0x3B000C, + SMSG_DELETE_CHAR = 0x36019F, + SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x400022, + SMSG_DELVES_ACCOUNT_DATA_ELEMENT_CHANGED = 0x36034D, + SMSG_DESTROY_ARENA_UNIT = 0x3601DE, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x360196, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x360020, + SMSG_DISENCHANT_CREDIT = 0x36003F, + SMSG_DISMOUNT_RESULT = 0x360010, + SMSG_DISPEL_FAILED = 0x4D001E, + SMSG_DISPLAY_GAME_ERROR = 0x360035, + SMSG_DISPLAY_PLAYER_CHOICE = 0x4A0004, + SMSG_DISPLAY_PROMOTION = 0x3600E8, + SMSG_DISPLAY_QUEST_POPUP = 0x4B001E, + SMSG_DISPLAY_TOAST = 0x3600C1, + SMSG_DISPLAY_WORLD_TEXT = 0x360285, + SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x4D0053, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x360079, + SMSG_DROP_NEW_CONNECTION = 0x3D0004, + SMSG_DUEL_ARRANGED = 0x3C001B, + SMSG_DUEL_COMPLETE = 0x3C001F, + SMSG_DUEL_COUNTDOWN = 0x3C001E, + SMSG_DUEL_IN_BOUNDS = 0x3C001D, + SMSG_DUEL_OUT_OF_BOUNDS = 0x3C001C, + SMSG_DUEL_REQUESTED = 0x3C001A, + SMSG_DUEL_WINNER = 0x3C0020, + SMSG_DURABILITY_DAMAGE_DEATH = 0x3601E1, + SMSG_EMOTE = 0x360260, + SMSG_ENABLE_BARBER_SHOP = 0x36015A, + SMSG_ENCHANTMENT_LOG = 0x3601B1, + SMSG_ENCOUNTER_END = 0x36021B, + SMSG_ENCOUNTER_START = 0x36021A, + SMSG_END_LIGHTNING_STORM = 0x360147, + SMSG_ENTER_ENCRYPTED_MODE = 0x3D0001, + SMSG_ENUM_CHARACTERS_RESULT = 0x360018, + SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x36028A, + SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x4D000E, + SMSG_EQUIPMENT_SET_ID = 0x360150, + SMSG_EXPECTED_SPAM_RECORDS = 0x3B0005, + SMSG_EXPLORATION_EXPERIENCE = 0x3601FB, + SMSG_EXPORT_ACCOUNT_PROFILE = 0x3600F0, + SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x3602F8, + SMSG_FACTION_BONUS_INFO = 0x3601C1, + SMSG_FAILED_PLAYER_CONDITION = 0x4A0002, + SMSG_FAILED_QUEST_TURN_IN = 0x3602A8, + SMSG_FEATURE_SYSTEM_STATUS = 0x360058, + SMSG_FEATURE_SYSTEM_STATUS2 = 0x360345, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x360059, + SMSG_FEIGN_DEATH_RESISTED = 0x3601E0, + SMSG_FISH_ESCAPED = 0x36016E, + SMSG_FISH_NOT_HOOKED = 0x36016D, + SMSG_FLIGHT_SPLINE_SYNC = 0x48005B, + SMSG_FLUSH_COMBAT_LOG_FILE = 0x4D0010, + SMSG_FORCED_DEATH_UPDATE = 0x360172, + SMSG_FORCE_ANIM = 0x3601ED, + SMSG_FORCE_ANIMATIONS = 0x3601EE, + SMSG_FORCE_RANDOM_TRANSMOG_TOAST = 0x36004A, + SMSG_FORCE_SPAWN_TRACKING_UPDATE = 0x4B0021, + SMSG_FRIEND_STATUS = 0x360223, + SMSG_GAIN_MAW_POWER = 0x360279, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x36005C, + SMSG_GAME_OBJECT_BASE = 0x3602BF, + SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x36030F, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x36005D, + SMSG_GAME_OBJECT_DESPAWN = 0x36005E, + SMSG_GAME_OBJECT_INTERACTION = 0x36030E, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x4D003C, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x4D003B, + SMSG_GAME_OBJECT_RESET_STATE = 0x3601BB, + SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x36029B, + SMSG_GAME_SPEED_SET = 0x360120, + SMSG_GAME_TIME_SET = 0x3601AA, + SMSG_GAME_TIME_UPDATE = 0x3601A9, + SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x400024, + SMSG_GARRISON_ADD_EVENT = 0x400048, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x400016, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x40001A, + SMSG_GARRISON_ADD_SPEC_GROUPS = 0x40004B, + SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0x40004F, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x40002C, + SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0x400051, + SMSG_GARRISON_BUILDING_ACTIVATED = 0x40000B, + SMSG_GARRISON_BUILDING_REMOVED = 0x400004, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x400006, + SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0x40001D, + SMSG_GARRISON_CLEAR_COLLECTION = 0x400047, + SMSG_GARRISON_CLEAR_EVENT_LIST = 0x40004A, + SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0x40004C, + SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x400046, + SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x400045, + SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x40003D, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x40001C, + SMSG_GARRISON_CREATE_RESULT = 0x40000C, + SMSG_GARRISON_DELETE_MISSION_RESULT = 0x400023, + SMSG_GARRISON_DELETE_RESULT = 0x400035, + SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = 0x40002B, + SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = 0x400029, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x400027, + SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = 0x400028, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x400026, + SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = 0x40002A, + SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0x400033, + SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0x400015, + SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0x40001E, + SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x40003F, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x400007, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x400005, + SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x400040, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x400019, + SMSG_GARRISON_MAP_DATA_RESPONSE = 0x400042, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x400020, + SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x400043, + SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0x400025, + SMSG_GARRISON_OPEN_CRAFTER = 0x400037, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x400030, + SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x400003, + SMSG_GARRISON_PLOT_PLACED = 0x400001, + SMSG_GARRISON_PLOT_REMOVED = 0x400002, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x400034, + SMSG_GARRISON_REMOTE_INFO = 0x40000A, + SMSG_GARRISON_REMOVE_EVENT = 0x400049, + SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0x40002F, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x40002D, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x400017, + SMSG_GARRISON_RENAME_FOLLOWER_RESULT = 0x40002E, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x400009, + SMSG_GARRISON_RESEARCH_TALENT_RESULT = 0x40000E, + SMSG_GARRISON_RESET_TALENT_TREE = 0x400013, + SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0x400014, + SMSG_GARRISON_START_MISSION_RESULT = 0x40001B, + SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x40003C, + SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x40004D, + SMSG_GARRISON_TALENT_COMPLETED = 0x40000F, + SMSG_GARRISON_TALENT_REMOVED = 0x400010, + SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0x400012, + SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0x400011, + SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0x40004E, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x400008, + SMSG_GARRISON_UPDATE_FOLLOWER = 0x400018, + SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x40003E, + SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0x400050, + SMSG_GARRISON_UPGRADE_RESULT = 0x40000D, + SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x40001F, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x36001C, + SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x3602B3, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3601FD, + SMSG_GET_GARRISON_INFO_RESULT = 0x400000, + SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x360236, + SMSG_GET_REALM_HIDDEN_RESULT = 0x36033C, + SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x360271, + SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x36025E, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x360235, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x360231, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x36025D, + SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x360286, + SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x360287, + SMSG_GM_PLAYER_INFO = 0x4A000D, + SMSG_GM_REQUEST_PLAYER_INFO = 0x4A0003, + SMSG_GM_TICKET_CASE_STATUS = 0x360142, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x360141, + SMSG_GOD_MODE = 0x360199, + SMSG_GOSSIP_COMPLETE = 0x4B0017, + SMSG_GOSSIP_MESSAGE = 0x4B0018, + SMSG_GOSSIP_OPTION_NPC_INTERACTION = 0x4B0028, + SMSG_GOSSIP_POI = 0x36022E, + SMSG_GOSSIP_QUEST_UPDATE = 0x4B0019, + SMSG_GOSSIP_REFRESH_OPTIONS = 0x4B0027, + SMSG_GROUP_ACTION_THROTTLED = 0x360024, + SMSG_GROUP_AUTO_KICK = 0x36022B, + SMSG_GROUP_DECLINE = 0x360227, + SMSG_GROUP_DESTROYED = 0x36022A, + SMSG_GROUP_NEW_LEADER = 0x3600CA, + SMSG_GROUP_REQUEST_DECLINE = 0x360228, + SMSG_GROUP_UNINVITE = 0x360229, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x42000D, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x42000C, + SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x42000F, + SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x420027, + SMSG_GUILD_BANK_QUERY_RESULTS = 0x420026, + SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x420028, + SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x42002B, + SMSG_GUILD_CHALLENGE_COMPLETED = 0x42001B, + SMSG_GUILD_CHALLENGE_UPDATE = 0x42001A, + SMSG_GUILD_CHANGE_NAME_RESULT = 0x420025, + SMSG_GUILD_COMMAND_RESULT = 0x420002, + SMSG_GUILD_CRITERIA_DELETED = 0x42000E, + SMSG_GUILD_CRITERIA_UPDATE = 0x42000B, + SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x420040, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x42003F, + SMSG_GUILD_EVENT_DISBANDED = 0x420035, + SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x42002A, + SMSG_GUILD_EVENT_MOTD = 0x420036, + SMSG_GUILD_EVENT_NEW_LEADER = 0x420034, + SMSG_GUILD_EVENT_PLAYER_JOINED = 0x420032, + SMSG_GUILD_EVENT_PLAYER_LEFT = 0x420033, + SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x420037, + SMSG_GUILD_EVENT_RANKS_UPDATED = 0x420039, + SMSG_GUILD_EVENT_RANK_CHANGED = 0x42003A, + SMSG_GUILD_EVENT_STATUS_CHANGE = 0x420038, + SMSG_GUILD_EVENT_TAB_ADDED = 0x42003B, + SMSG_GUILD_EVENT_TAB_DELETED = 0x42003C, + SMSG_GUILD_EVENT_TAB_MODIFIED = 0x42003D, + SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x42003E, + SMSG_GUILD_FLAGGED_FOR_RENAME = 0x420024, + SMSG_GUILD_HARDCORE_MEMBER_DEATH = 0x420004, + SMSG_GUILD_INVITE = 0x420012, + SMSG_GUILD_INVITE_DECLINED = 0x420030, + SMSG_GUILD_INVITE_EXPIRED = 0x420031, + SMSG_GUILD_ITEM_LOOTED_NOTIFY = 0x42001C, + SMSG_GUILD_KNOWN_RECIPES = 0x420006, + SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x420007, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x42002C, + SMSG_GUILD_MEMBER_RECIPES = 0x420005, + SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x420011, + SMSG_GUILD_MOVED = 0x420022, + SMSG_GUILD_MOVE_STARTING = 0x420021, + SMSG_GUILD_NAME_CHANGED = 0x420023, + SMSG_GUILD_NEWS = 0x420009, + SMSG_GUILD_NEWS_DELETED = 0x42000A, + SMSG_GUILD_PARTY_STATE = 0x420013, + SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x420029, + SMSG_GUILD_RANKS = 0x420010, + SMSG_GUILD_RENAME_NAME_CHECK = 0x420044, + SMSG_GUILD_RENAME_REFUND_RESULT = 0x420046, + SMSG_GUILD_RENAME_REQUESTED_RESULT = 0x420045, + SMSG_GUILD_RENAME_STATUS_UPDATE = 0x420043, + SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x420014, + SMSG_GUILD_RESET = 0x420020, + SMSG_GUILD_REWARD_LIST = 0x420008, + SMSG_GUILD_ROSTER = 0x420003, + SMSG_GUILD_SEND_RANK_CHANGE = 0x420001, + SMSG_HARDCORE_DEATH_ALERT = 0x360344, + SMSG_HEALTH_UPDATE = 0x36016F, + SMSG_HIGHEST_THREAT_UPDATE = 0x360177, + SMSG_HOTFIX_CONNECT = 0x3A0003, + SMSG_HOTFIX_MESSAGE = 0x3A0002, + SMSG_INITIALIZE_FACTIONS = 0x3601C0, + SMSG_INITIAL_SETUP = 0x360014, + SMSG_INIT_WORLD_STATES = 0x3601E2, + SMSG_INSPECT_RESULT = 0x3600CE, + SMSG_INSTANCE_ABANDON_VOTE_COMPLETED = 0x360093, + SMSG_INSTANCE_ABANDON_VOTE_PLAYER_LEFT = 0x360094, + SMSG_INSTANCE_ABANDON_VOTE_RESPONSE = 0x360092, + SMSG_INSTANCE_ABANDON_VOTE_STARTED = 0x360091, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x360249, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x360248, + SMSG_INSTANCE_ENCOUNTER_END = 0x360251, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x360247, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x360253, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x360252, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x36024C, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x36024B, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x360250, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x360254, + SMSG_INSTANCE_ENCOUNTER_START = 0x36024D, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x36024A, + SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x36024F, + SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x36024E, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x360197, + SMSG_INSTANCE_INFO = 0x3600D1, + SMSG_INSTANCE_RESET = 0x360125, + SMSG_INSTANCE_RESET_FAILED = 0x360126, + SMSG_INSTANCE_SAVE_CREATED = 0x360219, + SMSG_INTERRUPT_POWER_REGEN = 0x4D004A, + SMSG_INVALIDATE_PAGE_TEXT = 0x3A000A, + SMSG_INVALIDATE_PLAYER = 0x4A0007, + SMSG_INVALID_PROMOTION_CODE = 0x3601EF, + SMSG_INVENTORY_CHANGE_FAILURE = 0x4E0005, + SMSG_INVENTORY_FIXUP_COMPLETE = 0x3602AA, + SMSG_INVENTORY_FULL_OVERFLOW = 0x3602BB, + SMSG_ISLAND_AZERITE_GAIN = 0x3601F8, + SMSG_ISLAND_COMPLETE = 0x3601F9, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x4B0004, + SMSG_ITEM_CHANGED = 0x360188, + SMSG_ITEM_COOLDOWN = 0x36025F, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x3601F1, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x360034, + SMSG_ITEM_INTERACTION_COMPLETE = 0x3602F0, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x360032, + SMSG_ITEM_PUSH_RESULT = 0x3600C0, + SMSG_ITEM_TIME_UPDATE = 0x3601F0, + SMSG_KICK_REASON = 0x360128, + SMSG_LATENCY_REPORT_PING = 0x360300, + SMSG_LEARNED_SPELLS = 0x4D003E, + SMSG_LEARN_PVP_TALENT_FAILED = 0x36006D, + SMSG_LEARN_TALENT_FAILED = 0x36006C, + SMSG_LEGACY_LOOT_RULES = 0x3602C0, + SMSG_LEVEL_LINKING_RESULT = 0x3602D6, + SMSG_LEVEL_UP_INFO = 0x360186, + SMSG_LFG_BOOT_PLAYER = 0x440019, + SMSG_LFG_DISABLED = 0x440017, + SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x44001F, + SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x440009, + SMSG_LFG_JOIN_LOBBY_MATCHMAKER_QUEUE = 0x440020, + SMSG_LFG_JOIN_RESULT = 0x440000, + SMSG_LFG_LIST_APPLICANT_LIST_UPDATE = 0x44000F, + SMSG_LFG_LIST_APPLICATION_STATUS_UPDATE = 0x44000C, + SMSG_LFG_LIST_APPLY_TO_GROUP_RESULT = 0x44000D, + SMSG_LFG_LIST_JOIN_RESULT = 0x440001, + SMSG_LFG_LIST_SEARCH_RESULTS = 0x440002, + SMSG_LFG_LIST_SEARCH_RESULTS_UPDATE = 0x440010, + SMSG_LFG_LIST_SEARCH_STATUS = 0x440003, + SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x44000E, + SMSG_LFG_LIST_UPDATE_EXPIRATION = 0x44000B, + SMSG_LFG_LIST_UPDATE_STATUS = 0x44000A, + SMSG_LFG_OFFER_CONTINUE = 0x440018, + SMSG_LFG_PARTY_INFO = 0x44001A, + SMSG_LFG_PLAYER_INFO = 0x44001B, + SMSG_LFG_PLAYER_REWARD = 0x44001C, + SMSG_LFG_PROPOSAL_UPDATE = 0x440011, + SMSG_LFG_QUEUE_STATUS = 0x440004, + SMSG_LFG_READY_CHECK_RESULT = 0x44001E, + SMSG_LFG_READY_CHECK_UPDATE = 0x440006, + SMSG_LFG_ROLE_CHECK_UPDATE = 0x440005, + SMSG_LFG_SLOT_INVALID = 0x440014, + SMSG_LFG_TELEPORT_DENIED = 0x440016, + SMSG_LFG_UPDATE_STATUS = 0x440008, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x36020B, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x36020A, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3601FE, + SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x36020C, + SMSG_LOAD_CUF_PROFILES = 0x360055, + SMSG_LOAD_EQUIPMENT_SET = 0x3601AC, + SMSG_LOBBY_MATCHMAKER_LOBBY_ACQUIRED_SERVER = 0x360311, + SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x360312, + SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED = 0x360313, + SMSG_LOBBY_MATCHMAKER_QUEUE_PROPOSED = 0x360315, + SMSG_LOBBY_MATCHMAKER_QUEUE_RESULT = 0x360316, + SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE = 0x360314, + SMSG_LOGIN_SET_TIME_SPEED = 0x3601AB, + SMSG_LOGIN_VERIFY_WORLD = 0x36002F, + SMSG_LOGOUT_CANCEL_ACK = 0x360124, + SMSG_LOGOUT_COMPLETE = 0x360123, + SMSG_LOGOUT_RESPONSE = 0x360122, + SMSG_LOG_XP_GAIN = 0x360182, + SMSG_LOOT_ALL_PASSED = 0x3600BE, + SMSG_LOOT_LIST = 0x3601DD, + SMSG_LOOT_MONEY_NOTIFY = 0x3600B9, + SMSG_LOOT_RELEASE = 0x3600B8, + SMSG_LOOT_RELEASE_ALL = 0x3600B7, + SMSG_LOOT_REMOVED = 0x3600B3, + SMSG_LOOT_RESPONSE = 0x3600B2, + SMSG_LOOT_ROLL = 0x3600BB, + SMSG_LOOT_ROLLS_COMPLETE = 0x3600BD, + SMSG_LOOT_ROLL_WON = 0x3600BF, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x36010E, + SMSG_MAIL_COMMAND_RESULT = 0x3600D8, + SMSG_MAIL_LIST_RESULT = 0x3601F2, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x3601F3, + SMSG_MAP_OBJECTIVES_INIT = 0x3C002A, + SMSG_MAP_OBJ_EVENTS = 0x36005F, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x3600BC, + SMSG_MEETING_STONE_FAILED = 0x360317, + SMSG_MESSAGE_BOX = 0x36000A, + SMSG_MINIMAP_PING = 0x36016C, + SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x4D0004, + SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x4D0003, + SMSG_MIRROR_VARS = 0x360355, + SMSG_MISSILE_CANCEL = 0x360060, + SMSG_MODIFY_COOLDOWN = 0x360200, + SMSG_MOTD = 0x3B0003, + SMSG_MOUNT_RESULT = 0x36000F, + SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x3602C6, + SMSG_MOVE_ADD_IMPULSE = 0x480062, + SMSG_MOVE_APPLY_INERTIA = 0x48005E, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x480045, + SMSG_MOVE_DISABLE_COLLISION = 0x480041, + SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x48002B, + SMSG_MOVE_DISABLE_FULL_SPEED_TURNING = 0x480075, + SMSG_MOVE_DISABLE_GRAVITY = 0x48003D, + SMSG_MOVE_DISABLE_INERTIA = 0x48003F, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x48003C, + SMSG_MOVE_ENABLE_COLLISION = 0x480042, + SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x48002A, + SMSG_MOVE_ENABLE_FULL_SPEED_TURNING = 0x480074, + SMSG_MOVE_ENABLE_GRAVITY = 0x48003E, + SMSG_MOVE_ENABLE_INERTIA = 0x480040, + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x48003B, + SMSG_MOVE_KNOCK_BACK = 0x480031, + SMSG_MOVE_REMOVE_INERTIA = 0x48005F, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x480046, + SMSG_MOVE_ROOT = 0x480027, + SMSG_MOVE_SET_ACTIVE_MOVER = 0x480003, + SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 0x48006B, + SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = 0x480066, + SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = 0x48006C, + SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 0x480069, + SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = 0x48006A, + SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 0x480072, + SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = 0x480068, + SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = 0x480067, + SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = 0x480071, + SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = 0x48006D, + SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0x48006E, + SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0x480070, + SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0x48006F, + SMSG_MOVE_SET_CANT_SWIM = 0x480035, + SMSG_MOVE_SET_CAN_ADV_FLY = 0x480064, + SMSG_MOVE_SET_CAN_DRIVE = 0x480076, + SMSG_MOVE_SET_CAN_FLY = 0x480033, + SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x480037, + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x480043, + SMSG_MOVE_SET_COMPOUND_STATE = 0x480047, + SMSG_MOVE_SET_FEATHER_FALL = 0x48002D, + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x480023, + SMSG_MOVE_SET_FLIGHT_SPEED = 0x480022, + SMSG_MOVE_SET_HOVERING = 0x48002F, + SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x480039, + SMSG_MOVE_SET_LAND_WALK = 0x48002C, + SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x480014, + SMSG_MOVE_SET_NORMAL_FALL = 0x48002E, + SMSG_MOVE_SET_PITCH_RATE = 0x480026, + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x48001F, + SMSG_MOVE_SET_RUN_SPEED = 0x48001E, + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x480021, + SMSG_MOVE_SET_SWIM_SPEED = 0x480020, + SMSG_MOVE_SET_TURN_RATE = 0x480025, + SMSG_MOVE_SET_VEHICLE_REC_ID = 0x480044, + SMSG_MOVE_SET_WALK_SPEED = 0x480024, + SMSG_MOVE_SET_WATER_WALK = 0x480029, + SMSG_MOVE_SKIP_TIME = 0x480048, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x48004D, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x48004B, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x48004E, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x48004C, + SMSG_MOVE_SPLINE_ROOT = 0x480049, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x48004F, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x48001A, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x480019, + SMSG_MOVE_SPLINE_SET_FLYING = 0x480059, + SMSG_MOVE_SPLINE_SET_HOVER = 0x480051, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x480054, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x480050, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x48001D, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x480016, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x480057, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x480015, + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x480018, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x480017, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x48001C, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x480058, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x48001B, + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x480053, + SMSG_MOVE_SPLINE_START_SWIM = 0x480055, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x480056, + SMSG_MOVE_SPLINE_UNROOT = 0x48004A, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0x48005A, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0x480052, + SMSG_MOVE_TELEPORT = 0x480032, + SMSG_MOVE_UNROOT = 0x480028, + SMSG_MOVE_UNSET_CANT_SWIM = 0x480036, + SMSG_MOVE_UNSET_CAN_ADV_FLY = 0x480065, + SMSG_MOVE_UNSET_CAN_DRIVE = 0x480077, + SMSG_MOVE_UNSET_CAN_FLY = 0x480034, + SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x480038, + SMSG_MOVE_UNSET_HOVERING = 0x480030, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x48003A, + SMSG_MOVE_UPDATE = 0x48000E, + SMSG_MOVE_UPDATE_ADD_IMPULSE = 0x480063, + SMSG_MOVE_UPDATE_APPLY_INERTIA = 0x480060, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x480012, + SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x48000D, + SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x48000A, + SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x480009, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x480010, + SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x480011, + SMSG_MOVE_UPDATE_PITCH_RATE = 0x48000C, + SMSG_MOVE_UPDATE_REMOVE_INERTIA = 0x480061, + SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x480013, + SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x480005, + SMSG_MOVE_UPDATE_RUN_SPEED = 0x480004, + SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x480008, + SMSG_MOVE_UPDATE_SWIM_SPEED = 0x480007, + SMSG_MOVE_UPDATE_TELEPORT = 0x48000F, + SMSG_MOVE_UPDATE_TURN_RATE = 0x48000B, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x480006, + SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x360276, + SMSG_MULTI_FLOOR_NEW_FLOOR = 0x360275, + SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x3600A8, + SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x3600AA, + SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x3600AF, + SMSG_MYTHIC_PLUS_SEASON_DATA = 0x3600A9, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x360074, + SMSG_NEW_DATA_BUILD = 0x36033B, + SMSG_NEW_TAXI_PATH = 0x36011D, + SMSG_NEW_WORLD = 0x36002B, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x4D0034, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x360149, + SMSG_NOTIFY_MONEY = 0x360031, + SMSG_NOTIFY_RECEIVED_MAIL = 0x3600D9, + SMSG_NPC_INTERACTION_OPEN_RESULT = 0x36030D, + SMSG_OFFER_PETITION_ERROR = 0x360154, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x360183, + SMSG_ON_MONSTER_MOVE = 0x480002, + SMSG_OPEN_ARTIFACT_FORGE = 0x36023A, + SMSG_OPEN_CONTAINER = 0x4E0006, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x440015, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x360232, + SMSG_OVERRIDE_LIGHT = 0x360159, + SMSG_PAGE_TEXT = 0x3601B7, + SMSG_PARTY_COMMAND_RESULT = 0x36022C, + SMSG_PARTY_ELIGIBILITY_FOR_DELVE_TIERS_RESPONSE = 0x360350, + SMSG_PARTY_INVITE = 0x360056, + SMSG_PARTY_KILL_LOG = 0x3601F6, + SMSG_PARTY_MEMBER_FULL_STATE = 0x3601F5, + SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x3601F4, + SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x3602F6, + SMSG_PARTY_UPDATE = 0x36008C, + SMSG_PAST_TIME_EVENTS = 0x36005B, + SMSG_PAUSE_MIRROR_TIMER = 0x3601AE, + SMSG_PENDING_RAID_LOCK = 0x360195, + SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0x36030A, + SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = 0x360306, + SMSG_PERKS_PROGRAM_DISABLED = 0x36030B, + SMSG_PERKS_PROGRAM_RESULT = 0x360307, + SMSG_PERKS_PROGRAM_VENDOR_UPDATE = 0x360305, + SMSG_PETITION_ALREADY_SIGNED = 0x360037, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x420042, + SMSG_PETITION_SHOW_LIST = 0x36015C, + SMSG_PETITION_SHOW_SIGNATURES = 0x36015D, + SMSG_PETITION_SIGN_RESULTS = 0x3601E8, + SMSG_PET_ACTION_FEEDBACK = 0x3601E5, + SMSG_PET_ACTION_SOUND = 0x36013F, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x36009E, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x360113, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x360097, + SMSG_PET_BATTLE_FINAL_ROUND = 0x36009C, + SMSG_PET_BATTLE_FINISHED = 0x36009D, + SMSG_PET_BATTLE_FIRST_ROUND = 0x360099, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x360098, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x36009F, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x360096, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x3600D6, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x3600D7, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x36009B, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x360095, + SMSG_PET_BATTLE_ROUND_RESULT = 0x36009A, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x360084, + SMSG_PET_CAST_FAILED = 0x4D0049, + SMSG_PET_CLEAR_SPELLS = 0x4D0013, + SMSG_PET_DISMISS_SOUND = 0x360140, + SMSG_PET_GOD_MODE = 0x36011A, + SMSG_PET_GUIDS = 0x3601A1, + SMSG_PET_LEARNED_SPELLS = 0x4D0040, + SMSG_PET_MODE = 0x36001F, + SMSG_PET_NAME_INVALID = 0x360161, + SMSG_PET_NEWLY_TAMED = 0x36001E, + SMSG_PET_SPELLS_MESSAGE = 0x4D0014, + SMSG_PET_STABLE_RESULT = 0x36002A, + SMSG_PET_TAME_FAILURE = 0x360151, + SMSG_PET_UNLEARNED_SPELLS = 0x4D0041, + SMSG_PHASE_SHIFT_CHANGE = 0x36000C, + SMSG_PLAYED_TIME = 0x360173, + SMSG_PLAYER_ACKOWLEDGE_ARROW_CALLOUT = 0x4A002D, + SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x4A001F, + SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x4A001E, + SMSG_PLAYER_BONUS_ROLL_FAILED = 0x4A0021, + SMSG_PLAYER_BOUND = 0x4A0000, + SMSG_PLAYER_CHOICE_CLEAR = 0x4A0006, + SMSG_PLAYER_CHOICE_DISPLAY_ERROR = 0x4A0005, + SMSG_PLAYER_CONDITION_RESULT = 0x4A0012, + SMSG_PLAYER_END_OF_MATCH_DETAILS = 0x4A002F, + SMSG_PLAYER_HIDE_ARROW_CALLOUT = 0x4A002C, + SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x4A0011, + SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x4A0016, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x420041, + SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = 0x4A002E, + SMSG_PLAYER_SHOW_ARROW_CALLOUT = 0x4A002B, + SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY = 0x4A0029, + SMSG_PLAYER_SHOW_PARTY_POSE_UI = 0x4A002A, + SMSG_PLAYER_SHOW_UI_EVENT_TOAST = 0x4A0024, + SMSG_PLAYER_SKINNED = 0x4A000E, + SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x4A0015, + SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x4A0014, + SMSG_PLAY_MUSIC = 0x360205, + SMSG_PLAY_OBJECT_SOUND = 0x360207, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x3601CD, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x4D0038, + SMSG_PLAY_SCENE = 0x3600D3, + SMSG_PLAY_SOUND = 0x360204, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x360208, + SMSG_PLAY_SPELL_VISUAL = 0x4D0036, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x4D003A, + SMSG_PLAY_TIME_WARNING = 0x36019B, + SMSG_PONG = 0x3D0006, + SMSG_POWER_UPDATE = 0x360170, + SMSG_PRELOAD_CHILD_MAP = 0x36000D, + SMSG_PRELOAD_WORLD = 0x36002C, + SMSG_PREPOPULATE_NAME_CACHE = 0x3602C9, + SMSG_PRE_RESSURECT = 0x360203, + SMSG_PRINT_NOTIFICATION = 0x360063, + SMSG_PROC_RESIST = 0x3601F7, + SMSG_PROFESSION_GOSSIP = 0x360296, + SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x4D0042, + SMSG_PVP_CREDIT = 0x3C0024, + SMSG_PVP_MATCH_COMPLETE = 0x3C002F, + SMSG_PVP_MATCH_INITIALIZE = 0x3C0030, + SMSG_PVP_MATCH_SET_STATE = 0x3C002E, + SMSG_PVP_MATCH_START = 0x3C002D, + SMSG_PVP_MATCH_STATISTICS = 0x3C0010, + SMSG_PVP_OPTIONS_ENABLED = 0x3C0013, + SMSG_PVP_TIER_RECORD = 0x360301, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x3A000C, + SMSG_QUERY_CREATURE_RESPONSE = 0x3A0006, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x3A0007, + SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x400041, + SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = 0x42002F, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x42002D, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x3A0010, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x3A0008, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x3A0009, + SMSG_QUERY_PETITION_RESPONSE = 0x3A000D, + SMSG_QUERY_PET_NAME_RESPONSE = 0x3A000B, + SMSG_QUERY_PLAYER_NAMES_RESPONSE = 0x4A0026, + SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x4A000A, + SMSG_QUERY_QUEST_INFO_RESPONSE = 0x4B0016, + SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0x42002E, + SMSG_QUERY_TIME_RESPONSE = 0x360181, + SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x4B0001, + SMSG_QUEST_CONFIRM_ACCEPT = 0x4B000F, + SMSG_QUEST_FORCE_REMOVED = 0x4B001C, + SMSG_QUEST_GIVER_INVALID_QUEST = 0x4B0005, + SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x4B0014, + SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x4B0003, + SMSG_QUEST_GIVER_QUEST_DETAILS = 0x4B0012, + SMSG_QUEST_GIVER_QUEST_FAILED = 0x4B0006, + SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x4B001A, + SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x4B0013, + SMSG_QUEST_GIVER_STATUS = 0x4B001B, + SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x4B0011, + SMSG_QUEST_ITEM_USABILITY_RESPONSE = 0x4B0002, + SMSG_QUEST_LOG_FULL = 0x4B0007, + SMSG_QUEST_NON_LOG_UPDATE_COMPLETE = 0x4B0008, + SMSG_QUEST_POI_QUERY_RESPONSE = 0x4B001D, + SMSG_QUEST_POI_UPDATE_RESPONSE = 0x4B001F, + SMSG_QUEST_PUSH_RESULT = 0x4B0010, + SMSG_QUEST_SESSION_INFO_RESPONSE = 0x3602EC, + SMSG_QUEST_SESSION_READY_CHECK = 0x3602DA, + SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x3602DB, + SMSG_QUEST_SESSION_RESULT = 0x3602D9, + SMSG_QUEST_UPDATE_ADD_CREDIT = 0x4B000C, + SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x4B000D, + SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x4B000E, + SMSG_QUEST_UPDATE_COMPLETE = 0x4B0009, + SMSG_QUEST_UPDATE_FAILED = 0x4B000A, + SMSG_QUEST_UPDATE_FAILED_TIMER = 0x4B000B, + SMSG_QUEUE_SUMMARY_UPDATE = 0x3602A9, + SMSG_RAF_ACCOUNT_INFO = 0x3602D7, + SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x3602E8, + SMSG_RAF_DEBUG_FRIEND_MONTHS = 0x360338, + SMSG_RAID_DIFFICULTY_SET = 0x360244, + SMSG_RAID_GROUP_ONLY = 0x360246, + SMSG_RAID_INSTANCE_MESSAGE = 0x3B000A, + SMSG_RAID_MARKERS_CHANGED = 0x360038, + SMSG_RANDOM_ROLL = 0x3600CD, + SMSG_RATED_PVP_INFO = 0x3C000F, + SMSG_READY_CHECK_COMPLETED = 0x360090, + SMSG_READY_CHECK_RESPONSE = 0x36008F, + SMSG_READY_CHECK_STARTED = 0x36008E, + SMSG_READ_ITEM_RESULT_FAILED = 0x360240, + SMSG_READ_ITEM_RESULT_OK = 0x360237, + SMSG_REALM_QUERY_RESPONSE = 0x3A0005, + SMSG_REATTACH_RESURRECT = 0x3601E7, + SMSG_RECEIVE_PING_UNIT = 0x360039, + SMSG_RECEIVE_PING_WORLD_POINT = 0x36003A, + SMSG_RECRAFT_ITEM_RESULT = 0x36032E, + SMSG_RECRUIT_A_FRIEND_FAILURE = 0x36015E, + SMSG_REFRESH_COMPONENT = 0x3600ED, + SMSG_REGIONWIDE_CHARACTER_MAIL_DATA = 0x36001A, + SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA = 0x360019, + SMSG_REMOVE_ITEM_PASSIVE = 0x360043, + SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x4D0043, + SMSG_REPLACE_TROPHY_RESPONSE = 0x36025C, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x4A0009, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x360025, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x3C0014, + SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x3C0015, + SMSG_RESET_COMPRESSION_CONTEXT = 0x3D0007, + SMSG_RESET_FAILED_NOTIFY = 0x360155, + SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x360335, + SMSG_RESET_QUEST_POI = 0x4B0020, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x3C0023, + SMSG_RESET_WEEKLY_CURRENCY = 0x360009, + SMSG_RESPEC_WIPE_CONFIRM = 0x3600B0, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x360006, + SMSG_RESPONSE_PERK_PENDING_REWARDS = 0x360308, + SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0x360309, + SMSG_RESTART_GLOBAL_COOLDOWN = 0x4D0052, + SMSG_RESTRICTED_ACCOUNT_WARNING = 0x360052, + SMSG_RESUME_CAST = 0x4D002C, + SMSG_RESUME_CAST_BAR = 0x4D002F, + SMSG_RESUME_COMMS = 0x3D0003, + SMSG_RESUME_TOKEN = 0x360041, + SMSG_RESURRECT_REQUEST = 0x360012, + SMSG_RESYNC_RUNES = 0x4D0050, + SMSG_RETURNING_PLAYER_PROMPT = 0x36023F, + SMSG_RETURN_APPLICANT_LIST = 0x3602CD, + SMSG_RETURN_RECRUITING_CLUBS = 0x3602CC, + SMSG_ROLE_CHANGED_INFORM = 0x360021, + SMSG_ROLE_CHOSEN = 0x44001D, + SMSG_ROLE_POLL_INFORM = 0x360022, + SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x360295, + SMSG_RUNE_REGEN_DEBUG = 0x36004F, + SMSG_SCENARIO_COMPLETED = 0x360283, + SMSG_SCENARIO_POIS = 0x3600D0, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x3600C9, + SMSG_SCENARIO_SHOW_CRITERIA = 0x360299, + SMSG_SCENARIO_STATE = 0x3600C8, + SMSG_SCENARIO_UI_UPDATE = 0x360298, + SMSG_SCENARIO_VACATE = 0x360241, + SMSG_SCENE_OBJECT_EVENT = 0x36007A, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x36007F, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x360080, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x36007C, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x36007B, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x36007E, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x36007D, + SMSG_SCHEDULED_AREA_POI_UPDATE_RESPONSE = 0x4A0019, + SMSG_SCRIPT_CAST = 0x4D0047, + SMSG_SEASON_INFO = 0x36005A, + SMSG_SELL_RESPONSE = 0x360162, + SMSG_SEND_ITEM_PASSIVES = 0x360044, + SMSG_SEND_KNOWN_SPELLS = 0x4D0019, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x3600CB, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x3600CC, + SMSG_SEND_SPELL_CHARGES = 0x4D001B, + SMSG_SEND_SPELL_HISTORY = 0x4D001A, + SMSG_SEND_UNLEARN_SPELLS = 0x4D001C, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x3600EA, + SMSG_SERVER_TIME = 0x360121, + SMSG_SERVER_TIME_OFFSET = 0x3601B2, + SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = 0x4D000F, + SMSG_SETUP_CURRENCY = 0x360007, + SMSG_SET_AI_ANIM_KIT = 0x3601CC, + SMSG_SET_ANIM_TIER = 0x3601D0, + SMSG_SET_CHR_UPGRADE_TIER = 0x360077, + SMSG_SET_CURRENCY = 0x360008, + SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x440012, + SMSG_SET_DUNGEON_DIFFICULTY = 0x360143, + SMSG_SET_FACTION_AT_WAR = 0x36019D, + SMSG_SET_FACTION_NOT_VISIBLE = 0x3601C7, + SMSG_SET_FACTION_STANDING = 0x3601C8, + SMSG_SET_FACTION_VISIBLE = 0x3601C6, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x4D0027, + SMSG_SET_INSTANCE_LEAVER = 0x360356, + SMSG_SET_ITEM_PURCHASE_DATA = 0x360033, + SMSG_SET_LOOT_METHOD_FAILED = 0x360267, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x360036, + SMSG_SET_MELEE_ANIM_KIT = 0x3601CF, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x3601CE, + SMSG_SET_PCT_SPELL_MODIFIER = 0x4D0028, + SMSG_SET_PET_SPECIALIZATION = 0x3600C2, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x4A000B, + SMSG_SET_PLAY_HOVER_ANIM = 0x360053, + SMSG_SET_PROFICIENCY = 0x3601D1, + SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x3602E0, + SMSG_SET_SHIPMENT_READY_RESPONSE = 0x40003A, + SMSG_SET_SPELL_CHARGES = 0x4D0018, + SMSG_SET_TIME_ZONE_INFORMATION = 0x360116, + SMSG_SET_VEHICLE_REC_ID = 0x360194, + SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x36030C, + SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x40003B, + SMSG_SHOW_DELVES_COMPANION_CONFIGURATION_UI = 0x36034E, + SMSG_SHOW_DELVES_DISPLAY_UI = 0x36034C, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x360073, + SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x4B0015, + SMSG_SHOW_TAXI_NODES = 0x36016B, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x36020D, + SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x360318, + SMSG_SOCKET_GEMS_FAILURE = 0x3601C4, + SMSG_SOCKET_GEMS_SUCCESS = 0x3601C3, + SMSG_SPECIAL_MOUNT_ANIM = 0x36013E, + SMSG_SPECTATE_END = 0x36033A, + SMSG_SPECTATE_PLAYER = 0x360339, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x3601B6, + SMSG_SPELL_ABSORB_LOG = 0x4D000C, + SMSG_SPELL_CATEGORY_COOLDOWN = 0x4D0006, + SMSG_SPELL_CHANNEL_START = 0x4D0022, + SMSG_SPELL_CHANNEL_UPDATE = 0x4D0023, + SMSG_SPELL_COOLDOWN = 0x4D0005, + SMSG_SPELL_DAMAGE_SHIELD = 0x4D001F, + SMSG_SPELL_DELAYED = 0x4D0030, + SMSG_SPELL_DISPELL_LOG = 0x4D0007, + SMSG_SPELL_EMPOWER_SET_STAGE = 0x4D0026, + SMSG_SPELL_EMPOWER_START = 0x4D0024, + SMSG_SPELL_EMPOWER_UPDATE = 0x4D0025, + SMSG_SPELL_ENERGIZE_LOG = 0x4D0009, + SMSG_SPELL_EXECUTE_LOG = 0x4D0031, + SMSG_SPELL_FAILED_OTHER = 0x4D0046, + SMSG_SPELL_FAILURE = 0x4D0044, + SMSG_SPELL_FAILURE_MESSAGE = 0x4D004B, + SMSG_SPELL_GO = 0x4D002A, + SMSG_SPELL_HEAL_ABSORB_LOG = 0x4D000B, + SMSG_SPELL_HEAL_LOG = 0x4D000A, + SMSG_SPELL_INSTAKILL_LOG = 0x4D0021, + SMSG_SPELL_INTERRUPT_LOG = 0x4D000D, + SMSG_SPELL_MISS_LOG = 0x4D0032, + SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x4D0020, + SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x4D001D, + SMSG_SPELL_PERIODIC_AURA_LOG = 0x4D0008, + SMSG_SPELL_PREPARE = 0x4D0029, + SMSG_SPELL_START = 0x4D002B, + SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x360065, + SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x3602F2, + SMSG_STAND_STATE_UPDATE = 0x3601BA, + SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0x36006B, + SMSG_START_ELAPSED_TIMER = 0x3600A0, + SMSG_START_ELAPSED_TIMERS = 0x3600A2, + SMSG_START_LIGHTNING_STORM = 0x360146, + SMSG_START_LOOT_ROLL = 0x3600BA, + SMSG_START_MIRROR_TIMER = 0x3601AD, + SMSG_START_TIMER = 0x36003D, + SMSG_STOP_ELAPSED_TIMER = 0x3600A1, + SMSG_STOP_MIRROR_TIMER = 0x3601AF, + SMSG_STOP_SPEAKERBOT_SOUND = 0x360209, + SMSG_STOP_TIMER = 0x36003E, + SMSG_STREAMING_MOVIES = 0x36003C, + SMSG_SUGGEST_INVITE_INFORM = 0x36022D, + SMSG_SUMMON_CANCEL = 0x36014F, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x360023, + SMSG_SUMMON_REQUEST = 0x3601BE, + SMSG_SUPERCEDED_SPELLS = 0x4D003D, + SMSG_SUSPEND_COMMS = 0x3D0002, + SMSG_SUSPEND_TOKEN = 0x360040, + SMSG_SYNC_WOW_ENTITLEMENTS = 0x3602EA, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x3601B5, + SMSG_TAXI_NODE_STATUS = 0x36011B, + SMSG_TEXT_EMOTE = 0x360119, + SMSG_THREAT_CLEAR = 0x36017A, + SMSG_THREAT_REMOVE = 0x360179, + SMSG_THREAT_UPDATE = 0x360178, + SMSG_TIMERUNNING_SEASON_ENDED = 0x36034F, + SMSG_TIME_ADJUSTMENT = 0x480001, + SMSG_TIME_SYNC_REQUEST = 0x480000, + SMSG_TITLE_EARNED = 0x360175, + SMSG_TITLE_LOST = 0x360176, + SMSG_TOTEM_CREATED = 0x360165, + SMSG_TOTEM_DURATION_CHANGED = 0x360167, + SMSG_TOTEM_MOVED = 0x360168, + SMSG_TOTEM_REMOVED = 0x360166, + SMSG_TRADE_STATUS = 0x360017, + SMSG_TRADE_UPDATED = 0x360016, + SMSG_TRAINER_BUY_FAILED = 0x36017D, + SMSG_TRAINER_LIST = 0x36017C, + SMSG_TRAIT_CONFIG_COMMIT_FAILED = 0x36006A, + SMSG_TRANSFER_ABORTED = 0x3601A0, + SMSG_TRANSFER_PENDING = 0x360066, + SMSG_TREASURE_PICKER_RESPONSE = 0x3A0011, + SMSG_TRIGGER_CINEMATIC = 0x360261, + SMSG_TRIGGER_MOVIE = 0x360169, + SMSG_TURN_IN_PETITION_RESULT = 0x3601EA, + SMSG_TUTORIAL_FLAGS = 0x360255, + SMSG_UI_ACTION = 0x360206, + SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x4B0023, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x360262, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x360263, + SMSG_UNLEARNED_SPELLS = 0x4D003F, + SMSG_UNLOAD_CHILD_MAP = 0x36000E, + SMSG_UNSET_INSTANCE_LEAVER = 0x360357, + SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x360302, + SMSG_UPDATE_ACCOUNT_DATA = 0x3601A6, + SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x3601A7, + SMSG_UPDATE_ACTION_BUTTONS = 0x360078, + SMSG_UPDATE_BNET_SESSION_KEY = 0x3602BA, + SMSG_UPDATE_CAPTURE_POINT = 0x3C0007, + SMSG_UPDATE_CELESTIAL_BODY = 0x3602B6, + SMSG_UPDATE_CHARACTER_FLAGS = 0x36025B, + SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x360202, + SMSG_UPDATE_COOLDOWN = 0x360201, + SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x400038, + SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x400021, + SMSG_UPDATE_EXPANSION_LEVEL = 0x3600E3, + SMSG_UPDATE_GAME_TIME_STATE = 0x3602BD, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x360148, + SMSG_UPDATE_LAST_INSTANCE = 0x360127, + SMSG_UPDATE_OBJECT = 0x460000, + SMSG_UPDATE_PRIMARY_SPEC = 0x360070, + SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x36008D, + SMSG_UPDATE_TALENT_DATA = 0x36006F, + SMSG_UPDATE_WORLD_STATE = 0x3601E4, + SMSG_USERLIST_ADD = 0x3B000F, + SMSG_USERLIST_REMOVE = 0x3B0010, + SMSG_USERLIST_UPDATE = 0x3B0011, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x3601EB, + SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x3602B1, + SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x3602AF, + SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x3602AE, + SMSG_VAS_PURCHASE_COMPLETE = 0x360289, + SMSG_VAS_PURCHASE_STATE_UPDATE = 0x360288, + SMSG_VENDOR_INVENTORY = 0x360051, + SMSG_VIGNETTE_UPDATE = 0x4A0010, + SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x3602B5, + SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE = 0x3602FD, + SMSG_VOICE_LOGIN_RESPONSE = 0x3602B4, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x4E0004, + SMSG_VOID_STORAGE_CONTENTS = 0x4E0001, + SMSG_VOID_STORAGE_FAILED = 0x4E0000, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x4E0002, + SMSG_VOID_TRANSFER_RESULT = 0x4E0003, + SMSG_WAIT_QUEUE_FINISH = 0x360003, + SMSG_WAIT_QUEUE_UPDATE = 0x360002, + SMSG_WARDEN3_DATA = 0x36000B, + SMSG_WARDEN3_DISABLED = 0x3602B8, + SMSG_WARDEN3_ENABLED = 0x3602B7, + SMSG_WARFRONT_COMPLETE = 0x3601FA, + SMSG_WARGAME_REQUEST_OPPONENT_RESPONSE = 0x3C0012, + SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x3C0011, + SMSG_WEATHER = 0x360145, + SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x3602F5, + SMSG_WEEKLY_REWARDS_RESULT = 0x3602F3, + SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x3602F4, + SMSG_WHO = 0x3B0002, + SMSG_WHO_IS = 0x360144, + SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x3602BC, + SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x4A0017, + SMSG_WORLD_SERVER_INFO = 0x360045, + SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x3602EB, + SMSG_WOW_LABS_AREA_INFO = 0x36031D, + SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_END = 0x360319, + SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_STATE_CHANGED = 0x36031A, + SMSG_WOW_LABS_PARTY_ERROR = 0x360326, + SMSG_WOW_LABS_SET_AREA_ID_RESULT = 0x36031B, + SMSG_WOW_LABS_SET_PREDICTION_CIRCLE = 0x36031F, + SMSG_WOW_LABS_SET_SELECTED_AREA_ID = 0x36031C, + SMSG_XP_AWARDED_FROM_CURRENCY = 0x360334, + SMSG_XP_GAIN_ABORTED = 0x360062, + SMSG_XP_GAIN_ENABLED = 0x360245, + SMSG_ZONE_UNDER_ATTACK = 0x3B000B, // Opcodes that are not generated automatically SMSG_ACCOUNT_HEIRLOOM_UPDATE = SMSG_ACCOUNT_TOY_UPDATE + 1, // no client handler - SMSG_COMPRESSED_PACKET = 0x3F000A, - SMSG_MULTIPLE_PACKETS = 0x3F0009, + SMSG_COMPRESSED_PACKET = SMSG_AUTH_CHALLENGE + 0xA, + SMSG_MULTIPLE_PACKETS = SMSG_AUTH_CHALLENGE + 0x9, // Deleted opcodes, here only to allow compile SMSG_ARENA_TEAM_STATS = UNKNOWN_OPCODE, }; -inline constexpr std::size_t NUM_SMSG_OPCODES = 1473; +inline constexpr std::size_t NUM_SMSG_OPCODES = 1479; inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeServer opcode) { uint32 idInGroup = opcode & 0xFFFF; switch (opcode >> 16) { - case 0x38: return idInGroup < 848 ? idInGroup + 0 : -1; - case 0x39: return idInGroup < 10 ? idInGroup + 848 : -1; - case 0x3C: return idInGroup < 18 ? idInGroup + 858 : -1; - case 0x3D: return idInGroup < 36 ? idInGroup + 876 : -1; - case 0x3E: return idInGroup < 49 ? idInGroup + 912 : -1; - case 0x3F: return idInGroup < 11 ? idInGroup + 961 : -1; - case 0x40: return idInGroup < 12 ? idInGroup + 972 : -1; - case 0x42: return idInGroup < 82 ? idInGroup + 984 : -1; - case 0x44: return idInGroup < 71 ? idInGroup + 1066 : -1; - case 0x46: return idInGroup < 33 ? idInGroup + 1137 : -1; - case 0x48: return idInGroup < 1 ? idInGroup + 1170 : -1; - case 0x49: return idInGroup < 120 ? idInGroup + 1171 : -1; - case 0x4B: return idInGroup < 48 ? idInGroup + 1291 : -1; - case 0x4C: return idInGroup < 41 ? idInGroup + 1339 : -1; - case 0x4E: return idInGroup < 85 ? idInGroup + 1380 : -1; - case 0x4F: return idInGroup < 8 ? idInGroup + 1465 : -1; - case 0x51: return idInGroup < 1 ? idInGroup + 1473 : -1; + case 0x36: return idInGroup < 857 ? idInGroup + 0 : -1; + case 0x37: return idInGroup < 5 ? idInGroup + 857 : -1; + case 0x3A: return idInGroup < 18 ? idInGroup + 862 : -1; + case 0x3B: return idInGroup < 36 ? idInGroup + 880 : -1; + case 0x3C: return idInGroup < 49 ? idInGroup + 916 : -1; + case 0x3D: return idInGroup < 11 ? idInGroup + 965 : -1; + case 0x3E: return idInGroup < 12 ? idInGroup + 976 : -1; + case 0x40: return idInGroup < 82 ? idInGroup + 988 : -1; + case 0x42: return idInGroup < 71 ? idInGroup + 1070 : -1; + case 0x44: return idInGroup < 33 ? idInGroup + 1141 : -1; + case 0x46: return idInGroup < 1 ? idInGroup + 1174 : -1; + case 0x48: return idInGroup < 120 ? idInGroup + 1175 : -1; + case 0x4A: return idInGroup < 49 ? idInGroup + 1295 : -1; + case 0x4B: return idInGroup < 41 ? idInGroup + 1344 : -1; + case 0x4D: return idInGroup < 85 ? idInGroup + 1385 : -1; + case 0x4E: return idInGroup < 8 ? idInGroup + 1470 : -1; + case 0x50: return idInGroup < 1 ? idInGroup + 1478 : -1; default: return -1; } } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 88a6cc1d815..b62697bce23 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -22,6 +22,7 @@ #include "WorldSession.h" #include "AccountMgr.h" #include "AuthenticationPackets.h" +#include "Bag.h" #include "BattlePetMgr.h" #include "BattlegroundMgr.h" #include "BattlenetPackets.h" @@ -1525,7 +1526,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint32 opcode) co case CMSG_QUEST_GIVER_REQUEST_REWARD: // 0 1 case CMSG_COMPLETE_CINEMATIC: // 0 1 case CMSG_BANKER_ACTIVATE: // 0 1 - case CMSG_BUY_BANK_SLOT: // 0 1 + case CMSG_BUY_ACCOUNT_BANK_TAB: // 0 1 case CMSG_OPT_OUT_OF_LOOT: // 0 1 case CMSG_DUEL_RESPONSE: // 0 1 case CMSG_CALENDAR_COMPLAIN: // 0 1 @@ -1722,7 +1723,11 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint32 opcode) co case CMSG_GET_ITEM_PURCHASE_DATA: // not profiled { - maxPacketCounterAllowed = PLAYER_SLOTS_COUNT; + maxPacketCounterAllowed = PLAYER_SLOTS_COUNT + MAX_BAG_SIZE * ( + (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) + + (REAGENT_BAG_SLOT_END - REAGENT_BAG_SLOT_START) + + (BANK_SLOT_BAG_END - BANK_SLOT_BAG_START) + + (ACCOUNT_BANK_SLOT_BAG_END - ACCOUNT_BANK_SLOT_BAG_START)); break; } case CMSG_HOTFIX_REQUEST: // not profiled diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 01299cc9f7c..442e1495da3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -169,10 +169,9 @@ namespace WorldPackets { class AutoBankItem; class AutoStoreBankItem; - class BuyBankSlot; - class AutoBankReagent; - class AutoStoreBankReagent; - class ReagentBank; + class BuyBankTab; + class UpdateBankTabSettings; + class AutoDepositCharacterBank; class BankerActivate; } @@ -454,11 +453,9 @@ namespace WorldPackets class SortAccountBankBags; class SortBags; class SortBankBags; - class SortReagentBankBags; struct ItemInstance; class RemoveNewItem; class ChangeBagSlotFlag; - class ChangeBankBagSlotFlag; class SetBackpackAutosortDisabled; class SetBackpackSellJunkDisabled; class SetBankAutosortDisabled; @@ -830,14 +827,6 @@ namespace WorldPackets class MoveSetVehicleRecIdAck; } - namespace VoidStorage - { - class UnlockVoidStorage; - class QueryVoidStorage; - class VoidStorageTransfer; - class SwapVoidItem; - } - namespace Warden { class WardenData; @@ -1518,11 +1507,9 @@ class TC_GAME_API WorldSession // Bank void HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& packet); void HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBankItem& packet); - void HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet); - void HandleBuyReagentBankOpcode(WorldPackets::Bank::ReagentBank& reagentBank); - void HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReagent& autoBankRegent); - void HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStoreBankReagent& autoStoreBankReagent); - void HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBank& reagentBank); + void HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBankTab); + void HandleUpdateBankTabSettings(WorldPackets::Bank::UpdateBankTabSettings const& updateBankTabSettings); + void HandleAutoDepositCharacterBank(WorldPackets::Bank::AutoDepositCharacterBank const& autoDepositCharacterBank); // Black Market void HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& blackMarketOpen); @@ -1555,7 +1542,6 @@ class TC_GAME_API WorldSession void HandleWrapItem(WorldPackets::Item::WrapItem& packet); void HandleUseCritterItem(WorldPackets::Item::UseCritterItem& packet); void HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag const& changeBagSlotFlag); - void HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag); void HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled); void HandleSetBackpackSellJunkDisabled(WorldPackets::Item::SetBackpackSellJunkDisabled const& setBackpackSellJunkDisabled); void HandleSetBankAutosortDisabled(WorldPackets::Item::SetBankAutosortDisabled const& setBankAutosortDisabled); @@ -1737,7 +1723,6 @@ class TC_GAME_API WorldSession void HandleSortAccountBankBags(WorldPackets::Item::SortAccountBankBags& sortBankBags); void HandleSortBags(WorldPackets::Item::SortBags& sortBags); void HandleSortBankBags(WorldPackets::Item::SortBankBags& sortBankBags); - void HandleSortReagentBankBags(WorldPackets::Item::SortReagentBankBags& sortReagentBankBags); void HandleRemoveNewItem(WorldPackets::Item::RemoveNewItem& removeNewItem); void HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment); @@ -1794,13 +1779,6 @@ class TC_GAME_API WorldSession void SendCalendarRaidLockoutRemoved(InstanceLock const* lock); void HandleSetSavedInstanceExtend(WorldPackets::Calendar::SetSavedInstanceExtend& setSavedInstanceExtend); - // Void Storage - void HandleVoidStorageUnlock(WorldPackets::VoidStorage::UnlockVoidStorage& unlockVoidStorage); - void HandleVoidStorageQuery(WorldPackets::VoidStorage::QueryVoidStorage& queryVoidStorage); - void HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStorageTransfer& voidStorageTransfer); - void HandleVoidSwapItem(WorldPackets::VoidStorage::SwapVoidItem& swapVoidItem); - void SendVoidStorageTransferResult(VoidTransferError result); - // Collections void HandleCollectionItemSetFavorite(WorldPackets::Collections::CollectionItemSetFavorite& collectionItemSetFavorite); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index e9db7862247..0bd91797019 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -728,6 +728,8 @@ enum AuraType : uint32 SPELL_AURA_641 = 641, SPELL_AURA_642 = 642, SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT = 643, // NYI + SPELL_AURA_644 = 644, + SPELL_AURA_645 = 645, TOTAL_AURAS }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 6d138b02b10..ed0e87ddc8f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -712,7 +712,9 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //640 &AuraEffect::HandleNULL, //641 &AuraEffect::HandleNULL, //642 - &AuraEffect::HandleNULL, //642 SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT + &AuraEffect::HandleNULL, //643 SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT + &AuraEffect::HandleNULL, //644 + &AuraEffect::HandleNULL, //645 }; AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster) : diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 07f0bf1c20a..58996ebb379 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5284,6 +5284,7 @@ void Spell::SendChannelUpdate(uint32 time, Optional<SpellCastResult> result) unitCaster->ClearChannelObjects(); unitCaster->SetChannelSpellId(0); unitCaster->SetChannelVisual({}); + unitCaster->SetChannelSpellData(0, 0); unitCaster->SetSpellEmpowerStage(-1); } @@ -5365,6 +5366,7 @@ void Spell::SendChannelStart(uint32 duration) unitCaster->SetChannelSpellId(m_spellInfo->Id); unitCaster->SetChannelVisual(m_SpellVisual); + unitCaster->SetChannelSpellData(GameTime::GetGameTimeMS(), duration); auto setImmunitiesAndHealPrediction = [&](Optional<WorldPackets::Spells::SpellChannelStartInterruptImmunities>& interruptImmunities, Optional<WorldPackets::Spells::SpellTargetedHealPrediction>& healPrediction) { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ef3394e367e..da0fd7be46c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -430,6 +430,10 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectNULL, //339 SPELL_EFFECT_UI_ACTION &Spell::EffectNULL, //340 SPELL_EFFECT_340 &Spell::EffectLearnWarbandScene, //341 SPELL_EFFECT_LEARN_WARBAND_SCENE + &Spell::EffectNULL, //342 SPELL_EFFECT_342 + &Spell::EffectNULL, //343 SPELL_EFFECT_343 + &Spell::EffectNULL, //344 SPELL_EFFECT_344 + &Spell::EffectNULL, //345 SPELL_EFFECT_ASSIST_ACTION }; void Spell::EffectNULL() diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 4cfd315baad..3c6d3f6504e 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1256,6 +1256,10 @@ std::array<SpellEffectInfo::StaticData, TOTAL_SPELL_EFFECTS> SpellEffectInfo::_d {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 339 SPELL_EFFECT_UI_ACTION {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 340 SPELL_EFFECT_340 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 341 SPELL_EFFECT_LEARN_WARBAND_SCENE + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 342 SPELL_EFFECT_342 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 343 SPELL_EFFECT_343 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 344 SPELL_EFFECT_344 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 345 SPELL_EFFECT_ASSIST_ACTION } }; SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, SpellInfoLoadHelper const& data) diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 1bfa3d50fe9..c15833f90d9 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -127,7 +127,6 @@ DumpTable const DumpTables[] = { "character_spell_cooldown", DTT_CHAR_TABLE }, { "character_talent", DTT_CHAR_TABLE }, { "character_transmog_outfits", DTT_CHAR_TRANSMOG }, - /// @todo: character_void_storage { "mail", DTT_MAIL }, { "mail_items", DTT_MAIL_ITEM }, // must be after mail { "pet_aura", DTT_PET_TABLE }, // must be after character_pet diff --git a/src/server/scripts/BrokenIsles/MawOfSouls/boss_ymiron_the_fallen_king.cpp b/src/server/scripts/BrokenIsles/MawOfSouls/boss_ymiron_the_fallen_king.cpp index 6ab34f040b7..b6ca8109f40 100644 --- a/src/server/scripts/BrokenIsles/MawOfSouls/boss_ymiron_the_fallen_king.cpp +++ b/src/server/scripts/BrokenIsles/MawOfSouls/boss_ymiron_the_fallen_king.cpp @@ -553,8 +553,7 @@ struct at_ymiron_the_fallen_king_bane : AreaTriggerAI AreaTriggerOrbitInfo orbitInfo; orbitInfo.CounterClockwise = false; orbitInfo.CanLoop = true; - orbitInfo.ElapsedTimeForMovement = 0; - orbitInfo.StartDelay = 0; + orbitInfo.ExtraTimeForBlending = 0; orbitInfo.Radius = radius; orbitInfo.BlendFromRadius = radius; orbitInfo.InitialAngle = angle; diff --git a/src/server/scripts/Commands/cs_list.cpp b/src/server/scripts/Commands/cs_list.cpp index f552ab05115..7fd01f24efd 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -191,8 +191,6 @@ public: itemPos = "[equipped]"; else if (Player::IsInventoryPos(itemBag, itemSlot)) itemPos = "[in inventory]"; - else if (Player::IsReagentBankPos(itemBag, itemSlot)) - itemPos = "[in reagent bank]"; else if (Player::IsBankPos(itemBag, itemSlot)) itemPos = "[in bank]"; else diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h index 4590a7fab8f..5fdd42041f0 100644 --- a/src/tools/map_extractor/loadlib/DBFilesClientList.h +++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h @@ -143,7 +143,10 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 1080949, .Name = "Cfg_Configs.db2" }, { .FileDataId = 6841377, .Name = "Cfg_GameRules.db2" }, { .FileDataId = 1082876, .Name = "Cfg_Regions.db2" }, + { .FileDataId = 3055692, .Name = "Cfg_TimeEventRegionGroup.db2" }, { .FileDataId = 2965645, .Name = "ChallengeModeItemBonusOverride.db2" }, + { .FileDataId = 6982016, .Name = "ChallengeModeReward.db2" }, + { .FileDataId = 6984186, .Name = "ChallengeModeXReward.db2" }, { .FileDataId = 1343386, .Name = "CharBaseInfo.db2" }, { .FileDataId = 1375798, .Name = "CharBaseSection.db2" }, { .FileDataId = 1360262, .Name = "CharComponentTextureLayouts.db2" }, @@ -439,6 +442,7 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 996358, .Name = "HighlightColor.db2" }, { .FileDataId = 996360, .Name = "HolidayDescriptions.db2" }, { .FileDataId = 996359, .Name = "HolidayNames.db2" }, + { .FileDataId = 6905813, .Name = "HolidayXTimeEvent.db2" }, { .FileDataId = 996357, .Name = "Holidays.db2" }, { .FileDataId = 1995523, .Name = "Hotfixes.db2" }, { .FileDataId = 1121229, .Name = "ImportPriceArmor.db2" }, @@ -572,7 +576,6 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 1375803, .Name = "ManifestInterfaceActionIcon.db2" }, { .FileDataId = 1375801, .Name = "ManifestInterfaceData.db2" }, { .FileDataId = 1375804, .Name = "ManifestInterfaceItemIcon.db2" }, - { .FileDataId = 1267335, .Name = "ManifestInterfaceTOCData.db2" }, { .FileDataId = 1349477, .Name = "Map.db2" }, { .FileDataId = 1597466, .Name = "MapCelestialBody.db2" }, { .FileDataId = 801709, .Name = "MapChallengeMode.db2" }, @@ -895,6 +898,8 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 1302850, .Name = "TactKey.db2" }, { .FileDataId = 1302851, .Name = "TactKeyLookup.db2" }, { .FileDataId = 1369062, .Name = "Talent.db2" }, + { .FileDataId = 2178102, .Name = "TalentTab.db2" }, + { .FileDataId = 5581887, .Name = "TalentTreePrimarySpells.db2" }, { .FileDataId = 1068100, .Name = "TaxiNodes.db2" }, { .FileDataId = 1067802, .Name = "TaxiPath.db2" }, { .FileDataId = 1000437, .Name = "TaxiPathNode.db2" }, @@ -905,6 +910,7 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 1328721, .Name = "TextureBlendSet.db2" }, { .FileDataId = 982459, .Name = "TextureFileData.db2" }, { .FileDataId = 3076928, .Name = "TierTransition.db2" }, + { .FileDataId = 3055910, .Name = "TimeEventData.db2" }, { .FileDataId = 1134586, .Name = "TotemCategory.db2" }, { .FileDataId = 988200, .Name = "Toy.db2" }, { .FileDataId = 1301101, .Name = "TradeSkillCategory.db2" }, @@ -1020,6 +1026,7 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 3587230, .Name = "VolumeFogCondition.db2" }, { .FileDataId = 1355528, .Name = "WMOAreaTable.db2" }, { .FileDataId = 1323241, .Name = "WMOMinimapTexture.db2" }, + { .FileDataId = 6655794, .Name = "WarbandPlacementDisplayInfo.db2" }, { .FileDataId = 5736126, .Name = "WarbandScene.db2" }, { .FileDataId = 6238760, .Name = "WarbandSceneAnimChrSpec.db2" }, { .FileDataId = 5754555, .Name = "WarbandSceneAnimation.db2" }, @@ -1027,6 +1034,7 @@ constexpr DB2FileInfo DBFilesClientList[] = { .FileDataId = 6251586, .Name = "WarbandScenePlacementFilterReq.db2" }, { .FileDataId = 6316088, .Name = "WarbandScenePlacementOption.db2" }, { .FileDataId = 5756286, .Name = "WarbandScenePlcmntAnimOverride.db2" }, + { .FileDataId = 6388961, .Name = "WarbandSceneSourceInfo.db2" }, { .FileDataId = 2565222, .Name = "WaterfallData.db2" }, { .FileDataId = 2565258, .Name = "WaypointEdge.db2" }, { .FileDataId = 6367989, .Name = "WaypointMapVolume.db2" }, |