diff options
61 files changed, 2014 insertions, 1342 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 099b7ef9f2f..29a63dd858e 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -738,7 +738,10 @@ INSERT INTO `build_info` VALUES (51536,10,1,7,NULL,NULL,'570EEA10A8EC169C3FF9621D1B635BB4',NULL,NULL,NULL), (51754,10,1,7,NULL,NULL,'BED5A861C071AB41FEF6087E0C37BB1A',NULL,NULL,NULL), (51886,10,1,7,NULL,NULL,'09CF8919FD2EABDEAEBC0C810F53B511',NULL,NULL,NULL), -(51972,10,1,7,NULL,NULL,'444DC7EF3544B6670C18884DADA00428',NULL,NULL,NULL); +(51972,10,1,7,NULL,NULL,'444DC7EF3544B6670C18884DADA00428',NULL,NULL,NULL), +(52038,10,2,0,NULL,NULL,'A8EF004ADED8A3AFF5A67D2BB8D95795',NULL,NULL,NULL), +(52068,10,2,0,NULL,NULL,'A44F842BACCC7EE8E2975FAF01F12474',NULL,NULL,NULL), +(52095,10,2,0,NULL,NULL,'BA36382887D16D274EA9149695F0C9C8',NULL,NULL,NULL); /*!40000 ALTER TABLE `build_info` ENABLE KEYS */; UNLOCK TABLES; @@ -2346,7 +2349,7 @@ CREATE TABLE `realmlist` ( `timezone` tinyint unsigned NOT NULL DEFAULT '0', `allowedSecurityLevel` tinyint unsigned NOT NULL DEFAULT '0', `population` float unsigned NOT NULL DEFAULT '0', - `gamebuild` int unsigned NOT NULL DEFAULT '51972', + `gamebuild` int unsigned NOT NULL DEFAULT '52095', `Region` tinyint unsigned NOT NULL DEFAULT '1', `Battlegroup` tinyint unsigned NOT NULL DEFAULT '1', PRIMARY KEY (`id`), @@ -2361,7 +2364,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','255.255.255.0',8085,0,0,1,0,0,51972,1,1); +(1,'Trinity','127.0.0.1','127.0.0.1','255.255.255.0',8085,0,0,1,0,0,52095,1,1); /*!40000 ALTER TABLE `realmlist` ENABLE KEYS */; UNLOCK TABLES; @@ -2747,7 +2750,8 @@ INSERT INTO `updates` VALUES ('2023_10_06_00_auth.sql','3480687DEEB3E12ECC9632809A518425F9FA0FCC','ARCHIVED','2023-10-06 00:40:46',0), ('2023_10_17_00_auth.sql','EE4C430E9535EC3466E4D2FABA7F009F87AF18BD','RELEASED','2023-10-17 21:07:51',0), ('2023_10_25_00_auth.sql','86B16D5D78A8ED31FDD8553D223CF56F013B00DB','RELEASED','2023-10-25 00:06:14',0), -('2023_11_01_00_auth.sql','4EA6010E9035AFC80326FE56C642C7918254F2BE','RELEASED','2023-11-01 10:47:18',0); +('2023_11_01_00_auth.sql','4EA6010E9035AFC80326FE56C642C7918254F2BE','RELEASED','2023-11-01 10:47:18',0), +('2023_11_09_00_auth.sql','C8A9223E6868593904634193ACBD421F40078FE5','RELEASED','2023-11-09 00:53:45',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 648880371e3..4301dc48420 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1961,6 +1961,11 @@ CREATE TABLE `characters` ( `honorRestState` tinyint unsigned NOT NULL DEFAULT '2', `honorRestBonus` float NOT NULL DEFAULT '0', `lastLoginBuild` int unsigned NOT NULL DEFAULT '0', + `personalTabardEmblemStyle` int NOT NULL DEFAULT '-1', + `personalTabardEmblemColor` int NOT NULL DEFAULT '-1', + `personalTabardBorderStyle` int NOT NULL DEFAULT '-1', + `personalTabardBorderColor` int NOT NULL DEFAULT '-1', + `personalTabardBackgroundColor` int NOT NULL DEFAULT '-1', PRIMARY KEY (`guid`), KEY `idx_account` (`account`), KEY `idx_online` (`online`), @@ -3716,7 +3721,8 @@ INSERT INTO `updates` VALUES ('2023_09_14_00_characters.sql','DAC56929C724C2971A4476400F2439CBDFAF3C5C','ARCHIVED','2023-09-13 22:20:22',0), ('2023_09_30_00_characters.sql','4326C642870633873F163085D278DB9B7449D9C3','ARCHIVED','2023-09-30 16:34:19',0), ('2023_10_06_00_characters.sql','FFAFF1F0916BB9DC58345466E0BB1A15A4611836','ARCHIVED','2023-10-06 00:40:46',0), -('2023_11_02_00_characters.sql','1A76A843F204901C8598DA5682029E815477E427','RELEASED','2023-11-02 18:59:41',0); +('2023_11_02_00_characters.sql','1A76A843F204901C8598DA5682029E815477E427','RELEASED','2023-11-02 18:59:41',0), +('2023_11_09_00_characters.sql','1A3D7CA6890353DA55793FE8D925CC8C54965A69','RELEASED','2023-11-09 00:56:31',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/master/2023_11_09_00_auth.sql b/sql/updates/auth/master/2023_11_09_00_auth.sql new file mode 100644 index 00000000000..ca462a6d2e2 --- /dev/null +++ b/sql/updates/auth/master/2023_11_09_00_auth.sql @@ -0,0 +1,9 @@ +DELETE FROM `build_info` WHERE `build` IN (52038,52068,52095); +INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`,`winAuthSeed`,`win64AuthSeed`,`mac64AuthSeed`,`winChecksumSeed`,`macChecksumSeed`) VALUES +(52038,10,2,0,NULL,NULL,'A8EF004ADED8A3AFF5A67D2BB8D95795',NULL,NULL,NULL), +(52068,10,2,0,NULL,NULL,'A44F842BACCC7EE8E2975FAF01F12474',NULL,NULL,NULL), +(52095,10,2,0,NULL,NULL,'BA36382887D16D274EA9149695F0C9C8',NULL,NULL,NULL); + +UPDATE `realmlist` SET `gamebuild`=52095 WHERE `gamebuild`=51972; + +ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '52095'; diff --git a/sql/updates/characters/master/2023_11_09_00_characters.sql b/sql/updates/characters/master/2023_11_09_00_characters.sql new file mode 100644 index 00000000000..dec6bfc0432 --- /dev/null +++ b/sql/updates/characters/master/2023_11_09_00_characters.sql @@ -0,0 +1,6 @@ +ALTER TABLE `characters` + ADD `personalTabardEmblemStyle` int NOT NULL DEFAULT -1 AFTER `lastLoginBuild`, + ADD `personalTabardEmblemColor` int NOT NULL DEFAULT -1 AFTER `personalTabardEmblemStyle`, + ADD `personalTabardBorderStyle` int NOT NULL DEFAULT -1 AFTER `personalTabardEmblemColor`, + ADD `personalTabardBorderColor` int NOT NULL DEFAULT -1 AFTER `personalTabardBorderStyle`, + ADD `personalTabardBackgroundColor` int NOT NULL DEFAULT -1 AFTER `personalTabardBorderColor`; diff --git a/sql/updates/hotfixes/master/2023_11_09_00_hotfixes.sql b/sql/updates/hotfixes/master/2023_11_09_00_hotfixes.sql new file mode 100644 index 00000000000..457783c0295 --- /dev/null +++ b/sql/updates/hotfixes/master/2023_11_09_00_hotfixes.sql @@ -0,0 +1,57 @@ +ALTER TABLE `area_trigger` MODIFY `PhaseUseFlags` int NOT NULL DEFAULT 0 AFTER `ContinentID`; + +ALTER TABLE `chr_customization_display_info` ADD `BarberShopCameraZoomOffset` float NOT NULL DEFAULT 0 AFTER `BarberShopHeightOffset`; + +ALTER TABLE `chr_customization_element` ADD `ChrCustGeoComponentLinkID` int NOT NULL DEFAULT 0 AFTER `ParticleColorID`; + +ALTER TABLE `conversation_line` ADD `Unused1020` int unsigned NOT NULL DEFAULT 0 AFTER `BroadcastTextID`; + +ALTER TABLE `curve_point` MODIFY `CurveID` int unsigned NOT NULL DEFAULT 0 AFTER `ID`; + +ALTER TABLE `mount` MODIFY `Flags` int NOT NULL DEFAULT 0 AFTER `MountTypeID`; + +ALTER TABLE `mount_capability` MODIFY `Flags` int NOT NULL DEFAULT 0 AFTER `ID`; + +ALTER TABLE `movie` MODIFY `SubtitleFileFormat` int unsigned NOT NULL DEFAULT 0 AFTER `SubtitleFileDataID`; + +ALTER TABLE `phase` MODIFY `Flags` int NOT NULL DEFAULT 0 AFTER `ID`; + +ALTER TABLE `player_condition` MODIFY `PhaseUseFlags` int NOT NULL DEFAULT 0 AFTER `MaxAvgEquippedItemLevel`; + +-- +-- Table structure for table `server_messages` +-- +DROP TABLE IF EXISTS `server_messages`; +CREATE TABLE `server_messages` ( + `ID` int unsigned NOT NULL DEFAULT '0', + `Text` text, + `VerifiedBuild` int NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Table structure for table `server_messages_locale` +-- +DROP TABLE IF EXISTS `server_messages_locale`; +CREATE TABLE `server_messages_locale` ( + `ID` int unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Text_lang` text, + `VerifiedBuild` int NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +/*!50500 PARTITION BY LIST COLUMNS(locale) +(PARTITION deDE VALUES IN ('deDE') ENGINE = InnoDB, + PARTITION esES VALUES IN ('esES') ENGINE = InnoDB, + PARTITION esMX VALUES IN ('esMX') ENGINE = InnoDB, + PARTITION frFR VALUES IN ('frFR') ENGINE = InnoDB, + PARTITION itIT VALUES IN ('itIT') ENGINE = InnoDB, + PARTITION koKR VALUES IN ('koKR') ENGINE = InnoDB, + PARTITION ptBR VALUES IN ('ptBR') ENGINE = InnoDB, + PARTITION ruRU VALUES IN ('ruRU') ENGINE = InnoDB, + PARTITION zhCN VALUES IN ('zhCN') ENGINE = InnoDB, + PARTITION zhTW VALUES IN ('zhTW') ENGINE = InnoDB) */; + +ALTER TABLE `spell_shapeshift_form` CHANGE `CreatureDisplayID1` `CreatureDisplayID` int unsigned NOT NULL DEFAULT 0 AFTER `Name`; + +ALTER TABLE `ui_map` MODIFY `System` tinyint NOT NULL DEFAULT 0 AFTER `Flags`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 60bda9390de..07d69d37e4b 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -51,25 +51,35 @@ void CharacterDatabaseConnection::DoPrepareStatements() "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, " - "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id " - "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " + "WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor, " + "cd.genitive " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " + "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid " + "WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " + "WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor, " + "cd.genitive " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, " - "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id " - "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " + "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid " + "WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID", CONNECTION_ASYNC); @@ -87,7 +97,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() "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, " "health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, " - "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs, " + "personalTabardEmblemStyle, personalTabardEmblemColor, personalTabardBorderStyle, personalTabardBorderColor, personalTabardBackgroundColor " "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index ca2fd93d164..1ef4003d484 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -361,14 +361,14 @@ void HotfixDatabaseConnection::DoPrepareStatements() // ChrCustomizationDisplayInfo.db2 PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " - "BarberShopHeightOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "BarberShopHeightOffset, BarberShopCameraZoomOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT MAX(ID) + 1 FROM chr_customization_display_info", CONNECTION_SYNCH); // ChrCustomizationElement.db2 PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " "ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " - "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID, ParticleColorID" - " FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID, ParticleColorID, " + "ChrCustGeoComponentLinkID FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT MAX(ID) + 1 FROM chr_customization_element", CONNECTION_SYNCH); // ChrCustomizationOption.db2 @@ -464,8 +464,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_CONTENT_TUNING_X_LABEL, "SELECT MAX(ID) + 1 FROM content_tuning_x_label", CONNECTION_SYNCH); // ConversationLine.db2 - PrepareStatement(HOTFIX_SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " - "AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, Unused1020, SpellVisualKitID, AdditionalDuration, " + "NextConversationLineID, AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_CONVERSATION_LINE, "SELECT MAX(ID) + 1 FROM conversation_line", CONNECTION_SYNCH); // CorruptionEffects.db2 @@ -1390,6 +1390,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SCENE_SCRIPT_TEXT, "SELECT MAX(ID) + 1 FROM scene_script_text", CONNECTION_SYNCH); + // ServerMessages.db2 + PrepareStatement(HOTFIX_SEL_SERVER_MESSAGES, "SELECT ID, `Text` FROM server_messages WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PREPARE_MAX_ID_STMT(HOTFIX_SEL_SERVER_MESSAGES, "SELECT MAX(ID) + 1 FROM server_messages", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SERVER_MESSAGES, "SELECT ID, Text_lang FROM server_messages_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); + // SkillLine.db2 PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID, ExpansionNameSharedStringID, " @@ -1613,10 +1618,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT MAX(ID) + 1 FROM spell_shapeshift", CONNECTION_SYNCH); // SpellShapeshiftForm.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureType, Flags, AttackIconFileID, BonusActionBar, CombatRoundTime, " - "DamageVariance, MountTypeID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, " - "PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureDisplayID, CreatureType, Flags, AttackIconFileID, BonusActionBar, " + "CombatRoundTime, DamageVariance, MountTypeID, PresetSpellID1, PresetSpellID2, PresetSpellID3, PresetSpellID4, PresetSpellID5, " + "PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT MAX(ID) + 1 FROM spell_shapeshift_form", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE (`VerifiedBuild` > 0) = ?" " AND locale = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index fcebf47817e..8eaa6e0a81d 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -804,6 +804,10 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_SCENE_SCRIPT_TEXT, HOTFIX_SEL_SCENE_SCRIPT_TEXT_MAX_ID, + HOTFIX_SEL_SERVER_MESSAGES, + HOTFIX_SEL_SERVER_MESSAGES_MAX_ID, + HOTFIX_SEL_SERVER_MESSAGES_LOCALE, + HOTFIX_SEL_SKILL_LINE, HOTFIX_SEL_SKILL_LINE_MAX_ID, HOTFIX_SEL_SKILL_LINE_LOCALE, diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index b98b10992cb..2acfcba6691 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -571,6 +571,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaType type, uint64 miscValue1 /*= 0* case CriteriaType::DamageDealt: case CriteriaType::HealingDone: case CriteriaType::EarnArtifactXPForAzeriteItem: + case CriteriaType::GainLevels: SetCriteriaProgress(criteria, miscValue1, referencePlayer, PROGRESS_ACCUMULATE); break; case CriteriaType::KillCreature: @@ -1213,6 +1214,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CriteriaType::CompleteAnyReplayQuest: case CriteriaType::BuyItemsFromVendors: case CriteriaType::SellItemsToVendors: + case CriteriaType::GainLevels: return progress->Counter >= requiredAmount; case CriteriaType::EarnAchievement: case CriteriaType::CompleteQuest: @@ -1377,6 +1379,7 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis case CriteriaType::CompleteAnyReplayQuest: case CriteriaType::BuyItemsFromVendors: case CriteriaType::SellItemsToVendors: + case CriteriaType::GainLevels: if (!miscValue1) return false; break; @@ -3569,10 +3572,19 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 break; case 123: // Shadowlands Season 1 End // timestamp = unknown - break;; + break; case 149: // Shadowlands Season 2 End // timestamp = unknown break; + case 349: // Dragonflight Season 3 Start (pre-season) + eventTimestamp = time_t(1699340400); // November 7, 2023 8:00 + break; + case 350: // Dragonflight Season 3 Start + eventTimestamp = time_t(1699945200); // November 14, 2023 8:00 + break; + case 352: // Dragonflight Season 3 End + // eventTimestamp = time_t(); unknown + break; default: break; } @@ -3942,6 +3954,13 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 if (referencePlayer->GetPositionZ() >= reqValue) return false; break; + case ModifierTreeType::PlayerIsOnMapWithExpansion: // 380 + { + MapEntry const* mapEntry = referencePlayer->GetMap()->GetEntry(); + if (mapEntry->ExpansionID != reqValue) + return false; + break; + } default: return false; } @@ -4415,6 +4434,24 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaType type) return "MythicPlusRatingAttained"; case CriteriaType::SpentTalentPoint: return "SpentTalentPoint"; + case CriteriaType::MythicPlusDisplaySeasonEnded: + return "MythicPlusDisplaySeasonEnded"; + case CriteriaType::WinRatedSoloShuffleRound: + return "WinRatedSoloShuffleRound"; + case CriteriaType::ParticipateInRatedSoloShuffleRound: + return "ParticipateInRatedSoloShuffleRound"; + case CriteriaType::ReputationAmountGained: + return "ReputationAmountGained"; + case CriteriaType::FulfillAnyCraftingOrder: + return "FulfillAnyCraftingOrder"; + case CriteriaType::FulfillCraftingOrderType: + return "FulfillCraftingOrderType"; + case CriteriaType::PerksProgramMonthComplete: + return "PerksProgramMonthComplete"; + case CriteriaType::CompleteTrackingQuest: + return "CompleteTrackingQuest"; + case CriteriaType::GainLevels: + return "GainLevels"; default: return "MissingType"; } @@ -4635,11 +4672,11 @@ void CriteriaMgr::LoadCriteriaList() uint32 questObjectiveCriterias = 0; for (CriteriaEntry const* criteriaEntry : sCriteriaStore) { - ASSERT(criteriaEntry->Type < uint8(CriteriaType::Count), "CRITERIA_TYPE_TOTAL must be greater than or equal to %u but is currently equal to %u", + ASSERT(criteriaEntry->Type < AsUnderlyingType(CriteriaType::Count), "CriteriaType::Count must be greater than or equal to %u but is currently equal to %u", criteriaEntry->Type + 1, uint32(CriteriaType::Count)); - ASSERT(criteriaEntry->StartEvent < uint8(CriteriaStartEvent::Count), "CriteriaStartEvent::Count must be greater than or equal to %u but is currently equal to %u", + ASSERT(criteriaEntry->StartEvent < AsUnderlyingType(CriteriaStartEvent::Count), "CriteriaStartEvent::Count must be greater than or equal to %u but is currently equal to %u", criteriaEntry->StartEvent + 1, uint32(CriteriaStartEvent::Count)); - ASSERT(criteriaEntry->FailEvent < uint8(CriteriaFailEvent::Count), "CriteriaFailEvent::Count must be greater than or equal to %u but is currently equal to %u", + ASSERT(criteriaEntry->FailEvent < AsUnderlyingType(CriteriaFailEvent::Count), "CriteriaFailEvent::Count must be greater than or equal to %u but is currently equal to %u", criteriaEntry->FailEvent + 1, uint32(CriteriaFailEvent::Count)); auto treeItr = _criteriaTreeByCriteria.find(criteriaEntry->ID); diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 7a7648110fe..640963ae5af 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -206,7 +206,7 @@ struct AreaTriggerLoadInfo { false, FT_FLOAT, "PosZ" }, { false, FT_INT, "ID" }, { true, FT_SHORT, "ContinentID" }, - { true, FT_BYTE, "PhaseUseFlags" }, + { true, FT_INT, "PhaseUseFlags" }, { true, FT_SHORT, "PhaseID" }, { true, FT_SHORT, "PhaseGroupID" }, { false, FT_FLOAT, "Radius" }, @@ -992,21 +992,22 @@ struct ChrCustomizationChoiceLoadInfo struct ChrCustomizationDisplayInfoLoadInfo { - static constexpr DB2FieldMeta Fields[5] = + static constexpr DB2FieldMeta Fields[6] = { { false, FT_INT, "ID" }, { true, FT_INT, "ShapeshiftFormID" }, { true, FT_INT, "DisplayID" }, { false, FT_FLOAT, "BarberShopMinCameraDistance" }, { false, FT_FLOAT, "BarberShopHeightOffset" }, + { false, FT_FLOAT, "BarberShopCameraZoomOffset" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 5, &ChrCustomizationDisplayInfoMeta::Instance, HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO }; + static constexpr DB2LoadInfo Instance{ Fields, 6, &ChrCustomizationDisplayInfoMeta::Instance, HOTFIX_SEL_CHR_CUSTOMIZATION_DISPLAY_INFO }; }; struct ChrCustomizationElementLoadInfo { - static constexpr DB2FieldMeta Fields[13] = + static constexpr DB2FieldMeta Fields[14] = { { false, FT_INT, "ID" }, { true, FT_INT, "ChrCustomizationChoiceID" }, @@ -1021,9 +1022,10 @@ struct ChrCustomizationElementLoadInfo { true, FT_INT, "ChrCustomizationVoiceID" }, { true, FT_INT, "AnimKitID" }, { true, FT_INT, "ParticleColorID" }, + { true, FT_INT, "ChrCustGeoComponentLinkID" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 13, &ChrCustomizationElementMeta::Instance, HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT }; + static constexpr DB2LoadInfo Instance{ Fields, 14, &ChrCustomizationElementMeta::Instance, HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT }; }; struct ChrCustomizationOptionLoadInfo @@ -1332,10 +1334,11 @@ struct ContentTuningXLabelLoadInfo struct ConversationLineLoadInfo { - static constexpr DB2FieldMeta Fields[9] = + static constexpr DB2FieldMeta Fields[10] = { { false, FT_INT, "ID" }, { false, FT_INT, "BroadcastTextID" }, + { false, FT_INT, "Unused1020" }, { false, FT_INT, "SpellVisualKitID" }, { true, FT_INT, "AdditionalDuration" }, { false, FT_SHORT, "NextConversationLineID" }, @@ -1345,7 +1348,7 @@ struct ConversationLineLoadInfo { false, FT_BYTE, "EndAnimation" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 9, &ConversationLineMeta::Instance, HOTFIX_SEL_CONVERSATION_LINE }; + static constexpr DB2LoadInfo Instance{ Fields, 10, &ConversationLineMeta::Instance, HOTFIX_SEL_CONVERSATION_LINE }; }; struct CorruptionEffectsLoadInfo @@ -1601,7 +1604,7 @@ struct CurvePointLoadInfo { false, FT_FLOAT, "PreSLSquishPosX" }, { false, FT_FLOAT, "PreSLSquishPosY" }, { false, FT_INT, "ID" }, - { true, FT_INT, "CurveID" }, + { false, FT_INT, "CurveID" }, { false, FT_BYTE, "OrderIndex" }, }; @@ -3763,7 +3766,7 @@ struct MountLoadInfo { false, FT_STRING, "Description" }, { false, FT_INT, "ID" }, { false, FT_SHORT, "MountTypeID" }, - { false, FT_SHORT, "Flags" }, + { true, FT_INT, "Flags" }, { true, FT_BYTE, "SourceTypeEnum" }, { true, FT_INT, "SourceSpellID" }, { false, FT_INT, "PlayerConditionID" }, @@ -3781,7 +3784,7 @@ struct MountCapabilityLoadInfo static constexpr DB2FieldMeta Fields[10] = { { false, FT_INT, "ID" }, - { false, FT_BYTE, "Flags" }, + { true, FT_INT, "Flags" }, { false, FT_SHORT, "ReqRidingSkill" }, { false, FT_SHORT, "ReqAreaID" }, { false, FT_INT, "ReqSpellAuraID" }, @@ -3830,7 +3833,7 @@ struct MovieLoadInfo { false, FT_BYTE, "KeyID" }, { false, FT_INT, "AudioFileDataID" }, { false, FT_INT, "SubtitleFileDataID" }, - { true, FT_INT, "SubtitleFileFormat" }, + { false, FT_INT, "SubtitleFileFormat" }, }; static constexpr DB2LoadInfo Instance{ Fields, 6, &MovieMeta::Instance, HOTFIX_SEL_MOVIE }; @@ -3950,7 +3953,7 @@ struct PhaseLoadInfo static constexpr DB2FieldMeta Fields[2] = { { false, FT_INT, "ID" }, - { false, FT_SHORT, "Flags" }, + { true, FT_INT, "Flags" }, }; static constexpr DB2LoadInfo Instance{ Fields, 2, &PhaseMeta::Instance, HOTFIX_SEL_PHASE }; @@ -4010,7 +4013,7 @@ struct PlayerConditionLoadInfo { true, FT_INT, "MaxAvgItemLevel" }, { false, FT_SHORT, "MinAvgEquippedItemLevel" }, { false, FT_SHORT, "MaxAvgEquippedItemLevel" }, - { false, FT_BYTE, "PhaseUseFlags" }, + { true, FT_INT, "PhaseUseFlags" }, { false, FT_SHORT, "PhaseID" }, { false, FT_INT, "PhaseGroupID" }, { true, FT_INT, "Flags" }, @@ -4587,6 +4590,17 @@ struct SceneScriptTextLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 3, &SceneScriptTextMeta::Instance, HOTFIX_SEL_SCENE_SCRIPT_TEXT }; }; +struct ServerMessagesLoadInfo +{ + static constexpr DB2FieldMeta Fields[2] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Text" }, + }; + + static constexpr DB2LoadInfo Instance{ Fields, 2, &ServerMessagesMeta::Instance, HOTFIX_SEL_SERVER_MESSAGES }; +}; + struct SkillLineLoadInfo { static constexpr DB2FieldMeta Fields[15] = @@ -5341,10 +5355,11 @@ struct SpellShapeshiftLoadInfo struct SpellShapeshiftFormLoadInfo { - static constexpr DB2FieldMeta Fields[21] = + static constexpr DB2FieldMeta Fields[18] = { { false, FT_INT, "ID" }, { false, FT_STRING, "Name" }, + { false, FT_INT, "CreatureDisplayID" }, { true, FT_BYTE, "CreatureType" }, { true, FT_INT, "Flags" }, { true, FT_INT, "AttackIconFileID" }, @@ -5352,10 +5367,6 @@ struct SpellShapeshiftFormLoadInfo { true, FT_SHORT, "CombatRoundTime" }, { false, FT_FLOAT, "DamageVariance" }, { false, FT_SHORT, "MountTypeID" }, - { false, FT_INT, "CreatureDisplayID1" }, - { false, FT_INT, "CreatureDisplayID2" }, - { false, FT_INT, "CreatureDisplayID3" }, - { false, FT_INT, "CreatureDisplayID4" }, { false, FT_INT, "PresetSpellID1" }, { false, FT_INT, "PresetSpellID2" }, { false, FT_INT, "PresetSpellID3" }, @@ -5366,7 +5377,7 @@ struct SpellShapeshiftFormLoadInfo { false, FT_INT, "PresetSpellID8" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 21, &SpellShapeshiftFormMeta::Instance, HOTFIX_SEL_SPELL_SHAPESHIFT_FORM }; + static constexpr DB2LoadInfo Instance{ Fields, 18, &SpellShapeshiftFormMeta::Instance, HOTFIX_SEL_SPELL_SHAPESHIFT_FORM }; }; struct SpellTargetRestrictionsLoadInfo @@ -6109,7 +6120,7 @@ struct UiMapLoadInfo { false, FT_INT, "ID" }, { true, FT_INT, "ParentUiMapID" }, { true, FT_INT, "Flags" }, - { false, FT_BYTE, "System" }, + { true, FT_BYTE, "System" }, { false, FT_BYTE, "Type" }, { true, FT_INT, "BountySetID" }, { false, FT_INT, "BountyDisplayLocation" }, diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 28f43806b0a..6be4d8024cf 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -491,10 +491,10 @@ struct AreaPOIMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, false }, - { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, true }, { FT_SHORT, 1, false }, + { FT_SHORT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -502,7 +502,7 @@ struct AreaPOIMeta { FT_BYTE, 1, false }, }; - static constexpr DB2Meta Instance{ 1000630, 2, 21, 21, 0x701F6E76, Fields, 13 }; + static constexpr DB2Meta Instance{ 1000630, 2, 21, 21, 0x605253EC, Fields, 12 }; }; struct AreaPOIStateMeta @@ -558,7 +558,7 @@ struct AreaTriggerMeta { FT_FLOAT, 3, true }, { FT_INT, 1, false }, { FT_SHORT, 1, true }, - { FT_BYTE, 1, true }, + { FT_INT, 1, true }, { FT_SHORT, 1, true }, { FT_SHORT, 1, true }, { FT_FLOAT, 1, true }, @@ -572,7 +572,7 @@ struct AreaTriggerMeta { FT_BYTE, 1, true }, }; - static constexpr DB2Meta Instance{ 1354401, 1, 15, 15, 0xE8FBF624, Fields, 2 }; + static constexpr DB2Meta Instance{ 1354401, 1, 15, 15, 0x755974EC, Fields, 2 }; }; struct AreaTriggerActionSetMeta @@ -2087,11 +2087,11 @@ struct ChrCreateClassAnimTargetInfoMeta { { FT_INT, 1, false }, { FT_INT, 1, true }, - { FT_INT, 1, true }, + { FT_BYTE, 1, true }, { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 3671169, 0, 4, 3, 0x7DF65661, Fields, 3 }; + static constexpr DB2Meta Instance{ 3671169, 0, 4, 3, 0x9CC6607E, Fields, 3 }; }; struct ChrCustClientChoiceConversionMeta @@ -2106,6 +2106,16 @@ struct ChrCustClientChoiceConversionMeta static constexpr DB2Meta Instance{ 3590348, -1, 3, 2, 0xF1AE177C, Fields, 2 }; }; +struct ChrCustGeoComponentLinkMeta +{ + static constexpr DB2MetaField Fields[1] = + { + { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 5387095, -1, 1, 1, 0xB7E1E35F, Fields, -1 }; +}; + struct ChrCustItemGeoModifyMeta { static constexpr DB2MetaField Fields[3] = @@ -2212,20 +2222,21 @@ struct ChrCustomizationConversionMeta struct ChrCustomizationDisplayInfoMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[5] = { { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_FLOAT, 1, true }, { FT_FLOAT, 1, true }, + { FT_FLOAT, 1, true }, }; - static constexpr DB2Meta Instance{ 3593032, -1, 4, 4, 0x7CD43881, Fields, -1 }; + static constexpr DB2Meta Instance{ 3593032, -1, 5, 5, 0x5C04D385, Fields, -1 }; }; struct ChrCustomizationElementMeta { - static constexpr DB2MetaField Fields[12] = + static constexpr DB2MetaField Fields[13] = { { FT_INT, 1, true }, { FT_INT, 1, true }, @@ -2239,9 +2250,10 @@ struct ChrCustomizationElementMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 3512765, -1, 12, 12, 0xE040533A, Fields, -1 }; + static constexpr DB2Meta Instance{ 3512765, -1, 13, 13, 0x79DFED35, Fields, -1 }; }; struct ChrCustomizationGeosetMeta @@ -2890,6 +2902,21 @@ struct ConditionalContentTuningMeta static constexpr DB2Meta Instance{ 3501965, -1, 4, 3, 0x8DF8B6EC, Fields, 3 }; }; +struct ConditionalItemAppearanceMeta +{ + static constexpr DB2MetaField Fields[6] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 5345180, -1, 6, 5, 0x46A8294C, Fields, 5 }; +}; + struct ConfigurationWarningMeta { static constexpr DB2MetaField Fields[2] = @@ -3018,10 +3045,11 @@ struct ContributionStyleContainerMeta struct ConversationLineMeta { - static constexpr DB2MetaField Fields[8] = + static constexpr DB2MetaField Fields[9] = { { FT_INT, 1, false }, { FT_INT, 1, false }, + { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, @@ -3030,7 +3058,7 @@ struct ConversationLineMeta { FT_BYTE, 1, false }, }; - static constexpr DB2Meta Instance{ 1260801, -1, 8, 8, 0x9EE67C1B, Fields, -1 }; + static constexpr DB2Meta Instance{ 1260801, -1, 9, 9, 0xD199D7B9, Fields, -1 }; }; struct CorruptionEffectsMeta @@ -3257,7 +3285,7 @@ struct CreatureDifficultyTreasureMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 4044373, -1, 3, 2, 0x248ECDA6, Fields, 2 }; + static constexpr DB2Meta Instance{ 4044373, -1, 3, 2, 0x69361BEA, Fields, 2 }; }; struct CreatureDispXUiCameraMeta @@ -3729,11 +3757,11 @@ struct CurvePointMeta { FT_FLOAT, 2, true }, { FT_FLOAT, 2, true }, { FT_INT, 1, false }, - { FT_INT, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, false }, }; - static constexpr DB2Meta Instance{ 892586, 2, 5, 5, 0x32694505, Fields, 3 }; + static constexpr DB2Meta Instance{ 892586, 2, 5, 5, 0x861A11A0, Fields, 3 }; }; struct DeathThudLookupsMeta @@ -5442,7 +5470,7 @@ struct GlobalColorMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 4328468, -1, 2, 2, 0x2566517B, Fields, -1 }; + static constexpr DB2Meta Instance{ 4328468, -1, 2, 2, 0x70FE4450, Fields, -1 }; }; struct GlobalCurveMeta @@ -5604,7 +5632,7 @@ struct GossipXUIDisplayInfoMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 3622253, -1, 4, 4, 0xB59290B4, Fields, -1 }; + static constexpr DB2Meta Instance{ 3622253, -1, 4, 4, 0x30595578, Fields, -1 }; }; struct GradientEffectMeta @@ -6217,7 +6245,7 @@ struct ItemBonusSeasonBonusListGroupMeta struct ItemBonusSeasonUpgradeCostMeta { - static constexpr DB2MetaField Fields[7] = + static constexpr DB2MetaField Fields[8] = { { FT_STRING, 1, true }, { FT_INT, 1, false }, @@ -6226,9 +6254,10 @@ struct ItemBonusSeasonUpgradeCostMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 5155641, 1, 7, 7, 0xCFA99EBB, Fields, 4 }; + static constexpr DB2Meta Instance{ 5155641, 1, 8, 8, 0x76231EF7, Fields, 5 }; }; struct ItemBonusSequenceSpellMeta @@ -6559,6 +6588,17 @@ struct ItemFixupMeta static constexpr DB2Meta Instance{ 5152256, -1, 1, 1, 0x31DF97E4, Fields, -1 }; }; +struct ItemFixupActionMeta +{ + static constexpr DB2MetaField Fields[2] = + { + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 5475699, -1, 2, 1, 0x3B964A51, Fields, 1 }; +}; + struct ItemGroupIlvlScalingEntryMeta { static constexpr DB2MetaField Fields[5] = @@ -7896,7 +7936,7 @@ struct MapMeta { FT_INT, 3, true }, }; - static constexpr DB2Meta Instance{ 1349477, -1, 24, 24, 0x43E626E4, Fields, -1 }; + static constexpr DB2Meta Instance{ 1349477, -1, 24, 24, 0x15542FE8, Fields, -1 }; }; struct MapCelestialBodyMeta @@ -8150,7 +8190,7 @@ struct ModifiedCraftingReagentItemMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 3386487, -1, 6, 6, 0x5F7E56EC, Fields, -1 }; + static constexpr DB2Meta Instance{ 3386487, -1, 6, 6, 0x705BAAB0, Fields, -1 }; }; struct ModifiedCraftingReagentSlotMeta @@ -8208,7 +8248,7 @@ struct MountMeta { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_SHORT, 1, false }, - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, false }, @@ -8218,14 +8258,14 @@ struct MountMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 921760, 3, 13, 13, 0x7A9CE26C, Fields, -1 }; + static constexpr DB2Meta Instance{ 921760, 3, 13, 13, 0x9A3BFE1E, Fields, -1 }; }; struct MountCapabilityMeta { static constexpr DB2MetaField Fields[9] = { - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, @@ -8236,7 +8276,7 @@ struct MountCapabilityMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 1114709, -1, 9, 9, 0x7620F729, Fields, -1 }; + static constexpr DB2Meta Instance{ 1114709, -1, 9, 9, 0xF662BA9A, Fields, -1 }; }; struct MountEquipmentMeta @@ -8298,7 +8338,7 @@ struct MountXSpellVisualKitPickerMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 3989477, -1, 5, 4, 0x253A6DD0, Fields, 4 }; + static constexpr DB2Meta Instance{ 3989477, -1, 5, 4, 0xD9F7D5F2, Fields, 4 }; }; struct MovieMeta @@ -8309,10 +8349,10 @@ struct MovieMeta { FT_BYTE, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, false }, - { FT_INT, 1, true }, + { FT_INT, 1, false }, }; - static constexpr DB2Meta Instance{ 1332556, -1, 5, 5, 0x214C1925, Fields, -1 }; + static constexpr DB2Meta Instance{ 1332556, -1, 5, 5, 0x6C52E628, Fields, -1 }; }; struct MovieFileDataMeta @@ -8371,6 +8411,18 @@ struct MultiTransitionPropertiesMeta static constexpr DB2Meta Instance{ 1965589, -1, 5, 5, 0x20221E9D, Fields, -1 }; }; +struct MusicOverrideMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { FT_SHORT, 1, false }, + { FT_SHORT, 1, false }, + { FT_BYTE, 1, false }, + }; + + static constexpr DB2Meta Instance{ 5161908, -1, 3, 3, 0xEE5D12BD, Fields, -1 }; +}; + struct MythicPlusSeasonMeta { static constexpr DB2MetaField Fields[4] = @@ -8386,15 +8438,16 @@ struct MythicPlusSeasonMeta struct MythicPlusSeasonRewardLevelsMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[5] = { { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 2123783, -1, 4, 3, 0x2ABB5E15, Fields, 3 }; + static constexpr DB2Meta Instance{ 2123783, -1, 5, 5, 0xA1A30565, Fields, 0 }; }; struct MythicPlusSeasonTrackedAffixMeta @@ -8932,6 +8985,18 @@ struct PerksActivityXTagMeta static constexpr DB2Meta Instance{ 4694318, 0, 3, 2, 0x5254EC49, Fields, 2 }; }; +struct PerksUIThemeMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 5389878, 0, 3, 3, 0x10119030, Fields, -1 }; +}; + struct PerksVendorCategoryMeta { static constexpr DB2MetaField Fields[4] = @@ -8947,7 +9012,7 @@ struct PerksVendorCategoryMeta struct PerksVendorItemMeta { - static constexpr DB2MetaField Fields[8] = + static constexpr DB2MetaField Fields[9] = { { FT_INT, 1, false }, { FT_INT, 1, true }, @@ -8957,22 +9022,34 @@ struct PerksVendorItemMeta { FT_INT, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, + { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 4281311, 0, 8, 8, 0x451B856E, Fields, -1 }; + static constexpr DB2Meta Instance{ 4281311, 0, 9, 9, 0x80A50418, Fields, -1 }; }; -struct PerksVendorItemUIInfoMeta +struct PerksVendorItemUIGroupMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[3] = { + { FT_STRING, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 5386256, 1, 3, 3, 0x3C22481A, Fields, -1 }; +}; + +struct PerksVendorItemUIInfoMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 4281312, 0, 4, 4, 0xF86315E9, Fields, -1 }; + static constexpr DB2Meta Instance{ 4281312, 0, 3, 3, 0x6D14E9E7, Fields, -1 }; }; struct PerksVendorItemXIntervalMeta @@ -8990,10 +9067,10 @@ struct PhaseMeta { static constexpr DB2MetaField Fields[1] = { - { FT_SHORT, 1, false }, + { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 1348558, -1, 1, 1, 0x2BE7B349, Fields, -1 }; + static constexpr DB2Meta Instance{ 1348558, -1, 1, 1, 0x3CC972C6, Fields, -1 }; }; struct PhaseShiftZoneSoundsMeta @@ -9004,7 +9081,7 @@ struct PhaseShiftZoneSoundsMeta { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_INT, 1, false }, { FT_INT, 1, false }, { FT_SHORT, 1, false }, @@ -9015,7 +9092,7 @@ struct PhaseShiftZoneSoundsMeta { FT_BYTE, 1, false }, }; - static constexpr DB2Meta Instance{ 1267336, -1, 13, 13, 0x48F50F33, Fields, -1 }; + static constexpr DB2Meta Instance{ 1267336, -1, 13, 13, 0x846C026E, Fields, -1 }; }; struct PhaseXPhaseGroupMeta @@ -9084,7 +9161,7 @@ struct PlayerConditionMeta { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, { FT_INT, 1, true }, @@ -9133,7 +9210,7 @@ struct PlayerConditionMeta { FT_SHORT, 4, false }, }; - static constexpr DB2Meta Instance{ 1045411, -1, 84, 84, 0x4FD5055D, Fields, -1 }; + static constexpr DB2Meta Instance{ 1045411, -1, 84, 84, 0xEE0F1EDC, Fields, -1 }; }; struct PositionerMeta @@ -10596,12 +10673,12 @@ struct SoundEmittersMeta { FT_BYTE, 1, false }, { FT_SHORT, 1, false }, { FT_INT, 1, false }, - { FT_BYTE, 1, false }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 1092316, 3, 12, 11, 0xA4A5BBC4, Fields, 11 }; + static constexpr DB2Meta Instance{ 1092316, 3, 12, 11, 0xDCEA9A09, Fields, 11 }; }; struct SoundEnvelopeMeta @@ -11834,6 +11911,7 @@ struct SpellShapeshiftFormMeta static constexpr DB2MetaField Fields[10] = { { FT_STRING, 1, true }, + { FT_INT, 1, false }, { FT_BYTE, 1, true }, { FT_INT, 1, true }, { FT_INT, 1, true }, @@ -11841,11 +11919,10 @@ struct SpellShapeshiftFormMeta { FT_SHORT, 1, true }, { FT_FLOAT, 1, true }, { FT_SHORT, 1, false }, - { FT_INT, 4, false }, { FT_INT, 8, false }, }; - static constexpr DB2Meta Instance{ 1280618, -1, 10, 10, 0xBFE8FFA1, Fields, -1 }; + static constexpr DB2Meta Instance{ 1280618, -1, 10, 10, 0x887ACBCE, Fields, -1 }; }; struct SpellSpecialUnitEffectMeta @@ -13572,15 +13649,16 @@ struct UiQuestDetailsThemeMeta struct UiTextureAtlasMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[5] = { + { FT_INT, 1, false }, { FT_INT, 1, true }, { FT_SHORT, 1, false }, { FT_SHORT, 1, false }, { FT_BYTE, 1, false }, }; - static constexpr DB2Meta Instance{ 897470, -1, 4, 4, 0xA63B3475, Fields, -1 }; + static constexpr DB2Meta Instance{ 897470, 0, 5, 5, 0x84691E24, Fields, -1 }; }; struct UiTextureAtlasElementMeta @@ -13594,6 +13672,22 @@ struct UiTextureAtlasElementMeta static constexpr DB2Meta Instance{ 1989276, 1, 2, 2, 0x402AB955, Fields, -1 }; }; +struct UiTextureAtlasElementSliceDataMeta +{ + static constexpr DB2MetaField Fields[7] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + { FT_BYTE, 1, false }, + }; + + static constexpr DB2Meta Instance{ 5319042, 0, 7, 7, 0x105CAB2E, Fields, -1 }; +}; + struct UiTextureAtlasMemberMeta { static constexpr DB2MetaField Fields[12] = @@ -13678,7 +13772,7 @@ struct UiWidgetDataSourceMeta { FT_INT, 1, true }, }; - static constexpr DB2Meta Instance{ 1983640, -1, 4, 3, 0x183FA098, Fields, 3 }; + static constexpr DB2Meta Instance{ 1983640, -1, 4, 3, 0xF2B11731, Fields, 3 }; }; struct UiWidgetMapMeta @@ -14277,6 +14371,18 @@ struct WeatherXParticulateMeta static constexpr DB2Meta Instance{ 1965591, -1, 2, 1, 0xD6E739FE, Fields, 1 }; }; +struct WeeklyRewardChestActivityTierMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { FT_INT, 1, false }, + { FT_INT, 1, true }, + { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 5390446, 0, 3, 3, 0x4265F6DC, Fields, -1 }; +}; + struct WeeklyRewardChestThresholdMeta { static constexpr DB2MetaField Fields[3] = @@ -14321,17 +14427,18 @@ struct WorldBossLockoutMeta struct WorldChunkSoundsMeta { - static constexpr DB2MetaField Fields[6] = + static constexpr DB2MetaField Fields[7] = { { FT_SHORT, 1, false }, { FT_INT, 1, true }, + { FT_INT, 1, true }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, { FT_BYTE, 1, false }, }; - static constexpr DB2Meta Instance{ 1267069, -1, 6, 6, 0x967E93B7, Fields, -1 }; + static constexpr DB2Meta Instance{ 1267069, -1, 7, 7, 0x589C31E5, Fields, -1 }; }; struct WorldEffectMeta @@ -14361,6 +14468,19 @@ struct WorldElapsedTimerMeta static constexpr DB2Meta Instance{ 1135240, -1, 3, 3, 0x30FF7138, Fields, -1 }; }; +struct WorldLayerMapSetMeta +{ + static constexpr DB2MetaField Fields[4] = + { + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_STRING_NOT_LOCALIZED, 1, true }, + { FT_INT, 1, false }, + { FT_INT, 1, true }, + }; + + static constexpr DB2Meta Instance{ 4550228, 2, 4, 4, 0x64C69433, Fields, -1 }; +}; + struct WorldMapOverlayMeta { static constexpr DB2MetaField Fields[13] = diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 6de4f4b423e..6b882eb1bcd 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -274,6 +274,7 @@ DB2Storage<SceneScriptEntry> sSceneScriptStore("SceneScript.d DB2Storage<SceneScriptGlobalTextEntry> sSceneScriptGlobalTextStore("SceneScriptGlobalText.db2", &SceneScriptGlobalTextLoadInfo::Instance); DB2Storage<SceneScriptPackageEntry> sSceneScriptPackageStore("SceneScriptPackage.db2", &SceneScriptPackageLoadInfo::Instance); DB2Storage<SceneScriptTextEntry> sSceneScriptTextStore("SceneScriptText.db2", &SceneScriptTextLoadInfo::Instance); +DB2Storage<ServerMessagesEntry> sServerMessagesStore("ServerMessages.db2", &ServerMessagesLoadInfo::Instance); DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", &SkillLineLoadInfo::Instance); DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", &SkillLineAbilityLoadInfo::Instance); DB2Storage<SkillLineXTraitTreeEntry> sSkillLineXTraitTreeStore("SkillLineXTraitTree.db2", &SkillLineXTraitTreeLoadInfo::Instance); @@ -869,6 +870,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sSceneScriptGlobalTextStore); LOAD_DB2(sSceneScriptPackageStore); LOAD_DB2(sSceneScriptTextStore); + LOAD_DB2(sServerMessagesStore); LOAD_DB2(sSkillLineStore); LOAD_DB2(sSkillLineAbilityStore); LOAD_DB2(sSkillLineXTraitTreeStore); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index ad4f829aa61..a8f40b74d48 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -213,6 +213,7 @@ TC_GAME_API extern DB2Storage<ScenarioEntry> sScenarioSto TC_GAME_API extern DB2Storage<ScenarioStepEntry> sScenarioStepStore; TC_GAME_API extern DB2Storage<SkillLineEntry> sSkillLineStore; TC_GAME_API extern DB2Storage<SceneScriptPackageEntry> sSceneScriptPackageStore; +TC_GAME_API extern DB2Storage<ServerMessagesEntry> sServerMessagesStore; TC_GAME_API extern DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore; TC_GAME_API extern DB2Storage<SkillLineXTraitTreeEntry> sSkillLineXTraitTreeStore; TC_GAME_API extern DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 18b16e9d51b..a63d5c4e82d 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -165,7 +165,7 @@ struct AreaTriggerEntry DBCPosition3D Pos; uint32 ID; int16 ContinentID; - int8 PhaseUseFlags; + int32 PhaseUseFlags; int16 PhaseID; int16 PhaseGroupID; float Radius; @@ -702,6 +702,7 @@ struct ChrCustomizationDisplayInfoEntry int32 DisplayID; float BarberShopMinCameraDistance; float BarberShopHeightOffset; + float BarberShopCameraZoomOffset; }; struct ChrCustomizationElementEntry @@ -719,6 +720,7 @@ struct ChrCustomizationElementEntry int32 ChrCustomizationVoiceID; int32 AnimKitID; int32 ParticleColorID; + int32 ChrCustGeoComponentLinkID; }; struct ChrCustomizationOptionEntry @@ -963,6 +965,7 @@ struct ConversationLineEntry { uint32 ID; uint32 BroadcastTextID; + uint32 Unused1020; uint32 SpellVisualKitID; int32 AdditionalDuration; uint16 NextConversationLineID; @@ -1423,7 +1426,7 @@ struct CurvePointEntry DBCPosition2D Pos; DBCPosition2D PreSLSquishPos; uint32 ID; - int32 CurveID; + uint32 CurveID; uint8 OrderIndex; }; @@ -2849,7 +2852,7 @@ struct MountEntry LocalizedString Description; uint32 ID; uint16 MountTypeID; - uint16 Flags; + int32 Flags; int8 SourceTypeEnum; int32 SourceSpellID; uint32 PlayerConditionID; @@ -2864,7 +2867,7 @@ struct MountEntry struct MountCapabilityEntry { uint32 ID; - uint8 Flags; + int32 Flags; uint16 ReqRidingSkill; uint16 ReqAreaID; uint32 ReqSpellAuraID; @@ -2898,7 +2901,7 @@ struct MovieEntry uint8 KeyID; uint32 AudioFileDataID; uint32 SubtitleFileDataID; - int32 SubtitleFileFormat; + uint32 SubtitleFileFormat; }; struct MythicPlusSeasonEntry @@ -2966,7 +2969,7 @@ struct ParagonReputationEntry struct PhaseEntry { uint32 ID; - uint16 Flags; + int32 Flags; EnumFlag<PhaseEntryFlags> GetFlags() const { return static_cast<PhaseEntryFlags>(Flags); } }; @@ -3018,7 +3021,7 @@ struct PlayerConditionEntry int32 MaxAvgItemLevel; uint16 MinAvgEquippedItemLevel; uint16 MaxAvgEquippedItemLevel; - uint8 PhaseUseFlags; + int32 PhaseUseFlags; uint16 PhaseID; uint32 PhaseGroupID; int32 Flags; @@ -3339,6 +3342,12 @@ struct SceneScriptTextEntry char const* Script; }; +struct ServerMessagesEntry +{ + uint32 ID; + LocalizedString Text; +}; + struct SkillLineEntry { LocalizedString DisplayName; @@ -3825,6 +3834,7 @@ struct SpellShapeshiftFormEntry { uint32 ID; LocalizedString Name; + uint32 CreatureDisplayID; int8 CreatureType; int32 Flags; int32 AttackIconFileID; @@ -3832,7 +3842,6 @@ struct SpellShapeshiftFormEntry int16 CombatRoundTime; float DamageVariance; uint16 MountTypeID; - std::array<uint32, 4> CreatureDisplayID; std::array<uint32, MAX_SHAPESHIFT_SPELLS> PresetSpellID; EnumFlag<SpellShapeshiftFormFlags> GetFlags() const { return static_cast<SpellShapeshiftFormFlags>(Flags); } @@ -4348,7 +4357,7 @@ struct UiMapEntry uint32 ID; int32 ParentUiMapID; int32 Flags; - uint8 System; + int8 System; uint8 Type; int32 BountySetID; uint32 BountyDisplayLocation; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 83ef2bf8075..6689d13eb48 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -497,7 +497,7 @@ enum class CriteriaFlags : uint8 DEFINE_ENUM_FLAG(CriteriaFlags); -enum class CriteriaType : uint8 +enum class CriteriaType : int16 { KillCreature = 0, // Kill NPC "{Creature}" WinBattleground = 1, // Win battleground "{Map}" @@ -744,7 +744,9 @@ enum class CriteriaType : uint8 PerksProgramMonthComplete = 249, /*NYI*/ CompleteTrackingQuest = 250, /*NYI*/ - Count + + GainLevels = 253, // Gain levels + Count = 257 }; enum class CriteriaTreeFlags : uint16 @@ -1686,6 +1688,11 @@ enum class ModifierTreeType : int32 PlayerHasCompletedQuestWithLabel = 372, /*NYI*/ // Player has previously completed quest with {QuestLabel} LegacyLootIsEnabled = 373, /*NYI*/ PlayerZPositionBelow = 374, + PlayerWeaponHighWatermarkAboveOrEqual = 375, /*NYI*/ + PlayerHeadHighWatermarkAboveOrEqual = 376, /*NYI*/ + PlayerHasDisplayedCurrencyLessThan = 377, /*NYI*/ // Player has {CurrencyTypes} less than {#Amount} (value visible in ui is taken into account, not raw value) + + PlayerIsOnMapWithExpansion = 380, // Player is on map that has {ExpansionID} }; enum class ModifierTreeOperator : int8 @@ -1714,7 +1721,7 @@ enum MountFlags MOUNT_FLAG_HIDE_IF_UNKNOWN = 0x40 }; -enum class PhaseEntryFlags : uint16 +enum class PhaseEntryFlags : int32 { ReadOnly = 0x001, InternalPhase = 0x002, @@ -1768,7 +1775,7 @@ enum class PlayerInteractionType : int32 Registrar = 11, Vendor = 12, PetitionVendor = 13, - TabardVendor = 14, + GuildTabardVendor = 14, TalentMaster = 15, SpecializationMaster = 16, MailInfo = 17, @@ -1818,7 +1825,8 @@ enum class PlayerInteractionType : int32 TraitSystem = 61, BarbersChoice = 62, JailersTowerBuffs = 63, - MajorFactionRenown = 64 + MajorFactionRenown = 64, + PersonalTabardVendor = 65 }; enum class PowerTypeFlags : int16 diff --git a/src/server/game/Entities/Conversation/Conversation.cpp b/src/server/game/Entities/Conversation/Conversation.cpp index 087fb812e08..9ed3043e877 100644 --- a/src/server/game/Entities/Conversation/Conversation.cpp +++ b/src/server/game/Entities/Conversation/Conversation.cpp @@ -192,17 +192,16 @@ void Conversation::Create(ObjectGuid::LowType lowGuid, uint32 conversationEntry, if (!sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_CONVERSATION_LINE, line->Id, creator)) continue; - lines.emplace_back(); + ConversationLineEntry const* convoLine = sConversationLineStore.LookupEntry(line->Id); // never null for conversationTemplate->Lines - UF::ConversationLine& lineField = lines.back(); + UF::ConversationLine& lineField = lines.emplace_back(); lineField.ConversationLineID = line->Id; + lineField.BroadcastTextID = convoLine->BroadcastTextID; lineField.UiCameraID = line->UiCameraID; lineField.ActorIndex = line->ActorIdx; lineField.Flags = line->Flags; lineField.ChatType = line->ChatType; - ConversationLineEntry const* convoLine = sConversationLineStore.LookupEntry(line->Id); // never null for conversationTemplate->Lines - for (LocaleConstant locale = LOCALE_enUS; locale < TOTAL_LOCALES; locale = LocaleConstant(locale + 1)) { if (locale == LOCALE_none) diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index d69f9373b05..72aa91aae39 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -41,7 +41,7 @@ enum class GossipOptionNpc : uint8 Binder = 5, // Golden interaction wheel Banker = 6, // Brown bag (with gold coin in lower corner) PetitionVendor = 7, // White chat bubble (with "..." inside) - TabardVendor = 8, // White tabard + GuildTabardVendor = 8, // White tabard Battlemaster = 9, // Two crossed swords Auctioneer = 10, // Stack of gold coins TalentMaster = 11, // White chat bubble @@ -87,6 +87,7 @@ enum class GossipOptionNpc : uint8 TraitSystem = 51, BarbersChoice = 52, MajorFactionRenown = 53, + PersonalTabardVendor = 54, Count }; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index dd13e001442..2a4402603e9 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -860,6 +860,7 @@ void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* { data << int32(ItemID); data << int32(SecondaryItemModifiedAppearanceID); + data << int32(ConditionalItemAppearanceID); data << uint16(ItemAppearanceModID); data << uint16(ItemVisual); } @@ -870,7 +871,7 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 5); + data.WriteBits(changesMask.GetBlock(0), 6); data.FlushBits(); if (changesMask[0]) @@ -885,10 +886,14 @@ void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit con } if (changesMask[3]) { - data << uint16(ItemAppearanceModID); + data << int32(ConditionalItemAppearanceID); } if (changesMask[4]) { + data << uint16(ItemAppearanceModID); + } + if (changesMask[5]) + { data << uint16(ItemVisual); } } @@ -898,6 +903,7 @@ void VisibleItem::ClearChangesMask() { Base::ClearChangesMask(ItemID); Base::ClearChangesMask(SecondaryItemModifiedAppearanceID); + Base::ClearChangesMask(ConditionalItemAppearanceID); Base::ClearChangesMask(ItemAppearanceModID); Base::ClearChangesMask(ItemVisual); _changesMask.ResetAll(); @@ -2119,10 +2125,120 @@ bool CTROptions::operator==(CTROptions const& right) const && ExpansionLevelMask == right.ExpansionLevelMask; } +void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + for (uint32 i = 0; i < 5; ++i) + { + data.WriteBits(Name[i].size(), 10); + } + data.FlushBits(); + for (uint32 i = 0; i < 5; ++i) + { + data.WriteString(Name[i]); + } + data.FlushBits(); +} + +void DeclinedNames::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlocksMask(0), 1); + if (changesMask.GetBlock(0)) + data.WriteBits(changesMask.GetBlock(0), 32); + + data.FlushBits(); + if (changesMask[0]) + { + for (uint32 i = 0; i < 5; ++i) + { + if (changesMask[1 + i]) + { + data.WriteBits(Name[i].size(), 10); + } + } + } + data.FlushBits(); + if (changesMask[0]) + { + for (uint32 i = 0; i < 5; ++i) + { + if (changesMask[1 + i]) + { + data.WriteString(Name[i]); + } + } + } + data.FlushBits(); +} + +void DeclinedNames::ClearChangesMask() +{ + Base::ClearChangesMask(Name); + _changesMask.ResetAll(); +} + +void CustomTabardInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(EmblemStyle); + data << int32(EmblemColor); + data << int32(BorderStyle); + data << int32(BorderColor); + data << int32(BackgroundColor); +} + +void CustomTabardInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 6); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << int32(EmblemStyle); + } + if (changesMask[2]) + { + data << int32(EmblemColor); + } + if (changesMask[3]) + { + data << int32(BorderStyle); + } + if (changesMask[4]) + { + data << int32(BorderColor); + } + if (changesMask[5]) + { + data << int32(BackgroundColor); + } + } +} + +void CustomTabardInfo::ClearChangesMask() +{ + Base::ClearChangesMask(EmblemStyle); + Base::ClearChangesMask(EmblemColor); + Base::ClearChangesMask(BorderStyle); + Base::ClearChangesMask(BorderColor); + Base::ClearChangesMask(BackgroundColor); + _changesMask.ResetAll(); +} + void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { data << DuelArbiter; data << WowAccount; + data << BnetAccount; + data << uint64(GuildClubMemberID); data << LootTargetGUID; data << uint32(PlayerFlags); data << uint32(PlayerFlagsEx); @@ -2130,6 +2246,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint32(GuildDeleteDate); data << int32(GuildLevel); data << uint32(Customizations.size()); + data << uint32(QaCustomizations.size()); for (uint32 i = 0; i < 2; ++i) { data << uint8(PartyType[i]); @@ -2168,7 +2285,6 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << int32(Field_B0); data << int32(Field_B4); data << int32(CurrentBattlePetSpeciesID); - data << field_138; CtrOptions->WriteCreate(data, owner, receiver); data << int32(CovenantID); data << int32(SoulbindID); @@ -2177,10 +2293,15 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi { data << uint32(Field_3120[i]); } + PersonalTabard->WriteCreate(data, owner, receiver); for (uint32 i = 0; i < Customizations.size(); ++i) { Customizations[i].WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < QaCustomizations.size(); ++i) + { + QaCustomizations[i].WriteCreate(data, owner, receiver); + } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) { for (uint32 i = 0; i < QuestSessionQuestLog.size(); ++i) @@ -2196,18 +2317,26 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi { data << int32(VisualItemReplacements[i]); } + data.FlushBits(); + data.WriteBits(Name->size(), 6); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) { data.WriteBit(HasQuestSession); } data.WriteBit(HasLevelLink); + data.WriteBits(DeclinedNames.has_value(), 1); data << DungeonScore; + data.WriteString(Name); + if (DeclinedNames.has_value()) + { + DeclinedNames->WriteCreate(data, owner, receiver); + } data.FlushBits(); } void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFE000000u, 0xFFFFFFFFu, 0x000000FFu }); + Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2215,12 +2344,12 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= { 0x00000012u, 0xFFFFFE00u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x01FFFFFFu, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000022u, 0xFFFFC000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x3FFFFFFFu, 0x00000000u, 0x00000000u }; } void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFE000000u, 0xFFFFFFFFu, 0x000000FFu }); + Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -2253,18 +2382,25 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign if (changesMask[4]) { if (!ignoreNestedChangesMask) + QaCustomizations.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(QaCustomizations.size(), data); + } + if (changesMask[5]) + { + if (!ignoreNestedChangesMask) QuestSessionQuestLog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(QuestSessionQuestLog.size(), data); } - if (changesMask[5]) + if (changesMask[6]) { if (!ignoreNestedChangesMask) ArenaCooldowns.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ArenaCooldowns.size(), data); } - if (changesMask[6]) + if (changesMask[7]) { if (!ignoreNestedChangesMask) VisualItemReplacements.WriteUpdateMask(data); @@ -2287,6 +2423,16 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } if (changesMask[4]) { + for (uint32 i = 0; i < QaCustomizations.size(); ++i) + { + if (QaCustomizations.HasChanged(i) || ignoreNestedChangesMask) + { + QaCustomizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[5]) + { for (uint32 i = 0; i < QuestSessionQuestLog.size(); ++i) { if (QuestSessionQuestLog.HasChanged(i) || ignoreNestedChangesMask) @@ -2298,7 +2444,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[5]) + if (changesMask[6]) { for (uint32 i = 0; i < ArenaCooldowns.size(); ++i) { @@ -2308,7 +2454,7 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[6]) + if (changesMask[7]) { for (uint32 i = 0; i < VisualItemReplacements.size(); ++i) { @@ -2318,145 +2464,170 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[7]) - { - data << DuelArbiter; - } if (changesMask[8]) { - data << WowAccount; + data << DuelArbiter; } if (changesMask[9]) { - data << LootTargetGUID; + data << WowAccount; } if (changesMask[10]) { - data << uint32(PlayerFlags); + data << BnetAccount; } if (changesMask[11]) { - data << uint32(PlayerFlagsEx); + data << uint64(GuildClubMemberID); } if (changesMask[12]) { - data << uint32(GuildRankID); + data << LootTargetGUID; } if (changesMask[13]) { - data << uint32(GuildDeleteDate); + data << uint32(PlayerFlags); } if (changesMask[14]) { - data << int32(GuildLevel); + data << uint32(PlayerFlagsEx); } if (changesMask[15]) { - data << uint8(NativeSex); + data << uint32(GuildRankID); } if (changesMask[16]) { - data << uint8(Inebriation); + data << uint32(GuildDeleteDate); } if (changesMask[17]) { - data << uint8(PvpTitle); + data << int32(GuildLevel); } if (changesMask[18]) { - data << uint8(ArenaFaction); + data << uint8(NativeSex); } if (changesMask[19]) { - data << uint32(DuelTeam); + data << uint8(Inebriation); } if (changesMask[20]) { - data << int32(GuildTimeStamp); + data << uint8(PvpTitle); } if (changesMask[21]) { - data << int32(PlayerTitle); + data << uint8(ArenaFaction); } if (changesMask[22]) { - data << int32(FakeInebriation); + data << uint32(DuelTeam); } if (changesMask[23]) { - data << uint32(VirtualPlayerRealm); + data << int32(GuildTimeStamp); } if (changesMask[24]) { - data << uint32(CurrentSpecID); + data << int32(PlayerTitle); } if (changesMask[25]) { - data << int32(TaxiMountAnimKitID); + data << int32(FakeInebriation); } if (changesMask[26]) { - data << uint8(CurrentBattlePetBreedQuality); + data << uint32(VirtualPlayerRealm); } if (changesMask[27]) { - data << int32(HonorLevel); + data << uint32(CurrentSpecID); } if (changesMask[28]) { - data << int64(LogoutTime); + data << int32(TaxiMountAnimKitID); } if (changesMask[29]) { - data << int32(Field_B0); + data << uint8(CurrentBattlePetBreedQuality); } if (changesMask[30]) { - data << int32(Field_B4); + data << int32(HonorLevel); } if (changesMask[31]) { - data << int32(CurrentBattlePetSpeciesID); + data << int64(LogoutTime); } } if (changesMask[32]) { - if (changesMask[33]) + if (changesMask[34]) { - data << field_138; + data << int32(Field_B0); } - if (changesMask[34]) + if (changesMask[35]) + { + data << int32(Field_B4); + } + if (changesMask[36]) + { + data << int32(CurrentBattlePetSpeciesID); + } + if (changesMask[37]) { CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[35]) + if (changesMask[38]) { data << int32(CovenantID); } - if (changesMask[36]) + if (changesMask[39]) { data << int32(SoulbindID); } - if (changesMask[37]) + if (changesMask[42]) + { + PersonalTabard->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[33]) + { + data.WriteBits(Name->size(), 32); + } + data.WriteBits(DeclinedNames.has_value(), 1); + data.FlushBits(); + if (changesMask[40]) { data << DungeonScore; } + if (changesMask[33]) + { + data.WriteString(Name); + } + if (changesMask[41]) + { + if (DeclinedNames.has_value()) + { + DeclinedNames->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[38]) + if (changesMask[43]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[39 + i]) + if (changesMask[44 + i]) { data << uint8(PartyType[i]); } } } - if (changesMask[41]) + if (changesMask[46]) { for (uint32 i = 0; i < 175; ++i) { - if (changesMask[42 + i]) + if (changesMask[47 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2465,31 +2636,31 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[217]) + if (changesMask[222]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[218 + i]) + if (changesMask[223 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[237]) + if (changesMask[242]) { for (uint32 i = 0; i < 6; ++i) { - if (changesMask[238 + i]) + if (changesMask[243 + i]) { data << float(AvgItemLevel[i]); } } } - if (changesMask[244]) + if (changesMask[249]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[245 + i]) + if (changesMask[250 + i]) { data << uint32(Field_3120[i]); } @@ -2503,11 +2674,14 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(HasQuestSession); Base::ClearChangesMask(HasLevelLink); Base::ClearChangesMask(Customizations); + Base::ClearChangesMask(QaCustomizations); Base::ClearChangesMask(QuestSessionQuestLog); Base::ClearChangesMask(ArenaCooldowns); Base::ClearChangesMask(VisualItemReplacements); Base::ClearChangesMask(DuelArbiter); Base::ClearChangesMask(WowAccount); + Base::ClearChangesMask(BnetAccount); + Base::ClearChangesMask(GuildClubMemberID); Base::ClearChangesMask(LootTargetGUID); Base::ClearChangesMask(PlayerFlags); Base::ClearChangesMask(PlayerFlagsEx); @@ -2528,14 +2702,16 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(CurrentBattlePetBreedQuality); Base::ClearChangesMask(HonorLevel); Base::ClearChangesMask(LogoutTime); + Base::ClearChangesMask(Name); Base::ClearChangesMask(Field_B0); Base::ClearChangesMask(Field_B4); Base::ClearChangesMask(CurrentBattlePetSpeciesID); - Base::ClearChangesMask(field_138); Base::ClearChangesMask(CtrOptions); Base::ClearChangesMask(CovenantID); Base::ClearChangesMask(SoulbindID); Base::ClearChangesMask(DungeonScore); + Base::ClearChangesMask(DeclinedNames); + Base::ClearChangesMask(PersonalTabard); Base::ClearChangesMask(PartyType); Base::ClearChangesMask(QuestLog); Base::ClearChangesMask(VisibleItems); @@ -3648,14 +3824,28 @@ void PersonalCraftingOrderCount::WriteCreate(ByteBuffer& data, Player const* own void PersonalCraftingOrderCount::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const { - data << int32(ProfessionID); - data << uint32(Count); + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 2); + + data.FlushBits(); + if (changesMask[0]) + { + data << int32(ProfessionID); + } + if (changesMask[1]) + { + data << uint32(Count); + } } -bool PersonalCraftingOrderCount::operator==(PersonalCraftingOrderCount const& right) const +void PersonalCraftingOrderCount::ClearChangesMask() { - return ProfessionID == right.ProfessionID - && Count == right.Count; + Base::ClearChangesMask(ProfessionID); + Base::ClearChangesMask(Count); + _changesMask.ResetAll(); } void CategoryCooldownMod::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const @@ -3987,8 +4177,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << int32(OverrideSpellsID); data << uint16(LootSpecID); data << uint32(OverrideZonePVPType); - data << BnetAccount; - data << uint64(GuildClubMemberID); for (uint32 i = 0; i < 5; ++i) { data << uint32(BagSlotFlags[i]); @@ -5105,118 +5293,98 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[112]) { - data << BnetAccount; - } - if (changesMask[113]) - { - data << uint64(GuildClubMemberID); - } - if (changesMask[114]) - { data << int32(Honor); } - if (changesMask[115]) + if (changesMask[113]) { data << int32(HonorNextLevel); } - if (changesMask[116]) + if (changesMask[114]) { data << int32(PerksProgramCurrency); } - if (changesMask[117]) + if (changesMask[115]) { data << uint8(NumBankSlots); } - if (changesMask[122]) + if (changesMask[120]) { data << int32(UiChromieTimeExpansionID); } - if (changesMask[123]) + if (changesMask[121]) { data << int32(TransportServerTime); } - if (changesMask[124]) + if (changesMask[122]) { data << uint32(WeeklyRewardsPeriodSinceOrigin); } - if (changesMask[125]) + if (changesMask[123]) { data << int16(DEBUGSoulbindConduitRank); } - if (changesMask[127]) + if (changesMask[125]) { data << uint32(ActiveCombatTraitConfigID); } - if (changesMask[128]) + if (changesMask[126]) { data << int32(ItemUpgradeHighOnehandWeaponItemID); } - if (changesMask[129]) + if (changesMask[127]) { data << int32(ItemUpgradeHighFingerItemID); } - if (changesMask[130]) + if (changesMask[128]) { data << float(ItemUpgradeHighFingerWatermark); } - if (changesMask[131]) + if (changesMask[129]) { data << int32(ItemUpgradeHighTrinketItemID); } - if (changesMask[132]) + if (changesMask[130]) { data << float(ItemUpgradeHighTrinketWatermark); } - if (changesMask[133]) + if (changesMask[131]) { data << uint64(LootHistoryInstanceID); } - } - if (changesMask[134]) - { - if (changesMask[136]) + if (changesMask[133]) { data << uint8(RequiredMountCapabilityFlags); } - } - if (changesMask[102]) - { data.WriteBits(QuestSession.has_value(), 1); - } - if (changesMask[134]) - { data.WriteBits(PetStable.has_value(), 1); } data.FlushBits(); if (changesMask[102]) { - if (changesMask[118]) + if (changesMask[116]) { ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[120]) + if (changesMask[118]) { if (QuestSession.has_value()) { QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[119]) + if (changesMask[117]) { data << FrozenPerksVendorItem; } - if (changesMask[121]) + if (changesMask[119]) { Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[126]) + if (changesMask[124]) { data << DungeonScore; } - } - if (changesMask[134]) - { - if (changesMask[135]) + if (changesMask[132]) { if (PetStable.has_value()) { @@ -5224,151 +5392,151 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[137]) + if (changesMask[134]) { for (uint32 i = 0; i < 227; ++i) { - if (changesMask[138 + i]) + if (changesMask[135 + i]) { data << InvSlots[i]; } } } - if (changesMask[365]) + if (changesMask[362]) { for (uint32 i = 0; i < 240; ++i) { - if (changesMask[366 + i]) + if (changesMask[363 + i]) { data << uint64(ExploredZones[i]); } } } - if (changesMask[606]) + if (changesMask[603]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[607 + i]) + if (changesMask[604 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[609]) + if (changesMask[606]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[610 + i]) + if (changesMask[607 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[617 + i]) + if (changesMask[614 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[624 + i]) + if (changesMask[621 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[631 + i]) + if (changesMask[628 + i]) { data << float(ModHealingDonePercent[i]); } } } - if (changesMask[638]) + if (changesMask[635]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[639 + i]) + if (changesMask[636 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[642 + i]) + if (changesMask[639 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[645]) + if (changesMask[642]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[646 + i]) + if (changesMask[643 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[658 + i]) + if (changesMask[655 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[670]) + if (changesMask[667]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[671 + i]) + if (changesMask[668 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[703]) + if (changesMask[700]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[704 + i]) + if (changesMask[701 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[708]) + if (changesMask[705]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[709 + i]) + if (changesMask[706 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[711]) + if (changesMask[708]) { for (uint32 i = 0; i < 5; ++i) { - if (changesMask[712 + i]) + if (changesMask[709 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[717]) + if (changesMask[714]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[718 + i]) + if (changesMask[715 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[725]) + if (changesMask[722]) { for (uint32 i = 0; i < 875; ++i) { - if (changesMask[726 + i]) + if (changesMask[723 + i]) { data << uint64(QuestCompleted[i]); } } } - if (changesMask[1601]) + if (changesMask[1598]) { for (uint32 i = 0; i < 17; ++i) { - if (changesMask[1602 + i]) + if (changesMask[1599 + i]) { data << float(ItemUpgradeHighWatermark[i]); } @@ -5484,8 +5652,6 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(OverrideSpellsID); Base::ClearChangesMask(LootSpecID); Base::ClearChangesMask(OverrideZonePVPType); - Base::ClearChangesMask(BnetAccount); - Base::ClearChangesMask(GuildClubMemberID); Base::ClearChangesMask(Honor); Base::ClearChangesMask(HonorNextLevel); Base::ClearChangesMask(PerksProgramCurrency); @@ -6290,6 +6456,7 @@ void SceneObjectData::ClearChangesMask() void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const { data << int32(ConversationLineID); + data << int32(BroadcastTextID); data << uint32(ViewerDependentValue<StartTimeTag>::GetValue(this, owner, receiver)); data << int32(UiCameraID); data << uint8(ActorIndex); @@ -6300,6 +6467,7 @@ void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const { data << int32(ConversationLineID); + data << int32(BroadcastTextID); data << uint32(ViewerDependentValue<StartTimeTag>::GetValue(this, owner, receiver)); data << int32(UiCameraID); data << uint8(ActorIndex); @@ -6310,6 +6478,7 @@ void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Con bool ConversationLine::operator==(ConversationLine const& right) const { return ConversationLineID == right.ConversationLineID + && BroadcastTextID == right.BroadcastTextID && StartTime == right.StartTime && UiCameraID == right.UiCameraID && ActorIndex == right.ActorIndex diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 1b5fe5782ce..96eb02620b3 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -233,12 +233,13 @@ struct UnitChannel : public IsUpdateFieldStructureTag bool operator!=(UnitChannel const& right) const { return !(*this == right); } }; -struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<5> +struct VisibleItem : public IsUpdateFieldStructureTag, public HasChangesMask<6> { UpdateField<int32, 0, 1> ItemID; UpdateField<int32, 0, 2> SecondaryItemModifiedAppearanceID; - UpdateField<uint16, 0, 3> ItemAppearanceModID; - UpdateField<uint16, 0, 4> ItemVisual; + UpdateField<int32, 0, 3> ConditionalItemAppearanceID; + UpdateField<uint16, 0, 4> ItemAppearanceModID; + UpdateField<uint16, 0, 5> ItemVisual; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; @@ -462,49 +463,76 @@ struct CTROptions : public IsUpdateFieldStructureTag bool operator!=(CTROptions const& right) const { return !(*this == right); } }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<264> +struct DeclinedNames : public IsUpdateFieldStructureTag, public HasChangesMask<6> +{ + UpdateFieldArray<std::string, 5, 0, 1> Name; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct CustomTabardInfo : public IsUpdateFieldStructureTag, public HasChangesMask<6> +{ + UpdateField<int32, 0, 1> EmblemStyle; + UpdateField<int32, 0, 2> EmblemColor; + UpdateField<int32, 0, 3> BorderStyle; + UpdateField<int32, 0, 4> BorderColor; + UpdateField<int32, 0, 5> BackgroundColor; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<269> { UpdateField<bool, 0, 1> HasQuestSession; UpdateField<bool, 0, 2> HasLevelLink; DynamicUpdateField<UF::ChrCustomizationChoice, 0, 3> Customizations; - DynamicUpdateField<UF::QuestLog, 0, 4> QuestSessionQuestLog; - DynamicUpdateField<UF::ArenaCooldown, 0, 5> ArenaCooldowns; - DynamicUpdateField<int32, 0, 6> VisualItemReplacements; - UpdateField<ObjectGuid, 0, 7> DuelArbiter; - UpdateField<ObjectGuid, 0, 8> WowAccount; - UpdateField<ObjectGuid, 0, 9> LootTargetGUID; - UpdateField<uint32, 0, 10> PlayerFlags; - UpdateField<uint32, 0, 11> PlayerFlagsEx; - UpdateField<uint32, 0, 12> GuildRankID; - UpdateField<uint32, 0, 13> GuildDeleteDate; - UpdateField<int32, 0, 14> GuildLevel; - UpdateField<uint8, 0, 15> NativeSex; - UpdateField<uint8, 0, 16> Inebriation; - UpdateField<uint8, 0, 17> PvpTitle; - UpdateField<uint8, 0, 18> ArenaFaction; - UpdateField<uint32, 0, 19> DuelTeam; - UpdateField<int32, 0, 20> GuildTimeStamp; - UpdateField<int32, 0, 21> PlayerTitle; - UpdateField<int32, 0, 22> FakeInebriation; - UpdateField<uint32, 0, 23> VirtualPlayerRealm; - UpdateField<uint32, 0, 24> CurrentSpecID; - UpdateField<int32, 0, 25> TaxiMountAnimKitID; - UpdateField<uint8, 0, 26> CurrentBattlePetBreedQuality; - UpdateField<int32, 0, 27> HonorLevel; - UpdateField<int64, 0, 28> LogoutTime; - UpdateField<int32, 0, 29> Field_B0; - UpdateField<int32, 0, 30> Field_B4; - UpdateField<int32, 0, 31> CurrentBattlePetSpeciesID; - UpdateField<ObjectGuid, 32, 33> field_138; - UpdateField<UF::CTROptions, 32, 34> CtrOptions; - UpdateField<int32, 32, 35> CovenantID; - UpdateField<int32, 32, 36> SoulbindID; - UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 37> DungeonScore; - UpdateFieldArray<uint8, 2, 38, 39> PartyType; - UpdateFieldArray<UF::QuestLog, 175, 41, 42> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 217, 218> VisibleItems; - UpdateFieldArray<float, 6, 237, 238> AvgItemLevel; - UpdateFieldArray<uint32, 19, 244, 245> Field_3120; + DynamicUpdateField<UF::ChrCustomizationChoice, 0, 4> QaCustomizations; + DynamicUpdateField<UF::QuestLog, 0, 5> QuestSessionQuestLog; + DynamicUpdateField<UF::ArenaCooldown, 0, 6> ArenaCooldowns; + DynamicUpdateField<int32, 0, 7> VisualItemReplacements; + UpdateField<ObjectGuid, 0, 8> DuelArbiter; + UpdateField<ObjectGuid, 0, 9> WowAccount; + UpdateField<ObjectGuid, 0, 10> BnetAccount; + UpdateField<uint64, 0, 11> GuildClubMemberID; + UpdateField<ObjectGuid, 0, 12> LootTargetGUID; + UpdateField<uint32, 0, 13> PlayerFlags; + UpdateField<uint32, 0, 14> PlayerFlagsEx; + UpdateField<uint32, 0, 15> GuildRankID; + UpdateField<uint32, 0, 16> GuildDeleteDate; + UpdateField<int32, 0, 17> GuildLevel; + UpdateField<uint8, 0, 18> NativeSex; + UpdateField<uint8, 0, 19> Inebriation; + UpdateField<uint8, 0, 20> PvpTitle; + UpdateField<uint8, 0, 21> ArenaFaction; + UpdateField<uint32, 0, 22> DuelTeam; + UpdateField<int32, 0, 23> GuildTimeStamp; + UpdateField<int32, 0, 24> PlayerTitle; + UpdateField<int32, 0, 25> FakeInebriation; + UpdateField<uint32, 0, 26> VirtualPlayerRealm; + UpdateField<uint32, 0, 27> CurrentSpecID; + UpdateField<int32, 0, 28> TaxiMountAnimKitID; + UpdateField<uint8, 0, 29> CurrentBattlePetBreedQuality; + UpdateField<int32, 0, 30> HonorLevel; + UpdateField<int64, 0, 31> LogoutTime; + UpdateField<std::string, 32, 33> Name; + UpdateField<int32, 32, 34> Field_B0; + UpdateField<int32, 32, 35> Field_B4; + UpdateField<int32, 32, 36> CurrentBattlePetSpeciesID; + UpdateField<UF::CTROptions, 32, 37> CtrOptions; + UpdateField<int32, 32, 38> CovenantID; + UpdateField<int32, 32, 39> SoulbindID; + UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 40> DungeonScore; + OptionalUpdateField<UF::DeclinedNames, 32, 41> DeclinedNames; + UpdateField<UF::CustomTabardInfo, 32, 42> PersonalTabard; + UpdateFieldArray<uint8, 2, 43, 44> PartyType; + UpdateFieldArray<UF::QuestLog, 175, 46, 47> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 222, 223> VisibleItems; + UpdateFieldArray<float, 6, 242, 243> AvgItemLevel; + UpdateFieldArray<uint32, 19, 249, 250> 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; @@ -770,15 +798,14 @@ struct CraftingOrder : public IsUpdateFieldStructureTag, public HasChangesMask<4 void ClearChangesMask(); }; -struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag +struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag, public HasChangesMask<3> { - int32 ProfessionID; - uint32 Count; + UpdateField<int32, 0, 1> ProfessionID; + UpdateField<uint32, 0, 2> Count; 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==(PersonalCraftingOrderCount const& right) const; - bool operator!=(PersonalCraftingOrderCount const& right) const { return !(*this == right); } + void ClearChangesMask(); }; struct CategoryCooldownMod : public IsUpdateFieldStructureTag @@ -849,7 +876,7 @@ struct Research : public IsUpdateFieldStructureTag bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1619> +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1616> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BackpackSellJunkDisabled; @@ -956,48 +983,46 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField<int32, 102, 109> OverrideSpellsID; UpdateField<uint16, 102, 110> LootSpecID; UpdateField<uint32, 102, 111> OverrideZonePVPType; - UpdateField<ObjectGuid, 102, 112> BnetAccount; - UpdateField<uint64, 102, 113> GuildClubMemberID; - UpdateField<int32, 102, 114> Honor; - UpdateField<int32, 102, 115> HonorNextLevel; - UpdateField<int32, 102, 116> PerksProgramCurrency; - UpdateField<uint8, 102, 117> NumBankSlots; - UpdateField<UF::ResearchHistory, 102, 118> ResearchHistory; - UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 119> FrozenPerksVendorItem; - UpdateField<UF::ActivePlayerUnk901, 102, 121> Field_1410; - OptionalUpdateField<UF::QuestSession, 102, 120> QuestSession; - UpdateField<int32, 102, 122> UiChromieTimeExpansionID; - UpdateField<int32, 102, 123> TransportServerTime; - UpdateField<uint32, 102, 124> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField<int16, 102, 125> DEBUGSoulbindConduitRank; - UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 102, 126> DungeonScore; - UpdateField<uint32, 102, 127> ActiveCombatTraitConfigID; - UpdateField<int32, 102, 128> ItemUpgradeHighOnehandWeaponItemID; - UpdateField<int32, 102, 129> ItemUpgradeHighFingerItemID; - UpdateField<float, 102, 130> ItemUpgradeHighFingerWatermark; - UpdateField<int32, 102, 131> ItemUpgradeHighTrinketItemID; - UpdateField<float, 102, 132> ItemUpgradeHighTrinketWatermark; - UpdateField<uint64, 102, 133> LootHistoryInstanceID; - OptionalUpdateField<UF::StableInfo, 134, 135> PetStable; - UpdateField<uint8, 134, 136> RequiredMountCapabilityFlags; - UpdateFieldArray<ObjectGuid, 227, 137, 138> InvSlots; - UpdateFieldArray<uint64, 240, 365, 366> ExploredZones; - UpdateFieldArray<UF::RestInfo, 2, 606, 607> RestInfo; - UpdateFieldArray<int32, 7, 609, 610> ModDamageDonePos; - UpdateFieldArray<int32, 7, 609, 617> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 609, 624> ModDamageDonePercent; - UpdateFieldArray<float, 7, 609, 631> ModHealingDonePercent; - UpdateFieldArray<float, 3, 638, 639> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 638, 642> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 645, 646> BuybackPrice; - UpdateFieldArray<int64, 12, 645, 658> BuybackTimestamp; - UpdateFieldArray<int32, 32, 670, 671> CombatRatings; - UpdateFieldArray<uint32, 4, 703, 704> NoReagentCostMask; - UpdateFieldArray<int32, 2, 708, 709> ProfessionSkillLine; - UpdateFieldArray<uint32, 5, 711, 712> BagSlotFlags; - UpdateFieldArray<uint32, 7, 717, 718> BankBagSlotFlags; - UpdateFieldArray<uint64, 875, 725, 726> QuestCompleted; - UpdateFieldArray<float, 17, 1601, 1602> ItemUpgradeHighWatermark; + UpdateField<int32, 102, 112> Honor; + UpdateField<int32, 102, 113> HonorNextLevel; + UpdateField<int32, 102, 114> PerksProgramCurrency; + UpdateField<uint8, 102, 115> NumBankSlots; + UpdateField<UF::ResearchHistory, 102, 116> ResearchHistory; + UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 117> FrozenPerksVendorItem; + UpdateField<UF::ActivePlayerUnk901, 102, 119> Field_1410; + OptionalUpdateField<UF::QuestSession, 102, 118> QuestSession; + UpdateField<int32, 102, 120> UiChromieTimeExpansionID; + UpdateField<int32, 102, 121> TransportServerTime; + UpdateField<uint32, 102, 122> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin + UpdateField<int16, 102, 123> DEBUGSoulbindConduitRank; + UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 102, 124> DungeonScore; + UpdateField<uint32, 102, 125> ActiveCombatTraitConfigID; + UpdateField<int32, 102, 126> ItemUpgradeHighOnehandWeaponItemID; + UpdateField<int32, 102, 127> ItemUpgradeHighFingerItemID; + UpdateField<float, 102, 128> ItemUpgradeHighFingerWatermark; + UpdateField<int32, 102, 129> ItemUpgradeHighTrinketItemID; + UpdateField<float, 102, 130> ItemUpgradeHighTrinketWatermark; + UpdateField<uint64, 102, 131> LootHistoryInstanceID; + OptionalUpdateField<UF::StableInfo, 102, 132> PetStable; + UpdateField<uint8, 102, 133> RequiredMountCapabilityFlags; + UpdateFieldArray<ObjectGuid, 227, 134, 135> InvSlots; + UpdateFieldArray<uint64, 240, 362, 363> ExploredZones; + UpdateFieldArray<UF::RestInfo, 2, 603, 604> RestInfo; + UpdateFieldArray<int32, 7, 606, 607> ModDamageDonePos; + UpdateFieldArray<int32, 7, 606, 614> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 606, 621> ModDamageDonePercent; + UpdateFieldArray<float, 7, 606, 628> ModHealingDonePercent; + UpdateFieldArray<float, 3, 635, 636> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 635, 639> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 642, 643> BuybackPrice; + UpdateFieldArray<int64, 12, 642, 655> BuybackTimestamp; + UpdateFieldArray<int32, 32, 667, 668> CombatRatings; + UpdateFieldArray<uint32, 4, 700, 701> NoReagentCostMask; + UpdateFieldArray<int32, 2, 705, 706> ProfessionSkillLine; + UpdateFieldArray<uint32, 5, 708, 709> BagSlotFlags; + UpdateFieldArray<uint32, 7, 714, 715> BankBagSlotFlags; + UpdateFieldArray<uint64, 875, 722, 723> QuestCompleted; + UpdateFieldArray<float, 17, 1598, 1599> 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; @@ -1151,6 +1176,7 @@ struct SceneObjectData : public IsUpdateFieldStructureTag, public HasChangesMask struct ConversationLine : public IsUpdateFieldStructureTag { int32 ConversationLineID; + int32 BroadcastTextID; uint32 StartTime; struct StartTimeTag : ViewerDependentValueTag<uint32> {}; int32 UiCameraID; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index aa8c5596d8c..e587dd7e389 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2411,6 +2411,8 @@ void Player::GiveLevel(uint8 level) StartCriteria(CriteriaStartEvent::ReachLevel, level); UpdateCriteria(CriteriaType::ReachLevel); UpdateCriteria(CriteriaType::ActivelyReachLevel, level); + if (level > oldLevel) + UpdateCriteria(CriteriaType::GainLevels, level - oldLevel); PushQuests(); @@ -14079,11 +14081,12 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQues case GossipOptionNpc::Binder: case GossipOptionNpc::Banker: case GossipOptionNpc::PetitionVendor: - case GossipOptionNpc::TabardVendor: + case GossipOptionNpc::GuildTabardVendor: case GossipOptionNpc::Auctioneer: case GossipOptionNpc::Mailbox: case GossipOptionNpc::Transmogrify: case GossipOptionNpc::AzeriteRespec: + case GossipOptionNpc::PersonalTabardVendor: break; // No checks case GossipOptionNpc::CemeterySelect: canTalk = false; // Deprecated @@ -14302,7 +14305,7 @@ void Player::OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 me { PlayerInteractionType::None, PlayerInteractionType::Vendor, PlayerInteractionType::TaxiNode, PlayerInteractionType::Trainer, PlayerInteractionType::SpiritHealer, PlayerInteractionType::Binder, - PlayerInteractionType::Banker, PlayerInteractionType::PetitionVendor, PlayerInteractionType::TabardVendor, + PlayerInteractionType::Banker, PlayerInteractionType::PetitionVendor, PlayerInteractionType::GuildTabardVendor, PlayerInteractionType::BattleMaster, PlayerInteractionType::Auctioneer, PlayerInteractionType::TalentMaster, PlayerInteractionType::StableMaster, PlayerInteractionType::None, PlayerInteractionType::GuildBanker, PlayerInteractionType::None, PlayerInteractionType::None, PlayerInteractionType::None, @@ -14317,7 +14320,8 @@ void Player::OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 me PlayerInteractionType::LegendaryCrafting, PlayerInteractionType::NewPlayerGuide, PlayerInteractionType::LegendaryCrafting, PlayerInteractionType::Renown, PlayerInteractionType::BlackMarketAuctioneer, PlayerInteractionType::PerksProgramVendor, PlayerInteractionType::ProfessionsCraftingOrder, PlayerInteractionType::Professions, PlayerInteractionType::ProfessionsCustomerOrder, - PlayerInteractionType::TraitSystem, PlayerInteractionType::BarbersChoice, PlayerInteractionType::MajorFactionRenown + PlayerInteractionType::TraitSystem, PlayerInteractionType::BarbersChoice, PlayerInteractionType::MajorFactionRenown, + PlayerInteractionType::PersonalTabardVendor }; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[AsUnderlyingType(gossipOptionNpc)]; @@ -17218,9 +17222,9 @@ void Player::_LoadDeclinedNames(PreparedQueryResult result) if (!result) return; - m_declinedname = std::make_unique<DeclinedName>(); + auto declinedNames = m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::DeclinedNames, 0); for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - m_declinedname->name[i] = (*result)[i].GetString(); + SetUpdateFieldValue(declinedNames.ModifyValue(&UF::DeclinedNames::Name, i), (*result)[i].GetString()); } void Player::_LoadArenaTeamInfo(PreparedQueryResult result) @@ -17435,7 +17439,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol // "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, " // "health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, " - // "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + // "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs, " + // "personalTabardEmblemStyle, personalTabardEmblemColor, personalTabardBorderStyle, personalTabardBorderColor, personalTabardBackgroundColor " // "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC); ObjectGuid::LowType guid; @@ -17504,8 +17509,13 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol PlayerRestState honorRestState; float honorRestBonus; uint8 numRespecs; + int32 personalTabardEmblemStyle; + int32 personalTabardEmblemColor; + int32 personalTabardBorderStyle; + int32 personalTabardBorderColor; + int32 personalTabardBackgroundColor; - PlayerLoadData(Field* fields) + explicit PlayerLoadData(Field const* fields) { std::size_t i = 0; guid = fields[i++].GetUInt64(); @@ -17575,6 +17585,11 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol honorRestState = PlayerRestState(fields[i++].GetUInt8()); honorRestBonus = fields[i++].GetFloat(); numRespecs = fields[i++].GetUInt8(); + personalTabardEmblemStyle = fields[i++].GetInt32(); + personalTabardEmblemColor = fields[i++].GetInt32(); + personalTabardBorderStyle = fields[i++].GetInt32(); + personalTabardBorderColor = fields[i++].GetInt32(); + personalTabardBackgroundColor = fields[i++].GetInt32(); } } fields(result->Fetch()); @@ -17608,8 +17623,10 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol return false; } + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Name), m_name); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::WowAccount), GetSession()->GetAccountGUID()); - SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BnetAccount), GetSession()->GetBattlenetAccountGUID()); + SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::BnetAccount), GetSession()->GetBattlenetAccountGUID()); if (!IsValidGender(fields.gender)) { @@ -18186,6 +18203,9 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol } } + SetPersonalTabard(fields.personalTabardEmblemStyle, fields.personalTabardEmblemColor, fields.personalTabardBorderStyle, + fields.personalTabardBorderColor, fields.personalTabardBackgroundColor); + TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: The value of player '{}' after load item and aura is: ", m_name); outDebugValues(); @@ -22244,6 +22264,16 @@ void Player::RemovePetitionsAndSigns(ObjectGuid guid) sPetitionMgr->RemovePetitionsByOwner(guid); } +void Player::SetPersonalTabard(uint32 style, uint32 color, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor) +{ + auto personalTabard = m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::PersonalTabard); + SetUpdateFieldValue(personalTabard.ModifyValue(&UF::CustomTabardInfo::EmblemStyle), style); + SetUpdateFieldValue(personalTabard.ModifyValue(&UF::CustomTabardInfo::EmblemColor), color); + SetUpdateFieldValue(personalTabard.ModifyValue(&UF::CustomTabardInfo::BorderStyle), borderStyle); + SetUpdateFieldValue(personalTabard.ModifyValue(&UF::CustomTabardInfo::BorderColor), borderColor); + SetUpdateFieldValue(personalTabard.ModifyValue(&UF::CustomTabardInfo::BackgroundColor), backgroundColor); +} + void Player::LeaveAllArenaTeams(ObjectGuid guid) { CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 6709fa70617..9f80a9af8c7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -117,6 +117,7 @@ namespace WorldPackets namespace Character { struct CharacterCreateInfo; + struct CustomTabardInfo; } namespace Movement @@ -1984,6 +1985,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> Guild const* GetGuild() const; ObjectGuid::LowType GetGuildIdInvited() const { return m_GuildIdInvited; } static void RemovePetitionsAndSigns(ObjectGuid guid); + void SetPersonalTabard(uint32 style, uint32 color, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor); // Arena Team void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type); @@ -2625,7 +2627,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> bool isAllowedToLoot(Creature const* creature) const; - DeclinedName const* GetDeclinedNames() const { return m_declinedname.get(); } + UF::DeclinedNames const* GetDeclinedNames() const { return m_playerData->DeclinedNames.has_value() ? &*m_playerData->DeclinedNames : nullptr; } uint8 GetRunesState() const; uint32 GetRuneCooldown(uint8 index) const { return m_runes->Cooldown[index]; } uint32 GetRuneBaseCooldown() const; @@ -3110,7 +3112,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> WorldLocation m_recall_location; uint32 m_recall_instanceId; - std::unique_ptr<DeclinedName> m_declinedname; std::unique_ptr<Runes> m_runes; EquipmentSetContainer _equipmentSets; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9c0a9c42bfa..d16798ec6a5 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12072,27 +12072,11 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form, uint32 spellId) const } } - uint32 modelid = 0; SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form); - if (formEntry && formEntry->CreatureDisplayID[0]) - { - // Take the alliance modelid as default - if (GetTypeId() != TYPEID_PLAYER) - return formEntry->CreatureDisplayID[0]; - else - { - if (Player::TeamForRace(GetRace()) == ALLIANCE) - modelid = formEntry->CreatureDisplayID[0]; - else - modelid = formEntry->CreatureDisplayID[1]; + if (formEntry && formEntry->CreatureDisplayID) + return formEntry->CreatureDisplayID; - // If the player is horde but there are no values for the horde modelid - take the alliance modelid - if (!modelid && Player::TeamForRace(GetRace()) == HORDE) - modelid = formEntry->CreatureDisplayID[0]; - } - } - - return modelid; + return 0; } void Unit::JumpTo(float speedXY, float speedZ, float angle, Optional<Position> dest) @@ -13821,3 +13805,9 @@ std::string Unit::GetDebugInfo() const return sstr.str(); } + +DeclinedName::DeclinedName(UF::DeclinedNames const& uf) +{ + for (std::size_t i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + name[i] = uf.Name[i]; +} diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h index a1f727f14ce..92d23e7a8a9 100644 --- a/src/server/game/Entities/Unit/UnitDefines.h +++ b/src/server/game/Entities/Unit/UnitDefines.h @@ -22,6 +22,11 @@ #include "EnumFlag.h" #include <string> +namespace UF +{ +struct DeclinedNames; +} + #define MIN_MELEE_REACH 2.0f #define NOMINAL_MELEE_RANGE 5.0f #define MELEE_RANGE (NOMINAL_MELEE_RANGE - MIN_MELEE_REACH * 2) //center to center for players @@ -342,6 +347,7 @@ enum NPCFlags2 : uint32 UNIT_NPC_FLAG_2_AZERITE_RESPEC = 0x00004000, // TITLE is azerite respec UNIT_NPC_FLAG_2_ISLANDS_QUEUE = 0x00008000, // TITLE is islands queue UNIT_NPC_FLAG_2_SUPPRESS_NPC_SOUNDS_EXCEPT_END_OF_INTERACTION = 0x00010000, + UNIT_NPC_FLAG_2_PERSONAL_TABARD_DESIGNER= 0x00200000, // TITLE is personal tabard designer }; DEFINE_ENUM_FLAG(NPCFlags2); @@ -469,8 +475,11 @@ enum HitInfo #define MAX_DECLINED_NAME_CASES 5 -struct DeclinedName +struct TC_GAME_API DeclinedName { + DeclinedName() = default; + DeclinedName(UF::DeclinedNames const& uf); + std::string name[MAX_DECLINED_NAME_CASES]; }; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 227fee420bf..fd94688423e 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -738,12 +738,11 @@ void EmblemInfo::ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet) m_backgroundColor = packet.Bg; } -bool EmblemInfo::ValidateEmblemColors() const +bool EmblemInfo::ValidateEmblemColors(uint32 /*style*/, uint32 color, uint32 /*borderStyle*/, uint32 borderColor, uint32 backgroundColor) { - return sGuildColorBackgroundStore.LookupEntry(m_backgroundColor) && - sGuildColorBorderStore.LookupEntry(m_borderColor) && - sGuildColorEmblemStore.LookupEntry(m_color); - + return sGuildColorBackgroundStore.LookupEntry(backgroundColor) && + sGuildColorBorderStore.LookupEntry(borderColor) && + sGuildColorEmblemStore.LookupEntry(color); } bool EmblemInfo::LoadFromDB(Field* fields) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index eb33be36bcb..bdbd05503c4 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -256,7 +256,11 @@ class TC_GAME_API EmblemInfo bool LoadFromDB(Field* fields); void SaveToDB(ObjectGuid::LowType guildId) const; void ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet); - bool ValidateEmblemColors() const; + bool ValidateEmblemColors() const + { + return ValidateEmblemColors(m_style, m_color, m_borderStyle, m_borderColor, m_backgroundColor); + } + static bool ValidateEmblemColors(uint32 style, uint32 color, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor); uint32 GetStyle() const { return m_style; } uint32 GetColor() const { return m_color; } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 87ce5123100..e03cd9c51b1 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -636,14 +636,17 @@ void WorldSession::HandleRequestRatedPvpInfo(WorldPackets::Battleground::Request void WorldSession::HandleGetPVPOptionsEnabled(WorldPackets::Battleground::GetPVPOptionsEnabled& /*getPvPOptionsEnabled*/) { - // This packet is completely irrelevant, it triggers PVP_TYPES_ENABLED lua event but that is not handled in interface code as of 6.1.2 WorldPackets::Battleground::PVPOptionsEnabled pvpOptionsEnabled; + pvpOptionsEnabled.RatedBattlegrounds = false; + pvpOptionsEnabled.PugBattlegrounds = true; + pvpOptionsEnabled.WargameBattlegrounds = false; pvpOptionsEnabled.WargameArenas = false; pvpOptionsEnabled.RatedArenas = false; - pvpOptionsEnabled.WargameBattlegrounds = false; pvpOptionsEnabled.ArenaSkirmish = false; - pvpOptionsEnabled.PugBattlegrounds = true; - pvpOptionsEnabled.RatedBattlegrounds = false; + pvpOptionsEnabled.SoloShuffle = false; + pvpOptionsEnabled.RatedSoloShuffle = false; + pvpOptionsEnabled.BattlegroundBlitz = false; + pvpOptionsEnabled.RatedBattlegroundBlitz = false; SendPacket(pvpOptionsEnabled.Write()); } diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 346cc303315..209babfec10 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -61,9 +61,9 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet packet.ServerTime = currTime; CalendarInviteStore playerInvites = sCalendarMgr->GetPlayerInvites(guid); - for (auto const& invite : playerInvites) + for (CalendarInvite const* invite : playerInvites) { - WorldPackets::Calendar::CalendarSendCalendarInviteInfo inviteInfo; + WorldPackets::Calendar::CalendarSendCalendarInviteInfo& inviteInfo = packet.Invites.emplace_back(); inviteInfo.EventID = invite->GetEventId(); inviteInfo.InviteID = invite->GetInviteId(); inviteInfo.InviterGuid = invite->GetSenderGUID(); @@ -71,14 +71,12 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet inviteInfo.Moderator = invite->GetRank(); if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(invite->GetEventId())) inviteInfo.InviteType = calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() == _player->GetGuildId(); - - packet.Invites.push_back(inviteInfo); } CalendarEventStore playerEvents = sCalendarMgr->GetPlayerEvents(guid); - for (auto const& event : playerEvents) + for (CalendarEvent const* event : playerEvents) { - WorldPackets::Calendar::CalendarSendCalendarEventInfo eventInfo; + WorldPackets::Calendar::CalendarSendCalendarEventInfo& eventInfo = packet.Events.emplace_back(); eventInfo.EventID = event->GetEventId(); eventInfo.Date = event->GetDate(); eventInfo.EventClubID = event->GetGuildId(); @@ -87,20 +85,15 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet eventInfo.Flags = event->GetFlags(); eventInfo.OwnerGuid = event->GetOwnerGUID(); eventInfo.TextureID = event->GetTextureId(); - - packet.Events.push_back(eventInfo); } for (InstanceLock const* lock : sInstanceLockMgr.GetInstanceLocksForPlayer(_player->GetGUID())) { - WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo lockoutInfo; - + WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo& lockoutInfo = packet.RaidLockouts.emplace_back(); lockoutInfo.MapID = lock->GetMapId(); lockoutInfo.DifficultyID = lock->GetDifficultyId(); lockoutInfo.ExpireTime = int32(std::max(std::chrono::duration_cast<Seconds>(lock->GetEffectiveExpiryTime() - GameTime::GetSystemTime()).count(), SI64LIT(0))); lockoutInfo.InstanceID = lock->GetInstanceId(); - - packet.RaidLockouts.push_back(lockoutInfo); } SendPacket(packet.Write()); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1472ce1fea0..d499ba13c11 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -403,10 +403,7 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder const& holder) do { Field* fields = customizationsResult->Fetch(); - std::vector<UF::ChrCustomizationChoice>& customizationsForCharacter = customizations[fields[0].GetUInt64()]; - - customizationsForCharacter.emplace_back(); - UF::ChrCustomizationChoice& choice = customizationsForCharacter.back(); + UF::ChrCustomizationChoice& choice = customizations[fields[0].GetUInt64()].emplace_back(); choice.ChrCustomizationOptionID = fields[1].GetUInt32(); choice.ChrCustomizationChoiceID = fields[2].GetUInt32(); @@ -457,8 +454,6 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder const& holder) while (result->NextRow() && charEnum.Characters.size() < MAX_CHARACTERS_PER_REALM); } - charEnum.IsAlliedRacesCreationAllowed = CanAccessAlliedRaces(); - for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements()) { WorldPackets::Character::EnumCharactersResult::RaceUnlock raceUnlock; @@ -1166,9 +1161,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder) // Send MOTD { - WorldPackets::System::MOTD motd; - motd.Text = &sWorld->GetMotd(); - SendPacket(motd.Write()); + for (std::string const& motdLine : sWorld->GetMotd()) + sWorld->SendServerMessage(SERVER_MSG_STRING, motdLine, pCurrChar); } SendSetTimeZoneInformation(); @@ -2797,6 +2791,29 @@ void WorldSession::HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCha })); } +void WorldSession::HandleSavePersonalEmblem(WorldPackets::Character::SavePersonalEmblem const& savePersonalEmblem) +{ + if (!_player->GetNPCIfCanInteractWith(savePersonalEmblem.Vendor, UNIT_NPC_FLAG_NONE, UNIT_NPC_FLAG_2_PERSONAL_TABARD_DESIGNER)) + { + SendPacket(WorldPackets::Character::PlayerSavePersonalEmblem(ERR_GUILDEMBLEM_INVALIDVENDOR).Write()); + return; + } + + if (!EmblemInfo::ValidateEmblemColors(savePersonalEmblem.PersonalTabard.EmblemStyle, savePersonalEmblem.PersonalTabard.EmblemColor, + savePersonalEmblem.PersonalTabard.BorderStyle, savePersonalEmblem.PersonalTabard.BorderColor, + savePersonalEmblem.PersonalTabard.BackgroundColor)) + { + SendPacket(WorldPackets::Character::PlayerSavePersonalEmblem(ERR_GUILDEMBLEM_INVALID_TABARD_COLORS).Write()); + return; + } + + _player->SetPersonalTabard(savePersonalEmblem.PersonalTabard.EmblemStyle, savePersonalEmblem.PersonalTabard.EmblemColor, + savePersonalEmblem.PersonalTabard.BorderStyle, savePersonalEmblem.PersonalTabard.BorderColor, + savePersonalEmblem.PersonalTabard.BackgroundColor); + + SendPacket(WorldPackets::Character::PlayerSavePersonalEmblem(ERR_GUILDEMBLEM_SUCCESS).Write()); +} + void WorldSession::SendCharCreate(ResponseCodes result, ObjectGuid const& guid /*= ObjectGuid::Empty*/) { WorldPackets::Character::CreateChar response; diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 0e23cc32c53..b8a0b8aa7ac 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -39,27 +39,48 @@ #include "Trainer.h" #include "WorldPacket.h" -void WorldSession::HandleTabardVendorActivateOpcode(WorldPackets::NPC::Hello& packet) +enum class TabardVendorType : int32 { - Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_TABARDDESIGNER, UNIT_NPC_FLAG_2_NONE); + Guild = 0, + Personal = 1, +}; + +void WorldSession::HandleTabardVendorActivateOpcode(WorldPackets::NPC::TabardVendorActivate const& tabardVendorActivate) +{ + Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(tabardVendorActivate.Vendor, UNIT_NPC_FLAG_TABARDDESIGNER, UNIT_NPC_FLAG_2_NONE); if (!unit) { - TC_LOG_DEBUG("network", "WORLD: HandleTabardVendorActivateOpcode - {} not found or you can not interact with him.", packet.Unit.ToString()); + TC_LOG_DEBUG("network", "WORLD: HandleTabardVendorActivateOpcode - {} not found or you can not interact with him.", tabardVendorActivate.Vendor.ToString()); return; } + TabardVendorType type = TabardVendorType(tabardVendorActivate.Type); + if (type != TabardVendorType::Guild && type != TabardVendorType::Personal) + return; + // remove fake death if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); - SendTabardVendorActivate(packet.Unit); + SendTabardVendorActivate(tabardVendorActivate.Vendor, TabardVendorType(tabardVendorActivate.Type)); } -void WorldSession::SendTabardVendorActivate(ObjectGuid guid) +void WorldSession::SendTabardVendorActivate(ObjectGuid guid, TabardVendorType type) { WorldPackets::NPC::NPCInteractionOpenResult npcInteraction; npcInteraction.Npc = guid; - npcInteraction.InteractionType = PlayerInteractionType::TabardVendor; + npcInteraction.InteractionType = [&] + { + switch (type) + { + case TabardVendorType::Guild: + return PlayerInteractionType::GuildTabardVendor; + case TabardVendorType::Personal: + return PlayerInteractionType::PersonalTabardVendor; + default: + ABORT_MSG("Unsupported tabard vendor type %d", AsUnderlyingType(type)); + } + }(); npcInteraction.Success = true; SendPacket(npcInteraction.Write()); } diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 2235fc1c6f9..3239de145ec 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -47,7 +47,7 @@ class Player; class Unit; struct DungeonEncounterEntry; struct InstanceSpawnGroupInfo; -enum class CriteriaType : uint8; +enum class CriteriaType : int16; enum class CriteriaStartEvent : uint8; enum Difficulty : uint8; diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index dd891e78e2e..71dd99198c4 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -7757,293 +7757,295 @@ enum class GameError : uint32 ERR_ARENA_TEAM_PARTY_SIZE = 836, ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 837, ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 838, - ERR_SOLO_SHUFFLE_MIN_ITEM_LEVEL = 839, + ERR_SOLO_MIN_ITEM_LEVEL = 839, ERR_PVP_PLAYER_ABANDONED = 840, - ERR_QUEST_FORCE_REMOVED_S = 841, - ERR_ATTACK_NO_ACTIONS = 842, - ERR_IN_RANDOM_BG = 843, - ERR_IN_NON_RANDOM_BG = 844, - ERR_BN_FRIEND_SELF = 845, - ERR_BN_FRIEND_ALREADY = 846, - ERR_BN_FRIEND_BLOCKED = 847, - ERR_BN_FRIEND_LIST_FULL = 848, - ERR_BN_FRIEND_REQUEST_SENT = 849, - ERR_BN_BROADCAST_THROTTLE = 850, - ERR_BG_DEVELOPER_ONLY = 851, - ERR_CURRENCY_SPELL_SLOT_MISMATCH = 852, - ERR_CURRENCY_NOT_TRADABLE = 853, - ERR_REQUIRES_EXPANSION_S = 854, - ERR_QUEST_FAILED_SPELL = 855, - ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 856, - ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 857, - ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 858, - ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 859, - ERR_TALENT_FAILED_UNKNOWN = 860, - ERR_TALENT_FAILED_IN_COMBAT = 861, - ERR_TALENT_FAILED_IN_PVP_MATCH = 862, - ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 863, - ERR_WARGAME_REQUEST_FAILURE = 864, - ERR_RANK_REQUIRES_AUTHENTICATOR = 865, - ERR_GUILD_BANK_VOUCHER_FAILED = 866, - ERR_WARGAME_REQUEST_SENT = 867, - ERR_REQUIRES_ACHIEVEMENT_I = 868, - ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 869, - ERR_CANT_BUY_QUANTITY = 870, - ERR_ITEM_IS_BATTLE_PAY_LOCKED = 871, - ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 872, - ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 873, - ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 874, - ERR_INSUFF_TRACKED_CURRENCY_IS = 875, - ERR_NOT_ON_TOURNAMENT_REALM = 876, - ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 877, - ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 878, - ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 879, - ERR_CANT_DO_THAT_IN_A_GROUP = 880, - ERR_GUILD_LEADER_REPLACED = 881, - ERR_TRANSMOGRIFY_CANT_EQUIP = 882, - ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 883, - ERR_TRANSMOGRIFY_NOT_SOULBOUND = 884, - ERR_TRANSMOGRIFY_INVALID_SOURCE = 885, - ERR_TRANSMOGRIFY_INVALID_DESTINATION = 886, - ERR_TRANSMOGRIFY_MISMATCH = 887, - ERR_TRANSMOGRIFY_LEGENDARY = 888, - ERR_TRANSMOGRIFY_SAME_ITEM = 889, - ERR_TRANSMOGRIFY_SAME_APPEARANCE = 890, - ERR_TRANSMOGRIFY_NOT_EQUIPPED = 891, - ERR_VOID_DEPOSIT_FULL = 892, - ERR_VOID_WITHDRAW_FULL = 893, - ERR_VOID_STORAGE_WRAPPED = 894, - ERR_VOID_STORAGE_STACKABLE = 895, - ERR_VOID_STORAGE_UNBOUND = 896, - ERR_VOID_STORAGE_REPAIR = 897, - ERR_VOID_STORAGE_CHARGES = 898, - ERR_VOID_STORAGE_QUEST = 899, - ERR_VOID_STORAGE_CONJURED = 900, - ERR_VOID_STORAGE_MAIL = 901, - ERR_VOID_STORAGE_BAG = 902, - ERR_VOID_TRANSFER_STORAGE_FULL = 903, - ERR_VOID_TRANSFER_INV_FULL = 904, - ERR_VOID_TRANSFER_INTERNAL_ERROR = 905, - ERR_VOID_TRANSFER_ITEM_INVALID = 906, - ERR_DIFFICULTY_DISABLED_IN_LFG = 907, - ERR_VOID_STORAGE_UNIQUE = 908, - ERR_VOID_STORAGE_LOOT = 909, - ERR_VOID_STORAGE_HOLIDAY = 910, - ERR_VOID_STORAGE_DURATION = 911, - ERR_VOID_STORAGE_LOAD_FAILED = 912, - ERR_VOID_STORAGE_INVALID_ITEM = 913, - ERR_PARENTAL_CONTROLS_CHAT_MUTED = 914, - ERR_SOR_START_EXPERIENCE_INCOMPLETE = 915, - ERR_SOR_INVALID_EMAIL = 916, - ERR_SOR_INVALID_COMMENT = 917, - ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 918, - ERR_CHALLENGE_MODE_RESET_KEYSTONE = 919, - ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 920, - ERR_REPORT_SUBMITTED_SUCCESSFULLY = 921, - ERR_REPORT_SUBMISSION_FAILED = 922, - ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 923, - ERR_BUG_SUBMITTED_SUCCESSFULLY = 924, - ERR_CHALLENGE_MODE_ENABLED = 925, - ERR_CHALLENGE_MODE_DISABLED = 926, - ERR_PETBATTLE_CREATE_FAILED = 927, - ERR_PETBATTLE_NOT_HERE = 928, - ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 929, - ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 930, - ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 931, - ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 932, - ERR_PETBATTLE_NOT_WHILE_DEAD = 933, - ERR_PETBATTLE_NOT_WHILE_FLYING = 934, - ERR_PETBATTLE_TARGET_INVALID = 935, - ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 936, - ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 937, - ERR_PETBATTLE_NOT_A_TRAINER = 938, - ERR_PETBATTLE_DECLINED = 939, - ERR_PETBATTLE_IN_BATTLE = 940, - ERR_PETBATTLE_INVALID_LOADOUT = 941, - ERR_PETBATTLE_ALL_PETS_DEAD = 942, - ERR_PETBATTLE_NO_PETS_IN_SLOTS = 943, - ERR_PETBATTLE_NO_ACCOUNT_LOCK = 944, - ERR_PETBATTLE_WILD_PET_TAPPED = 945, - ERR_PETBATTLE_RESTRICTED_ACCOUNT = 946, - ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 947, - ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 948, - ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 949, - ERR_CANT_HAVE_MORE_PETS = 950, - ERR_PVP_MAP_NOT_FOUND = 951, - ERR_PVP_MAP_NOT_SET = 952, - ERR_PETBATTLE_QUEUE_QUEUED = 953, - ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 954, - ERR_PETBATTLE_QUEUE_JOIN_FAILED = 955, - ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 956, - ERR_PETBATTLE_QUEUE_REMOVED = 957, - ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 958, - ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 959, - ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 960, - ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 961, - ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 962, - ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 963, - ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 964, - ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 965, - ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 966, - ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 967, - ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 968, - ERR_PETBATTLE_QUEUE_SLOT_DEAD = 969, - ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 970, - ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 971, - ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 972, - ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 973, - ERR_HAS_RESTRICTION = 974, - ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 975, - ERR_ITEM_UPGRADE_NO_PATH = 976, - ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 977, - ERR_BONUS_ROLL_EMPTY = 978, - ERR_CHALLENGE_MODE_FULL = 979, - ERR_CHALLENGE_MODE_IN_PROGRESS = 980, - ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 981, - ERR_BATTLETAG_FRIEND_NOT_FOUND = 982, - ERR_BATTLETAG_FRIEND_NOT_VALID = 983, - ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 984, - ERR_BATTLETAG_FRIEND_THROTTLED = 985, - ERR_BATTLETAG_FRIEND_SUCCESS = 986, - ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 987, - ERR_PETBATTLE_INTERNAL = 988, - ERR_CANT_CAGE_PET_YET = 989, - ERR_NO_LOOT_IN_CHALLENGE_MODE = 990, - ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 991, - ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 992, - ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 993, - ERR_RECRUIT_A_FRIEND_FAILED = 994, - ERR_SET_LOOT_PERSONAL = 995, - ERR_SET_LOOT_METHOD_FAILED_COMBAT = 996, - ERR_REAGENT_BANK_FULL = 997, - ERR_REAGENT_BANK_LOCKED = 998, - ERR_GARRISON_BUILDING_EXISTS = 999, - ERR_GARRISON_INVALID_PLOT = 1000, - ERR_GARRISON_INVALID_BUILDINGID = 1001, - ERR_GARRISON_INVALID_PLOT_BUILDING = 1002, - ERR_GARRISON_REQUIRES_BLUEPRINT = 1003, - ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1004, - ERR_GARRISON_NOT_ENOUGH_GOLD = 1005, - ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1006, - ERR_ALREADY_USING_LFG_LIST = 1007, - ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1008, - ERR_TOY_USE_LIMIT_REACHED = 1009, - ERR_TOY_ALREADY_KNOWN = 1010, - ERR_TRANSMOG_SET_ALREADY_KNOWN = 1011, - ERR_NOT_ENOUGH_CURRENCY = 1012, - ERR_SPEC_IS_DISABLED = 1013, - ERR_FEATURE_RESTRICTED_TRIAL = 1014, - ERR_CANT_BE_OBLITERATED = 1015, - ERR_CANT_BE_SCRAPPED = 1016, - ERR_CANT_BE_RECRAFTED = 1017, - ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1018, - ERR_MUST_EQUIP_ARTIFACT = 1019, - ERR_CANT_DO_THAT_RIGHT_NOW = 1020, - ERR_AFFECTING_COMBAT = 1021, - ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1022, - ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1023, - ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1024, - ERR_MOVIE_RECORDING_WARNING_PERF = 1025, - ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1026, - ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1027, - ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1028, - ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1029, - ERR_NO_CHALLENGE_MODE_REWARD = 1030, - ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1031, - ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1032, - ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1033, - ERR_TALENT_FAILED_REST_AREA = 1034, - ERR_CANNOT_ABANDON_LAST_PET = 1035, - ERR_TEST_CVAR_SET_SSS = 1036, - ERR_QUEST_TURN_IN_FAIL_REASON = 1037, - ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1038, - ERR_TALENT_GRANTED_BY_AURA = 1039, - ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1040, - ERR_GLYPH_TARGET_NOT_AVAILABLE = 1041, - ERR_PVP_WARMODE_TOGGLE_ON = 1042, - ERR_PVP_WARMODE_TOGGLE_OFF = 1043, - ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1044, - ERR_SPELL_FAILED_CANT_FLY_HERE = 1045, - ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1046, - ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1047, - ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1048, - ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1049, - ERR_VOICE_CHAT_SERVICE_LOST = 1050, - ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1051, - ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1052, - ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1053, - ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1054, - ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1055, - ERR_VOICE_CHAT_PLAYER_SILENCED = 1056, - ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1057, - ERR_VOICE_CHAT_DISABLED = 1058, - ERR_NO_PVP_REWARD = 1059, - ERR_CLAIMED_PVP_REWARD = 1060, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1061, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1062, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1063, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1064, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1065, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1066, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1067, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1068, - ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1069, - ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1070, - ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1071, - ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1072, - ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1073, - ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1074, - ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1075, - ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1076, - ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1077, - ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1078, - ERR_SOCKETING_REQUIRES_TINKER_GEM = 1079, - ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1080, - ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM = 1081, - ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT = 1082, - ERR_LEVEL_LINKING_RESULT_LINKED = 1083, - ERR_LEVEL_LINKING_RESULT_UNLINKED = 1084, - ERR_CLUB_FINDER_ERROR_POST_CLUB = 1085, - ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1086, - ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1087, - ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1088, - ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1089, - ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1090, - ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1091, - ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1092, - ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1093, - ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1094, - ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1095, - ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1096, - ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1097, - ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1098, - ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1099, - ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1100, - ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1101, - ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1102, - ERR_SOULBIND_INVALID_CONDUIT = 1103, - ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1104, - ERR_SOULBIND_INVALID_TALENT = 1105, - ERR_SOULBIND_DUPLICATE_CONDUIT = 1106, - ERR_ACTIVATE_SOULBIND_S = 1107, - ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1108, - ERR_CANT_USE_PROFANITY = 1109, - ERR_NOT_IN_PET_BATTLE = 1110, - ERR_NOT_IN_NPE = 1111, - ERR_NO_SPEC = 1112, - ERR_NO_DOMINATIONSHARD_OVERWRITE = 1113, - ERR_USE_WEEKLY_REWARDS_DISABLED = 1114, - ERR_CROSS_FACTION_GROUP_JOINED = 1115, - ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1116, - ERR_EQUIPABLESPELLS_SLOTS_FULL = 1117, - ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN = 1118, - ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 1119, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL = 1120, - ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT = 1121, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED = 1122, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID = 1123, - ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED = 1124, - ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED = 1125, + ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER = 841, + ERR_QUEST_FORCE_REMOVED_S = 842, + ERR_ATTACK_NO_ACTIONS = 843, + ERR_IN_RANDOM_BG = 844, + ERR_IN_NON_RANDOM_BG = 845, + ERR_BN_FRIEND_SELF = 846, + ERR_BN_FRIEND_ALREADY = 847, + ERR_BN_FRIEND_BLOCKED = 848, + ERR_BN_FRIEND_LIST_FULL = 849, + ERR_BN_FRIEND_REQUEST_SENT = 850, + ERR_BN_BROADCAST_THROTTLE = 851, + ERR_BG_DEVELOPER_ONLY = 852, + ERR_CURRENCY_SPELL_SLOT_MISMATCH = 853, + ERR_CURRENCY_NOT_TRADABLE = 854, + ERR_REQUIRES_EXPANSION_S = 855, + ERR_QUEST_FAILED_SPELL = 856, + ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 857, + ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 858, + ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 859, + ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 860, + ERR_TALENT_FAILED_UNKNOWN = 861, + ERR_TALENT_FAILED_IN_COMBAT = 862, + ERR_TALENT_FAILED_IN_PVP_MATCH = 863, + ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 864, + ERR_WARGAME_REQUEST_FAILURE = 865, + ERR_RANK_REQUIRES_AUTHENTICATOR = 866, + ERR_GUILD_BANK_VOUCHER_FAILED = 867, + ERR_WARGAME_REQUEST_SENT = 868, + ERR_REQUIRES_ACHIEVEMENT_I = 869, + ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 870, + ERR_CANT_BUY_QUANTITY = 871, + ERR_ITEM_IS_BATTLE_PAY_LOCKED = 872, + ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 873, + ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 874, + ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 875, + ERR_INSUFF_TRACKED_CURRENCY_IS = 876, + ERR_NOT_ON_TOURNAMENT_REALM = 877, + ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 878, + ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 879, + ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 880, + ERR_CANT_DO_THAT_IN_A_GROUP = 881, + ERR_GUILD_LEADER_REPLACED = 882, + ERR_TRANSMOGRIFY_CANT_EQUIP = 883, + ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 884, + ERR_TRANSMOGRIFY_NOT_SOULBOUND = 885, + ERR_TRANSMOGRIFY_INVALID_SOURCE = 886, + ERR_TRANSMOGRIFY_INVALID_DESTINATION = 887, + ERR_TRANSMOGRIFY_MISMATCH = 888, + ERR_TRANSMOGRIFY_LEGENDARY = 889, + ERR_TRANSMOGRIFY_SAME_ITEM = 890, + ERR_TRANSMOGRIFY_SAME_APPEARANCE = 891, + ERR_TRANSMOGRIFY_NOT_EQUIPPED = 892, + ERR_VOID_DEPOSIT_FULL = 893, + ERR_VOID_WITHDRAW_FULL = 894, + ERR_VOID_STORAGE_WRAPPED = 895, + ERR_VOID_STORAGE_STACKABLE = 896, + ERR_VOID_STORAGE_UNBOUND = 897, + ERR_VOID_STORAGE_REPAIR = 898, + ERR_VOID_STORAGE_CHARGES = 899, + ERR_VOID_STORAGE_QUEST = 900, + ERR_VOID_STORAGE_CONJURED = 901, + ERR_VOID_STORAGE_MAIL = 902, + ERR_VOID_STORAGE_BAG = 903, + ERR_VOID_TRANSFER_STORAGE_FULL = 904, + ERR_VOID_TRANSFER_INV_FULL = 905, + ERR_VOID_TRANSFER_INTERNAL_ERROR = 906, + ERR_VOID_TRANSFER_ITEM_INVALID = 907, + ERR_DIFFICULTY_DISABLED_IN_LFG = 908, + ERR_VOID_STORAGE_UNIQUE = 909, + ERR_VOID_STORAGE_LOOT = 910, + ERR_VOID_STORAGE_HOLIDAY = 911, + ERR_VOID_STORAGE_DURATION = 912, + ERR_VOID_STORAGE_LOAD_FAILED = 913, + ERR_VOID_STORAGE_INVALID_ITEM = 914, + ERR_PARENTAL_CONTROLS_CHAT_MUTED = 915, + ERR_SOR_START_EXPERIENCE_INCOMPLETE = 916, + ERR_SOR_INVALID_EMAIL = 917, + ERR_SOR_INVALID_COMMENT = 918, + ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 919, + ERR_CHALLENGE_MODE_RESET_KEYSTONE = 920, + ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 921, + ERR_REPORT_SUBMITTED_SUCCESSFULLY = 922, + ERR_REPORT_SUBMISSION_FAILED = 923, + ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 924, + ERR_BUG_SUBMITTED_SUCCESSFULLY = 925, + ERR_CHALLENGE_MODE_ENABLED = 926, + ERR_CHALLENGE_MODE_DISABLED = 927, + ERR_PETBATTLE_CREATE_FAILED = 928, + ERR_PETBATTLE_NOT_HERE = 929, + ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 930, + ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 931, + ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 932, + ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 933, + ERR_PETBATTLE_NOT_WHILE_DEAD = 934, + ERR_PETBATTLE_NOT_WHILE_FLYING = 935, + ERR_PETBATTLE_TARGET_INVALID = 936, + ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 937, + ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 938, + ERR_PETBATTLE_NOT_A_TRAINER = 939, + ERR_PETBATTLE_DECLINED = 940, + ERR_PETBATTLE_IN_BATTLE = 941, + ERR_PETBATTLE_INVALID_LOADOUT = 942, + ERR_PETBATTLE_ALL_PETS_DEAD = 943, + ERR_PETBATTLE_NO_PETS_IN_SLOTS = 944, + ERR_PETBATTLE_NO_ACCOUNT_LOCK = 945, + ERR_PETBATTLE_WILD_PET_TAPPED = 946, + ERR_PETBATTLE_RESTRICTED_ACCOUNT = 947, + ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 948, + ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 949, + ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 950, + ERR_CANT_HAVE_MORE_PETS = 951, + ERR_PVP_MAP_NOT_FOUND = 952, + ERR_PVP_MAP_NOT_SET = 953, + ERR_PETBATTLE_QUEUE_QUEUED = 954, + ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 955, + ERR_PETBATTLE_QUEUE_JOIN_FAILED = 956, + ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 957, + ERR_PETBATTLE_QUEUE_REMOVED = 958, + ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 959, + ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 960, + ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 961, + ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 962, + ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 963, + ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 964, + ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 965, + ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 966, + ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 967, + ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 968, + ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 969, + ERR_PETBATTLE_QUEUE_SLOT_DEAD = 970, + ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 971, + ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 972, + ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 973, + ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 974, + ERR_HAS_RESTRICTION = 975, + ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 976, + ERR_ITEM_UPGRADE_NO_PATH = 977, + ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 978, + ERR_BONUS_ROLL_EMPTY = 979, + ERR_CHALLENGE_MODE_FULL = 980, + ERR_CHALLENGE_MODE_IN_PROGRESS = 981, + ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 982, + ERR_BATTLETAG_FRIEND_NOT_FOUND = 983, + ERR_BATTLETAG_FRIEND_NOT_VALID = 984, + ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 985, + ERR_BATTLETAG_FRIEND_THROTTLED = 986, + ERR_BATTLETAG_FRIEND_SUCCESS = 987, + ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 988, + ERR_PETBATTLE_INTERNAL = 989, + ERR_CANT_CAGE_PET_YET = 990, + ERR_NO_LOOT_IN_CHALLENGE_MODE = 991, + ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 992, + ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 993, + ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 994, + ERR_RECRUIT_A_FRIEND_FAILED = 995, + ERR_SET_LOOT_PERSONAL = 996, + ERR_SET_LOOT_METHOD_FAILED_COMBAT = 997, + ERR_REAGENT_BANK_FULL = 998, + ERR_REAGENT_BANK_LOCKED = 999, + ERR_GARRISON_BUILDING_EXISTS = 1000, + ERR_GARRISON_INVALID_PLOT = 1001, + ERR_GARRISON_INVALID_BUILDINGID = 1002, + ERR_GARRISON_INVALID_PLOT_BUILDING = 1003, + ERR_GARRISON_REQUIRES_BLUEPRINT = 1004, + ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1005, + ERR_GARRISON_NOT_ENOUGH_GOLD = 1006, + ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1007, + ERR_ALREADY_USING_LFG_LIST = 1008, + ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1009, + ERR_TOY_USE_LIMIT_REACHED = 1010, + ERR_TOY_ALREADY_KNOWN = 1011, + ERR_TRANSMOG_SET_ALREADY_KNOWN = 1012, + ERR_NOT_ENOUGH_CURRENCY = 1013, + ERR_SPEC_IS_DISABLED = 1014, + ERR_FEATURE_RESTRICTED_TRIAL = 1015, + ERR_CANT_BE_OBLITERATED = 1016, + ERR_CANT_BE_SCRAPPED = 1017, + ERR_CANT_BE_RECRAFTED = 1018, + ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1019, + ERR_MUST_EQUIP_ARTIFACT = 1020, + ERR_CANT_DO_THAT_RIGHT_NOW = 1021, + ERR_AFFECTING_COMBAT = 1022, + ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1023, + ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1024, + ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1025, + ERR_MOVIE_RECORDING_WARNING_PERF = 1026, + ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1027, + ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1028, + ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1029, + ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1030, + ERR_NO_CHALLENGE_MODE_REWARD = 1031, + ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1032, + ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1033, + ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1034, + ERR_TALENT_FAILED_REST_AREA = 1035, + ERR_CANNOT_ABANDON_LAST_PET = 1036, + ERR_TEST_CVAR_SET_SSS = 1037, + ERR_QUEST_TURN_IN_FAIL_REASON = 1038, + ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1039, + ERR_TALENT_GRANTED_BY_AURA = 1040, + ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1041, + ERR_GLYPH_TARGET_NOT_AVAILABLE = 1042, + ERR_PVP_WARMODE_TOGGLE_ON = 1043, + ERR_PVP_WARMODE_TOGGLE_OFF = 1044, + ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1045, + ERR_SPELL_FAILED_CANT_FLY_HERE = 1046, + ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1047, + ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1048, + ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1049, + ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1050, + ERR_VOICE_CHAT_SERVICE_LOST = 1051, + ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1052, + ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1053, + ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1054, + ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1055, + ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1056, + ERR_VOICE_CHAT_PLAYER_SILENCED = 1057, + ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1058, + ERR_VOICE_CHAT_DISABLED = 1059, + ERR_NO_PVP_REWARD = 1060, + ERR_CLAIMED_PVP_REWARD = 1061, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1062, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1063, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1064, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1065, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1066, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1067, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1068, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1069, + ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1070, + ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1071, + ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1072, + ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1073, + ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1074, + ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1075, + ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1076, + ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1077, + ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1078, + ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1079, + ERR_SOCKETING_REQUIRES_TINKER_GEM = 1080, + ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1081, + ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM = 1082, + ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT = 1083, + ERR_LEVEL_LINKING_RESULT_LINKED = 1084, + ERR_LEVEL_LINKING_RESULT_UNLINKED = 1085, + ERR_CLUB_FINDER_ERROR_POST_CLUB = 1086, + ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1087, + ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1088, + ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1089, + ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1090, + ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1091, + ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1092, + ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1093, + ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1094, + ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1095, + ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1096, + ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1097, + ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1098, + ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1099, + ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1100, + ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1101, + ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1102, + ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT = 1103, + ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1104, + ERR_SOULBIND_INVALID_CONDUIT = 1105, + ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1106, + ERR_SOULBIND_INVALID_TALENT = 1107, + ERR_SOULBIND_DUPLICATE_CONDUIT = 1108, + ERR_ACTIVATE_SOULBIND_S = 1109, + ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1110, + ERR_CANT_USE_PROFANITY = 1111, + ERR_NOT_IN_PET_BATTLE = 1112, + ERR_NOT_IN_NPE = 1113, + ERR_NO_SPEC = 1114, + ERR_NO_DOMINATIONSHARD_OVERWRITE = 1115, + ERR_USE_WEEKLY_REWARDS_DISABLED = 1116, + ERR_CROSS_FACTION_GROUP_JOINED = 1117, + ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1118, + ERR_EQUIPABLESPELLS_SLOTS_FULL = 1119, + ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN = 1120, + ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 1121, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL = 1122, + ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT = 1123, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED = 1124, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID = 1125, + ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED = 1126, + ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED = 1127, }; enum class MountResult : uint32 diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 4d89381d542..5b583ee11f7 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -263,6 +263,10 @@ WorldPacket const* WorldPackets::Battleground::PVPOptionsEnabled::Write() _worldPacket.WriteBit(WargameArenas); _worldPacket.WriteBit(RatedArenas); _worldPacket.WriteBit(ArenaSkirmish); + _worldPacket.WriteBit(SoloShuffle); + _worldPacket.WriteBit(RatedSoloShuffle); + _worldPacket.WriteBit(BattlegroundBlitz); + _worldPacket.WriteBit(RatedBattlegroundBlitz); _worldPacket.FlushBits(); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 05edc095f7e..9c96c76f66f 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -323,12 +323,16 @@ namespace WorldPackets WorldPacket const* Write() override; + bool RatedBattlegrounds = false; + bool PugBattlegrounds = false; + bool WargameBattlegrounds = false; bool WargameArenas = false; bool RatedArenas = false; - bool WargameBattlegrounds = false; bool ArenaSkirmish = false; - bool PugBattlegrounds = false; - bool RatedBattlegrounds = false; + bool SoloShuffle = false; + bool RatedSoloShuffle = false; + bool BattlegroundBlitz = false; + bool RatedBattlegroundBlitz = false; // solo rbg }; class RequestBattlefieldStatus final : public ClientPacket diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp index 1e42362a480..27a67d416a3 100644 --- a/src/server/game/Server/Packets/CalendarPackets.cpp +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -52,6 +52,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCal data << uint8(inviteInfo.Moderator); data << uint8(inviteInfo.InviteType); data << inviteInfo.InviterGuid; + data.WriteBit(inviteInfo.IgnoreFriendAndGuildRestriction); + data.FlushBits(); return data; } @@ -265,13 +267,13 @@ WorldPacket const* WorldPackets::Calendar::CalendarSendCalendar::Write() _worldPacket << uint32(Events.size()); _worldPacket << uint32(RaidLockouts.size()); - for (auto const& invite : Invites) - _worldPacket << invite; - - for (auto const& lockout : RaidLockouts) + for (CalendarSendCalendarRaidLockoutInfo const& lockout : RaidLockouts) _worldPacket << lockout; - for (auto const& event : Events) + for (CalendarSendCalendarInviteInfo const& invite : Invites) + _worldPacket << invite; + + for (CalendarSendCalendarEventInfo const& event : Events) _worldPacket << event; return &_worldPacket; diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h index 4b45b13952c..7ef1a4976f8 100644 --- a/src/server/game/Server/Packets/CalendarPackets.h +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -167,6 +167,7 @@ namespace WorldPackets uint8 Status = 0; uint8 Moderator = 0; uint8 InviteType = 0; + bool IgnoreFriendAndGuildRestriction = false; }; struct CalendarSendCalendarRaidLockoutInfo diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 35a68f07ecc..2a14e107077 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -46,7 +46,7 @@ namespace WorldPackets { namespace Character { -void SortCustomizations(Array<ChrCustomizationChoice, 125>& customizations) +void SortCustomizations(Array<ChrCustomizationChoice, 250>& customizations) { auto first = customizations.begin(); auto last = customizations.end(); @@ -60,6 +60,28 @@ void SortCustomizations(Array<ChrCustomizationChoice, 125>& customizations) } } +ByteBuffer& operator<<(ByteBuffer& data, CustomTabardInfo const& customTabardInfo) +{ + data << int32(customTabardInfo.EmblemStyle); + data << int32(customTabardInfo.EmblemColor); + data << int32(customTabardInfo.BorderStyle); + data << int32(customTabardInfo.BorderColor); + data << int32(customTabardInfo.BackgroundColor); + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, CustomTabardInfo& customTabardInfo) +{ + data >> customTabardInfo.EmblemStyle; + data >> customTabardInfo.EmblemColor; + data >> customTabardInfo.BorderStyle; + data >> customTabardInfo.BorderColor; + data >> customTabardInfo.BackgroundColor; + + return data; +} + EnumCharacters::EnumCharacters(WorldPacket&& packet) : ClientPacket(std::move(packet)) { ASSERT(GetOpcode() == CMSG_ENUM_CHARACTERS || GetOpcode() == CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT); @@ -73,8 +95,12 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " // 11 12 13 14 15 16 17 // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " - // 18 19 20 21 22 23 - // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, character_declinedname.genitive" + // 18 19 20 21 22 + // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, " + // 23 24 25 26 27 + // "characters.personalTabardEmblemStyle, characters.personalTabardEmblemColor, characters.personalTabardBorderStyle, characters.personalTabardBorderColor, characters.personalTabardBackgroundColor " + // 28 + // "character_declinedname.genitive" Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); Name = fields[1].GetString(); @@ -104,7 +130,7 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) if (fields[18].GetUInt64()) Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[23].GetString().empty()) + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[28].GetString().empty()) Flags |= CHARACTER_FLAG_DECLINED; if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -141,6 +167,12 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) LastLoginVersion = fields[22].GetUInt32(); + PersonalTabard.EmblemStyle = fields[23].GetInt32(); + PersonalTabard.EmblemColor = fields[24].GetInt32(); + PersonalTabard.BorderStyle = fields[25].GetInt32(); + PersonalTabard.BorderColor = fields[26].GetInt32(); + PersonalTabard.BackgroundColor = fields[27].GetInt32(); + constexpr std::size_t equipmentFieldsPerSlot = 5; for (std::size_t slot = 0; slot < VisualItems.size() && (slot + 1) * equipmentFieldsPerSlot <= equipment.size(); ++slot) @@ -202,6 +234,7 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo con data << uint32(charInfo.MailSenders.size()); data << uint32(charInfo.MailSenderTypes.size()); data << uint32(charInfo.OverrideSelectScreenFileDataID); + data << charInfo.PersonalTabard; for (ChrCustomizationChoice const& customization : charInfo.Customizations) data << customization; @@ -213,6 +246,8 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo con data.WriteBit(charInfo.FirstLogin); data.WriteBit(charInfo.BoostInProgress); data.WriteBits(charInfo.unkWod61x, 5); + data.WriteBit(charInfo.RpeResetAvailable); + data.WriteBit(charInfo.RpeResetQuestClearAvailable); for (std::string const& str : charInfo.MailSenders) data.WriteBits(str.length() + 1, 6); @@ -234,6 +269,7 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::RaceUnlock const& data.WriteBit(raceUnlock.HasExpansion); data.WriteBit(raceUnlock.HasAchievement); data.WriteBit(raceUnlock.HasHeritageArmor); + data.WriteBit(raceUnlock.IsLocked); data.FlushBits(); return data; @@ -266,7 +302,6 @@ WorldPacket const* EnumCharactersResult::Write() _worldPacket.WriteBit(IsNewPlayer); _worldPacket.WriteBit(IsTrialAccountRestricted); _worldPacket.WriteBit(DisabledClassesMask.has_value()); - _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket << uint32(Characters.size()); _worldPacket << int32(MaxCharacterLevel); _worldPacket << uint32(RaceUnlockData.size()); @@ -663,5 +698,18 @@ WorldPacket const * SetPlayerDeclinedNamesResult::Write() return &_worldPacket; } + +void SavePersonalEmblem::Read() +{ + _worldPacket >> Vendor; + _worldPacket >> PersonalTabard; +} + +WorldPacket const* PlayerSavePersonalEmblem::Write() +{ + _worldPacket << int32(Error); + + return &_worldPacket; +} } } diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index f3d72d1e011..61096bb5ed7 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -60,7 +60,7 @@ namespace WorldPackets uint8 Race = RACE_NONE; uint8 Class = CLASS_NONE; uint8 Sex = GENDER_NONE; - Array<ChrCustomizationChoice, 125> Customizations; + Array<ChrCustomizationChoice, 250> Customizations; Optional<int32> TemplateSet; bool IsTrialBoost = false; bool UseNPE = false; @@ -81,7 +81,7 @@ namespace WorldPackets ObjectGuid CharGUID; uint8 SexID = GENDER_NONE; std::string CharName; - Array<ChrCustomizationChoice, 125> Customizations; + Array<ChrCustomizationChoice, 250> Customizations; }; struct CharRaceOrFactionChangeInfo @@ -92,7 +92,7 @@ namespace WorldPackets ObjectGuid Guid; bool FactionChange = false; std::string Name; - Array<ChrCustomizationChoice, 125> Customizations; + Array<ChrCustomizationChoice, 250> Customizations; }; struct CharacterUndeleteInfo @@ -105,6 +105,15 @@ namespace WorldPackets std::string Name; }; + struct CustomTabardInfo + { + int32 EmblemStyle = -1; + int32 EmblemColor = -1; + int32 BorderStyle = -1; + int32 BorderColor = -1; + int32 BackgroundColor = -1; + }; + class EnumCharactersResult final : public ServerPacket { public: @@ -163,6 +172,9 @@ namespace WorldPackets std::array<VisualItemInfo, 35> VisualItems = { }; std::vector<std::string> MailSenders; std::vector<uint32> MailSenderTypes; + bool RpeResetAvailable = false; + bool RpeResetQuestClearAvailable = false; + CustomTabardInfo PersonalTabard; }; struct RaceUnlock @@ -171,6 +183,7 @@ namespace WorldPackets bool HasExpansion = false; bool HasAchievement = false; bool HasHeritageArmor = false; + bool IsLocked = false; }; struct UnlockedConditionalAppearance @@ -201,7 +214,6 @@ namespace WorldPackets bool IsNewPlayerRestricted = false; ///< forbids using level boost and class trials bool IsNewPlayer = false; ///< forbids hero classes and allied races bool IsTrialAccountRestricted = false; - bool IsAlliedRacesCreationAllowed = false; int32 MaxCharacterLevel = 1; Optional<uint32> DisabledClassesMask; @@ -366,7 +378,7 @@ namespace WorldPackets std::string Name; uint8 SexID = 0; uint8 RaceID = RACE_NONE; - Array<ChrCustomizationChoice, 125> const* Customizations = nullptr; + Array<ChrCustomizationChoice, 250> const* Customizations = nullptr; }; class CharFactionChangeResult final : public ServerPacket @@ -637,7 +649,7 @@ namespace WorldPackets void Read() override; uint8 NewSex = 0; - Array<ChrCustomizationChoice, 125> Customizations; + Array<ChrCustomizationChoice, 250> Customizations; int32 CustomizedRace = 0; int32 CustomizedChrModelID = 0; }; @@ -691,7 +703,7 @@ namespace WorldPackets void Read() override; - uint8 FactionIndex = 0; + uint16 FactionIndex = 0; }; class SetFactionNotAtWar final : public ClientPacket @@ -701,7 +713,7 @@ namespace WorldPackets void Read() override; - uint8 FactionIndex = 0; + uint16 FactionIndex = 0; }; class SetFactionInactive final : public ClientPacket @@ -745,7 +757,7 @@ namespace WorldPackets ObjectGuid CharGUID; std::string CharName; uint8 SexID = 0; - Array<ChrCustomizationChoice, 125> const& Customizations; + Array<ChrCustomizationChoice, 250> const& Customizations; }; class CharCustomizeFailure final : public ServerPacket @@ -780,6 +792,27 @@ namespace WorldPackets ObjectGuid Player; int32 ResultCode = 0; }; + + class SavePersonalEmblem final : public ClientPacket + { + public: + SavePersonalEmblem(WorldPacket&& packet) : ClientPacket(CMSG_SAVE_PERSONAL_EMBLEM, std::move(packet)) { } + + void Read() override; + + ObjectGuid Vendor; + CustomTabardInfo PersonalTabard; + }; + + class PlayerSavePersonalEmblem final : public ServerPacket + { + public: + explicit PlayerSavePersonalEmblem(int32 error) : ServerPacket(SMSG_PLAYER_SAVE_PERSONAL_EMBLEM, 4), Error(error) { } + + WorldPacket const* Write() override; + + int32 Error; + }; } } diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index 8f03d8aa4b5..d6c9b22b9ef 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -259,7 +259,7 @@ namespace WorldPackets WorldPacket const* Write() override; int32 MessageID = 0; - std::string StringParam; + std::string_view StringParam; }; class ChatRegisterAddonPrefixes final : public ClientPacket diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 5b5b4b19571..1efaee4582d 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -66,6 +66,7 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() _worldPacket.WriteBit(FirstCraftOperationID.has_value()); _worldPacket.WriteBit(NextRechargeTime.has_value()); _worldPacket.WriteBit(RechargeCycleStartTime.has_value()); + _worldPacket.WriteBit(OverflownCurrencyID.has_value()); _worldPacket.FlushBits(); if (WeeklyQuantity) @@ -98,6 +99,9 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() if (RechargeCycleStartTime) _worldPacket << *RechargeCycleStartTime; + if (OverflownCurrencyID) + _worldPacket << int32(*OverflownCurrencyID); + return &_worldPacket; } @@ -434,7 +438,7 @@ WorldPacket const* WorldPackets::Misc::EnableBarberShop::Write() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Misc::PhaseShiftDataPhase const& phaseShiftDataPhase) { - data << uint16(phaseShiftDataPhase.PhaseFlags); + data << uint32(phaseShiftDataPhase.PhaseFlags); data << uint16(phaseShiftDataPhase.Id); return data; } diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index a064d06633b..a75462f235c 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -115,6 +115,7 @@ namespace WorldPackets Optional<uint32> FirstCraftOperationID; Optional<Timestamp<>> NextRechargeTime; Optional<Timestamp<>> RechargeCycleStartTime; + Optional<int32> OverflownCurrencyID; // what currency was originally changed but couldn't be incremented because of a cap bool SuppressChatLog = false; }; @@ -558,7 +559,7 @@ namespace WorldPackets struct PhaseShiftDataPhase { - uint16 PhaseFlags = 0; + uint32 PhaseFlags = 0; uint16 Id = 0; }; diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 02833e95525..49e7c7f9f92 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -356,7 +356,6 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementMonsterSpline const& movementMonsterSpline) { data << movementMonsterSpline.ID; - data << movementMonsterSpline.Destination; data.WriteBit(movementMonsterSpline.CrzTeleport); data.WriteBits(movementMonsterSpline.StopDistanceTolerance, 3); diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 5e186a041ba..77cc00d71c7 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -139,7 +139,6 @@ namespace WorldPackets struct MovementMonsterSpline { uint32 ID = 0; - TaggedPosition<Position::XYZ> Destination; bool CrzTeleport = false; uint8 StopDistanceTolerance = 0; // Determines how far from spline destination the mover is allowed to stop in place 0, 0, 3.0, 2.76, numeric_limits<float>::max, 1.1, float(INT_MAX); default before this field existed was distance 3.0 (index 2) MovementSpline Move; diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index e7b4c3b2f11..ec32ed95325 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -234,6 +234,12 @@ void SpiritHealerActivate::Read() _worldPacket >> Healer; } +void TabardVendorActivate::Read() +{ + _worldPacket >> Vendor; + _worldPacket >> Type; +} + void TrainerBuySpell::Read() { _worldPacket >> TrainerGUID; diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 7d0369c7070..6aba0696f26 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -235,6 +235,17 @@ namespace WorldPackets ObjectGuid Healer; }; + class TabardVendorActivate final : public ClientPacket + { + public: + TabardVendorActivate(WorldPacket&& packet) : ClientPacket(CMSG_TABARD_VENDOR_ACTIVATE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Vendor; + int32 Type = 0; + }; + class TrainerBuySpell final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index ac9fbd7d0d7..d02dfa1bd6f 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -142,7 +142,7 @@ void WorldPackets::Party::RequestPartyMemberStats::Read() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPhase const& phase) { - data << uint16(phase.Flags); + data << uint32(phase.Flags); data << uint16(phase.Id); return data; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 15b5f85de1f..a865f1f1e7c 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -144,7 +144,7 @@ namespace WorldPackets struct PartyMemberPhase { - uint16 Flags = 0u; + uint32 Flags = 0u; uint16 Id = 0u; }; diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index ef02dfe1c74..513a7bffb45 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -177,7 +177,7 @@ bool PlayerGuidLookupData::Initialize(ObjectGuid const& guid, Player const* play ClassID = player->GetClass(); Level = player->GetLevel(); - if (DeclinedName const* names = player->GetDeclinedNames()) + if (UF::DeclinedNames const* names = player->GetDeclinedNames()) DeclinedNames = *names; } else diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h index 84fe8f001e8..31fe7a62a9f 100644 --- a/src/server/game/Server/Packets/ReputationPackets.h +++ b/src/server/game/Server/Packets/ReputationPackets.h @@ -25,7 +25,7 @@ namespace WorldPackets { namespace Reputation { - static constexpr uint16 FactionCount = 443; + static constexpr uint16 FactionCount = 1000; class InitializeFactions final : public ServerPacket { diff --git a/src/server/game/Server/Packets/SocialPackets.cpp b/src/server/game/Server/Packets/SocialPackets.cpp index 09ac59d4128..7e7d7e188e5 100644 --- a/src/server/game/Server/Packets/SocialPackets.cpp +++ b/src/server/game/Server/Packets/SocialPackets.cpp @@ -111,7 +111,7 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Social::QualifiedGUID& qG void WorldPackets::Social::AddFriend::Read() { uint32 nameLength = _worldPacket.ReadBits(9); - uint32 noteslength = _worldPacket.ReadBits(10); + uint32 noteslength = _worldPacket.ReadBits(9); Name = _worldPacket.ReadString(nameLength); Notes = _worldPacket.ReadString(noteslength); } diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 5f4d0f3b6c2..1849327538b 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -16,7 +16,6 @@ */ #include "SystemPackets.h" -#include "Errors.h" namespace WorldPackets::System { @@ -130,9 +129,14 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket.WriteBit(ChatDisabledByPlayer); _worldPacket.WriteBit(LFGListCustomRequiresAuthenticator); _worldPacket.WriteBit(AddonsDisabled); - _worldPacket.WriteBit(Unused1000); + _worldPacket.WriteBit(WarGamesEnabled); _worldPacket.WriteBit(ContentTrackingEnabled); _worldPacket.WriteBit(IsSellAllJunkEnabled); + _worldPacket.WriteBit(IsGroupFinderEnabled); + _worldPacket.WriteBit(IsLFDEnabled); + + _worldPacket.WriteBit(IsLFREnabled); + _worldPacket.WriteBit(IsPremadeGroupEnabled); _worldPacket.FlushBits(); @@ -258,22 +262,6 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() return &_worldPacket; } -WorldPacket const* MOTD::Write() -{ - ASSERT(Text); - _worldPacket.WriteBits(Text->size(), 4); - _worldPacket.FlushBits(); - - for (std::string const& line : *Text) - { - _worldPacket.WriteBits(line.length(), 7); - _worldPacket.FlushBits(); - _worldPacket.WriteString(line); - } - - return &_worldPacket; -} - WorldPacket const* SetTimeZoneInformation::Write() { _worldPacket.WriteBits(ServerTimeTZ.length(), 7); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 5cf3f149159..5c173e7d3ac 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -157,9 +157,13 @@ namespace WorldPackets bool ChatDisabledByPlayer = false; bool LFGListCustomRequiresAuthenticator = false; bool AddonsDisabled = false; - bool Unused1000 = false; + bool WarGamesEnabled = false; // classic only bool ContentTrackingEnabled = false; bool IsSellAllJunkEnabled = false; + bool IsGroupFinderEnabled = true; // classic only + bool IsLFDEnabled = true; // classic only + bool IsLFREnabled = true; // classic only + bool IsPremadeGroupEnabled = true; // classic only SocialQueueConfig QuickJoinConfig; SquelchInfo Squelch; @@ -223,16 +227,6 @@ namespace WorldPackets Optional<std::string> RealmHiddenAlert; }; - class MOTD final : public ServerPacket - { - public: - MOTD() : ServerPacket(SMSG_MOTD) { } - - WorldPacket const* Write() override; - - std::vector<std::string> const* Text = nullptr; - }; - class SetTimeZoneInformation final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/WhoPackets.cpp b/src/server/game/Server/Packets/WhoPackets.cpp index ad1404fb8c0..418ea67c4f4 100644 --- a/src/server/game/Server/Packets/WhoPackets.cpp +++ b/src/server/game/Server/Packets/WhoPackets.cpp @@ -88,9 +88,11 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Who::WhoRequest& request) void WorldPackets::Who::WhoRequestPkt::Read() { Areas.resize(_worldPacket.ReadBits(4)); + IsFromAddOn = _worldPacket.ReadBit(); _worldPacket >> Request; _worldPacket >> RequestID; + _worldPacket >> Origin; for (size_t i = 0; i < Areas.size(); ++i) _worldPacket >> Areas[i]; diff --git a/src/server/game/Server/Packets/WhoPackets.h b/src/server/game/Server/Packets/WhoPackets.h index 4b242d5e3b9..9f4d2ddf172 100644 --- a/src/server/game/Server/Packets/WhoPackets.h +++ b/src/server/game/Server/Packets/WhoPackets.h @@ -85,6 +85,8 @@ namespace WorldPackets WhoRequest Request; uint32 RequestID = 0; + uint8 Origin = 0; // 1 = Social, 2 = Chat, 3 = Item + bool IsFromAddOn = false; Array<int32, 10> Areas; }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ac853aed657..1926a556e3f 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -838,6 +838,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SAVE_ACCOUNT_DATA_EXPORT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave); DEFINE_HANDLER(CMSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblem); + DEFINE_HANDLER(CMSG_SAVE_PERSONAL_EMBLEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSavePersonalEmblem); DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleScenePlaybackCanceled); DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_COMPLETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleScenePlaybackComplete); DEFINE_HANDLER(CMSG_SCENE_TRIGGER_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSceneTriggerEvent); @@ -1339,6 +1340,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_ESCAPED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FISH_NOT_HOOKED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLIGHT_SPLINE_SYNC, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLUSH_COMBAT_LOG_FILE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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); @@ -1632,7 +1634,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_NEVER, 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_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVEMENT_ENFORCEMENT_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ADD_IMPULSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1780,7 +1781,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERKS_PROGRAM_DISABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERKS_PROGRAM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERKS_PROGRAM_VENDOR_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERKS_PROGRAM_VENDOR_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_RENAME_GUILD_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1831,6 +1831,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SAVE_GUILD_EMBLEM, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SAVE_PERSONAL_EMBLEM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SHOW_ARROW_CALLOUT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SHOW_PARTY_POSE_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1925,7 +1926,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_LOOKUP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REATTACH_RESURRECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECEIVE_PING_UNIT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1994,6 +1994,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_TIME_OFFSET, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_COMBAT_LOG_FILE_FLUSH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ANIM_TIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index a79e261590d..3365afbd902 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -44,14 +44,14 @@ enum OpcodeMisc : uint16 enum OpcodeClient : uint16 { - CMSG_ABANDON_NPE_RESPONSE = 0x33F1, + CMSG_ABANDON_NPE_RESPONSE = 0x33F2, CMSG_ACCEPT_GUILD_INVITE = 0x35FD, - CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x339C, + CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x339D, CMSG_ACCEPT_SOCIAL_CONTRACT = 0x3745, CMSG_ACCEPT_TRADE = 0x315A, CMSG_ACCEPT_WARGAME_INVITE = 0x35E0, CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x3734, - CMSG_ACTIVATE_SOULBIND = 0x33E0, + CMSG_ACTIVATE_SOULBIND = 0x33E1, CMSG_ACTIVATE_TAXI = 0x34B2, CMSG_ADDON_LIST = 0x35D8, CMSG_ADD_ACCOUNT_COSMETIC = 0x32B6, @@ -60,8 +60,8 @@ enum OpcodeClient : uint16 CMSG_ADD_IGNORE = 0x36D2, CMSG_ADD_TOY = 0x32B5, CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3202, - CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x33E3, - CMSG_ADVENTURE_MAP_START_QUEST = 0x336F, + CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x33E4, + CMSG_ADVENTURE_MAP_START_QUEST = 0x3370, CMSG_ALTER_APPEARANCE = 0x3504, CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34B7, CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B8, @@ -101,15 +101,15 @@ enum OpcodeClient : uint16 CMSG_AUTO_GUILD_BANK_ITEM = 0x34BE, CMSG_AUTO_STORE_BAG_ITEM = 0x399B, CMSG_AUTO_STORE_GUILD_BANK_ITEM = 0x34C7, - CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x3398, - CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x337A, - CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x339A, - CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x3399, + CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x3399, + CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x337B, + CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x339B, + CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x339A, CMSG_BANKER_ACTIVATE = 0x34BA, CMSG_BATTLEFIELD_LEAVE = 0x3172, CMSG_BATTLEFIELD_LIST = 0x317D, CMSG_BATTLEFIELD_PORT = 0x3539, - CMSG_BATTLEMASTER_HELLO = 0x32D2, + CMSG_BATTLEMASTER_HELLO = 0x32D3, CMSG_BATTLEMASTER_JOIN = 0x3531, CMSG_BATTLEMASTER_JOIN_ARENA = 0x3532, CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3537, @@ -144,7 +144,7 @@ enum OpcodeClient : uint16 CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3541, CMSG_BLACK_MARKET_OPEN = 0x353F, CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3540, - CMSG_BONUS_ROLL = 0x339B, + CMSG_BONUS_ROLL = 0x339C, CMSG_BUG_REPORT = 0x3685, CMSG_BUSY_TRADE = 0x3158, CMSG_BUY_BACK_ITEM = 0x34AB, @@ -182,9 +182,9 @@ enum OpcodeClient : uint16 CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x3706, CMSG_CAST_SPELL = 0x32B9, CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x3353, - CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x3354, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3334, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x3354, + CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x3355, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3335, CMSG_CHANGE_REALM_TICKET = 0x36F8, CMSG_CHANGE_SUB_GROUP = 0x364C, CMSG_CHARACTER_CHECK_UPGRADE = 0x36C4, @@ -234,14 +234,14 @@ enum OpcodeClient : uint16 CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x3645, CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x3258, CMSG_CHOICE_RESPONSE = 0x32C1, - CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x33DF, - CMSG_CLAIM_WEEKLY_REWARD = 0x33BB, - CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x3418, + CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x33E0, + CMSG_CLAIM_WEEKLY_REWARD = 0x33BC, + CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x341A, CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0x3212, - CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x341A, - CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x3417, - CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x3416, - CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x341B, + CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x341C, + CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x3419, + CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x3418, + CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x341D, CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0x3211, CMSG_CLEAR_NEW_APPEARANCE = 0x3129, CMSG_CLEAR_RAID_MARKER = 0x31A5, @@ -249,8 +249,8 @@ enum OpcodeClient : uint16 CMSG_CLIENT_PORT_GRAVEYARD = 0x353B, CMSG_CLOSE_INTERACTION = 0x3499, CMSG_CLOSE_QUEST_CHOICE = 0x32C2, - CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x33E7, - CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x341C, + CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x33E8, + CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x341E, CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x371D, CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x371B, CMSG_CLUB_FINDER_POST = 0x3718, @@ -285,33 +285,33 @@ enum OpcodeClient : uint16 CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x36E6, CMSG_CONSUMABLE_TOKEN_REDEEM = 0x36EA, CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x36EB, - CMSG_CONTENT_TRACKING_START_TRACKING = 0x342C, - CMSG_CONTENT_TRACKING_STOP_TRACKING = 0x342D, - CMSG_CONTRIBUTION_CONTRIBUTE = 0x356D, - CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x356E, + CMSG_CONTENT_TRACKING_START_TRACKING = 0x342E, + CMSG_CONTENT_TRACKING_STOP_TRACKING = 0x342F, + CMSG_CONTRIBUTION_CONTRIBUTE = 0x356E, + CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x356F, CMSG_CONVERSATION_CINEMATIC_READY = 0x355B, CMSG_CONVERSATION_LINE_STARTED = 0x355A, CMSG_CONVERT_RAID = 0x364E, - CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x3581, - CMSG_CRAFTING_ORDER_CANCEL = 0x358C, - CMSG_CRAFTING_ORDER_CLAIM = 0x3589, - CMSG_CRAFTING_ORDER_CREATE = 0x3586, - CMSG_CRAFTING_ORDER_FULFILL = 0x358B, - CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x3588, - CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x3587, - CMSG_CRAFTING_ORDER_REJECT = 0x358D, - CMSG_CRAFTING_ORDER_RELEASE = 0x358A, - CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0x358E, - CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x358F, + CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x3582, + CMSG_CRAFTING_ORDER_CANCEL = 0x358D, + CMSG_CRAFTING_ORDER_CLAIM = 0x358A, + CMSG_CRAFTING_ORDER_CREATE = 0x3587, + CMSG_CRAFTING_ORDER_FULFILL = 0x358C, + CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x3589, + CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x3588, + CMSG_CRAFTING_ORDER_REJECT = 0x358E, + CMSG_CRAFTING_ORDER_RELEASE = 0x358B, + CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0x358F, + CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x3590, CMSG_CREATE_CHARACTER = 0x3644, - CMSG_CREATE_SHIPMENT = 0x331F, + CMSG_CREATE_SHIPMENT = 0x3320, CMSG_DB_QUERY_BULK = 0x35E4, CMSG_DECLINE_GUILD_INVITES = 0x352E, CMSG_DECLINE_PETITION = 0x3548, CMSG_DELETE_EQUIPMENT_SET = 0x351A, CMSG_DEL_FRIEND = 0x36CF, CMSG_DEL_IGNORE = 0x36D3, - CMSG_DEPOSIT_REAGENT_BANK = 0x335D, + CMSG_DEPOSIT_REAGENT_BANK = 0x335E, CMSG_DESTROY_ITEM = 0x32AF, CMSG_DF_BOOT_PLAYER_VOTE = 0x3617, CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x3609, @@ -342,51 +342,51 @@ enum OpcodeClient : uint16 CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31B0, CMSG_GAME_OBJ_REPORT_USE = 0x34FE, CMSG_GAME_OBJ_USE = 0x34FD, - CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x331A, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x3300, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32ED, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x334F, - CMSG_GARRISON_COMPLETE_MISSION = 0x3341, - CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x331B, - CMSG_GARRISON_GENERATE_RECRUITS = 0x3303, - CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x3312, - CMSG_GARRISON_GET_MAP_DATA = 0x3319, - CMSG_GARRISON_GET_MISSION_REWARD = 0x3373, - CMSG_GARRISON_LEARN_TALENT = 0x330E, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3343, - CMSG_GARRISON_PURCHASE_BUILDING = 0x32E9, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x3305, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x3338, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x3301, - CMSG_GARRISON_RENAME_FOLLOWER = 0x3302, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32E8, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x331D, - CMSG_GARRISON_RESEARCH_TALENT = 0x3306, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32EA, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32FE, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32F6, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x3304, - CMSG_GARRISON_SOCKET_TALENT = 0x33F4, - CMSG_GARRISON_START_MISSION = 0x3340, - CMSG_GARRISON_SWAP_BUILDINGS = 0x32EE, + CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x331B, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x3301, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32EE, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x3350, + CMSG_GARRISON_COMPLETE_MISSION = 0x3342, + CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x331C, + CMSG_GARRISON_GENERATE_RECRUITS = 0x3304, + CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x3313, + CMSG_GARRISON_GET_MAP_DATA = 0x331A, + CMSG_GARRISON_GET_MISSION_REWARD = 0x3374, + CMSG_GARRISON_LEARN_TALENT = 0x330F, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3344, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32EA, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x3306, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x3339, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x3302, + CMSG_GARRISON_RENAME_FOLLOWER = 0x3303, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32E9, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x331E, + CMSG_GARRISON_RESEARCH_TALENT = 0x3307, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32EB, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32FF, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32F7, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x3305, + CMSG_GARRISON_SOCKET_TALENT = 0x33F5, + CMSG_GARRISON_START_MISSION = 0x3341, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32EF, CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E7, CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36B4, CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x3733, - CMSG_GET_GARRISON_INFO = 0x32E3, + CMSG_GET_GARRISON_INFO = 0x32E4, CMSG_GET_ITEM_PURCHASE_DATA = 0x3543, - CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x331E, + CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x331F, CMSG_GET_MIRROR_IMAGE_DATA = 0x32B3, CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EE, CMSG_GET_RAF_ACCOUNT_INFO = 0x3721, CMSG_GET_REMAINING_GAME_TIME = 0x36E9, - CMSG_GET_TROPHY_LIST = 0x3331, + CMSG_GET_TROPHY_LIST = 0x3332, CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36DD, CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36EE, CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36EF, CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3690, CMSG_GM_TICKET_GET_CASE_STATUS = 0x368F, CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x368E, - CMSG_GOSSIP_REFRESH_OPTIONS = 0x3580, + CMSG_GOSSIP_REFRESH_OPTIONS = 0x3581, CMSG_GOSSIP_SELECT_OPTION = 0x349A, CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308D, CMSG_GUILD_ADD_RANK = 0x3065, @@ -439,16 +439,16 @@ enum OpcodeClient : uint16 CMSG_INITIATE_TRADE = 0x3156, CMSG_INSPECT = 0x353D, CMSG_INSTANCE_LOCK_RESPONSE = 0x351B, - CMSG_ISLAND_QUEUE = 0x33B7, + CMSG_ISLAND_QUEUE = 0x33B8, CMSG_ITEM_PURCHASE_REFUND = 0x3544, - CMSG_ITEM_TEXT_QUERY = 0x3350, + CMSG_ITEM_TEXT_QUERY = 0x3351, CMSG_JOIN_PET_BATTLE_QUEUE = 0x31DD, CMSG_JOIN_RATED_BATTLEGROUND = 0x3178, CMSG_KEEP_ALIVE = 0x367F, CMSG_KEYBOUND_OVERRIDE = 0x322F, CMSG_LATENCY_REPORT = 0x3771, - CMSG_LEARN_PVP_TALENTS = 0x356C, - CMSG_LEARN_TALENTS = 0x356A, + CMSG_LEARN_PVP_TALENTS = 0x356D, + CMSG_LEARN_TALENTS = 0x356B, CMSG_LEAVE_GROUP = 0x3649, CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31DE, CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360E, @@ -457,17 +457,17 @@ enum OpcodeClient : uint16 CMSG_LFG_LIST_GET_STATUS = 0x360C, CMSG_LFG_LIST_INVITE_APPLICANT = 0x3611, CMSG_LFG_LIST_INVITE_RESPONSE = 0x3612, - CMSG_LFG_LIST_JOIN = 0x3396, + CMSG_LFG_LIST_JOIN = 0x3397, CMSG_LFG_LIST_LEAVE = 0x360B, CMSG_LFG_LIST_SEARCH = 0x360D, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x3397, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x3398, CMSG_LIST_INVENTORY = 0x34A7, CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36B7, CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B6, CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B5, CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x36B8, CMSG_LOADING_SCREEN_NOTIFY = 0x35F8, - CMSG_LOAD_SELECTED_TROPHY = 0x3332, + CMSG_LOAD_SELECTED_TROPHY = 0x3333, CMSG_LOGOUT_CANCEL = 0x34E7, CMSG_LOGOUT_INSTANT = 0x34E8, CMSG_LOGOUT_REQUEST = 0x34E5, @@ -591,12 +591,12 @@ enum OpcodeClient : uint16 CMSG_NEXT_CINEMATIC_CAMERA = 0x3558, CMSG_OBJECT_UPDATE_FAILED = 0x317F, CMSG_OBJECT_UPDATE_RESCUED = 0x3180, - CMSG_OFFER_PETITION = 0x33DE, + CMSG_OFFER_PETITION = 0x33DF, CMSG_OPENING_CINEMATIC = 0x3557, - CMSG_OPEN_ITEM = 0x3351, - CMSG_OPEN_MISSION_NPC = 0x3314, - CMSG_OPEN_SHIPMENT_NPC = 0x331C, - CMSG_OPEN_TRADESKILL_NPC = 0x3327, + CMSG_OPEN_ITEM = 0x3352, + CMSG_OPEN_MISSION_NPC = 0x3315, + CMSG_OPEN_SHIPMENT_NPC = 0x331D, + CMSG_OPEN_TRADESKILL_NPC = 0x3328, CMSG_OPT_OUT_OF_LOOT = 0x3505, CMSG_OVERRIDE_SCREEN_FLASH = 0x352F, CMSG_PARTY_INVITE = 0x3603, @@ -604,10 +604,10 @@ enum OpcodeClient : uint16 CMSG_PARTY_UNINVITE = 0x3647, CMSG_PERFORM_ITEM_INTERACTION = 0x323B, CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = 0x3135, - CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0x3407, - CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0x3408, - CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0x3409, - CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0x3406, + CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0x3409, + CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0x340A, + CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0x340B, + CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0x3408, CMSG_PETITION_BUY = 0x34D0, CMSG_PETITION_RENAME_GUILD = 0x36C7, CMSG_PETITION_SHOW_LIST = 0x34CF, @@ -657,7 +657,7 @@ enum OpcodeClient : uint16 CMSG_QUERY_REALM_NAME = 0x3689, CMSG_QUERY_SCENARIO_POI = 0x3656, CMSG_QUERY_TIME = 0x34E4, - CMSG_QUERY_TREASURE_PICKER = 0x3376, + CMSG_QUERY_TREASURE_PICKER = 0x3377, CMSG_QUERY_VOID_STORAGE = 0x31A1, CMSG_QUEST_CONFIRM_ACCEPT = 0x34A4, CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x349E, @@ -669,12 +669,12 @@ enum OpcodeClient : uint16 CMSG_QUEST_GIVER_REQUEST_REWARD = 0x34A1, CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x34A3, CMSG_QUEST_GIVER_STATUS_QUERY = 0x34A2, - CMSG_QUEST_GIVER_STATUS_TRACKED_QUERY = 0x3591, + CMSG_QUEST_GIVER_STATUS_TRACKED_QUERY = 0x3592, CMSG_QUEST_LOG_REMOVE_QUEST = 0x3542, CMSG_QUEST_POI_QUERY = 0x36AE, CMSG_QUEST_PUSH_RESULT = 0x34A6, - CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x33CF, - CMSG_QUEST_SESSION_REQUEST_START = 0x33CE, + CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x33D0, + CMSG_QUEST_SESSION_REQUEST_START = 0x33CF, CMSG_QUEST_SESSION_REQUEST_STOP = 0x372C, CMSG_QUEUED_MESSAGES_END = 0x376C, CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3704, @@ -688,34 +688,34 @@ enum OpcodeClient : uint16 CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x3723, CMSG_RANDOM_ROLL = 0x3654, CMSG_READY_CHECK_RESPONSE = 0x3635, - CMSG_READ_ITEM = 0x3352, + CMSG_READ_ITEM = 0x3353, CMSG_RECLAIM_CORPSE = 0x34EA, - CMSG_REMOVE_NEW_ITEM = 0x3379, + CMSG_REMOVE_NEW_ITEM = 0x337A, CMSG_REMOVE_RAF_RECRUIT = 0x3725, CMSG_REORDER_CHARACTERS = 0x35E9, CMSG_REPAIR_ITEM = 0x34FB, - CMSG_REPLACE_TROPHY = 0x3333, + CMSG_REPLACE_TROPHY = 0x3334, CMSG_REPOP_REQUEST = 0x353A, CMSG_REPORT_CLIENT_VARIABLES = 0x36FE, CMSG_REPORT_ENABLED_ADDONS = 0x36FD, CMSG_REPORT_FROZEN_WHILE_LOADING_MAP = 0x36A6, CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x36FF, CMSG_REPORT_PVP_PLAYER_AFK = 0x3503, - CMSG_REPORT_SERVER_LAG = 0x33C7, - CMSG_REPORT_STUCK_IN_COMBAT = 0x33C8, + CMSG_REPORT_SERVER_LAG = 0x33C8, + CMSG_REPORT_STUCK_IN_COMBAT = 0x33C9, CMSG_REQUEST_ACCOUNT_DATA = 0x3694, - CMSG_REQUEST_AREA_POI_UPDATE = 0x3378, + CMSG_REQUEST_AREA_POI_UPDATE = 0x3379, CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DC, CMSG_REQUEST_CEMETERY_LIST = 0x3176, CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x368B, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32D5, - CMSG_REQUEST_COVENANT_CALLINGS = 0x33B9, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32D6, + CMSG_REQUEST_COVENANT_CALLINGS = 0x33BA, CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x353E, CMSG_REQUEST_FORCED_REACTIONS = 0x320C, - CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x33F3, + CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x33F4, CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A7, CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A6, - CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x33C9, + CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x33CA, CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32C4, CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x3206, CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x3207, @@ -733,19 +733,20 @@ enum OpcodeClient : uint16 CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x324A, CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3249, CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x324B, - CMSG_REQUEST_WEEKLY_REWARDS = 0x33BC, - CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3377, + CMSG_REQUEST_WEEKLY_REWARDS = 0x33BD, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3378, CMSG_RESET_CHALLENGE_MODE = 0x3204, CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3205, CMSG_RESET_INSTANCES = 0x3668, CMSG_RESURRECT_RESPONSE = 0x3683, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x3335, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x3336, CMSG_RIDE_VEHICLE_INTERACT = 0x324C, CMSG_RPE_RESET_CHARACTER = 0x374F, CMSG_SAVE_ACCOUNT_DATA_EXPORT = 0x3749, CMSG_SAVE_CUF_PROFILES = 0x318A, CMSG_SAVE_EQUIPMENT_SET = 0x3519, CMSG_SAVE_GUILD_EMBLEM = 0x32C8, + CMSG_SAVE_PERSONAL_EMBLEM = 0x32C9, CMSG_SCENE_PLAYBACK_CANCELED = 0x322C, CMSG_SCENE_PLAYBACK_COMPLETE = 0x322B, CMSG_SCENE_TRIGGER_EVENT = 0x322D, @@ -755,19 +756,19 @@ enum OpcodeClient : uint16 CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x36F7, CMSG_SEND_CONTACT_LIST = 0x36CD, CMSG_SEND_MAIL = 0x35FA, - CMSG_SEND_PING_UNIT = 0x342F, - CMSG_SEND_PING_WORLD_POINT = 0x3430, + CMSG_SEND_PING_UNIT = 0x3432, + CMSG_SEND_PING_WORLD_POINT = 0x3433, CMSG_SEND_TEXT_EMOTE = 0x348E, CMSG_SERVER_TIME_OFFSET_REQUEST = 0x369B, CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x3232, CMSG_SET_ACTION_BAR_TOGGLES = 0x3546, CMSG_SET_ACTION_BUTTON = 0x3636, CMSG_SET_ACTIVE_MOVER = 0x3A3C, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32D6, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32D7, CMSG_SET_ASSISTANT_LEADER = 0x364F, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3355, - CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0x3356, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3357, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3356, + CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0x3357, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3358, CMSG_SET_CONTACT_NOTES = 0x36D0, CMSG_SET_CURRENCY_FLAGS = 0x3168, CMSG_SET_DIFFICULTY_ID = 0x322E, @@ -779,7 +780,7 @@ enum OpcodeClient : uint16 CMSG_SET_FACTION_INACTIVE = 0x34EF, CMSG_SET_FACTION_NOT_AT_WAR = 0x34EE, CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x31B8, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3359, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x335A, CMSG_SET_LOOT_METHOD = 0x3648, CMSG_SET_LOOT_SPECIALIZATION = 0x3553, CMSG_SET_PARTY_ASSIGNMENT = 0x3651, @@ -787,30 +788,30 @@ enum OpcodeClient : uint16 CMSG_SET_PET_SLOT = 0x3167, CMSG_SET_PLAYER_DECLINED_NAMES = 0x3688, CMSG_SET_PREFERRED_CEMETERY = 0x3177, - CMSG_SET_PVP = 0x32CC, + CMSG_SET_PVP = 0x32CD, CMSG_SET_RAID_DIFFICULTY = 0x36D9, CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = 0x361A, CMSG_SET_ROLE = 0x35D9, CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3686, CMSG_SET_SELECTION = 0x353C, CMSG_SET_SHEATHED = 0x348F, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3358, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3359, CMSG_SET_TAXI_BENCHMARK_MODE = 0x3502, CMSG_SET_TITLE = 0x3299, CMSG_SET_TRADE_CURRENCY = 0x3160, CMSG_SET_TRADE_GOLD = 0x315F, CMSG_SET_TRADE_ITEM = 0x315D, - CMSG_SET_USING_PARTY_GARRISON = 0x3316, - CMSG_SET_WAR_MODE = 0x32CD, + CMSG_SET_USING_PARTY_GARRISON = 0x3317, + CMSG_SET_WAR_MODE = 0x32CE, CMSG_SET_WATCHED_FACTION = 0x34F0, CMSG_SHOW_TRADE_SKILL = 0x36C0, CMSG_SIGN_PETITION = 0x3547, CMSG_SILENCE_PARTY_TALKER = 0x3652, CMSG_SOCIAL_CONTRACT_REQUEST = 0x3744, CMSG_SOCKET_GEMS = 0x34FA, - CMSG_SORT_BAGS = 0x335A, - CMSG_SORT_BANK_BAGS = 0x335B, - CMSG_SORT_REAGENT_BANK_BAGS = 0x335C, + CMSG_SORT_BAGS = 0x335B, + CMSG_SORT_BANK_BAGS = 0x335C, + CMSG_SORT_REAGENT_BANK_BAGS = 0x335D, CMSG_SPAWN_TRACKING_UPDATE = 0x32AE, CMSG_SPELL_CLICK = 0x349B, CMSG_SPELL_EMPOWER_RELEASE = 0x3280, @@ -826,7 +827,7 @@ enum OpcodeClient : uint16 CMSG_START_WAR_GAME = 0x35DE, CMSG_STORE_GUILD_BANK_ITEM = 0x34BF, CMSG_SUBMIT_USER_FEEDBACK = 0x3693, - CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x33E8, + CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x33E9, CMSG_SUMMON_RESPONSE = 0x366A, CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3646, CMSG_SURRENDER_ARENA = 0x3173, @@ -838,7 +839,7 @@ enum OpcodeClient : uint16 CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM = 0x34C0, CMSG_SWAP_SUB_GROUPS = 0x364D, CMSG_SWAP_VOID_ITEM = 0x31A3, - CMSG_TABARD_VENDOR_ACTIVATE = 0x32C9, + CMSG_TABARD_VENDOR_ACTIVATE = 0x32CA, CMSG_TALK_TO_GOSSIP = 0x3498, CMSG_TAXI_NODE_STATUS_QUERY = 0x34AF, CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34B1, @@ -848,18 +849,18 @@ enum OpcodeClient : uint16 CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3F, CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A3E, CMSG_TOGGLE_DIFFICULTY = 0x3657, - CMSG_TOGGLE_PVP = 0x32CB, + CMSG_TOGGLE_PVP = 0x32CC, CMSG_TOTEM_DESTROYED = 0x3507, CMSG_TOY_CLEAR_FANFARE = 0x3128, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x3375, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3376, CMSG_TRAINER_BUY_SPELL = 0x34B5, CMSG_TRAINER_LIST = 0x34B4, - CMSG_TRAITS_COMMIT_CONFIG = 0x3410, - CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x340E, + CMSG_TRAITS_COMMIT_CONFIG = 0x3412, + CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x3410, CMSG_TRANSMOGRIFY_ITEMS = 0x3196, CMSG_TURN_IN_PETITION = 0x3549, CMSG_TUTORIAL = 0x36DA, - CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x33B8, + CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x33B9, CMSG_UNACCEPT_TRADE = 0x315B, CMSG_UNDELETE_CHARACTER = 0x36DC, CMSG_UNLEARN_SKILL = 0x34F4, @@ -869,13 +870,13 @@ enum OpcodeClient : uint16 CMSG_UPDATE_ACCOUNT_DATA = 0x3695, CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x32BB, CMSG_UPDATE_CLIENT_SETTINGS = 0x3664, - CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x3328, + CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x3329, CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A43, CMSG_UPDATE_RAID_TARGET = 0x3650, CMSG_UPDATE_SPELL_VISUAL = 0x32BA, CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F1, - CMSG_UPGRADE_GARRISON = 0x32DE, - CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x33E6, + CMSG_UPGRADE_GARRISON = 0x32DF, + CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x33E7, CMSG_USED_FOLLOW = 0x3185, CMSG_USE_CRITTER_ITEM = 0x3252, CMSG_USE_EQUIPMENT_SET = 0x3995, @@ -901,32 +902,32 @@ enum OpcodeServer : uint16 SMSG_ABORT_NEW_WORLD = 0x2597, SMSG_ACCOUNT_COSMETIC_ADDED = 0x2876, SMSG_ACCOUNT_CRITERIA_UPDATE = 0x285C, - SMSG_ACCOUNT_DATA_TIMES = 0x2704, - SMSG_ACCOUNT_EXPORT_RESPONSE = 0x28B3, + SMSG_ACCOUNT_DATA_TIMES = 0x2705, + SMSG_ACCOUNT_EXPORT_RESPONSE = 0x28B2, SMSG_ACCOUNT_MOUNT_REMOVED = 0x25AE, SMSG_ACCOUNT_MOUNT_UPDATE = 0x25AD, SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x2875, SMSG_ACCOUNT_TOY_UPDATE = 0x25AF, SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x25B3, SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x25B2, - SMSG_ACHIEVEMENT_DELETED = 0x26E2, - SMSG_ACHIEVEMENT_EARNED = 0x263F, + SMSG_ACHIEVEMENT_DELETED = 0x26E3, + SMSG_ACHIEVEMENT_EARNED = 0x2640, SMSG_ACTIVATE_ESSENCE_FAILED = 0x3015, SMSG_ACTIVATE_SOULBIND_FAILED = 0x3017, - SMSG_ACTIVATE_TAXI_REPLY = 0x2679, - SMSG_ACTIVE_GLYPHS = 0x2C54, - SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0x2740, - SMSG_ADDON_LIST_REQUEST = 0x263E, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2639, + SMSG_ACTIVATE_TAXI_REPLY = 0x267A, + SMSG_ACTIVE_GLYPHS = 0x2C56, + SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0x2741, + SMSG_ADDON_LIST_REQUEST = 0x263F, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x263A, SMSG_ADD_ITEM_PASSIVE = 0x25A9, - SMSG_ADD_LOSS_OF_CONTROL = 0x266D, - SMSG_ADD_RUNE_POWER = 0x26B3, + SMSG_ADD_LOSS_OF_CONTROL = 0x266E, + SMSG_ADD_RUNE_POWER = 0x26B4, SMSG_ADJUST_SPLINE_DURATION = 0x25CF, SMSG_ADVANCED_COMBAT_LOG = 0x2872, SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x286C, - SMSG_AE_LOOT_TARGETS = 0x2614, - SMSG_AE_LOOT_TARGET_ACK = 0x2615, - SMSG_AI_REACTION = 0x26B0, + SMSG_AE_LOOT_TARGETS = 0x2615, + SMSG_AE_LOOT_TARGET_ACK = 0x2616, + SMSG_AI_REACTION = 0x26B1, SMSG_ALLIED_RACE_DETAILS = 0x27F0, SMSG_ALL_ACCOUNT_CRITERIA = 0x2571, SMSG_ALL_ACHIEVEMENT_DATA = 0x2570, @@ -934,21 +935,21 @@ enum OpcodeServer : uint16 SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x2849, SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586, SMSG_AREA_POI_UPDATE_RESPONSE = 0x3010, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x2739, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x273A, SMSG_AREA_TRIGGER_DENIED = 0x2903, SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING = 0x2900, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x2710, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x2711, SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x28FE, SMSG_AREA_TRIGGER_RE_PATH = 0x28FD, SMSG_AREA_TRIGGER_RE_SHAPE = 0x2902, SMSG_AREA_TRIGGER_UNATTACH = 0x2901, SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = 0x28FF, - SMSG_ARENA_CLEAR_OPPONENTS = 0x2645, - SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x262E, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2644, - SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x279B, - SMSG_ARTIFACT_FORGE_ERROR = 0x2799, - SMSG_ARTIFACT_RESPEC_PROMPT = 0x279A, + SMSG_ARENA_CLEAR_OPPONENTS = 0x2646, + SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x262F, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2645, + SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x279C, + SMSG_ARTIFACT_FORGE_ERROR = 0x279A, + SMSG_ARTIFACT_RESPEC_PROMPT = 0x279B, SMSG_ARTIFACT_XP_GAIN = 0x27E3, SMSG_ATTACKER_STATE_UPDATE = 0x294E, SMSG_ATTACK_START = 0x2939, @@ -958,29 +959,29 @@ enum OpcodeServer : uint16 SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x27CC, SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x27CB, SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x27CA, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26ED, - SMSG_AUCTION_COMMAND_RESULT = 0x26EA, - SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x2893, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26EE, + SMSG_AUCTION_COMMAND_RESULT = 0x26EB, + SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x2892, SMSG_AUCTION_FAVORITE_LIST = 0x2863, SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x285A, - SMSG_AUCTION_HELLO_RESPONSE = 0x26E8, + SMSG_AUCTION_HELLO_RESPONSE = 0x26E9, SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x2859, SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x2856, SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2857, SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x2858, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26EC, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26EE, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x26E9, - SMSG_AUCTION_WON_NOTIFICATION = 0x26EB, - SMSG_AURA_POINTS_DEPLETED = 0x2C20, - SMSG_AURA_UPDATE = 0x2C1F, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26ED, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26EF, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x26EA, + SMSG_AUCTION_WON_NOTIFICATION = 0x26EC, + SMSG_AURA_POINTS_DEPLETED = 0x2C22, + SMSG_AURA_UPDATE = 0x2C21, SMSG_AUTH_CHALLENGE = 0x3048, SMSG_AUTH_FAILED = 0x256C, SMSG_AUTH_RESPONSE = 0x256D, SMSG_AVAILABLE_HOTFIXES = 0x290F, - SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0x2898, + SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0x2897, SMSG_BAG_CLEANUP_FINISHED = 0x2DA7, - SMSG_BARBER_SHOP_RESULT = 0x26B8, + SMSG_BARBER_SHOP_RESULT = 0x26B9, SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x283A, SMSG_BATTLEFIELD_LIST = 0x2927, SMSG_BATTLEFIELD_PORT_DENIED = 0x292D, @@ -997,33 +998,33 @@ enum OpcodeServer : uint16 SMSG_BATTLEGROUND_PLAYER_LEFT = 0x292C, SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2928, SMSG_BATTLEGROUND_POINTS = 0x294A, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x2783, - SMSG_BATTLENET_CHALLENGE_START = 0x2782, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x2784, + SMSG_BATTLENET_CHALLENGE_START = 0x2783, SMSG_BATTLENET_NOTIFICATION = 0x27FC, SMSG_BATTLENET_RESPONSE = 0x27FB, SMSG_BATTLE_NET_CONNECTION_STATUS = 0x27FD, - SMSG_BATTLE_PAY_ACK_FAILED = 0x277D, - SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x2772, - SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x2773, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x277C, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x2770, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x276F, + SMSG_BATTLE_PAY_ACK_FAILED = 0x277E, + SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x2773, + SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x2774, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x277D, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x2771, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x2770, SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x287B, - SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x276D, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x276E, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x276C, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x276A, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x276B, - SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x2771, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x277B, + SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x276E, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x276F, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x276D, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x276B, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x276C, + SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x2772, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x277C, SMSG_BATTLE_PAY_START_CHECKOUT = 0x2818, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x2779, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x2778, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x277A, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x2779, SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x280C, SMSG_BATTLE_PETS_HEALED = 0x25F1, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2674, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2675, SMSG_BATTLE_PET_DELETED = 0x25EE, - SMSG_BATTLE_PET_ERROR = 0x2634, + SMSG_BATTLE_PET_ERROR = 0x2635, SMSG_BATTLE_PET_JOURNAL = 0x25ED, SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x25EB, SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x25EC, @@ -1032,56 +1033,56 @@ enum OpcodeServer : uint16 SMSG_BATTLE_PET_TRAP_LEVEL = 0x25E9, SMSG_BATTLE_PET_UPDATES = 0x25E8, SMSG_BIND_POINT_UPDATE = 0x257D, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2624, - SMSG_BLACK_MARKET_OUTBID = 0x2625, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2623, - SMSG_BLACK_MARKET_WON = 0x2626, - SMSG_BONUS_ROLL_EMPTY = 0x2641, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2625, + SMSG_BLACK_MARKET_OUTBID = 0x2626, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2624, + SMSG_BLACK_MARKET_WON = 0x2627, + SMSG_BONUS_ROLL_EMPTY = 0x2642, SMSG_BOSS_KILL = 0x294D, SMSG_BREAK_TARGET = 0x2938, SMSG_BROADCAST_ACHIEVEMENT = 0x2BBC, SMSG_BROADCAST_SUMMON_CAST = 0x283C, SMSG_BROADCAST_SUMMON_RESPONSE = 0x283D, - SMSG_BUY_FAILED = 0x26C1, - SMSG_BUY_SUCCEEDED = 0x26C0, + SMSG_BUY_FAILED = 0x26C2, + SMSG_BUY_SUCCEEDED = 0x26C1, SMSG_CACHE_INFO = 0x291D, SMSG_CACHE_VERSION = 0x291C, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x2699, - SMSG_CALENDAR_COMMAND_RESULT = 0x269A, - SMSG_CALENDAR_COMMUNITY_INVITE = 0x2689, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x2691, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x2692, - SMSG_CALENDAR_INVITE_ADDED = 0x268A, - SMSG_CALENDAR_INVITE_ALERT = 0x268E, - SMSG_CALENDAR_INVITE_NOTES = 0x2693, - SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x2694, - SMSG_CALENDAR_INVITE_REMOVED = 0x268B, - SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x2690, - SMSG_CALENDAR_INVITE_STATUS = 0x268C, - SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x268F, - SMSG_CALENDAR_MODERATOR_STATUS = 0x268D, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2695, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2696, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2697, - SMSG_CALENDAR_SEND_CALENDAR = 0x2687, - SMSG_CALENDAR_SEND_EVENT = 0x2688, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x2698, - SMSG_CAMERA_EFFECT = 0x271F, - SMSG_CANCEL_AUTO_REPEAT = 0x26D8, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x269A, + SMSG_CALENDAR_COMMAND_RESULT = 0x269B, + SMSG_CALENDAR_COMMUNITY_INVITE = 0x268A, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x2692, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x2693, + SMSG_CALENDAR_INVITE_ADDED = 0x268B, + SMSG_CALENDAR_INVITE_ALERT = 0x268F, + SMSG_CALENDAR_INVITE_NOTES = 0x2694, + SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x2695, + SMSG_CALENDAR_INVITE_REMOVED = 0x268C, + SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x2691, + SMSG_CALENDAR_INVITE_STATUS = 0x268D, + SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x2690, + SMSG_CALENDAR_MODERATOR_STATUS = 0x268E, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2696, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2697, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2698, + SMSG_CALENDAR_SEND_CALENDAR = 0x2688, + SMSG_CALENDAR_SEND_EVENT = 0x2689, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x2699, + SMSG_CAMERA_EFFECT = 0x2720, + SMSG_CANCEL_AUTO_REPEAT = 0x26D9, SMSG_CANCEL_COMBAT = 0x2947, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C46, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C48, SMSG_CANCEL_PING_PIN = 0x25A2, SMSG_CANCEL_PRELOAD_WORLD = 0x2595, - SMSG_CANCEL_SCENE = 0x2633, - SMSG_CANCEL_SPELL_VISUAL = 0x2C44, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C48, + SMSG_CANCEL_SCENE = 0x2634, + SMSG_CANCEL_SPELL_VISUAL = 0x2C46, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C4A, SMSG_CAN_DUEL_RESULT = 0x2943, SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x280B, SMSG_CAPTURE_POINT_REMOVED = 0x292A, - SMSG_CAST_FAILED = 0x2C57, + SMSG_CAST_FAILED = 0x2C59, SMSG_CHAIN_MISSILE_BOUNCE = 0x25C7, SMSG_CHALLENGE_MODE_COMPLETE = 0x2608, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x260C, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x260D, SMSG_CHALLENGE_MODE_RESET = 0x2607, SMSG_CHALLENGE_MODE_START = 0x2605, SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x2606, @@ -1091,17 +1092,17 @@ enum OpcodeServer : uint16 SMSG_CHANNEL_NOTIFY = 0x2BC1, SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC2, SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC3, - SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x27B6, - SMSG_CHARACTER_LOGIN_FAILED = 0x26FF, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x2781, - SMSG_CHARACTER_RENAME_RESULT = 0x275C, - SMSG_CHARACTER_UPGRADE_ABORTED = 0x27B5, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27B4, - SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x27B7, - SMSG_CHARACTER_UPGRADE_STARTED = 0x27B3, - SMSG_CHAR_CUSTOMIZE_FAILURE = 0x26DC, - SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x26DD, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27A0, + SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x27B7, + SMSG_CHARACTER_LOGIN_FAILED = 0x2700, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x2782, + SMSG_CHARACTER_RENAME_RESULT = 0x275D, + SMSG_CHARACTER_UPGRADE_ABORTED = 0x27B6, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27B5, + SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x27B8, + SMSG_CHARACTER_UPGRADE_STARTED = 0x27B4, + SMSG_CHAR_CUSTOMIZE_FAILURE = 0x26DD, + SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x26DE, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27A1, SMSG_CHAT = 0x2BAD, SMSG_CHAT_AUTO_RESPONDED = 0x2BB8, SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = 0x2BCB, @@ -1121,94 +1122,94 @@ enum OpcodeServer : uint16 SMSG_CHECK_WARGAME_ENTRY = 0x258F, SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x2866, SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x284D, - SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C24, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C26, SMSG_CLEAR_BOSS_EMOTES = 0x25BA, - SMSG_CLEAR_COOLDOWN = 0x26B5, - SMSG_CLEAR_COOLDOWNS = 0x2C23, + SMSG_CLEAR_COOLDOWN = 0x26B6, + SMSG_CLEAR_COOLDOWNS = 0x2C25, SMSG_CLEAR_RESURRECT = 0x257F, - SMSG_CLEAR_SPELL_CHARGES = 0x2C25, + SMSG_CLEAR_SPELL_CHARGES = 0x2C27, SMSG_CLEAR_TARGET = 0x2944, SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x2AA1, - SMSG_CLOSE_ARTIFACT_FORGE = 0x2798, + SMSG_CLOSE_ARTIFACT_FORGE = 0x2799, SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x2845, SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x2848, SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x2846, SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x2843, SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x2847, SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x2844, - SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x288A, - SMSG_COIN_REMOVED = 0x2613, + SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x2889, + SMSG_COIN_REMOVED = 0x2614, SMSG_COMBAT_EVENT_FAILED = 0x293B, - SMSG_COMMENTATOR_MAP_INFO = 0x2701, - SMSG_COMMENTATOR_PLAYER_INFO = 0x2702, - SMSG_COMMENTATOR_STATE_CHANGED = 0x2700, + SMSG_COMMENTATOR_MAP_INFO = 0x2702, + SMSG_COMMENTATOR_PLAYER_INFO = 0x2703, + SMSG_COMMENTATOR_STATE_CHANGED = 0x2701, SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x27C7, SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x27D3, SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x27C9, SMSG_COMMERCE_TOKEN_UPDATE = 0x27C8, - SMSG_COMPLAINT_RESULT = 0x26A7, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x2791, + SMSG_COMPLAINT_RESULT = 0x26A8, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x2792, SMSG_CONFIRM_PARTY_INVITE = 0x280A, SMSG_CONNECT_TO = 0x304D, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x277E, - SMSG_CONSOLE_WRITE = 0x2631, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x277F, + SMSG_CONSOLE_WRITE = 0x2632, SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x27CF, SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x27CE, SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x27CD, SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x27D1, SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x27D2, - SMSG_CONTACT_LIST = 0x277F, + SMSG_CONTACT_LIST = 0x2780, SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x2811, - SMSG_CONTROL_UPDATE = 0x2643, + SMSG_CONTROL_UPDATE = 0x2644, SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x286F, - SMSG_COOLDOWN_CHEAT = 0x2732, - SMSG_COOLDOWN_EVENT = 0x26B4, - SMSG_CORPSE_LOCATION = 0x264B, - SMSG_CORPSE_RECLAIM_DELAY = 0x2743, - SMSG_CORPSE_TRANSPORT_QUERY = 0x270C, + SMSG_COOLDOWN_CHEAT = 0x2733, + SMSG_COOLDOWN_EVENT = 0x26B5, + SMSG_CORPSE_LOCATION = 0x264C, + SMSG_CORPSE_RECLAIM_DELAY = 0x2744, + SMSG_CORPSE_TRANSPORT_QUERY = 0x270D, SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0x2AA3, SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x27F3, SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x2870, - SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x28A6, - SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x28A2, - SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x289E, - SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x28A0, - SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x289C, - SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x28A1, - SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x289D, - SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x28A4, - SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x289F, - SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x28A7, - SMSG_CRAFT_ENCHANT_RESULT = 0x28A5, - SMSG_CREATE_CHAR = 0x26FB, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x2790, - SMSG_CREATOR_VISUALS_OVERRIDE = 0x28AA, - SMSG_CRITERIA_DELETED = 0x26E1, - SMSG_CRITERIA_UPDATE = 0x26DB, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26BC, + SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x28A5, + SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x28A1, + SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x289D, + SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x289F, + SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x289B, + SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x28A0, + SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x289C, + SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x28A3, + SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x289E, + SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x28A6, + SMSG_CRAFT_ENCHANT_RESULT = 0x28A4, + SMSG_CREATE_CHAR = 0x26FC, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x2791, + SMSG_CREATOR_VISUALS_OVERRIDE = 0x28A9, + SMSG_CRITERIA_DELETED = 0x26E2, + SMSG_CRITERIA_UPDATE = 0x26DC, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26BD, SMSG_CUSTOM_LOAD_SCREEN = 0x25CA, SMSG_DAILY_QUESTS_RESET = 0x2A80, - SMSG_DAMAGE_CALC_LOG = 0x2C63, + SMSG_DAMAGE_CALC_LOG = 0x2C65, SMSG_DB_REPLY = 0x290E, - SMSG_DEATH_RELEASE_LOC = 0x26CE, - SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x2651, + SMSG_DEATH_RELEASE_LOC = 0x26CF, + SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x2652, SMSG_DEFENSE_MESSAGE = 0x2BB6, - SMSG_DELETE_CHAR = 0x26FC, + SMSG_DELETE_CHAR = 0x26FD, SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x2980, - SMSG_DESTROY_ARENA_UNIT = 0x273B, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26F3, + SMSG_DESTROY_ARENA_UNIT = 0x273C, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26F4, SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x2589, SMSG_DISENCHANT_CREDIT = 0x25A6, SMSG_DISMOUNT_RESULT = 0x257C, - SMSG_DISPEL_FAILED = 0x2C2D, + SMSG_DISPEL_FAILED = 0x2C2F, SMSG_DISPLAY_GAME_ERROR = 0x259C, SMSG_DISPLAY_PLAYER_CHOICE = 0x2FFC, - SMSG_DISPLAY_PROMOTION = 0x2648, + SMSG_DISPLAY_PROMOTION = 0x2649, SMSG_DISPLAY_QUEST_POPUP = 0x2A9E, SMSG_DISPLAY_SOULBIND_UPDATE_MESSAGE = 0x2874, - SMSG_DISPLAY_TOAST = 0x2620, + SMSG_DISPLAY_TOAST = 0x2621, SMSG_DISPLAY_WORLD_TEXT = 0x27E4, - SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x2C62, + SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x2C64, SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25DF, SMSG_DROP_NEW_CONNECTION = 0x304C, SMSG_DUEL_ARRANGED = 0x293D, @@ -1218,51 +1219,52 @@ enum OpcodeServer : uint16 SMSG_DUEL_OUT_OF_BOUNDS = 0x293E, SMSG_DUEL_REQUESTED = 0x293C, SMSG_DUEL_WINNER = 0x2942, - SMSG_DURABILITY_DAMAGE_DEATH = 0x273E, - SMSG_EMOTE = 0x27BD, - SMSG_ENABLE_BARBER_SHOP = 0x26B7, - SMSG_ENCHANTMENT_LOG = 0x270D, - SMSG_ENCOUNTER_END = 0x2777, - SMSG_ENCOUNTER_START = 0x2776, - SMSG_END_LIGHTNING_STORM = 0x26A4, - SMSG_ENSURE_WORLD_LOADED = 0x2884, + SMSG_DURABILITY_DAMAGE_DEATH = 0x273F, + SMSG_EMOTE = 0x27BE, + SMSG_ENABLE_BARBER_SHOP = 0x26B8, + SMSG_ENCHANTMENT_LOG = 0x270E, + SMSG_ENCOUNTER_END = 0x2778, + SMSG_ENCOUNTER_START = 0x2777, + SMSG_END_LIGHTNING_STORM = 0x26A5, + SMSG_ENSURE_WORLD_LOADED = 0x2883, SMSG_ENTER_ENCRYPTED_MODE = 0x3049, SMSG_ENUM_CHARACTERS_RESULT = 0x2583, SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x27E9, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C1E, - SMSG_EQUIPMENT_SET_ID = 0x26AD, + SMSG_EQUIPMENT_SET_ID = 0x26AE, SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, - SMSG_EXPLORATION_EXPERIENCE = 0x2758, + SMSG_EXPLORATION_EXPERIENCE = 0x2759, SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x286D, - SMSG_FACTION_BONUS_INFO = 0x271E, + SMSG_FACTION_BONUS_INFO = 0x271F, SMSG_FAILED_PLAYER_CONDITION = 0x2FFA, SMSG_FAILED_QUEST_TURN_IN = 0x2807, SMSG_FEATURE_SYSTEM_STATUS = 0x25BE, SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25BF, - SMSG_FEIGN_DEATH_RESISTED = 0x273D, - SMSG_FISH_ESCAPED = 0x26CB, - SMSG_FISH_NOT_HOOKED = 0x26CA, + SMSG_FEIGN_DEATH_RESISTED = 0x273E, + SMSG_FISH_ESCAPED = 0x26CC, + SMSG_FISH_NOT_HOOKED = 0x26CB, SMSG_FLIGHT_SPLINE_SYNC = 0x2E2B, - SMSG_FORCED_DEATH_UPDATE = 0x26CF, - SMSG_FORCE_ANIM = 0x274A, - SMSG_FORCE_ANIMATIONS = 0x274B, - SMSG_FORCE_OBJECT_RELINK = 0x2647, + SMSG_FLUSH_COMBAT_LOG_FILE = 0x2C20, + SMSG_FORCED_DEATH_UPDATE = 0x26D0, + SMSG_FORCE_ANIM = 0x274B, + SMSG_FORCE_ANIMATIONS = 0x274C, + SMSG_FORCE_OBJECT_RELINK = 0x2648, SMSG_FORCE_RANDOM_TRANSMOG_TOAST = 0x25B1, - SMSG_FRIEND_STATUS = 0x2780, + SMSG_FRIEND_STATUS = 0x2781, SMSG_GAIN_MAW_POWER = 0x27D8, SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25C2, SMSG_GAME_OBJECT_BASE = 0x281E, - SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x2888, + SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x2887, SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25C3, SMSG_GAME_OBJECT_DESPAWN = 0x25C4, - SMSG_GAME_OBJECT_INTERACTION = 0x2887, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4B, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4A, - SMSG_GAME_OBJECT_RESET_STATE = 0x2718, + SMSG_GAME_OBJECT_INTERACTION = 0x2886, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4D, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4C, + SMSG_GAME_OBJECT_RESET_STATE = 0x2719, SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x27FA, - SMSG_GAME_SPEED_SET = 0x267D, - SMSG_GAME_TIME_SET = 0x2706, - SMSG_GAME_TIME_UPDATE = 0x2705, + SMSG_GAME_SPEED_SET = 0x267E, + SMSG_GAME_TIME_SET = 0x2707, + SMSG_GAME_TIME_UPDATE = 0x2706, SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x2982, SMSG_GARRISON_ADD_EVENT = 0x29A6, SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2974, @@ -1335,35 +1337,35 @@ enum OpcodeServer : uint16 SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x297D, SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2585, SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x2812, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x275A, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x275B, SMSG_GET_GARRISON_INFO_RESULT = 0x295E, - SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x2793, - SMSG_GET_REALM_HIDDEN_RESULT = 0x28B8, + SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x2794, + SMSG_GET_REALM_HIDDEN_RESULT = 0x28B7, SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x27D0, - SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x27BB, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x2792, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x278E, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x27BA, + SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x27BC, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x2793, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x278F, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x27BB, SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x27E5, SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x27E6, SMSG_GM_PLAYER_INFO = 0x3005, SMSG_GM_REQUEST_PLAYER_INFO = 0x2FFB, - SMSG_GM_TICKET_CASE_STATUS = 0x269F, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x269E, - SMSG_GOD_MODE = 0x26F6, + SMSG_GM_TICKET_CASE_STATUS = 0x26A0, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x269F, + SMSG_GOD_MODE = 0x26F7, SMSG_GOSSIP_COMPLETE = 0x2A97, SMSG_GOSSIP_MESSAGE = 0x2A98, SMSG_GOSSIP_OPTION_NPC_INTERACTION = 0x2AA7, - SMSG_GOSSIP_POI = 0x278B, + SMSG_GOSSIP_POI = 0x278C, SMSG_GOSSIP_QUEST_UPDATE = 0x2A99, SMSG_GOSSIP_REFRESH_OPTIONS = 0x2AA6, SMSG_GROUP_ACTION_THROTTLED = 0x258D, - SMSG_GROUP_AUTO_KICK = 0x2788, - SMSG_GROUP_DECLINE = 0x2784, - SMSG_GROUP_DESTROYED = 0x2787, - SMSG_GROUP_NEW_LEADER = 0x2629, - SMSG_GROUP_REQUEST_DECLINE = 0x2785, - SMSG_GROUP_UNINVITE = 0x2786, + SMSG_GROUP_AUTO_KICK = 0x2789, + SMSG_GROUP_DECLINE = 0x2785, + SMSG_GROUP_DESTROYED = 0x2788, + SMSG_GROUP_NEW_LEADER = 0x262A, + SMSG_GROUP_REQUEST_DECLINE = 0x2786, + SMSG_GROUP_UNINVITE = 0x2787, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, @@ -1417,59 +1419,59 @@ enum OpcodeServer : uint16 SMSG_GUILD_ROSTER = 0x29BB, SMSG_GUILD_ROSTER_UPDATE = 0x29BC, SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9, - SMSG_HEALTH_UPDATE = 0x26CC, - SMSG_HIGHEST_THREAT_UPDATE = 0x26D4, + SMSG_HEALTH_UPDATE = 0x26CD, + SMSG_HIGHEST_THREAT_UPDATE = 0x26D5, SMSG_HOTFIX_CONNECT = 0x2911, SMSG_HOTFIX_MESSAGE = 0x2910, - SMSG_INITIALIZE_FACTIONS = 0x271D, + SMSG_INITIALIZE_FACTIONS = 0x271E, SMSG_INITIAL_SETUP = 0x2580, - SMSG_INIT_WORLD_STATES = 0x273F, - SMSG_INSPECT_RESULT = 0x262D, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27A6, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27A5, - SMSG_INSTANCE_ENCOUNTER_END = 0x27AE, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27A4, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27B0, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27AF, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27A9, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27A8, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27AD, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27B1, - SMSG_INSTANCE_ENCOUNTER_START = 0x27AA, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27A7, - SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x27AC, - SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x27AB, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26F4, - SMSG_INSTANCE_INFO = 0x2630, - SMSG_INSTANCE_RESET = 0x2682, - SMSG_INSTANCE_RESET_FAILED = 0x2683, - SMSG_INSTANCE_SAVE_CREATED = 0x2775, - SMSG_INTERRUPT_POWER_REGEN = 0x2C59, + SMSG_INIT_WORLD_STATES = 0x2740, + SMSG_INSPECT_RESULT = 0x262E, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27A7, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27A6, + SMSG_INSTANCE_ENCOUNTER_END = 0x27AF, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27A5, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27B1, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27B0, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27AA, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27A9, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27AE, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27B2, + SMSG_INSTANCE_ENCOUNTER_START = 0x27AB, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27A8, + SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x27AD, + SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x27AC, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26F5, + SMSG_INSTANCE_INFO = 0x2631, + SMSG_INSTANCE_RESET = 0x2683, + SMSG_INSTANCE_RESET_FAILED = 0x2684, + SMSG_INSTANCE_SAVE_CREATED = 0x2776, + SMSG_INTERRUPT_POWER_REGEN = 0x2C5B, SMSG_INVALIDATE_PAGE_TEXT = 0x2918, SMSG_INVALIDATE_PLAYER = 0x2FFF, - SMSG_INVALID_PROMOTION_CODE = 0x274C, + SMSG_INVALID_PROMOTION_CODE = 0x274D, SMSG_INVENTORY_CHANGE_FAILURE = 0x2DA5, SMSG_INVENTORY_FIXUP_COMPLETE = 0x2809, SMSG_INVENTORY_FULL_OVERFLOW = 0x281A, - SMSG_ISLAND_AZERITE_GAIN = 0x2755, - SMSG_ISLAND_COMPLETE = 0x2756, + SMSG_ISLAND_AZERITE_GAIN = 0x2756, + SMSG_ISLAND_COMPLETE = 0x2757, SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A84, - SMSG_ITEM_CHANGED = 0x26E5, - SMSG_ITEM_COOLDOWN = 0x27BC, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x274E, + SMSG_ITEM_CHANGED = 0x26E6, + SMSG_ITEM_COOLDOWN = 0x27BD, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x274F, SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x259B, SMSG_ITEM_INTERACTION_COMPLETE = 0x2865, SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x2599, - SMSG_ITEM_PUSH_RESULT = 0x261F, - SMSG_ITEM_TIME_UPDATE = 0x274D, - SMSG_KICK_REASON = 0x2685, + SMSG_ITEM_PUSH_RESULT = 0x2620, + SMSG_ITEM_TIME_UPDATE = 0x274E, + SMSG_KICK_REASON = 0x2686, SMSG_LATENCY_REPORT_PING = 0x2877, - SMSG_LEARNED_SPELLS = 0x2C4D, + SMSG_LEARNED_SPELLS = 0x2C4F, SMSG_LEARN_PVP_TALENT_FAILED = 0x25D3, SMSG_LEARN_TALENT_FAILED = 0x25D2, SMSG_LEGACY_LOOT_RULES = 0x281F, SMSG_LEVEL_LINKING_RESULT = 0x284B, - SMSG_LEVEL_UP_INFO = 0x26E3, + SMSG_LEVEL_UP_INFO = 0x26E4, SMSG_LFG_BOOT_PLAYER = 0x2A35, SMSG_LFG_DISABLED = 0x2A33, SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x2A3B, @@ -1497,46 +1499,45 @@ enum OpcodeServer : uint16 SMSG_LFG_SLOT_INVALID = 0x2A30, SMSG_LFG_TELEPORT_DENIED = 0x2A32, SMSG_LFG_UPDATE_STATUS = 0x2A24, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x2767, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x2766, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x275B, - SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x2768, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x2768, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x2767, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x275C, + SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x2769, SMSG_LOAD_CUF_PROFILES = 0x25BB, - SMSG_LOAD_EQUIPMENT_SET = 0x2708, - SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x288C, - SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED = 0x288D, - SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE = 0x288E, - SMSG_LOGIN_SET_TIME_SPEED = 0x2707, + SMSG_LOAD_EQUIPMENT_SET = 0x2709, + SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x288B, + SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED = 0x288C, + SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE = 0x288D, + SMSG_LOGIN_SET_TIME_SPEED = 0x2708, SMSG_LOGIN_VERIFY_WORLD = 0x2596, - SMSG_LOGOUT_CANCEL_ACK = 0x2681, - SMSG_LOGOUT_COMPLETE = 0x2680, - SMSG_LOGOUT_RESPONSE = 0x267F, - SMSG_LOG_XP_GAIN = 0x26DF, - SMSG_LOOT_ALL_PASSED = 0x261D, - SMSG_LOOT_LIST = 0x273A, - SMSG_LOOT_MONEY_NOTIFY = 0x2618, - SMSG_LOOT_RELEASE = 0x2617, - SMSG_LOOT_RELEASE_ALL = 0x2616, - SMSG_LOOT_REMOVED = 0x2612, - SMSG_LOOT_RESPONSE = 0x2611, - SMSG_LOOT_ROLL = 0x261A, - SMSG_LOOT_ROLLS_COMPLETE = 0x261C, - SMSG_LOOT_ROLL_WON = 0x261E, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x266C, - SMSG_MAIL_COMMAND_RESULT = 0x2637, - SMSG_MAIL_LIST_RESULT = 0x274F, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2750, + SMSG_LOGOUT_CANCEL_ACK = 0x2682, + SMSG_LOGOUT_COMPLETE = 0x2681, + SMSG_LOGOUT_RESPONSE = 0x2680, + SMSG_LOG_XP_GAIN = 0x26E0, + SMSG_LOOT_ALL_PASSED = 0x261E, + SMSG_LOOT_LIST = 0x273B, + SMSG_LOOT_MONEY_NOTIFY = 0x2619, + SMSG_LOOT_RELEASE = 0x2618, + SMSG_LOOT_RELEASE_ALL = 0x2617, + SMSG_LOOT_REMOVED = 0x2613, + SMSG_LOOT_RESPONSE = 0x2612, + SMSG_LOOT_ROLL = 0x261B, + SMSG_LOOT_ROLLS_COMPLETE = 0x261D, + SMSG_LOOT_ROLL_WON = 0x261F, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x266D, + SMSG_MAIL_COMMAND_RESULT = 0x2638, + SMSG_MAIL_LIST_RESULT = 0x2750, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2751, SMSG_MAP_OBJECTIVES_INIT = 0x294C, SMSG_MAP_OBJ_EVENTS = 0x25C5, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x261B, - SMSG_MEETING_STONE_FAILED = 0x288F, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x261C, + SMSG_MEETING_STONE_FAILED = 0x288E, SMSG_MESSAGE_BOX = 0x2576, - SMSG_MINIMAP_PING = 0x26C9, + SMSG_MINIMAP_PING = 0x26CA, SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, SMSG_MISSILE_CANCEL = 0x25C6, - SMSG_MODIFY_COOLDOWN = 0x275D, - SMSG_MOTD = 0x2BAF, + SMSG_MODIFY_COOLDOWN = 0x275E, SMSG_MOUNT_RESULT = 0x257B, SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x283B, SMSG_MOVE_ADD_IMPULSE = 0x2E32, @@ -1650,51 +1651,50 @@ enum OpcodeServer : uint16 SMSG_MULTI_FLOOR_NEW_FLOOR = 0x27D4, SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x2609, SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x260B, - SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x260E, + SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x260F, SMSG_MYTHIC_PLUS_SEASON_DATA = 0x260A, SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25DA, - SMSG_NEW_DATA_BUILD = 0x28B7, - SMSG_NEW_TAXI_PATH = 0x267A, + SMSG_NEW_DATA_BUILD = 0x28B6, + SMSG_NEW_TAXI_PATH = 0x267B, SMSG_NEW_WORLD = 0x2593, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C43, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26A6, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C45, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26A7, SMSG_NOTIFY_MONEY = 0x2598, - SMSG_NOTIFY_RECEIVED_MAIL = 0x2638, - SMSG_NPC_INTERACTION_OPEN_RESULT = 0x2886, - SMSG_OFFER_PETITION_ERROR = 0x26B1, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x26E0, + SMSG_NOTIFY_RECEIVED_MAIL = 0x2639, + SMSG_NPC_INTERACTION_OPEN_RESULT = 0x2885, + SMSG_OFFER_PETITION_ERROR = 0x26B2, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x26E1, SMSG_ON_MONSTER_MOVE = 0x2DD4, - SMSG_OPEN_ARTIFACT_FORGE = 0x2797, + SMSG_OPEN_ARTIFACT_FORGE = 0x2798, SMSG_OPEN_CONTAINER = 0x2DA6, SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A31, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x278F, - SMSG_OVERRIDE_LIGHT = 0x26B6, - SMSG_PAGE_TEXT = 0x2713, - SMSG_PARTY_COMMAND_RESULT = 0x2789, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x2790, + SMSG_OVERRIDE_LIGHT = 0x26B7, + SMSG_PAGE_TEXT = 0x2714, + SMSG_PARTY_COMMAND_RESULT = 0x278A, SMSG_PARTY_INVITE = 0x25BC, - SMSG_PARTY_KILL_LOG = 0x2753, - SMSG_PARTY_MEMBER_FULL_STATE = 0x2752, - SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x2751, + SMSG_PARTY_KILL_LOG = 0x2754, + SMSG_PARTY_MEMBER_FULL_STATE = 0x2753, + SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x2752, SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x286B, SMSG_PARTY_UPDATE = 0x25F2, SMSG_PAST_TIME_EVENTS = 0x25C1, - SMSG_PAUSE_MIRROR_TIMER = 0x270A, - SMSG_PENDING_RAID_LOCK = 0x26F2, - SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0x2882, + SMSG_PAUSE_MIRROR_TIMER = 0x270B, + SMSG_PENDING_RAID_LOCK = 0x26F3, + SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0x2881, SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = 0x287D, - SMSG_PERKS_PROGRAM_DISABLED = 0x2883, - SMSG_PERKS_PROGRAM_RESULT = 0x287F, - SMSG_PERKS_PROGRAM_VENDOR_PENDING = 0x287E, + SMSG_PERKS_PROGRAM_DISABLED = 0x2882, + SMSG_PERKS_PROGRAM_RESULT = 0x287E, SMSG_PERKS_PROGRAM_VENDOR_UPDATE = 0x287C, SMSG_PETITION_ALREADY_SIGNED = 0x259E, SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29FA, - SMSG_PETITION_SHOW_LIST = 0x26B9, - SMSG_PETITION_SHOW_SIGNATURES = 0x26BA, - SMSG_PETITION_SIGN_RESULTS = 0x2745, - SMSG_PET_ACTION_FEEDBACK = 0x2742, - SMSG_PET_ACTION_SOUND = 0x269C, + SMSG_PETITION_SHOW_LIST = 0x26BA, + SMSG_PETITION_SHOW_SIGNATURES = 0x26BB, + SMSG_PETITION_SIGN_RESULTS = 0x2746, + SMSG_PET_ACTION_FEEDBACK = 0x2743, + SMSG_PET_ACTION_SOUND = 0x269D, SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2600, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2671, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2672, SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x25F9, SMSG_PET_BATTLE_FINAL_ROUND = 0x25FE, SMSG_PET_BATTLE_FINISHED = 0x25FF, @@ -1702,27 +1702,27 @@ enum OpcodeServer : uint16 SMSG_PET_BATTLE_INITIAL_UPDATE = 0x25FA, SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2601, SMSG_PET_BATTLE_PVP_CHALLENGE = 0x25F8, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2635, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x2636, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2636, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x2637, SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x25FD, SMSG_PET_BATTLE_REQUEST_FAILED = 0x25F7, SMSG_PET_BATTLE_ROUND_RESULT = 0x25FC, SMSG_PET_BATTLE_SLOT_UPDATES = 0x25EA, - SMSG_PET_CAST_FAILED = 0x2C58, - SMSG_PET_CLEAR_SPELLS = 0x2C21, - SMSG_PET_DISMISS_SOUND = 0x269D, - SMSG_PET_GOD_MODE = 0x2677, - SMSG_PET_GUIDS = 0x26FE, - SMSG_PET_LEARNED_SPELLS = 0x2C4F, + SMSG_PET_CAST_FAILED = 0x2C5A, + SMSG_PET_CLEAR_SPELLS = 0x2C23, + SMSG_PET_DISMISS_SOUND = 0x269E, + SMSG_PET_GOD_MODE = 0x2678, + SMSG_PET_GUIDS = 0x26FF, + SMSG_PET_LEARNED_SPELLS = 0x2C51, SMSG_PET_MODE = 0x2588, - SMSG_PET_NAME_INVALID = 0x26BE, + SMSG_PET_NAME_INVALID = 0x26BF, SMSG_PET_NEWLY_TAMED = 0x2587, - SMSG_PET_SPELLS_MESSAGE = 0x2C22, + SMSG_PET_SPELLS_MESSAGE = 0x2C24, SMSG_PET_STABLE_RESULT = 0x2592, - SMSG_PET_TAME_FAILURE = 0x26AE, - SMSG_PET_UNLEARNED_SPELLS = 0x2C50, + SMSG_PET_TAME_FAILURE = 0x26AF, + SMSG_PET_UNLEARNED_SPELLS = 0x2C52, SMSG_PHASE_SHIFT_CHANGE = 0x2578, - SMSG_PLAYED_TIME = 0x26D0, + SMSG_PLAYED_TIME = 0x26D1, SMSG_PLAYER_ACKOWLEDGE_ARROW_CALLOUT = 0x3022, SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x3014, SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x3013, @@ -1735,6 +1735,7 @@ enum OpcodeServer : uint16 SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x3009, SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x300E, SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F9, + SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = 0x3023, SMSG_PLAYER_SHOW_ARROW_CALLOUT = 0x3020, SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY = 0x301E, SMSG_PLAYER_SHOW_PARTY_POSE_UI = 0x301F, @@ -1742,26 +1743,26 @@ enum OpcodeServer : uint16 SMSG_PLAYER_SKINNED = 0x3006, SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x300D, SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x300C, - SMSG_PLAY_MUSIC = 0x2762, - SMSG_PLAY_OBJECT_SOUND = 0x2763, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x272A, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C47, - SMSG_PLAY_SCENE = 0x2632, - SMSG_PLAY_SOUND = 0x2761, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x2764, - SMSG_PLAY_SPELL_VISUAL = 0x2C45, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C49, - SMSG_PLAY_TIME_WARNING = 0x26F8, + SMSG_PLAY_MUSIC = 0x2763, + SMSG_PLAY_OBJECT_SOUND = 0x2764, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x272B, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C49, + SMSG_PLAY_SCENE = 0x2633, + SMSG_PLAY_SOUND = 0x2762, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x2765, + SMSG_PLAY_SPELL_VISUAL = 0x2C47, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C4B, + SMSG_PLAY_TIME_WARNING = 0x26F9, SMSG_PONG = 0x304E, - SMSG_POWER_UPDATE = 0x26CD, + SMSG_POWER_UPDATE = 0x26CE, SMSG_PRELOAD_CHILD_MAP = 0x2579, SMSG_PRELOAD_WORLD = 0x2594, SMSG_PREPOPULATE_NAME_CACHE = 0x283E, - SMSG_PRE_RESSURECT = 0x2760, + SMSG_PRE_RESSURECT = 0x2761, SMSG_PRINT_NOTIFICATION = 0x25C9, - SMSG_PROC_RESIST = 0x2754, + SMSG_PROC_RESIST = 0x2755, SMSG_PROFESSION_GOSSIP = 0x27F5, - SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C51, + SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C53, SMSG_PVP_CREDIT = 0x2946, SMSG_PVP_MATCH_COMPLETE = 0x2951, SMSG_PVP_MATCH_INITIALIZE = 0x2952, @@ -1785,7 +1786,7 @@ enum OpcodeServer : uint16 SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x3002, SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A96, SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0x29E6, - SMSG_QUERY_TIME_RESPONSE = 0x26DE, + SMSG_QUERY_TIME_RESPONSE = 0x26DF, SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81, SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8F, SMSG_QUEST_FORCE_REMOVED = 0x2A9C, @@ -1817,53 +1818,52 @@ enum OpcodeServer : uint16 SMSG_QUEUE_SUMMARY_UPDATE = 0x2808, SMSG_RAF_ACCOUNT_INFO = 0x284C, SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x285D, - SMSG_RAF_DEBUG_FRIEND_MONTHS = 0x28B4, - SMSG_RAID_DIFFICULTY_SET = 0x27A1, - SMSG_RAID_GROUP_ONLY = 0x27A3, + SMSG_RAF_DEBUG_FRIEND_MONTHS = 0x28B3, + SMSG_RAID_DIFFICULTY_SET = 0x27A2, + SMSG_RAID_GROUP_ONLY = 0x27A4, SMSG_RAID_INSTANCE_MESSAGE = 0x2BB4, SMSG_RAID_MARKERS_CHANGED = 0x259F, - SMSG_RANDOM_ROLL = 0x262C, + SMSG_RANDOM_ROLL = 0x262D, SMSG_RATED_PVP_INFO = 0x2931, SMSG_READY_CHECK_COMPLETED = 0x25F6, SMSG_READY_CHECK_RESPONSE = 0x25F5, SMSG_READY_CHECK_STARTED = 0x25F4, - SMSG_READ_ITEM_RESULT_FAILED = 0x279D, - SMSG_READ_ITEM_RESULT_OK = 0x2794, - SMSG_REALM_LOOKUP_INFO = 0x27C0, + SMSG_READ_ITEM_RESULT_FAILED = 0x279E, + SMSG_READ_ITEM_RESULT_OK = 0x2795, SMSG_REALM_QUERY_RESPONSE = 0x2913, - SMSG_REATTACH_RESURRECT = 0x2744, + SMSG_REATTACH_RESURRECT = 0x2745, SMSG_RECEIVE_PING_UNIT = 0x25A0, SMSG_RECEIVE_PING_WORLD_POINT = 0x25A1, - SMSG_RECRAFT_ITEM_RESULT = 0x28A3, - SMSG_RECRUIT_A_FRIEND_FAILURE = 0x26BB, - SMSG_REFRESH_COMPONENT = 0x264D, - SMSG_REFRESH_SPELL_HISTORY = 0x2C29, + SMSG_RECRAFT_ITEM_RESULT = 0x28A2, + SMSG_RECRUIT_A_FRIEND_FAILURE = 0x26BC, + SMSG_REFRESH_COMPONENT = 0x264E, + SMSG_REFRESH_SPELL_HISTORY = 0x2C2B, SMSG_REMOVE_ITEM_PASSIVE = 0x25AA, - SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x2C52, - SMSG_REPLACE_TROPHY_RESPONSE = 0x27B9, + SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x2C54, + SMSG_REPLACE_TROPHY_RESPONSE = 0x27BA, SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x3001, SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x258E, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x2936, SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x2937, SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, - SMSG_RESET_FAILED_NOTIFY = 0x26B2, - SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x28A9, + SMSG_RESET_FAILED_NOTIFY = 0x26B3, + SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x28A8, SMSG_RESET_QUEST_POI = 0x2AA0, SMSG_RESET_RANGED_COMBAT_TIMER = 0x2945, SMSG_RESET_WEEKLY_CURRENCY = 0x2575, - SMSG_RESPEC_WIPE_CONFIRM = 0x260F, + SMSG_RESPEC_WIPE_CONFIRM = 0x2610, SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2572, - SMSG_RESPONSE_PERK_PENDING_REWARDS = 0x2880, - SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0x2881, - SMSG_RESTART_GLOBAL_COOLDOWN = 0x2C61, + SMSG_RESPONSE_PERK_PENDING_REWARDS = 0x287F, + SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0x2880, + SMSG_RESTART_GLOBAL_COOLDOWN = 0x2C63, SMSG_RESTRICTED_ACCOUNT_WARNING = 0x25B8, - SMSG_RESUME_CAST = 0x2C3B, - SMSG_RESUME_CAST_BAR = 0x2C3E, + SMSG_RESUME_CAST = 0x2C3D, + SMSG_RESUME_CAST_BAR = 0x2C40, SMSG_RESUME_COMMS = 0x304B, SMSG_RESUME_TOKEN = 0x25A8, SMSG_RESURRECT_REQUEST = 0x257E, - SMSG_RESYNC_RUNES = 0x2C5F, - SMSG_RETURNING_PLAYER_PROMPT = 0x279C, + SMSG_RESYNC_RUNES = 0x2C61, + SMSG_RETURNING_PLAYER_PROMPT = 0x279D, SMSG_RETURN_APPLICANT_LIST = 0x2842, SMSG_RETURN_RECRUITING_CLUBS = 0x2841, SMSG_ROLE_CHANGED_INFORM = 0x258A, @@ -1872,12 +1872,12 @@ enum OpcodeServer : uint16 SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x27F4, SMSG_RUNE_REGEN_DEBUG = 0x25B5, SMSG_SCENARIO_COMPLETED = 0x27E2, - SMSG_SCENARIO_POIS = 0x262F, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x2628, + SMSG_SCENARIO_POIS = 0x2630, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x2629, SMSG_SCENARIO_SHOW_CRITERIA = 0x27F8, - SMSG_SCENARIO_STATE = 0x2627, + SMSG_SCENARIO_STATE = 0x2628, SMSG_SCENARIO_UI_UPDATE = 0x27F7, - SMSG_SCENARIO_VACATE = 0x279E, + SMSG_SCENARIO_VACATE = 0x279F, SMSG_SCENE_OBJECT_EVENT = 0x25E0, SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25E5, SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25E6, @@ -1885,163 +1885,164 @@ enum OpcodeServer : uint16 SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25E1, SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25E4, SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25E3, - SMSG_SCRIPT_CAST = 0x2C56, + SMSG_SCRIPT_CAST = 0x2C58, SMSG_SEASON_INFO = 0x25C0, - SMSG_SELL_RESPONSE = 0x26BF, + SMSG_SELL_RESPONSE = 0x26C0, SMSG_SEND_ITEM_PASSIVES = 0x25AB, - SMSG_SEND_KNOWN_SPELLS = 0x2C27, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x262A, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x262B, - SMSG_SEND_SPELL_CHARGES = 0x2C2A, - SMSG_SEND_SPELL_HISTORY = 0x2C28, - SMSG_SEND_UNLEARN_SPELLS = 0x2C2B, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x264A, - SMSG_SERVER_TIME = 0x267E, - SMSG_SERVER_TIME_OFFSET = 0x270E, + SMSG_SEND_KNOWN_SPELLS = 0x2C29, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x262B, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x262C, + SMSG_SEND_SPELL_CHARGES = 0x2C2C, + SMSG_SEND_SPELL_HISTORY = 0x2C2A, + SMSG_SEND_UNLEARN_SPELLS = 0x2C2D, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x264B, + SMSG_SERVER_TIME = 0x267F, + SMSG_SERVER_TIME_OFFSET = 0x270F, + SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = 0x2C1F, SMSG_SETUP_CURRENCY = 0x2573, - SMSG_SET_AI_ANIM_KIT = 0x2729, - SMSG_SET_ANIM_TIER = 0x272D, + SMSG_SET_AI_ANIM_KIT = 0x272A, + SMSG_SET_ANIM_TIER = 0x272E, SMSG_SET_CHR_UPGRADE_TIER = 0x25DD, SMSG_SET_CURRENCY = 0x2574, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, - SMSG_SET_DUNGEON_DIFFICULTY = 0x26A0, - SMSG_SET_FACTION_AT_WAR = 0x26FA, - SMSG_SET_FACTION_NOT_VISIBLE = 0x2724, - SMSG_SET_FACTION_STANDING = 0x2725, - SMSG_SET_FACTION_VISIBLE = 0x2723, - SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, - SMSG_SET_FORCED_REACTIONS = 0x2717, + SMSG_SET_DUNGEON_DIFFICULTY = 0x26A1, + SMSG_SET_FACTION_AT_WAR = 0x26FB, + SMSG_SET_FACTION_NOT_VISIBLE = 0x2725, + SMSG_SET_FACTION_STANDING = 0x2726, + SMSG_SET_FACTION_VISIBLE = 0x2724, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C38, + SMSG_SET_FORCED_REACTIONS = 0x2718, SMSG_SET_ITEM_PURCHASE_DATA = 0x259A, SMSG_SET_LOOT_METHOD_FAILED = 0x27C6, SMSG_SET_MAX_WEEKLY_QUANTITY = 0x259D, - SMSG_SET_MELEE_ANIM_KIT = 0x272C, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x272B, - SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, - SMSG_SET_PET_SPECIALIZATION = 0x2621, + SMSG_SET_MELEE_ANIM_KIT = 0x272D, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x272C, + SMSG_SET_PCT_SPELL_MODIFIER = 0x2C39, + SMSG_SET_PET_SPECIALIZATION = 0x2622, SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x3003, SMSG_SET_PLAY_HOVER_ANIM = 0x25B9, - SMSG_SET_PROFICIENCY = 0x272E, + SMSG_SET_PROFICIENCY = 0x272F, SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x2855, SMSG_SET_SHIPMENT_READY_RESPONSE = 0x2998, - SMSG_SET_SPELL_CHARGES = 0x2C26, - SMSG_SET_TIME_ZONE_INFORMATION = 0x2673, - SMSG_SET_VEHICLE_REC_ID = 0x26F1, - SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x2885, + SMSG_SET_SPELL_CHARGES = 0x2C28, + SMSG_SET_TIME_ZONE_INFORMATION = 0x2674, + SMSG_SET_VEHICLE_REC_ID = 0x26F2, + SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x2884, SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x2999, SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25D9, SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x2A95, - SMSG_SHOW_TAXI_NODES = 0x26C8, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x2769, - SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x2890, - SMSG_SOCKET_GEMS_FAILURE = 0x2721, - SMSG_SOCKET_GEMS_SUCCESS = 0x2720, - SMSG_SPECIAL_MOUNT_ANIM = 0x269B, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2712, + SMSG_SHOW_TAXI_NODES = 0x26C9, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x276A, + SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x288F, + SMSG_SOCKET_GEMS_FAILURE = 0x2722, + SMSG_SOCKET_GEMS_SUCCESS = 0x2721, + SMSG_SPECIAL_MOUNT_ANIM = 0x269C, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2713, SMSG_SPELL_ABSORB_LOG = 0x2C1C, SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C16, - SMSG_SPELL_CHANNEL_START = 0x2C31, - SMSG_SPELL_CHANNEL_UPDATE = 0x2C32, + SMSG_SPELL_CHANNEL_START = 0x2C33, + SMSG_SPELL_CHANNEL_UPDATE = 0x2C34, SMSG_SPELL_COOLDOWN = 0x2C15, - SMSG_SPELL_DAMAGE_SHIELD = 0x2C2E, - SMSG_SPELL_DELAYED = 0x2C3F, + SMSG_SPELL_DAMAGE_SHIELD = 0x2C30, + SMSG_SPELL_DELAYED = 0x2C41, SMSG_SPELL_DISPELL_LOG = 0x2C17, - SMSG_SPELL_EMPOWER_SET_STAGE = 0x2C35, - SMSG_SPELL_EMPOWER_START = 0x2C33, - SMSG_SPELL_EMPOWER_UPDATE = 0x2C34, + SMSG_SPELL_EMPOWER_SET_STAGE = 0x2C37, + SMSG_SPELL_EMPOWER_START = 0x2C35, + SMSG_SPELL_EMPOWER_UPDATE = 0x2C36, SMSG_SPELL_ENERGIZE_LOG = 0x2C19, - SMSG_SPELL_EXECUTE_LOG = 0x2C40, - SMSG_SPELL_FAILED_OTHER = 0x2C55, - SMSG_SPELL_FAILURE = 0x2C53, - SMSG_SPELL_FAILURE_MESSAGE = 0x2C5A, - SMSG_SPELL_GO = 0x2C39, + SMSG_SPELL_EXECUTE_LOG = 0x2C42, + SMSG_SPELL_FAILED_OTHER = 0x2C57, + SMSG_SPELL_FAILURE = 0x2C55, + SMSG_SPELL_FAILURE_MESSAGE = 0x2C5C, + SMSG_SPELL_GO = 0x2C3B, SMSG_SPELL_HEAL_ABSORB_LOG = 0x2C1B, SMSG_SPELL_HEAL_LOG = 0x2C1A, - SMSG_SPELL_INSTAKILL_LOG = 0x2C30, + SMSG_SPELL_INSTAKILL_LOG = 0x2C32, SMSG_SPELL_INTERRUPT_LOG = 0x2C1D, - SMSG_SPELL_MISS_LOG = 0x2C41, - SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x2C2F, - SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x2C2C, + SMSG_SPELL_MISS_LOG = 0x2C43, + SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x2C31, + SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x2C2E, SMSG_SPELL_PERIODIC_AURA_LOG = 0x2C18, - SMSG_SPELL_PREPARE = 0x2C38, - SMSG_SPELL_START = 0x2C3A, + SMSG_SPELL_PREPARE = 0x2C3A, + SMSG_SPELL_START = 0x2C3C, SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x25CB, SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x2867, - SMSG_STAND_STATE_UPDATE = 0x2716, + SMSG_STAND_STATE_UPDATE = 0x2717, SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0x25D1, SMSG_START_ELAPSED_TIMER = 0x2602, SMSG_START_ELAPSED_TIMERS = 0x2604, - SMSG_START_LIGHTNING_STORM = 0x26A3, - SMSG_START_LOOT_ROLL = 0x2619, - SMSG_START_MIRROR_TIMER = 0x2709, + SMSG_START_LIGHTNING_STORM = 0x26A4, + SMSG_START_LOOT_ROLL = 0x261A, + SMSG_START_MIRROR_TIMER = 0x270A, SMSG_START_TIMER = 0x25A4, SMSG_STOP_ELAPSED_TIMER = 0x2603, - SMSG_STOP_MIRROR_TIMER = 0x270B, - SMSG_STOP_SPEAKERBOT_SOUND = 0x2765, + SMSG_STOP_MIRROR_TIMER = 0x270C, + SMSG_STOP_SPEAKERBOT_SOUND = 0x2766, SMSG_STOP_TIMER = 0x25A5, SMSG_STREAMING_MOVIES = 0x25A3, - SMSG_SUGGEST_INVITE_INFORM = 0x278A, - SMSG_SUMMON_CANCEL = 0x26AC, + SMSG_SUGGEST_INVITE_INFORM = 0x278B, + SMSG_SUMMON_CANCEL = 0x26AD, SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258C, - SMSG_SUMMON_REQUEST = 0x271B, - SMSG_SUPERCEDED_SPELLS = 0x2C4C, + SMSG_SUMMON_REQUEST = 0x271C, + SMSG_SUPERCEDED_SPELLS = 0x2C4E, SMSG_SUSPEND_COMMS = 0x304A, SMSG_SUSPEND_TOKEN = 0x25A7, SMSG_SYNC_WOW_ENTITLEMENTS = 0x285F, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2711, - SMSG_TAXI_NODE_STATUS = 0x2678, - SMSG_TEXT_EMOTE = 0x2676, - SMSG_THREAT_CLEAR = 0x26D7, - SMSG_THREAT_REMOVE = 0x26D6, - SMSG_THREAT_UPDATE = 0x26D5, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2712, + SMSG_TAXI_NODE_STATUS = 0x2679, + SMSG_TEXT_EMOTE = 0x2677, + SMSG_THREAT_CLEAR = 0x26D8, + SMSG_THREAT_REMOVE = 0x26D7, + SMSG_THREAT_UPDATE = 0x26D6, SMSG_TIME_ADJUSTMENT = 0x2DD3, SMSG_TIME_SYNC_REQUEST = 0x2DD2, - SMSG_TITLE_EARNED = 0x26D2, - SMSG_TITLE_LOST = 0x26D3, - SMSG_TOTEM_CREATED = 0x26C2, - SMSG_TOTEM_DURATION_CHANGED = 0x26C4, - SMSG_TOTEM_MOVED = 0x26C5, - SMSG_TOTEM_REMOVED = 0x26C3, + SMSG_TITLE_EARNED = 0x26D3, + SMSG_TITLE_LOST = 0x26D4, + SMSG_TOTEM_CREATED = 0x26C3, + SMSG_TOTEM_DURATION_CHANGED = 0x26C5, + SMSG_TOTEM_MOVED = 0x26C6, + SMSG_TOTEM_REMOVED = 0x26C4, SMSG_TRADE_STATUS = 0x2582, SMSG_TRADE_UPDATED = 0x2581, - SMSG_TRAINER_BUY_FAILED = 0x26DA, - SMSG_TRAINER_LIST = 0x26D9, + SMSG_TRAINER_BUY_FAILED = 0x26DB, + SMSG_TRAINER_LIST = 0x26DA, SMSG_TRAIT_CONFIG_COMMIT_FAILED = 0x25D0, - SMSG_TRANSFER_ABORTED = 0x26FD, + SMSG_TRANSFER_ABORTED = 0x26FE, SMSG_TRANSFER_PENDING = 0x25CC, SMSG_TREASURE_PICKER_RESPONSE = 0x291F, - SMSG_TRIGGER_CINEMATIC = 0x27BE, - SMSG_TRIGGER_MOVIE = 0x26C6, - SMSG_TURN_IN_PETITION_RESULT = 0x2747, - SMSG_TUTORIAL_FLAGS = 0x27B2, + SMSG_TRIGGER_CINEMATIC = 0x27BF, + SMSG_TRIGGER_MOVIE = 0x26C7, + SMSG_TURN_IN_PETITION_RESULT = 0x2748, + SMSG_TUTORIAL_FLAGS = 0x27B3, SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x2AA2, SMSG_UNDELETE_CHARACTER_RESPONSE = 0x27C1, SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x27C2, - SMSG_UNLEARNED_SPELLS = 0x2C4E, + SMSG_UNLEARNED_SPELLS = 0x2C50, SMSG_UNLOAD_CHILD_MAP = 0x257A, SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x2879, - SMSG_UPDATE_ACCOUNT_DATA = 0x2703, + SMSG_UPDATE_ACCOUNT_DATA = 0x2704, SMSG_UPDATE_ACTION_BUTTONS = 0x25DE, SMSG_UPDATE_BNET_SESSION_KEY = 0x2819, SMSG_UPDATE_CAPTURE_POINT = 0x2929, SMSG_UPDATE_CELESTIAL_BODY = 0x2815, - SMSG_UPDATE_CHARACTER_FLAGS = 0x27B8, - SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x275F, - SMSG_UPDATE_COOLDOWN = 0x275E, + SMSG_UPDATE_CHARACTER_FLAGS = 0x27B9, + SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x2760, + SMSG_UPDATE_COOLDOWN = 0x275F, SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x2996, SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x297F, - SMSG_UPDATE_EXPANSION_LEVEL = 0x2642, + SMSG_UPDATE_EXPANSION_LEVEL = 0x2643, SMSG_UPDATE_GAME_TIME_STATE = 0x281C, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26A5, - SMSG_UPDATE_LAST_INSTANCE = 0x2684, - SMSG_UPDATE_OBJECT = 0x27BF, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26A6, + SMSG_UPDATE_LAST_INSTANCE = 0x2685, + SMSG_UPDATE_OBJECT = 0x27C0, SMSG_UPDATE_PRIMARY_SPEC = 0x25D6, SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x25F3, SMSG_UPDATE_TALENT_DATA = 0x25D5, - SMSG_UPDATE_WORLD_STATE = 0x2741, + SMSG_UPDATE_WORLD_STATE = 0x2742, SMSG_USERLIST_ADD = 0x2BB9, SMSG_USERLIST_REMOVE = 0x2BBA, SMSG_USERLIST_UPDATE = 0x2BBB, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x2748, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x2749, SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x2810, SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x280E, SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x280D, @@ -2062,22 +2063,22 @@ enum OpcodeServer : uint16 SMSG_WARDEN3_DATA = 0x2577, SMSG_WARDEN3_DISABLED = 0x2817, SMSG_WARDEN3_ENABLED = 0x2816, - SMSG_WARFRONT_COMPLETE = 0x2757, + SMSG_WARFRONT_COMPLETE = 0x2758, SMSG_WARGAME_REQUEST_OPPONENT_RESPONSE = 0x2934, SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x2933, - SMSG_WEATHER = 0x26A2, + SMSG_WEATHER = 0x26A3, SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x286A, SMSG_WEEKLY_REWARDS_RESULT = 0x2868, SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x2869, SMSG_WHO = 0x2BAE, - SMSG_WHO_IS = 0x26A1, + SMSG_WHO_IS = 0x26A2, SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x281B, SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x300F, SMSG_WORLD_SERVER_INFO = 0x25AC, SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x2860, - SMSG_XP_AWARDED_FROM_CURRENCY = 0x28A8, + SMSG_XP_AWARDED_FROM_CURRENCY = 0x28A7, SMSG_XP_GAIN_ABORTED = 0x25C8, - SMSG_XP_GAIN_ENABLED = 0x27A2, + SMSG_XP_GAIN_ENABLED = 0x27A3, SMSG_ZONE_UNDER_ATTACK = 0x2BB5, // Opcodes that are not generated automatically diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index fd89dd9c16f..a2ffeac9577 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -66,6 +66,7 @@ enum class AuctionCommand : int8; enum class AuctionResult : int8; enum InventoryResult : uint8; enum class StableResult : uint8; +enum class TabardVendorType : int32; namespace BattlePets { @@ -268,6 +269,7 @@ namespace WorldPackets class SetFactionInactive; class SetWatchedFaction; class SetPlayerDeclinedNames; + class SavePersonalEmblem; enum class LoginFailureReason : uint8; } @@ -545,6 +547,7 @@ namespace WorldPackets class Hello; class GossipSelectOption; class SpiritHealerActivate; + class TabardVendorActivate; class TrainerBuySpell; class RequestStabledPets; class SetPetSlot; @@ -1056,7 +1059,7 @@ class TC_GAME_API WorldSession void SendShowBank(ObjectGuid guid); bool CanOpenMailBox(ObjectGuid guid); void SendShowMailBox(ObjectGuid guid); - void SendTabardVendorActivate(ObjectGuid guid); + void SendTabardVendorActivate(ObjectGuid guid, TabardVendorType type); void SendSpiritResurrect(); void SendBindPoint(Creature* npc); void SendOpenTransmogrifier(ObjectGuid const& guid); @@ -1201,6 +1204,7 @@ class TC_GAME_API WorldSession void HandleGetUndeleteCooldownStatus(WorldPackets::Character::GetUndeleteCharacterCooldownStatus& /*getCooldown*/); void HandleUndeleteCooldownStatusCallback(PreparedQueryResult result); void HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCharacter& undeleteInfo); + void HandleSavePersonalEmblem(WorldPackets::Character::SavePersonalEmblem const& savePersonalEmblem); bool MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, Races race, Classes playerClass, bool checkRequiredDependentChoices, Trinity::IteratorPair<UF::ChrCustomizationChoice const*> selectedChoices) const; bool ValidateAppearance(Races race, Classes playerClass, Gender gender, @@ -1401,7 +1405,7 @@ class TC_GAME_API WorldSession void SendActivateTaxiReply(ActivateTaxiReply reply); void HandleTaxiRequestEarlyLanding(WorldPackets::Taxi::TaxiRequestEarlyLanding& taxiRequestEarlyLanding); - void HandleTabardVendorActivateOpcode(WorldPackets::NPC::Hello& packet); + void HandleTabardVendorActivateOpcode(WorldPackets::NPC::TabardVendorActivate const& tabardVendorActivate); void HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet); void HandleTrainerListOpcode(WorldPackets::NPC::Hello& packet); void HandleTrainerBuySpellOpcode(WorldPackets::NPC::TrainerBuySpell& packet); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 08a064b51eb..2fe40981c7a 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -635,6 +635,7 @@ enum AuraType : uint32 SPELL_AURA_MOD_REQUIRED_MOUNT_CAPABILITY_FLAGS = 541, SPELL_AURA_542 = 542, SPELL_AURA_543 = 543, + SPELL_AURA_544 = 544, TOTAL_AURAS }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index f33d2313a63..b5da0699a0e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -611,6 +611,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleModRequiredMountCapabilityFlags, //541 SPELL_AURA_MOD_REQUIRED_MOUNT_CAPABILITY_FLAGS &AuraEffect::HandleNULL, //542 &AuraEffect::HandleNULL, //543 + &AuraEffect::HandleNULL, //544 }; AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster) : diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index c7d020f20ec..87c4f3a93d2 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -3365,11 +3365,15 @@ uint32 World::ShutdownCancel() } /// Send a server message to the user(s) -void World::SendServerMessage(ServerMessageType messageID, std::string stringParam /*= ""*/, Player* player /*= nullptr*/) +void World::SendServerMessage(ServerMessageType messageID, std::string_view stringParam /*= {}*/, Player const* player /*= nullptr*/) { + ServerMessagesEntry const* serverMessage = sServerMessagesStore.LookupEntry(messageID); + if (!serverMessage) + return; + WorldPackets::Chat::ChatServerMessage chatServerMessage; chatServerMessage.MessageID = int32(messageID); - if (messageID <= SERVER_MSG_STRING) + if (strstr(serverMessage->Text[player->GetSession()->GetSessionDbcLocale()], "%s")) chatServerMessage.StringParam = stringParam; if (player) diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 7281cff64b1..ffc41ac0bce 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -643,7 +643,7 @@ class TC_GAME_API World void SendWorldText(uint32 string_id, ...); void SendGlobalText(char const* text, WorldSession* self); void SendGMText(uint32 string_id, ...); - void SendServerMessage(ServerMessageType messageID, std::string stringParam = "", Player* player = nullptr); + void SendServerMessage(ServerMessageType messageID, std::string_view stringParam = {}, Player const* player = nullptr); void SendGlobalMessage(WorldPacket const* packet, WorldSession* self = nullptr, uint32 team = 0); void SendGlobalGMMessage(WorldPacket const* packet, WorldSession* self = nullptr, uint32 team = 0); bool SendZoneMessage(uint32 zone, WorldPacket const* packet, WorldSession* self = nullptr, uint32 team = 0); diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h index 3cb50dea4c9..747d5774301 100644 --- a/src/tools/map_extractor/loadlib/DBFilesClientList.h +++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h @@ -162,6 +162,7 @@ DB2FileInfo const DBFilesClientList[] = { 3671168, "ChrCreateClassAnimTarget.db2" }, { 3671169, "ChrCreateClassAnimTargetInfo.db2" }, { 3590348, "ChrCustClientChoiceConversion.db2" }, + { 5387095, "ChrCustGeoComponentLink.db2" }, { 3952714, "ChrCustItemGeoModify.db2" }, { 1611874, "ChrCustomization.db2" }, { 3460181, "ChrCustomizationBoneSet.db2" }, @@ -214,6 +215,7 @@ DB2FileInfo const DBFilesClientList[] = { 1278239, "ComponentTextureFileData.db2" }, { 5211412, "ConditionalChrModel.db2" }, { 3501965, "ConditionalContentTuning.db2" }, + { 5345180, "ConditionalItemAppearance.db2" }, { 1709409, "ConfigurationWarning.db2" }, { 4668112, "ContentRestrictionRule.db2" }, { 4281307, "ContentRestrictionRuleSet.db2" }, @@ -459,6 +461,7 @@ DB2FileInfo const DBFilesClientList[] = { 801681, "ItemExtendedCost.db2" }, { 2358574, "ItemFallbackVisual.db2" }, { 5152256, "ItemFixup.db2" }, + { 5475699, "ItemFixupAction.db2" }, { 5015219, "ItemGroupIlvlScalingEntry.db2" }, { 1283023, "ItemGroupSounds.db2" }, { 1588911, "ItemLevelSelector.db2" }, @@ -578,6 +581,7 @@ DB2FileInfo const DBFilesClientList[] = { 1339819, "MovieVariation.db2" }, { 1965592, "MultiStateProperties.db2" }, { 1965589, "MultiTransitionProperties.db2" }, + { 5161908, "MusicOverride.db2" }, { 2400282, "MythicPlusSeason.db2" }, { 2123783, "MythicPlusSeasonRewardLevels.db2" }, { 4067473, "MythicPlusSeasonTrackedAffix.db2" }, @@ -623,8 +627,10 @@ DB2FileInfo const DBFilesClientList[] = { 5330797, "PerksActivityXHolidays.db2" }, { 4519781, "PerksActivityXInterval.db2" }, { 4694318, "PerksActivityXTag.db2" }, + { 5389878, "PerksUITheme.db2" }, { 4281310, "PerksVendorCategory.db2" }, { 4281311, "PerksVendorItem.db2" }, + { 5386256, "PerksVendorItemUIGroup.db2" }, { 4281312, "PerksVendorItemUIInfo.db2" }, { 4872513, "PerksVendorItemXInterval.db2" }, { 1348558, "Phase.db2" }, @@ -926,6 +932,7 @@ DB2FileInfo const DBFilesClientList[] = { 3448518, "UiQuestDetailsTheme.db2" }, { 897470, "UiTextureAtlas.db2" }, { 1989276, "UiTextureAtlasElement.db2" }, + { 5319042, "UiTextureAtlasElementSliceData.db2" }, { 897532, "UiTextureAtlasMember.db2" }, { 939159, "UiTextureKit.db2" }, { 4737221, "UiWeeklyReward.db2" }, @@ -967,12 +974,14 @@ DB2FileInfo const DBFilesClientList[] = { 1239842, "WeaponTrailParam.db2" }, { 1343311, "Weather.db2" }, { 1965591, "WeatherXParticulate.db2" }, + { 5390446, "WeeklyRewardChestActivityTier.db2" }, { 3580962, "WeeklyRewardChestThreshold.db2" }, { 943871, "WindSettings.db2" }, { 975279, "WorldBossLockout.db2" }, { 1267069, "WorldChunkSounds.db2" }, { 1343312, "WorldEffect.db2" }, { 1135240, "WorldElapsedTimer.db2" }, + { 4550228, "WorldLayerMapSet.db2" }, { 1134579, "WorldMapOverlay.db2" }, { 1957212, "WorldMapOverlayTile.db2" }, { 4680120, "WorldShadow.db2" }, |