diff options
Diffstat (limited to 'src/server')
83 files changed, 6423 insertions, 1962 deletions
diff --git a/src/server/bnetserver/Server/Session.cpp b/src/server/bnetserver/Server/Session.cpp index 14839b90287..8541fc4650e 100644 --- a/src/server/bnetserver/Server/Session.cpp +++ b/src/server/bnetserver/Server/Session.cpp @@ -266,14 +266,20 @@ uint32 Battlenet::Session::HandleGenerateWebCredentials(authentication::v1::Gene      if (!_authed)          return ERROR_DENIED; -    if (request->program() != 0x576F57) +    switch (request->program())      { -        auto asPrintable = [](char c) { return std::isprint(c) ? c : ' '; }; +        case 0x417070: // App +        case 0x576F57: // WoW +            break; +        default: +        { +            auto asPrintable = [](char c) { return std::isprint(c) ? c : ' '; }; -        TC_LOG_DEBUG("session", "[Battlenet::HandleGenerateWebCredentials] {} attempted to generate web cretentials with game other than WoW (using {}{}{}{})!", -            GetClientInfo(), asPrintable((request->program() >> 24) & 0xFF), asPrintable((request->program() >> 16) & 0xFF), -            asPrintable((request->program() >> 8) & 0xFF), asPrintable(request->program() & 0xFF)); -        return ERROR_BAD_PROGRAM; +            TC_LOG_DEBUG("session", "[Battlenet::HandleGenerateWebCredentials] {} attempted to generate web cretentials with game other than WoW (using {}{}{}{})!", +                GetClientInfo(), asPrintable((request->program() >> 24) & 0xFF), asPrintable((request->program() >> 16) & 0xFF), +                asPrintable((request->program() >> 8) & 0xFF), asPrintable(request->program() & 0xFF)); +            return ERROR_BAD_PROGRAM; +        }      }      LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_EXISTING_AUTHENTICATION_BY_ID); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index e04b164acf3..e1cddf23076 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -51,13 +51,13 @@ 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 AS cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +                     "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level AS cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.createTime, 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 AS cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +                     "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level AS cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.createTime, 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 " @@ -67,13 +67,13 @@ void CharacterDatabaseConnection::DoPrepareStatements()      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 AS cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +                     "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level AS cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.createTime, 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 as cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " +                     "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level as cpLevel, c.equipmentCache, cb.guid AS cbGuid, c.slot, c.createTime, 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 " @@ -677,8 +677,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()      PrepareStatement(CHAR_INS_CHAR_TRAIT_ENTRIES, "INSERT INTO character_trait_entry (guid, traitConfigId, traitNodeId, traitNodeEntryId, `rank`) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);      PrepareStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES, "DELETE FROM character_trait_entry WHERE guid = ? AND traitConfigId = ?", CONNECTION_ASYNC);      PrepareStatement(CHAR_DEL_CHAR_TRAIT_ENTRIES_BY_CHAR, "DELETE FROM character_trait_entry WHERE guid = ?", CONNECTION_ASYNC); -    PrepareStatement(CHAR_SEL_CHAR_TRAIT_CONFIGS, "SELECT traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, `name` FROM character_trait_config WHERE guid = ?", CONNECTION_ASYNC); -    PrepareStatement(CHAR_INS_CHAR_TRAIT_CONFIGS, "INSERT INTO character_trait_config (guid, traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, `name`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); +    PrepareStatement(CHAR_SEL_CHAR_TRAIT_CONFIGS, "SELECT traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, variationId, `name` FROM character_trait_config WHERE guid = ?", CONNECTION_ASYNC); +    PrepareStatement(CHAR_INS_CHAR_TRAIT_CONFIGS, "INSERT INTO character_trait_config (guid, traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, variationId, `name`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);      PrepareStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS, "DELETE FROM character_trait_config WHERE guid = ? AND traitConfigId = ?", CONNECTION_ASYNC);      PrepareStatement(CHAR_DEL_CHAR_TRAIT_CONFIGS_BY_CHAR, "DELETE FROM character_trait_config WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index d1842b927be..330300d2105 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -465,8 +465,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()      // ContentTuning.db2      PrepareStatement(HOTFIX_SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, HealthItemLevelCurveID, DamageItemLevelCurveID, " -        "HealthPrimaryStatCurveID, DamagePrimaryStatCurveID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, TargetLevelMaxDelta, " -        "TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +        "HealthPrimaryStatCurveID, DamagePrimaryStatCurveID, PrimaryStatScalingModPlayerDataElementCharacterID, " +        "PrimaryStatScalingModPlayerDataElementCharacterMultiplier, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, " +        "TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_CONTENT_TUNING, "SELECT MAX(ID) + 1 FROM content_tuning", CONNECTION_SYNCH);      // ContentTuningXExpected.db2 @@ -902,8 +903,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()      // ItemBonusTreeNode.db2      PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, ItemContext, ChildItemBonusTreeID, ChildItemBonusListID, ChildItemLevelSelectorID, " -        "ChildItemBonusListGroupID, IblGroupPointsModSetID, MinMythicPlusLevel, MaxMythicPlusLevel, ParentItemBonusTreeID FROM item_bonus_tree_node" -        " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +        "ChildItemBonusListGroupID, IblGroupPointsModSetID, MinMythicPlusLevel, MaxMythicPlusLevel, ItemCreationContextGroupID, Flags, " +        "ParentItemBonusTreeID FROM item_bonus_tree_node WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT MAX(ID) + 1 FROM item_bonus_tree_node", CONNECTION_SYNCH);      // ItemChildEquipment.db2 @@ -921,6 +922,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()          "ItemContextPickerID FROM item_context_picker_entry WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_CONTEXT_PICKER_ENTRY, "SELECT MAX(ID) + 1 FROM item_context_picker_entry", CONNECTION_SYNCH); +    // ItemCreationContext.db2 +    PrepareStatement(HOTFIX_SEL_ITEM_CREATION_CONTEXT, "SELECT ID, ItemContext, ItemCreationContextGroupID FROM item_creation_context" +        " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +    PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_CREATION_CONTEXT, "SELECT MAX(ID) + 1 FROM item_creation_context", CONNECTION_SYNCH); +      // ItemCurrencyCost.db2      PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemID FROM item_currency_cost WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT MAX(ID) + 1 FROM item_currency_cost", CONNECTION_SYNCH); @@ -1009,10 +1015,19 @@ void HotfixDatabaseConnection::DoPrepareStatements()      PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_NAME_DESCRIPTION, "SELECT ID, Description_lang FROM item_name_description_locale"          " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); +    // ItemOffsetCurve.db2 +    PrepareStatement(HOTFIX_SEL_ITEM_OFFSET_CURVE, "SELECT ID, CurveID, Offset FROM item_offset_curve WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +    PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_OFFSET_CURVE, "SELECT MAX(ID) + 1 FROM item_offset_curve", CONNECTION_SYNCH); +      // ItemPriceBase.db2      PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT MAX(ID) + 1 FROM item_price_base", CONNECTION_SYNCH); +    // ItemScalingConfig.db2 +    PrepareStatement(HOTFIX_SEL_ITEM_SCALING_CONFIG, "SELECT ID, ItemOffsetCurveID, ItemLevel, RequiredLevel, Unknown1125 FROM item_scaling_config" +        " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +    PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SCALING_CONFIG, "SELECT MAX(ID) + 1 FROM item_scaling_config", CONNECTION_SYNCH); +      // ItemSearchName.db2      PrepareStatement(HOTFIX_SEL_ITEM_SEARCH_NAME, "SELECT ID, AllowableRace, Display, OverallQualityID, ExpansionID, MinFactionID, MinReputation, "          "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4, Flags5" @@ -1042,12 +1057,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()          "StatPercentEditor10, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, "          "StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, Stackable, "          "MaxCount, MinReputation, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, " -        "Flags4, Flags5, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " -        "RequiredTransmogHoliday, RequiredHoliday, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, " -        "ItemSet, LockID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ArtifactID, SpellWeight, " -        "SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, Bonding, DamageDamageType, " -        "ContainerSlots, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse" -        " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +        "Flags4, Flags5, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemLevelOffsetCurveID, " +        "ItemLevelOffsetItemLevel, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, GemProperties, SocketMatchEnchantmentId, " +        "TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, " +        "ItemLevel, AllowableClass, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, " +        "PageMaterialID, Bonding, DamageDamageType, ContainerSlots, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, " +        "OverallQualityID FROM item_sparse WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT MAX(ID) + 1 FROM item_sparse", CONNECTION_SYNCH);      PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang"          " FROM item_sparse_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); @@ -1324,22 +1339,22 @@ void HotfixDatabaseConnection::DoPrepareStatements()          " AND locale = ?", CONNECTION_SYNCH);      // PlayerDataElementAccount.db2 -    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_ELEMENT_ACCOUNT, "SELECT ID, StorageIndex, Type FROM player_data_element_account" +    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_ELEMENT_ACCOUNT, "SELECT ID, StorageIndex, Type, Unknown1125 FROM player_data_element_account"          " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_PLAYER_DATA_ELEMENT_ACCOUNT, "SELECT MAX(ID) + 1 FROM player_data_element_account", CONNECTION_SYNCH);      // PlayerDataElementCharacter.db2 -    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_ELEMENT_CHARACTER, "SELECT ID, StorageIndex, Type FROM player_data_element_character" +    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_ELEMENT_CHARACTER, "SELECT ID, StorageIndex, Type, Unknown1125 FROM player_data_element_character"          " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_PLAYER_DATA_ELEMENT_CHARACTER, "SELECT MAX(ID) + 1 FROM player_data_element_character", CONNECTION_SYNCH);      // PlayerDataFlagAccount.db2 -    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_FLAG_ACCOUNT, "SELECT ID, StorageIndex, Unknown1107 FROM player_data_flag_account" +    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_FLAG_ACCOUNT, "SELECT ID, StorageIndex, Unknown1107, Unknown1125 FROM player_data_flag_account"          " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_PLAYER_DATA_FLAG_ACCOUNT, "SELECT MAX(ID) + 1 FROM player_data_flag_account", CONNECTION_SYNCH);      // PlayerDataFlagCharacter.db2 -    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_FLAG_CHARACTER, "SELECT ID, StorageIndex, Unknown1107 FROM player_data_flag_character" +    PrepareStatement(HOTFIX_SEL_PLAYER_DATA_FLAG_CHARACTER, "SELECT ID, StorageIndex, Unknown1107, Unknown1125 FROM player_data_flag_character"          " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_PLAYER_DATA_FLAG_CHARACTER, "SELECT MAX(ID) + 1 FROM player_data_flag_character", CONNECTION_SYNCH); @@ -1832,11 +1847,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()      PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_COND, "SELECT MAX(ID) + 1 FROM trait_cond", CONNECTION_SYNCH);      // TraitCost.db2 -    PrepareStatement(HOTFIX_SEL_TRAIT_COST, "SELECT InternalName, ID, Amount, TraitCurrencyID FROM trait_cost WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +    PrepareStatement(HOTFIX_SEL_TRAIT_COST, "SELECT InternalName, ID, Amount, TraitCurrencyID, CurveID FROM trait_cost WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_COST, "SELECT MAX(ID) + 1 FROM trait_cost", CONNECTION_SYNCH);      // TraitCurrency.db2 -    PrepareStatement(HOTFIX_SEL_TRAIT_CURRENCY, "SELECT ID, Type, CurrencyTypesID, Flags, Icon FROM trait_currency WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +    PrepareStatement(HOTFIX_SEL_TRAIT_CURRENCY, "SELECT ID, Type, CurrencyTypesID, Flags, Icon, PlayerDataElementAccountID, " +        "PlayerDataElementCharacterID FROM trait_currency WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_CURRENCY, "SELECT MAX(ID) + 1 FROM trait_currency", CONNECTION_SYNCH);      // TraitCurrencySource.db2 @@ -1924,6 +1940,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()      PREPARE_LOCALE_STMT(HOTFIX_SEL_TRAIT_SUB_TREE, "SELECT ID, Name_lang, Description_lang FROM trait_sub_tree_locale WHERE (`VerifiedBuild` > 0) = ?"          " AND locale = ?", CONNECTION_SYNCH); +    // TraitSystem.db2 +    PrepareStatement(HOTFIX_SEL_TRAIT_SYSTEM, "SELECT ID, Flags, WidgetSetID, TraitChangeSpell, ItemID, VariationType FROM trait_system" +        " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +    PREPARE_MAX_ID_STMT(HOTFIX_SEL_TRAIT_SYSTEM, "SELECT MAX(ID) + 1 FROM trait_system", CONNECTION_SYNCH); +      // TraitTree.db2      PrepareStatement(HOTFIX_SEL_TRAIT_TREE, "SELECT ID, TraitSystemID, Unused1000_1, FirstTraitNodeID, PlayerConditionID, Flags, Unused1000_2, "          "Unused1000_3 FROM trait_tree WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); @@ -1990,7 +2011,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()      // UiMapAssignment.db2      PrepareStatement(HOTFIX_SEL_UI_MAP_ASSIGNMENT, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, Region1X, Region1Y, Region1Z, Region2X, Region2Y, " -        "Region2Z, ID, UiMapID, OrderIndex, MapID, AreaID, WmoDoodadPlacementID, WmoGroupID FROM ui_map_assignment WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); +        "Region2Z, ID, UiMapID, OrderIndex, MapID, AreaID, WmoDoodadPlacementID, WmoGroupID, Unknown1125 FROM ui_map_assignment" +        " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);      PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_MAP_ASSIGNMENT, "SELECT MAX(ID) + 1 FROM ui_map_assignment", CONNECTION_SYNCH);      // UiMapLink.db2 diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 3ac94d32d7a..54feaec54ae 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -532,6 +532,9 @@ enum HotfixDatabaseStatements : uint32      HOTFIX_SEL_ITEM_CONTEXT_PICKER_ENTRY,      HOTFIX_SEL_ITEM_CONTEXT_PICKER_ENTRY_MAX_ID, +    HOTFIX_SEL_ITEM_CREATION_CONTEXT, +    HOTFIX_SEL_ITEM_CREATION_CONTEXT_MAX_ID, +      HOTFIX_SEL_ITEM_CURRENCY_COST,      HOTFIX_SEL_ITEM_CURRENCY_COST_MAX_ID, @@ -585,9 +588,15 @@ enum HotfixDatabaseStatements : uint32      HOTFIX_SEL_ITEM_NAME_DESCRIPTION_MAX_ID,      HOTFIX_SEL_ITEM_NAME_DESCRIPTION_LOCALE, +    HOTFIX_SEL_ITEM_OFFSET_CURVE, +    HOTFIX_SEL_ITEM_OFFSET_CURVE_MAX_ID, +      HOTFIX_SEL_ITEM_PRICE_BASE,      HOTFIX_SEL_ITEM_PRICE_BASE_MAX_ID, +    HOTFIX_SEL_ITEM_SCALING_CONFIG, +    HOTFIX_SEL_ITEM_SCALING_CONFIG_MAX_ID, +      HOTFIX_SEL_ITEM_SEARCH_NAME,      HOTFIX_SEL_ITEM_SEARCH_NAME_MAX_ID,      HOTFIX_SEL_ITEM_SEARCH_NAME_LOCALE, @@ -1114,6 +1123,9 @@ enum HotfixDatabaseStatements : uint32      HOTFIX_SEL_TRAIT_SUB_TREE_MAX_ID,      HOTFIX_SEL_TRAIT_SUB_TREE_LOCALE, +    HOTFIX_SEL_TRAIT_SYSTEM, +    HOTFIX_SEL_TRAIT_SYSTEM_MAX_ID, +      HOTFIX_SEL_TRAIT_TREE,      HOTFIX_SEL_TRAIT_TREE_MAX_ID, diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 3d444c2948c..99d91824557 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -3874,21 +3874,14 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6          }          case ModifierTreeType::PlayerHasTraitNodeEntryInActiveConfig: // 340          { -            auto hasTraitNodeEntry = [referencePlayer, reqValue]() +            auto hasTraitNodeEntry = [referencePlayer, reqValue]              { -                for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs) -                { -                    if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat) -                    { -                        if (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID -                            || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec)) -                            continue; -                    } - -                    for (UF::TraitEntry const& traitEntry : traitConfig.Entries) +                UF::TraitConfig const* config = referencePlayer->GetTraitConfig(referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID); +                if (config && EnumFlag(TraitCombatConfigFlags(*config->CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec)) +                    for (UF::TraitEntry const& traitEntry : config->Entries)                          if (traitEntry.TraitNodeEntryID == int32(reqValue))                              return true; -                } +                  return false;              }();              if (!hasTraitNodeEntry) @@ -3899,19 +3892,12 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6          {              auto traitNodeEntryRank = [referencePlayer, secondaryAsset]() -> Optional<uint16>              { -                for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs) -                { -                    if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat) -                    { -                        if (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID -                            || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec)) -                            continue; -                    } - -                    for (UF::TraitEntry const& traitEntry : traitConfig.Entries) +                UF::TraitConfig const* config = referencePlayer->GetTraitConfig(referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID); +                if (config && EnumFlag(TraitCombatConfigFlags(*config->CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec)) +                    for (UF::TraitEntry const& traitEntry : config->Entries)                          if (traitEntry.TraitNodeEntryID == int32(secondaryAsset))                              return traitEntry.Rank; -                } +                  return {};              }();              if (!traitNodeEntryRank || traitNodeEntryRank < int32(reqValue)) @@ -3943,18 +3929,18 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6              break;          case ModifierTreeType::PlayerHasAtLeastProfPathRanks: // 355          { -            auto traitNodeEntryRankCount = [referencePlayer, secondaryAsset]() +            uint32 traitNodeEntryRankCount = [referencePlayer, secondaryAsset]              {                  uint32 ranks = 0; -                for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs) +                for (auto const& [_, traitConfig] : referencePlayer->m_activePlayerData->TraitConfigs)                  { -                    if (TraitConfigType(*traitConfig.Type) != TraitConfigType::Profession) +                    if (TraitConfigType(*traitConfig.value.Type) != TraitConfigType::Profession)                          continue; -                    if (*traitConfig.SkillLineID != int32(secondaryAsset)) +                    if (*traitConfig.value.SkillLineID != int32(secondaryAsset))                          continue; -                    for (UF::TraitEntry const& traitEntry : traitConfig.Entries) +                    for (UF::TraitEntry const& traitEntry : traitConfig.value.Entries)                          if (sTraitNodeEntryStore.AssertEntry(traitEntry.TraitNodeEntryID)->GetNodeEntryType() == TraitNodeEntryType::ProfPath)                              ranks += traitEntry.Rank + traitEntry.GrantedRanks;                  } @@ -4025,7 +4011,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6          }          case ModifierTreeType::PlayerHasActiveTraitSubTree: // 385          { -            int32 traitConfigWithSubtree = referencePlayer->m_activePlayerData->TraitConfigs.FindIndexIf([referencePlayer, reqValue](UF::TraitConfig const& traitConfig) +            int32 const* traitConfigWithSubtree = referencePlayer->m_activePlayerData->TraitConfigs.FindIf([referencePlayer, reqValue](UF::TraitConfig const& traitConfig)              {                  if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat                      && (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID @@ -4036,8 +4022,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6                  {                      return traitSubTree.TraitSubTreeID == int32(reqValue) && traitSubTree.Active;                  }) >= 0; -            }); -            if (traitConfigWithSubtree < 0) +            }).first; +            if (!traitConfigWithSubtree)                  return false;              break;          } diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 89012688d26..99d55c535e2 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -3309,16 +3309,16 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio      {          auto getTraitNodeEntryRank = [player](int32 traitNodeEntryId) -> Optional<uint16>          { -            for (UF::TraitConfig const& traitConfig : player->m_activePlayerData->TraitConfigs) +            for (auto const& [_, traitConfig] : player->m_activePlayerData->TraitConfigs)              { -                if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat) +                if (TraitConfigType(*traitConfig.value.Type) == TraitConfigType::Combat)                  { -                    if (int32(*player->m_activePlayerData->ActiveCombatTraitConfigID) != *traitConfig.ID -                        || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec)) +                    if (int32(*player->m_activePlayerData->ActiveCombatTraitConfigID) != *traitConfig.value.ID +                        || !EnumFlag(TraitCombatConfigFlags(*traitConfig.value.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))                          continue;                  } -                for (UF::TraitEntry const& traitEntry : traitConfig.Entries) +                for (UF::TraitEntry const& traitEntry : traitConfig.value.Entries)                      if (traitEntry.TraitNodeEntryID == traitNodeEntryId)                          return traitEntry.Rank;              } diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 65244d6ddf8..df2aa42cafd 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -182,7 +182,7 @@ struct AreaTableLoadInfo          { .IsSigned = false, .Type = FT_BYTE, .Name = "FactionGroupMask" },          { .IsSigned = false, .Type = FT_FLOAT, .Name = "AmbientMultiplier" },          { .IsSigned = true, .Type = FT_INT, .Name = "MountFlags" }, -        { .IsSigned = true, .Type = FT_SHORT, .Name = "PvpCombatWorldStateID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "PvpCombatWorldStateID" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "WildBattlePetLevelMin" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "WildBattlePetLevelMax" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "WindSettingsID" }, @@ -780,7 +780,7 @@ struct BroadcastTextLoadInfo          { .IsSigned = true, .Type = FT_INT, .Name = "LanguageID" },          { .IsSigned = true, .Type = FT_INT, .Name = "ConditionID" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "EmotesID" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "Flags" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Flags" },          { .IsSigned = false, .Type = FT_INT, .Name = "ChatBubbleDurationMs" },          { .IsSigned = true, .Type = FT_INT, .Name = "VoiceOverPriorityID" },          { .IsSigned = false, .Type = FT_INT, .Name = "SoundKitID1" }, @@ -1241,7 +1241,7 @@ struct ChrSpecializationLoadInfo          { .IsSigned = true, .Type = FT_BYTE, .Name = "OrderIndex" },          { .IsSigned = true, .Type = FT_BYTE, .Name = "PetTalentType" },          { .IsSigned = true, .Type = FT_BYTE, .Name = "Role" }, -        { .IsSigned = false, .Type = FT_INT, .Name = "Flags" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Flags" },          { .IsSigned = true, .Type = FT_INT, .Name = "SpellIconFileID" },          { .IsSigned = true, .Type = FT_BYTE, .Name = "PrimaryStatPriority" },          { .IsSigned = true, .Type = FT_INT, .Name = "AnimReplacements" }, @@ -1319,7 +1319,7 @@ struct ConditionalContentTuningLoadInfo  struct ContentTuningLoadInfo  { -    static constexpr DB2FieldMeta Fields[17] = +    static constexpr DB2FieldMeta Fields[19] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, @@ -1328,6 +1328,8 @@ struct ContentTuningLoadInfo          { .IsSigned = true, .Type = FT_INT, .Name = "DamageItemLevelCurveID" },          { .IsSigned = true, .Type = FT_INT, .Name = "HealthPrimaryStatCurveID" },          { .IsSigned = true, .Type = FT_INT, .Name = "DamagePrimaryStatCurveID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "PrimaryStatScalingModPlayerDataElementCharacterID" }, +        { .IsSigned = false, .Type = FT_FLOAT, .Name = "PrimaryStatScalingModPlayerDataElementCharacterMultiplier" },          { .IsSigned = true, .Type = FT_INT, .Name = "MinLevel" },          { .IsSigned = true, .Type = FT_INT, .Name = "MaxLevel" },          { .IsSigned = true, .Type = FT_INT, .Name = "MinLevelType" }, @@ -1340,7 +1342,7 @@ struct ContentTuningLoadInfo          { .IsSigned = false, .Type = FT_FLOAT, .Name = "QuestXpMultiplier" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 17, &ContentTuningMeta::Instance, HOTFIX_SEL_CONTENT_TUNING }; +    static constexpr DB2LoadInfo Instance{ Fields, 19, &ContentTuningMeta::Instance, HOTFIX_SEL_CONTENT_TUNING };  };  struct ContentTuningXExpectedLoadInfo @@ -1656,7 +1658,7 @@ struct CurveLoadInfo      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "Type" }, -        { .IsSigned = false, .Type = FT_BYTE, .Name = "Flags" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Flags" },      };      static constexpr DB2LoadInfo Instance{ Fields, 3, &CurveMeta::Instance, HOTFIX_SEL_CURVE }; @@ -1672,7 +1674,7 @@ struct CurvePointLoadInfo          { .IsSigned = false, .Type = FT_FLOAT, .Name = "PreSLSquishPosY" },          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = false, .Type = FT_INT, .Name = "CurveID" }, -        { .IsSigned = false, .Type = FT_BYTE, .Name = "OrderIndex" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "OrderIndex" },      };      static constexpr DB2LoadInfo Instance{ Fields, 7, &CurvePointMeta::Instance, HOTFIX_SEL_CURVE_POINT }; @@ -2689,7 +2691,7 @@ struct ItemLoadInfo          { .IsSigned = false, .Type = FT_BYTE, .Name = "SheatheType" },          { .IsSigned = true, .Type = FT_BYTE, .Name = "SoundOverrideSubclassID" },          { .IsSigned = true, .Type = FT_INT, .Name = "IconFileDataID" }, -        { .IsSigned = false, .Type = FT_BYTE, .Name = "ItemGroupSoundsID" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "ItemGroupSoundsID" },          { .IsSigned = true, .Type = FT_INT, .Name = "ContentTuningID" },          { .IsSigned = true, .Type = FT_INT, .Name = "ModifiedCraftingReagentItemID" },          { .IsSigned = true, .Type = FT_INT, .Name = "CraftingQualityID" }, @@ -2834,7 +2836,7 @@ struct ItemBonusTreeLoadInfo  struct ItemBonusTreeNodeLoadInfo  { -    static constexpr DB2FieldMeta Fields[10] = +    static constexpr DB2FieldMeta Fields[12] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "ItemContext" }, @@ -2845,10 +2847,12 @@ struct ItemBonusTreeNodeLoadInfo          { .IsSigned = true, .Type = FT_INT, .Name = "IblGroupPointsModSetID" },          { .IsSigned = true, .Type = FT_INT, .Name = "MinMythicPlusLevel" },          { .IsSigned = true, .Type = FT_INT, .Name = "MaxMythicPlusLevel" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "ItemCreationContextGroupID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Flags" },          { .IsSigned = false, .Type = FT_INT, .Name = "ParentItemBonusTreeID" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 10, &ItemBonusTreeNodeMeta::Instance, HOTFIX_SEL_ITEM_BONUS_TREE_NODE }; +    static constexpr DB2LoadInfo Instance{ Fields, 12, &ItemBonusTreeNodeMeta::Instance, HOTFIX_SEL_ITEM_BONUS_TREE_NODE };  };  struct ItemChildEquipmentLoadInfo @@ -2895,6 +2899,18 @@ struct ItemContextPickerEntryLoadInfo      static constexpr DB2LoadInfo Instance{ Fields, 8, &ItemContextPickerEntryMeta::Instance, HOTFIX_SEL_ITEM_CONTEXT_PICKER_ENTRY };  }; +struct ItemCreationContextLoadInfo +{ +    static constexpr DB2FieldMeta Fields[3] = +    { +        { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, +        { .IsSigned = false, .Type = FT_BYTE, .Name = "ItemContext" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "ItemCreationContextGroupID" }, +    }; + +    static constexpr DB2LoadInfo Instance{ Fields, 3, &ItemCreationContextMeta::Instance, HOTFIX_SEL_ITEM_CREATION_CONTEXT }; +}; +  struct ItemCurrencyCostLoadInfo  {      static constexpr DB2FieldMeta Fields[2] = @@ -3174,6 +3190,18 @@ struct ItemNameDescriptionLoadInfo      static constexpr DB2LoadInfo Instance{ Fields, 3, &ItemNameDescriptionMeta::Instance, HOTFIX_SEL_ITEM_NAME_DESCRIPTION };  }; +struct ItemOffsetCurveLoadInfo +{ +    static constexpr DB2FieldMeta Fields[3] = +    { +        { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "CurveID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Offset" }, +    }; + +    static constexpr DB2LoadInfo Instance{ Fields, 3, &ItemOffsetCurveMeta::Instance, HOTFIX_SEL_ITEM_OFFSET_CURVE }; +}; +  struct ItemPriceBaseLoadInfo  {      static constexpr DB2FieldMeta Fields[4] = @@ -3187,6 +3215,20 @@ struct ItemPriceBaseLoadInfo      static constexpr DB2LoadInfo Instance{ Fields, 4, &ItemPriceBaseMeta::Instance, HOTFIX_SEL_ITEM_PRICE_BASE };  }; +struct ItemScalingConfigLoadInfo +{ +    static constexpr DB2FieldMeta Fields[5] = +    { +        { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "ItemOffsetCurveID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "ItemLevel" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "RequiredLevel" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1125" }, +    }; + +    static constexpr DB2LoadInfo Instance{ Fields, 5, &ItemScalingConfigMeta::Instance, HOTFIX_SEL_ITEM_SCALING_CONFIG }; +}; +  struct ItemSearchNameLoadInfo  {      static constexpr DB2FieldMeta Fields[18] = @@ -3262,7 +3304,7 @@ struct ItemSetSpellLoadInfo  struct ItemSparseLoadInfo  { -    static constexpr DB2FieldMeta Fields[99] = +    static constexpr DB2FieldMeta Fields[101] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_LONG, .Name = "AllowableRace" }, @@ -3328,6 +3370,8 @@ struct ItemSparseLoadInfo          { .IsSigned = true, .Type = FT_INT, .Name = "ModifiedCraftingReagentItemID" },          { .IsSigned = true, .Type = FT_INT, .Name = "ContentTuningID" },          { .IsSigned = true, .Type = FT_INT, .Name = "PlayerLevelToItemLevelCurveID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "ItemLevelOffsetCurveID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "ItemLevelOffsetItemLevel" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "ItemNameDescriptionID" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "RequiredTransmogHoliday" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "RequiredHoliday" }, @@ -3365,7 +3409,7 @@ struct ItemSparseLoadInfo          { .IsSigned = true, .Type = FT_BYTE, .Name = "OverallQualityID" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 99, &ItemSparseMeta::Instance, HOTFIX_SEL_ITEM_SPARSE }; +    static constexpr DB2LoadInfo Instance{ Fields, 101, &ItemSparseMeta::Instance, HOTFIX_SEL_ITEM_SPARSE };  };  struct ItemSpecLoadInfo @@ -4338,10 +4382,10 @@ struct PlayerConditionLoadInfo          { .IsSigned = false, .Type = FT_BYTE, .Name = "AuraStacks2" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "AuraStacks3" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "AuraStacks4" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "Achievement1" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "Achievement2" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "Achievement3" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "Achievement4" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "Achievement1" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "Achievement2" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "Achievement3" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "Achievement4" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "AreaID1" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "AreaID2" },          { .IsSigned = false, .Type = FT_SHORT, .Name = "AreaID3" }, @@ -4393,50 +4437,54 @@ struct PlayerConditionLoadInfo  struct PlayerDataElementAccountLoadInfo  { -    static constexpr DB2FieldMeta Fields[3] = +    static constexpr DB2FieldMeta Fields[4] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "StorageIndex" },          { .IsSigned = true, .Type = FT_INT, .Name = "Type" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1125" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 3, &PlayerDataElementAccountMeta::Instance, HOTFIX_SEL_PLAYER_DATA_ELEMENT_ACCOUNT }; +    static constexpr DB2LoadInfo Instance{ Fields, 4, &PlayerDataElementAccountMeta::Instance, HOTFIX_SEL_PLAYER_DATA_ELEMENT_ACCOUNT };  };  struct PlayerDataElementCharacterLoadInfo  { -    static constexpr DB2FieldMeta Fields[3] = +    static constexpr DB2FieldMeta Fields[4] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "StorageIndex" },          { .IsSigned = true, .Type = FT_INT, .Name = "Type" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1125" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 3, &PlayerDataElementCharacterMeta::Instance, HOTFIX_SEL_PLAYER_DATA_ELEMENT_CHARACTER }; +    static constexpr DB2LoadInfo Instance{ Fields, 4, &PlayerDataElementCharacterMeta::Instance, HOTFIX_SEL_PLAYER_DATA_ELEMENT_CHARACTER };  };  struct PlayerDataFlagAccountLoadInfo  { -    static constexpr DB2FieldMeta Fields[3] = +    static constexpr DB2FieldMeta Fields[4] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "StorageIndex" },          { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1107" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1125" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 3, &PlayerDataFlagAccountMeta::Instance, HOTFIX_SEL_PLAYER_DATA_FLAG_ACCOUNT }; +    static constexpr DB2LoadInfo Instance{ Fields, 4, &PlayerDataFlagAccountMeta::Instance, HOTFIX_SEL_PLAYER_DATA_FLAG_ACCOUNT };  };  struct PlayerDataFlagCharacterLoadInfo  { -    static constexpr DB2FieldMeta Fields[3] = +    static constexpr DB2FieldMeta Fields[4] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "StorageIndex" },          { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1107" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1125" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 3, &PlayerDataFlagCharacterMeta::Instance, HOTFIX_SEL_PLAYER_DATA_FLAG_CHARACTER }; +    static constexpr DB2LoadInfo Instance{ Fields, 4, &PlayerDataFlagCharacterMeta::Instance, HOTFIX_SEL_PLAYER_DATA_FLAG_CHARACTER };  };  struct PowerDisplayLoadInfo @@ -4859,8 +4907,8 @@ struct SceneScriptLoadInfo      static constexpr DB2FieldMeta Fields[4] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "FirstSceneScriptID" }, -        { .IsSigned = false, .Type = FT_SHORT, .Name = "NextSceneScriptID" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "FirstSceneScriptID" }, +        { .IsSigned = false, .Type = FT_INT, .Name = "NextSceneScriptID" },          { .IsSigned = true, .Type = FT_INT, .Name = "Unknown915" },      }; @@ -5140,10 +5188,10 @@ struct SpellCategoriesLoadInfo          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "DifficultyID" },          { .IsSigned = true, .Type = FT_SHORT, .Name = "Category" }, -        { .IsSigned = true, .Type = FT_BYTE, .Name = "DefenseType" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "DefenseType" },          { .IsSigned = true, .Type = FT_BYTE, .Name = "DispelType" },          { .IsSigned = true, .Type = FT_BYTE, .Name = "Mechanic" }, -        { .IsSigned = true, .Type = FT_BYTE, .Name = "PreventionType" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "PreventionType" },          { .IsSigned = true, .Type = FT_SHORT, .Name = "StartRecoveryCategory" },          { .IsSigned = true, .Type = FT_SHORT, .Name = "ChargeCategory" },          { .IsSigned = false, .Type = FT_INT, .Name = "SpellID" }, @@ -5314,7 +5362,7 @@ struct SpellInterruptsLoadInfo      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = false, .Type = FT_BYTE, .Name = "DifficultyID" }, -        { .IsSigned = true, .Type = FT_SHORT, .Name = "InterruptFlags" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "InterruptFlags" },          { .IsSigned = true, .Type = FT_INT, .Name = "AuraInterruptFlags1" },          { .IsSigned = true, .Type = FT_INT, .Name = "AuraInterruptFlags2" },          { .IsSigned = true, .Type = FT_INT, .Name = "ChannelInterruptFlags1" }, @@ -6090,29 +6138,32 @@ struct TraitCondLoadInfo  struct TraitCostLoadInfo  { -    static constexpr DB2FieldMeta Fields[4] = +    static constexpr DB2FieldMeta Fields[5] =      {          { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "InternalName" },          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "Amount" },          { .IsSigned = true, .Type = FT_INT, .Name = "TraitCurrencyID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "CurveID" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 4, &TraitCostMeta::Instance, HOTFIX_SEL_TRAIT_COST }; +    static constexpr DB2LoadInfo Instance{ Fields, 5, &TraitCostMeta::Instance, HOTFIX_SEL_TRAIT_COST };  };  struct TraitCurrencyLoadInfo  { -    static constexpr DB2FieldMeta Fields[5] = +    static constexpr DB2FieldMeta Fields[7] =      {          { .IsSigned = false, .Type = FT_INT, .Name = "ID" },          { .IsSigned = true, .Type = FT_INT, .Name = "Type" },          { .IsSigned = true, .Type = FT_INT, .Name = "CurrencyTypesID" },          { .IsSigned = true, .Type = FT_INT, .Name = "Flags" },          { .IsSigned = true, .Type = FT_INT, .Name = "Icon" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "PlayerDataElementAccountID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "PlayerDataElementCharacterID" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 5, &TraitCurrencyMeta::Instance, HOTFIX_SEL_TRAIT_CURRENCY }; +    static constexpr DB2LoadInfo Instance{ Fields, 7, &TraitCurrencyMeta::Instance, HOTFIX_SEL_TRAIT_CURRENCY };  };  struct TraitCurrencySourceLoadInfo @@ -6332,6 +6383,21 @@ struct TraitSubTreeLoadInfo      static constexpr DB2LoadInfo Instance{ Fields, 5, &TraitSubTreeMeta::Instance, HOTFIX_SEL_TRAIT_SUB_TREE };  }; +struct TraitSystemLoadInfo +{ +    static constexpr DB2FieldMeta Fields[6] = +    { +        { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "WidgetSetID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "TraitChangeSpell" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "ItemID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "VariationType" }, +    }; + +    static constexpr DB2LoadInfo Instance{ Fields, 6, &TraitSystemMeta::Instance, HOTFIX_SEL_TRAIT_SYSTEM }; +}; +  struct TraitTreeLoadInfo  {      static constexpr DB2FieldMeta Fields[8] = @@ -6520,7 +6586,7 @@ struct UiMapLoadInfo  struct UiMapAssignmentLoadInfo  { -    static constexpr DB2FieldMeta Fields[17] = +    static constexpr DB2FieldMeta Fields[18] =      {          { .IsSigned = false, .Type = FT_FLOAT, .Name = "UiMinX" },          { .IsSigned = false, .Type = FT_FLOAT, .Name = "UiMinY" }, @@ -6539,9 +6605,10 @@ struct UiMapAssignmentLoadInfo          { .IsSigned = true, .Type = FT_INT, .Name = "AreaID" },          { .IsSigned = true, .Type = FT_INT, .Name = "WmoDoodadPlacementID" },          { .IsSigned = true, .Type = FT_INT, .Name = "WmoGroupID" }, +        { .IsSigned = true, .Type = FT_INT, .Name = "Unknown1125" },      }; -    static constexpr DB2LoadInfo Instance{ Fields, 17, &UiMapAssignmentMeta::Instance, HOTFIX_SEL_UI_MAP_ASSIGNMENT }; +    static constexpr DB2LoadInfo Instance{ Fields, 18, &UiMapAssignmentMeta::Instance, HOTFIX_SEL_UI_MAP_ASSIGNMENT };  };  struct UiMapLinkLoadInfo diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index aa6cf7289bb..23671862ee0 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -491,7 +491,7 @@ struct AnimKitReplacementMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      }; @@ -502,7 +502,7 @@ struct AnimKitReplacementMeta          .ParentIndexField   = 4,          .FieldCount         = 5,          .FileFieldCount     = 4, -        .LayoutHash         = 0xD9A65034, +        .LayoutHash         = 0x84858A44,          .Fields             = Fields      };  }; @@ -551,7 +551,7 @@ struct AnimReplacementMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      }; @@ -562,7 +562,7 @@ struct AnimReplacementMeta          .ParentIndexField   = 4,          .FieldCount         = 5,          .FileFieldCount     = 4, -        .LayoutHash         = 0x61B149CC, +        .LayoutHash         = 0x6D1FB51C,          .Fields             = Fields      };  }; @@ -776,7 +776,7 @@ struct AreaFarClipOverrideMeta          .ParentIndexField   = -1,          .FieldCount         = 4,          .FileFieldCount     = 4, -        .LayoutHash         = 0x56BEE3FC, +        .LayoutHash         = 0x5EF657BC,          .Fields             = Fields      };  }; @@ -904,7 +904,7 @@ struct AreaTableMeta          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, @@ -920,7 +920,7 @@ struct AreaTableMeta          .ParentIndexField   = -1,          .FieldCount         = 23,          .FileFieldCount     = 23, -        .LayoutHash         = 0x3F51DE1F, +        .LayoutHash         = 0x5DB1A3FF,          .Fields             = Fields      };  }; @@ -2464,7 +2464,7 @@ struct BroadcastTextMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  2, .IsSigned = false }, @@ -2479,7 +2479,7 @@ struct BroadcastTextMeta          .ParentIndexField   = -1,          .FieldCount         = 12,          .FileFieldCount     = 12, -        .LayoutHash         = 0x2EC89623, +        .LayoutHash         = 0x00EB45B3,          .Fields             = Fields      };  }; @@ -2683,6 +2683,27 @@ struct CastableRaidBuffsMeta      };  }; +struct CatalogShopGameTitleInfoMeta +{ +    static constexpr DB2MetaField Fields[3] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7388251, +        .IndexField         = -1, +        .ParentIndexField   = 2, +        .FieldCount         = 3, +        .FileFieldCount     = 2, +        .LayoutHash         = 0x14DEA9DD, +        .Fields             = Fields +    }; +}; +  struct CelestialBodyMeta  {      static constexpr DB2MetaField Fields[14] = @@ -3928,7 +3949,7 @@ struct ChrCustomizationReqMeta          .ParentIndexField   = -1,          .FieldCount         = 9,          .FileFieldCount     = 9, -        .LayoutHash         = 0xEFC66872, +        .LayoutHash         = 0x6930BE3A,          .Fields             = Fields      };  }; @@ -4294,7 +4315,7 @@ struct ChrSpecializationMeta          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -4308,7 +4329,7 @@ struct ChrSpecializationMeta          .ParentIndexField   = 4,          .FieldCount         = 13,          .FileFieldCount     = 13, -        .LayoutHash         = 0xBF17DE0B, +        .LayoutHash         = 0xDAB4CA4B,          .Fields             = Fields      };  }; @@ -5009,7 +5030,7 @@ struct ContentRestrictionRuleSetMeta  struct ContentTuningMeta  { -    static constexpr DB2MetaField Fields[17] = +    static constexpr DB2MetaField Fields[19] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -5019,6 +5040,8 @@ struct ContentTuningMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -5035,9 +5058,9 @@ struct ContentTuningMeta          .FileDataId         = 1962930,          .IndexField         = 0,          .ParentIndexField   = -1, -        .FieldCount         = 17, -        .FileFieldCount     = 17, -        .LayoutHash         = 0xCD32761B, +        .FieldCount         = 19, +        .FileFieldCount     = 19, +        .LayoutHash         = 0xA3E13004,          .Fields             = Fields      };  }; @@ -5779,7 +5802,7 @@ struct CreatureDisplayInfoEvtMeta      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      }; @@ -5790,7 +5813,7 @@ struct CreatureDisplayInfoEvtMeta          .ParentIndexField   = 3,          .FieldCount         = 4,          .FileFieldCount     = 3, -        .LayoutHash         = 0xF2A5FCAA, +        .LayoutHash         = 0x014CFB2A,          .Fields             = Fields      };  }; @@ -5965,7 +5988,7 @@ struct CreatureImmunitiesMeta          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  2, .IsSigned =  true }, -        { .Type = FT_INT,                  .ArraySize = 11, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize = 12, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize = 20, .IsSigned = false },      }; @@ -5976,7 +5999,7 @@ struct CreatureImmunitiesMeta          .ParentIndexField   = -1,          .FieldCount         = 9,          .FileFieldCount     = 9, -        .LayoutHash         = 0xA1D7B067, +        .LayoutHash         = 0xC8D8DB6E,          .Fields             = Fields      };  }; @@ -6401,7 +6424,7 @@ struct CurveMeta      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -6411,7 +6434,7 @@ struct CurveMeta          .ParentIndexField   = -1,          .FieldCount         = 3,          .FileFieldCount     = 3, -        .LayoutHash         = 0x48AE7F4A, +        .LayoutHash         = 0xD362535A,          .Fields             = Fields      };  }; @@ -6424,7 +6447,7 @@ struct CurvePointMeta          { .Type = FT_FLOAT,                .ArraySize =  2, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },      };      static constexpr DB2Meta Instance = @@ -6434,7 +6457,7 @@ struct CurvePointMeta          .ParentIndexField   = 3,          .FieldCount         = 5,          .FileFieldCount     = 5, -        .LayoutHash         = 0x8DB83C21, +        .LayoutHash         = 0x7D4954A1,          .Fields             = Fields      };  }; @@ -7382,7 +7405,7 @@ struct FullScreenEffectMeta  {      static constexpr DB2MetaField Fields[28] =      { -        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true }, @@ -7419,7 +7442,7 @@ struct FullScreenEffectMeta          .ParentIndexField   = -1,          .FieldCount         = 28,          .FileFieldCount     = 28, -        .LayoutHash         = 0xC0799EA5, +        .LayoutHash         = 0xD33A4A55,          .Fields             = Fields      };  }; @@ -10051,7 +10074,7 @@ struct HighlightColorMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -10061,7 +10084,7 @@ struct HighlightColorMeta          .ParentIndexField   = -1,          .FieldCount         = 5,          .FileFieldCount     = 5, -        .LayoutHash         = 0x6A5296CF, +        .LayoutHash         = 0xF8B3A15F,          .Fields             = Fields      };  }; @@ -10177,6 +10200,27 @@ struct HotfixesMeta      };  }; +struct HouseDecorMeta +{ +    static constexpr DB2MetaField Fields[3] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 5149691, +        .IndexField         = 0, +        .ParentIndexField   = -1, +        .FieldCount         = 3, +        .FileFieldCount     = 3, +        .LayoutHash         = 0xA2E1530F, +        .Fields             = Fields +    }; +}; +  struct ImportPriceArmorMeta  {      static constexpr DB2MetaField Fields[4] = @@ -10295,7 +10339,7 @@ struct ItemMeta          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -10308,7 +10352,7 @@ struct ItemMeta          .ParentIndexField   = -1,          .FieldCount         = 11,          .FileFieldCount     = 11, -        .LayoutHash         = 0x12C03F1A, +        .LayoutHash         = 0xE39A209A,          .Fields             = Fields      };  }; @@ -10699,7 +10743,7 @@ struct ItemBonusTreeGroupEntryMeta  struct ItemBonusTreeNodeMeta  { -    static constexpr DB2MetaField Fields[9] = +    static constexpr DB2MetaField Fields[11] =      {          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, @@ -10710,16 +10754,18 @@ struct ItemBonusTreeNodeMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance =      {          .FileDataId         = 987134,          .IndexField         = -1, -        .ParentIndexField   = 8, -        .FieldCount         = 9, -        .FileFieldCount     = 8, -        .LayoutHash         = 0x6304AE19, +        .ParentIndexField   = 10, +        .FieldCount         = 11, +        .FileFieldCount     = 10, +        .LayoutHash         = 0x4049606F,          .Fields             = Fields      };  }; @@ -10854,6 +10900,46 @@ struct ItemConversionEntryMeta      };  }; +struct ItemCreationContextMeta +{ +    static constexpr DB2MetaField Fields[3] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7152830, +        .IndexField         = 0, +        .ParentIndexField   = 2, +        .FieldCount         = 3, +        .FileFieldCount     = 2, +        .LayoutHash         = 0xEB697751, +        .Fields             = Fields +    }; +}; + +struct ItemCreationContextGroupMeta +{ +    static constexpr DB2MetaField Fields[1] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7152831, +        .IndexField         = 0, +        .ParentIndexField   = -1, +        .FieldCount         = 1, +        .FileFieldCount     = 1, +        .LayoutHash         = 0xF2103A31, +        .Fields             = Fields +    }; +}; +  struct ItemCurrencyCostMeta  {      static constexpr DB2MetaField Fields[1] = @@ -11295,6 +11381,27 @@ struct ItemLevelSelectorQualitySetMeta      };  }; +struct ItemLevelWatermarkMeta +{ +    static constexpr DB2MetaField Fields[3] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 6914796, +        .IndexField         = -1, +        .ParentIndexField   = -1, +        .FieldCount         = 3, +        .FileFieldCount     = 3, +        .LayoutHash         = 0xEB2D703A, +        .Fields             = Fields +    }; +}; +  struct ItemLimitCategoryMeta  {      static constexpr DB2MetaField Fields[3] = @@ -11467,6 +11574,26 @@ struct ItemNameSlotOverrideMeta      };  }; +struct ItemOffsetCurveMeta +{ +    static constexpr DB2MetaField Fields[2] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7322704, +        .IndexField         = -1, +        .ParentIndexField   = -1, +        .FieldCount         = 2, +        .FileFieldCount     = 2, +        .LayoutHash         = 0x6F2157CA, +        .Fields             = Fields +    }; +}; +  struct ItemPetFoodMeta  {      static constexpr DB2MetaField Fields[1] = @@ -11617,6 +11744,28 @@ struct ItemSalvageLootMeta      };  }; +struct ItemScalingConfigMeta +{ +    static constexpr DB2MetaField Fields[4] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7322705, +        .IndexField         = -1, +        .ParentIndexField   = -1, +        .FieldCount         = 4, +        .FileFieldCount     = 4, +        .LayoutHash         = 0x2A1E702E, +        .Fields             = Fields +    }; +}; +  struct ItemSearchNameMeta  {      static constexpr DB2MetaField Fields[13] = @@ -11696,7 +11845,7 @@ struct ItemSetSpellMeta  struct ItemSparseMeta  { -    static constexpr DB2MetaField Fields[64] = +    static constexpr DB2MetaField Fields[66] =      {          { .Type = FT_LONG,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_STRING,               .ArraySize =  1, .IsSigned =  true }, @@ -11730,6 +11879,8 @@ struct ItemSparseMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, @@ -11769,9 +11920,9 @@ struct ItemSparseMeta          .FileDataId         = 1572924,          .IndexField         = -1,          .ParentIndexField   = -1, -        .FieldCount         = 64, -        .FileFieldCount     = 64, -        .LayoutHash         = 0x93DE68EC, +        .FieldCount         = 66, +        .FileFieldCount     = 66, +        .LayoutHash         = 0x2928311F,          .Fields             = Fields      };  }; @@ -11820,6 +11971,26 @@ struct ItemSpecOverrideMeta      };  }; +struct ItemSquishEraMeta +{ +    static constexpr DB2MetaField Fields[2] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7322706, +        .IndexField         = -1, +        .ParentIndexField   = -1, +        .FieldCount         = 2, +        .FileFieldCount     = 2, +        .LayoutHash         = 0x0E5EEFD3, +        .Fields             = Fields +    }; +}; +  struct ItemSubClassMeta  {      static constexpr DB2MetaField Fields[11] = @@ -11955,6 +12126,26 @@ struct ItemXItemEffectMeta      };  }; +struct ItemXTraitSystemMeta +{ +    static constexpr DB2MetaField Fields[2] = +    { +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +    }; + +    static constexpr DB2Meta Instance = +    { +        .FileDataId         = 7001629, +        .IndexField         = -1, +        .ParentIndexField   = -1, +        .FieldCount         = 2, +        .FileFieldCount     = 2, +        .LayoutHash         = 0xC37D4CAB, +        .Fields             = Fields +    }; +}; +  struct JournalEncounterMeta  {      static constexpr DB2MetaField Fields[12] = @@ -13054,7 +13245,7 @@ struct LookAtControllerMeta          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -13064,7 +13255,7 @@ struct LookAtControllerMeta          .ParentIndexField   = -1,          .FieldCount         = 18,          .FileFieldCount     = 18, -        .LayoutHash         = 0x92FF222C, +        .LayoutHash         = 0x257BE69C,          .Fields             = Fields      };  }; @@ -13723,26 +13914,6 @@ struct ModelRibbonQualityMeta      };  }; -struct ModelSoundAnimEntryMeta -{ -    static constexpr DB2MetaField Fields[2] = -    { -        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -    }; - -    static constexpr DB2Meta Instance = -    { -        .FileDataId         = 5393274, -        .IndexField         = -1, -        .ParentIndexField   = 0, -        .FieldCount         = 2, -        .FileFieldCount     = 2, -        .LayoutHash         = 0x324E0B06, -        .Fields             = Fields -    }; -}; -  struct ModelSoundSettingsMeta  {      static constexpr DB2MetaField Fields[2] = @@ -15435,7 +15606,7 @@ struct PerksVendorItemMeta      static constexpr DB2MetaField Fields[9] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -15452,7 +15623,7 @@ struct PerksVendorItemMeta          .ParentIndexField   = -1,          .FieldCount         = 9,          .FileFieldCount     = 9, -        .LayoutHash         = 0x7709D03B, +        .LayoutHash         = 0x96A2B1EB,          .Fields             = Fields      };  }; @@ -15720,7 +15891,7 @@ struct PlayerConditionMeta          { .Type = FT_INT,                  .ArraySize =  2, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  4, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  4, .IsSigned = false }, -        { .Type = FT_SHORT,                .ArraySize =  4, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  4, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  4, .IsSigned = false },          { .Type = FT_BYTE,                 .ArraySize =  4, .IsSigned = false },          { .Type = FT_BYTE,                 .ArraySize =  4, .IsSigned = false }, @@ -15741,18 +15912,19 @@ struct PlayerConditionMeta          .ParentIndexField   = -1,          .FieldCount         = 86,          .FileFieldCount     = 86, -        .LayoutHash         = 0x7A27D6F8, +        .LayoutHash         = 0x52515F48,          .Fields             = Fields      };  };  struct PlayerDataElementAccountMeta  { -    static constexpr DB2MetaField Fields[3] = +    static constexpr DB2MetaField Fields[4] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -15760,20 +15932,21 @@ struct PlayerDataElementAccountMeta          .FileDataId         = 5715394,          .IndexField         = 0,          .ParentIndexField   = -1, -        .FieldCount         = 3, -        .FileFieldCount     = 3, -        .LayoutHash         = 0x099A3DF9, +        .FieldCount         = 4, +        .FileFieldCount     = 4, +        .LayoutHash         = 0xAEC1DEF3,          .Fields             = Fields      };  };  struct PlayerDataElementCharacterMeta  { -    static constexpr DB2MetaField Fields[3] = +    static constexpr DB2MetaField Fields[4] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -15781,19 +15954,20 @@ struct PlayerDataElementCharacterMeta          .FileDataId         = 5715395,          .IndexField         = 0,          .ParentIndexField   = -1, -        .FieldCount         = 3, -        .FileFieldCount     = 3, -        .LayoutHash         = 0x099A3DF9, +        .FieldCount         = 4, +        .FileFieldCount     = 4, +        .LayoutHash         = 0xAEC1DEF3,          .Fields             = Fields      };  };  struct PlayerDataFlagAccountMeta  { -    static constexpr DB2MetaField Fields[2] = +    static constexpr DB2MetaField Fields[3] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -15801,19 +15975,20 @@ struct PlayerDataFlagAccountMeta          .FileDataId         = 5426706,          .IndexField         = -1,          .ParentIndexField   = -1, -        .FieldCount         = 2, -        .FileFieldCount     = 2, -        .LayoutHash         = 0x23ECE2B1, +        .FieldCount         = 3, +        .FileFieldCount     = 3, +        .LayoutHash         = 0x4703000B,          .Fields             = Fields      };  };  struct PlayerDataFlagCharacterMeta  { -    static constexpr DB2MetaField Fields[2] = +    static constexpr DB2MetaField Fields[3] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -15821,9 +15996,9 @@ struct PlayerDataFlagCharacterMeta          .FileDataId         = 5426708,          .IndexField         = -1,          .ParentIndexField   = -1, -        .FieldCount         = 2, -        .FileFieldCount     = 2, -        .LayoutHash         = 0x23ECE2B1, +        .FieldCount         = 3, +        .FileFieldCount     = 3, +        .LayoutHash         = 0x4703000B,          .Fields             = Fields      };  }; @@ -17315,7 +17490,7 @@ struct ResearchProjectMeta          .ParentIndexField   = -1,          .FieldCount         = 8,          .FileFieldCount     = 8, -        .LayoutHash         = 0x0D364DBB, +        .LayoutHash         = 0xB5751E1B,          .Fields             = Fields      };  }; @@ -17454,9 +17629,10 @@ struct RibbonQualityMeta  struct RolodexTypeMeta  { -    static constexpr DB2MetaField Fields[1] = +    static constexpr DB2MetaField Fields[2] =      {          { .Type = FT_STRING,               .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_STRING,               .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -17464,9 +17640,9 @@ struct RolodexTypeMeta          .FileDataId         = 5936950,          .IndexField         = -1,          .ParentIndexField   = -1, -        .FieldCount         = 1, -        .FileFieldCount     = 1, -        .LayoutHash         = 0x782EE721, +        .FieldCount         = 2, +        .FileFieldCount     = 2, +        .LayoutHash         = 0x22D8CB1A,          .Fields             = Fields      };  }; @@ -17648,8 +17824,8 @@ struct SceneScriptMeta  {      static constexpr DB2MetaField Fields[3] =      { -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      }; @@ -17660,7 +17836,7 @@ struct SceneScriptMeta          .ParentIndexField   = -1,          .FieldCount         = 3,          .FileFieldCount     = 3, -        .LayoutHash         = 0x48BF6E91, +        .LayoutHash         = 0x693ECCD1,          .Fields             = Fields      };  }; @@ -18950,7 +19126,7 @@ struct SpellAuraOptionsMeta          .ParentIndexField   = 7,          .FieldCount         = 8,          .FileFieldCount     = 7, -        .LayoutHash         = 0xEE8F35C1, +        .LayoutHash         = 0x72F0F501,          .Fields             = Fields      };  }; @@ -19080,10 +19256,10 @@ struct SpellCategoriesMeta      {          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -19096,7 +19272,7 @@ struct SpellCategoriesMeta          .ParentIndexField   = 8,          .FieldCount         = 9,          .FileFieldCount     = 8, -        .LayoutHash         = 0x56C7533E, +        .LayoutHash         = 0x45BA990E,          .Fields             = Fields      };  }; @@ -19666,7 +19842,7 @@ struct SpellInterruptsMeta      static constexpr DB2MetaField Fields[5] =      {          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  2, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  2, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, @@ -19679,7 +19855,7 @@ struct SpellInterruptsMeta          .ParentIndexField   = 4,          .FieldCount         = 5,          .FileFieldCount     = 4, -        .LayoutHash         = 0x9C916E46, +        .LayoutHash         = 0x6CACDAE6,          .Fields             = Fields      };  }; @@ -19895,7 +20071,7 @@ struct SpellMissileMeta      static constexpr DB2MetaField Fields[15] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  1, .IsSigned =  true }, @@ -19918,7 +20094,7 @@ struct SpellMissileMeta          .ParentIndexField   = -1,          .FieldCount         = 15,          .FileFieldCount     = 15, -        .LayoutHash         = 0xEA25F580, +        .LayoutHash         = 0x91E5E150,          .Fields             = Fields      };  }; @@ -20368,7 +20544,7 @@ struct SpellTargetRestrictionsMeta          .ParentIndexField   = 7,          .FieldCount         = 8,          .FileFieldCount     = 7, -        .LayoutHash         = 0x6CBAAD1E, +        .LayoutHash         = 0x126E295E,          .Fields             = Fields      };  }; @@ -21394,13 +21570,14 @@ struct TraitCondMeta  struct TraitCondAccountElementMeta  { -    static constexpr DB2MetaField Fields[5] = +    static constexpr DB2MetaField Fields[6] =      {          { .Type = FT_LONG,                 .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -21408,21 +21585,22 @@ struct TraitCondAccountElementMeta          .FileDataId         = 5890759,          .IndexField         = 1,          .ParentIndexField   = 2, -        .FieldCount         = 5, -        .FileFieldCount     = 5, -        .LayoutHash         = 0xCC2EA83A, +        .FieldCount         = 6, +        .FileFieldCount     = 6, +        .LayoutHash         = 0x70915E24,          .Fields             = Fields      };  };  struct TraitCostMeta  { -    static constexpr DB2MetaField Fields[4] = +    static constexpr DB2MetaField Fields[5] =      {          { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -21430,22 +21608,24 @@ struct TraitCostMeta          .FileDataId         = 4420295,          .IndexField         = 1,          .ParentIndexField   = -1, -        .FieldCount         = 4, -        .FileFieldCount     = 4, -        .LayoutHash         = 0x35853DF0, +        .FieldCount         = 5, +        .FileFieldCount     = 5, +        .LayoutHash         = 0x70C65F17,          .Fields             = Fields      };  };  struct TraitCurrencyMeta  { -    static constexpr DB2MetaField Fields[5] = +    static constexpr DB2MetaField Fields[7] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -21453,9 +21633,9 @@ struct TraitCurrencyMeta          .FileDataId         = 4524216,          .IndexField         = 0,          .ParentIndexField   = -1, -        .FieldCount         = 5, -        .FileFieldCount     = 5, -        .LayoutHash         = 0x59214AB9, +        .FieldCount         = 7, +        .FileFieldCount     = 7, +        .LayoutHash         = 0x4615483D,          .Fields             = Fields      };  }; @@ -21823,12 +22003,14 @@ struct TraitSubTreeMeta  struct TraitSystemMeta  { -    static constexpr DB2MetaField Fields[4] = +    static constexpr DB2MetaField Fields[6] =      {          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned = false },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -21836,9 +22018,9 @@ struct TraitSystemMeta          .FileDataId         = 4635649,          .IndexField         = 0,          .ParentIndexField   = -1, -        .FieldCount         = 4, -        .FileFieldCount     = 4, -        .LayoutHash         = 0xB304261C, +        .FieldCount         = 6, +        .FileFieldCount     = 6, +        .LayoutHash         = 0x495EE552,          .Fields             = Fields      };  }; @@ -22745,7 +22927,7 @@ struct UiCameraMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_SHORT,                .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned =  true }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -22755,7 +22937,7 @@ struct UiCameraMeta          .ParentIndexField   = -1,          .FieldCount         = 9,          .FileFieldCount     = 9, -        .LayoutHash         = 0x2FD2C951, +        .LayoutHash         = 0x9D5604E1,          .Fields             = Fields      };  }; @@ -22976,7 +23158,7 @@ struct UiMapArtTileMeta  struct UiMapAssignmentMeta  { -    static constexpr DB2MetaField Fields[10] = +    static constexpr DB2MetaField Fields[11] =      {          { .Type = FT_FLOAT,                .ArraySize =  2, .IsSigned =  true },          { .Type = FT_FLOAT,                .ArraySize =  2, .IsSigned =  true }, @@ -22988,6 +23170,7 @@ struct UiMapAssignmentMeta          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },          { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -22995,9 +23178,9 @@ struct UiMapAssignmentMeta          .FileDataId         = 1957219,          .IndexField         = 3,          .ParentIndexField   = 4, -        .FieldCount         = 10, -        .FileFieldCount     = 10, -        .LayoutHash         = 0xF9899D73, +        .FieldCount         = 11, +        .FileFieldCount     = 11, +        .LayoutHash         = 0xC9CC8DFB,          .Fields             = Fields      };  }; @@ -24830,7 +25013,7 @@ struct WorldElapsedTimerMeta      {          { .Type = FT_STRING,               .ArraySize =  1, .IsSigned =  true },          { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, -        { .Type = FT_BYTE,                 .ArraySize =  1, .IsSigned = false }, +        { .Type = FT_INT,                  .ArraySize =  1, .IsSigned =  true },      };      static constexpr DB2Meta Instance = @@ -24840,7 +25023,7 @@ struct WorldElapsedTimerMeta          .ParentIndexField   = -1,          .FieldCount         = 3,          .FileFieldCount     = 3, -        .LayoutHash         = 0x057E7307, +        .LayoutHash         = 0xABC59157,          .Fields             = Fields      };  }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 514cf7f9396..178ace62023 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -189,6 +189,7 @@ DB2Storage<ItemBonusTreeNodeEntry>              sItemBonusTreeNodeStore("ItemBon  DB2Storage<ItemChildEquipmentEntry>             sItemChildEquipmentStore("ItemChildEquipment.db2", &ItemChildEquipmentLoadInfo::Instance);  DB2Storage<ItemClassEntry>                      sItemClassStore("ItemClass.db2", &ItemClassLoadInfo::Instance);  DB2Storage<ItemContextPickerEntryEntry>         sItemContextPickerEntryStore("ItemContextPickerEntry.db2", &ItemContextPickerEntryLoadInfo::Instance); +DB2Storage<ItemCreationContextEntry>            sItemCreationContextStore("ItemCreationContext.db2", &ItemCreationContextLoadInfo::Instance);  DB2Storage<ItemCurrencyCostEntry>               sItemCurrencyCostStore("ItemCurrencyCost.db2", &ItemCurrencyCostLoadInfo::Instance);  DB2Storage<ItemDamageAmmoEntry>                 sItemDamageAmmoStore("ItemDamageAmmo.db2", &ItemDamageAmmoLoadInfo::Instance);  DB2Storage<ItemDamageOneHandEntry>              sItemDamageOneHandStore("ItemDamageOneHand.db2", &ItemDamageOneHandLoadInfo::Instance); @@ -207,7 +208,9 @@ DB2Storage<ItemLimitCategoryConditionEntry>     sItemLimitCategoryConditionStore  DB2Storage<ItemModifiedAppearanceEntry>         sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", &ItemModifiedAppearanceLoadInfo::Instance);  DB2Storage<ItemModifiedAppearanceExtraEntry>    sItemModifiedAppearanceExtraStore("ItemModifiedAppearanceExtra.db2", &ItemModifiedAppearanceExtraLoadInfo::Instance);  DB2Storage<ItemNameDescriptionEntry>            sItemNameDescriptionStore("ItemNameDescription.db2", &ItemNameDescriptionLoadInfo::Instance); +DB2Storage<ItemOffsetCurveEntry>                sItemOffsetCurveStore("ItemOffsetCurve.db2", &ItemOffsetCurveLoadInfo::Instance);  DB2Storage<ItemPriceBaseEntry>                  sItemPriceBaseStore("ItemPriceBase.db2", &ItemPriceBaseLoadInfo::Instance); +DB2Storage<ItemScalingConfigEntry>              sItemScalingConfigStore("ItemScalingConfig.db2", &ItemScalingConfigLoadInfo::Instance);  DB2Storage<ItemSearchNameEntry>                 sItemSearchNameStore("ItemSearchName.db2", &ItemSearchNameLoadInfo::Instance);  DB2Storage<ItemSetEntry>                        sItemSetStore("ItemSet.db2", &ItemSetLoadInfo::Instance);  DB2Storage<ItemSetSpellEntry>                   sItemSetSpellStore("ItemSetSpell.db2", &ItemSetSpellLoadInfo::Instance); @@ -368,6 +371,7 @@ DB2Storage<TraitNodeXTraitCondEntry>            sTraitNodeXTraitCondStore("Trait  DB2Storage<TraitNodeXTraitCostEntry>            sTraitNodeXTraitCostStore("TraitNodeXTraitCost.db2", &TraitNodeXTraitCostLoadInfo::Instance);  DB2Storage<TraitNodeXTraitNodeEntryEntry>       sTraitNodeXTraitNodeEntryStore("TraitNodeXTraitNodeEntry.db2", &TraitNodeXTraitNodeEntryLoadInfo::Instance);  DB2Storage<TraitSubTreeEntry>                   sTraitSubTreeStore("TraitSubTree.db2", &TraitSubTreeLoadInfo::Instance); +DB2Storage<TraitSystemEntry>                    sTraitSystemStore("TraitSystem.db2", &TraitSystemLoadInfo::Instance);  DB2Storage<TraitTreeEntry>                      sTraitTreeStore("TraitTree.db2", &TraitTreeLoadInfo::Instance);  DB2Storage<TraitTreeLoadoutEntry>               sTraitTreeLoadoutStore("TraitTreeLoadout.db2", &TraitTreeLoadoutLoadInfo::Instance);  DB2Storage<TraitTreeLoadoutEntryEntry>          sTraitTreeLoadoutEntryStore("TraitTreeLoadoutEntry.db2", &TraitTreeLoadoutEntryLoadInfo::Instance); @@ -544,7 +548,7 @@ namespace      std::unordered_map<uint32, std::unordered_set<uint32>> _pvpStatIdsByMap;  } -void LoadDB2(std::bitset<TOTAL_LOCALES>& availableDb2Locales, std::vector<std::string>& errlist, StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path, +static void LoadDB2(std::bitset<TOTAL_LOCALES>& availableDb2Locales, std::vector<std::string>& errlist, StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path,      LocaleConstant defaultLocale, std::size_t cppRecordSize)  {      // validate structure @@ -815,6 +819,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      LOAD_DB2(sItemChildEquipmentStore);      LOAD_DB2(sItemClassStore);      LOAD_DB2(sItemContextPickerEntryStore); +    LOAD_DB2(sItemCreationContextStore);      LOAD_DB2(sItemCurrencyCostStore);      LOAD_DB2(sItemDamageAmmoStore);      LOAD_DB2(sItemDamageOneHandStore); @@ -833,7 +838,9 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      LOAD_DB2(sItemModifiedAppearanceStore);      LOAD_DB2(sItemModifiedAppearanceExtraStore);      LOAD_DB2(sItemNameDescriptionStore); +    LOAD_DB2(sItemOffsetCurveStore);      LOAD_DB2(sItemPriceBaseStore); +    LOAD_DB2(sItemScalingConfigStore);      LOAD_DB2(sItemSearchNameStore);      LOAD_DB2(sItemSetStore);      LOAD_DB2(sItemSetSpellStore); @@ -994,6 +1001,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul      LOAD_DB2(sTraitNodeXTraitCostStore);      LOAD_DB2(sTraitNodeXTraitNodeEntryStore);      LOAD_DB2(sTraitSubTreeStore); +    LOAD_DB2(sTraitSystemStore);      LOAD_DB2(sTraitTreeStore);      LOAD_DB2(sTraitTreeLoadoutStore);      LOAD_DB2(sTraitTreeLoadoutEntryStore); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index c670211c7e0..0c49a3832ed 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -146,6 +146,7 @@ TC_GAME_API extern DB2Storage<ItemBonusListLevelDeltaEntry>         sItemBonusLi  TC_GAME_API extern DB2Storage<ItemBonusTreeEntry>                   sItemBonusTreeStore;  TC_GAME_API extern DB2Storage<ItemBonusTreeNodeEntry>               sItemBonusTreeNodeStore;  TC_GAME_API extern DB2Storage<ItemContextPickerEntryEntry>          sItemContextPickerEntryStore; +TC_GAME_API extern DB2Storage<ItemCreationContextEntry>             sItemCreationContextStore;  TC_GAME_API extern DB2Storage<ItemDamageAmmoEntry>                  sItemDamageAmmoStore;  TC_GAME_API extern DB2Storage<ItemDamageOneHandEntry>               sItemDamageOneHandStore;  TC_GAME_API extern DB2Storage<ItemDamageOneHandCasterEntry>         sItemDamageOneHandCasterStore; @@ -162,7 +163,9 @@ TC_GAME_API extern DB2Storage<ItemLimitCategoryEntry>               sItemLimitCa  TC_GAME_API extern DB2Storage<ItemModifiedAppearanceEntry>          sItemModifiedAppearanceStore;  TC_GAME_API extern DB2Storage<ItemModifiedAppearanceExtraEntry>     sItemModifiedAppearanceExtraStore;  TC_GAME_API extern DB2Storage<ItemNameDescriptionEntry>             sItemNameDescriptionStore; +TC_GAME_API extern DB2Storage<ItemOffsetCurveEntry>                 sItemOffsetCurveStore;  TC_GAME_API extern DB2Storage<ItemPriceBaseEntry>                   sItemPriceBaseStore; +TC_GAME_API extern DB2Storage<ItemScalingConfigEntry>               sItemScalingConfigStore;  TC_GAME_API extern DB2Storage<ItemSearchNameEntry>                  sItemSearchNameStore;  TC_GAME_API extern DB2Storage<ItemSetEntry>                         sItemSetStore;  TC_GAME_API extern DB2Storage<ItemSetSpellEntry>                    sItemSetSpellStore; @@ -290,6 +293,7 @@ TC_GAME_API extern DB2Storage<TraitNodeXTraitCondEntry>             sTraitNodeXT  TC_GAME_API extern DB2Storage<TraitNodeXTraitCostEntry>             sTraitNodeXTraitCostStore;  TC_GAME_API extern DB2Storage<TraitNodeXTraitNodeEntryEntry>        sTraitNodeXTraitNodeEntryStore;  TC_GAME_API extern DB2Storage<TraitSubTreeEntry>                    sTraitSubTreeStore; +TC_GAME_API extern DB2Storage<TraitSystemEntry>                     sTraitSystemStore;  TC_GAME_API extern DB2Storage<TraitTreeEntry>                       sTraitTreeStore;  TC_GAME_API extern DB2Storage<TraitTreeLoadoutEntry>                sTraitTreeLoadoutStore;  TC_GAME_API extern DB2Storage<TraitTreeLoadoutEntryEntry>           sTraitTreeLoadoutEntryStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index c1f86a09c61..53dc4e45db5 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -141,7 +141,7 @@ struct AreaTableEntry      uint8 FactionGroupMask;      float AmbientMultiplier;      int32 MountFlags; -    int16 PvpCombatWorldStateID; +    int32 PvpCombatWorldStateID;      uint8 WildBattlePetLevelMin;      uint8 WildBattlePetLevelMax;      uint8 WindSettingsID; @@ -554,7 +554,7 @@ struct BroadcastTextEntry      int32 LanguageID;      int32 ConditionID;      uint16 EmotesID; -    uint16 Flags; +    int32 Flags;      uint32 ChatBubbleDurationMs;      int32 VoiceOverPriorityID;      std::array<uint32, 2> SoundKitID; @@ -900,7 +900,7 @@ struct ChrSpecializationEntry      int8 OrderIndex;      int8 PetTalentType;      int8 Role; -    uint32 Flags; +    int32 Flags;      int32 SpellIconFileID;      int8 PrimaryStatPriority;      int32 AnimReplacements; @@ -960,6 +960,8 @@ struct ContentTuningEntry      int32 DamageItemLevelCurveID;      int32 HealthPrimaryStatCurveID;      int32 DamagePrimaryStatCurveID; +    int32 PrimaryStatScalingModPlayerDataElementCharacterID; +    float PrimaryStatScalingModPlayerDataElementCharacterMultiplier;      int32 MinLevel;      int32 MaxLevel;      int32 MinLevelType; @@ -1486,7 +1488,7 @@ struct CurveEntry  {      uint32 ID;      uint8 Type; -    uint8 Flags; +    int32 Flags;  };  struct CurvePointEntry @@ -1495,7 +1497,7 @@ struct CurvePointEntry      DBCPosition2D PreSLSquishPos;      uint32 ID;      uint32 CurveID; -    uint8 OrderIndex; +    uint32 OrderIndex;  };  struct DestructibleModelDataEntry @@ -2187,7 +2189,7 @@ struct ItemEntry      uint8 SheatheType;      int8 SoundOverrideSubclassID;      int32 IconFileDataID; -    uint8 ItemGroupSoundsID; +    uint32 ItemGroupSoundsID;      int32 ContentTuningID;      int32 ModifiedCraftingReagentItemID;      int32 CraftingQualityID; @@ -2286,6 +2288,8 @@ struct ItemBonusTreeNodeEntry      int32 IblGroupPointsModSetID;      int32 MinMythicPlusLevel;      int32 MaxMythicPlusLevel; +    int32 ItemCreationContextGroupID; +    int32 Flags;      uint32 ParentItemBonusTreeID;  }; @@ -2318,6 +2322,13 @@ struct ItemContextPickerEntryEntry      uint32 ItemContextPickerID;  }; +struct ItemCreationContextEntry +{ +    uint32 ID; +    uint8 ItemContext; +    uint32 ItemCreationContextGroupID; +}; +  struct ItemCurrencyCostEntry  {      uint32 ID; @@ -2469,6 +2480,13 @@ struct ItemNameDescriptionEntry      int32 Color;  }; +struct ItemOffsetCurveEntry +{ +    uint32 ID; +    int32 CurveID; +    int32 Offset; +}; +  struct ItemPriceBaseEntry  {      uint32 ID; @@ -2477,6 +2495,15 @@ struct ItemPriceBaseEntry      float Weapon;  }; +struct ItemScalingConfigEntry +{ +    uint32 ID; +    int32 ItemOffsetCurveID; +    int32 ItemLevel; +    int32 RequiredLevel; +    int32 Unknown1125; +}; +  struct ItemSearchNameEntry  {      uint32 ID; @@ -2552,6 +2579,8 @@ struct ItemSparseEntry      int32 ModifiedCraftingReagentItemID;      int32 ContentTuningID;      int32 PlayerLevelToItemLevelCurveID; +    int32 ItemLevelOffsetCurveID; +    int32 ItemLevelOffsetItemLevel;      uint16 ItemNameDescriptionID;      uint16 RequiredTransmogHoliday;      uint16 RequiredHoliday; @@ -3250,7 +3279,7 @@ struct PlayerConditionEntry      std::array<uint32, 2> Time;      std::array<int32, 4> AuraSpellID;      std::array<uint8, 4> AuraStacks; -    std::array<uint16, 4> Achievement; +    std::array<uint32, 4> Achievement;      std::array<uint16, 4> AreaID;      std::array<uint8, 4> LfgStatus;      std::array<uint8, 4> LfgCompare; @@ -3269,6 +3298,7 @@ struct PlayerDataElementAccountEntry      uint32 ID;      int32 StorageIndex;      int32 Type; +    int32 Unknown1125;      PlayerDataElementType GetType() const { return static_cast<PlayerDataElementType>(Type); }  }; @@ -3278,6 +3308,7 @@ struct PlayerDataElementCharacterEntry      uint32 ID;      int32 StorageIndex;      int32 Type; +    int32 Unknown1125;      PlayerDataElementType GetType() const { return static_cast<PlayerDataElementType>(Type); }  }; @@ -3287,6 +3318,7 @@ struct PlayerDataFlagAccountEntry      uint32 ID;      int32 StorageIndex;      int32 Unknown1107; +    int32 Unknown1125;  };  struct PlayerDataFlagCharacterEntry @@ -3294,6 +3326,7 @@ struct PlayerDataFlagCharacterEntry      uint32 ID;      int32 StorageIndex;      int32 Unknown1107; +    int32 Unknown1125;  };  struct PowerDisplayEntry @@ -3551,8 +3584,8 @@ struct ScenarioStepEntry  struct SceneScriptEntry  {      uint32 ID; -    uint16 FirstSceneScriptID; -    uint16 NextSceneScriptID; +    uint32 FirstSceneScriptID; +    uint32 NextSceneScriptID;      int32 Unknown915;  }; @@ -3751,10 +3784,10 @@ struct SpellCategoriesEntry      uint32 ID;      uint8 DifficultyID;      int16 Category; -    int8 DefenseType; +    int32 DefenseType;      int8 DispelType;      int8 Mechanic; -    int8 PreventionType; +    int32 PreventionType;      int16 StartRecoveryCategory;      int16 ChargeCategory;      uint32 SpellID; @@ -3868,7 +3901,7 @@ struct SpellInterruptsEntry  {      uint32 ID;      uint8 DifficultyID; -    int16 InterruptFlags; +    int32 InterruptFlags;      std::array<int32, MAX_SPELL_AURA_INTERRUPT_FLAGS> AuraInterruptFlags;      std::array<int32, MAX_SPELL_AURA_INTERRUPT_FLAGS> ChannelInterruptFlags;      uint32 SpellID; @@ -4367,6 +4400,7 @@ struct TraitCostEntry      uint32 ID;      int32 Amount;      int32 TraitCurrencyID; +    int32 CurveID;  };  struct TraitCurrencyEntry @@ -4376,6 +4410,8 @@ struct TraitCurrencyEntry      int32 CurrencyTypesID;      int32 Flags;      int32 Icon; +    int32 PlayerDataElementAccountID; +    int32 PlayerDataElementCharacterID;      TraitCurrencyType GetType() const { return static_cast<TraitCurrencyType>(Type); }  }; @@ -4523,6 +4559,18 @@ struct TraitSubTreeEntry      uint32 TraitTreeID;             // Parent tree  }; +struct TraitSystemEntry +{ +    uint32 ID; +    int32 Flags; +    int32 WidgetSetID; +    int32 TraitChangeSpell; +    int32 ItemID; +    int32 VariationType; + +    TraitSystemVariationType GetVariationType() const { return static_cast<TraitSystemVariationType>(VariationType); } +}; +  struct TraitTreeEntry  {      uint32 ID; @@ -4662,6 +4710,7 @@ struct UiMapAssignmentEntry      int32 AreaID;      int32 WmoDoodadPlacementID;      int32 WmoGroupID; +    int32 Unknown1125;  };  struct UiMapLinkEntry diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 00ad0d2a5d2..7d185003a39 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -1229,6 +1229,9 @@ enum ItemBonusType      ITEM_BONUS_OVERRIDE_DESCRIPTION_COLOR       = 45,             // Overrides color of item description and upgrade track if TimeEvent from value[1] has passed      ITEM_BONUS_OVERRIDE_CANNOT_TRADE_BOP        = 46,      ITEM_BONUS_BONDING_WITH_PRIORITY            = 47, +    ITEM_BONUS_ITEM_OFFSET_CURVE                = 48, +    ITEM_BONUS_SCALING_CONFIG_AND_REQ_LEVEL     = 49, +    ITEM_BONUS_SCALING_CONFIG                   = 51,  };  enum class ItemCollectionType : uint8 @@ -1241,6 +1244,10 @@ enum class ItemCollectionType : uint8      RuneforgeLegendaryAbility   = 5,      TransmogIllusion            = 6,      WarbandScene                = 7, +    Room                        = 8, +    ExteriorFixture             = 9, +    RoomTheme                   = 10, +    RoomMaterial                = 11  };  enum class ItemContext : uint8 @@ -1410,6 +1417,27 @@ enum class ItemContext : uint8      Tournament_Realm_2                              = 162,      Tournament_Realm_3                              = 163,      Tournament_Realm_4                              = 164, +    Warbound_1                                      = 165, +    Warbound_2                                      = 166, +    Warbound_3                                      = 167, +    Warbound_4                                      = 168, +    Warbound_5                                      = 169, +    Warbound_6                                      = 170, +    Warbound_7                                      = 171, +    Warbound_8                                      = 172, +    Warbound_9                                      = 173, +    Warbound_10                                     = 174, +    Warbound_11                                     = 175, +    Warbound_12                                     = 176, +    Warbound_13                                     = 177, +    Warbound_14                                     = 178, +    Warbound_15                                     = 179, +    Warbound_16                                     = 180, +    Warbound_17                                     = 181, +    Warbound_18                                     = 182, +    Warbound_19                                     = 183, +    Warbound_20                                     = 184, +    Endeavors                                       = 185,      Max  }; @@ -2515,9 +2543,10 @@ enum class TraitConfigType : int32  enum class TraitCurrencyType : int32  { -    Gold                = 0, -    CurrencyTypesBased  = 1, -    TraitSourced        = 2 +    Gold                             = 0, +    CurrencyTypesBased               = 1, +    TraitSourced                     = 2, +    TraitSourcedPlayerDataElement    = 3,  };  enum class TraitEdgeType : int32 @@ -2541,7 +2570,8 @@ enum class TraitNodeEntryType : int32      SpendDiamond        = 6,      ProfPath            = 7,      ProfPerk            = 8, -    ProfPathUnlock      = 9 +    ProfPathUnlock      = 9, +    SpendInfinite       = 10  };  enum class TraitNodeGroupFlag : int32 @@ -2567,6 +2597,12 @@ enum class TraitPointsOperationType : int32      Multiply    = 1  }; +enum class TraitSystemVariationType : int32 +{ +    None    = 0, +    Spec    = 1 +}; +  enum class TraitTreeFlag : int32  {      None                    = 0x0, diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 1ed4b4d06ca..4dc90db22fe 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -194,7 +194,8 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti          }      } -    SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimationDataID), GetCreateProperties()->AnimId); +    if (GetCreateProperties()->AnimId != -1) +        SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimationDataID, 0), GetCreateProperties()->AnimId);      SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimKitID), GetCreateProperties()->AnimKitId);      if (GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::VisualAnimIsDecay))          SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::IsDecay), true); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 0dc621bd8ce..20705e3036e 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -2327,17 +2327,22 @@ uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bon      if (AzeriteLevelInfoEntry const* azeriteLevelInfo = sAzeriteLevelInfoStore.LookupEntry(azeriteLevel))          itemLevel = azeriteLevelInfo->ItemLevel; -    if (bonusData.PlayerLevelToItemLevelCurveId) +    if (!bonusData.ItemLevelOffsetCurveId)      { -        if (fixedLevel) -            level = fixedLevel; -        else if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(bonusData.ContentTuningId, 0, true)) -            level = std::min(std::max(int16(level), levels->MinLevel), levels->MaxLevel); +        if (bonusData.PlayerLevelToItemLevelCurveId) +        { +            if (fixedLevel) +                level = fixedLevel; +            else if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(bonusData.ContentTuningId, 0, true)) +                level = std::min(std::max(int16(level), levels->MinLevel), levels->MaxLevel); -        itemLevel = uint32(sDB2Manager.GetCurveValueAt(bonusData.PlayerLevelToItemLevelCurveId, level)); -    } +            itemLevel = uint32(sDB2Manager.GetCurveValueAt(bonusData.PlayerLevelToItemLevelCurveId, level)); +        } -    itemLevel += bonusData.ItemLevelBonus; +        itemLevel += bonusData.ItemLevelBonus; +    } +    else +        itemLevel = bonusData.ItemLevelOffset + uint32(sDB2Manager.GetCurveValueAt(bonusData.ItemLevelOffsetCurveId, bonusData.ItemLevelOffsetItemLevel));      for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i)          itemLevel += bonusData.GemItemLevelBonus[i]; @@ -2935,6 +2940,10 @@ void BonusData::Initialize(ItemTemplate const* proto)      PvpItemLevel = 0;      PvpItemLevelBonus = 0; +    ItemLevelOffsetCurveId = proto->GetItemLevelOffsetCurveId(); +    ItemLevelOffsetItemLevel = proto->GetItemLevelOffsetItemLevel(); +    ItemLevelOffset = 0; +      EffectCount = 0;      for (ItemEffectEntry const* itemEffect : proto->Effects)          Effects[EffectCount++] = itemEffect; @@ -3137,5 +3146,49 @@ void BonusData::AddBonus(uint32 type, std::array<int32, 4> const& values)                  _state.BondingPriority = values[1];              }              break; +        case ITEM_BONUS_ITEM_OFFSET_CURVE: +            if (values[3] < _state.ScalingStatDistributionPriority) +            { +                ItemLevelOffsetCurveId = values[0]; +                ItemLevelOffsetItemLevel = values[1]; +                _state.ScalingStatDistributionPriority = values[3]; +            } +            break; +        case ITEM_BONUS_SCALING_CONFIG_AND_REQ_LEVEL: +            if (values[1] < _state.ScalingStatDistributionPriority) +            { +                if (ItemScalingConfigEntry const* scalingConfig = sItemScalingConfigStore.LookupEntry(values[0])) +                { +                    if (ItemOffsetCurveEntry const* itemOffsetCurve = sItemOffsetCurveStore.LookupEntry(scalingConfig->ItemOffsetCurveID)) +                    { +                        ItemLevelOffsetCurveId = itemOffsetCurve->CurveID; +                        ItemLevelOffset = itemOffsetCurve->Offset; +                    } + +                    ItemLevelOffsetItemLevel = scalingConfig->ItemLevel; + +                    if (values[1] < _state.RequiredLevelCurvePriority) +                    { +                        RequiredLevelOverride = scalingConfig->RequiredLevel; +                        RequiredLevelCurve = 0; +                    } +                } +            } +            break; +        case ITEM_BONUS_SCALING_CONFIG: +            if (values[1] < _state.ScalingStatDistributionPriority) +            { +                if (ItemScalingConfigEntry const* scalingConfig = sItemScalingConfigStore.LookupEntry(values[0])) +                { +                    if (ItemOffsetCurveEntry const* itemOffsetCurve = sItemOffsetCurveStore.LookupEntry(scalingConfig->ItemOffsetCurveID)) +                    { +                        ItemLevelOffsetCurveId = itemOffsetCurve->CurveID; +                        ItemLevelOffset = itemOffsetCurve->Offset; +                    } + +                    ItemLevelOffsetItemLevel = 0; +                } +            } +            break;      }  } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index f1815c0c337..bb3bc76436a 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -83,6 +83,9 @@ struct BonusData      int32 RequiredLevelCurve;      uint16 PvpItemLevel;      int16 PvpItemLevelBonus; +    uint32 ItemLevelOffsetCurveId; +    uint32 ItemLevelOffsetItemLevel; +    uint32 ItemLevelOffset;      std::array<ItemEffectEntry const*, 13> Effects;      std::size_t EffectCount;      uint32 LimitCategory; diff --git a/src/server/game/Entities/Item/ItemBonusMgr.cpp b/src/server/game/Entities/Item/ItemBonusMgr.cpp index fd660c02188..7d2b955da9c 100644 --- a/src/server/game/Entities/Item/ItemBonusMgr.cpp +++ b/src/server/game/Entities/Item/ItemBonusMgr.cpp @@ -36,6 +36,7 @@ std::unordered_multimap<int32 /*azeriteUnlockMappingSetId*/, AzeriteUnlockMappin  std::unordered_multimap<uint32 /*itemBonusTreeId*/, ChallengeModeItemBonusOverrideEntry const*> _challengeModeItemBonusOverrides;  std::unordered_map<uint32 /*itemBonusListId*/, std::vector<ItemBonusEntry const*>> _itemBonusLists;  std::unordered_multimap<uint32, ItemBonusListGroupEntryEntry const*> _itemBonusListGroupEntries; +std::unordered_map<uint32 /*itemCreationContextGroupId*/, std::vector<ItemContext>> _itemContextByGroup;  std::unordered_map<int16 /*itemLevelDelta*/, uint32 /*itemBonusListId*/> _itemLevelDeltaToBonusListContainer;  std::unordered_map<uint32 /*itemLevelSelectorQualitySetId*/, ItemLevelSelectorQualities> _itemLevelQualitySelectorQualities;  std::unordered_map<uint32 /*itemBonusTreeId*/, std::set<ItemBonusTreeNodeEntry const*>> _itemBonusTrees; @@ -61,6 +62,9 @@ void Load()      for (ItemBonusListLevelDeltaEntry const* itemBonusListLevelDelta : sItemBonusListLevelDeltaStore)          _itemLevelDeltaToBonusListContainer[itemBonusListLevelDelta->ItemLevelDelta] = itemBonusListLevelDelta->ID; +    for (ItemCreationContextEntry const* itemCreationContext : sItemCreationContextStore) +        _itemContextByGroup[itemCreationContext->ItemCreationContextGroupID].push_back(ItemContext(itemCreationContext->ItemContext)); +      for (ItemLevelSelectorQualityEntry const* itemLevelSelectorQuality : sItemLevelSelectorQualityStore)          _itemLevelQualitySelectorQualities[itemLevelSelectorQuality->ParentILSQualitySetID].insert(itemLevelSelectorQuality); @@ -253,8 +257,23 @@ void ApplyBonusTreeHelper(ItemTemplate const* itemTemplate, uint32 itemBonusTree          ItemContext nodeContext = ItemContext(bonusTreeNode->ItemContext);          ItemContext requiredContext = nodeContext != ItemContext::Force_to_NONE ? nodeContext : ItemContext::NONE;          if (nodeContext != ItemContext::NONE && params.Context != requiredContext) +        { +            if (!(bonusTreeNode->Flags & 0x1)) +                continue; +        } +        else if (bonusTreeNode->Flags & 0x1 && nodeContext != ItemContext::NONE)              continue; +        if (bonusTreeNode->ItemCreationContextGroupID) +        { +            bool hasContextFromGroup = false; +            if (std::vector<ItemContext> const* itemContexts = Trinity::Containers::MapGetValuePtr(_itemContextByGroup, bonusTreeNode->ItemCreationContextGroupID)) +                hasContextFromGroup = advstd::ranges::contains(*itemContexts, params.Context); + +            if (!!(bonusTreeNode->Flags & 0x1) == hasContextFromGroup) +                continue; +        } +          if (params.MythicPlusKeystoneLevel)          {              if (bonusTreeNode->MinMythicPlusLevel && params.MythicPlusKeystoneLevel < bonusTreeNode->MinMythicPlusLevel) diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 2cf50162754..79295348d45 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -852,6 +852,8 @@ struct TC_GAME_API ItemTemplate      float GetStatPercentageOfSocket(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_STATS); return ExtendedData->StatPercentageOfSocket[index]; }      uint32 GetScalingStatContentTuning() const { return ExtendedData->ContentTuningID; }      uint32 GetPlayerLevelToItemLevelCurveId() const { return ExtendedData->PlayerLevelToItemLevelCurveID; } +    uint32 GetItemLevelOffsetCurveId() const { return ExtendedData->ItemLevelOffsetCurveID; } +    uint32 GetItemLevelOffsetItemLevel() const { return ExtendedData->ItemLevelOffsetItemLevel; }      uint32 GetDamageType() const { return ExtendedData->DamageDamageType; }      uint32 GetDelay() const { return ExtendedData->ItemDelay; }      float GetRangedModRange() const { return ExtendedData->ItemRange; } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 971b74494e0..e049ca95fae 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -171,6 +171,12 @@ namespace UF          setter.Clear();      } +    template<typename K, typename V> +    inline void RemoveMapUpdateFieldValue(MapUpdateFieldSetter<K, V>& setter, std::type_identity_t<K> const& key) +    { +        setter.RemoveKey(key); +    } +      template<typename T>      inline void RemoveOptionalUpdateFieldValue(OptionalUpdateFieldSetter<T>& setter)      { @@ -363,6 +369,13 @@ class TC_GAME_API Object              UF::RemoveDynamicUpdateFieldValue(setter, index);          } +        template<typename K, typename V> +        void RemoveMapUpdateFieldValue(UF::MapUpdateFieldSetter<K, V> setter, std::type_identity_t<K> const& key) +        { +            AddToObjectUpdateIfNeeded(); +            UF::RemoveMapUpdateFieldValue(setter, key); +        } +          template<typename T>          void ClearDynamicUpdateFieldValues(UF::DynamicUpdateFieldSetter<T> setter)          { diff --git a/src/server/game/Entities/Object/Updates/UpdateField.cpp b/src/server/game/Entities/Object/Updates/UpdateField.cpp deleted file mode 100644 index 2c0527190db..00000000000 --- a/src/server/game/Entities/Object/Updates/UpdateField.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "UpdateField.h" -#include "ByteBuffer.h" - -void UF::WriteDynamicFieldUpdateMask(std::size_t size, std::vector<uint32> const& updateMask, ByteBuffer& data, int32 bitsForSize /*= 32*/) -{ -    data.WriteBits(size, bitsForSize); -    if (size > 32) -    { -        if (data.HasUnfinishedBitPack()) -            for (std::size_t block = 0; block < size / 32; ++block) -                data.WriteBits(updateMask[block], 32); -        else -            for (std::size_t block = 0; block < size / 32; ++block) -                data << uint32(updateMask[block]); -    } -    else if (size == 32) -    { -        data.WriteBits(updateMask.back(), 32); -        return; -    } - -    if (size % 32) -        data.WriteBits(updateMask.back(), size % 32); -} - -void UF::WriteCompleteDynamicFieldUpdateMask(std::size_t size, ByteBuffer& data, int32 bitsForSize /*= 32*/) -{ -    data.WriteBits(size, bitsForSize); -    if (size > 32) -    { -        if (data.HasUnfinishedBitPack()) -            for (std::size_t block = 0; block < size / 32; ++block) -                data.WriteBits(0xFFFFFFFFu, 32); -        else -            for (std::size_t block = 0; block < size / 32; ++block) -                data << uint32(0xFFFFFFFFu); -    } -    else if (size == 32) -    { -        data.WriteBits(0xFFFFFFFFu, 32); -        return; -    } - -    if (size % 32) -        data.WriteBits(0xFFFFFFFFu, size % 32); -} diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index 874b38d87d8..8f351f8a37f 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -18,11 +18,13 @@  #ifndef UpdateField_h__  #define UpdateField_h__ +#include "Concepts.h"  #include "ObjectGuid.h"  #include "Optional.h"  #include "UpdateMask.h"  #include <algorithm>  #include <memory> +#include <unordered_map>  #include <variant>  #include <vector> @@ -63,6 +65,12 @@ namespace UF      template<typename T, int32 BlockBit, uint32 Bit>      class DynamicUpdateField; +    template<typename K, typename V> +    class MapUpdateFieldBase; + +    template<typename K, typename V, int32 BlockBit, uint32 Bit> +    class MapUpdateField; +      template<typename T>      class OptionalUpdateFieldBase; @@ -87,6 +95,13 @@ namespace UF      template<typename T, bool PublicSet>      struct MutableNestedFieldReference; +    enum class MapUpdateFieldState : uint8 +    { +        Unchanged   = 0, +        Changed     = 1, +        Deleted     = 2 +    }; +      struct IsUpdateFieldStructureTag      {      }; @@ -241,6 +256,25 @@ namespace UF          std::vector<uint32>& _updateMask;      }; +    template<typename K, typename V> +    struct MapUpdateFieldSetter +    { +        template<typename F, typename G> +        friend void RemoveMapUpdateFieldValue(MapUpdateFieldSetter<F, G>& setter, std::type_identity_t<F> const& key); + +        MapUpdateFieldSetter(std::unordered_map<K, V>& values) : _values(values) { } + +    private: +        void RemoveKey(K const& key) +        { +            auto itr = _values.find(key); +            if (itr != _values.end()) +                itr->second.state = MapUpdateFieldState::Deleted; +        } + +        std::unordered_map<K, V>& _values; +    }; +      template<typename T>      struct OptionalUpdateFieldSetter      { @@ -334,6 +368,35 @@ namespace UF              return { (_value.*field)._values[index] };          } +        template<typename K, typename V, int32 BlockBit, uint32 Bit> +        MapUpdateFieldSetter<K, typename MapUpdateField<K, V, BlockBit, Bit>::mapped_type> +            ModifyValue(MapUpdateField<K, V, BlockBit, Bit>(T::* field)) +        { +            if constexpr (BlockBit >= 0) +                _value._changesMask.Set(BlockBit); + +            _value._changesMask.Set(Bit); +            return { (_value.*field)._values }; +        } + +        template<typename K, typename V, int32 BlockBit, uint32 Bit> +        std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>, +            MutableFieldReference<V, PublicSet>, +            std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>, +            MutableNestedFieldReference<V, PublicSet>, +            UpdateFieldSetter<V, PublicSet>>> +            ModifyValue(MapUpdateField<K, V, BlockBit, Bit>(T::* field), std::type_identity_t<K> const& key) +        { +            if constexpr (BlockBit >= 0) +                _value._changesMask.Set(BlockBit); + +            _value._changesMask.Set(Bit); + +            auto itr = (_value.*field)._values.try_emplace(key).first; +            itr->second.state = MapUpdateFieldState::Changed; +            return { itr->second.value }; +        } +          template<typename V, int32 BlockBit, uint32 Bit>          OptionalUpdateFieldSetter<V> ModifyValue(OptionalUpdateField<V, BlockBit, Bit>(T::* field))          { @@ -499,6 +562,9 @@ namespace UF          template<typename T>          friend struct DynamicUpdateFieldSetter; +        template<typename K, typename V> +        friend struct MapUpdateFieldSetter; +          template<typename T, bool PublicSet>          friend struct MutableFieldReferenceWithChangesMask; @@ -545,7 +611,21 @@ namespace UF          }          template<typename Derived, typename T, int32 BlockBit, uint32 Bit> -        void MarkChanged(DynamicUpdateField<T, BlockBit, Bit>(Derived::*), uint32) +        void MarkChanged(DynamicUpdateField<T, BlockBit, Bit>(Derived::* field), uint32 index) +        { +            static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); + +            if constexpr (BlockBit >= 0) +                _changesMask.Set(BlockBit); + +            _changesMask.Set(Bit); +            DynamicUpdateField<T, BlockBit, Bit>& uf = (static_cast<Derived*>(this)->*field); +            if (index < uf.size()) +                uf.MarkChanged(index); +        } + +        template<typename Derived, typename K, typename V, int32 BlockBit, uint32 Bit> +        void MarkChanged(MapUpdateField<K, V, BlockBit, Bit>(Derived::* field), std::type_identity_t<K> const& key)          {              static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); @@ -553,6 +633,10 @@ namespace UF                  _changesMask.Set(BlockBit);              _changesMask.Set(Bit); +            MapUpdateField<K, V, BlockBit, Bit>& uf = (static_cast<Derived*>(this)->*field); +            auto itr = uf._values.find(key); +            if (itr != uf._values.end() && itr->second.state == MapUpdateFieldState::Unchanged) +                itr->second.state = MapUpdateFieldState::Changed;          }          template<typename Derived, typename T, int32 BlockBit, uint32 Bit> @@ -602,13 +686,24 @@ namespace UF          template<typename Derived, typename T, int32 BlockBit, uint32 Bit>          void ClearChanged(DynamicUpdateField<T, BlockBit, Bit>(Derived::* field), uint32 index)          { -            _changesMask.Reset(Bit); +            static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask");              DynamicUpdateField<T, BlockBit, Bit>& uf = (static_cast<Derived*>(this)->*field);              if (index < uf.size())                  uf.ClearChanged(index);          } +        template<typename Derived, typename K, typename V, int32 BlockBit, uint32 Bit> +        void ClearChanged(MapUpdateField<K, V, BlockBit, Bit>(Derived::* field), std::type_identity_t<K> const& key) +        { +            static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); + +            MapUpdateField<K, V, BlockBit, Bit>& uf = (static_cast<Derived*>(this)->*field); +            auto itr = uf._values.find(key); +            if (itr != uf._values.end() && itr->second.state == MapUpdateFieldState::Changed) +                itr->second.state = MapUpdateFieldState::Unchanged; +        } +          template<typename Derived, typename T, int32 BlockBit, uint32 Bit>          void ClearChanged(OptionalUpdateField<T, BlockBit, Bit>(Derived::*))          { @@ -628,23 +723,23 @@ namespace UF          Mask const& GetChangesMask() const { return _changesMask; }      protected: -        template<typename T, int32 BlockBit, uint32 Bit> -        static void ClearChangesMask(UpdateField<T, BlockBit, Bit>& field) +        template<typename T> +        static inline void ClearChangesMask(UpdateFieldBase<T>& field)          {              if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)                  field._value.ClearChangesMask();          } -        template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit> -        static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>& field) +        template<typename T, std::size_t Size> +        static inline void ClearChangesMask(UpdateFieldArrayBase<T, Size>& field)          {              if constexpr (std::disjunction_v<std::is_base_of<HasChangesMaskTag, T>, std::is_base_of<IsUpdateFieldHolderTag, T>>)                  for (T& value : field._values)                      value.ClearChangesMask();          } -        template<typename T, int32 BlockBit, uint32 Bit> -        static void ClearChangesMask(DynamicUpdateField<T, BlockBit, Bit>& field) +        template<typename T> +        static inline void ClearChangesMask(DynamicUpdateFieldBase<T>& field)          {              if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)                  for (T& value : field._values) @@ -653,16 +748,45 @@ namespace UF              field.ClearChangesMask();          } -        template<typename T, int32 BlockBit, uint32 Bit> -        static void ClearChangesMask(OptionalUpdateField<T, BlockBit, Bit>& field) +        template<typename K, typename V> +        static inline void ClearChangesMask(MapUpdateFieldBase<K, V>& field) +        { +            for (auto itr = field._values.begin(); itr != field._values.end(); ) +            { +                switch (itr->second.state) +                { +                    case MapUpdateFieldState::Unchanged: +                        break; +                    case MapUpdateFieldState::Changed: +                        if constexpr (std::is_base_of_v<HasChangesMaskTag, K>) +                            itr->first.ClearChangesMask(); + +                        if constexpr (std::is_base_of_v<HasChangesMaskTag, V>) +                            itr->second.value.ClearChangesMask(); + +                        itr->second.state = MapUpdateFieldState::Unchanged; +                        break; +                    case MapUpdateFieldState::Deleted: +                        itr = field._values.erase(itr++); +                        continue; +                    default: +                        break; +                } + +                ++itr; +            } +        } + +        template<typename T> +        static inline void ClearChangesMask(OptionalUpdateFieldBase<T>& field)          {              if constexpr (std::is_base_of_v<HasChangesMaskTag, T>)                  if (field.has_value())                      field._value->ClearChangesMask();          } -        template<int32 BlockBit, uint32 Bit, typename... Types> -        static void ClearChangesMask(VariantUpdateField<BlockBit, Bit, Types...>& field) +        template<typename... Types> +        static inline void ClearChangesMask(VariantUpdateFieldBase<Types...>& field)          {              if constexpr ((std::is_base_of_v<HasChangesMaskTag, Types> || ...))                  std::visit([]<typename T>(T& value) @@ -783,7 +907,6 @@ namespace UF      };      void WriteDynamicFieldUpdateMask(std::size_t size, std::vector<uint32> const& updateMask, ByteBuffer& data, int32 bitsForSize = 32); -    void WriteCompleteDynamicFieldUpdateMask(std::size_t size, ByteBuffer& data, int32 bitsForSize = 32);      template<typename T>      class DynamicUpdateFieldBase : public IsUpdateFieldHolderTag @@ -887,6 +1010,81 @@ namespace UF      {      }; +    template<typename K, typename V> +    class MapUpdateFieldBase : public IsUpdateFieldHolderTag +    { +        template<typename F, bool PublicSet> +        friend struct MutableFieldReferenceWithChangesMask; + +        template<typename F, bool PublicSet> +        friend struct MutableFieldReferenceNoChangesMask; + +        template<typename F, bool PublicSet> +        friend struct MutableNestedFieldReference; + +        template<std::size_t Bits> +        friend class HasChangesMask; + +    public: +        struct Value +        { +            V value; +            MapUpdateFieldState state; +        }; + +        using key_type = K; +        using mapped_type = Value; +        using value_type = std::pair<key_type const, mapped_type>; + +        typename std::unordered_map<K, Value>::const_iterator begin() const +        { +            return _values.begin(); +        } + +        typename std::unordered_map<K, Value>::const_iterator end() const +        { +            return _values.end(); +        } + +        bool empty() const +        { +            return _values.empty(); +        } + +        std::size_t size() const +        { +            return _values.size(); +        } + +        V const* Get(K const& key) const +        { +            auto itr = _values.find(key); +            if (itr != _values.end()) +                return &itr->second.value; + +            return nullptr; +        } + +        template <Trinity::invocable_r<bool, V const&> Pred> +        std::pair<K const*, V const*> FindIf(Pred&& pred) const +        { +            auto itr = std::ranges::find_if(_values, std::forward<Pred>(pred), +                [](value_type const& pair) -> V const& { return pair.second.value; }); +            if (itr != _values.end()) +                return std::make_pair(&itr->first, &itr->second.value); + +            return { nullptr, nullptr }; +        } + +    private: +        std::unordered_map<K, Value> _values; +    }; + +    template<typename K, typename V, int32 BlockBit, uint32 Bit> +    class MapUpdateField : public MapUpdateFieldBase<K, V> +    { +    }; +      template<typename T>      class OptionalUpdateFieldBase : public IsUpdateFieldHolderTag      { diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h b/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h new file mode 100644 index 00000000000..da0e68c3f3c --- /dev/null +++ b/src/server/game/Entities/Object/Updates/UpdateFieldImpl.h @@ -0,0 +1,129 @@ +/*
 + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms of the GNU General Public License as published by the
 + * Free Software Foundation; either version 2 of the License, or (at your
 + * option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful, but WITHOUT
 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU General Public License along
 + * with this program. If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +#ifndef TRINITYCORE_UPDATE_FIELD_IMPL_H
 +#define TRINITYCORE_UPDATE_FIELD_IMPL_H
 +
 +#include "UpdateField.h"
 +#include "ByteBuffer.h"
 +
 +class Player;
 +
 +namespace UF
 +{
 +inline void WriteDynamicFieldUpdateMask(std::size_t size, std::vector<uint32> const& updateMask, ByteBuffer& data, int32 bitsForSize /*= 32*/)
 +{
 +    data.WriteBits(size, bitsForSize);
 +    if (size > 32)
 +    {
 +        if (data.HasUnfinishedBitPack())
 +            for (std::size_t block = 0; block < size / 32; ++block)
 +                data.WriteBits(updateMask[block], 32);
 +        else
 +            for (std::size_t block = 0; block < size / 32; ++block)
 +                data << uint32(updateMask[block]);
 +    }
 +    else if (size == 32)
 +    {
 +        data.WriteBits(updateMask.back(), 32);
 +        return;
 +    }
 +
 +    if (size % 32)
 +        data.WriteBits(updateMask.back(), size % 32);
 +}
 +
 +inline void WriteCompleteDynamicFieldUpdateMask(std::size_t size, ByteBuffer& data, int32 bitsForSize = 32)
 +{
 +    data.WriteBits(size, bitsForSize);
 +    if (size > 32)
 +    {
 +        if (data.HasUnfinishedBitPack())
 +            for (std::size_t block = 0; block < size / 32; ++block)
 +                data.WriteBits(0xFFFFFFFFu, 32);
 +        else
 +            for (std::size_t block = 0; block < size / 32; ++block)
 +                data << uint32(0xFFFFFFFFu);
 +    }
 +    else if (size == 32)
 +    {
 +        data.WriteBits(0xFFFFFFFFu, 32);
 +        return;
 +    }
 +
 +    if (size % 32)
 +        data.WriteBits(0xFFFFFFFFu, size % 32);
 +}
 +
 +template <typename K, typename V, typename T>
 +inline void WriteMapFieldCreate(MapUpdateFieldBase<K, V> const& map, ByteBuffer& data, T const* owner, Player const* receiver)
 +{
 +    data << uint32(map.size());
 +    for (auto const& [k, v] : map)
 +    {
 +        if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, K>)
 +            k.WriteCreate(data, owner, receiver);
 +        else
 +            data << k;
 +
 +        if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, V>)
 +            v.value.WriteCreate(data, owner, receiver);
 +        else
 +            data << v.value;
 +    }
 +}
 +
 +template <typename K, typename V, typename T>
 +inline void WriteMapFieldUpdate(MapUpdateFieldBase<K, V> const& map, ByteBuffer& data, bool ignoreChangesMask, T const* owner, Player const* receiver)
 +{
 +    data << uint8(ignoreChangesMask ? 1 : 0);
 +    if (ignoreChangesMask)
 +        UF::WriteMapFieldCreate(map, data, owner, receiver);
 +    else
 +    {
 +        uint16 changesCount = 0;
 +        size_t changesCountPos = data.wpos();
 +        data << uint16(changesCount);
 +
 +        for (auto const& [k, v] : map)
 +        {
 +            if (v.state == MapUpdateFieldState::Unchanged)
 +                continue;
 +
 +            ++changesCount;
 +
 +            if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, K>)
 +                k.WriteUpdate(data, true /*ignoreChangesMask*/, owner, receiver);
 +            else
 +                data << k;
 +
 +            data << uint8(v.state);
 +            if (v.state == MapUpdateFieldState::Deleted)
 +                continue;
 +
 +            if constexpr (std::is_base_of_v<IsUpdateFieldStructureTag, V>)
 +                v.value.WriteUpdate(data, true /*ignoreChangesMask*/, owner, receiver); // client bug replaces unchanged values with 0/default so send everything as if it changed
 +            else
 +                data << v.value;
 +        }
 +
 +        data.put<uint16>(changesCountPos, changesCount);
 +    }
 +}
 +}
 +
 +#endif // TRINITYCORE_UPDATE_FIELD_IMPL_H
 diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 0db907a813a..7df3bcb97a5 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -22,6 +22,7 @@  #include "DynamicObject.h"  #include "PacketOperators.h"  #include "Player.h" +#include "UpdateFieldImpl.h"  #include "ViewerDependentValues.h"  // This file is automatically generated, DO NOT EDIT @@ -2098,14 +2099,14 @@ bool ChrCustomizationChoice::operator==(ChrCustomizationChoice const& right) con  void QuestLog::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const  { -    data << int64(EndTime);      data << int32(QuestID); -    data << uint32(StateFlags); -    data << uint32(ObjectiveFlags); +    data << uint16(StateFlags);      for (uint32 i = 0; i < 24; ++i)      {          data << int16(ObjectiveProgress[i]);      } +    data << int64(EndTime); +    data << uint32(ObjectiveFlags);  }  void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const @@ -2123,15 +2124,15 @@ void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player cons      {          if (changesMask[1])          { -            data << int64(EndTime); +            data << int32(QuestID);          }          if (changesMask[2])          { -            data << int32(QuestID); +            data << uint16(StateFlags);          }          if (changesMask[3])          { -            data << uint32(StateFlags); +            data << int64(EndTime);          }          if (changesMask[4])          { @@ -2152,9 +2153,9 @@ void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player cons  void QuestLog::ClearChangesMask()  { -    Base::ClearChangesMask(EndTime);      Base::ClearChangesMask(QuestID);      Base::ClearChangesMask(StateFlags); +    Base::ClearChangesMask(EndTime);      Base::ClearChangesMask(ObjectiveFlags);      Base::ClearChangesMask(ObjectiveProgress);      _changesMask.ResetAll(); @@ -3508,8 +3509,8 @@ void CompletedProject::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pla  void CompletedProject::ClearChangesMask()  { -    Base::ClearChangesMask(ProjectID);      Base::ClearChangesMask(FirstCompleted); +    Base::ClearChangesMask(ProjectID);      Base::ClearChangesMask(CompletionCount);      _changesMask.ResetAll();  } @@ -3809,6 +3810,7 @@ void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player cons      if (Type == 3)      {          data << int32(TraitSystemID); +        data << int32(VariationID);      }      for (uint32 i = 0; i < Entries.size(); ++i)      { @@ -3829,7 +3831,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c      if (ignoreChangesMask)          changesMask.SetAll(); -    data.WriteBits(changesMask.GetBlock(0), 14); +    data.WriteBits(changesMask.GetBlock(0), 15);      if (changesMask[0])      { @@ -3923,6 +3925,13 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c                  data << int32(TraitSystemID);              }          } +        if (changesMask[14]) +        { +            if (Type == 3) +            { +                data << int32(VariationID); +            } +        }      }      if (changesMask[4])      { @@ -3947,6 +3956,7 @@ void TraitConfig::ClearChangesMask()      Base::ClearChangesMask(CombatConfigFlags);      Base::ClearChangesMask(LocalIdentifier);      Base::ClearChangesMask(TraitSystemID); +    Base::ClearChangesMask(VariationID);      _changesMask.ResetAll();  } @@ -4822,6 +4832,7 @@ void ChallengeModeData::WriteCreate(ByteBuffer& data, Player const* owner, Playe      data << int64(Unknown_1120_4);      data << KeystoneOwnerGUID;      data << LeaverGUID; +    data << int64(InstanceAbandonVoteCooldown);      data.WriteBits(IsActive, 1);      data.WriteBits(HasRestrictions, 1);      data.WriteBits(CanVoteAbandon, 1); @@ -4836,6 +4847,7 @@ void ChallengeModeData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl      data << int64(Unknown_1120_4);      data << KeystoneOwnerGUID;      data << LeaverGUID; +    data << int64(InstanceAbandonVoteCooldown);      data.WriteBits(IsActive, 1);      data.WriteBits(HasRestrictions, 1);      data.WriteBits(CanVoteAbandon, 1); @@ -4850,6 +4862,7 @@ bool ChallengeModeData::operator==(ChallengeModeData const& right) const          && Unknown_1120_4 == right.Unknown_1120_4          && KeystoneOwnerGUID == right.KeystoneOwnerGUID          && LeaverGUID == right.LeaverGUID +        && InstanceAbandonVoteCooldown == right.InstanceAbandonVoteCooldown          && IsActive == right.IsActive          && HasRestrictions == right.HasRestrictions          && CanVoteAbandon == right.CanVoteAbandon; @@ -5038,7 +5051,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f      data << int32(TransportServerTime);      data << uint32(WeeklyRewardsPeriodSinceOrigin);      data << int16(DEBUGSoulbindConduitRank); -    data << uint32(TraitConfigs.size());      data << uint32(ActiveCombatTraitConfigID);      data << uint32(CraftingOrders.size());      data << uint32(PersonalCraftingOrderCounts.size()); @@ -5196,6 +5208,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f      data << *FrozenPerksVendorItem;      Field_1410->WriteCreate(data, owner, receiver);      data << *DungeonScore; +    WriteMapFieldCreate(TraitConfigs, data, owner, receiver);      for (uint32 i = 0; i < PvpInfo.size(); ++i)      {          PvpInfo[i].WriteCreate(data, owner, receiver); @@ -5204,10 +5217,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f      {          CharacterRestrictions[i].WriteCreate(data, owner, receiver);      } -    for (uint32 i = 0; i < TraitConfigs.size(); ++i) -    { -        TraitConfigs[i].WriteCreate(data, owner, receiver); -    }      for (uint32 i = 0; i < CraftingOrders.size(); ++i)      {          CraftingOrders[i].WriteCreate(data, owner, receiver); @@ -5306,11 +5315,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);          }      } -    if (changesMask[43]) +    if (changesMask[42])      {          for (uint32 i = 0; i < 1; ++i)          { -            if (changesMask[44]) +            if (changesMask[43])              {                  if (!ignoreNestedChangesMask)                      ResearchSites[i].WriteUpdateMask(data); @@ -5319,11 +5328,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo              }          }      } -    if (changesMask[45]) +    if (changesMask[44])      {          for (uint32 i = 0; i < 1; ++i)          { -            if (changesMask[46]) +            if (changesMask[45])              {                  if (!ignoreNestedChangesMask)                      ResearchSiteProgress[i].WriteUpdateMask(data); @@ -5332,11 +5341,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo              }          }      } -    if (changesMask[47]) +    if (changesMask[46])      {          for (uint32 i = 0; i < 1; ++i)          { -            if (changesMask[48]) +            if (changesMask[47])              {                  if (!ignoreNestedChangesMask)                      Research[i].WriteUpdateMask(data); @@ -5345,11 +5354,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo              }          }      } -    if (changesMask[43]) +    if (changesMask[42])      {          for (uint32 i = 0; i < 1; ++i)          { -            if (changesMask[44]) +            if (changesMask[43])              {                  for (uint32 j = 0; j < ResearchSites[i].size(); ++j)                  { @@ -5361,11 +5370,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo              }          }      } -    if (changesMask[45]) +    if (changesMask[44])      {          for (uint32 i = 0; i < 1; ++i)          { -            if (changesMask[46]) +            if (changesMask[45])              {                  for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)                  { @@ -5377,11 +5386,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo              }          }      } -    if (changesMask[47]) +    if (changesMask[46])      {          for (uint32 i = 0; i < 1; ++i)          { -            if (changesMask[48]) +            if (changesMask[47])              {                  for (uint32 j = 0; j < Research[i].size(); ++j)                  { @@ -5556,46 +5565,39 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo          if (changesMask[34])          {              if (!ignoreNestedChangesMask) -                TraitConfigs.WriteUpdateMask(data); -            else -                WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data); -        } -        if (changesMask[35]) -        { -            if (!ignoreNestedChangesMask)                  CraftingOrders.WriteUpdateMask(data);              else                  WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);          } -        if (changesMask[36]) +        if (changesMask[35])          {              if (!ignoreNestedChangesMask)                  PersonalCraftingOrderCounts.WriteUpdateMask(data);              else                  WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data);          } -        if (changesMask[37]) +        if (changesMask[36])          {              if (!ignoreNestedChangesMask)                  NpcCraftingOrders.WriteUpdateMask(data);              else                  WriteCompleteDynamicFieldUpdateMask(NpcCraftingOrders.size(), data);          } -        if (changesMask[38]) +        if (changesMask[37])          {              if (!ignoreNestedChangesMask)                  CategoryCooldownMods.WriteUpdateMask(data);              else                  WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data);          } -        if (changesMask[39]) +        if (changesMask[38])          {              if (!ignoreNestedChangesMask)                  WeeklySpellUses.WriteUpdateMask(data);              else                  WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data);          } -        if (changesMask[40]) +        if (changesMask[39])          {              if (!ignoreNestedChangesMask)                  TrackedCollectableSources.WriteUpdateMask(data); @@ -5849,7 +5851,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[36]) +        if (changesMask[35])          {              for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)              { @@ -5859,7 +5861,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[37]) +        if (changesMask[36])          {              for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i)              { @@ -5869,7 +5871,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[38]) +        if (changesMask[37])          {              for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)              { @@ -5879,7 +5881,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[39]) +        if (changesMask[38])          {              for (uint32 i = 0; i < WeeklySpellUses.size(); ++i)              { @@ -5889,7 +5891,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[40]) +        if (changesMask[39])          {              for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)              { @@ -5903,14 +5905,14 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo      data.FlushBits();      if (changesMask[32])      { -        if (changesMask[41]) +        if (changesMask[40])          {              if (!ignoreNestedChangesMask)                  CharacterBankTabSettings.WriteUpdateMask(data, 3);              else                  WriteCompleteDynamicFieldUpdateMask(CharacterBankTabSettings.size(), data, 3);          } -        if (changesMask[42]) +        if (changesMask[41])          {              if (!ignoreNestedChangesMask)                  AccountBankTabSettings.WriteUpdateMask(data, 3); @@ -5946,16 +5948,6 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo      {          if (changesMask[34])          { -            for (uint32 i = 0; i < TraitConfigs.size(); ++i) -            { -                if (TraitConfigs.HasChanged(i) || ignoreNestedChangesMask) -                { -                    TraitConfigs[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); -                } -            } -        } -        if (changesMask[35]) -        {              for (uint32 i = 0; i < CraftingOrders.size(); ++i)              {                  if (CraftingOrders.HasChanged(i) || ignoreNestedChangesMask) @@ -5964,7 +5956,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[41]) +        if (changesMask[40])          {              for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i)              { @@ -5974,7 +5966,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[42]) +        if (changesMask[41])          {              for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i)              { @@ -5984,337 +5976,337 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo                  }              }          } -        if (changesMask[49]) +        if (changesMask[48])          {              data << *FarsightObject;          } -        if (changesMask[50]) +        if (changesMask[49])          {              data << *SummonedBattlePetGUID;          } -        if (changesMask[51]) +        if (changesMask[50])          {              data << uint64(Coinage);          } -        if (changesMask[52]) +        if (changesMask[51])          {              data << uint64(AccountBankCoinage);          } -        if (changesMask[53]) +        if (changesMask[52])          {              data << int32(XP);          } -        if (changesMask[54]) +        if (changesMask[53])          {              data << int32(NextLevelXP);          } -        if (changesMask[55]) +        if (changesMask[54])          {              data << int32(TrialXP);          } -        if (changesMask[56]) +        if (changesMask[55])          {              Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);          } -        if (changesMask[57]) +        if (changesMask[56])          {              data << int32(CharacterPoints);          } -        if (changesMask[58]) +        if (changesMask[57])          {              data << int32(MaxTalentTiers);          } -        if (changesMask[59]) +        if (changesMask[58])          {              data << uint32(TrackCreatureMask);          } -        if (changesMask[60]) +        if (changesMask[59])          {              data << float(MainhandExpertise);          } -        if (changesMask[61]) +        if (changesMask[60])          {              data << float(OffhandExpertise);          } -        if (changesMask[62]) +        if (changesMask[61])          {              data << float(RangedExpertise);          } -        if (changesMask[63]) +        if (changesMask[62])          {              data << float(CombatRatingExpertise);          } -        if (changesMask[64]) +        if (changesMask[63])          {              data << float(BlockPercentage);          } -        if (changesMask[65]) +        if (changesMask[64])          {              data << float(DodgePercentage);          } -        if (changesMask[66]) +        if (changesMask[65])          {              data << float(DodgePercentageFromAttribute);          } -        if (changesMask[67]) +        if (changesMask[66])          {              data << float(ParryPercentage);          } -        if (changesMask[68]) +        if (changesMask[67])          {              data << float(ParryPercentageFromAttribute);          } -        if (changesMask[69]) +        if (changesMask[68])          {              data << float(CritPercentage);          } +        if (changesMask[69]) +        { +            data << float(RangedCritPercentage); +        }      }      if (changesMask[70])      {          if (changesMask[71])          { -            data << float(RangedCritPercentage); +            data << float(OffhandCritPercentage);          }          if (changesMask[72])          { -            data << float(OffhandCritPercentage); +            data << float(SpellCritPercentage);          }          if (changesMask[73])          { -            data << float(SpellCritPercentage); +            data << int32(ShieldBlock);          }          if (changesMask[74])          { -            data << int32(ShieldBlock); +            data << float(ShieldBlockCritPercentage);          }          if (changesMask[75])          { -            data << float(ShieldBlockCritPercentage); +            data << float(Mastery);          }          if (changesMask[76])          { -            data << float(Mastery); +            data << float(Speed);          }          if (changesMask[77])          { -            data << float(Speed); +            data << float(Avoidance);          }          if (changesMask[78])          { -            data << float(Avoidance); +            data << float(Sturdiness);          }          if (changesMask[79])          { -            data << float(Sturdiness); +            data << int32(Versatility);          }          if (changesMask[80])          { -            data << int32(Versatility); +            data << float(VersatilityBonus);          }          if (changesMask[81])          { -            data << float(VersatilityBonus); +            data << float(PvpPowerDamage);          }          if (changesMask[82])          { -            data << float(PvpPowerDamage); +            data << float(PvpPowerHealing);          }          if (changesMask[83])          { -            data << float(PvpPowerHealing); +            BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);          }          if (changesMask[84])          { -            BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); +            data << int32(ModHealingDonePos);          }          if (changesMask[85])          { -            data << int32(ModHealingDonePos); +            data << float(ModHealingPercent);          }          if (changesMask[86])          { -            data << float(ModHealingPercent); +            data << float(ModPeriodicHealingDonePercent);          }          if (changesMask[87])          { -            data << float(ModPeriodicHealingDonePercent); +            data << float(ModSpellPowerPercent);          }          if (changesMask[88])          { -            data << float(ModSpellPowerPercent); +            data << float(ModResiliencePercent);          }          if (changesMask[89])          { -            data << float(ModResiliencePercent); +            data << float(OverrideSpellPowerByAPPercent);          }          if (changesMask[90])          { -            data << float(OverrideSpellPowerByAPPercent); +            data << float(OverrideAPBySpellPowerPercent);          }          if (changesMask[91])          { -            data << float(OverrideAPBySpellPowerPercent); +            data << int32(ModTargetResistance);          }          if (changesMask[92])          { -            data << int32(ModTargetResistance); +            data << int32(ModTargetPhysicalResistance);          }          if (changesMask[93])          { -            data << int32(ModTargetPhysicalResistance); +            data << uint32(LocalFlags);          }          if (changesMask[94])          { -            data << uint32(LocalFlags); +            data << uint8(GrantableLevels);          }          if (changesMask[95])          { -            data << uint8(GrantableLevels); +            data << uint8(MultiActionBars);          }          if (changesMask[96])          { -            data << uint8(MultiActionBars); +            data << uint8(LifetimeMaxRank);          }          if (changesMask[97])          { -            data << uint8(LifetimeMaxRank); +            data << uint8(NumRespecs);          }          if (changesMask[98])          { -            data << uint8(NumRespecs); +            data << uint32(PvpMedals);          }          if (changesMask[99])          { -            data << uint32(PvpMedals); +            data << uint16(TodayHonorableKills);          }          if (changesMask[100])          { -            data << uint16(TodayHonorableKills); +            data << uint16(YesterdayHonorableKills);          }          if (changesMask[101])          { -            data << uint16(YesterdayHonorableKills); +            data << uint32(LifetimeHonorableKills);          }      }      if (changesMask[102])      {          if (changesMask[103])          { -            data << uint32(LifetimeHonorableKills); +            data << int32(WatchedFactionIndex);          }          if (changesMask[104])          { -            data << int32(WatchedFactionIndex); +            data << int32(MaxLevel);          }          if (changesMask[105])          { -            data << int32(MaxLevel); +            data << int32(ScalingPlayerLevelDelta);          }          if (changesMask[106])          { -            data << int32(ScalingPlayerLevelDelta); +            data << int32(MaxCreatureScalingLevel);          }          if (changesMask[107])          { -            data << int32(MaxCreatureScalingLevel); +            data << int32(PetSpellPower);          }          if (changesMask[108])          { -            data << int32(PetSpellPower); +            data << float(UiHitModifier);          }          if (changesMask[109])          { -            data << float(UiHitModifier); +            data << float(UiSpellHitModifier);          }          if (changesMask[110])          { -            data << float(UiSpellHitModifier); +            data << int32(HomeRealmTimeOffset);          }          if (changesMask[111])          { -            data << int32(HomeRealmTimeOffset); +            data << float(ModPetHaste);          }          if (changesMask[112])          { -            data << float(ModPetHaste); +            data << int8(JailersTowerLevelMax);          }          if (changesMask[113])          { -            data << int8(JailersTowerLevelMax); +            data << int8(JailersTowerLevel);          }          if (changesMask[114])          { -            data << int8(JailersTowerLevel); +            data << uint8(LocalRegenFlags);          }          if (changesMask[115])          { -            data << uint8(LocalRegenFlags); +            data << uint8(AuraVision);          }          if (changesMask[116])          { -            data << uint8(AuraVision); +            data << uint8(NumBackpackSlots);          }          if (changesMask[117])          { -            data << uint8(NumBackpackSlots); +            data << int32(OverrideSpellsID);          }          if (changesMask[118])          { -            data << int32(OverrideSpellsID); +            data << uint16(LootSpecID);          }          if (changesMask[119])          { -            data << uint16(LootSpecID); +            data << uint32(OverrideZonePVPType);          }          if (changesMask[120])          { -            data << uint32(OverrideZonePVPType); +            data << int32(Honor);          }          if (changesMask[121])          { -            data << int32(Honor); +            data << int32(HonorNextLevel);          }          if (changesMask[122])          { -            data << int32(HonorNextLevel); +            data << int32(PerksProgramCurrency);          }          if (changesMask[123])          { -            data << int32(PerksProgramCurrency); +            data << uint8(NumBankSlots);          }          if (changesMask[124])          { -            data << uint8(NumBankSlots); +            data << uint8(NumCharacterBankTabs);          }          if (changesMask[125])          { -            data << uint8(NumCharacterBankTabs); +            data << uint8(NumAccountBankTabs);          } -        if (changesMask[126]) +        if (changesMask[130])          { -            data << uint8(NumAccountBankTabs); +            data << int32(UiChromieTimeExpansionID);          }          if (changesMask[131])          { -            data << int32(UiChromieTimeExpansionID); +            data << int32(TimerunningSeasonID);          }          if (changesMask[132])          { -            data << int32(TimerunningSeasonID); +            data << int32(TransportServerTime);          }          if (changesMask[133])          { -            data << int32(TransportServerTime); +            data << uint32(WeeklyRewardsPeriodSinceOrigin);          }      }      if (changesMask[134])      {          if (changesMask[135])          { -            data << uint32(WeeklyRewardsPeriodSinceOrigin); -        } -        if (changesMask[136]) -        {              data << int16(DEBUGSoulbindConduitRank);          }          if (changesMask[138]) @@ -6364,32 +6356,36 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo      data.FlushBits();      if (changesMask[102])      { -        if (changesMask[127]) +        if (changesMask[126])          {              ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);          } -        if (changesMask[129]) +        if (changesMask[128])          {              if (QuestSession.has_value())              {                  QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);              }          } -        if (changesMask[128]) +        if (changesMask[127])          {              data << *FrozenPerksVendorItem;          } -        if (changesMask[130]) +        if (changesMask[129])          {              Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);          }      }      if (changesMask[134])      { -        if (changesMask[137]) +        if (changesMask[136])          {              data << *DungeonScore;          } +        if (changesMask[137]) +        { +            WriteMapFieldUpdate(TraitConfigs, data, ignoreNestedChangesMask, owner, receiver); +        }          if (changesMask[145])          {              if (PetStable.has_value()) @@ -6584,7 +6580,6 @@ void ActivePlayerData::ClearChangesMask()      Base::ClearChangesMask(TrackedCollectableSources);      Base::ClearChangesMask(PvpInfo);      Base::ClearChangesMask(CharacterRestrictions); -    Base::ClearChangesMask(TraitConfigs);      Base::ClearChangesMask(CraftingOrders);      Base::ClearChangesMask(CharacterBankTabSettings);      Base::ClearChangesMask(AccountBankTabSettings); @@ -6674,6 +6669,7 @@ void ActivePlayerData::ClearChangesMask()      Base::ClearChangesMask(WeeklyRewardsPeriodSinceOrigin);      Base::ClearChangesMask(DEBUGSoulbindConduitRank);      Base::ClearChangesMask(DungeonScore); +    Base::ClearChangesMask(TraitConfigs);      Base::ClearChangesMask(ActiveCombatTraitConfigID);      Base::ClearChangesMask(ItemUpgradeHighOnehandWeaponItemID);      Base::ClearChangesMask(ItemUpgradeHighFingerItemID); @@ -7240,10 +7236,15 @@ void ScaleCurve::ClearChangesMask()  void VisualAnim::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const  { -    data << uint32(AnimationDataID); +    data.WriteBits(AnimationDataID.has_value(), 1); +    data.WriteBit(IsDecay); +    data.FlushBits();      data << uint32(AnimKitID);      data << uint32(AnimProgress); -    data.WriteBit(IsDecay); +    if (AnimationDataID.has_value()) +    { +        data << int16(AnimationDataID); +    }      data.FlushBits();  } @@ -7261,14 +7262,11 @@ void VisualAnim::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigg          {              data.WriteBit(IsDecay);          } +        data.WriteBits(AnimationDataID.has_value(), 1);      }      data.FlushBits();      if (changesMask[0])      { -        if (changesMask[2]) -        { -            data << uint32(AnimationDataID); -        }          if (changesMask[3])          {              data << uint32(AnimKitID); @@ -7277,6 +7275,13 @@ void VisualAnim::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigg          {              data << uint32(AnimProgress);          } +        if (changesMask[2]) +        { +            if (AnimationDataID.has_value()) +            { +                data << int16(AnimationDataID); +            } +        }      }      data.FlushBits();  } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index b4acb53e749..aad04046fb0 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -455,9 +455,9 @@ struct ChrCustomizationChoice : public IsUpdateFieldStructureTag  struct QuestLog : public IsUpdateFieldStructureTag, public HasChangesMask<30>  { -    UpdateField<int64, 0, 1> EndTime; -    UpdateField<int32, 0, 2> QuestID; -    UpdateField<uint32, 0, 3> StateFlags; +    UpdateField<int32, 0, 1> QuestID; +    UpdateField<uint16, 0, 2> StateFlags; +    UpdateField<int64, 0, 3> EndTime;      UpdateField<uint32, 0, 4> ObjectiveFlags;      UpdateFieldArray<int16, 24, 5, 6> ObjectiveProgress; @@ -846,7 +846,7 @@ struct TraitSubTreeCache : public IsUpdateFieldStructureTag      bool operator!=(TraitSubTreeCache const& right) const { return !(*this == right); }  }; -struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<14> +struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<15>  {      DynamicUpdateField<UF::TraitEntry, 0, 1> Entries;      DynamicUpdateField<UF::TraitSubTreeCache, 0, 2> SubTrees; @@ -858,6 +858,7 @@ struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<14>      UpdateField<int32, 8, 10> CombatConfigFlags;      UpdateField<int32, 8, 11> LocalIdentifier;      UpdateField<int32, 12, 13> TraitSystemID; +    UpdateField<int32, 12, 14> VariationID;      void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;      void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -1069,6 +1070,7 @@ struct ChallengeModeData : public IsUpdateFieldStructureTag      int64 Unknown_1120_4;      ObjectGuid KeystoneOwnerGUID;      ObjectGuid LeaverGUID; +    int64 InstanceAbandonVoteCooldown;      uint32 IsActive;      uint32 HasRestrictions;      uint32 CanVoteAbandon; @@ -1097,9 +1099,9 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas      UpdateField<bool, 0, 4> SortBagsRightToLeft;      UpdateField<bool, 0, 5> InsertItemsLeftToRight;      UpdateField<bool, 0, 6> HasPerksProgramPendingReward; -    UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 43, 44> ResearchSites; -    UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 45, 46> ResearchSiteProgress; -    UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 47, 48> Research; +    UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 42, 43> ResearchSites; +    UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 44, 45> ResearchSiteProgress; +    UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 46, 47> Research;      DynamicUpdateField<uint64, 0, 7> KnownTitles;      DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements;      DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements; @@ -1124,103 +1126,103 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas      DynamicUpdateField<UF::ReplayedQuest, 0, 30> ReplayedQuests;      DynamicUpdateField<UF::QuestLog, 0, 31> TaskQuests;      DynamicUpdateField<int32, 32, 33> DisabledSpells; -    DynamicUpdateField<UF::PersonalCraftingOrderCount, 32, 36> PersonalCraftingOrderCounts; -    DynamicUpdateField<UF::NPCCraftingOrderInfo, 32, 37> NpcCraftingOrders; -    DynamicUpdateField<UF::CategoryCooldownMod, 32, 38> CategoryCooldownMods; -    DynamicUpdateField<UF::WeeklySpellUse, 32, 39> WeeklySpellUses; -    DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 40> TrackedCollectableSources; +    DynamicUpdateField<UF::PersonalCraftingOrderCount, 32, 35> PersonalCraftingOrderCounts; +    DynamicUpdateField<UF::NPCCraftingOrderInfo, 32, 36> NpcCraftingOrders; +    DynamicUpdateField<UF::CategoryCooldownMod, 32, 37> CategoryCooldownMods; +    DynamicUpdateField<UF::WeeklySpellUse, 32, 38> WeeklySpellUses; +    DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 39> TrackedCollectableSources;      DynamicUpdateField<UF::PVPInfo, 0, 10> PvpInfo;      DynamicUpdateField<UF::CharacterRestriction, 0, 24> CharacterRestrictions; -    DynamicUpdateField<UF::TraitConfig, 32, 34> TraitConfigs; -    DynamicUpdateField<UF::CraftingOrder, 32, 35> CraftingOrders; -    DynamicUpdateField<UF::BankTabSettings, 32, 41> CharacterBankTabSettings; -    DynamicUpdateField<UF::BankTabSettings, 32, 42> AccountBankTabSettings; -    UpdateField<ObjectGuid, 32, 49> FarsightObject; -    UpdateField<ObjectGuid, 32, 50> SummonedBattlePetGUID; -    UpdateField<uint64, 32, 51> Coinage; -    UpdateField<uint64, 32, 52> AccountBankCoinage; -    UpdateField<int32, 32, 53> XP; -    UpdateField<int32, 32, 54> NextLevelXP; -    UpdateField<int32, 32, 55> TrialXP; -    UpdateField<UF::SkillInfo, 32, 56> Skill; -    UpdateField<int32, 32, 57> CharacterPoints; -    UpdateField<int32, 32, 58> MaxTalentTiers; -    UpdateField<uint32, 32, 59> TrackCreatureMask; -    UpdateField<float, 32, 60> MainhandExpertise; -    UpdateField<float, 32, 61> OffhandExpertise; -    UpdateField<float, 32, 62> RangedExpertise; -    UpdateField<float, 32, 63> CombatRatingExpertise; -    UpdateField<float, 32, 64> BlockPercentage; -    UpdateField<float, 32, 65> DodgePercentage; -    UpdateField<float, 32, 66> DodgePercentageFromAttribute; -    UpdateField<float, 32, 67> ParryPercentage; -    UpdateField<float, 32, 68> ParryPercentageFromAttribute; -    UpdateField<float, 32, 69> CritPercentage; -    UpdateField<float, 70, 71> RangedCritPercentage; -    UpdateField<float, 70, 72> OffhandCritPercentage; -    UpdateField<float, 70, 73> SpellCritPercentage; -    UpdateField<int32, 70, 74> ShieldBlock; -    UpdateField<float, 70, 75> ShieldBlockCritPercentage; -    UpdateField<float, 70, 76> Mastery; -    UpdateField<float, 70, 77> Speed; -    UpdateField<float, 70, 78> Avoidance; -    UpdateField<float, 70, 79> Sturdiness; -    UpdateField<int32, 70, 80> Versatility; -    UpdateField<float, 70, 81> VersatilityBonus; -    UpdateField<float, 70, 82> PvpPowerDamage; -    UpdateField<float, 70, 83> PvpPowerHealing; -    UpdateField<UF::BitVectors, 70, 84> BitVectors; -    UpdateField<int32, 70, 85> ModHealingDonePos; -    UpdateField<float, 70, 86> ModHealingPercent; -    UpdateField<float, 70, 87> ModPeriodicHealingDonePercent; -    UpdateField<float, 70, 88> ModSpellPowerPercent; -    UpdateField<float, 70, 89> ModResiliencePercent; -    UpdateField<float, 70, 90> OverrideSpellPowerByAPPercent; -    UpdateField<float, 70, 91> OverrideAPBySpellPowerPercent; -    UpdateField<int32, 70, 92> ModTargetResistance; -    UpdateField<int32, 70, 93> ModTargetPhysicalResistance; -    UpdateField<uint32, 70, 94> LocalFlags; -    UpdateField<uint8, 70, 95> GrantableLevels; -    UpdateField<uint8, 70, 96> MultiActionBars; -    UpdateField<uint8, 70, 97> LifetimeMaxRank; -    UpdateField<uint8, 70, 98> NumRespecs; -    UpdateField<uint32, 70, 99> PvpMedals; -    UpdateField<uint16, 70, 100> TodayHonorableKills; -    UpdateField<uint16, 70, 101> YesterdayHonorableKills; -    UpdateField<uint32, 102, 103> LifetimeHonorableKills; -    UpdateField<int32, 102, 104> WatchedFactionIndex; -    UpdateField<int32, 102, 105> MaxLevel; -    UpdateField<int32, 102, 106> ScalingPlayerLevelDelta; -    UpdateField<int32, 102, 107> MaxCreatureScalingLevel; -    UpdateField<int32, 102, 108> PetSpellPower; -    UpdateField<float, 102, 109> UiHitModifier; -    UpdateField<float, 102, 110> UiSpellHitModifier; -    UpdateField<int32, 102, 111> HomeRealmTimeOffset; -    UpdateField<float, 102, 112> ModPetHaste; -    UpdateField<int8, 102, 113> JailersTowerLevelMax; -    UpdateField<int8, 102, 114> JailersTowerLevel; -    UpdateField<uint8, 102, 115> LocalRegenFlags; -    UpdateField<uint8, 102, 116> AuraVision; -    UpdateField<uint8, 102, 117> NumBackpackSlots; -    UpdateField<int32, 102, 118> OverrideSpellsID; -    UpdateField<uint16, 102, 119> LootSpecID; -    UpdateField<uint32, 102, 120> OverrideZonePVPType; -    UpdateField<int32, 102, 121> Honor; -    UpdateField<int32, 102, 122> HonorNextLevel; -    UpdateField<int32, 102, 123> PerksProgramCurrency; -    UpdateField<uint8, 102, 124> NumBankSlots; -    UpdateField<uint8, 102, 125> NumCharacterBankTabs; -    UpdateField<uint8, 102, 126> NumAccountBankTabs; -    UpdateField<UF::ResearchHistory, 102, 127> ResearchHistory; -    UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 128> FrozenPerksVendorItem; -    UpdateField<UF::ActivePlayerUnk901, 102, 130> Field_1410; -    OptionalUpdateField<UF::QuestSession, 102, 129> QuestSession; -    UpdateField<int32, 102, 131> UiChromieTimeExpansionID; -    UpdateField<int32, 102, 132> TimerunningSeasonID; -    UpdateField<int32, 102, 133> TransportServerTime; -    UpdateField<uint32, 134, 135> WeeklyRewardsPeriodSinceOrigin;               // week count since Cfg_RegionsEntry::ChallengeOrigin -    UpdateField<int16, 134, 136> DEBUGSoulbindConduitRank; -    UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 134, 137> DungeonScore; +    DynamicUpdateField<UF::CraftingOrder, 32, 34> CraftingOrders; +    DynamicUpdateField<UF::BankTabSettings, 32, 40> CharacterBankTabSettings; +    DynamicUpdateField<UF::BankTabSettings, 32, 41> AccountBankTabSettings; +    UpdateField<ObjectGuid, 32, 48> FarsightObject; +    UpdateField<ObjectGuid, 32, 49> SummonedBattlePetGUID; +    UpdateField<uint64, 32, 50> Coinage; +    UpdateField<uint64, 32, 51> AccountBankCoinage; +    UpdateField<int32, 32, 52> XP; +    UpdateField<int32, 32, 53> NextLevelXP; +    UpdateField<int32, 32, 54> TrialXP; +    UpdateField<UF::SkillInfo, 32, 55> Skill; +    UpdateField<int32, 32, 56> CharacterPoints; +    UpdateField<int32, 32, 57> MaxTalentTiers; +    UpdateField<uint32, 32, 58> TrackCreatureMask; +    UpdateField<float, 32, 59> MainhandExpertise; +    UpdateField<float, 32, 60> OffhandExpertise; +    UpdateField<float, 32, 61> RangedExpertise; +    UpdateField<float, 32, 62> CombatRatingExpertise; +    UpdateField<float, 32, 63> BlockPercentage; +    UpdateField<float, 32, 64> DodgePercentage; +    UpdateField<float, 32, 65> DodgePercentageFromAttribute; +    UpdateField<float, 32, 66> ParryPercentage; +    UpdateField<float, 32, 67> ParryPercentageFromAttribute; +    UpdateField<float, 32, 68> CritPercentage; +    UpdateField<float, 32, 69> RangedCritPercentage; +    UpdateField<float, 70, 71> OffhandCritPercentage; +    UpdateField<float, 70, 72> SpellCritPercentage; +    UpdateField<int32, 70, 73> ShieldBlock; +    UpdateField<float, 70, 74> ShieldBlockCritPercentage; +    UpdateField<float, 70, 75> Mastery; +    UpdateField<float, 70, 76> Speed; +    UpdateField<float, 70, 77> Avoidance; +    UpdateField<float, 70, 78> Sturdiness; +    UpdateField<int32, 70, 79> Versatility; +    UpdateField<float, 70, 80> VersatilityBonus; +    UpdateField<float, 70, 81> PvpPowerDamage; +    UpdateField<float, 70, 82> PvpPowerHealing; +    UpdateField<UF::BitVectors, 70, 83> BitVectors; +    UpdateField<int32, 70, 84> ModHealingDonePos; +    UpdateField<float, 70, 85> ModHealingPercent; +    UpdateField<float, 70, 86> ModPeriodicHealingDonePercent; +    UpdateField<float, 70, 87> ModSpellPowerPercent; +    UpdateField<float, 70, 88> ModResiliencePercent; +    UpdateField<float, 70, 89> OverrideSpellPowerByAPPercent; +    UpdateField<float, 70, 90> OverrideAPBySpellPowerPercent; +    UpdateField<int32, 70, 91> ModTargetResistance; +    UpdateField<int32, 70, 92> ModTargetPhysicalResistance; +    UpdateField<uint32, 70, 93> LocalFlags; +    UpdateField<uint8, 70, 94> GrantableLevels; +    UpdateField<uint8, 70, 95> MultiActionBars; +    UpdateField<uint8, 70, 96> LifetimeMaxRank; +    UpdateField<uint8, 70, 97> NumRespecs; +    UpdateField<uint32, 70, 98> PvpMedals; +    UpdateField<uint16, 70, 99> TodayHonorableKills; +    UpdateField<uint16, 70, 100> YesterdayHonorableKills; +    UpdateField<uint32, 70, 101> LifetimeHonorableKills; +    UpdateField<int32, 102, 103> WatchedFactionIndex; +    UpdateField<int32, 102, 104> MaxLevel; +    UpdateField<int32, 102, 105> ScalingPlayerLevelDelta; +    UpdateField<int32, 102, 106> MaxCreatureScalingLevel; +    UpdateField<int32, 102, 107> PetSpellPower; +    UpdateField<float, 102, 108> UiHitModifier; +    UpdateField<float, 102, 109> UiSpellHitModifier; +    UpdateField<int32, 102, 110> HomeRealmTimeOffset; +    UpdateField<float, 102, 111> ModPetHaste; +    UpdateField<int8, 102, 112> JailersTowerLevelMax; +    UpdateField<int8, 102, 113> JailersTowerLevel; +    UpdateField<uint8, 102, 114> LocalRegenFlags; +    UpdateField<uint8, 102, 115> AuraVision; +    UpdateField<uint8, 102, 116> NumBackpackSlots; +    UpdateField<int32, 102, 117> OverrideSpellsID; +    UpdateField<uint16, 102, 118> LootSpecID; +    UpdateField<uint32, 102, 119> OverrideZonePVPType; +    UpdateField<int32, 102, 120> Honor; +    UpdateField<int32, 102, 121> HonorNextLevel; +    UpdateField<int32, 102, 122> PerksProgramCurrency; +    UpdateField<uint8, 102, 123> NumBankSlots; +    UpdateField<uint8, 102, 124> NumCharacterBankTabs; +    UpdateField<uint8, 102, 125> NumAccountBankTabs; +    UpdateField<UF::ResearchHistory, 102, 126> ResearchHistory; +    UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 127> FrozenPerksVendorItem; +    UpdateField<UF::ActivePlayerUnk901, 102, 129> Field_1410; +    OptionalUpdateField<UF::QuestSession, 102, 128> QuestSession; +    UpdateField<int32, 102, 130> UiChromieTimeExpansionID; +    UpdateField<int32, 102, 131> TimerunningSeasonID; +    UpdateField<int32, 102, 132> TransportServerTime; +    UpdateField<uint32, 102, 133> WeeklyRewardsPeriodSinceOrigin;               // week count since Cfg_RegionsEntry::ChallengeOrigin +    UpdateField<int16, 134, 135> DEBUGSoulbindConduitRank; +    UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 134, 136> DungeonScore; +    MapUpdateField<int32, UF::TraitConfig, 134, 137> TraitConfigs;      UpdateField<uint32, 134, 138> ActiveCombatTraitConfigID;      UpdateField<int32, 134, 139> ItemUpgradeHighOnehandWeaponItemID;      UpdateField<int32, 134, 140> ItemUpgradeHighFingerItemID; @@ -1363,7 +1365,7 @@ struct ScaleCurve : public IsUpdateFieldStructureTag, public HasChangesMask<7>  struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5>  {      UpdateField<bool, 0, 1> IsDecay; -    UpdateField<uint32, 0, 2> AnimationDataID; +    OptionalUpdateField<int16, 0, 2> AnimationDataID;      UpdateField<uint32, 0, 3> AnimKitID;      UpdateField<uint32, 0, 4> AnimProgress; diff --git a/src/server/game/Entities/Object/Updates/UpdateMask.h b/src/server/game/Entities/Object/Updates/UpdateMask.h index 4ccb7af8fbb..3071632d603 100644 --- a/src/server/game/Entities/Object/Updates/UpdateMask.h +++ b/src/server/game/Entities/Object/Updates/UpdateMask.h @@ -97,15 +97,15 @@ public:      constexpr void SetAll()      {          std::memset(_blocksMask.data(), 0xFF, _blocksMask.size() * sizeof(typename decltype(_blocksMask)::value_type)); -        if constexpr (BlocksMaskCount % 32) +        if constexpr (BlockCount % 32)          { -            constexpr uint32 unused = 32 - (BlocksMaskCount % 32); +            constexpr uint32 unused = 32 - (BlockCount % 32);              _blocksMask.back() &= (0xFFFFFFFF >> unused);          }          std::memset(_blocks.data(), 0xFF, _blocks.size() * sizeof(typename decltype(_blocks)::value_type)); -        if constexpr (BlockCount % 32) +        if constexpr (Bits % 32)          { -            constexpr uint32 unused = 32 - (BlockCount % 32); +            constexpr uint32 unused = 32 - (Bits % 32);              _blocks.back() &= (0xFFFFFFFF >> unused);          }      } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fbc391ceff6..f2b50b5c68e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20610,16 +20610,16 @@ void Player::_SaveActions(CharacterDatabaseTransaction trans)          if (!traitConfig)              return 0; -        int32 usedSavedTraitConfigIndex = m_activePlayerData->TraitConfigs.FindIndexIf([localIdent = *traitConfig->LocalIdentifier](UF::TraitConfig const& savedConfig) +        int32 const* usedSavedTraitConfigId = m_activePlayerData->TraitConfigs.FindIf([localIdent = *traitConfig->LocalIdentifier](UF::TraitConfig const& savedConfig)          {              return static_cast<TraitConfigType>(*savedConfig.Type) == TraitConfigType::Combat                  && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None                  && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::SharedActionBars) == TraitCombatConfigFlags::None                  && savedConfig.LocalIdentifier == localIdent; -        }); +        }).first; -        if (usedSavedTraitConfigIndex >= 0) -            return m_activePlayerData->TraitConfigs[usedSavedTraitConfigIndex].ID; +        if (usedSavedTraitConfigId) +            return *usedSavedTraitConfigId;          return 0;      }(); @@ -28079,8 +28079,8 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult      if (configsResult)      { -        //                    0     1                    2                  3                4            5              6      7 -        // SELECT traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, `name` FROM character_trait_config WHERE guid = ? +        //                    0     1                    2                  3                4            5              6            7      8 +        // SELECT traitConfigId, type, chrSpecializationId, combatConfigFlags, localIdentifier, skillLineId, traitSystemId, variationId, `name` FROM character_trait_config WHERE guid = ?          do          {              Field* fields = configsResult->Fetch(); @@ -28099,12 +28099,13 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult                      break;                  case TraitConfigType::Generic:                      traitConfig.TraitSystemID = fields[6].GetInt32(); +                    traitConfig.VariationID = fields[7].GetInt32();                      break;                  default:                      break;              } -            traitConfig.Name = fields[7].GetString(); +            traitConfig.Name = fields[8].GetStringView();              for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(traitConfig, this))                  traitConfig.Entries.emplace_back(grantedEntry); @@ -28149,23 +28150,23 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult      auto hasConfigForSpec = [&](int32 specId)      { -        return m_activePlayerData->TraitConfigs.FindIndexIf([=](UF::TraitConfig const& traitConfig) +        return m_activePlayerData->TraitConfigs.FindIf([=](UF::TraitConfig const& traitConfig)          {              return traitConfig.Type == AsUnderlyingType(TraitConfigType::Combat)                  && traitConfig.ChrSpecializationID == specId                  && traitConfig.CombatConfigFlags & AsUnderlyingType(TraitCombatConfigFlags::ActiveForSpec); -        }) >= 0; +        }).first != nullptr;      };      auto findFreeLocalIdentifier = [&](int32 specId)      {          int32 index = 1; -        while (m_activePlayerData->TraitConfigs.FindIndexIf([specId, index](UF::TraitConfig const& traitConfig) +        while (m_activePlayerData->TraitConfigs.FindIf([specId, index](UF::TraitConfig const& traitConfig)          {              return traitConfig.Type == AsUnderlyingType(TraitConfigType::Combat)                  && traitConfig.ChrSpecializationID == specId                  && traitConfig.LocalIdentifier == index; -        }) >= 0) +        }).first)              ++index;          return index; @@ -28189,39 +28190,38 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult          }      } -    int32 activeConfig = m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& traitConfig) +    UF::TraitConfig const* activeTraitConfig = m_activePlayerData->TraitConfigs.FindIf([&](UF::TraitConfig const& traitConfig)      {          return traitConfig.Type == AsUnderlyingType(TraitConfigType::Combat)              && traitConfig.ChrSpecializationID == int32(GetPrimarySpecialization())              && traitConfig.CombatConfigFlags & AsUnderlyingType(TraitCombatConfigFlags::ActiveForSpec); -    }); +    }).second; -    if (activeConfig >= 0) +    if (activeTraitConfig)      { -        UF::TraitConfig const& activeTraitConfig = m_activePlayerData->TraitConfigs[activeConfig]; -        SetActiveCombatTraitConfigID(activeTraitConfig.ID); -        int32 activeSubTree = activeTraitConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); +        SetActiveCombatTraitConfigID(activeTraitConfig->ID); +        int32 activeSubTree = activeTraitConfig->SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; });          if (activeSubTree >= 0) -            SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); +            SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig->SubTrees[activeSubTree].TraitSubTreeID);      } -    for (UF::TraitConfig const& traitConfig : m_activePlayerData->TraitConfigs) +    for (auto const& [id, traitConfig] : m_activePlayerData->TraitConfigs)      { -        switch (static_cast<TraitConfigType>(*traitConfig.Type)) +        switch (static_cast<TraitConfigType>(*traitConfig.value.Type))          {              case TraitConfigType::Combat: -                if (traitConfig.ID != int32(*m_activePlayerData->ActiveCombatTraitConfigID)) +                if (traitConfig.value.ID != int32(*m_activePlayerData->ActiveCombatTraitConfigID))                      continue;                  break;              case TraitConfigType::Profession: -                if (!HasSkill(traitConfig.SkillLineID)) +                if (!HasSkill(traitConfig.value.SkillLineID))                      continue;                  break;              default:                  break;          } -        ApplyTraitConfig(traitConfig.ID, true); +        ApplyTraitConfig(id, true);      }  } @@ -28301,6 +28301,7 @@ void Player::_SaveTraits(CharacterDatabaseTransaction trans)                              stmt->setInt32(5, traitConfig->LocalIdentifier);                              stmt->setNull(6);                              stmt->setNull(7); +                            stmt->setNull(8);                              break;                          case TraitConfigType::Profession:                              stmt->setNull(3); @@ -28308,6 +28309,7 @@ void Player::_SaveTraits(CharacterDatabaseTransaction trans)                              stmt->setNull(5);                              stmt->setInt32(6, traitConfig->SkillLineID);                              stmt->setNull(7); +                            stmt->setNull(8);                              break;                          case TraitConfigType::Generic:                              stmt->setNull(3); @@ -28315,12 +28317,13 @@ void Player::_SaveTraits(CharacterDatabaseTransaction trans)                              stmt->setNull(5);                              stmt->setNull(6);                              stmt->setInt32(7, traitConfig->TraitSystemID); +                            stmt->setInt32(8, traitConfig->VariationID);                              break;                          default:                              break;                      } -                    stmt->setString(8, *traitConfig->Name); +                    stmt->setString(9, *traitConfig->Name);                      trans->Append(stmt);                      for (UF::TraitEntry const& traitEntry : traitConfig->Entries) @@ -28466,19 +28469,18 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec)      SetActiveTalentGroup(spec->OrderIndex);      SetPrimarySpecialization(spec->ID); -    int32 specTraitConfigIndex = m_activePlayerData->TraitConfigs.FindIndexIf([spec](UF::TraitConfig const& traitConfig) +    UF::TraitConfig const* specTraitConfig = m_activePlayerData->TraitConfigs.FindIf([spec](UF::TraitConfig const& traitConfig)      {          return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat              && traitConfig.ChrSpecializationID == int32(spec->ID)              && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None; -    }); -    if (specTraitConfigIndex >= 0) +    }).second; +    if (specTraitConfig)      { -        UF::TraitConfig const& activeTraitConfig = m_activePlayerData->TraitConfigs[specTraitConfigIndex]; -        SetActiveCombatTraitConfigID(activeTraitConfig.ID); -        int32 activeSubTree = activeTraitConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); +        SetActiveCombatTraitConfigID(specTraitConfig->ID); +        int32 activeSubTree = specTraitConfig->SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; });          if (activeSubTree >= 0) -            SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); +            SetCurrentCombatTraitConfigSubTreeID(specTraitConfig->SubTrees[activeSubTree].TraitSubTreeID);          else              SetCurrentCombatTraitConfigSubTreeID(0);      } @@ -28599,16 +28601,16 @@ void Player::StartLoadingActionButtons(std::function<void()>&& callback /*= null          if (!traitConfig)              return 0; -        int32 usedSavedTraitConfigIndex = m_activePlayerData->TraitConfigs.FindIndexIf([localIdent = *traitConfig->LocalIdentifier](UF::TraitConfig const& savedConfig) +        int32 const* usedSavedTraitConfigId = m_activePlayerData->TraitConfigs.FindIf([localIdent = *traitConfig->LocalIdentifier](UF::TraitConfig const& savedConfig)          {              return static_cast<TraitConfigType>(*savedConfig.Type) == TraitConfigType::Combat              && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None              && (static_cast<TraitCombatConfigFlags>(*savedConfig.CombatConfigFlags) & TraitCombatConfigFlags::SharedActionBars) == TraitCombatConfigFlags::None              && savedConfig.LocalIdentifier == localIdent; -        }); +        }).first; -        if (usedSavedTraitConfigIndex >= 0) -            return m_activePlayerData->TraitConfigs[usedSavedTraitConfigIndex].ID; +        if (usedSavedTraitConfigId) +            return *usedSavedTraitConfigId;          return 0;      }(); @@ -28647,7 +28649,7 @@ void Player::CreateTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig)      uint32 configId = TraitMgr::GenerateNewTraitConfigId();      auto hasConfigId = [&](int32 id)      { -        return m_activePlayerData->TraitConfigs.FindIndexIf([id](UF::TraitConfig const& config) { return config.ID == id; }) >= 0; +        return m_activePlayerData->TraitConfigs.Get(id) != nullptr;      };      while (hasConfigId(configId)) @@ -28655,18 +28657,18 @@ void Player::CreateTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig)      traitConfig.ID = configId; -    int32 traitConfigIndex = m_activePlayerData->TraitConfigs.size();      AddTraitConfig(traitConfig); +    auto entrySetter = m_values.ModifyValue(&Player::m_activePlayerData) +        .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configId) +        .ModifyValue(&UF::TraitConfig::Entries);      for (UF::TraitEntry const& grantedEntry : TraitMgr::GetGrantedTraitEntriesForConfig(traitConfig, this))      { -        auto entryItr = std::find_if(traitConfig.Entries.begin(), traitConfig.Entries.end(), +        auto entryItr = std::ranges::find_if(traitConfig.Entries,              [&](WorldPackets::Traits::TraitEntry const& entry) { return entry.TraitNodeID == grantedEntry.TraitNodeID && entry.TraitNodeEntryID == grantedEntry.TraitNodeEntryID; });          if (entryItr == traitConfig.Entries.end()) -            AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfigIndex) -                .ModifyValue(&UF::TraitConfig::Entries)) = grantedEntry; +            AddDynamicUpdateFieldValue(entrySetter) = grantedEntry;      }      m_traitConfigStates[configId] = PLAYERSPELL_CHANGED; @@ -28674,15 +28676,15 @@ void Player::CreateTraitConfig(WorldPackets::Traits::TraitConfig& traitConfig)  void Player::AddTraitConfig(WorldPackets::Traits::TraitConfig const& traitConfig)  { -    auto setter = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TraitConfigs)); -    setter.ModifyValue(&UF::TraitConfig::ID).SetValue(traitConfig.ID); -    setter.ModifyValue(&UF::TraitConfig::Name).SetValue(traitConfig.Name); -    setter.ModifyValue(&UF::TraitConfig::Type).SetValue(AsUnderlyingType(traitConfig.Type)); -    setter.ModifyValue(&UF::TraitConfig::SkillLineID).SetValue(traitConfig.SkillLineID);; -    setter.ModifyValue(&UF::TraitConfig::ChrSpecializationID).SetValue(traitConfig.ChrSpecializationID); -    setter.ModifyValue(&UF::TraitConfig::CombatConfigFlags).SetValue(AsUnderlyingType(traitConfig.CombatConfigFlags)); -    setter.ModifyValue(&UF::TraitConfig::LocalIdentifier).SetValue(traitConfig.LocalIdentifier); -    setter.ModifyValue(&UF::TraitConfig::TraitSystemID).SetValue(traitConfig.TraitSystemID); +    auto setter = m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfig.ID); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::ID), traitConfig.ID); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::Name), traitConfig.Name); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::Type), AsUnderlyingType(traitConfig.Type)); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::SkillLineID), traitConfig.SkillLineID); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::ChrSpecializationID), traitConfig.ChrSpecializationID); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(traitConfig.CombatConfigFlags)); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::LocalIdentifier), traitConfig.LocalIdentifier); +    SetUpdateFieldValue(setter.ModifyValue(&UF::TraitConfig::TraitSystemID), traitConfig.TraitSystemID);      for (WorldPackets::Traits::TraitEntry const& traitEntry : traitConfig.Entries)      { @@ -28712,17 +28714,13 @@ void Player::AddTraitConfig(WorldPackets::Traits::TraitConfig const& traitConfig  UF::TraitConfig const* Player::GetTraitConfig(int32 configId) const  { -    int32 index = m_activePlayerData->TraitConfigs.FindIndexIf([configId](UF::TraitConfig const& config) { return config.ID == configId; }); -    if (index < 0) -        return nullptr; - -    return &m_activePlayerData->TraitConfigs[index]; +    return m_activePlayerData->TraitConfigs.Get(configId);  }  void Player::UpdateTraitConfig(WorldPackets::Traits::TraitConfig&& newConfig, int32 savedConfigId, bool withCastTime)  { -    int32 index = m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& config) { return config.ID == newConfig.ID; }); -    if (index < 0) +    UF::TraitConfig const* oldConfig = m_activePlayerData->TraitConfigs.Get(newConfig.ID); +    if (!oldConfig)          return;      if (withCastTime) @@ -28733,14 +28731,14 @@ void Player::UpdateTraitConfig(WorldPackets::Traits::TraitConfig&& newConfig, in      bool isActiveConfig = true;      bool loadActionButtons = false; -    switch (TraitConfigType(*m_activePlayerData->TraitConfigs[index].Type)) +    switch (TraitConfigType(*oldConfig->Type))      {          case TraitConfigType::Combat:              isActiveConfig = newConfig.ID == int32(*m_activePlayerData->ActiveCombatTraitConfigID); -            loadActionButtons = m_activePlayerData->TraitConfigs[index].LocalIdentifier != newConfig.LocalIdentifier; +            loadActionButtons = oldConfig->LocalIdentifier != newConfig.LocalIdentifier;              break;          case TraitConfigType::Profession: -            isActiveConfig = HasSkill(m_activePlayerData->TraitConfigs[index].SkillLineID); +            isActiveConfig = HasSkill(oldConfig->SkillLineID);              break;          default:              break; @@ -28749,7 +28747,7 @@ void Player::UpdateTraitConfig(WorldPackets::Traits::TraitConfig&& newConfig, in      std::function<void()> finalizeTraitConfigUpdate = [=, this, newConfig = std::move(newConfig)]()      {          SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, index) +            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, newConfig.ID)              .ModifyValue(&UF::TraitConfig::LocalIdentifier), newConfig.LocalIdentifier);          ApplyTraitEntryChanges(newConfig.ID, newConfig, isActiveConfig, true); @@ -28775,8 +28773,8 @@ void Player::UpdateTraitConfig(WorldPackets::Traits::TraitConfig&& newConfig, in  void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::TraitConfig const& newConfig, bool applyTraits, bool consumeCurrencies)  { -    int32 editedIndex = m_activePlayerData->TraitConfigs.FindIndexIf([editedConfigId](UF::TraitConfig const& config) { return config.ID == editedConfigId; }); -    if (editedIndex < 0) +    UF::TraitConfig const* editedConfig = m_activePlayerData->TraitConfigs.Get(editedConfigId); +    if (!editedConfig)          return;      auto makeTraitEntryFinder = [](int32 traitNodeId, int32 traitNodeEntryId) @@ -28784,13 +28782,14 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::          return [=](auto const& ufEntry) { return ufEntry.TraitNodeID == traitNodeId && ufEntry.TraitNodeEntryID == traitNodeEntryId; };      }; -    UF::TraitConfig const& editedConfig = m_activePlayerData->TraitConfigs[editedIndex]; +    auto configSetter = m_values.ModifyValue(&Player::m_activePlayerData) +        .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedConfigId);      // remove traits not found in new config      std::set<int32, std::greater<>> entryIndicesToRemove; -    for (int32 i = 0; i < std::ssize(editedConfig.Entries); ++i) +    for (int32 i = 0; i < std::ssize(editedConfig->Entries); ++i)      { -        UF::TraitEntry const& oldEntry = editedConfig.Entries[i]; +        UF::TraitEntry const& oldEntry = editedConfig->Entries[i];          auto entryItr = std::ranges::find_if(newConfig.Entries, makeTraitEntryFinder(oldEntry.TraitNodeID, oldEntry.TraitNodeEntryID));          if (entryItr != newConfig.Entries.end())              continue; @@ -28802,26 +28801,20 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::      }      for (int32 indexToRemove : entryIndicesToRemove) -    { -        RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) -            .ModifyValue(&UF::TraitConfig::Entries), indexToRemove); -    } +        RemoveDynamicUpdateFieldValue(configSetter.ModifyValue(&UF::TraitConfig::Entries), indexToRemove);      std::vector<WorldPackets::Traits::TraitEntry> costEntries;      // apply new traits      for (WorldPackets::Traits::TraitEntry const& newEntry : newConfig.Entries)      { -        int32 oldEntryIndex = editedConfig.Entries.FindIndexIf(makeTraitEntryFinder(newEntry.TraitNodeID, newEntry.TraitNodeEntryID)); +        int32 oldEntryIndex = editedConfig->Entries.FindIndexIf(makeTraitEntryFinder(newEntry.TraitNodeID, newEntry.TraitNodeEntryID));          if (oldEntryIndex < 0)          {              if (consumeCurrencies)                  costEntries.push_back(newEntry); -            UF::TraitEntry& newUfEntry = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) -                .ModifyValue(&UF::TraitConfig::Entries)); +            UF::TraitEntry& newUfEntry = AddDynamicUpdateFieldValue(configSetter.ModifyValue(&UF::TraitConfig::Entries));              newUfEntry.TraitNodeID = newEntry.TraitNodeID;              newUfEntry.TraitNodeEntryID = newEntry.TraitNodeEntryID;              newUfEntry.Rank = newEntry.Rank; @@ -28830,21 +28823,19 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::              if (applyTraits)                  ApplyTraitEntry(newUfEntry.TraitNodeEntryID, newUfEntry.Rank, 0, true);          } -        else if (newEntry.Rank != editedConfig.Entries[oldEntryIndex].Rank || newEntry.GrantedRanks != editedConfig.Entries[oldEntryIndex].GrantedRanks) +        else if (newEntry.Rank != editedConfig->Entries[oldEntryIndex].Rank || newEntry.GrantedRanks != editedConfig->Entries[oldEntryIndex].GrantedRanks)          { -            if (consumeCurrencies && newEntry.Rank > editedConfig.Entries[oldEntryIndex].Rank) +            if (consumeCurrencies && newEntry.Rank > editedConfig->Entries[oldEntryIndex].Rank)              {                  WorldPackets::Traits::TraitEntry& costEntry = costEntries.emplace_back(newEntry); -                costEntry.Rank -= editedConfig.Entries[oldEntryIndex].Rank; +                costEntry.Rank -= editedConfig->Entries[oldEntryIndex].Rank;              } -            SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) +            SetUpdateFieldValue(configSetter                  .ModifyValue(&UF::TraitConfig::Entries, oldEntryIndex)                  .ModifyValue(&UF::TraitEntry::Rank), newEntry.Rank); -            SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) +            SetUpdateFieldValue(configSetter                  .ModifyValue(&UF::TraitConfig::Entries, oldEntryIndex)                  .ModifyValue(&UF::TraitEntry::GrantedRanks), newEntry.GrantedRanks); @@ -28883,7 +28874,7 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::      for (WorldPackets::Traits::TraitSubTreeCache const& newSubTree : newConfig.SubTrees)      { -        int32 oldSubTreeIndex = editedConfig.SubTrees.FindIndexIf([&](UF::TraitSubTreeCache const& ufSubTree) { return ufSubTree.TraitSubTreeID == newSubTree.TraitSubTreeID; }); +        int32 oldSubTreeIndex = editedConfig->SubTrees.FindIndexIf([&](UF::TraitSubTreeCache const& ufSubTree) { return ufSubTree.TraitSubTreeID == newSubTree.TraitSubTreeID; });          std::vector<UF::TraitEntry> subTreeEntries;          subTreeEntries.resize(newSubTree.Entries.size());          for (std::size_t j = 0; j < newSubTree.Entries.size(); ++j) @@ -28897,24 +28888,20 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::          if (oldSubTreeIndex < 0)          { -            UF::TraitSubTreeCache& newUfSubTree = AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) -                .ModifyValue(&UF::TraitConfig::SubTrees)); +            UF::TraitSubTreeCache& newUfSubTree = AddDynamicUpdateFieldValue(configSetter.ModifyValue(&UF::TraitConfig::SubTrees));              newUfSubTree.TraitSubTreeID = newSubTree.TraitSubTreeID;              newUfSubTree.Active = newSubTree.Active;              newUfSubTree.Entries = std::move(subTreeEntries);          }          else          { -            bool wasActive = m_activePlayerData->TraitConfigs[editedIndex].SubTrees[oldSubTreeIndex].Active != 0; +            bool wasActive = editedConfig->SubTrees[oldSubTreeIndex].Active != 0; -            SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) +            SetUpdateFieldValue(configSetter                  .ModifyValue(&UF::TraitConfig::SubTrees, oldSubTreeIndex)                  .ModifyValue(&UF::TraitSubTreeCache::Active), newSubTree.Active); -            SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -                .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) +            SetUpdateFieldValue(configSetter                  .ModifyValue(&UF::TraitConfig::SubTrees, oldSubTreeIndex)                  .ModifyValue(&UF::TraitSubTreeCache::Entries), std::move(subTreeEntries)); @@ -28926,9 +28913,9 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::      if (applyTraits)      { -        int32 activeSubTree = editedConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); +        int32 activeSubTree = editedConfig->SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; });          if (activeSubTree >= 0) -            SetCurrentCombatTraitConfigSubTreeID(editedConfig.SubTrees[activeSubTree].TraitSubTreeID); +            SetCurrentCombatTraitConfigSubTreeID(editedConfig->SubTrees[activeSubTree].TraitSubTreeID);          else              SetCurrentCombatTraitConfigSubTreeID(0); @@ -28940,17 +28927,14 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits::  void Player::RenameTraitConfig(int32 editedConfigId, std::string&& newName)  { -    int32 editedIndex = m_activePlayerData->TraitConfigs.FindIndexIf([editedConfigId](UF::TraitConfig const& traitConfig) -    { -        return traitConfig.ID == editedConfigId -            && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat -            && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None; -    }); -    if (editedIndex < 0) +    UF::TraitConfig const* editedConfig = m_activePlayerData->TraitConfigs.Get(editedConfigId); +    if (!editedConfig +        || static_cast<TraitConfigType>(*editedConfig->Type) != TraitConfigType::Combat +        || (static_cast<TraitCombatConfigFlags>(*editedConfig->CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None)          return;      SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -        .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedIndex) +        .ModifyValue(&UF::ActivePlayerData::TraitConfigs, editedConfigId)          .ModifyValue(&UF::TraitConfig::Name), std::move(newName));      m_traitConfigStates[editedConfigId] = PLAYERSPELL_CHANGED; @@ -28958,17 +28942,14 @@ void Player::RenameTraitConfig(int32 editedConfigId, std::string&& newName)  void Player::DeleteTraitConfig(int32 deletedConfigId)  { -    int32 deletedIndex = m_activePlayerData->TraitConfigs.FindIndexIf([deletedConfigId](UF::TraitConfig const& traitConfig) -    { -        return traitConfig.ID == deletedConfigId -            && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat -            && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None; -    }); -    if (deletedIndex < 0) +    UF::TraitConfig const* deletedConfig = m_activePlayerData->TraitConfigs.Get(deletedConfigId); +    if (!deletedConfig +        || static_cast<TraitConfigType>(*deletedConfig->Type) != TraitConfigType::Combat +        || (static_cast<TraitCombatConfigFlags>(*deletedConfig->CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None)          return; -    RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) -        .ModifyValue(&UF::ActivePlayerData::TraitConfigs), deletedIndex); +    RemoveMapUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData) +        .ModifyValue(&UF::ActivePlayerData::TraitConfigs), deletedConfigId);      m_traitConfigStates[deletedConfigId] = PLAYERSPELL_REMOVED;  } @@ -29007,26 +28988,23 @@ void Player::ApplyTraitEntry(int32 traitNodeEntryId, int32 rank, int32 grantedRa  void Player::SetTraitConfigUseStarterBuild(int32 traitConfigId, bool useStarterBuild)  { -    int32 configIndex = m_activePlayerData->TraitConfigs.FindIndexIf([traitConfigId](UF::TraitConfig const& traitConfig) -    { -        return traitConfig.ID == traitConfigId -            && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat -            && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None; -    }); -    if (configIndex < 0) +    UF::TraitConfig const* config = m_activePlayerData->TraitConfigs.Get(traitConfigId); +    if (!config +        || static_cast<TraitConfigType>(*config->Type) != TraitConfigType::Combat +        || (static_cast<TraitCombatConfigFlags>(*config->CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None)          return; -    bool currentlyUsesStarterBuild = EnumFlag(static_cast<TraitCombatConfigFlags>(*m_activePlayerData->TraitConfigs[configIndex].CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::StarterBuild); +    bool currentlyUsesStarterBuild = EnumFlag(static_cast<TraitCombatConfigFlags>(*config->CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::StarterBuild);      if (currentlyUsesStarterBuild == useStarterBuild)          return;      if (useStarterBuild)          SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData) -            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex) +            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfigId)              .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::StarterBuild));      else          RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData) -            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex) +            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfigId)              .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::StarterBuild));      m_traitConfigStates[traitConfigId] = PLAYERSPELL_CHANGED; @@ -29034,23 +29012,20 @@ void Player::SetTraitConfigUseStarterBuild(int32 traitConfigId, bool useStarterB  void Player::SetTraitConfigUseSharedActionBars(int32 traitConfigId, bool usesSharedActionBars, bool isLastSelectedSavedConfig)  { -    int32 configIndex = m_activePlayerData->TraitConfigs.FindIndexIf([traitConfigId](UF::TraitConfig const& traitConfig) -    { -        return traitConfig.ID == traitConfigId -            && static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat -            && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None; -    }); -    if (configIndex < 0) +    UF::TraitConfig const* config = m_activePlayerData->TraitConfigs.Get(traitConfigId); +    if (!config +        || static_cast<TraitConfigType>(*config->Type) != TraitConfigType::Combat +        || (static_cast<TraitCombatConfigFlags>(*config->CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None)          return; -    bool currentlyUsesSharedActionBars = EnumFlag(static_cast<TraitCombatConfigFlags>(*m_activePlayerData->TraitConfigs[configIndex].CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::SharedActionBars); +    bool currentlyUsesSharedActionBars = EnumFlag(static_cast<TraitCombatConfigFlags>(*config->CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::SharedActionBars);      if (currentlyUsesSharedActionBars == usesSharedActionBars)          return;      if (usesSharedActionBars)      {          SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData) -            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex) +            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfigId)              .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::SharedActionBars));          { @@ -29066,7 +29041,7 @@ void Player::SetTraitConfigUseSharedActionBars(int32 traitConfigId, bool usesSha      else      {          RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData) -            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, configIndex) +            .ModifyValue(&UF::ActivePlayerData::TraitConfigs, traitConfigId)              .ModifyValue(&UF::TraitConfig::CombatConfigFlags), AsUnderlyingType(TraitCombatConfigFlags::SharedActionBars));          // trigger a save with traitConfigId @@ -30890,6 +30865,16 @@ uint32 TraitMgr::PlayerDataAccessor::GetPrimarySpecialization() const      return AsUnderlyingType(_player->GetPrimarySpecialization());  } +std::variant<int64, float> TraitMgr::PlayerDataAccessor::GetDataElementAccount(uint32 dataElementId) const +{ +    return _player->GetDataElementAccount(dataElementId); +} + +std::variant<int64, float> TraitMgr::PlayerDataAccessor::GetDataElementCharacter(uint32 dataElementId) const +{ +    return _player->GetDataElementCharacter(dataElementId); +} +  void Player::RequestSpellCast(std::unique_ptr<SpellCastRequest> castRequest)  {      // We are overriding an already existing spell cast request so inform the client that the old cast is being replaced diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c28df374b2c..a24c32d8d74 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12133,7 +12133,7 @@ void Unit::SetAuraStack(uint32 spellId, Unit* target, uint32 stack)          aura->SetStackAmount(stack);  } -void Unit::SendPlaySpellVisual(Unit* target, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/, float launchDelay /*= 0.0f*/) +void Unit::SendPlaySpellVisual(Unit* target, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/, float launchDelay /*= 0.0f*/)  {      WorldPackets::Spells::PlaySpellVisual playSpellVisual;      playSpellVisual.Source = GetGUID(); @@ -12148,7 +12148,7 @@ void Unit::SendPlaySpellVisual(Unit* target, uint32 spellVisualId, uint16 missRe      SendMessageToSet(playSpellVisual.Write(), true);  } -void Unit::SendPlaySpellVisual(Position const& targetPosition, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/, float launchDelay /*= 0.0f*/) +void Unit::SendPlaySpellVisual(Position const& targetPosition, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/, float launchDelay /*= 0.0f*/)  {      WorldPackets::Spells::PlaySpellVisual playSpellVisual;      playSpellVisual.Source = GetGUID(); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 35e2303e6e5..22a872a7020 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1104,8 +1104,8 @@ class TC_GAME_API Unit : public WorldObject          Aura* AddAura(SpellInfo const* spellInfo, uint32 effMask, Unit* target);          void SetAuraStack(uint32 spellId, Unit* target, uint32 stack); -        void SendPlaySpellVisual(Unit* target, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime = false, float launchDelay = 0.0f); -        void SendPlaySpellVisual(Position const& targetPosition, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime = false, float launchDelay = 0.0f); +        void SendPlaySpellVisual(Unit* target, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime = false, float launchDelay = 0.0f); +        void SendPlaySpellVisual(Position const& targetPosition, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime = false, float launchDelay = 0.0f);          void SendCancelSpellVisual(uint32 id);          void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 28230a309b0..fdb30f26f58 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1362,13 +1362,11 @@ void Guild::HandleRoster(WorldSession* session)          memberData.GuildClubMemberID = Battlenet::Services::Clubs::CreateClubMemberId(member.GetGUID());          memberData.Authenticated = false; -        memberData.SorEligible = false;          memberData.Name = member.GetName();          memberData.Note = member.GetPublicNote();          if (sendOfficerNote)              memberData.OfficerNote = member.GetOfficerNote(); -      }      roster.WelcomeText = m_motd; @@ -1803,7 +1801,7 @@ void Guild::HandleRemoveMember(WorldSession* session, ObjectGuid guid)          SendCommandResult(session, GUILD_COMMAND_REMOVE_PLAYER, ERR_GUILD_PERMISSIONS);      else if (Member* member = GetMember(guid))      { -        std::string name = member->GetName(); +        std::string_view name = member->GetName();          // Guild masters cannot be removed          if (member->IsRank(GuildRankId::GuildMaster)) @@ -1842,7 +1840,7 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool      // Promoted player must be a member of guild      else if (Member* member = GetMember(guid))      { -        std::string name = member->GetName(); +        std::string_view name = member->GetName();          // Player cannot promote himself          if (member->IsSamePlayer(player->GetGUID()))          { diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index aa7ad50ffe8..8cae81b3f33 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -352,13 +352,13 @@ class TC_GAME_API Guild                  void SaveToDB(CharacterDatabaseTransaction trans) const;                  ObjectGuid const& GetGUID() const { return m_guid; } -                std::string const& GetName() const { return m_name; } +                std::string_view GetName() const { return m_name; }                  uint32 GetAccountId() const { return m_accountId; }                  GuildRankId GetRankId() const { return m_rankId; }                  uint64 GetLogoutTime() const { return m_logoutTime; }                  float GetInactiveDays() const; -                std::string GetPublicNote() const { return m_publicNote; } -                std::string GetOfficerNote() const { return m_officerNote; } +                std::string_view GetPublicNote() const { return m_publicNote; } +                std::string_view GetOfficerNote() const { return m_officerNote; }                  uint8 GetRace() const { return m_race; }                  uint8 GetClass() const { return m_class; }                  uint8 GetGender() const { return m_gender; } diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp index 78e786387cf..d61ce409595 100644 --- a/src/server/game/Handlers/AuthHandler.cpp +++ b/src/server/game/Handlers/AuthHandler.cpp @@ -139,4 +139,18 @@ void WorldSession::SendFeatureSystemStatusGlueScreen()      }      SendPacket(features.Write()); + +    WorldPackets::System::MirrorVarSingle vars[] = +    { +        { "raidLockoutExtendEnabled"sv, "1"sv }, +        { "bypassItemLevelScalingCode"sv, "0"sv }, +        { "shop2Enabled"sv, "0"sv }, +        { "bpayStoreEnable"sv, "0"sv }, +        { "recentAlliesEnabledClient"sv, "0"sv }, +        { "browserEnabled"sv, "0"sv }, +    }; + +    WorldPackets::System::MirrorVars variables; +    variables.Variables = vars; +    SendPacket(variables.Write());  } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 7f6ca72c7ef..b1d644fb5a3 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1501,7 +1501,7 @@ void WorldSession::SendFeatureSystemStatus()      /// START OF DUMMY VALUES      features.ComplaintStatus = COMPLAINT_ENABLED_WITH_AUTO_IGNORE;      features.CfgRealmID = 2; -    features.CfgRealmRecID = 0; +    features.CfgRealmRecID = sRealmList->GetCurrentRealmId().Realm;      features.CommercePricePollTimeSeconds = 300;      features.VoiceEnabled = false; @@ -1546,6 +1546,14 @@ void WorldSession::SendFeatureSystemStatus()          }, gameRule.Value);      } +    features.AddonChatThrottle.MaxTries = 10; +    features.AddonChatThrottle.TriesRestoredPerSecond = 1; +    features.AddonChatThrottle.UsedTriesPerMessage = 1; +    features.GuildChatThrottle.UsedTriesPerMessage = 1; +    features.GuildChatThrottle.TriesRestoredPerSecond = 20; +    features.GroupChatThrottle.UsedTriesPerMessage = 1; +    features.GroupChatThrottle.TriesRestoredPerSecond = 20; +      SendPacket(features.Write());  } diff --git a/src/server/game/Handlers/TraitHandler.cpp b/src/server/game/Handlers/TraitHandler.cpp index 086e25bc0b4..f26d04c75b6 100644 --- a/src/server/game/Handlers/TraitHandler.cpp +++ b/src/server/game/Handlers/TraitHandler.cpp @@ -156,19 +156,19 @@ void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::Clas      {          return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat              && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) == TraitCombatConfigFlags::None; -    }); +    }, [](auto const& pair) -> UF::TraitConfig const& { return pair.second.value; });      if (configCount >= TraitMgr::MAX_COMBAT_TRAIT_CONFIGS)          return;      auto findFreeLocalIdentifier = [&]()      {          int32 index = 1; -        while (_player->m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& traitConfig) +        while (_player->m_activePlayerData->TraitConfigs.FindIf([&](UF::TraitConfig const& traitConfig)          {              return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat                  && traitConfig.ChrSpecializationID == int32(_player->GetPrimarySpecialization())                  && traitConfig.LocalIdentifier == index; -        }) >= 0) +        }).first)              ++index;          return index; @@ -228,12 +228,12 @@ void WorldSession::HandleClassTalentsSetStarterBuildActive(WorldPackets::Traits:          auto findFreeLocalIdentifier = [&]()          {              int32 index = 1; -            while (_player->m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& traitConfig) +            while (_player->m_activePlayerData->TraitConfigs.FindIf([&](UF::TraitConfig const& traitConfig)              {                  return static_cast<TraitConfigType>(*traitConfig.Type) == TraitConfigType::Combat                      && traitConfig.ChrSpecializationID == int32(_player->GetPrimarySpecialization())                      && traitConfig.LocalIdentifier == index; -            }) >= 0) +            }).first)                  ++index;              return index; diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index ce48d72e5ed..26dcc9f7fdc 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -7964,587 +7964,589 @@ enum class GameError : uint32      ERR_READY_CHECK_IN_PROGRESS                                     = 617,      ERR_READY_CHECK_THROTTLED                                       = 618,      ERR_VOTE_TO_ABANDON_NOT_YET                                     = 619, -    ERR_DUNGEON_DIFFICULTY_FAILED                                   = 620, -    ERR_DUNGEON_DIFFICULTY_CHANGED_S                                = 621, -    ERR_TRADE_WRONG_REALM                                           = 622, -    ERR_TRADE_NOT_ON_TAPLIST                                        = 623, -    ERR_CHAT_PLAYER_AMBIGUOUS_S                                     = 624, -    ERR_LOOT_CANT_LOOT_THAT_NOW                                     = 625, -    ERR_LOOT_MASTER_INV_FULL                                        = 626, -    ERR_LOOT_MASTER_UNIQUE_ITEM                                     = 627, -    ERR_LOOT_MASTER_OTHER                                           = 628, -    ERR_FILTERING_YOU_S                                             = 629, -    ERR_USE_PREVENTED_BY_MECHANIC_S                                 = 630, -    ERR_ITEM_UNIQUE_EQUIPPABLE                                      = 631, -    ERR_LFG_LEADER_IS_LFM_S                                         = 632, -    ERR_LFG_PENDING                                                 = 633, -    ERR_CANT_SPEAK_LANGAGE                                          = 634, -    ERR_VENDOR_MISSING_TURNINS                                      = 635, -    ERR_BATTLEGROUND_NOT_IN_TEAM                                    = 636, -    ERR_NOT_IN_BATTLEGROUND                                         = 637, -    ERR_NOT_ENOUGH_HONOR_POINTS                                     = 638, -    ERR_NOT_ENOUGH_ARENA_POINTS                                     = 639, -    ERR_SOCKETING_REQUIRES_META_GEM                                 = 640, -    ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT                         = 641, -    ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM                            = 642, -    ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT               = 643, -    ERR_SOCKETING_REQUIRES_COGWHEEL_GEM                             = 644, -    ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT                 = 645, -    ERR_SOCKETING_ITEM_TOO_LOW_LEVEL                                = 646, -    ERR_ITEM_MAX_COUNT_SOCKETED                                     = 647, -    ERR_SYSTEM_DISABLED                                             = 648, -    ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I                        = 649, -    ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED                            = 650, -    ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED                             = 651, -    ERR_USER_SQUELCHED                                              = 652, -    ERR_ACCOUNT_SILENCED                                            = 653, -    ERR_PARTY_MEMBER_SILENCED                                       = 654, -    ERR_PARTY_MEMBER_SILENCED_LFG_DELIST                            = 655, -    ERR_TOO_MUCH_GOLD                                               = 656, -    ERR_NOT_BARBER_SITTING                                          = 657, -    ERR_QUEST_FAILED_CAIS                                           = 658, -    ERR_INVITE_RESTRICTED_TRIAL                                     = 659, -    ERR_VOICE_IGNORE_FULL                                           = 660, -    ERR_VOICE_IGNORE_SELF                                           = 661, -    ERR_VOICE_IGNORE_NOT_FOUND                                      = 662, -    ERR_VOICE_IGNORE_ALREADY_S                                      = 663, -    ERR_VOICE_IGNORE_ADDED_S                                        = 664, -    ERR_VOICE_IGNORE_REMOVED_S                                      = 665, -    ERR_VOICE_IGNORE_AMBIGUOUS                                      = 666, -    ERR_VOICE_IGNORE_DELETED                                        = 667, -    ERR_UNKNOWN_MACRO_OPTION_S                                      = 668, -    ERR_NOT_DURING_ARENA_MATCH                                      = 669, -    ERR_NOT_IN_RATED_BATTLEGROUND                                   = 670, -    ERR_PLAYER_SILENCED                                             = 671, -    ERR_PLAYER_UNSILENCED                                           = 672, -    ERR_COMSAT_DISCONNECT                                           = 673, -    ERR_COMSAT_RECONNECT_ATTEMPT                                    = 674, -    ERR_COMSAT_CONNECT_FAIL                                         = 675, -    ERR_MAIL_INVALID_ATTACHMENT_SLOT                                = 676, -    ERR_MAIL_TOO_MANY_ATTACHMENTS                                   = 677, -    ERR_MAIL_INVALID_ATTACHMENT                                     = 678, -    ERR_MAIL_ATTACHMENT_EXPIRED                                     = 679, -    ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC                             = 680, -    ERR_PROFANE_CHAT_NAME                                           = 681, -    ERR_PLAYER_SILENCED_ECHO                                        = 682, -    ERR_PLAYER_UNSILENCED_ECHO                                      = 683, -    ERR_LOOT_CANT_LOOT_THAT                                         = 684, -    ERR_ARENA_EXPIRED_CAIS                                          = 685, -    ERR_GROUP_ACTION_THROTTLED                                      = 686, -    ERR_ALREADY_PICKPOCKETED                                        = 687, -    ERR_NAME_INVALID                                                = 688, -    ERR_NAME_NO_NAME                                                = 689, -    ERR_NAME_TOO_SHORT                                              = 690, -    ERR_NAME_TOO_LONG                                               = 691, -    ERR_NAME_MIXED_LANGUAGES                                        = 692, -    ERR_NAME_PROFANE                                                = 693, -    ERR_NAME_RESERVED                                               = 694, -    ERR_NAME_THREE_CONSECUTIVE                                      = 695, -    ERR_NAME_INVALID_SPACE                                          = 696, -    ERR_NAME_CONSECUTIVE_SPACES                                     = 697, -    ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS                  = 698, -    ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END           = 699, -    ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME                      = 700, -    ERR_RECRUIT_A_FRIEND_NOT_LINKED                                 = 701, -    ERR_RECRUIT_A_FRIEND_NOT_NOW                                    = 702, -    ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX                           = 703, -    ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN                            = 704, -    ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE                             = 705, -    ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL                            = 706, -    ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED          = 707, -    ERR_NOT_SAME_ACCOUNT                                            = 708, -    ERR_BAD_ON_USE_ENCHANT                                          = 709, -    ERR_TRADE_SELF                                                  = 710, -    ERR_TOO_MANY_SOCKETS                                            = 711, -    ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS                   = 712, -    ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS           = 713, -    ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS                = 714, -    ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS                = 715, -    ERR_SHAPESHIFT_FORM_CANNOT_EQUIP                                = 716, -    ERR_ITEM_INVENTORY_FULL_SATCHEL                                 = 717, -    ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED                            = 718, -    ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW                             = 719, -    ERR_PURCHASE_LEVEL_TOO_LOW                                      = 720, -    ERR_GROUP_SWAP_FAILED                                           = 721, -    ERR_INVITE_IN_COMBAT                                            = 722, -    ERR_INVALID_GLYPH_SLOT                                          = 723, -    ERR_GENERIC_NO_VALID_TARGETS                                    = 724, -    ERR_CALENDAR_EVENT_ALERT_S                                      = 725, -    ERR_PET_LEARN_SPELL_S                                           = 726, -    ERR_PET_LEARN_ABILITY_S                                         = 727, -    ERR_PET_SPELL_UNLEARNED_S                                       = 728, -    ERR_INVITE_UNKNOWN_REALM                                        = 729, -    ERR_INVITE_NO_PARTY_SERVER                                      = 730, -    ERR_INVITE_PARTY_BUSY                                           = 731, -    ERR_INVITE_PARTY_BUSY_PENDING_REQUEST                           = 732, -    ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST                           = 733, -    ERR_PARTY_TARGET_AMBIGUOUS                                      = 734, -    ERR_PARTY_LFG_INVITE_RAID_LOCKED                                = 735, -    ERR_PARTY_LFG_BOOT_LIMIT                                        = 736, -    ERR_PARTY_LFG_BOOT_COOLDOWN_S                                   = 737, -    ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S                               = 738, -    ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S                            = 739, -    ERR_PARTY_LFG_BOOT_IN_PROGRESS                                  = 740, -    ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS                              = 741, -    ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED                               = 742, -    ERR_PARTY_LFG_BOOT_VOTE_FAILED                                  = 743, -    ERR_PARTY_LFG_BOOT_DISALLOWED_BY_MAP                            = 744, -    ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE                             = 745, -    ERR_PARTY_LFG_BOOT_LOOT_ROLLS                                   = 746, -    ERR_PARTY_LFG_BOOT_VOTE_REGISTERED                              = 747, -    ERR_PARTY_PRIVATE_GROUP_ONLY                                    = 748, -    ERR_PARTY_LFG_TELEPORT_IN_COMBAT                                = 749, -    ERR_PARTY_TIME_RUNNING_SEASON_ID_MUST_MATCH                     = 750, -    ERR_RAID_DISALLOWED_BY_LEVEL                                    = 751, -    ERR_RAID_DISALLOWED_BY_CROSS_REALM                              = 752, -    ERR_PARTY_ROLE_NOT_AVAILABLE                                    = 753, -    ERR_JOIN_LFG_OBJECT_FAILED                                      = 754, -    ERR_LFG_REMOVED_LEVELUP                                         = 755, -    ERR_LFG_REMOVED_XP_TOGGLE                                       = 756, -    ERR_LFG_REMOVED_FACTION_CHANGE                                  = 757, -    ERR_BATTLEGROUND_INFO_THROTTLED                                 = 758, -    ERR_BATTLEGROUND_ALREADY_IN                                     = 759, -    ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED                             = 760, -    ERR_ARENA_TEAM_PERMISSIONS                                      = 761, -    ERR_NOT_WHILE_FALLING                                           = 762, -    ERR_NOT_WHILE_MOVING                                            = 763, -    ERR_NOT_WHILE_FATIGUED                                          = 764, -    ERR_MAX_SOCKETS                                                 = 765, -    ERR_MULTI_CAST_ACTION_TOTEM_S                                   = 766, -    ERR_BATTLEGROUND_JOIN_LEVELUP                                   = 767, -    ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN                               = 768, -    ERR_BATTLEGROUND_JOIN_XP_GAIN                                   = 769, -    ERR_BATTLEGROUND_JOIN_MERCENARY                                 = 770, -    ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS                          = 771, -    ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS                    = 772, -    ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS                            = 773, -    ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE                           = 774, -    ERR_RAID_DIFFICULTY_FAILED                                      = 775, -    ERR_RAID_DIFFICULTY_CHANGED_S                                   = 776, -    ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S                            = 777, -    ERR_RAID_LOCKOUT_CHANGED_S                                      = 778, -    ERR_RAID_CONVERTED_TO_PARTY                                     = 779, -    ERR_PARTY_CONVERTED_TO_RAID                                     = 780, -    ERR_PLAYER_DIFFICULTY_CHANGED_S                                 = 781, -    ERR_GMRESPONSE_DB_ERROR                                         = 782, -    ERR_BATTLEGROUND_JOIN_RANGE_INDEX                               = 783, -    ERR_ARENA_JOIN_RANGE_INDEX                                      = 784, -    ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE                        = 785, -    ERR_BATTLEGROUND_JOIN_FAILED                                    = 786, -    ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE                    = 787, -    ERR_BATTLEGROUND_JOIN_RESPEC                                    = 788, -    ERR_BATTLEGROUND_INVITATION_DECLINED                            = 789, -    ERR_BATTLEGROUND_INVITATION_DECLINED_BY                         = 790, -    ERR_BATTLEGROUND_JOIN_TIMED_OUT                                 = 791, -    ERR_BATTLEGROUND_DUPE_QUEUE                                     = 792, -    ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST                       = 793, -    ERR_IN_BATTLEGROUND_RESPEC                                      = 794, -    ERR_MAIL_LIMITED_DURATION_ITEM                                  = 795, -    ERR_YELL_RESTRICTED_TRIAL                                       = 796, -    ERR_CHAT_RAID_RESTRICTED_TRIAL                                  = 797, -    ERR_LFG_ROLE_CHECK_FAILED                                       = 798, -    ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT                               = 799, -    ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE                            = 800, -    ERR_LFG_READY_CHECK_FAILED                                      = 801, -    ERR_LFG_READY_CHECK_FAILED_TIMEOUT                              = 802, -    ERR_LFG_GROUP_FULL                                              = 803, -    ERR_LFG_NO_LFG_OBJECT                                           = 804, -    ERR_LFG_NO_SLOTS_PLAYER                                         = 805, -    ERR_LFG_NO_SLOTS_PARTY                                          = 806, -    ERR_LFG_NO_SPEC                                                 = 807, -    ERR_LFG_MISMATCHED_SLOTS                                        = 808, -    ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM                           = 809, -    ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS                     = 810, -    ERR_LFG_MEMBERS_NOT_PRESENT                                     = 811, -    ERR_LFG_GET_INFO_TIMEOUT                                        = 812, -    ERR_LFG_INVALID_SLOT                                            = 813, -    ERR_LFG_DESERTER_PLAYER                                         = 814, -    ERR_LFG_DESERTER_PARTY                                          = 815, -    ERR_LFG_DEAD                                                    = 816, -    ERR_LFG_RANDOM_COOLDOWN_PLAYER                                  = 817, -    ERR_LFG_RANDOM_COOLDOWN_PARTY                                   = 818, -    ERR_LFG_TOO_MANY_MEMBERS                                        = 819, -    ERR_LFG_TOO_FEW_MEMBERS                                         = 820, -    ERR_LFG_PROPOSAL_FAILED                                         = 821, -    ERR_LFG_PROPOSAL_DECLINED_SELF                                  = 822, -    ERR_LFG_PROPOSAL_DECLINED_PARTY                                 = 823, -    ERR_LFG_NO_SLOTS_SELECTED                                       = 824, -    ERR_LFG_NO_ROLES_SELECTED                                       = 825, -    ERR_LFG_ROLE_CHECK_INITIATED                                    = 826, -    ERR_LFG_READY_CHECK_INITIATED                                   = 827, -    ERR_LFG_PLAYER_DECLINED_ROLE_CHECK                              = 828, -    ERR_LFG_PLAYER_DECLINED_READY_CHECK                             = 829, -    ERR_LFG_LOREWALKING                                             = 830, -    ERR_LFG_JOINED_QUEUE                                            = 831, -    ERR_LFG_JOINED_FLEX_QUEUE                                       = 832, -    ERR_LFG_JOINED_RF_QUEUE                                         = 833, -    ERR_LFG_JOINED_SCENARIO_QUEUE                                   = 834, -    ERR_LFG_JOINED_WORLD_PVP_QUEUE                                  = 835, -    ERR_LFG_JOINED_BATTLEFIELD_QUEUE                                = 836, -    ERR_LFG_JOINED_LIST                                             = 837, -    ERR_QUEUED_PLUNDERSTORM                                         = 838, -    ERR_LFG_LEFT_QUEUE                                              = 839, -    ERR_LFG_LEFT_LIST                                               = 840, -    ERR_LFG_ROLE_CHECK_ABORTED                                      = 841, -    ERR_LFG_READY_CHECK_ABORTED                                     = 842, -    ERR_LFG_CANT_USE_BATTLEGROUND                                   = 843, -    ERR_LFG_CANT_USE_DUNGEONS                                       = 844, -    ERR_LFG_REASON_TOO_MANY_LFG                                     = 845, -    ERR_LFG_FARM_LIMIT                                              = 846, -    ERR_LFG_NO_CROSS_FACTION_PARTIES                                = 847, -    ERR_INVALID_TELEPORT_LOCATION                                   = 848, -    ERR_TOO_FAR_TO_INTERACT                                         = 849, -    ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS                  = 850, -    ERR_DIFFICULTY_CHANGE_COOLDOWN_S                                = 851, -    ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S                         = 852, -    ERR_DIFFICULTY_CHANGE_WORLDSTATE                                = 853, -    ERR_DIFFICULTY_CHANGE_ENCOUNTER                                 = 854, -    ERR_DIFFICULTY_CHANGE_COMBAT                                    = 855, -    ERR_DIFFICULTY_CHANGE_PLAYER_BUSY                               = 856, -    ERR_DIFFICULTY_CHANGE_PLAYER_ON_VEHICLE                         = 857, -    ERR_DIFFICULTY_CHANGE_ALREADY_STARTED                           = 858, -    ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S                            = 859, -    ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING           = 860, -    ERR_ARENA_TEAM_PARTY_SIZE                                       = 861, -    ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE                             = 862, -    ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP                             = 863, -    ERR_SOLO_RBG_WARGAME_GROUP_SIZE                                 = 864, -    ERR_SOLO_RBG_WARGAME_GROUP_COMP                                 = 865, -    ERR_SOLO_MIN_ITEM_LEVEL                                         = 866, -    ERR_PVP_PLAYER_ABANDONED                                        = 867, -    ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER                = 868, -    ERR_QUEST_FORCE_REMOVED_S                                       = 869, -    ERR_ATTACK_NO_ACTIONS                                           = 870, -    ERR_IN_RANDOM_BG                                                = 871, -    ERR_IN_NON_RANDOM_BG                                            = 872, -    ERR_BN_FRIEND_SELF                                              = 873, -    ERR_BN_FRIEND_ALREADY                                           = 874, -    ERR_BN_FRIEND_BLOCKED                                           = 875, -    ERR_BN_FRIEND_LIST_FULL                                         = 876, -    ERR_BN_FRIEND_REQUEST_SENT                                      = 877, -    ERR_BN_BROADCAST_THROTTLE                                       = 878, -    ERR_BG_DEVELOPER_ONLY                                           = 879, -    ERR_CURRENCY_SPELL_SLOT_MISMATCH                                = 880, -    ERR_CURRENCY_NOT_TRADABLE                                       = 881, -    ERR_REQUIRES_EXPANSION_S                                        = 882, -    ERR_QUEST_FAILED_SPELL                                          = 883, -    ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS                         = 884, -    ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE            = 885, -    ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED                      = 886, -    ERR_TALENT_FAILED_CANT_REMOVE_TALENT                            = 887, -    ERR_TALENT_FAILED_UNKNOWN                                       = 888, -    ERR_TALENT_FAILED_IN_COMBAT                                     = 889, -    ERR_TALENT_FAILED_IN_PVP_MATCH                                  = 890, -    ERR_TALENT_FAILED_IN_MYTHIC_PLUS                                = 891, -    ERR_WARGAME_REQUEST_FAILURE                                     = 892, -    ERR_RANK_REQUIRES_AUTHENTICATOR                                 = 893, -    ERR_GUILD_BANK_VOUCHER_FAILED                                   = 894, -    ERR_WARGAME_REQUEST_SENT                                        = 895, -    ERR_REQUIRES_ACHIEVEMENT_I                                      = 896, -    ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY                           = 897, -    ERR_CANT_BUY_QUANTITY                                           = 898, -    ERR_ITEM_IS_BATTLE_PAY_LOCKED                                   = 899, -    ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE                         = 900, -    ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE                         = 901, -    ERR_BATTLEFIELD_TEAM_PARTY_SIZE                                 = 902, -    ERR_INSUFF_TRACKED_CURRENCY_IS                                  = 903, -    ERR_NOT_ON_TOURNAMENT_REALM                                     = 904, -    ERR_GUILD_TRIAL_ACCOUNT_TRIAL                                   = 905, -    ERR_GUILD_TRIAL_ACCOUNT_VETERAN                                 = 906, -    ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL                              = 907, -    ERR_CANT_DO_THAT_IN_A_GROUP                                     = 908, -    ERR_GUILD_LEADER_REPLACED                                       = 909, -    ERR_TRANSMOGRIFY_CANT_EQUIP                                     = 910, -    ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE                              = 911, -    ERR_TRANSMOGRIFY_NOT_SOULBOUND                                  = 912, -    ERR_TRANSMOGRIFY_INVALID_SOURCE                                 = 913, -    ERR_TRANSMOGRIFY_INVALID_DESTINATION                            = 914, -    ERR_TRANSMOGRIFY_MISMATCH                                       = 915, -    ERR_TRANSMOGRIFY_LEGENDARY                                      = 916, -    ERR_TRANSMOGRIFY_SAME_ITEM                                      = 917, -    ERR_TRANSMOGRIFY_SAME_APPEARANCE                                = 918, -    ERR_TRANSMOGRIFY_NOT_EQUIPPED                                   = 919, -    ERR_VOID_DEPOSIT_FULL                                           = 920, -    ERR_VOID_WITHDRAW_FULL                                          = 921, -    ERR_VOID_STORAGE_WRAPPED                                        = 922, -    ERR_VOID_STORAGE_STACKABLE                                      = 923, -    ERR_VOID_STORAGE_UNBOUND                                        = 924, -    ERR_VOID_STORAGE_REPAIR                                         = 925, -    ERR_VOID_STORAGE_CHARGES                                        = 926, -    ERR_VOID_STORAGE_QUEST                                          = 927, -    ERR_VOID_STORAGE_CONJURED                                       = 928, -    ERR_VOID_STORAGE_MAIL                                           = 929, -    ERR_VOID_STORAGE_BAG                                            = 930, -    ERR_VOID_TRANSFER_STORAGE_FULL                                  = 931, -    ERR_VOID_TRANSFER_INV_FULL                                      = 932, -    ERR_VOID_TRANSFER_INTERNAL_ERROR                                = 933, -    ERR_VOID_TRANSFER_ITEM_INVALID                                  = 934, -    ERR_DIFFICULTY_DISABLED_IN_LFG                                  = 935, -    ERR_VOID_STORAGE_UNIQUE                                         = 936, -    ERR_VOID_STORAGE_LOOT                                           = 937, -    ERR_VOID_STORAGE_HOLIDAY                                        = 938, -    ERR_VOID_STORAGE_DURATION                                       = 939, -    ERR_VOID_STORAGE_LOAD_FAILED                                    = 940, -    ERR_VOID_STORAGE_INVALID_ITEM                                   = 941, -    ERR_VOID_STORAGE_ACCOUNT_ITEM                                   = 942, -    ERR_PARENTAL_CONTROLS_CHAT_MUTED                                = 943, -    ERR_SOR_START_EXPERIENCE_INCOMPLETE                             = 944, -    ERR_SOR_INVALID_EMAIL                                           = 945, -    ERR_SOR_INVALID_COMMENT                                         = 946, -    ERR_CHALLENGE_MODE_RESET_COOLDOWN_S                             = 947, -    ERR_CHALLENGE_MODE_RESET_KEYSTONE                               = 948, -    ERR_PET_JOURNAL_ALREADY_IN_LOADOUT                              = 949, -    ERR_REPORT_SUBMITTED_SUCCESSFULLY                               = 950, -    ERR_REPORT_SUBMISSION_FAILED                                    = 951, -    ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY                           = 952, -    ERR_BUG_SUBMITTED_SUCCESSFULLY                                  = 953, -    ERR_CHALLENGE_MODE_ENABLED                                      = 954, -    ERR_CHALLENGE_MODE_DISABLED                                     = 955, -    ERR_PETBATTLE_CREATE_FAILED                                     = 956, -    ERR_PETBATTLE_NOT_HERE                                          = 957, -    ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT                             = 958, -    ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND                            = 959, -    ERR_PETBATTLE_NOT_HERE_OBSTRUCTED                               = 960, -    ERR_PETBATTLE_NOT_WHILE_IN_COMBAT                               = 961, -    ERR_PETBATTLE_NOT_WHILE_DEAD                                    = 962, -    ERR_PETBATTLE_NOT_WHILE_FLYING                                  = 963, -    ERR_PETBATTLE_TARGET_INVALID                                    = 964, -    ERR_PETBATTLE_TARGET_OUT_OF_RANGE                               = 965, -    ERR_PETBATTLE_TARGET_NOT_CAPTURABLE                             = 966, -    ERR_PETBATTLE_NOT_A_TRAINER                                     = 967, -    ERR_PETBATTLE_DECLINED                                          = 968, -    ERR_PETBATTLE_IN_BATTLE                                         = 969, -    ERR_PETBATTLE_INVALID_LOADOUT                                   = 970, -    ERR_PETBATTLE_ALL_PETS_DEAD                                     = 971, -    ERR_PETBATTLE_NO_PETS_IN_SLOTS                                  = 972, -    ERR_PETBATTLE_NO_ACCOUNT_LOCK                                   = 973, -    ERR_PETBATTLE_WILD_PET_TAPPED                                   = 974, -    ERR_PETBATTLE_RESTRICTED_ACCOUNT                                = 975, -    ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE                            = 976, -    ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE                       = 977, -    ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE                            = 978, -    ERR_CANT_HAVE_MORE_PETS                                         = 979, -    ERR_PVP_MAP_NOT_FOUND                                           = 980, -    ERR_PVP_MAP_NOT_SET                                             = 981, -    ERR_PETBATTLE_QUEUE_QUEUED                                      = 982, -    ERR_PETBATTLE_QUEUE_ALREADY_QUEUED                              = 983, -    ERR_PETBATTLE_QUEUE_JOIN_FAILED                                 = 984, -    ERR_PETBATTLE_QUEUE_JOURNAL_LOCK                                = 985, -    ERR_PETBATTLE_QUEUE_REMOVED                                     = 986, -    ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED                           = 987, -    ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT                            = 988, -    ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED                           = 989, -    ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL                           = 990, -    ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED                            = 991, -    ERR_PETBATTLE_QUEUE_SLOT_LOCKED                                 = 992, -    ERR_PETBATTLE_QUEUE_SLOT_EMPTY                                  = 993, -    ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER                             = 994, -    ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES                             = 995, -    ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE                            = 996, -    ERR_PETBATTLE_QUEUE_SLOT_REVOKED                                = 997, -    ERR_PETBATTLE_QUEUE_SLOT_DEAD                                   = 998, -    ERR_PETBATTLE_QUEUE_SLOT_NO_PET                                 = 999, -    ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL                           = 1000, -    ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING                           = 1001, -    ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING                         = 1002, -    ERR_HAS_RESTRICTION                                             = 1003, -    ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL                             = 1004, -    ERR_ITEM_UPGRADE_NO_PATH                                        = 1005, -    ERR_ITEM_UPGRADE_NO_MORE_UPGRADES                               = 1006, -    ERR_BONUS_ROLL_EMPTY                                            = 1007, -    ERR_CHALLENGE_MODE_FULL                                         = 1008, -    ERR_CHALLENGE_MODE_IN_PROGRESS                                  = 1009, -    ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE                           = 1010, -    ERR_START_RESTRICTED_CHALLENGE_MODE                             = 1011, -    ERR_BATTLETAG_FRIEND_NOT_FOUND                                  = 1012, -    ERR_BATTLETAG_FRIEND_NOT_VALID                                  = 1013, -    ERR_BATTLETAG_FRIEND_NOT_ALLOWED                                = 1014, -    ERR_BATTLETAG_FRIEND_THROTTLED                                  = 1015, -    ERR_BATTLETAG_FRIEND_SUCCESS                                    = 1016, -    ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE                                = 1017, -    ERR_PETBATTLE_INTERNAL                                          = 1018, -    ERR_CANT_CAGE_PET_YET                                           = 1019, -    ERR_NO_LOOT_IN_CHALLENGE_MODE                                   = 1020, -    ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II                           = 1021, -    ERR_ROLE_CHECK_ALREADY_IN_PROGRESS                              = 1022, -    ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT                              = 1023, -    ERR_RECRUIT_A_FRIEND_FAILED                                     = 1024, -    ERR_SET_LOOT_PERSONAL                                           = 1025, -    ERR_SET_LOOT_METHOD_FAILED_COMBAT                               = 1026, -    ERR_REAGENT_BANK_FULL                                           = 1027, -    ERR_REAGENT_BANK_LOCKED                                         = 1028, -    ERR_GARRISON_BUILDING_EXISTS                                    = 1029, -    ERR_GARRISON_INVALID_PLOT                                       = 1030, -    ERR_GARRISON_INVALID_BUILDINGID                                 = 1031, -    ERR_GARRISON_INVALID_PLOT_BUILDING                              = 1032, -    ERR_GARRISON_REQUIRES_BLUEPRINT                                 = 1033, -    ERR_GARRISON_NOT_ENOUGH_CURRENCY                                = 1034, -    ERR_GARRISON_NOT_ENOUGH_GOLD                                    = 1035, -    ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE               = 1036, -    ERR_ALREADY_USING_LFG_LIST                                      = 1037, -    ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL                           = 1038, -    ERR_TOY_USE_LIMIT_REACHED                                       = 1039, -    ERR_TOY_ALREADY_KNOWN                                           = 1040, -    ERR_TRANSMOG_SET_ALREADY_KNOWN                                  = 1041, -    ERR_NOT_ENOUGH_CURRENCY                                         = 1042, -    ERR_SPEC_IS_DISABLED                                            = 1043, -    ERR_FEATURE_RESTRICTED_TRIAL                                    = 1044, -    ERR_CANT_BE_OBLITERATED                                         = 1045, -    ERR_CANT_BE_SCRAPPED                                            = 1046, -    ERR_CANT_BE_RECRAFTED                                           = 1047, -    ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT                      = 1048, -    ERR_MUST_EQUIP_ARTIFACT                                         = 1049, -    ERR_CANT_DO_THAT_RIGHT_NOW                                      = 1050, -    ERR_AFFECTING_COMBAT                                            = 1051, -    ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S                             = 1052, -    ERR_EQUIPMENT_MANAGER_BAGS_FULL                                 = 1053, -    ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S                            = 1054, -    ERR_MOVIE_RECORDING_WARNING_PERF                                = 1055, -    ERR_MOVIE_RECORDING_WARNING_DISK_FULL                           = 1056, -    ERR_MOVIE_RECORDING_WARNING_NO_MOVIE                            = 1057, -    ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS                        = 1058, -    ERR_MOVIE_RECORDING_WARNING_COMPRESSING                         = 1059, -    ERR_NO_CHALLENGE_MODE_REWARD                                    = 1060, -    ERR_CLAIMED_CHALLENGE_MODE_REWARD                               = 1061, -    ERR_CHALLENGE_MODE_PERIOD_RESET_SS                              = 1062, -    ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE                          = 1063, -    ERR_TALENT_FAILED_REST_AREA                                     = 1064, -    ERR_CANNOT_ABANDON_LAST_PET                                     = 1065, -    ERR_TEST_CVAR_SET_SSS                                           = 1066, -    ERR_QUEST_TURN_IN_FAIL_REASON                                   = 1067, -    ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD                           = 1068, -    ERR_TALENT_GRANTED_BY_AURA                                      = 1069, -    ERR_CHALLENGE_MODE_ALREADY_COMPLETE                             = 1070, -    ERR_GLYPH_TARGET_NOT_AVAILABLE                                  = 1071, -    ERR_PVP_WARMODE_TOGGLE_ON                                       = 1072, -    ERR_PVP_WARMODE_TOGGLE_OFF                                      = 1073, -    ERR_SPELL_FAILED_LEVEL_REQUIREMENT                              = 1074, -    ERR_SPELL_FAILED_CANT_FLY_HERE                                  = 1075, -    ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL                            = 1076, -    ERR_BATTLEGROUND_JOIN_DISQUALIFIED                              = 1077, -    ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME                      = 1078, -    ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT                        = 1079, -    ERR_VOICE_CHAT_SERVICE_LOST                                     = 1080, -    ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT                           = 1081, -    ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG                            = 1082, -    ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS                           = 1083, -    ERR_VOICE_CHAT_TARGET_NOT_FOUND                                 = 1084, -    ERR_VOICE_CHAT_TOO_MANY_REQUESTS                                = 1085, -    ERR_VOICE_CHAT_PLAYER_SILENCED                                  = 1086, -    ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL                             = 1087, -    ERR_VOICE_CHAT_DISABLED                                         = 1088, -    ERR_NO_PVP_REWARD                                               = 1089, -    ERR_CLAIMED_PVP_REWARD                                          = 1090, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED       = 1091, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE        = 1092, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED           = 1093, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA                  = 1094, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED                = 1095, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE               = 1096, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW        = 1097, -    ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED               = 1098, -    ERR_SOCKETING_GENERIC_FAILURE                                   = 1099, -    ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM                         = 1100, -    ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT         = 1101, -    ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM                      = 1102, -    ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT   = 1103, -    ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM                        = 1104, -    ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT       = 1105, -    ERR_SOCKETING_REQUIRES_DOMINATION_SHARD                         = 1106, -    ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT           = 1107, -    ERR_SOCKETING_REQUIRES_CYPHER_GEM                               = 1108, -    ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT                     = 1109, -    ERR_SOCKETING_REQUIRES_TINKER_GEM                               = 1110, -    ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT                     = 1111, -    ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM                           = 1112, -    ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT             = 1113, -    ERR_SOCKETING_REQUIRES_FRAGRANCE_GEM                            = 1114, -    ERR_SOCKETING_FRAGRANCE_GEM_ONLY_IN_FRAGRANCESLOT               = 1115, -    ERR_SOCKETING_REQUIRES_SINGING_THUNDER_GEM                      = 1116, -    ERR_SOCKETING_SINGINGTHUNDER_GEM_ONLY_IN_SINGINGTHUNDERSLOT     = 1117, -    ERR_SOCKETING_REQUIRES_SINGING_SEA_GEM                          = 1118, -    ERR_SOCKETING_SINGINGSEA_GEM_ONLY_IN_SINGINGSEASLOT             = 1119, -    ERR_SOCKETING_REQUIRES_SINGING_WIND_GEM                         = 1120, -    ERR_SOCKETING_SINGINGWIND_GEM_ONLY_IN_SINGINGWINDSLOT           = 1121, -    ERR_SOCKETING_REQUIRES_FIBER_GEM                                = 1122, -    ERR_SOCKETING_FIBER_GEM_ONLY_IN_FIBERSLOT                       = 1123, -    ERR_LEVEL_LINKING_RESULT_LINKED                                 = 1124, -    ERR_LEVEL_LINKING_RESULT_UNLINKED                               = 1125, -    ERR_CLUB_FINDER_ERROR_POST_CLUB                                 = 1126, -    ERR_CLUB_FINDER_ERROR_APPLY_CLUB                                = 1127, -    ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT                         = 1128, -    ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION                        = 1129, -    ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION                   = 1130, -    ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS                = 1131, -    ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS               = 1132, -    ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST                       = 1133, -    ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM               = 1134, -    ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE                 = 1135, -    ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS                      = 1136, -    ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION                     = 1137, -    ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE                   = 1138, -    ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME                       = 1139, -    ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE           = 1140, -    ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD                            = 1141, -    ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY                        = 1142, -    ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT                       = 1143, -    ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE                          = 1144, -    ERR_SOULBIND_INVALID_CONDUIT                                    = 1145, -    ERR_SOULBIND_INVALID_CONDUIT_ITEM                               = 1146, -    ERR_SOULBIND_INVALID_TALENT                                     = 1147, -    ERR_SOULBIND_DUPLICATE_CONDUIT                                  = 1148, -    ERR_ACTIVATE_SOULBIND_S                                         = 1149, -    ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA                          = 1150, -    ERR_CANT_USE_PROFANITY                                          = 1151, -    ERR_NOT_IN_PET_BATTLE                                           = 1152, -    ERR_NOT_IN_NPE                                                  = 1153, -    ERR_NO_SPEC                                                     = 1154, -    ERR_NO_DOMINATIONSHARD_OVERWRITE                                = 1155, -    ERR_USE_WEEKLY_REWARDS_DISABLED                                 = 1156, -    ERR_CROSS_FACTION_GROUP_JOINED                                  = 1157, -    ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD                         = 1158, -    ERR_EQUIPABLESPELLS_SLOTS_FULL                                  = 1159, -    ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN                     = 1160, -    ERR_CANT_BULK_SELL_ITEM_WITH_REFUND                             = 1161, -    ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK                           = 1162, -    ERR_NO_REFUNDABLE_ITEM_IN_ACCOUNT_BANK                          = 1163, -    ERR_CANT_DELETE_IN_ACCOUNT_BANK                                 = 1164, -    ERR_NO_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK                      = 1165, -    ERR_NO_OPEN_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK                 = 1166, -    ERR_CANT_TRADE_ACCOUNT_ITEM                                     = 1167, -    ERR_NO_ACCOUNT_INVENTORY_LOCK                                   = 1168, -    ERR_BANK_NOT_ACCESSIBLE                                         = 1169, -    ERR_TOO_MANY_ACCOUNT_BANK_TABS                                  = 1170, -    ERR_BANK_TAB_NOT_UNLOCKED                                       = 1171, -    ERR_ACCOUNT_MONEY_LOCKED                                        = 1172, -    ERR_BANK_TAB_INVALID_NAME                                       = 1173, -    ERR_BANK_TAB_INVALID_TEXT                                       = 1174, -    ERR_CHARACTER_BANK_NOT_CONVERTED                                = 1175, -    ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL                     = 1176, -    ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT                   = 1177, -    ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED            = 1178, -    ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID              = 1179, -    ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED          = 1180, -    ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED          = 1181, -    ERR_WOW_LABS_SET_WOW_LABS_AREA_ID_FAILED                        = 1182, -    ERR_PLUNDERSTORM_CANNOT_QUEUE                                   = 1183, -    ERR_TARGET_IS_SELF_FOUND_CANNOT_TRADE                           = 1184, -    ERR_PLAYER_IS_SELF_FOUND_CANNOT_TRADE                           = 1185, -    ERR_MAIL_RECEPIENT_IS_SELF_FOUND_CANNOT_RECEIVE_MAIL            = 1186, -    ERR_PLAYER_IS_SELF_FOUND_CANNOT_SEND_MAIL                       = 1187, -    ERR_PLAYER_IS_SELF_FOUND_CANNOT_USE_AUCTION_HOUSE               = 1188, -    ERR_MAIL_TARGET_CANNOT_RECEIVE_MAIL                             = 1189, -    ERR_REMIX_INVALID_TRANSFER_REQUEST                              = 1190, -    ERR_CURRENCY_TRANSFER_INVALID_CHARACTER                         = 1191, -    ERR_CURRENCY_TRANSFER_INVALID_CURRENCY                          = 1192, -    ERR_CURRENCY_TRANSFER_INSUFFICIENT_CURRENCY                     = 1193, -    ERR_CURRENCY_TRANSFER_MAX_QUANTITY                              = 1194, -    ERR_CURRENCY_TRANSFER_NO_VALID_SOURCE                           = 1195, -    ERR_CURRENCY_TRANSFER_CHARACTER_LOGGED_IN                       = 1196, -    ERR_CURRENCY_TRANSFER_SERVER_ERROR                              = 1197, -    ERR_CURRENCY_TRANSFER_UNMET_REQUIREMENTS                        = 1198, -    ERR_CURRENCY_TRANSFER_TRANSACTION_IN_PROGRESS                   = 1199, -    ERR_CURRENCY_TRANSFER_DISABLED                                  = 1200, +    ERR_VOTE_TO_ABANDON_ENCOUNTER                                   = 620, +    ERR_DUNGEON_DIFFICULTY_FAILED                                   = 621, +    ERR_DUNGEON_DIFFICULTY_CHANGED_S                                = 622, +    ERR_TRADE_WRONG_REALM                                           = 623, +    ERR_TRADE_NOT_ON_TAPLIST                                        = 624, +    ERR_CHAT_PLAYER_AMBIGUOUS_S                                     = 625, +    ERR_LOOT_CANT_LOOT_THAT_NOW                                     = 626, +    ERR_LOOT_MASTER_INV_FULL                                        = 627, +    ERR_LOOT_MASTER_UNIQUE_ITEM                                     = 628, +    ERR_LOOT_MASTER_OTHER                                           = 629, +    ERR_FILTERING_YOU_S                                             = 630, +    ERR_USE_PREVENTED_BY_MECHANIC_S                                 = 631, +    ERR_ITEM_UNIQUE_EQUIPPABLE                                      = 632, +    ERR_LFG_LEADER_IS_LFM_S                                         = 633, +    ERR_LFG_PENDING                                                 = 634, +    ERR_CANT_SPEAK_LANGAGE                                          = 635, +    ERR_VENDOR_MISSING_TURNINS                                      = 636, +    ERR_BATTLEGROUND_NOT_IN_TEAM                                    = 637, +    ERR_NOT_IN_BATTLEGROUND                                         = 638, +    ERR_NOT_ENOUGH_HONOR_POINTS                                     = 639, +    ERR_NOT_ENOUGH_ARENA_POINTS                                     = 640, +    ERR_SOCKETING_REQUIRES_META_GEM                                 = 641, +    ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT                         = 642, +    ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM                            = 643, +    ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT               = 644, +    ERR_SOCKETING_REQUIRES_COGWHEEL_GEM                             = 645, +    ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT                 = 646, +    ERR_SOCKETING_ITEM_TOO_LOW_LEVEL                                = 647, +    ERR_ITEM_MAX_COUNT_SOCKETED                                     = 648, +    ERR_SYSTEM_DISABLED                                             = 649, +    ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I                        = 650, +    ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED                            = 651, +    ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED                             = 652, +    ERR_USER_SQUELCHED                                              = 653, +    ERR_ACCOUNT_SILENCED                                            = 654, +    ERR_PARTY_MEMBER_SILENCED                                       = 655, +    ERR_PARTY_MEMBER_SILENCED_LFG_DELIST                            = 656, +    ERR_TOO_MUCH_GOLD                                               = 657, +    ERR_NOT_BARBER_SITTING                                          = 658, +    ERR_QUEST_FAILED_CAIS                                           = 659, +    ERR_INVITE_RESTRICTED_TRIAL                                     = 660, +    ERR_VOICE_IGNORE_FULL                                           = 661, +    ERR_VOICE_IGNORE_SELF                                           = 662, +    ERR_VOICE_IGNORE_NOT_FOUND                                      = 663, +    ERR_VOICE_IGNORE_ALREADY_S                                      = 664, +    ERR_VOICE_IGNORE_ADDED_S                                        = 665, +    ERR_VOICE_IGNORE_REMOVED_S                                      = 666, +    ERR_VOICE_IGNORE_AMBIGUOUS                                      = 667, +    ERR_VOICE_IGNORE_DELETED                                        = 668, +    ERR_UNKNOWN_MACRO_OPTION_S                                      = 669, +    ERR_NOT_DURING_ARENA_MATCH                                      = 670, +    ERR_NOT_IN_RATED_BATTLEGROUND                                   = 671, +    ERR_PLAYER_SILENCED                                             = 672, +    ERR_PLAYER_UNSILENCED                                           = 673, +    ERR_COMSAT_DISCONNECT                                           = 674, +    ERR_COMSAT_RECONNECT_ATTEMPT                                    = 675, +    ERR_COMSAT_CONNECT_FAIL                                         = 676, +    ERR_MAIL_INVALID_ATTACHMENT_SLOT                                = 677, +    ERR_MAIL_TOO_MANY_ATTACHMENTS                                   = 678, +    ERR_MAIL_INVALID_ATTACHMENT                                     = 679, +    ERR_MAIL_ATTACHMENT_EXPIRED                                     = 680, +    ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC                             = 681, +    ERR_PROFANE_CHAT_NAME                                           = 682, +    ERR_PLAYER_SILENCED_ECHO                                        = 683, +    ERR_PLAYER_UNSILENCED_ECHO                                      = 684, +    ERR_LOOT_CANT_LOOT_THAT                                         = 685, +    ERR_ARENA_EXPIRED_CAIS                                          = 686, +    ERR_GROUP_ACTION_THROTTLED                                      = 687, +    ERR_ALREADY_PICKPOCKETED                                        = 688, +    ERR_NAME_INVALID                                                = 689, +    ERR_NAME_NO_NAME                                                = 690, +    ERR_NAME_TOO_SHORT                                              = 691, +    ERR_NAME_TOO_LONG                                               = 692, +    ERR_NAME_MIXED_LANGUAGES                                        = 693, +    ERR_NAME_PROFANE                                                = 694, +    ERR_NAME_RESERVED                                               = 695, +    ERR_NAME_THREE_CONSECUTIVE                                      = 696, +    ERR_NAME_INVALID_SPACE                                          = 697, +    ERR_NAME_CONSECUTIVE_SPACES                                     = 698, +    ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS                  = 699, +    ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END           = 700, +    ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME                      = 701, +    ERR_RECRUIT_A_FRIEND_NOT_LINKED                                 = 702, +    ERR_RECRUIT_A_FRIEND_NOT_NOW                                    = 703, +    ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX                           = 704, +    ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN                            = 705, +    ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE                             = 706, +    ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL                            = 707, +    ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED          = 708, +    ERR_NOT_SAME_ACCOUNT                                            = 709, +    ERR_BAD_ON_USE_ENCHANT                                          = 710, +    ERR_TRADE_SELF                                                  = 711, +    ERR_TOO_MANY_SOCKETS                                            = 712, +    ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS                   = 713, +    ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS           = 714, +    ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS                = 715, +    ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS                = 716, +    ERR_SHAPESHIFT_FORM_CANNOT_EQUIP                                = 717, +    ERR_ITEM_INVENTORY_FULL_SATCHEL                                 = 718, +    ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED                            = 719, +    ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW                             = 720, +    ERR_PURCHASE_LEVEL_TOO_LOW                                      = 721, +    ERR_GROUP_SWAP_FAILED                                           = 722, +    ERR_INVITE_IN_COMBAT                                            = 723, +    ERR_INVALID_GLYPH_SLOT                                          = 724, +    ERR_GENERIC_NO_VALID_TARGETS                                    = 725, +    ERR_CALENDAR_EVENT_ALERT_S                                      = 726, +    ERR_PET_LEARN_SPELL_S                                           = 727, +    ERR_PET_LEARN_ABILITY_S                                         = 728, +    ERR_PET_SPELL_UNLEARNED_S                                       = 729, +    ERR_INVITE_UNKNOWN_REALM                                        = 730, +    ERR_INVITE_NO_PARTY_SERVER                                      = 731, +    ERR_INVITE_PARTY_BUSY                                           = 732, +    ERR_INVITE_PARTY_BUSY_PENDING_REQUEST                           = 733, +    ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST                           = 734, +    ERR_PARTY_TARGET_AMBIGUOUS                                      = 735, +    ERR_PARTY_LFG_INVITE_RAID_LOCKED                                = 736, +    ERR_PARTY_LFG_BOOT_LIMIT                                        = 737, +    ERR_PARTY_LFG_BOOT_COOLDOWN_S                                   = 738, +    ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S                               = 739, +    ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S                            = 740, +    ERR_PARTY_LFG_BOOT_IN_PROGRESS                                  = 741, +    ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS                              = 742, +    ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED                               = 743, +    ERR_PARTY_LFG_BOOT_VOTE_FAILED                                  = 744, +    ERR_PARTY_LFG_BOOT_DISALLOWED_BY_MAP                            = 745, +    ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE                             = 746, +    ERR_PARTY_LFG_BOOT_LOOT_ROLLS                                   = 747, +    ERR_PARTY_LFG_BOOT_VOTE_REGISTERED                              = 748, +    ERR_PARTY_PRIVATE_GROUP_ONLY                                    = 749, +    ERR_PARTY_LFG_TELEPORT_IN_COMBAT                                = 750, +    ERR_PARTY_TIME_RUNNING_SEASON_ID_MUST_MATCH                     = 751, +    ERR_RAID_DISALLOWED_BY_LEVEL                                    = 752, +    ERR_RAID_DISALLOWED_BY_CROSS_REALM                              = 753, +    ERR_PARTY_ROLE_NOT_AVAILABLE                                    = 754, +    ERR_JOIN_LFG_OBJECT_FAILED                                      = 755, +    ERR_LFG_REMOVED_LEVELUP                                         = 756, +    ERR_LFG_REMOVED_XP_TOGGLE                                       = 757, +    ERR_LFG_REMOVED_FACTION_CHANGE                                  = 758, +    ERR_BATTLEGROUND_INFO_THROTTLED                                 = 759, +    ERR_BATTLEGROUND_ALREADY_IN                                     = 760, +    ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED                             = 761, +    ERR_ARENA_TEAM_PERMISSIONS                                      = 762, +    ERR_NOT_WHILE_FALLING                                           = 763, +    ERR_NOT_WHILE_MOVING                                            = 764, +    ERR_NOT_WHILE_FATIGUED                                          = 765, +    ERR_MAX_SOCKETS                                                 = 766, +    ERR_MULTI_CAST_ACTION_TOTEM_S                                   = 767, +    ERR_BATTLEGROUND_JOIN_LEVELUP                                   = 768, +    ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN                               = 769, +    ERR_BATTLEGROUND_JOIN_XP_GAIN                                   = 770, +    ERR_BATTLEGROUND_JOIN_MERCENARY                                 = 771, +    ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS                          = 772, +    ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS                    = 773, +    ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS                            = 774, +    ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE                           = 775, +    ERR_RAID_DIFFICULTY_FAILED                                      = 776, +    ERR_RAID_DIFFICULTY_CHANGED_S                                   = 777, +    ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S                            = 778, +    ERR_RAID_LOCKOUT_CHANGED_S                                      = 779, +    ERR_RAID_CONVERTED_TO_PARTY                                     = 780, +    ERR_PARTY_CONVERTED_TO_RAID                                     = 781, +    ERR_PLAYER_DIFFICULTY_CHANGED_S                                 = 782, +    ERR_GMRESPONSE_DB_ERROR                                         = 783, +    ERR_BATTLEGROUND_JOIN_RANGE_INDEX                               = 784, +    ERR_ARENA_JOIN_RANGE_INDEX                                      = 785, +    ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE                        = 786, +    ERR_BATTLEGROUND_JOIN_FAILED                                    = 787, +    ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE                    = 788, +    ERR_BATTLEGROUND_JOIN_RESPEC                                    = 789, +    ERR_BATTLEGROUND_INVITATION_DECLINED                            = 790, +    ERR_BATTLEGROUND_INVITATION_DECLINED_BY                         = 791, +    ERR_BATTLEGROUND_JOIN_TIMED_OUT                                 = 792, +    ERR_BATTLEGROUND_DUPE_QUEUE                                     = 793, +    ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST                       = 794, +    ERR_IN_BATTLEGROUND_RESPEC                                      = 795, +    ERR_MAIL_LIMITED_DURATION_ITEM                                  = 796, +    ERR_YELL_RESTRICTED_TRIAL                                       = 797, +    ERR_CHAT_RAID_RESTRICTED_TRIAL                                  = 798, +    ERR_LFG_ROLE_CHECK_FAILED                                       = 799, +    ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT                               = 800, +    ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE                            = 801, +    ERR_LFG_READY_CHECK_FAILED                                      = 802, +    ERR_LFG_READY_CHECK_FAILED_TIMEOUT                              = 803, +    ERR_LFG_GROUP_FULL                                              = 804, +    ERR_LFG_NO_LFG_OBJECT                                           = 805, +    ERR_LFG_NO_SLOTS_PLAYER                                         = 806, +    ERR_LFG_NO_SLOTS_PARTY                                          = 807, +    ERR_LFG_NO_SPEC                                                 = 808, +    ERR_LFG_MISMATCHED_SLOTS                                        = 809, +    ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM                           = 810, +    ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS                     = 811, +    ERR_LFG_MEMBERS_NOT_PRESENT                                     = 812, +    ERR_LFG_GET_INFO_TIMEOUT                                        = 813, +    ERR_LFG_INVALID_SLOT                                            = 814, +    ERR_LFG_DESERTER_PLAYER                                         = 815, +    ERR_LFG_DESERTER_PARTY                                          = 816, +    ERR_LFG_DEAD                                                    = 817, +    ERR_LFG_RANDOM_COOLDOWN_PLAYER                                  = 818, +    ERR_LFG_RANDOM_COOLDOWN_PARTY                                   = 819, +    ERR_LFG_TOO_MANY_MEMBERS                                        = 820, +    ERR_LFG_TOO_FEW_MEMBERS                                         = 821, +    ERR_LFG_PROPOSAL_FAILED                                         = 822, +    ERR_LFG_PROPOSAL_DECLINED_SELF                                  = 823, +    ERR_LFG_PROPOSAL_DECLINED_PARTY                                 = 824, +    ERR_LFG_NO_SLOTS_SELECTED                                       = 825, +    ERR_LFG_NO_ROLES_SELECTED                                       = 826, +    ERR_LFG_ROLE_CHECK_INITIATED                                    = 827, +    ERR_LFG_READY_CHECK_INITIATED                                   = 828, +    ERR_LFG_PLAYER_DECLINED_ROLE_CHECK                              = 829, +    ERR_LFG_PLAYER_DECLINED_READY_CHECK                             = 830, +    ERR_LFG_LOREWALKING                                             = 831, +    ERR_LFG_JOINED_QUEUE                                            = 832, +    ERR_LFG_JOINED_FLEX_QUEUE                                       = 833, +    ERR_LFG_JOINED_RF_QUEUE                                         = 834, +    ERR_LFG_JOINED_SCENARIO_QUEUE                                   = 835, +    ERR_LFG_JOINED_WORLD_PVP_QUEUE                                  = 836, +    ERR_LFG_JOINED_BATTLEFIELD_QUEUE                                = 837, +    ERR_LFG_JOINED_LIST                                             = 838, +    ERR_QUEUED_PLUNDERSTORM                                         = 839, +    ERR_LFG_LEFT_QUEUE                                              = 840, +    ERR_LFG_LEFT_LIST                                               = 841, +    ERR_LFG_ROLE_CHECK_ABORTED                                      = 842, +    ERR_LFG_READY_CHECK_ABORTED                                     = 843, +    ERR_LFG_CANT_USE_BATTLEGROUND                                   = 844, +    ERR_LFG_CANT_USE_DUNGEONS                                       = 845, +    ERR_LFG_REASON_TOO_MANY_LFG                                     = 846, +    ERR_LFG_FARM_LIMIT                                              = 847, +    ERR_LFG_NO_CROSS_FACTION_PARTIES                                = 848, +    ERR_INVALID_TELEPORT_LOCATION                                   = 849, +    ERR_TOO_FAR_TO_INTERACT                                         = 850, +    ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS                  = 851, +    ERR_DIFFICULTY_CHANGE_COOLDOWN_S                                = 852, +    ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S                         = 853, +    ERR_DIFFICULTY_CHANGE_WORLDSTATE                                = 854, +    ERR_DIFFICULTY_CHANGE_ENCOUNTER                                 = 855, +    ERR_DIFFICULTY_CHANGE_COMBAT                                    = 856, +    ERR_DIFFICULTY_CHANGE_PLAYER_BUSY                               = 857, +    ERR_DIFFICULTY_CHANGE_PLAYER_ON_VEHICLE                         = 858, +    ERR_DIFFICULTY_CHANGE_ALREADY_STARTED                           = 859, +    ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S                            = 860, +    ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING           = 861, +    ERR_ARENA_TEAM_PARTY_SIZE                                       = 862, +    ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE                             = 863, +    ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP                             = 864, +    ERR_SOLO_RBG_WARGAME_GROUP_SIZE                                 = 865, +    ERR_SOLO_RBG_WARGAME_GROUP_COMP                                 = 866, +    ERR_SOLO_MIN_ITEM_LEVEL                                         = 867, +    ERR_PVP_PLAYER_ABANDONED                                        = 868, +    ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER                = 869, +    ERR_QUEST_FORCE_REMOVED_S                                       = 870, +    ERR_ATTACK_NO_ACTIONS                                           = 871, +    ERR_IN_RANDOM_BG                                                = 872, +    ERR_IN_NON_RANDOM_BG                                            = 873, +    ERR_BN_FRIEND_SELF                                              = 874, +    ERR_BN_FRIEND_ALREADY                                           = 875, +    ERR_BN_FRIEND_BLOCKED                                           = 876, +    ERR_BN_FRIEND_LIST_FULL                                         = 877, +    ERR_BN_FRIEND_REQUEST_SENT                                      = 878, +    ERR_BN_BROADCAST_THROTTLE                                       = 879, +    ERR_BG_DEVELOPER_ONLY                                           = 880, +    ERR_CURRENCY_SPELL_SLOT_MISMATCH                                = 881, +    ERR_CURRENCY_NOT_TRADABLE                                       = 882, +    ERR_REQUIRES_EXPANSION_S                                        = 883, +    ERR_QUEST_FAILED_SPELL                                          = 884, +    ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS                         = 885, +    ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE            = 886, +    ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED                      = 887, +    ERR_TALENT_FAILED_CANT_REMOVE_TALENT                            = 888, +    ERR_TALENT_FAILED_UNKNOWN                                       = 889, +    ERR_TALENT_FAILED_IN_COMBAT                                     = 890, +    ERR_TALENT_FAILED_IN_PVP_MATCH                                  = 891, +    ERR_TALENT_FAILED_IN_MYTHIC_PLUS                                = 892, +    ERR_WARGAME_REQUEST_FAILURE                                     = 893, +    ERR_RANK_REQUIRES_AUTHENTICATOR                                 = 894, +    ERR_GUILD_BANK_VOUCHER_FAILED                                   = 895, +    ERR_WARGAME_REQUEST_SENT                                        = 896, +    ERR_REQUIRES_ACHIEVEMENT_I                                      = 897, +    ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY                           = 898, +    ERR_CANT_BUY_QUANTITY                                           = 899, +    ERR_ITEM_IS_BATTLE_PAY_LOCKED                                   = 900, +    ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE                         = 901, +    ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE                         = 902, +    ERR_BATTLEFIELD_TEAM_PARTY_SIZE                                 = 903, +    ERR_INSUFF_TRACKED_CURRENCY_IS                                  = 904, +    ERR_NOT_ON_TOURNAMENT_REALM                                     = 905, +    ERR_GUILD_TRIAL_ACCOUNT_TRIAL                                   = 906, +    ERR_GUILD_TRIAL_ACCOUNT_VETERAN                                 = 907, +    ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL                              = 908, +    ERR_CANT_DO_THAT_IN_A_GROUP                                     = 909, +    ERR_GUILD_LEADER_REPLACED                                       = 910, +    ERR_TRANSMOGRIFY_CANT_EQUIP                                     = 911, +    ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE                              = 912, +    ERR_TRANSMOGRIFY_NOT_SOULBOUND                                  = 913, +    ERR_TRANSMOGRIFY_INVALID_SOURCE                                 = 914, +    ERR_TRANSMOGRIFY_INVALID_DESTINATION                            = 915, +    ERR_TRANSMOGRIFY_MISMATCH                                       = 916, +    ERR_TRANSMOGRIFY_LEGENDARY                                      = 917, +    ERR_TRANSMOGRIFY_SAME_ITEM                                      = 918, +    ERR_TRANSMOGRIFY_SAME_APPEARANCE                                = 919, +    ERR_TRANSMOGRIFY_NOT_EQUIPPED                                   = 920, +    ERR_VOID_DEPOSIT_FULL                                           = 921, +    ERR_VOID_WITHDRAW_FULL                                          = 922, +    ERR_VOID_STORAGE_WRAPPED                                        = 923, +    ERR_VOID_STORAGE_STACKABLE                                      = 924, +    ERR_VOID_STORAGE_UNBOUND                                        = 925, +    ERR_VOID_STORAGE_REPAIR                                         = 926, +    ERR_VOID_STORAGE_CHARGES                                        = 927, +    ERR_VOID_STORAGE_QUEST                                          = 928, +    ERR_VOID_STORAGE_CONJURED                                       = 929, +    ERR_VOID_STORAGE_MAIL                                           = 930, +    ERR_VOID_STORAGE_BAG                                            = 931, +    ERR_VOID_TRANSFER_STORAGE_FULL                                  = 932, +    ERR_VOID_TRANSFER_INV_FULL                                      = 933, +    ERR_VOID_TRANSFER_INTERNAL_ERROR                                = 934, +    ERR_VOID_TRANSFER_ITEM_INVALID                                  = 935, +    ERR_DIFFICULTY_DISABLED_IN_LFG                                  = 936, +    ERR_VOID_STORAGE_UNIQUE                                         = 937, +    ERR_VOID_STORAGE_LOOT                                           = 938, +    ERR_VOID_STORAGE_HOLIDAY                                        = 939, +    ERR_VOID_STORAGE_DURATION                                       = 940, +    ERR_VOID_STORAGE_LOAD_FAILED                                    = 941, +    ERR_VOID_STORAGE_INVALID_ITEM                                   = 942, +    ERR_VOID_STORAGE_ACCOUNT_ITEM                                   = 943, +    ERR_PARENTAL_CONTROLS_CHAT_MUTED                                = 944, +    ERR_SOR_START_EXPERIENCE_INCOMPLETE                             = 945, +    ERR_SOR_INVALID_EMAIL                                           = 946, +    ERR_SOR_INVALID_COMMENT                                         = 947, +    ERR_CHALLENGE_MODE_RESET_COOLDOWN_S                             = 948, +    ERR_CHALLENGE_MODE_RESET_KEYSTONE                               = 949, +    ERR_PET_JOURNAL_ALREADY_IN_LOADOUT                              = 950, +    ERR_REPORT_SUBMITTED_SUCCESSFULLY                               = 951, +    ERR_REPORT_SUBMISSION_FAILED                                    = 952, +    ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY                           = 953, +    ERR_BUG_SUBMITTED_SUCCESSFULLY                                  = 954, +    ERR_CHALLENGE_MODE_ENABLED                                      = 955, +    ERR_CHALLENGE_MODE_DISABLED                                     = 956, +    ERR_PETBATTLE_CREATE_FAILED                                     = 957, +    ERR_PETBATTLE_NOT_HERE                                          = 958, +    ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT                             = 959, +    ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND                            = 960, +    ERR_PETBATTLE_NOT_HERE_OBSTRUCTED                               = 961, +    ERR_PETBATTLE_NOT_WHILE_IN_COMBAT                               = 962, +    ERR_PETBATTLE_NOT_WHILE_DEAD                                    = 963, +    ERR_PETBATTLE_NOT_WHILE_FLYING                                  = 964, +    ERR_PETBATTLE_TARGET_INVALID                                    = 965, +    ERR_PETBATTLE_TARGET_OUT_OF_RANGE                               = 966, +    ERR_PETBATTLE_TARGET_NOT_CAPTURABLE                             = 967, +    ERR_PETBATTLE_NOT_A_TRAINER                                     = 968, +    ERR_PETBATTLE_DECLINED                                          = 969, +    ERR_PETBATTLE_IN_BATTLE                                         = 970, +    ERR_PETBATTLE_INVALID_LOADOUT                                   = 971, +    ERR_PETBATTLE_ALL_PETS_DEAD                                     = 972, +    ERR_PETBATTLE_NO_PETS_IN_SLOTS                                  = 973, +    ERR_PETBATTLE_NO_ACCOUNT_LOCK                                   = 974, +    ERR_PETBATTLE_WILD_PET_TAPPED                                   = 975, +    ERR_PETBATTLE_RESTRICTED_ACCOUNT                                = 976, +    ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE                            = 977, +    ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE                       = 978, +    ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE                            = 979, +    ERR_CANT_HAVE_MORE_PETS                                         = 980, +    ERR_PVP_MAP_NOT_FOUND                                           = 981, +    ERR_PVP_MAP_NOT_SET                                             = 982, +    ERR_PETBATTLE_QUEUE_QUEUED                                      = 983, +    ERR_PETBATTLE_QUEUE_ALREADY_QUEUED                              = 984, +    ERR_PETBATTLE_QUEUE_JOIN_FAILED                                 = 985, +    ERR_PETBATTLE_QUEUE_JOURNAL_LOCK                                = 986, +    ERR_PETBATTLE_QUEUE_REMOVED                                     = 987, +    ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED                           = 988, +    ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT                            = 989, +    ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED                           = 990, +    ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL                           = 991, +    ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED                            = 992, +    ERR_PETBATTLE_QUEUE_SLOT_LOCKED                                 = 993, +    ERR_PETBATTLE_QUEUE_SLOT_EMPTY                                  = 994, +    ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER                             = 995, +    ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES                             = 996, +    ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE                            = 997, +    ERR_PETBATTLE_QUEUE_SLOT_REVOKED                                = 998, +    ERR_PETBATTLE_QUEUE_SLOT_DEAD                                   = 999, +    ERR_PETBATTLE_QUEUE_SLOT_NO_PET                                 = 1000, +    ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL                           = 1001, +    ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING                           = 1002, +    ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING                         = 1003, +    ERR_HAS_RESTRICTION                                             = 1004, +    ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL                             = 1005, +    ERR_ITEM_UPGRADE_NO_PATH                                        = 1006, +    ERR_ITEM_UPGRADE_NO_MORE_UPGRADES                               = 1007, +    ERR_BONUS_ROLL_EMPTY                                            = 1008, +    ERR_CHALLENGE_MODE_FULL                                         = 1009, +    ERR_CHALLENGE_MODE_IN_PROGRESS                                  = 1010, +    ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE                           = 1011, +    ERR_START_RESTRICTED_CHALLENGE_MODE                             = 1012, +    ERR_BATTLETAG_FRIEND_NOT_FOUND                                  = 1013, +    ERR_BATTLETAG_FRIEND_NOT_VALID                                  = 1014, +    ERR_BATTLETAG_FRIEND_NOT_ALLOWED                                = 1015, +    ERR_BATTLETAG_FRIEND_THROTTLED                                  = 1016, +    ERR_BATTLETAG_FRIEND_SUCCESS                                    = 1017, +    ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE                                = 1018, +    ERR_PETBATTLE_INTERNAL                                          = 1019, +    ERR_CANT_CAGE_PET_YET                                           = 1020, +    ERR_NO_LOOT_IN_CHALLENGE_MODE                                   = 1021, +    ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II                           = 1022, +    ERR_ROLE_CHECK_ALREADY_IN_PROGRESS                              = 1023, +    ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT                              = 1024, +    ERR_RECRUIT_A_FRIEND_FAILED                                     = 1025, +    ERR_SET_LOOT_PERSONAL                                           = 1026, +    ERR_SET_LOOT_METHOD_FAILED_COMBAT                               = 1027, +    ERR_REAGENT_BANK_FULL                                           = 1028, +    ERR_REAGENT_BANK_LOCKED                                         = 1029, +    ERR_GARRISON_BUILDING_EXISTS                                    = 1030, +    ERR_GARRISON_INVALID_PLOT                                       = 1031, +    ERR_GARRISON_INVALID_BUILDINGID                                 = 1032, +    ERR_GARRISON_INVALID_PLOT_BUILDING                              = 1033, +    ERR_GARRISON_REQUIRES_BLUEPRINT                                 = 1034, +    ERR_GARRISON_NOT_ENOUGH_CURRENCY                                = 1035, +    ERR_GARRISON_NOT_ENOUGH_GOLD                                    = 1036, +    ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE               = 1037, +    ERR_ALREADY_USING_LFG_LIST                                      = 1038, +    ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL                           = 1039, +    ERR_TOY_USE_LIMIT_REACHED                                       = 1040, +    ERR_TOY_ALREADY_KNOWN                                           = 1041, +    ERR_TRANSMOG_SET_ALREADY_KNOWN                                  = 1042, +    ERR_NOT_ENOUGH_CURRENCY                                         = 1043, +    ERR_SPEC_IS_DISABLED                                            = 1044, +    ERR_FEATURE_RESTRICTED_TRIAL                                    = 1045, +    ERR_CANT_BE_OBLITERATED                                         = 1046, +    ERR_CANT_BE_SCRAPPED                                            = 1047, +    ERR_CANT_BE_RECRAFTED                                           = 1048, +    ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT                      = 1049, +    ERR_MUST_EQUIP_ARTIFACT                                         = 1050, +    ERR_CANT_DO_THAT_RIGHT_NOW                                      = 1051, +    ERR_AFFECTING_COMBAT                                            = 1052, +    ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S                             = 1053, +    ERR_EQUIPMENT_MANAGER_BAGS_FULL                                 = 1054, +    ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S                            = 1055, +    ERR_MOVIE_RECORDING_WARNING_PERF                                = 1056, +    ERR_MOVIE_RECORDING_WARNING_DISK_FULL                           = 1057, +    ERR_MOVIE_RECORDING_WARNING_NO_MOVIE                            = 1058, +    ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS                        = 1059, +    ERR_MOVIE_RECORDING_WARNING_COMPRESSING                         = 1060, +    ERR_NO_CHALLENGE_MODE_REWARD                                    = 1061, +    ERR_CLAIMED_CHALLENGE_MODE_REWARD                               = 1062, +    ERR_CHALLENGE_MODE_PERIOD_RESET_SS                              = 1063, +    ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE                          = 1064, +    ERR_TALENT_FAILED_REST_AREA                                     = 1065, +    ERR_CANNOT_ABANDON_LAST_PET                                     = 1066, +    ERR_TEST_CVAR_SET_SSS                                           = 1067, +    ERR_QUEST_TURN_IN_FAIL_REASON                                   = 1068, +    ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD                           = 1069, +    ERR_TALENT_GRANTED_BY_AURA                                      = 1070, +    ERR_CHALLENGE_MODE_ALREADY_COMPLETE                             = 1071, +    ERR_GLYPH_TARGET_NOT_AVAILABLE                                  = 1072, +    ERR_PVP_WARMODE_TOGGLE_ON                                       = 1073, +    ERR_PVP_WARMODE_TOGGLE_OFF                                      = 1074, +    ERR_SPELL_FAILED_LEVEL_REQUIREMENT                              = 1075, +    ERR_SPELL_FAILED_CANT_FLY_HERE                                  = 1076, +    ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL                            = 1077, +    ERR_BATTLEGROUND_JOIN_DISQUALIFIED                              = 1078, +    ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME                      = 1079, +    ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT                        = 1080, +    ERR_VOICE_CHAT_SERVICE_LOST                                     = 1081, +    ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT                           = 1082, +    ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG                            = 1083, +    ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS                           = 1084, +    ERR_VOICE_CHAT_TARGET_NOT_FOUND                                 = 1085, +    ERR_VOICE_CHAT_TOO_MANY_REQUESTS                                = 1086, +    ERR_VOICE_CHAT_PLAYER_SILENCED                                  = 1087, +    ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL                             = 1088, +    ERR_VOICE_CHAT_DISABLED                                         = 1089, +    ERR_NO_PVP_REWARD                                               = 1090, +    ERR_CLAIMED_PVP_REWARD                                          = 1091, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED       = 1092, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE        = 1093, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED           = 1094, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA                  = 1095, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED                = 1096, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE               = 1097, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW        = 1098, +    ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED               = 1099, +    ERR_SOCKETING_GENERIC_FAILURE                                   = 1100, +    ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM                         = 1101, +    ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT         = 1102, +    ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM                      = 1103, +    ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT   = 1104, +    ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM                        = 1105, +    ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT       = 1106, +    ERR_SOCKETING_REQUIRES_DOMINATION_SHARD                         = 1107, +    ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT           = 1108, +    ERR_SOCKETING_REQUIRES_CYPHER_GEM                               = 1109, +    ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT                     = 1110, +    ERR_SOCKETING_REQUIRES_TINKER_GEM                               = 1111, +    ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT                     = 1112, +    ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM                           = 1113, +    ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT             = 1114, +    ERR_SOCKETING_REQUIRES_FRAGRANCE_GEM                            = 1115, +    ERR_SOCKETING_FRAGRANCE_GEM_ONLY_IN_FRAGRANCESLOT               = 1116, +    ERR_SOCKETING_REQUIRES_SINGING_THUNDER_GEM                      = 1117, +    ERR_SOCKETING_SINGINGTHUNDER_GEM_ONLY_IN_SINGINGTHUNDERSLOT     = 1118, +    ERR_SOCKETING_REQUIRES_SINGING_SEA_GEM                          = 1119, +    ERR_SOCKETING_SINGINGSEA_GEM_ONLY_IN_SINGINGSEASLOT             = 1120, +    ERR_SOCKETING_REQUIRES_SINGING_WIND_GEM                         = 1121, +    ERR_SOCKETING_SINGINGWIND_GEM_ONLY_IN_SINGINGWINDSLOT           = 1122, +    ERR_SOCKETING_REQUIRES_FIBER_GEM                                = 1123, +    ERR_SOCKETING_FIBER_GEM_ONLY_IN_FIBERSLOT                       = 1124, +    ERR_LEVEL_LINKING_RESULT_LINKED                                 = 1125, +    ERR_LEVEL_LINKING_RESULT_UNLINKED                               = 1126, +    ERR_CLUB_FINDER_ERROR_POST_CLUB                                 = 1127, +    ERR_CLUB_FINDER_ERROR_APPLY_CLUB                                = 1128, +    ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT                         = 1129, +    ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION                        = 1130, +    ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION                   = 1131, +    ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS                = 1132, +    ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS               = 1133, +    ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST                       = 1134, +    ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM               = 1135, +    ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE                 = 1136, +    ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS                      = 1137, +    ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION                     = 1138, +    ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE                   = 1139, +    ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME                       = 1140, +    ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE           = 1141, +    ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD                            = 1142, +    ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY                        = 1143, +    ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT                       = 1144, +    ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE                          = 1145, +    ERR_SOULBIND_INVALID_CONDUIT                                    = 1146, +    ERR_SOULBIND_INVALID_CONDUIT_ITEM                               = 1147, +    ERR_SOULBIND_INVALID_TALENT                                     = 1148, +    ERR_SOULBIND_DUPLICATE_CONDUIT                                  = 1149, +    ERR_ACTIVATE_SOULBIND_S                                         = 1150, +    ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA                          = 1151, +    ERR_CANT_USE_PROFANITY                                          = 1152, +    ERR_NOT_IN_PET_BATTLE                                           = 1153, +    ERR_NOT_IN_NPE                                                  = 1154, +    ERR_NO_SPEC                                                     = 1155, +    ERR_NO_DOMINATIONSHARD_OVERWRITE                                = 1156, +    ERR_USE_WEEKLY_REWARDS_DISABLED                                 = 1157, +    ERR_CROSS_FACTION_GROUP_JOINED                                  = 1158, +    ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD                         = 1159, +    ERR_EQUIPABLESPELLS_SLOTS_FULL                                  = 1160, +    ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN                     = 1161, +    ERR_CANT_BULK_SELL_ITEM_WITH_REFUND                             = 1162, +    ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK                           = 1163, +    ERR_NO_REFUNDABLE_ITEM_IN_ACCOUNT_BANK                          = 1164, +    ERR_CANT_DELETE_IN_ACCOUNT_BANK                                 = 1165, +    ERR_NO_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK                      = 1166, +    ERR_NO_OPEN_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK                 = 1167, +    ERR_CANT_TRADE_ACCOUNT_ITEM                                     = 1168, +    ERR_NO_ACCOUNT_INVENTORY_LOCK                                   = 1169, +    ERR_BANK_NOT_ACCESSIBLE                                         = 1170, +    ERR_TOO_MANY_ACCOUNT_BANK_TABS                                  = 1171, +    ERR_BANK_TAB_NOT_UNLOCKED                                       = 1172, +    ERR_ACCOUNT_MONEY_LOCKED                                        = 1173, +    ERR_BANK_TAB_INVALID_NAME                                       = 1174, +    ERR_BANK_TAB_INVALID_TEXT                                       = 1175, +    ERR_CHARACTER_BANK_NOT_CONVERTED                                = 1176, +    ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL                     = 1177, +    ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT                   = 1178, +    ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED            = 1179, +    ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID              = 1180, +    ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED          = 1181, +    ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED          = 1182, +    ERR_WOW_LABS_SET_WOW_LABS_AREA_ID_FAILED                        = 1183, +    ERR_PLUNDERSTORM_CANNOT_QUEUE                                   = 1184, +    ERR_TARGET_IS_SELF_FOUND_CANNOT_TRADE                           = 1185, +    ERR_PLAYER_IS_SELF_FOUND_CANNOT_TRADE                           = 1186, +    ERR_MAIL_RECEPIENT_IS_SELF_FOUND_CANNOT_RECEIVE_MAIL            = 1187, +    ERR_PLAYER_IS_SELF_FOUND_CANNOT_SEND_MAIL                       = 1188, +    ERR_PLAYER_IS_SELF_FOUND_CANNOT_USE_AUCTION_HOUSE               = 1189, +    ERR_MAIL_TARGET_CANNOT_RECEIVE_MAIL                             = 1190, +    ERR_REMIX_INVALID_TRANSFER_REQUEST                              = 1191, +    ERR_CURRENCY_TRANSFER_INVALID_CHARACTER                         = 1192, +    ERR_CURRENCY_TRANSFER_INVALID_CURRENCY                          = 1193, +    ERR_CURRENCY_TRANSFER_INSUFFICIENT_CURRENCY                     = 1194, +    ERR_CURRENCY_TRANSFER_MAX_QUANTITY                              = 1195, +    ERR_CURRENCY_TRANSFER_NO_VALID_SOURCE                           = 1196, +    ERR_CURRENCY_TRANSFER_CHARACTER_LOGGED_IN                       = 1197, +    ERR_CURRENCY_TRANSFER_SERVER_ERROR                              = 1198, +    ERR_CURRENCY_TRANSFER_UNMET_REQUIREMENTS                        = 1199, +    ERR_CURRENCY_TRANSFER_TRANSACTION_IN_PROGRESS                   = 1200, +    ERR_CURRENCY_TRANSFER_DISABLED                                  = 1201, +    ERR_RECENT_ALLY_PIN_SERVER_ERROR                                = 1202,  };  enum class MountResult : uint32 diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp index de56c390a6c..c5c0a71a413 100644 --- a/src/server/game/Server/Packets/CalendarPackets.cpp +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -332,7 +332,7 @@ WorldPacket const* CalendarInviteStatus::Write()      _worldPacket << InviteGuid;      _worldPacket << uint64(EventID);      _worldPacket << Date; -    _worldPacket << uint32(Flags); +    _worldPacket << uint16(Flags);      _worldPacket << uint8(Status);      _worldPacket << ResponseTime;      _worldPacket << Bits<1>(ClearPending); @@ -345,7 +345,7 @@ WorldPacket const* CalendarInviteRemoved::Write()  {      _worldPacket << InviteGuid;      _worldPacket << uint64(EventID); -    _worldPacket << uint32(Flags); +    _worldPacket << uint16(Flags);      _worldPacket << Bits<1>(ClearPending);      _worldPacket.FlushBits(); @@ -367,7 +367,7 @@ WorldPacket const* CalendarInviteRemovedAlert::Write()  {      _worldPacket << uint64(EventID);      _worldPacket << Date; -    _worldPacket << uint32(Flags); +    _worldPacket << uint16(Flags);      _worldPacket << uint8(Status);      return &_worldPacket; @@ -472,7 +472,7 @@ WorldPacket const* CalendarInviteStatusAlert::Write()  {      _worldPacket << uint64(EventID);      _worldPacket << Date; -    _worldPacket << uint32(Flags); +    _worldPacket << uint16(Flags);      _worldPacket << uint8(Status);      return &_worldPacket; diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h index f2457e803eb..ba1f63f97b0 100644 --- a/src/server/game/Server/Packets/CalendarPackets.h +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -293,7 +293,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint32 Flags = 0; +            uint16 Flags = 0;              uint64 EventID = 0;              uint8 Status = 0;              bool ClearPending = false; @@ -311,7 +311,7 @@ namespace WorldPackets              ObjectGuid InviteGuid;              uint64 EventID = 0; -            uint32 Flags = 0; +            uint16 Flags = 0;              bool ClearPending = false;          }; @@ -337,7 +337,7 @@ namespace WorldPackets              uint64 EventID = 0;              WowTime Date; -            uint32 Flags = 0; +            uint16 Flags = 0;              uint8 Status = 0;          }; @@ -543,7 +543,7 @@ namespace WorldPackets              WorldPacket const* Write() override;              uint64 EventID = 0; -            uint32 Flags = 0; +            uint16 Flags = 0;              WowTime Date;              uint8 Status = 0;          }; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 88a897400aa..dafa4fbe1d6 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -86,11 +86,11 @@ EnumCharactersResult::CharacterInfoBasic::CharacterInfoBasic(Field const* 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 -    // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, " -    //  23                                    24                                    25                                    26                                    27 +    //  18                     19               20                     21                      22                            23 +    // "character_banned.guid, characters.slot, characters.createTime, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, " +    //  24                                    25                                    26                                    27                                    28      // "characters.personalTabardEmblemStyle, characters.personalTabardEmblemColor, characters.personalTabardBorderStyle, characters.personalTabardBorderColor, characters.personalTabardBackgroundColor " -    //  28 +    //  29      // "character_declinedname.genitive"      Guid              = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); @@ -129,7 +129,7 @@ EnumCharactersResult::CharacterInfoBasic::CharacterInfoBasic(Field const* fields      if (fields[18].GetUInt64())          Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; -    if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[28].GetStringView().empty()) +    if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[29].GetStringView().empty())          Flags |= CHARACTER_FLAG_DECLINED;      if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -172,17 +172,18 @@ EnumCharactersResult::CharacterInfoBasic::CharacterInfoBasic(Field const* fields      std::vector<std::string_view> equipment = Trinity::Tokenize(fields[17].GetStringView(), ' ', false);      ListPosition = fields[19].GetUInt8(); -    LastActiveTime = fields[20].GetInt64(); -    if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(ClassID, fields[21].GetUInt8())) +    CreateTime = fields[20].GetInt64(); +    LastActiveTime = fields[21].GetInt64(); +    if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(ClassID, fields[22].GetUInt8()))          SpecID = spec->ID; -    LastLoginVersion = fields[22].GetUInt32(); +    LastLoginVersion = fields[23].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(); +    PersonalTabard.EmblemStyle = fields[24].GetInt32(); +    PersonalTabard.EmblemColor = fields[25].GetInt32(); +    PersonalTabard.BorderStyle = fields[26].GetInt32(); +    PersonalTabard.BorderColor = fields[27].GetInt32(); +    PersonalTabard.BackgroundColor = fields[28].GetInt32();      constexpr std::size_t equipmentFieldsPerSlot = 5; @@ -240,6 +241,7 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfoBasi          data << visualItem;      data << int32(charInfo.SaveVersion); +    data << charInfo.CreateTime;      data << charInfo.LastActiveTime;      data << int32(charInfo.LastLoginVersion);      data << charInfo.PersonalTabard; @@ -467,7 +469,7 @@ void CreateCharacter::Read()  WorldPacket const* CreateChar::Write()  { -    _worldPacket << uint8(Code); +    _worldPacket << uint32(Code);      _worldPacket << Guid;      return &_worldPacket; @@ -480,7 +482,7 @@ void CharDelete::Read()  WorldPacket const* DeleteChar::Write()  { -    _worldPacket << uint8(Code); +    _worldPacket << uint32(Code);      return &_worldPacket;  } @@ -497,7 +499,7 @@ void CharacterRenameRequest::Read()  WorldPacket const* CharacterRenameResult::Write()  { -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      _worldPacket << OptionalInit(Guid);      _worldPacket << SizedString::BitsSize<6>(Name);      _worldPacket.FlushBits(); @@ -546,7 +548,7 @@ void CharRaceOrFactionChange::Read()  WorldPacket const* CharFactionChangeResult::Write()  { -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      _worldPacket << Guid;      _worldPacket << OptionalInit(Display);      _worldPacket.FlushBits(); @@ -833,7 +835,7 @@ WorldPacket const* CharCustomizeSuccess::Write()  WorldPacket const* CharCustomizeFailure::Write()  { -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      _worldPacket << CharGUID;      return &_worldPacket; diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 5a78c17d976..ba3092fd655 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -167,6 +167,7 @@ namespace WorldPackets                  uint32 Flags4            = 0; ///< Character flags 4 @todo research                  bool FirstLogin      = false;                  uint8 CantLoginReason    = 0; +                Timestamp<> CreateTime;                  Timestamp<> LastActiveTime;                  uint16 SpecID            = 0;                  uint32 SaveVersion       = 0; @@ -336,7 +337,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint8 Code = 0; ///< Result code @see enum ResponseCodes +            uint32 Code = 0; ///< Result code @see enum ResponseCodes              ObjectGuid Guid;          }; @@ -357,7 +358,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint8 Code = 0; ///< Result code @see enum ResponseCodes +            uint32 Code = 0; ///< Result code @see enum ResponseCodes          };          class CharacterRenameRequest final : public ClientPacket @@ -382,7 +383,7 @@ namespace WorldPackets              WorldPacket const* Write() override;              std::string Name; -            uint8 Result = 0; +            uint32 Result = 0;              Optional<ObjectGuid> Guid;          }; @@ -445,7 +446,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint8 Result = 0; ///< @see enum ResponseCodes +            uint32 Result = 0; ///< @see enum ResponseCodes              ObjectGuid Guid;              Optional<CharFactionChangeDisplayInfo> Display;          }; @@ -847,7 +848,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint8 Result = 0; +            uint32 Result = 0;              ObjectGuid CharGUID;          }; diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 8135eb6d5c1..ad2c672891e 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -52,6 +52,7 @@ WorldPacket const* SpellNonMeleeDamageLog::Write()      *this << int32(Absorbed);      *this << int32(Resisted);      *this << int32(ShieldBlock); +    *this << int32(Flags);      *this << Size<uint32>(WorldTextViewers);      *this << Size<uint32>(Supporters); @@ -59,7 +60,6 @@ WorldPacket const* SpellNonMeleeDamageLog::Write()          *this << supportInfo;      *this << Bits<1>(Periodic); -    *this << Bits<7>(Flags);      *this << Bits<1>(false); // Debug info      WriteLogDataBit();      *this << OptionalInit(ContentTuning); diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index e3701a7d09e..881a4db5507 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -89,12 +89,12 @@ ByteBuffer& operator<<(ByteBuffer& data, GuildRosterMemberData const& rosterMemb      data << uint8(rosterMemberData.Gender);      data << uint64(rosterMemberData.GuildClubMemberID);      data << uint8(rosterMemberData.RaceID); +    data << int32(rosterMemberData.TimerunningSeasonID);      data << SizedString::BitsSize<6>(rosterMemberData.Name);      data << SizedString::BitsSize<8>(rosterMemberData.Note);      data << SizedString::BitsSize<8>(rosterMemberData.OfficerNote);      data << Bits<1>(rosterMemberData.Authenticated); -    data << Bits<1>(rosterMemberData.SorEligible);      data.FlushBits();      data << rosterMemberData.DungeonScore; @@ -861,7 +861,7 @@ ByteBuffer& operator<<(ByteBuffer& data, GuildNewsEvent const& newsEvent)  {      data << int32(newsEvent.Id);      data << newsEvent.CompletedDate; -    data << int32(newsEvent.Type); +    data << int8(newsEvent.Type);      data << int32(newsEvent.Flags);      for (std::size_t i = 0; i < newsEvent.Data.size(); ++i) @@ -870,7 +870,7 @@ ByteBuffer& operator<<(ByteBuffer& data, GuildNewsEvent const& newsEvent)      data << newsEvent.MemberGuid;      data << Size<uint32>(newsEvent.MemberList); -    for (ObjectGuid memberGuid : newsEvent.MemberList) +    for (ObjectGuid const& memberGuid : newsEvent.MemberList)          data << memberGuid;      data << OptionalInit(newsEvent.Item); diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 566830dfa7c..186a29805e8 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -105,18 +105,18 @@ namespace WorldPackets              int32 GuildReputation = 0;              int32 GuildRepToCap = 0;              float LastSave = 0.0f; -            std::string Name; +            std::string_view Name;              uint32 VirtualRealmAddress = 0; -            std::string Note; -            std::string OfficerNote; +            std::string_view Note; +            std::string_view OfficerNote;              uint8 Status = 0;              uint8 Level = 0;              uint8 ClassID = 0;              uint8 Gender = 0;              uint64 GuildClubMemberID = 0;              uint8 RaceID = 0; +            int32 TimerunningSeasonID = 0;              bool Authenticated = false; -            bool SorEligible = false;              GuildRosterProfessionData Profession[2];              MythicPlus::DungeonScoreSummary DungeonScore;          }; @@ -1069,7 +1069,7 @@ namespace WorldPackets          {              int32 Id = 0;              WowTime CompletedDate; -            int32 Type = 0; +            int8 Type = 0;              int32 Flags = 0;              std::array<int32, 2> Data = { };              ObjectGuid MemberGuid; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 0dcf8eacb17..26b2b6c2d04 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -107,7 +107,7 @@ void ItemPurchaseRefund::Read()  WorldPacket const* ItemPurchaseRefundResult::Write()  {      _worldPacket << ItemGUID; -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      _worldPacket << OptionalInit(Contents);      _worldPacket.FlushBits();      if (Contents) diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index b783d6cc5a9..2375360cea7 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -145,7 +145,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint8 Result = 0; +            uint32 Result = 0;              ObjectGuid ItemGUID;              Optional<ItemPurchaseContents> Contents;          }; diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index b26ae5e1a53..de1a0d3e2ce 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -204,7 +204,7 @@ WorldPacket const* LFGUpdateStatus::Write()  {      _worldPacket << Ticket;      _worldPacket << uint8(SubType); -    _worldPacket << uint8(Reason); +    _worldPacket << uint32(Reason);      _worldPacket << Size<uint32>(Slots);      _worldPacket << uint8(RequestedRoles);      _worldPacket << Size<uint32>(SuspendedPlayers); diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index 438dcb32a9b..71ae7753269 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -224,7 +224,7 @@ namespace WorldPackets              RideTicket Ticket;              uint8 SubType = 0; -            uint8 Reason = 0; +            uint32 Reason = 0;              std::vector<uint32> Slots;              uint8 RequestedRoles = 0;              std::vector<ObjectGuid> SuspendedPlayers; diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index 4764e9e240a..12ce2572dc0 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -293,7 +293,7 @@ WorldPacket const* MailQueryNextTimeResult::Write()          _worldPacket << entry.SenderGuid;          _worldPacket << float(entry.TimeLeft);          _worldPacket << int32(entry.AltSenderID); -        _worldPacket << int8(entry.AltSenderType); +        _worldPacket << int32(entry.AltSenderType);          _worldPacket << int32(entry.StationeryID);      } diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index 40ae9cd8224..fd25fcd2311 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -214,7 +214,7 @@ namespace WorldPackets                  ObjectGuid SenderGuid;                  float TimeLeft = 0.0f;                  int32 AltSenderID = 0; -                int8 AltSenderType = 0; +                int32 AltSenderType = 0;                  int32 StationeryID = 0;              }; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 99048b68644..b3a3ea8487d 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -121,6 +121,7 @@ WorldPacket const* SetupCurrency::Write()      {          _worldPacket << int32(data.Type);          _worldPacket << int32(data.Quantity); +        _worldPacket << uint8(data.Flags);          _worldPacket << OptionalInit(data.WeeklyQuantity);          _worldPacket << OptionalInit(data.MaxWeeklyQuantity); @@ -129,7 +130,6 @@ WorldPacket const* SetupCurrency::Write()          _worldPacket << OptionalInit(data.TotalEarned);          _worldPacket << OptionalInit(data.NextRechargeTime);          _worldPacket << OptionalInit(data.RechargeCycleStartTime); -        _worldPacket << Bits<5>(data.Flags);          _worldPacket.FlushBits();          if (data.WeeklyQuantity) diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 629544a68de..07ff6f59274 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -340,27 +340,13 @@ ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineUnknown901 const& unk)  ByteBuffer& operator<<(ByteBuffer& data, MovementSpline const& movementSpline)  {      data << uint32(movementSpline.Flags); +    data << uint8(movementSpline.Face);      data << int32(movementSpline.Elapsed);      data << uint32(movementSpline.MoveTime);      data << uint32(movementSpline.FadeObjectTime);      data << uint8(movementSpline.Mode);      data << movementSpline.TransportGUID;      data << int8(movementSpline.VehicleSeat); -    data << Bits<2>(movementSpline.Face); -    data << BitsSize<16>(movementSpline.Points); -    data << Bits<1>(movementSpline.VehicleExitVoluntary); -    data << Bits<1>(movementSpline.TaxiSmoothing); -    data << BitsSize<16>(movementSpline.PackedDeltas); -    data << OptionalInit(movementSpline.SplineFilter); -    data << OptionalInit(movementSpline.SpellEffectExtraData); -    data << OptionalInit(movementSpline.JumpExtraData); -    data << OptionalInit(movementSpline.TurnData); -    data << OptionalInit(movementSpline.AnimTierTransition); -    data << OptionalInit(movementSpline.Unknown901); -    data.FlushBits(); - -    if (movementSpline.SplineFilter) -        data << *movementSpline.SplineFilter;      switch (movementSpline.Face)      { @@ -376,6 +362,21 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementSpline const& movementSpline)              break;      } +    data << BitsSize<16>(movementSpline.Points); +    data << Bits<1>(movementSpline.VehicleExitVoluntary); +    data << Bits<1>(movementSpline.TaxiSmoothing); +    data << BitsSize<16>(movementSpline.PackedDeltas); +    data << OptionalInit(movementSpline.SplineFilter); +    data << OptionalInit(movementSpline.SpellEffectExtraData); +    data << OptionalInit(movementSpline.JumpExtraData); +    data << OptionalInit(movementSpline.TurnData); +    data << OptionalInit(movementSpline.AnimTierTransition); +    data << OptionalInit(movementSpline.Unknown901); +    data.FlushBits(); + +    if (movementSpline.SplineFilter) +        data << *movementSpline.SplineFilter; +      for (TaggedPosition<Position::XYZ> const& pos : movementSpline.Points)          data << pos; diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index b05a44c5864..643048900b6 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -42,8 +42,8 @@ ByteBuffer& operator<<(ByteBuffer& data, TreasureLootList const& treasureLootLis  ByteBuffer& operator<<(ByteBuffer& data, ClientGossipOptions const& gossipOption)  {      data << int32(gossipOption.GossipOptionID); +    data << int32(gossipOption.OptionFlags);      data << uint8(gossipOption.OptionNPC); -    data << int8(gossipOption.OptionFlags);      data << uint64(gossipOption.OptionCost);      data << uint32(gossipOption.OptionLanguage);      data << int32(gossipOption.Flags); @@ -167,7 +167,7 @@ WorldPacket const* VendorInventory::Write()  WorldPacket const* TrainerList::Write()  {      _worldPacket << TrainerGUID; -    _worldPacket << uint32(TrainerType); +    _worldPacket << int8(TrainerType);      _worldPacket << uint32(TrainerID);      _worldPacket << Size<uint32>(Spells); diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 9209613338b..ae2e8d9d440 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -79,7 +79,7 @@ namespace WorldPackets          {              int32 GossipOptionID  = 0;              GossipOptionNpc OptionNPC = {}; -            uint8 OptionFlags   = 0; +            int32 OptionFlags = 0;              uint64 OptionCost    = 0;              uint32 OptionLanguage = 0;              GossipOptionFlags Flags = {}; @@ -90,7 +90,7 @@ namespace WorldPackets              TreasureLootList Treasure;              Optional<int32> SpellID;              Optional<int32> OverrideIconID; -            std::string FailureDescription; +            std::string_view FailureDescription;          };          struct ClientGossipText @@ -103,7 +103,7 @@ namespace WorldPackets              bool ResetByScheduler = false;              bool Important = false;              bool Meta = false; -            std::string QuestTitle; +            std::string_view QuestTitle;              std::array<int32, 4> QuestFlags = { };          }; @@ -207,7 +207,7 @@ namespace WorldPackets              WorldPacket const* Write() override;              ObjectGuid TrainerGUID; -            int32 TrainerType   = 0; +            int8 TrainerType   = 0;              int32 TrainerID     = 1;              std::vector<TrainerListSpell> Spells;              std::string Greeting; @@ -226,7 +226,7 @@ namespace WorldPackets              int32 Icon          = 0;              int32 Importance    = 0;              int32 WMOGroupID    = 0; -            std::string Name; +            std::string_view Name;          };          class SpiritHealerActivate final : public ClientPacket diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 1c329d41239..42893d3e350 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -213,7 +213,7 @@ ByteBuffer& operator<<(ByteBuffer& data, PartyMemberStats const& memberStats)      for (uint32 i = 0; i < 2; i++)          data << uint8(memberStats.PartyType[i]); -    data << uint16(memberStats.Status); +    data << uint32(memberStats.Status);      data << uint8(memberStats.PowerType);      data << uint16(memberStats.PowerDisplayID);      data << int32(memberStats.CurrentHealth); @@ -503,6 +503,7 @@ ByteBuffer& operator<<(ByteBuffer& data, ChallengeModeData const& challengeMode)      data << int64(challengeMode.Unknown_1120_4);      data << challengeMode.KeystoneOwnerGUID;      data << challengeMode.LeaverGUID; +    data << challengeMode.InstanceAbandonVoteCooldown;      data << Bits<1>(challengeMode.IsActive);      data << Bits<1>(challengeMode.HasRestrictions);      data << Bits<1>(challengeMode.CanVoteAbandon); diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 5b8e4c2ca1e..2e005b7832a 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -193,7 +193,7 @@ namespace WorldPackets          struct PartyMemberStats          {              uint16 Level = 0; -            uint16 Status = 0; +            uint32 Status = 0;              int32 CurrentHealth = 0;              int32 MaxHealth = 0; @@ -574,6 +574,7 @@ namespace WorldPackets              int64 Unknown_1120_4 = 0;              ObjectGuid KeystoneOwnerGUID;              ObjectGuid LeaverGUID; +            Duration<Milliseconds> InstanceAbandonVoteCooldown;              bool IsActive = false;              bool HasRestrictions = false;              bool CanVoteAbandon = false; diff --git a/src/server/game/Server/Packets/PetPackets.cpp b/src/server/game/Server/Packets/PetPackets.cpp index 9aede562bdc..774c340d3d9 100644 --- a/src/server/game/Server/Packets/PetPackets.cpp +++ b/src/server/game/Server/Packets/PetPackets.cpp @@ -84,7 +84,7 @@ WorldPacket const* PetUnlearnedSpells::Write()  WorldPacket const* PetNameInvalid::Write()  { -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      _worldPacket << RenameData.PetGUID;      _worldPacket << int32(RenameData.PetNumber); @@ -189,8 +189,8 @@ WorldPacket const* SetPetSpecialization::Write()  WorldPacket const* PetActionFeedback::Write()  { +    _worldPacket << int32(Response);      _worldPacket << int32(SpellID); -    _worldPacket << uint8(Response);      return &_worldPacket;  } @@ -205,7 +205,7 @@ WorldPacket const* PetActionSound::Write()  WorldPacket const* PetTameFailure::Write()  { -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      return &_worldPacket;  } diff --git a/src/server/game/Server/Packets/PetPackets.h b/src/server/game/Server/Packets/PetPackets.h index 9e60860039c..f59f111fb30 100644 --- a/src/server/game/Server/Packets/PetPackets.h +++ b/src/server/game/Server/Packets/PetPackets.h @@ -176,7 +176,7 @@ namespace WorldPackets              PetRenameData RenameData; -            uint8 Result = 0; +            uint32 Result = 0;          };          class PetRename final : public ClientPacket @@ -243,8 +243,8 @@ namespace WorldPackets              WorldPacket const* Write() override; -            int32 SpellID = 0;              ::PetActionFeedback Response = ::PetActionFeedback::None; +            int32 SpellID = 0;          };          class PetActionSound final : public ServerPacket @@ -265,7 +265,7 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint8 Result = 0; +            uint32 Result = 0;          };          class PetMode final : public ServerPacket diff --git a/src/server/game/Server/Packets/PetitionPackets.cpp b/src/server/game/Server/Packets/PetitionPackets.cpp index 59f9596828f..442718b21ab 100644 --- a/src/server/game/Server/Packets/PetitionPackets.cpp +++ b/src/server/game/Server/Packets/PetitionPackets.cpp @@ -41,7 +41,7 @@ ByteBuffer& operator<<(ByteBuffer& data, PetitionInfo const& petitionInfo)      data << int32(petitionInfo.AllowedMinLevel);      data << int32(petitionInfo.AllowedMaxLevel);      data << int32(petitionInfo.NumChoices); -    data << int32(petitionInfo.StaticType); +    data << int8(petitionInfo.StaticType);      data << uint32(petitionInfo.Muid);      data << SizedString::BitsSize<8>(petitionInfo.Title); diff --git a/src/server/game/Server/Packets/PetitionPackets.h b/src/server/game/Server/Packets/PetitionPackets.h index fc8b59e4e23..fb468c17593 100644 --- a/src/server/game/Server/Packets/PetitionPackets.h +++ b/src/server/game/Server/Packets/PetitionPackets.h @@ -53,7 +53,7 @@ namespace WorldPackets              int32 AllowedMinLevel = 0;              int32 AllowedMaxLevel = 0;              int32 NumChoices = 0; -            int32 StaticType = 0; +            int8 StaticType = 0;              uint32 Muid = 0;              std::array<std::string, 10> Choicetext;          }; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index bef3ef35892..31e8ddb84ea 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -247,7 +247,7 @@ WorldPacket const* QuestUpdateAddCredit::Write()      _worldPacket << int32(ObjectID);      _worldPacket << uint16(Count);      _worldPacket << uint16(Required); -    _worldPacket << uint8(ObjectiveType); +    _worldPacket << uint32(ObjectiveType);      return &_worldPacket;  }; @@ -256,7 +256,7 @@ WorldPacket const* QuestUpdateAddCreditSimple::Write()  {      _worldPacket << int32(QuestID);      _worldPacket << int32(ObjectID); -    _worldPacket << uint8(ObjectiveType); +    _worldPacket << uint32(ObjectiveType);      return &_worldPacket;  } @@ -642,7 +642,7 @@ void QuestConfirmAccept::Read()  WorldPacket const* QuestPushResultResponse::Write()  {      _worldPacket << SenderGUID; -    _worldPacket << uint8(Result); +    _worldPacket << uint32(Result);      _worldPacket << SizedString::BitsSize<9>(QuestTitle);      _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 7c14b336127..1e29c381409 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -225,7 +225,7 @@ namespace WorldPackets              int32 QuestID       = 0;              uint16 Count        = 0;              uint16 Required     = 0; -            uint8 ObjectiveType = 0; +            uint32 ObjectiveType = 0;          };          class QuestUpdateAddCreditSimple final : public ServerPacket @@ -237,7 +237,7 @@ namespace WorldPackets              int32 QuestID = 0;              int32 ObjectID = 0; -            uint8 ObjectiveType = 0; +            uint32 ObjectiveType = 0;          };          class QuestUpdateAddPvPCredit final : public ServerPacket @@ -585,8 +585,8 @@ namespace WorldPackets              WorldPacket const* Write() override;              ObjectGuid SenderGUID; -            uint8 Result = 0; -            std::string QuestTitle; +            uint32 Result = 0; +            std::string_view QuestTitle;          };          class QuestLogFull final : public ServerPacket @@ -606,7 +606,7 @@ namespace WorldPackets              ObjectGuid SenderGUID;              uint32 QuestID = 0; -            uint8 Result = 0; +            uint32 Result = 0;          };          class QuestGiverInvalidQuest final : public ServerPacket diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 4401695814e..20cbed5bf91 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -97,6 +97,7 @@ ByteBuffer& operator<<(ByteBuffer& data, AuraDataInfo const& auraData)      data << int32(auraData.ContentTuningID);      data << auraData.DstLocation;      data << OptionalInit(auraData.CastUnit); +    data << OptionalInit(auraData.CastItem);      data << OptionalInit(auraData.Duration);      data << OptionalInit(auraData.Remaining);      data << OptionalInit(auraData.TimeMod); @@ -110,6 +111,9 @@ ByteBuffer& operator<<(ByteBuffer& data, AuraDataInfo const& auraData)      if (auraData.CastUnit)          data << *auraData.CastUnit; +    if (auraData.CastItem) +        data << *auraData.CastItem; +      if (auraData.Duration)          data << uint32(*auraData.Duration); @@ -162,18 +166,16 @@ ByteBuffer& operator>>(ByteBuffer& buffer, TargetLocation& location)  ByteBuffer& operator>>(ByteBuffer& buffer, SpellTargetData& targetData)  { -    buffer.ResetBitPos(); +    buffer >> targetData.Flags; +    buffer >> targetData.Unit; +    buffer >> targetData.Item; -    buffer >> Bits<28>(targetData.Flags);      buffer >> OptionalInit(targetData.SrcLocation);      buffer >> OptionalInit(targetData.DstLocation);      buffer >> OptionalInit(targetData.Orientation);      buffer >> OptionalInit(targetData.MapID);      buffer >> SizedString::BitsSize<7>(targetData.Name); -    buffer >> targetData.Unit; -    buffer >> targetData.Item; -      if (targetData.SrcLocation)          buffer >> *targetData.SrcLocation; @@ -222,6 +224,7 @@ ByteBuffer& operator>>(ByteBuffer& data, SpellExtraCurrencyCost& extraCurrencyCo  ByteBuffer& operator>>(ByteBuffer& buffer, SpellCastRequest& request)  {      buffer >> request.CastID; +    buffer >> request.SendCastFlags;      buffer >> request.Misc[0];      buffer >> request.Misc[1];      buffer >> request.SpellID; @@ -236,18 +239,19 @@ ByteBuffer& operator>>(ByteBuffer& buffer, SpellCastRequest& request)      for (SpellExtraCurrencyCost& optionalCurrency : request.OptionalCurrencies)          buffer >> optionalCurrency; -    buffer >> Bits<6>(request.SendCastFlags); +    buffer >> request.Target; + +    buffer.ResetBitPos();      buffer >> OptionalInit(request.MoveUpdate);      buffer >> BitsSize<2>(request.Weight);      buffer >> OptionalInit(request.CraftingOrderID); -    buffer >> request.Target; - -    if (request.CraftingOrderID) -        buffer >> *request.CraftingOrderID;      for (SpellCraftingReagent& optionalReagent : request.OptionalReagents)          buffer >> optionalReagent; +    if (request.CraftingOrderID) +        buffer >> *request.CraftingOrderID; +      for (SpellCraftingReagent& optionalReagent : request.RemovedModifications)          buffer >> optionalReagent; @@ -302,7 +306,10 @@ ByteBuffer& operator<<(ByteBuffer& data, TargetLocation const& targetLocation)  ByteBuffer& operator<<(ByteBuffer& data, SpellTargetData const& spellTargetData)  { -    data << Bits<28>(spellTargetData.Flags); +    data << uint32(spellTargetData.Flags); +    data << spellTargetData.Unit; +    data << spellTargetData.Item; +      data << OptionalInit(spellTargetData.SrcLocation);      data << OptionalInit(spellTargetData.DstLocation);      data << OptionalInit(spellTargetData.Orientation); @@ -310,9 +317,6 @@ ByteBuffer& operator<<(ByteBuffer& data, SpellTargetData const& spellTargetData)      data << SizedString::BitsSize<7>(spellTargetData.Name);      data.FlushBits(); -    data << spellTargetData.Unit; -    data << spellTargetData.Item; -      if (spellTargetData.SrcLocation)          data << *spellTargetData.SrcLocation; @@ -382,7 +386,7 @@ ByteBuffer& operator<<(ByteBuffer& data, CreatureImmunities const& immunities)  ByteBuffer& operator<<(ByteBuffer& data, SpellHealPrediction const& spellPred)  {      data << int32(spellPred.Points); -    data << uint8(spellPred.Type); +    data << uint32(spellPred.Type);      data << spellPred.BeaconGUID;      return data; @@ -805,9 +809,9 @@ WorldPacket const* PlaySpellVisual::Write()      _worldPacket << TargetPosition;      _worldPacket << uint32(SpellVisualID);      _worldPacket << float(TravelSpeed); -    _worldPacket << uint16(HitReason); -    _worldPacket << uint16(MissReason); -    _worldPacket << uint16(ReflectStatus); +    _worldPacket << uint8(HitReason); +    _worldPacket << uint8(MissReason); +    _worldPacket << uint8(ReflectStatus);      _worldPacket << float(LaunchDelay);      _worldPacket << float(MinDuration);      _worldPacket << Bits<1>(SpeedAsTime); diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 25576be7588..a4b30b3d2d4 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -167,6 +167,7 @@ namespace WorldPackets              int32 ContentTuningID = 0;              Optional<ContentTuningParams> ContentTuning;              Optional<ObjectGuid> CastUnit; +            Optional<ObjectGuid> CastItem;              Optional<int32> Duration;              Optional<int32> Remaining;              Optional<float> TimeMod; @@ -348,7 +349,7 @@ namespace WorldPackets          {              ObjectGuid BeaconGUID;              uint32 Points = 0; -            uint8 Type = 0; +            uint32 Type = 0;          };          struct SpellCastData @@ -765,9 +766,9 @@ namespace WorldPackets              TaggedPosition<Position::XYZ> TargetPosition; // Overrides missile destination for SpellVisual::SpellVisualMissileSetID              uint32 SpellVisualID = 0;              float TravelSpeed = 0.0f; -            uint16 HitReason = 0; -            uint16 MissReason = 0; -            uint16 ReflectStatus = 0; +            uint8 HitReason = 0; +            uint8 MissReason = 0; +            uint8 ReflectStatus = 0;              float LaunchDelay = 0.0f;              float MinDuration = 0.0f;              bool SpeedAsTime = false; diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index ee5c38e7b2f..804a3b7229a 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -144,6 +144,10 @@ WorldPacket const* FeatureSystemStatus::Write()      _worldPacket << int32(AddonChatThrottle.MaxTries);      _worldPacket << int32(AddonChatThrottle.TriesRestoredPerSecond);      _worldPacket << int32(AddonChatThrottle.UsedTriesPerMessage); +    _worldPacket << int32(GuildChatThrottle.UsedTriesPerMessage); +    _worldPacket << int32(GuildChatThrottle.TriesRestoredPerSecond); +    _worldPacket << int32(GroupChatThrottle.UsedTriesPerMessage); +    _worldPacket << int32(GroupChatThrottle.TriesRestoredPerSecond);      _worldPacket << float(AddonPerformanceMsgWarning);      _worldPacket << float(AddonPerformanceMsgError); @@ -291,6 +295,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write()      _worldPacket << Size<uint32>(GameRules);      _worldPacket << int32(ActiveTimerunningSeasonID);      _worldPacket << int32(RemainingTimerunningSeasonSeconds); +    _worldPacket << TimerunningConversionMinCharacterAge; +    _worldPacket << int32(TimerunningConversionMaxSeasonID);      _worldPacket << int16(MaxPlayerGuidLookupsPerRequest);      _worldPacket << int16(NameLookupTelemetryInterval);      _worldPacket << NotFoundCacheTimeSeconds; @@ -315,6 +321,28 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write()      return &_worldPacket;  } +ByteBuffer& operator<<(ByteBuffer& data, MirrorVarSingle const& variable) +{ +    data << Bits<1>(variable.UpdateType); +    data << SizedCString::BitsSize<24>(variable.Name); +    data << SizedCString::BitsSize<24>(variable.Value); +    data.FlushBits(); + +    data << SizedCString::Data(variable.Name); +    data << SizedCString::Data(variable.Value); + +    return data; +} + +WorldPacket const* MirrorVars::Write() +{ +    _worldPacket << Size<uint32>(Variables); +    for (MirrorVarSingle const& variable : Variables) +        _worldPacket << variable; + +    return &_worldPacket; +} +  WorldPacket const* SetTimeZoneInformation::Write()  {      _worldPacket << SizedString::BitsSize<7>(ServerTimeTZ); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index b74adbc0fca..ff723b7412e 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -107,7 +107,7 @@ namespace WorldPackets                  uint32 RewardsVersion = 0;              }; -            struct AddonChatThrottleParams +            struct ChatThrottleParams              {                  int32 MaxTries = 0;                  int32 TriesRestoredPerSecond = 0; @@ -186,7 +186,9 @@ namespace WorldPackets              int32 ActiveTimerunningSeasonID          = 0;              int32 RemainingTimerunningSeasonSeconds  = 0;              std::string Unknown1027;                          // related to movement lua functions used by keybinds -            AddonChatThrottleParams AddonChatThrottle; +            ChatThrottleParams AddonChatThrottle; +            ChatThrottleParams GuildChatThrottle; +            ChatThrottleParams GroupChatThrottle;              uint32 RealmPvpTypeOverride              = 0;       ///< Use Cfg_Configs value = 0, ForceEnabled = 1, ForceDisabled = 2              float AddonPerformanceMsgWarning         = 0.0f;              float AddonPerformanceMsgError           = 0.0f; @@ -250,6 +252,8 @@ namespace WorldPackets              std::vector<GameRuleValuePair> GameRules;              int32 ActiveTimerunningSeasonID          = 0;              int32 RemainingTimerunningSeasonSeconds  = 0; +            Duration<Seconds, int32> TimerunningConversionMinCharacterAge { 1_days }; +            int32 TimerunningConversionMaxSeasonID   = -1;              int16 MaxPlayerGuidLookupsPerRequest     = 50;              int16 NameLookupTelemetryInterval        = 600;              Duration<Seconds, uint32> NotFoundCacheTimeSeconds = 10s; @@ -260,6 +264,26 @@ namespace WorldPackets              std::string RealmHiddenAlert;          }; +        struct MirrorVarSingle +        { +            std::string_view Name; +            std::string Value; +            int32 UpdateType; + +            MirrorVarSingle(std::string_view name, std::string_view value, int32 updateType = 0) +                : Name(name), Value(value), UpdateType(updateType) { } +        }; + +        class MirrorVars final : public ServerPacket +        { +        public: +            explicit MirrorVars() : ServerPacket(SMSG_MIRROR_VARS) { } + +            WorldPacket const* Write() override; + +            std::span<MirrorVarSingle> Variables; +        }; +          class SetTimeZoneInformation final : public ServerPacket          {          public: diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index 63487076b02..1a9d373bf8b 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -61,6 +61,9 @@ ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentGroupInfo const& talentGro      if (!talentGroupInfo.GlyphIDs.empty())          data.append(talentGroupInfo.GlyphIDs.data(), talentGroupInfo.GlyphIDs.size()); +    data.WriteBit(talentGroupInfo.Unused1125); +    data.FlushBits(); +      return data;  } diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index 5b9566e83c2..a61e804c598 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -62,6 +62,7 @@ namespace WorldPackets              std::vector<uint16> GlyphIDs;              int8 Role = 0;              int32 PrimarySpecialization = 0; +            bool Unused1125 = false;          };          struct ClassicTalentInfoUpdate diff --git a/src/server/game/Server/Packets/TokenPackets.cpp b/src/server/game/Server/Packets/TokenPackets.cpp index 374c6e0548e..db0b35c9ea6 100644 --- a/src/server/game/Server/Packets/TokenPackets.cpp +++ b/src/server/game/Server/Packets/TokenPackets.cpp @@ -34,8 +34,8 @@ WorldPacket const* CommerceTokenGetLogResponse::Write()      {          _worldPacket << auctionableTokenAuctionable.Id;          _worldPacket << auctionableTokenAuctionable.LastUpdate; -        _worldPacket << auctionableTokenAuctionable.Price;          _worldPacket << auctionableTokenAuctionable.Status; +        _worldPacket << auctionableTokenAuctionable.Price;          _worldPacket << auctionableTokenAuctionable.DurationLeft;      } @@ -49,9 +49,9 @@ void CommerceTokenGetMarketPrice::Read()  WorldPacket const* CommerceTokenGetMarketPriceResponse::Write()  { -    _worldPacket << PriceGuarantee;      _worldPacket << ClientToken;      _worldPacket << ServerToken; +    _worldPacket << PriceGuarantee;      _worldPacket << PriceLockDurationSeconds;      return &_worldPacket; diff --git a/src/server/game/Server/Packets/TokenPackets.h b/src/server/game/Server/Packets/TokenPackets.h index a31e4390094..d6844d37bb2 100644 --- a/src/server/game/Server/Packets/TokenPackets.h +++ b/src/server/game/Server/Packets/TokenPackets.h @@ -73,9 +73,9 @@ namespace WorldPackets              WorldPacket const* Write() override; -            uint64 PriceGuarantee       = 0;              uint32 ClientToken          = 0;              uint32 ServerToken          = 0; +            uint64 PriceGuarantee       = 0;              uint32 PriceLockDurationSeconds = 0; // preset auction duration enum          };      } diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.cpp b/src/server/game/Server/Packets/TraitPacketsCommon.cpp index 692ed9cb330..66e3037661b 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.cpp +++ b/src/server/game/Server/Packets/TraitPacketsCommon.cpp @@ -30,6 +30,7 @@ TraitEntry::TraitEntry(UF::TraitEntry const& ufEntry)      TraitNodeEntryID = ufEntry.TraitNodeEntryID;      Rank = ufEntry.Rank;      GrantedRanks = ufEntry.GrantedRanks; +    BonusRanks = ufEntry.BonusRanks;  }  TraitSubTreeCache::TraitSubTreeCache() = default; @@ -53,6 +54,7 @@ TraitConfig::TraitConfig(UF::TraitConfig const& ufConfig)      LocalIdentifier = ufConfig.LocalIdentifier;      SkillLineID = ufConfig.SkillLineID;      TraitSystemID = ufConfig.TraitSystemID; +    VariationID = ufConfig.VariationID;      for (UF::TraitEntry const& ufEntry : ufConfig.Entries)          Entries.emplace_back(ufEntry);      for (UF::TraitSubTreeCache const& ufSubTree : ufConfig.SubTrees) @@ -140,6 +142,7 @@ ByteBuffer& operator>>(ByteBuffer& data, TraitConfig& traitConfig)              break;          case TraitConfigType::Generic:              data >> traitConfig.TraitSystemID; +            data >> traitConfig.VariationID;              break;          default:              break; @@ -176,6 +179,7 @@ ByteBuffer& operator<<(ByteBuffer& data, TraitConfig const& traitConfig)              break;          case TraitConfigType::Generic:              data << int32(traitConfig.TraitSystemID); +            data << int32(traitConfig.VariationID);              break;          default:              break; diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.h b/src/server/game/Server/Packets/TraitPacketsCommon.h index 94b88e29746..4b97dd8d10e 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.h +++ b/src/server/game/Server/Packets/TraitPacketsCommon.h @@ -66,6 +66,7 @@ struct TraitConfig      int32 LocalIdentifier = 0;  // Local to specialization      int32 SkillLineID = 0;      int32 TraitSystemID = 0; +    int32 VariationID = 0;      std::vector<TraitEntry> Entries;      std::vector<TraitSubTreeCache> SubTrees;      String<259> Name; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 23add3e1448..ba343184245 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -402,6 +402,7 @@ void OpcodeTable::InitializeClientOpcodes()      DEFINE_HANDLER(CMSG_CONVERSATION_LINE_STARTED,                          STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleConversationLineStarted);      DEFINE_HANDLER(CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT,                    STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_CONVERT_RAID,                                       STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleConvertRaidOpcode); +    DEFINE_HANDLER(CMSG_CONVERT_TIMERUNNING_CHARACTER,                      STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE,              STATUS_UNHANDLED, PROCESS_INPLACE,      &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_CRAFTING_ORDER_CANCEL,                              STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_CRAFTING_ORDER_CLAIM,                               STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); @@ -822,6 +823,8 @@ void OpcodeTable::InitializeClientOpcodes()      DEFINE_HANDLER(CMSG_RANDOM_ROLL,                                        STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleRandomRollOpcode);      DEFINE_HANDLER(CMSG_READY_CHECK_RESPONSE,                               STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleReadyCheckResponseOpcode);      DEFINE_HANDLER(CMSG_READ_ITEM,                                          STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleReadItem); +    DEFINE_HANDLER(CMSG_RECENT_ALLY_REQUEST_DATA,                           STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); +    DEFINE_HANDLER(CMSG_RECENT_ALLY_SET_NOTE,                               STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_RECLAIM_CORPSE,                                     STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpse);      DEFINE_HANDLER(CMSG_REMOVE_NEW_ITEM,                                    STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleRemoveNewItem);      DEFINE_HANDLER(CMSG_REMOVE_RAF_RECRUIT,                                 STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); @@ -860,6 +863,7 @@ void OpcodeTable::InitializeClientOpcodes()      DEFINE_HANDLER(CMSG_REQUEST_SCHEDULED_PVP_INFO,                         STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_REQUEST_STABLED_PETS,                               STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleRequestStabledPets);      DEFINE_HANDLER(CMSG_REQUEST_STORE_FRONT_INFO_UPDATE,                    STATUS_UNHANDLED, PROCESS_INPLACE,      &WorldSession::Handle_NULL); +    DEFINE_HANDLER(CMSG_REQUEST_SURVEY,                                     STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT,                               STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleRequestVehicleExit);      DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT,                          STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleRequestVehicleNextSeat);      DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT,                          STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleRequestVehiclePrevSeat); @@ -898,6 +902,7 @@ void OpcodeTable::InitializeClientOpcodes()      DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON,                                  STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleSetActionButtonOpcode);      DEFINE_HANDLER(CMSG_SET_ACTIVE_MOVER,                                   STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode);      DEFINE_HANDLER(CMSG_SET_ADVANCED_COMBAT_LOGGING,                        STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleSetAdvancedCombatLogging); +    DEFINE_HANDLER(CMSG_SET_ALLOW_RECENT_ALLIES_SEE_LOCATION,               STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);      DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER,                               STATUS_LOGGEDIN,  PROCESS_THREADUNSAFE, &WorldSession::HandleSetAssistantLeaderOpcode);      DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED,                     STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleSetBackpackAutosortDisabled);      DEFINE_HANDLER(CMSG_SET_BACKPACK_SELL_JUNK_DISABLED,                    STATUS_LOGGEDIN,  PROCESS_INPLACE,      &WorldSession::HandleSetBackpackSellJunkDisabled); @@ -1229,6 +1234,9 @@ void OpcodeTable::InitializeServerOpcodes()      DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAPTURE_POINT_REMOVED,                   STATUS_NEVER,        CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED,                             STATUS_NEVER,        CONNECTION_TYPE_INSTANCE);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAS_REFRESH_REMOTE_DATA,                 STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATALOG_SHOP_LICENSE_DATA,               STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATALOG_SHOP_OBTAIN_LICENSE,             STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATALOG_SHOP_OPEN_CHECKOUT_RESULT,       STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAUTIONARY_CHANNEL_MESSAGE,              STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAUTIONARY_CHAT_MESSAGE,                 STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAIN_MISSILE_BOUNCE,                    STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); @@ -1705,7 +1713,7 @@ void OpcodeTable::InitializeServerOpcodes()      DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING,                            STATUS_NEVER,        CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA,           STATUS_NEVER,        CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA,              STATUS_NEVER,        CONNECTION_TYPE_REALM); -    DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_VARS,                             STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_VARS,                             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_MOUNT_RESULT,                            STATUS_NEVER,        CONNECTION_TYPE_INSTANCE); @@ -2012,6 +2020,8 @@ void OpcodeTable::InitializeServerOpcodes()      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);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECEIVE_PING_WORLD_POINT,                STATUS_NEVER,        CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECENT_ALLY_DATA_RESPONSE,               STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECENT_ALLY_NOTE_UPDATED,                STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRAFT_ITEM_RESULT,                     STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_FAILURE,                STATUS_NEVER,        CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_COMPONENT,                       STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); @@ -2169,6 +2179,7 @@ void OpcodeTable::InitializeServerOpcodes()      DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED,      STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST,                          STATUS_NEVER,        CONNECTION_TYPE_INSTANCE);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS,                       STATUS_NEVER,        CONNECTION_TYPE_INSTANCE); +    DEFINE_SERVER_OPCODE_HANDLER(SMSG_SURVEY_DELIVERED,                        STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS,                           STATUS_UNHANDLED,    CONNECTION_TYPE_REALM);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN,                           STATUS_NEVER,        CONNECTION_TYPE_INSTANCE);      DEFINE_SERVER_OPCODE_HANDLER(SMSG_SYNC_WOW_ENTITLEMENTS,                   STATUS_UNHANDLED,    CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 65ea46c0c86..a4da8df05f8 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -36,38 +36,38 @@ constexpr uint32 UNKNOWN_OPCODE = 0xBADD;   // special marker value for uninitia  enum OpcodeClient : uint32  { -    CMSG_ABANDON_NPE_RESPONSE                         = 0x2F0299, +    CMSG_ABANDON_NPE_RESPONSE                         = 0x2F029A,      CMSG_ACCEPT_GUILD_INVITE                          = 0x340029, -    CMSG_ACCEPT_RETURNING_PLAYER_PROMPT               = 0x2F025A, -    CMSG_ACCEPT_SOCIAL_CONTRACT                       = 0x340174, +    CMSG_ACCEPT_RETURNING_PLAYER_PROMPT               = 0x2F025B, +    CMSG_ACCEPT_SOCIAL_CONTRACT                       = 0x340176,      CMSG_ACCEPT_TRADE                                 = 0x2F0004,      CMSG_ACCEPT_WARGAME_INVITE                        = 0x34000C, -    CMSG_ACCOUNT_BANK_DEPOSIT_MONEY                   = 0x2F02DC, -    CMSG_ACCOUNT_BANK_WITHDRAW_MONEY                  = 0x2F02DD, -    CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED            = 0x340160, +    CMSG_ACCOUNT_BANK_DEPOSIT_MONEY                   = 0x2F02DD, +    CMSG_ACCOUNT_BANK_WITHDRAW_MONEY                  = 0x2F02DE, +    CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED            = 0x340162,      CMSG_ACCOUNT_STORE_BEGIN_PURCHASE_OR_REFUND       = 0x3400C0, -    CMSG_ACTIVATE_SOULBIND                            = 0x2F0288, +    CMSG_ACTIVATE_SOULBIND                            = 0x2F0289,      CMSG_ACTIVATE_TAXI                                = 0x30003E,      CMSG_ADDON_LIST                                   = 0x340004, -    CMSG_ADD_ACCOUNT_COSMETIC                         = 0x2F0171, +    CMSG_ADD_ACCOUNT_COSMETIC                         = 0x2F0172,      CMSG_ADD_BATTLENET_FRIEND                         = 0x340086, -    CMSG_ADD_FRIEND                                   = 0x3400FE, -    CMSG_ADD_IGNORE                                   = 0x340102, -    CMSG_ADD_TOY                                      = 0x2F0170, -    CMSG_ADVENTURE_JOURNAL_OPEN_QUEST                 = 0x2F00B3, -    CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS         = 0x2F028B, -    CMSG_ADVENTURE_MAP_START_QUEST                    = 0x2F022B, +    CMSG_ADD_FRIEND                                   = 0x3400FF, +    CMSG_ADD_IGNORE                                   = 0x340103, +    CMSG_ADD_TOY                                      = 0x2F0171, +    CMSG_ADVENTURE_JOURNAL_OPEN_QUEST                 = 0x2F00B4, +    CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS         = 0x2F028C, +    CMSG_ADVENTURE_MAP_START_QUEST                    = 0x2F022C,      CMSG_ALTER_APPEARANCE                             = 0x30008D,      CMSG_AREA_SPIRIT_HEALER_QUERY                     = 0x300043,      CMSG_AREA_SPIRIT_HEALER_QUEUE                     = 0x300044, -    CMSG_AREA_TRIGGER                                 = 0x2F0086, +    CMSG_AREA_TRIGGER                                 = 0x2F0087,      CMSG_ARTIFACT_ADD_POWER                           = 0x2F0056,      CMSG_ARTIFACT_SET_APPEARANCE                      = 0x2F0058, -    CMSG_ASSIGN_EQUIPMENT_SET_SPEC                    = 0x2F00BF, -    CMSG_ATTACK_STOP                                  = 0x2F011D, -    CMSG_ATTACK_SWING                                 = 0x2F011C, -    CMSG_AUCTIONABLE_TOKEN_SELL                       = 0x340114, -    CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE       = 0x340115, +    CMSG_ASSIGN_EQUIPMENT_SET_SPEC                    = 0x2F00C0, +    CMSG_ATTACK_STOP                                  = 0x2F011E, +    CMSG_ATTACK_SWING                                 = 0x2F011D, +    CMSG_AUCTIONABLE_TOKEN_SELL                       = 0x340115, +    CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE       = 0x340116,      CMSG_AUCTION_BROWSE_QUERY                         = 0x300061,      CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE          = 0x300069,      CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE         = 0x300068, @@ -83,46 +83,46 @@ enum OpcodeClient : uint32      CMSG_AUCTION_REPLICATE_ITEMS                      = 0x30005F,      CMSG_AUCTION_SELL_COMMODITY                       = 0x30006A,      CMSG_AUCTION_SELL_ITEM                            = 0x30005D, -    CMSG_AUCTION_SET_FAVORITE_ITEM                    = 0x340161, +    CMSG_AUCTION_SET_FAVORITE_ITEM                    = 0x340163,      CMSG_AUTH_CONTINUED_SESSION                       = 0x350002,      CMSG_AUTH_SESSION                                 = 0x350001,      CMSG_AUTOBANK_ITEM                                = 0x310003,      CMSG_AUTOSTORE_BANK_ITEM                          = 0x310002, -    CMSG_AUTO_DEPOSIT_ACCOUNT_BANK                    = 0x2F02E6, -    CMSG_AUTO_DEPOSIT_CHARACTER_BANK                  = 0x2F02EE, +    CMSG_AUTO_DEPOSIT_ACCOUNT_BANK                    = 0x2F02E7, +    CMSG_AUTO_DEPOSIT_CHARACTER_BANK                  = 0x2F02EF,      CMSG_AUTO_EQUIP_ITEM                              = 0x310004,      CMSG_AUTO_EQUIP_ITEM_SLOT                         = 0x310009,      CMSG_AUTO_GUILD_BANK_ITEM                         = 0x300048,      CMSG_AUTO_STORE_BAG_ITEM                          = 0x310005,      CMSG_AUTO_STORE_GUILD_BANK_ITEM                   = 0x300051, -    CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER          = 0x2F0256, -    CMSG_AZERITE_EMPOWERED_ITEM_VIEWED                = 0x2F0237, -    CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE             = 0x2F0258, -    CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE             = 0x2F0257, +    CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER          = 0x2F0257, +    CMSG_AZERITE_EMPOWERED_ITEM_VIEWED                = 0x2F0238, +    CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE             = 0x2F0259, +    CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE             = 0x2F0258,      CMSG_BANKER_ACTIVATE                              = 0x300046,      CMSG_BATTLEFIELD_LEAVE                            = 0x2F001F,      CMSG_BATTLEFIELD_LIST                             = 0x2F002A,      CMSG_BATTLEFIELD_PORT                             = 0x3000C3, -    CMSG_BATTLEMASTER_HELLO                           = 0x2F018F, +    CMSG_BATTLEMASTER_HELLO                           = 0x2F0190,      CMSG_BATTLEMASTER_JOIN                            = 0x3000BA,      CMSG_BATTLEMASTER_JOIN_ARENA                      = 0x3000BB,      CMSG_BATTLEMASTER_JOIN_BRAWL                      = 0x3000C1,      CMSG_BATTLEMASTER_JOIN_RATED_BG_BLITZ             = 0x3000BD,      CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE         = 0x3000BC,      CMSG_BATTLEMASTER_JOIN_SKIRMISH                   = 0x3000BE, -    CMSG_BATTLENET_CHALLENGE_RESPONSE                 = 0x340101, -    CMSG_BATTLENET_REQUEST                            = 0x340122, +    CMSG_BATTLENET_CHALLENGE_RESPONSE                 = 0x340102, +    CMSG_BATTLENET_REQUEST                            = 0x340123,      CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE               = 0x3400FB, -    CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT              = 0x34013E, +    CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT              = 0x340140,      CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE         = 0x3400FA,      CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET     = 0x3400F1, -    CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS           = 0x340164, +    CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS           = 0x340166,      CMSG_BATTLE_PAY_GET_PRODUCT_LIST                  = 0x3400E8,      CMSG_BATTLE_PAY_GET_PURCHASE_LIST                 = 0x3400E9, -    CMSG_BATTLE_PAY_OPEN_CHECKOUT                     = 0x340137, -    CMSG_BATTLE_PAY_REQUEST_PRICE_INFO                = 0x340133, +    CMSG_BATTLE_PAY_OPEN_CHECKOUT                     = 0x340139, +    CMSG_BATTLE_PAY_REQUEST_PRICE_INFO                = 0x340134,      CMSG_BATTLE_PAY_START_PURCHASE                    = 0x3400F9, -    CMSG_BATTLE_PAY_START_VAS_PURCHASE                = 0x340120, +    CMSG_BATTLE_PAY_START_VAS_PURCHASE                = 0x340121,      CMSG_BATTLE_PET_CLEAR_FANFARE                     = 0x290002,      CMSG_BATTLE_PET_DELETE_PET                        = 0x34004F,      CMSG_BATTLE_PET_DELETE_PET_CHEAT                  = 0x340050, @@ -132,20 +132,20 @@ enum OpcodeClient : uint32      CMSG_BATTLE_PET_SET_BATTLE_SLOT                   = 0x340057,      CMSG_BATTLE_PET_SET_FLAGS                         = 0x34005A,      CMSG_BATTLE_PET_SUMMON                            = 0x340053, -    CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY             = 0x2F0090, -    CMSG_BATTLE_PET_UPDATE_NOTIFY                     = 0x2F008F, +    CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY             = 0x2F0091, +    CMSG_BATTLE_PET_UPDATE_NOTIFY                     = 0x2F0090,      CMSG_BEGIN_TRADE                                  = 0x2F0001,      CMSG_BINDER_ACTIVATE                              = 0x300045,      CMSG_BLACK_MARKET_BID_ON_ITEM                     = 0x3000CB,      CMSG_BLACK_MARKET_OPEN                            = 0x3000C9,      CMSG_BLACK_MARKET_REQUEST_ITEMS                   = 0x3000CA, -    CMSG_BONUS_ROLL                                   = 0x2F0259, +    CMSG_BONUS_ROLL                                   = 0x2F025A,      CMSG_BUG_REPORT                                   = 0x3400B1,      CMSG_BUSY_TRADE                                   = 0x2F0002,      CMSG_BUY_ACCOUNT_BANK_TAB                         = 0x300123,      CMSG_BUY_BACK_ITEM                                = 0x300037,      CMSG_BUY_ITEM                                     = 0x300036, -    CMSG_CAGE_BATTLE_PET                              = 0x2F00A3, +    CMSG_CAGE_BATTLE_PET                              = 0x2F00A4,      CMSG_CALENDAR_ADD_EVENT                           = 0x3400A9,      CMSG_CALENDAR_COMMUNITY_INVITE                    = 0x34009D,      CMSG_CALENDAR_COMPLAIN                            = 0x3400A5, @@ -163,23 +163,23 @@ enum OpcodeClient : uint32      CMSG_CALENDAR_UPDATE_EVENT                        = 0x3400AA,      CMSG_CANCEL_AURA                                  = 0x2F005A,      CMSG_CANCEL_AUTO_REPEAT_SPELL                     = 0x30007F, -    CMSG_CANCEL_CAST                                  = 0x2F0177, -    CMSG_CANCEL_CHANNELLING                           = 0x2F0138, -    CMSG_CANCEL_GROWTH_AURA                           = 0x2F0140, -    CMSG_CANCEL_MASTER_LOOT_ROLL                      = 0x2F00CC, +    CMSG_CANCEL_CAST                                  = 0x2F0178, +    CMSG_CANCEL_CHANNELLING                           = 0x2F0139, +    CMSG_CANCEL_GROWTH_AURA                           = 0x2F0141, +    CMSG_CANCEL_MASTER_LOOT_ROLL                      = 0x2F00CD,      CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS            = 0x2F0059, -    CMSG_CANCEL_MOUNT_AURA                            = 0x2F0153, +    CMSG_CANCEL_MOUNT_AURA                            = 0x2F0154,      CMSG_CANCEL_QUEUED_SPELL                          = 0x2F002B,      CMSG_CANCEL_TEMP_ENCHANTMENT                      = 0x30008A,      CMSG_CANCEL_TRADE                                 = 0x2F0006,      CMSG_CAN_DUEL                                     = 0x34008E, -    CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE                 = 0x340132, -    CMSG_CAST_SPELL                                   = 0x2F0174, +    CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE                 = 0x340133, +    CMSG_CAST_SPELL                                   = 0x2F0175,      CMSG_CHALLENGE_MODE_REQUEST_LEADERS               = 0x2C0002, -    CMSG_CHANGE_BAG_SLOT_FLAG                         = 0x2F0211, -    CMSG_CHANGE_BANK_BAG_SLOT_FLAG                    = 0x2F0212, -    CMSG_CHANGE_MONUMENT_APPEARANCE                   = 0x2F01F2, -    CMSG_CHANGE_REALM_TICKET                          = 0x340127, +    CMSG_CHANGE_BAG_SLOT_FLAG                         = 0x2F0212, +    CMSG_CHANGE_BANK_BAG_SLOT_FLAG                    = 0x2F0213, +    CMSG_CHANGE_MONUMENT_APPEARANCE                   = 0x2F01F3, +    CMSG_CHANGE_REALM_TICKET                          = 0x340128,      CMSG_CHANGE_SUB_GROUP                             = 0x340078,      CMSG_CHARACTER_CHECK_UPGRADE                      = 0x3400F4,      CMSG_CHARACTER_RENAME_REQUEST                     = 0x3400EF, @@ -232,36 +232,36 @@ enum OpcodeClient : uint32      CMSG_CHAT_SEND_CAUTIONARY_CHAT_MESSAGE            = 0x2B0009,      CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES           = 0x2B0006,      CMSG_CHECK_CHARACTER_NAME_AVAILABILITY            = 0x340071, -    CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID             = 0x2F010E, -    CMSG_CHOICE_RESPONSE                              = 0x2F017C, -    CMSG_CHROMIE_TIME_SELECT_EXPANSION                = 0x2F0287, -    CMSG_CLAIM_WEEKLY_REWARD                          = 0x2F0264, -    CMSG_CLASS_TALENTS_DELETE_CONFIG                  = 0x2F02C1, -    CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG            = 0x2F00C3, -    CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED       = 0x2F02C3, -    CMSG_CLASS_TALENTS_RENAME_CONFIG                  = 0x2F02C0, -    CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG             = 0x2F02BF, -    CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE       = 0x2F02C4, -    CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS    = 0x2F00C2, +    CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID             = 0x2F010F, +    CMSG_CHOICE_RESPONSE                              = 0x2F017D, +    CMSG_CHROMIE_TIME_SELECT_EXPANSION                = 0x2F0288, +    CMSG_CLAIM_WEEKLY_REWARD                          = 0x2F0265, +    CMSG_CLASS_TALENTS_DELETE_CONFIG                  = 0x2F02C2, +    CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG            = 0x2F00C4, +    CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED       = 0x2F02C4, +    CMSG_CLASS_TALENTS_RENAME_CONFIG                  = 0x2F02C1, +    CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG             = 0x2F02C0, +    CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE       = 0x2F02C5, +    CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS    = 0x2F00C3,      CMSG_CLEAR_NEW_APPEARANCE                         = 0x290005,      CMSG_CLEAR_RAID_MARKER                            = 0x2F0052,      CMSG_CLEAR_TRADE_ITEM                             = 0x2F0008,      CMSG_CLIENT_PORT_GRAVEYARD                        = 0x3000C5,      CMSG_CLOSE_INTERACTION                            = 0x300025, -    CMSG_CLOSE_QUEST_CHOICE                           = 0x2F017D, -    CMSG_CLOSE_RUNEFORGE_INTERACTION                  = 0x2F028F, -    CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION               = 0x2F02C5, -    CMSG_CLUB_FINDER_APPLICATION_RESPONSE             = 0x340149, -    CMSG_CLUB_FINDER_GET_APPLICANTS_LIST              = 0x340147, -    CMSG_CLUB_FINDER_POST                             = 0x340144, -    CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA               = 0x34014B, -    CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST               = 0x340145, -    CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB       = 0x340146, -    CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST       = 0x34014A, -    CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x34014C, -    CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT             = 0x340148, -    CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST        = 0x340167, -    CMSG_CLUB_PRESENCE_SUBSCRIBE                      = 0x340124, +    CMSG_CLOSE_QUEST_CHOICE                           = 0x2F017E, +    CMSG_CLOSE_RUNEFORGE_INTERACTION                  = 0x2F0290, +    CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION               = 0x2F02C6, +    CMSG_CLUB_FINDER_APPLICATION_RESPONSE             = 0x34014B, +    CMSG_CLUB_FINDER_GET_APPLICANTS_LIST              = 0x340149, +    CMSG_CLUB_FINDER_POST                             = 0x340146, +    CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA               = 0x34014D, +    CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST               = 0x340147, +    CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB       = 0x340148, +    CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST       = 0x34014C, +    CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x34014E, +    CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT             = 0x34014A, +    CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST        = 0x340169, +    CMSG_CLUB_PRESENCE_SUBSCRIBE                      = 0x340125,      CMSG_COLLECTION_ITEM_SET_FAVORITE                 = 0x34005D,      CMSG_COMMENTATOR_ENABLE                           = 0x34001C,      CMSG_COMMENTATOR_ENTER_INSTANCE                   = 0x340020, @@ -269,31 +269,32 @@ enum OpcodeClient : uint32      CMSG_COMMENTATOR_GET_MAP_INFO                     = 0x34001D,      CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS             = 0x34001F,      CMSG_COMMENTATOR_GET_PLAYER_INFO                  = 0x34001E, -    CMSG_COMMENTATOR_SPECTATE                         = 0x340165, +    CMSG_COMMENTATOR_SPECTATE                         = 0x340167,      CMSG_COMMENTATOR_START_WARGAME                    = 0x34001B, -    CMSG_COMMERCE_TOKEN_GET_COUNT                     = 0x340112, -    CMSG_COMMERCE_TOKEN_GET_LOG                       = 0x34011C, -    CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE              = 0x340113, +    CMSG_COMMERCE_TOKEN_GET_COUNT                     = 0x340113, +    CMSG_COMMERCE_TOKEN_GET_LOG                       = 0x34011D, +    CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE              = 0x340114,      CMSG_COMPLAINT                                    = 0x340098,      CMSG_COMPLETE_CINEMATIC                           = 0x3000E3,      CMSG_COMPLETE_MOVIE                               = 0x300075,      CMSG_CONFIRM_ARTIFACT_RESPEC                      = 0x2F0057, -    CMSG_CONFIRM_PROFESSION_RESPEC                    = 0x2F00C6, -    CMSG_CONFIRM_RESPEC_WIPE                          = 0x2F00C5, +    CMSG_CONFIRM_PROFESSION_RESPEC                    = 0x2F00C7, +    CMSG_CONFIRM_RESPEC_WIPE                          = 0x2F00C6,      CMSG_CONNECT_TO_FAILED                            = 0x340000, -    CMSG_CONSUMABLE_TOKEN_BUY                         = 0x340117, -    CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE         = 0x340118, -    CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY             = 0x340116, -    CMSG_CONSUMABLE_TOKEN_REDEEM                      = 0x34011A, -    CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION         = 0x34011B, -    CMSG_CONTENT_TRACKING_START_TRACKING              = 0x2F02D5, -    CMSG_CONTENT_TRACKING_STOP_TRACKING               = 0x2F02D6, +    CMSG_CONSUMABLE_TOKEN_BUY                         = 0x340118, +    CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE         = 0x340119, +    CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY             = 0x340117, +    CMSG_CONSUMABLE_TOKEN_REDEEM                      = 0x34011B, +    CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION         = 0x34011C, +    CMSG_CONTENT_TRACKING_START_TRACKING              = 0x2F02D6, +    CMSG_CONTENT_TRACKING_STOP_TRACKING               = 0x2F02D7,      CMSG_CONTRIBUTION_CONTRIBUTE                      = 0x3000FB,      CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST             = 0x3000FC,      CMSG_CONVERSATION_CINEMATIC_READY                 = 0x3000E5,      CMSG_CONVERSATION_LINE_STARTED                    = 0x3000E4, -    CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT              = 0x2F02E5, +    CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT              = 0x2F02E6,      CMSG_CONVERT_RAID                                 = 0x34007A, +    CMSG_CONVERT_TIMERUNNING_CHARACTER                = 0x34018C,      CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE        = 0x30010F,      CMSG_CRAFTING_ORDER_CANCEL                        = 0x30011B,      CMSG_CRAFTING_ORDER_CLAIM                         = 0x300118, @@ -307,15 +308,15 @@ enum OpcodeClient : uint32      CMSG_CRAFTING_ORDER_REPORT_PLAYER                 = 0x30011D,      CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST            = 0x30011E,      CMSG_CREATE_CHARACTER                             = 0x340070, -    CMSG_CREATE_SHIPMENT                              = 0x2F01DB, +    CMSG_CREATE_SHIPMENT                              = 0x2F01DC,      CMSG_DB_QUERY_BULK                                = 0x340010,      CMSG_DECLINE_GUILD_INVITES                        = 0x3000B7,      CMSG_DECLINE_PETITION                             = 0x3000D2,      CMSG_DELETE_EQUIPMENT_SET                         = 0x3000A3,      CMSG_DELVE_TELEPORT_OUT                           = 0x30012B, -    CMSG_DEL_FRIEND                                   = 0x3400FF, -    CMSG_DEL_IGNORE                                   = 0x340103, -    CMSG_DESTROY_ITEM                                 = 0x2F016A, +    CMSG_DEL_FRIEND                                   = 0x340100, +    CMSG_DEL_IGNORE                                   = 0x340104, +    CMSG_DESTROY_ITEM                                 = 0x2F016B,      CMSG_DF_BOOT_PLAYER_VOTE                          = 0x340044,      CMSG_DF_CONFIRM_EXPAND_SEARCH                     = 0x340036,      CMSG_DF_GET_JOIN_STATUS                           = 0x340042, @@ -328,65 +329,65 @@ enum OpcodeClient : uint32      CMSG_DF_TELEPORT                                  = 0x340045,      CMSG_DISCARDED_TIME_SYNC_ACKS                     = 0x32005E,      CMSG_DISMISS_CRITTER                              = 0x300091, -    CMSG_DO_COUNTDOWN                                 = 0x340143, -    CMSG_DO_MASTER_LOOT_ROLL                          = 0x2F00CB, +    CMSG_DO_COUNTDOWN                                 = 0x340145, +    CMSG_DO_MASTER_LOOT_ROLL                          = 0x2F00CC,      CMSG_DO_READY_CHECK                               = 0x34005E,      CMSG_DUEL_RESPONSE                                = 0x30007A, -    CMSG_EJECT_PASSENGER                              = 0x2F0103, +    CMSG_EJECT_PASSENGER                              = 0x2F0104,      CMSG_EMOTE                                        = 0x3000DF,      CMSG_ENABLE_NAGLE                                 = 0x350007,      CMSG_ENABLE_TAXI_NODE                             = 0x30003C, -    CMSG_ENGINE_SURVEY                                = 0x340111, +    CMSG_ENGINE_SURVEY                                = 0x340112,      CMSG_ENTER_ENCRYPTED_MODE_ACK                     = 0x350003,      CMSG_ENUM_CHARACTERS                              = 0x340014, -    CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT            = 0x34010B, +    CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT            = 0x34010C,      CMSG_FAR_SIGHT                                    = 0x300080,      CMSG_GAME_EVENT_DEBUG_DISABLE                     = 0x2F005E,      CMSG_GAME_EVENT_DEBUG_ENABLE                      = 0x2F005D,      CMSG_GAME_OBJ_REPORT_USE                          = 0x300087,      CMSG_GAME_OBJ_USE                                 = 0x300086, -    CMSG_GARRISON_ADD_FOLLOWER_HEALTH                 = 0x2F01D6, -    CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING         = 0x2F01BC, -    CMSG_GARRISON_CANCEL_CONSTRUCTION                 = 0x2F01A9, -    CMSG_GARRISON_CHECK_UPGRADEABLE                   = 0x2F020D, -    CMSG_GARRISON_COMPLETE_MISSION                    = 0x2F01FF, -    CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS            = 0x2F01D7, -    CMSG_GARRISON_GENERATE_RECRUITS                   = 0x2F01BF, -    CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO        = 0x2F01CE, -    CMSG_GARRISON_GET_MAP_DATA                        = 0x2F01D5, -    CMSG_GARRISON_GET_MISSION_REWARD                  = 0x2F022F, -    CMSG_GARRISON_LEARN_TALENT                        = 0x2F01CA, -    CMSG_GARRISON_MISSION_BONUS_ROLL                  = 0x2F0201, -    CMSG_GARRISON_PURCHASE_BUILDING                   = 0x2F01A5, -    CMSG_GARRISON_RECRUIT_FOLLOWER                    = 0x2F01C1, -    CMSG_GARRISON_REMOVE_FOLLOWER                     = 0x2F01F6, -    CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING       = 0x2F01BD, -    CMSG_GARRISON_RENAME_FOLLOWER                     = 0x2F01BE, -    CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x2F01A4, -    CMSG_GARRISON_REQUEST_SHIPMENT_INFO               = 0x2F01D9, -    CMSG_GARRISON_RESEARCH_TALENT                     = 0x2F01C2, -    CMSG_GARRISON_SET_BUILDING_ACTIVE                 = 0x2F01A6, -    CMSG_GARRISON_SET_FOLLOWER_FAVORITE               = 0x2F01BA, -    CMSG_GARRISON_SET_FOLLOWER_INACTIVE               = 0x2F01B2, -    CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES         = 0x2F01C0, -    CMSG_GARRISON_SOCKET_TALENT                       = 0x2F029C, -    CMSG_GARRISON_START_MISSION                       = 0x2F01FE, -    CMSG_GARRISON_SWAP_BUILDINGS                      = 0x2F01AA, +    CMSG_GARRISON_ADD_FOLLOWER_HEALTH                 = 0x2F01D7, +    CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING         = 0x2F01BD, +    CMSG_GARRISON_CANCEL_CONSTRUCTION                 = 0x2F01AA, +    CMSG_GARRISON_CHECK_UPGRADEABLE                   = 0x2F020E, +    CMSG_GARRISON_COMPLETE_MISSION                    = 0x2F0200, +    CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS            = 0x2F01D8, +    CMSG_GARRISON_GENERATE_RECRUITS                   = 0x2F01C0, +    CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO        = 0x2F01CF, +    CMSG_GARRISON_GET_MAP_DATA                        = 0x2F01D6, +    CMSG_GARRISON_GET_MISSION_REWARD                  = 0x2F0230, +    CMSG_GARRISON_LEARN_TALENT                        = 0x2F01CB, +    CMSG_GARRISON_MISSION_BONUS_ROLL                  = 0x2F0202, +    CMSG_GARRISON_PURCHASE_BUILDING                   = 0x2F01A6, +    CMSG_GARRISON_RECRUIT_FOLLOWER                    = 0x2F01C2, +    CMSG_GARRISON_REMOVE_FOLLOWER                     = 0x2F01F7, +    CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING       = 0x2F01BE, +    CMSG_GARRISON_RENAME_FOLLOWER                     = 0x2F01BF, +    CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x2F01A5, +    CMSG_GARRISON_REQUEST_SHIPMENT_INFO               = 0x2F01DA, +    CMSG_GARRISON_RESEARCH_TALENT                     = 0x2F01C3, +    CMSG_GARRISON_SET_BUILDING_ACTIVE                 = 0x2F01A7, +    CMSG_GARRISON_SET_FOLLOWER_FAVORITE               = 0x2F01BB, +    CMSG_GARRISON_SET_FOLLOWER_INACTIVE               = 0x2F01B3, +    CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES         = 0x2F01C1, +    CMSG_GARRISON_SOCKET_TALENT                       = 0x2F029D, +    CMSG_GARRISON_START_MISSION                       = 0x2F01FF, +    CMSG_GARRISON_SWAP_BUILDINGS                      = 0x2F01AB,      CMSG_GENERATE_RANDOM_CHARACTER_NAME               = 0x340013,      CMSG_GET_ACCOUNT_CHARACTER_LIST                   = 0x3400E3, -    CMSG_GET_ACCOUNT_NOTIFICATIONS                    = 0x34015F, -    CMSG_GET_GARRISON_INFO                            = 0x2F019F, +    CMSG_GET_ACCOUNT_NOTIFICATIONS                    = 0x340161, +    CMSG_GET_GARRISON_INFO                            = 0x2F01A0,      CMSG_GET_ITEM_PURCHASE_DATA                       = 0x3000CD, -    CMSG_GET_LANDING_PAGE_SHIPMENTS                   = 0x2F01DA, -    CMSG_GET_MIRROR_IMAGE_DATA                        = 0x2F016E, +    CMSG_GET_LANDING_PAGE_SHIPMENTS                   = 0x2F01DB, +    CMSG_GET_MIRROR_IMAGE_DATA                        = 0x2F016F,      CMSG_GET_PVP_OPTIONS_ENABLED                      = 0x34001A, -    CMSG_GET_RAF_ACCOUNT_INFO                         = 0x34014D, -    CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA = 0x340190, -    CMSG_GET_REMAINING_GAME_TIME                      = 0x340119, -    CMSG_GET_TROPHY_LIST                              = 0x2F01EF, -    CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS       = 0x34010D, -    CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST               = 0x34011E, -    CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST           = 0x34011F, +    CMSG_GET_RAF_ACCOUNT_INFO                         = 0x34014F, +    CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA = 0x340192, +    CMSG_GET_REMAINING_GAME_TIME                      = 0x34011A, +    CMSG_GET_TROPHY_LIST                              = 0x2F01F0, +    CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS       = 0x34010E, +    CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST               = 0x34011F, +    CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST           = 0x340120,      CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY                 = 0x3400BC,      CMSG_GM_TICKET_GET_CASE_STATUS                    = 0x3400BB,      CMSG_GM_TICKET_GET_SYSTEM_STATUS                  = 0x3400BA, @@ -439,7 +440,7 @@ enum OpcodeClient : uint32      CMSG_GUILD_UPDATE_INFO_TEXT                       = 0x2D0016,      CMSG_GUILD_UPDATE_MOTD_TEXT                       = 0x2D0015,      CMSG_HEARTH_AND_RESURRECT                         = 0x30009F, -    CMSG_HIDE_QUEST_CHOICE                            = 0x2F017E, +    CMSG_HIDE_QUEST_CHOICE                            = 0x2F017F,      CMSG_HOTFIX_REQUEST                               = 0x340011,      CMSG_IGNORE_TRADE                                 = 0x2F0003,      CMSG_INITIATE_ROLE_POLL                           = 0x340006, @@ -447,68 +448,68 @@ enum OpcodeClient : uint32      CMSG_INSPECT                                      = 0x3000C7,      CMSG_INSTANCE_ABANDON_VOTE_RESPONSE               = 0x340061,      CMSG_INSTANCE_LOCK_RESPONSE                       = 0x3000A4, -    CMSG_ISLAND_QUEUE                                 = 0x2F0260, +    CMSG_ISLAND_QUEUE                                 = 0x2F0261,      CMSG_ITEM_PURCHASE_REFUND                         = 0x3000CE, -    CMSG_ITEM_TEXT_QUERY                              = 0x2F020E, -    CMSG_JOIN_PET_BATTLE_QUEUE                        = 0x2F008D, +    CMSG_ITEM_TEXT_QUERY                              = 0x2F020F, +    CMSG_JOIN_PET_BATTLE_QUEUE                        = 0x2F008E,      CMSG_JOIN_RATED_BATTLEGROUND                      = 0x2F0025,      CMSG_KEEP_ALIVE                                   = 0x3400AB, -    CMSG_KEYBOUND_OVERRIDE                            = 0x2F00E1, +    CMSG_KEYBOUND_OVERRIDE                            = 0x2F00E2,      CMSG_LATENCY_REPORT                               = 0x35000D,      CMSG_LEARN_PVP_TALENTS                            = 0x3000FA,      CMSG_LEARN_TALENTS                                = 0x3000F8,      CMSG_LEAVE_GROUP                                  = 0x340075, -    CMSG_LEAVE_PET_BATTLE_QUEUE                       = 0x2F008E, +    CMSG_LEAVE_PET_BATTLE_QUEUE                       = 0x2F008F,      CMSG_LFG_LIST_APPLY_TO_GROUP                      = 0x34003B,      CMSG_LFG_LIST_CANCEL_APPLICATION                  = 0x34003C,      CMSG_LFG_LIST_DECLINE_APPLICANT                   = 0x34003D,      CMSG_LFG_LIST_GET_STATUS                          = 0x340039,      CMSG_LFG_LIST_INVITE_APPLICANT                    = 0x34003E,      CMSG_LFG_LIST_INVITE_RESPONSE                     = 0x34003F, -    CMSG_LFG_LIST_JOIN                                = 0x2F0254, +    CMSG_LFG_LIST_JOIN                                = 0x2F0255,      CMSG_LFG_LIST_LEAVE                               = 0x340038,      CMSG_LFG_LIST_SEARCH                              = 0x34003A, -    CMSG_LFG_LIST_UPDATE_REQUEST                      = 0x2F0255, +    CMSG_LFG_LIST_UPDATE_REQUEST                      = 0x2F0256,      CMSG_LIST_INVENTORY                               = 0x300033,      CMSG_LIVE_REGION_ACCOUNT_RESTORE                  = 0x3400E6,      CMSG_LIVE_REGION_CHARACTER_COPY                   = 0x3400E5,      CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST       = 0x3400E4,      CMSG_LIVE_REGION_KEY_BINDINGS_COPY                = 0x3400E7,      CMSG_LOADING_SCREEN_NOTIFY                        = 0x340024, -    CMSG_LOAD_SELECTED_TROPHY                         = 0x2F01F0, -    CMSG_LOBBY_MATCHMAKER_ABANDON_QUEUE               = 0x340172, -    CMSG_LOBBY_MATCHMAKER_ACCEPT_PARTY_INVITE         = 0x340169, -    CMSG_LOBBY_MATCHMAKER_CREATE_CHARACTER            = 0x34017B, -    CMSG_LOBBY_MATCHMAKER_ENTER_QUEUE                 = 0x340170, -    CMSG_LOBBY_MATCHMAKER_LEAVE_PARTY                 = 0x34016C, -    CMSG_LOBBY_MATCHMAKER_PARTY_INVITE                = 0x340168, -    CMSG_LOBBY_MATCHMAKER_PARTY_UNINVITE              = 0x34016B, -    CMSG_LOBBY_MATCHMAKER_QUEUE_PROPSAL_RESPONSE      = 0x340171, -    CMSG_LOBBY_MATCHMAKER_REJECT_PARTY_INVITE         = 0x34016A, -    CMSG_LOBBY_MATCHMAKER_SET_PARTY_PLAYLIST_ENTRY    = 0x34016D, -    CMSG_LOBBY_MATCHMAKER_SET_PLAYER_READY            = 0x34016E, +    CMSG_LOAD_SELECTED_TROPHY                         = 0x2F01F1, +    CMSG_LOBBY_MATCHMAKER_ABANDON_QUEUE               = 0x340174, +    CMSG_LOBBY_MATCHMAKER_ACCEPT_PARTY_INVITE         = 0x34016B, +    CMSG_LOBBY_MATCHMAKER_CREATE_CHARACTER            = 0x34017D, +    CMSG_LOBBY_MATCHMAKER_ENTER_QUEUE                 = 0x340172, +    CMSG_LOBBY_MATCHMAKER_LEAVE_PARTY                 = 0x34016E, +    CMSG_LOBBY_MATCHMAKER_PARTY_INVITE                = 0x34016A, +    CMSG_LOBBY_MATCHMAKER_PARTY_UNINVITE              = 0x34016D, +    CMSG_LOBBY_MATCHMAKER_QUEUE_PROPSAL_RESPONSE      = 0x340173, +    CMSG_LOBBY_MATCHMAKER_REJECT_PARTY_INVITE         = 0x34016C, +    CMSG_LOBBY_MATCHMAKER_SET_PARTY_PLAYLIST_ENTRY    = 0x34016F, +    CMSG_LOBBY_MATCHMAKER_SET_PLAYER_READY            = 0x340170,      CMSG_LOGOUT_CANCEL                                = 0x300070,      CMSG_LOGOUT_INSTANT                               = 0x300071,      CMSG_LOGOUT_LOBBY_MATCHMAKER                      = 0x300122,      CMSG_LOGOUT_REQUEST                               = 0x30006F,      CMSG_LOG_DISCONNECT                               = 0x350005,      CMSG_LOG_STREAMING_ERROR                          = 0x350009, -    CMSG_LOOT_ITEM                                    = 0x2F00C9, -    CMSG_LOOT_MONEY                                   = 0x2F00C8, -    CMSG_LOOT_RELEASE                                 = 0x2F00CD, -    CMSG_LOOT_ROLL                                    = 0x2F00CE, -    CMSG_LOOT_UNIT                                    = 0x2F00C7, +    CMSG_LOOT_ITEM                                    = 0x2F00CA, +    CMSG_LOOT_MONEY                                   = 0x2F00C9, +    CMSG_LOOT_RELEASE                                 = 0x2F00CE, +    CMSG_LOOT_ROLL                                    = 0x2F00CF, +    CMSG_LOOT_UNIT                                    = 0x2F00C8,      CMSG_LOW_LEVEL_RAID1                              = 0x3400CE,      CMSG_LOW_LEVEL_RAID2                              = 0x3000AB,      CMSG_MAIL_CREATE_TEXT_ITEM                        = 0x3000D9, -    CMSG_MAIL_DELETE                                  = 0x2F00E3, +    CMSG_MAIL_DELETE                                  = 0x2F00E4,      CMSG_MAIL_GET_LIST                                = 0x3000D4,      CMSG_MAIL_MARK_AS_READ                            = 0x3000D8,      CMSG_MAIL_RETURN_TO_SENDER                        = 0x340081,      CMSG_MAIL_TAKE_ITEM                               = 0x3000D6,      CMSG_MAIL_TAKE_MONEY                              = 0x3000D5, -    CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT        = 0x2F00E4, -    CMSG_MASTER_LOOT_ITEM                             = 0x2F00CA, +    CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT        = 0x2F00E5, +    CMSG_MASTER_LOOT_ITEM                             = 0x2F00CB,      CMSG_MERGE_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM   = 0x300052,      CMSG_MERGE_GUILD_BANK_ITEM_WITH_ITEM              = 0x30004F,      CMSG_MERGE_ITEM_WITH_GUILD_BANK_ITEM              = 0x30004D, @@ -516,7 +517,7 @@ enum OpcodeClient : uint32      CMSG_MISSILE_TRAJECTORY_COLLISION                 = 0x2F0036,      CMSG_MOUNT_CLEAR_FANFARE                          = 0x290003,      CMSG_MOUNT_SET_FAVORITE                           = 0x34005C, -    CMSG_MOUNT_SPECIAL_ANIM                           = 0x2F0154, +    CMSG_MOUNT_SPECIAL_ANIM                           = 0x2F0155,      CMSG_MOVE_ADD_IMPULSE_ACK                         = 0x32006D,      CMSG_MOVE_APPLY_INERTIA_ACK                       = 0x32006B,      CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK                = 0x320031, @@ -609,29 +610,29 @@ enum OpcodeClient : uint32      CMSG_MOVE_UPDATE_FALL_SPEED                       = 0x320036,      CMSG_MOVE_WATER_WALK_ACK                          = 0x320039,      CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS                = 0x2C0001, -    CMSG_NEUTRAL_PLAYER_SELECT_FACTION                = 0x2F0083, +    CMSG_NEUTRAL_PLAYER_SELECT_FACTION                = 0x2F0084,      CMSG_NEXT_CINEMATIC_CAMERA                        = 0x3000E2,      CMSG_OBJECT_UPDATE_FAILED                         = 0x2F002C,      CMSG_OBJECT_UPDATE_RESCUED                        = 0x2F002D, -    CMSG_OFFER_PETITION                               = 0x2F0286, +    CMSG_OFFER_PETITION                               = 0x2F0287,      CMSG_OPENING_CINEMATIC                            = 0x3000E1, -    CMSG_OPEN_ITEM                                    = 0x2F020F, -    CMSG_OPEN_MISSION_NPC                             = 0x2F01D0, -    CMSG_OPEN_SHIPMENT_NPC                            = 0x2F01D8, -    CMSG_OPEN_TRADESKILL_NPC                          = 0x2F01E3, +    CMSG_OPEN_ITEM                                    = 0x2F0210, +    CMSG_OPEN_MISSION_NPC                             = 0x2F01D1, +    CMSG_OPEN_SHIPMENT_NPC                            = 0x2F01D9, +    CMSG_OPEN_TRADESKILL_NPC                          = 0x2F01E4,      CMSG_OPT_OUT_OF_LOOT                              = 0x30008E,      CMSG_OVERRIDE_SCREEN_FLASH                        = 0x3000B8,      CMSG_PARTY_INVITE                                 = 0x340030,      CMSG_PARTY_INVITE_RESPONSE                        = 0x340032,      CMSG_PARTY_UNINVITE                               = 0x340073, -    CMSG_PERFORM_ITEM_INTERACTION                     = 0x2F00EC, -    CMSG_PERKS_PROGRAM_ITEMS_REFRESHED                = 0x2F02AE, -    CMSG_PERKS_PROGRAM_REQUEST_CART_CHECKOUT          = 0x2F02B1, +    CMSG_PERFORM_ITEM_INTERACTION                     = 0x2F00ED, +    CMSG_PERKS_PROGRAM_ITEMS_REFRESHED                = 0x2F02AF, +    CMSG_PERKS_PROGRAM_REQUEST_CART_CHECKOUT          = 0x2F02B2,      CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS        = 0x290012, -    CMSG_PERKS_PROGRAM_REQUEST_PURCHASE               = 0x2F02B0, -    CMSG_PERKS_PROGRAM_REQUEST_REFUND                 = 0x2F02B2, -    CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM         = 0x2F02B3, -    CMSG_PERKS_PROGRAM_STATUS_REQUEST                 = 0x2F02AF, +    CMSG_PERKS_PROGRAM_REQUEST_PURCHASE               = 0x2F02B1, +    CMSG_PERKS_PROGRAM_REQUEST_REFUND                 = 0x2F02B3, +    CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM         = 0x2F02B4, +    CMSG_PERKS_PROGRAM_STATUS_REQUEST                 = 0x2F02B0,      CMSG_PETITION_BUY                                 = 0x30005A,      CMSG_PETITION_RENAME_GUILD                        = 0x3400F7,      CMSG_PETITION_SHOW_LIST                           = 0x300059, @@ -639,18 +640,18 @@ enum OpcodeClient : uint32      CMSG_PET_ABANDON                                  = 0x30001E,      CMSG_PET_ABANDON_BY_NUMBER                        = 0x30001F,      CMSG_PET_ACTION                                   = 0x30001C, -    CMSG_PET_BATTLE_FINAL_NOTIFY                      = 0x2F0092, +    CMSG_PET_BATTLE_FINAL_NOTIFY                      = 0x2F0093,      CMSG_PET_BATTLE_INPUT                             = 0x34006D, -    CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT        = 0x2F00E2, -    CMSG_PET_BATTLE_QUIT_NOTIFY                       = 0x2F0091, +    CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT        = 0x2F00E3, +    CMSG_PET_BATTLE_QUIT_NOTIFY                       = 0x2F0092,      CMSG_PET_BATTLE_REPLACE_FRONT_PET                 = 0x34006E, -    CMSG_PET_BATTLE_REQUEST_PVP                       = 0x2F008B, -    CMSG_PET_BATTLE_REQUEST_UPDATE                    = 0x2F008C, -    CMSG_PET_BATTLE_REQUEST_WILD                      = 0x2F0089, -    CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY               = 0x2F0093, -    CMSG_PET_BATTLE_WILD_LOCATION_FAIL                = 0x3D008A, +    CMSG_PET_BATTLE_REQUEST_PVP                       = 0x2F008C, +    CMSG_PET_BATTLE_REQUEST_UPDATE                    = 0x2F008D, +    CMSG_PET_BATTLE_REQUEST_WILD                      = 0x2F008A, +    CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY               = 0x2F0094, +    CMSG_PET_BATTLE_WILD_LOCATION_FAIL                = 0x2F008B,      CMSG_PET_CANCEL_AURA                              = 0x300020, -    CMSG_PET_CAST_SPELL                               = 0x2F0173, +    CMSG_PET_CAST_SPELL                               = 0x2F0174,      CMSG_PET_RENAME                                   = 0x3400B0,      CMSG_PET_SET_ACTION                               = 0x30001B,      CMSG_PET_SPELL_AUTOCAST                           = 0x300021, @@ -659,32 +660,32 @@ enum OpcodeClient : uint32      CMSG_PLAYER_LOGIN                                 = 0x340016,      CMSG_PUSH_QUEST_TO_PARTY                          = 0x300031,      CMSG_PVP_LOG_DATA                                 = 0x2F0028, -    CMSG_QUERY_BATTLE_PET_NAME                        = 0x2F0147, +    CMSG_QUERY_BATTLE_PET_NAME                        = 0x2F0148,      CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT            = 0x34008C,      CMSG_QUERY_CORPSE_TRANSPORT                       = 0x34008D,      CMSG_QUERY_COUNTDOWN_TIMER                        = 0x2F0055, -    CMSG_QUERY_CREATURE                               = 0x2F0141, -    CMSG_QUERY_GAME_OBJECT                            = 0x2F0142, -    CMSG_QUERY_GARRISON_PET_NAME                      = 0x2F0148, +    CMSG_QUERY_CREATURE                               = 0x2F0142, +    CMSG_QUERY_GAME_OBJECT                            = 0x2F0143, +    CMSG_QUERY_GARRISON_PET_NAME                      = 0x2F0149,      CMSG_QUERY_GUILD_INFO                             = 0x3400B6,      CMSG_QUERY_INSPECT_ACHIEVEMENTS                   = 0x300098,      CMSG_QUERY_NEXT_MAIL_TIME                         = 0x3000D7, -    CMSG_QUERY_NPC_TEXT                               = 0x2F0143, -    CMSG_QUERY_PAGE_TEXT                              = 0x2F0145, -    CMSG_QUERY_PETITION                               = 0x2F0149, -    CMSG_QUERY_PET_NAME                               = 0x2F0146, +    CMSG_QUERY_NPC_TEXT                               = 0x2F0144, +    CMSG_QUERY_PAGE_TEXT                              = 0x2F0146, +    CMSG_QUERY_PETITION                               = 0x2F014A, +    CMSG_QUERY_PET_NAME                               = 0x2F0147,      CMSG_QUERY_PLAYER_NAMES                           = 0x35000E,      CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY             = 0x35000C,      CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID            = 0x35000B,      CMSG_QUERY_QUEST_COMPLETION_NPCS                  = 0x2F0021, -    CMSG_QUERY_QUEST_INFO                             = 0x2F0144, +    CMSG_QUERY_QUEST_INFO                             = 0x2F0145,      CMSG_QUERY_QUEST_ITEM_USABILITY                   = 0x2F0022,      CMSG_QUERY_REALM_NAME                             = 0x3400B5,      CMSG_QUERY_SCENARIO_POI                           = 0x340082, -    CMSG_QUERY_SELECTED_WOW_LABS_AREA                 = 0x2F02EA, +    CMSG_QUERY_SELECTED_WOW_LABS_AREA                 = 0x2F02EB,      CMSG_QUERY_TIME                                   = 0x30006E, -    CMSG_QUERY_TREASURE_PICKER                        = 0x2F0232, -    CMSG_QUERY_WOW_LABS_AREA_INFO                     = 0x2F02EB, +    CMSG_QUERY_TREASURE_PICKER                        = 0x2F0233, +    CMSG_QUERY_WOW_LABS_AREA_INFO                     = 0x2F02EC,      CMSG_QUEST_CONFIRM_ACCEPT                         = 0x300030,      CMSG_QUEST_GIVER_ACCEPT_QUEST                     = 0x30002A,      CMSG_QUEST_GIVER_CHOOSE_REWARD                    = 0x30002C, @@ -698,114 +699,118 @@ enum OpcodeClient : uint32      CMSG_QUEST_LOG_REMOVE_QUEST                       = 0x3000CC,      CMSG_QUEST_POI_QUERY                              = 0x3400DD,      CMSG_QUEST_PUSH_RESULT                            = 0x300032, -    CMSG_QUEST_SESSION_BEGIN_RESPONSE                 = 0x2F0278, -    CMSG_QUEST_SESSION_REQUEST_START                  = 0x2F0277, -    CMSG_QUEST_SESSION_REQUEST_STOP                   = 0x340158, +    CMSG_QUEST_SESSION_BEGIN_RESPONSE                 = 0x2F0279, +    CMSG_QUEST_SESSION_REQUEST_START                  = 0x2F0278, +    CMSG_QUEST_SESSION_REQUEST_STOP                   = 0x34015A,      CMSG_QUEUED_MESSAGES_END                          = 0x350008, -    CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS              = 0x340130, -    CMSG_QUICK_JOIN_REQUEST_INVITE                    = 0x34012F, -    CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION  = 0x34015D, -    CMSG_QUICK_JOIN_RESPOND_TO_INVITE                 = 0x34012E, -    CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED            = 0x34012D, +    CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS              = 0x340131, +    CMSG_QUICK_JOIN_REQUEST_INVITE                    = 0x340130, +    CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION  = 0x34015F, +    CMSG_QUICK_JOIN_RESPOND_TO_INVITE                 = 0x34012F, +    CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED            = 0x34012E,      CMSG_RAF_CLAIM_ACTIVITY_REWARD                    = 0x30009C, -    CMSG_RAF_CLAIM_NEXT_REWARD                        = 0x34014E, -    CMSG_RAF_GENERATE_RECRUITMENT_LINK                = 0x340150, -    CMSG_RAF_UPDATE_RECRUITMENT_INFO                  = 0x34014F, +    CMSG_RAF_CLAIM_NEXT_REWARD                        = 0x340150, +    CMSG_RAF_GENERATE_RECRUITMENT_LINK                = 0x340152, +    CMSG_RAF_UPDATE_RECRUITMENT_INFO                  = 0x340151,      CMSG_RANDOM_ROLL                                  = 0x340080,      CMSG_READY_CHECK_RESPONSE                         = 0x34005F, -    CMSG_READ_ITEM                                    = 0x2F0210, +    CMSG_READ_ITEM                                    = 0x2F0211, +    CMSG_RECENT_ALLY_REQUEST_DATA                     = 0x340197, +    CMSG_RECENT_ALLY_SET_NOTE                         = 0x340198,      CMSG_RECLAIM_CORPSE                               = 0x300073, -    CMSG_REMOVE_NEW_ITEM                              = 0x2F0236, -    CMSG_REMOVE_RAF_RECRUIT                           = 0x340151, +    CMSG_REMOVE_NEW_ITEM                              = 0x2F0237, +    CMSG_REMOVE_RAF_RECRUIT                           = 0x340153,      CMSG_REORDER_CHARACTERS                           = 0x340015,      CMSG_REPAIR_ITEM                                  = 0x300084, -    CMSG_REPLACE_TROPHY                               = 0x2F01F1, +    CMSG_REPLACE_TROPHY                               = 0x2F01F2,      CMSG_REPOP_REQUEST                                = 0x3000C4,      CMSG_REPORT_PVP_PLAYER_AFK                        = 0x30008C, -    CMSG_REPORT_SERVER_LAG                            = 0x2F0270, -    CMSG_REPORT_STUCK_IN_COMBAT                       = 0x2F0271, +    CMSG_REPORT_SERVER_LAG                            = 0x2F0271, +    CMSG_REPORT_STUCK_IN_COMBAT                       = 0x2F0272,      CMSG_REQUEST_ACCOUNT_DATA                         = 0x3400C2, -    CMSG_REQUEST_AREA_POI_UPDATE                      = 0x2F0234, +    CMSG_REQUEST_AREA_POI_UPDATE                      = 0x2F0235,      CMSG_REQUEST_BATTLEFIELD_STATUS                   = 0x340008,      CMSG_REQUEST_CEMETERY_LIST                        = 0x2F0023,      CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO          = 0x3400B7, -    CMSG_REQUEST_COVENANT_CALLINGS                    = 0x2F0262, +    CMSG_REQUEST_COVENANT_CALLINGS                    = 0x2F0263,      CMSG_REQUEST_CROWD_CONTROL_SPELL                  = 0x3000C8,      CMSG_REQUEST_CURRENCY_DATA_FOR_ACCOUNT_CHARACTERS = 0x290019, -    CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS  = 0x2F029B, +    CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS  = 0x2F029C,      CMSG_REQUEST_GUILD_PARTY_STATE                    = 0x2F0054,      CMSG_REQUEST_GUILD_REWARDS_LIST                   = 0x2F0053, -    CMSG_REQUEST_LATEST_SPLASH_SCREEN                 = 0x2F0272, -    CMSG_REQUEST_LFG_LIST_BLACKLIST                   = 0x2F017F, -    CMSG_REQUEST_MYTHIC_PLUS_AFFIXES                  = 0x2F00B7, -    CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA              = 0x2F00B8, -    CMSG_REQUEST_PARTY_ELIGIBILITY_FOR_DELVE_TIERS    = 0x2F02E9, +    CMSG_REQUEST_LATEST_SPLASH_SCREEN                 = 0x2F0273, +    CMSG_REQUEST_LFG_LIST_BLACKLIST                   = 0x2F0180, +    CMSG_REQUEST_MYTHIC_PLUS_AFFIXES                  = 0x2F00B8, +    CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA              = 0x2F00B9, +    CMSG_REQUEST_PARTY_ELIGIBILITY_FOR_DELVE_TIERS    = 0x2F02EA,      CMSG_REQUEST_PARTY_JOIN_UPDATES                   = 0x340023,      CMSG_REQUEST_PARTY_MEMBER_STATS                   = 0x34007F,      CMSG_REQUEST_PET_INFO                             = 0x300022, -    CMSG_REQUEST_PLAYED_TIME                          = 0x2F014C, +    CMSG_REQUEST_PLAYED_TIME                          = 0x2F014D,      CMSG_REQUEST_PVP_REWARDS                          = 0x2F0041,      CMSG_REQUEST_RAID_INFO                            = 0x3400F8,      CMSG_REQUEST_RATED_PVP_INFO                       = 0x34000F, -    CMSG_REQUEST_REALM_GUILD_MASTER_INFO              = 0x340193, -    CMSG_REQUEST_SCHEDULED_AREA_POI_UPDATE            = 0x2F0235, +    CMSG_REQUEST_REALM_GUILD_MASTER_INFO              = 0x340195, +    CMSG_REQUEST_SCHEDULED_AREA_POI_UPDATE            = 0x2F0236,      CMSG_REQUEST_SCHEDULED_PVP_INFO                   = 0x2F0042,      CMSG_REQUEST_STABLED_PETS                         = 0x300023,      CMSG_REQUEST_STORE_FRONT_INFO_UPDATE              = 0x29001E, -    CMSG_REQUEST_VEHICLE_EXIT                         = 0x2F00FE, -    CMSG_REQUEST_VEHICLE_NEXT_SEAT                    = 0x2F0100, -    CMSG_REQUEST_VEHICLE_PREV_SEAT                    = 0x2F00FF, -    CMSG_REQUEST_VEHICLE_SWITCH_SEAT                  = 0x2F0101, -    CMSG_REQUEST_WEEKLY_REWARDS                       = 0x2F0265, -    CMSG_REQUEST_WORLD_QUEST_UPDATE                   = 0x2F0233, -    CMSG_RESET_CHALLENGE_MODE                         = 0x2F00B5, -    CMSG_RESET_CHALLENGE_MODE_CHEAT                   = 0x2F00B6, +    CMSG_REQUEST_SURVEY                               = 0x2F02FD, +    CMSG_REQUEST_VEHICLE_EXIT                         = 0x2F00FF, +    CMSG_REQUEST_VEHICLE_NEXT_SEAT                    = 0x2F0101, +    CMSG_REQUEST_VEHICLE_PREV_SEAT                    = 0x2F0100, +    CMSG_REQUEST_VEHICLE_SWITCH_SEAT                  = 0x2F0102, +    CMSG_REQUEST_WEEKLY_REWARDS                       = 0x2F0266, +    CMSG_REQUEST_WORLD_QUEST_UPDATE                   = 0x2F0234, +    CMSG_RESET_CHALLENGE_MODE                         = 0x2F00B6, +    CMSG_RESET_CHALLENGE_MODE_CHEAT                   = 0x2F00B7,      CMSG_RESET_INSTANCES                              = 0x340094,      CMSG_RESURRECT_RESPONSE                           = 0x3400AF, -    CMSG_REVERT_MONUMENT_APPEARANCE                   = 0x2F01F3, -    CMSG_RIDE_VEHICLE_INTERACT                        = 0x2F0102, -    CMSG_RPE_RESET_CHARACTER                          = 0x34017E, -    CMSG_SAVE_ACCOUNT_DATA_EXPORT                     = 0x340178, +    CMSG_REVERT_MONUMENT_APPEARANCE                   = 0x2F01F4, +    CMSG_RIDE_VEHICLE_INTERACT                        = 0x2F0103, +    CMSG_RPE_RESET_CHARACTER                          = 0x340180, +    CMSG_SAVE_ACCOUNT_DATA_EXPORT                     = 0x34017A,      CMSG_SAVE_CUF_PROFILES                            = 0x2F0037,      CMSG_SAVE_EQUIPMENT_SET                           = 0x3000A2, -    CMSG_SAVE_GUILD_EMBLEM                            = 0x2F0184, -    CMSG_SAVE_PERSONAL_EMBLEM                         = 0x2F0185, -    CMSG_SCENE_PLAYBACK_CANCELED                      = 0x2F00DE, -    CMSG_SCENE_PLAYBACK_COMPLETE                      = 0x2F00DD, -    CMSG_SCENE_TRIGGER_EVENT                          = 0x2F00DF, -    CMSG_SEAMLESS_TRANSFER_COMPLETE                   = 0x2F02D8, -    CMSG_SELECT_WOW_LABS_AREA                         = 0x2F02EC, +    CMSG_SAVE_GUILD_EMBLEM                            = 0x2F0185, +    CMSG_SAVE_PERSONAL_EMBLEM                         = 0x2F0186, +    CMSG_SCENE_PLAYBACK_CANCELED                      = 0x2F00DF, +    CMSG_SCENE_PLAYBACK_COMPLETE                      = 0x2F00DE, +    CMSG_SCENE_TRIGGER_EVENT                          = 0x2F00E0, +    CMSG_SEAMLESS_TRANSFER_COMPLETE                   = 0x2F02D9, +    CMSG_SELECT_WOW_LABS_AREA                         = 0x2F02ED,      CMSG_SELF_RES                                     = 0x3000CF,      CMSG_SELL_ALL_JUNK_ITEMS                          = 0x300035,      CMSG_SELL_ITEM                                    = 0x300034, -    CMSG_SEND_CHARACTER_CLUB_INVITATION               = 0x340126, -    CMSG_SEND_CONTACT_LIST                            = 0x3400FD, +    CMSG_SEND_CHARACTER_CLUB_INVITATION               = 0x340127, +    CMSG_SEND_CONTACT_LIST                            = 0x3400FE,      CMSG_SEND_MAIL                                    = 0x340026, -    CMSG_SEND_PING_UNIT                               = 0x2F02DA, -    CMSG_SEND_PING_WORLD_POINT                        = 0x2F02DB, +    CMSG_SEND_PING_UNIT                               = 0x2F02DB, +    CMSG_SEND_PING_WORLD_POINT                        = 0x2F02DC,      CMSG_SEND_TEXT_EMOTE                              = 0x300019,      CMSG_SERVER_TIME_OFFSET_REQUEST                   = 0x3400C9, -    CMSG_SETUP_WARBAND_GROUPS                         = 0x34018C, +    CMSG_SETUP_WARBAND_GROUPS                         = 0x34018E,      CMSG_SET_ACTION_BAR_TOGGLES                       = 0x3000D0,      CMSG_SET_ACTION_BUTTON                            = 0x340062,      CMSG_SET_ACTIVE_MOVER                             = 0x320059, -    CMSG_SET_ADVANCED_COMBAT_LOGGING                  = 0x2F0192, +    CMSG_SET_ADVANCED_COMBAT_LOGGING                  = 0x2F0193, +    CMSG_SET_ALLOW_RECENT_ALLIES_SEE_LOCATION         = 0x2F02FE,      CMSG_SET_ASSISTANT_LEADER                         = 0x34007B, -    CMSG_SET_BACKPACK_AUTOSORT_DISABLED               = 0x2F0213, -    CMSG_SET_BACKPACK_SELL_JUNK_DISABLED              = 0x2F0214, -    CMSG_SET_BANK_AUTOSORT_DISABLED                   = 0x2F0215, -    CMSG_SET_CONTACT_NOTES                            = 0x340100, +    CMSG_SET_BACKPACK_AUTOSORT_DISABLED               = 0x2F0214, +    CMSG_SET_BACKPACK_SELL_JUNK_DISABLED              = 0x2F0215, +    CMSG_SET_BANK_AUTOSORT_DISABLED                   = 0x2F0216, +    CMSG_SET_CONTACT_NOTES                            = 0x340101,      CMSG_SET_CURRENCY_FLAGS                           = 0x2F0015, -    CMSG_SET_DIFFICULTY_ID                            = 0x2F00E0, +    CMSG_SET_DIFFICULTY_ID                            = 0x2F00E1,      CMSG_SET_DUNGEON_DIFFICULTY                       = 0x3400AE, -    CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT           = 0x2F013B, +    CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT           = 0x2F013C,      CMSG_SET_EVERYONE_IS_ASSISTANT                    = 0x340046, -    CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES             = 0x340131, +    CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES             = 0x340132,      CMSG_SET_FACTION_AT_WAR                           = 0x300076,      CMSG_SET_FACTION_INACTIVE                         = 0x300078,      CMSG_SET_FACTION_NOT_AT_WAR                       = 0x300077,      CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE              = 0x2F0065, -    CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT               = 0x2F0217, +    CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT               = 0x2F0218,      CMSG_SET_LOOT_METHOD                              = 0x340074,      CMSG_SET_LOOT_SPECIALIZATION                      = 0x3000DD,      CMSG_SET_PARTY_ASSIGNMENT                         = 0x34007D, @@ -815,35 +820,35 @@ enum OpcodeClient : uint32      CMSG_SET_PET_SPECIALIZATION                       = 0x2F0013,      CMSG_SET_PLAYER_DECLINED_NAMES                    = 0x3400B4,      CMSG_SET_PREFERRED_CEMETERY                       = 0x2F0024, -    CMSG_SET_PVP                                      = 0x2F0189, -    CMSG_SET_RAID_DIFFICULTY                          = 0x340109, +    CMSG_SET_PVP                                      = 0x2F018A, +    CMSG_SET_RAID_DIFFICULTY                          = 0x34010A,      CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS             = 0x340047,      CMSG_SET_ROLE                                     = 0x340005,      CMSG_SET_SAVED_INSTANCE_EXTEND                    = 0x3400B2,      CMSG_SET_SELECTION                                = 0x3000C6,      CMSG_SET_SHEATHED                                 = 0x30001A, -    CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT                  = 0x2F0216, +    CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT                  = 0x2F0217,      CMSG_SET_TAXI_BENCHMARK_MODE                      = 0x30008B, -    CMSG_SET_TITLE                                    = 0x2F0152, +    CMSG_SET_TITLE                                    = 0x2F0153,      CMSG_SET_TRADE_CURRENCY                           = 0x2F000A,      CMSG_SET_TRADE_GOLD                               = 0x2F0009,      CMSG_SET_TRADE_ITEM                               = 0x2F0007, -    CMSG_SET_USING_PARTY_GARRISON                     = 0x2F01D2, -    CMSG_SET_WAR_MODE                                 = 0x2F018A, +    CMSG_SET_USING_PARTY_GARRISON                     = 0x2F01D3, +    CMSG_SET_WAR_MODE                                 = 0x2F018B,      CMSG_SET_WATCHED_FACTION                          = 0x300079,      CMSG_SHOW_TRADE_SKILL                             = 0x3400F0,      CMSG_SIGN_PETITION                                = 0x3000D1,      CMSG_SILENCE_PARTY_TALKER                         = 0x34007E, -    CMSG_SOCIAL_CONTRACT_REQUEST                      = 0x340173, +    CMSG_SOCIAL_CONTRACT_REQUEST                      = 0x340175,      CMSG_SOCKET_GEMS                                  = 0x300083, -    CMSG_SORT_ACCOUNT_BANK_BAGS                       = 0x2F02DE, -    CMSG_SORT_BAGS                                    = 0x2F0218, -    CMSG_SORT_BANK_BAGS                               = 0x2F0219, -    CMSG_SPAWN_TRACKING_UPDATE                        = 0x2F0167, -    CMSG_SPECTATE_CHANGE                              = 0x2F02D1, +    CMSG_SORT_ACCOUNT_BANK_BAGS                       = 0x2F02DF, +    CMSG_SORT_BAGS                                    = 0x2F0219, +    CMSG_SORT_BANK_BAGS                               = 0x2F021A, +    CMSG_SPAWN_TRACKING_UPDATE                        = 0x2F0168, +    CMSG_SPECTATE_CHANGE                              = 0x2F02D2,      CMSG_SPELL_CLICK                                  = 0x300027, -    CMSG_SPELL_EMPOWER_RELEASE                        = 0x2F0139, -    CMSG_SPELL_EMPOWER_RESTART                        = 0x2F013A, +    CMSG_SPELL_EMPOWER_RELEASE                        = 0x2F013A, +    CMSG_SPELL_EMPOWER_RESTART                        = 0x2F013B,      CMSG_SPIRIT_HEALER_ACTIVATE                       = 0x300042,      CMSG_SPLIT_GUILD_BANK_ITEM                        = 0x300053,      CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY           = 0x300050, @@ -856,7 +861,7 @@ enum OpcodeClient : uint32      CMSG_START_WAR_GAME                               = 0x34000A,      CMSG_STORE_GUILD_BANK_ITEM                        = 0x300049,      CMSG_SUBMIT_USER_FEEDBACK                         = 0x3400C1, -    CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE           = 0x2F0290, +    CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE           = 0x2F0291,      CMSG_SUMMON_RESPONSE                              = 0x340096,      CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT              = 0x340072,      CMSG_SURRENDER_ARENA                              = 0x2F0020, @@ -867,7 +872,7 @@ enum OpcodeClient : uint32      CMSG_SWAP_ITEM                                    = 0x310006,      CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM               = 0x30004A,      CMSG_SWAP_SUB_GROUPS                              = 0x340079, -    CMSG_TABARD_VENDOR_ACTIVATE                       = 0x2F0186, +    CMSG_TABARD_VENDOR_ACTIVATE                       = 0x2F0187,      CMSG_TALK_TO_GOSSIP                               = 0x300024,      CMSG_TAXI_NODE_STATUS_QUERY                       = 0x30003B,      CMSG_TAXI_QUERY_AVAILABLE_NODES                   = 0x30003D, @@ -877,56 +882,56 @@ enum OpcodeClient : uint32      CMSG_TIME_SYNC_RESPONSE_DROPPED                   = 0x32005C,      CMSG_TIME_SYNC_RESPONSE_FAILED                    = 0x32005B,      CMSG_TOGGLE_DIFFICULTY                            = 0x340083, -    CMSG_TOGGLE_PVP                                   = 0x2F0188, +    CMSG_TOGGLE_PVP                                   = 0x2F0189,      CMSG_TOTEM_DESTROYED                              = 0x300090,      CMSG_TOY_CLEAR_FANFARE                            = 0x290004, -    CMSG_TRADE_SKILL_SET_FAVORITE                     = 0x2F0231, +    CMSG_TRADE_SKILL_SET_FAVORITE                     = 0x2F0232,      CMSG_TRAINER_BUY_SPELL                            = 0x300041,      CMSG_TRAINER_LIST                                 = 0x300040, -    CMSG_TRAITS_COMMIT_CONFIG                         = 0x2F02B9, -    CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS            = 0x2F02B7, -    CMSG_TRANSFER_CURRENCY_FROM_ACCOUNT_CHARACTER     = 0x2F02E7, +    CMSG_TRAITS_COMMIT_CONFIG                         = 0x2F02BA, +    CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS            = 0x2F02B8, +    CMSG_TRANSFER_CURRENCY_FROM_ACCOUNT_CHARACTER     = 0x2F02E8,      CMSG_TRANSMOGRIFY_ITEMS                           = 0x2F0043,      CMSG_TURN_IN_PETITION                             = 0x3000D3, -    CMSG_TUTORIAL                                     = 0x34010A, -    CMSG_UI_MAP_QUEST_LINES_REQUEST                   = 0x2F0261, +    CMSG_TUTORIAL                                     = 0x34010B, +    CMSG_UI_MAP_QUEST_LINES_REQUEST                   = 0x2F0262,      CMSG_UNACCEPT_TRADE                               = 0x2F0005, -    CMSG_UNDELETE_CHARACTER                           = 0x34010C, +    CMSG_UNDELETE_CHARACTER                           = 0x34010D,      CMSG_UNLEARN_SKILL                                = 0x30007D,      CMSG_UNLEARN_SPECIALIZATION                       = 0x2F0051, -    CMSG_UPDATE_AADC_STATUS                           = 0x340163, +    CMSG_UPDATE_AADC_STATUS                           = 0x340165,      CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS             = 0x30012A,      CMSG_UPDATE_ACCOUNT_DATA                          = 0x3400C3, -    CMSG_UPDATE_AREA_TRIGGER_VISUAL                   = 0x2F0176, +    CMSG_UPDATE_AREA_TRIGGER_VISUAL                   = 0x2F0177,      CMSG_UPDATE_CLIENT_SETTINGS                       = 0x340090, -    CMSG_UPDATE_CRAFTING_NPC_RECIPES                  = 0x2F01E4, +    CMSG_UPDATE_CRAFTING_NPC_RECIPES                  = 0x2F01E5,      CMSG_UPDATE_MISSILE_TRAJECTORY                    = 0x320060,      CMSG_UPDATE_RAID_TARGET                           = 0x34007C, -    CMSG_UPDATE_SPELL_VISUAL                          = 0x2F0175, -    CMSG_UPDATE_VAS_PURCHASE_STATES                   = 0x340121, -    CMSG_UPGRADE_GARRISON                             = 0x2F019A, -    CMSG_UPGRADE_RUNEFORGE_LEGENDARY                  = 0x2F028E, +    CMSG_UPDATE_SPELL_VISUAL                          = 0x2F0176, +    CMSG_UPDATE_VAS_PURCHASE_STATES                   = 0x340122, +    CMSG_UPGRADE_GARRISON                             = 0x2F019B, +    CMSG_UPGRADE_RUNEFORGE_LEGENDARY                  = 0x2F028F,      CMSG_USED_FOLLOW                                  = 0x2F0032, -    CMSG_USE_CRITTER_ITEM                             = 0x2F0108, +    CMSG_USE_CRITTER_ITEM                             = 0x2F0109,      CMSG_USE_EQUIPMENT_SET                            = 0x310001, -    CMSG_USE_ITEM                                     = 0x2F016F, -    CMSG_USE_TOY                                      = 0x2F0172, -    CMSG_VAS_CHECK_TRANSFER_OK                        = 0x340136, -    CMSG_VAS_GET_QUEUE_MINUTES                        = 0x340135, -    CMSG_VAS_GET_SERVICE_STATUS                       = 0x340134, +    CMSG_USE_ITEM                                     = 0x2F0170, +    CMSG_USE_TOY                                      = 0x2F0173, +    CMSG_VAS_CHECK_TRANSFER_OK                        = 0x340138, +    CMSG_VAS_GET_QUEUE_MINUTES                        = 0x340137, +    CMSG_VAS_GET_SERVICE_STATUS                       = 0x340136,      CMSG_VIOLENCE_LEVEL                               = 0x2F0030, -    CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST              = 0x34013A, -    CMSG_VOICE_CHAT_JOIN_CHANNEL                      = 0x34013B, -    CMSG_VOICE_CHAT_LOGIN                             = 0x340139, +    CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST              = 0x34013C, +    CMSG_VOICE_CHAT_JOIN_CHANNEL                      = 0x34013D, +    CMSG_VOICE_CHAT_LOGIN                             = 0x34013B,      CMSG_WARDEN3_DATA                                 = 0x340018,      CMSG_WHO                                          = 0x3400AD,      CMSG_WHO_IS                                       = 0x3400AC, -    CMSG_WORLD_LOOT_OBJECT_CLICK                      = 0x2F02D4, +    CMSG_WORLD_LOOT_OBJECT_CLICK                      = 0x2F02D5,      CMSG_WORLD_PORT_RESPONSE                          = 0x340025,      CMSG_WRAP_ITEM                                    = 0x310000,  }; -inline constexpr std::size_t NUM_CMSG_OPCODES = 1735; +inline constexpr std::size_t NUM_CMSG_OPCODES = 1758;  inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode)  { @@ -937,12 +942,12 @@ inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode)          case 0x2B: return idInGroup < 51 ? idInGroup + 31 : -1;          case 0x2C: return idInGroup < 3 ? idInGroup + 82 : -1;          case 0x2D: return idInGroup < 37 ? idInGroup + 85 : -1; -        case 0x2F: return idInGroup < 751 ? idInGroup + 122 : -1; -        case 0x30: return idInGroup < 301 ? idInGroup + 873 : -1; -        case 0x31: return idInGroup < 10 ? idInGroup + 1174 : -1; -        case 0x32: return idInGroup < 132 ? idInGroup + 1184 : -1; -        case 0x34: return idInGroup < 404 ? idInGroup + 1316 : -1; -        case 0x35: return idInGroup < 15 ? idInGroup + 1720 : -1; +        case 0x2F: return idInGroup < 767 ? idInGroup + 122 : -1; +        case 0x30: return idInGroup < 301 ? idInGroup + 889 : -1; +        case 0x31: return idInGroup < 10 ? idInGroup + 1190 : -1; +        case 0x32: return idInGroup < 132 ? idInGroup + 1200 : -1; +        case 0x34: return idInGroup < 411 ? idInGroup + 1332 : -1; +        case 0x35: return idInGroup < 15 ? idInGroup + 1743 : -1;          default: return -1;      }  } @@ -950,20 +955,20 @@ inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode)  enum OpcodeServer : uint32  {      SMSG_ABORT_NEW_WORLD                              = 0x360030, -    SMSG_ACCOUNT_CHARACTER_CURRENCY_LISTS             = 0x360346, -    SMSG_ACCOUNT_CONVERSION_STATE_UPDATE              = 0x36034B, -    SMSG_ACCOUNT_COSMETIC_ADDED                       = 0x3602FF, -    SMSG_ACCOUNT_CRITERIA_UPDATE                      = 0x3602E7, +    SMSG_ACCOUNT_CHARACTER_CURRENCY_LISTS             = 0x360347, +    SMSG_ACCOUNT_CONVERSION_STATE_UPDATE              = 0x36034C, +    SMSG_ACCOUNT_COSMETIC_ADDED                       = 0x360300, +    SMSG_ACCOUNT_CRITERIA_UPDATE                      = 0x3602E8,      SMSG_ACCOUNT_DATA_TIMES                           = 0x3601A8, -    SMSG_ACCOUNT_EXPORT_RESPONSE                      = 0x360337, -    SMSG_ACCOUNT_ITEM_COLLECTION_DATA                 = 0x360351, +    SMSG_ACCOUNT_EXPORT_RESPONSE                      = 0x360338, +    SMSG_ACCOUNT_ITEM_COLLECTION_DATA                 = 0x360352,      SMSG_ACCOUNT_MOUNT_REMOVED                        = 0x360047,      SMSG_ACCOUNT_MOUNT_UPDATE                         = 0x360046, -    SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE               = 0x3602FE, -    SMSG_ACCOUNT_STORE_CURRENCY_UPDATE                = 0x360320, -    SMSG_ACCOUNT_STORE_FRONT_UPDATE                   = 0x360321, -    SMSG_ACCOUNT_STORE_ITEM_STATE_CHANGED             = 0x360322, -    SMSG_ACCOUNT_STORE_RESULT                         = 0x360323, +    SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE               = 0x3602FF, +    SMSG_ACCOUNT_STORE_CURRENCY_UPDATE                = 0x360321, +    SMSG_ACCOUNT_STORE_FRONT_UPDATE                   = 0x360322, +    SMSG_ACCOUNT_STORE_ITEM_STATE_CHANGED             = 0x360323, +    SMSG_ACCOUNT_STORE_RESULT                         = 0x360324,      SMSG_ACCOUNT_TOY_UPDATE                           = 0x360048,      SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE        = 0x36004C,      SMSG_ACCOUNT_TRANSMOG_UPDATE                      = 0x36004B, @@ -981,8 +986,8 @@ enum OpcodeServer : uint32      SMSG_ADD_LOSS_OF_CONTROL                          = 0x36010F,      SMSG_ADD_RUNE_POWER                               = 0x360156,      SMSG_ADJUST_SPLINE_DURATION                       = 0x360069, -    SMSG_ADVANCED_COMBAT_LOG                          = 0x3602FC, -    SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE              = 0x3602F7, +    SMSG_ADVANCED_COMBAT_LOG                          = 0x3602FD, +    SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE              = 0x3602F8,      SMSG_AE_LOOT_TARGETS                              = 0x3600B5,      SMSG_AE_LOOT_TARGET_ACK                           = 0x3600B6,      SMSG_AI_REACTION                                  = 0x360153, @@ -990,7 +995,7 @@ enum OpcodeServer : uint32      SMSG_ALL_ACCOUNT_CRITERIA                         = 0x360005,      SMSG_ALL_ACHIEVEMENT_DATA                         = 0x360004,      SMSG_ALL_GUILD_ACHIEVEMENTS                       = 0x420000, -    SMSG_APPLY_MOUNT_EQUIPMENT_RESULT                 = 0x3602D4, +    SMSG_APPLY_MOUNT_EQUIPMENT_RESULT                 = 0x3602D5,      SMSG_ARCHAEOLOGY_SURVERY_CAST                     = 0x36001D,      SMSG_AREA_POI_UPDATE_RESPONSE                     = 0x4A0018,      SMSG_AREA_SPIRIT_HEALER_TIME                      = 0x3601DC, @@ -1015,14 +1020,14 @@ enum OpcodeServer : uint32      SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED      = 0x36026B,      SMSG_AUCTION_CLOSED_NOTIFICATION                  = 0x360190,      SMSG_AUCTION_COMMAND_RESULT                       = 0x36018D, -    SMSG_AUCTION_DISABLE_NEW_POSTINGS                 = 0x360324, -    SMSG_AUCTION_FAVORITE_LIST                        = 0x3602EE, -    SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT           = 0x3602E6, +    SMSG_AUCTION_DISABLE_NEW_POSTINGS                 = 0x360325, +    SMSG_AUCTION_FAVORITE_LIST                        = 0x3602EF, +    SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT           = 0x3602E7,      SMSG_AUCTION_HELLO_RESPONSE                       = 0x36018B, -    SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT             = 0x3602E5, -    SMSG_AUCTION_LIST_BUCKETS_RESULT                  = 0x3602E1, -    SMSG_AUCTION_LIST_ITEMS_RESULT                    = 0x3602E2, -    SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT              = 0x3602E4, +    SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT             = 0x3602E6, +    SMSG_AUCTION_LIST_BUCKETS_RESULT                  = 0x3602E2, +    SMSG_AUCTION_LIST_ITEMS_RESULT                    = 0x3602E3, +    SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT              = 0x3602E5,      SMSG_AUCTION_OUTBID_NOTIFICATION                  = 0x36018F,      SMSG_AUCTION_OWNER_BID_NOTIFICATION               = 0x360191,      SMSG_AUCTION_REPLICATE_RESPONSE                   = 0x36018C, @@ -1033,10 +1038,10 @@ enum OpcodeServer : uint32      SMSG_AUTH_FAILED                                  = 0x360000,      SMSG_AUTH_RESPONSE                                = 0x360001,      SMSG_AVAILABLE_HOTFIXES                           = 0x3A0001, -    SMSG_BACKPACK_DEFAULT_SIZE_CHANGED                = 0x360325, +    SMSG_BACKPACK_DEFAULT_SIZE_CHANGED                = 0x360326,      SMSG_BAG_CLEANUP_FINISHED                         = 0x4E0007,      SMSG_BARBER_SHOP_RESULT                           = 0x36015B, -    SMSG_BATCH_PRESENCE_SUBSCRIPTION                  = 0x3602C5, +    SMSG_BATCH_PRESENCE_SUBSCRIPTION                  = 0x3602C6,      SMSG_BATTLEFIELD_LIST                             = 0x3C0005,      SMSG_BATTLEFIELD_PORT_DENIED                      = 0x3C000B,      SMSG_BATTLEFIELD_STATUS_ACTIVE                    = 0x3C0001, @@ -1063,7 +1068,7 @@ enum OpcodeServer : uint32      SMSG_BATTLE_PAY_CONFIRM_PURCHASE                  = 0x360220,      SMSG_BATTLE_PAY_DELIVERY_ENDED                    = 0x360214,      SMSG_BATTLE_PAY_DELIVERY_STARTED                  = 0x360213, -    SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE  = 0x360304, +    SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE  = 0x360305,      SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED            = 0x360211,      SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE               = 0x360212,      SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE    = 0x360210, @@ -1071,7 +1076,7 @@ enum OpcodeServer : uint32      SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE        = 0x36020F,      SMSG_BATTLE_PAY_MOUNT_DELIVERED                   = 0x360215,      SMSG_BATTLE_PAY_PURCHASE_UPDATE                   = 0x36021F, -    SMSG_BATTLE_PAY_START_CHECKOUT                    = 0x3602B9, +    SMSG_BATTLE_PAY_START_CHECKOUT                    = 0x3602BA,      SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x36021D,      SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE           = 0x36021C,      SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE        = 0x3602AD, @@ -1095,8 +1100,8 @@ enum OpcodeServer : uint32      SMSG_BOSS_KILL                                    = 0x3C002B,      SMSG_BREAK_TARGET                                 = 0x3C0016,      SMSG_BROADCAST_ACHIEVEMENT                        = 0x3B0012, -    SMSG_BROADCAST_SUMMON_CAST                        = 0x3602C7, -    SMSG_BROADCAST_SUMMON_RESPONSE                    = 0x3602C8, +    SMSG_BROADCAST_SUMMON_CAST                        = 0x3602C8, +    SMSG_BROADCAST_SUMMON_RESPONSE                    = 0x3602C9,      SMSG_BUY_FAILED                                   = 0x360164,      SMSG_BUY_SUCCEEDED                                = 0x360163,      SMSG_CACHE_INFO                                   = 0x3A000F, @@ -1135,6 +1140,9 @@ enum OpcodeServer : uint32      SMSG_CAPTURE_POINT_REMOVED                        = 0x3C0008,      SMSG_CAST_FAILED                                  = 0x4D0048,      SMSG_CAS_REFRESH_REMOTE_DATA                      = 0x360115, +    SMSG_CATALOG_SHOP_LICENSE_DATA                    = 0x3602AE, +    SMSG_CATALOG_SHOP_OBTAIN_LICENSE                  = 0x360358, +    SMSG_CATALOG_SHOP_OPEN_CHECKOUT_RESULT            = 0x360353,      SMSG_CAUTIONARY_CHANNEL_MESSAGE                   = 0x3B0009,      SMSG_CAUTIONARY_CHAT_MESSAGE                      = 0x3B0008,      SMSG_CHAIN_MISSILE_BOUNCE                         = 0x360061, @@ -1181,8 +1189,8 @@ enum OpcodeServer : uint32      SMSG_CHECK_ABANDON_NPE                            = 0x4A0023,      SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT     = 0x36001B,      SMSG_CHECK_WARGAME_ENTRY                          = 0x360027, -    SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS        = 0x3602F1, -    SMSG_CLAIM_RAF_REWARD_RESPONSE                    = 0x3602D8, +    SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS        = 0x3602F2, +    SMSG_CLAIM_RAF_REWARD_RESPONSE                    = 0x3602D9,      SMSG_CLEAR_ALL_SPELL_CHARGES                      = 0x4D0016,      SMSG_CLEAR_BOSS_EMOTES                            = 0x360054,      SMSG_CLEAR_COOLDOWN                               = 0x360158, @@ -1192,13 +1200,13 @@ enum OpcodeServer : uint32      SMSG_CLEAR_TARGET                                 = 0x3C0022,      SMSG_CLEAR_TREASURE_PICKER_CACHE                  = 0x4B0022,      SMSG_CLOSE_ARTIFACT_FORGE                         = 0x36023B, -    SMSG_CLUB_FINDER_ERROR_MESSAGE                    = 0x3602D0, -    SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE    = 0x3602D3, -    SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST        = 0x3602D1, -    SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x3602CE, -    SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x3602D2, -    SMSG_CLUB_FINDER_UPDATE_APPLICATIONS              = 0x3602CF, -    SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE       = 0x360310, +    SMSG_CLUB_FINDER_ERROR_MESSAGE                    = 0x3602D1, +    SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE    = 0x3602D4, +    SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST        = 0x3602D2, +    SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x3602CF, +    SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x3602D3, +    SMSG_CLUB_FINDER_UPDATE_APPLICATIONS              = 0x3602D0, +    SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE       = 0x360311,      SMSG_COIN_REMOVED                                 = 0x3600B4,      SMSG_COMBAT_EVENT_FAILED                          = 0x3C0019,      SMSG_COMMENTATOR_MAP_INFO                         = 0x3601A4, @@ -1219,9 +1227,9 @@ enum OpcodeServer : uint32      SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED     = 0x360272,      SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE             = 0x360273,      SMSG_CONTACT_LIST                                 = 0x360222, -    SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE            = 0x3602B2, +    SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE            = 0x3602B3,      SMSG_CONTROL_UPDATE                               = 0x3600E4, -    SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE              = 0x3602FA, +    SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE              = 0x3602FB,      SMSG_COOLDOWN_CHEAT                               = 0x3601D5,      SMSG_COOLDOWN_EVENT                               = 0x360157,      SMSG_CORPSE_LOCATION                              = 0x3600EB, @@ -1229,27 +1237,27 @@ enum OpcodeServer : uint32      SMSG_CORPSE_TRANSPORT_QUERY                       = 0x3601B0,      SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE      = 0x4B0024,      SMSG_COVENANT_PREVIEW_OPEN_NPC                    = 0x360294, -    SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE           = 0x3602FB, -    SMSG_CRAFTING_HOUSE_HELLO_RESPONSE                = 0x360331, -    SMSG_CRAFTING_ORDER_CANCEL_RESULT                 = 0x36032D, -    SMSG_CRAFTING_ORDER_CLAIM_RESULT                  = 0x360329, -    SMSG_CRAFTING_ORDER_CRAFT_RESULT                  = 0x36032B, -    SMSG_CRAFTING_ORDER_CREATE_RESULT                 = 0x360327, -    SMSG_CRAFTING_ORDER_FULFILL_RESULT                = 0x36032C, -    SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE          = 0x360328, -    SMSG_CRAFTING_ORDER_NPC_REWARD_INFO               = 0x360333, -    SMSG_CRAFTING_ORDER_REJECT_RESULT                 = 0x36032F, -    SMSG_CRAFTING_ORDER_RELEASE_RESULT                = 0x36032A, -    SMSG_CRAFTING_ORDER_UPDATE_STATE                  = 0x360332, -    SMSG_CRAFT_ENCHANT_RESULT                         = 0x360330, +    SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE           = 0x3602FC, +    SMSG_CRAFTING_HOUSE_HELLO_RESPONSE                = 0x360332, +    SMSG_CRAFTING_ORDER_CANCEL_RESULT                 = 0x36032E, +    SMSG_CRAFTING_ORDER_CLAIM_RESULT                  = 0x36032A, +    SMSG_CRAFTING_ORDER_CRAFT_RESULT                  = 0x36032C, +    SMSG_CRAFTING_ORDER_CREATE_RESULT                 = 0x360328, +    SMSG_CRAFTING_ORDER_FULFILL_RESULT                = 0x36032D, +    SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE          = 0x360329, +    SMSG_CRAFTING_ORDER_NPC_REWARD_INFO               = 0x360334, +    SMSG_CRAFTING_ORDER_REJECT_RESULT                 = 0x360330, +    SMSG_CRAFTING_ORDER_RELEASE_RESULT                = 0x36032B, +    SMSG_CRAFTING_ORDER_UPDATE_STATE                  = 0x360333, +    SMSG_CRAFT_ENCHANT_RESULT                         = 0x360331,      SMSG_CREATE_CHAR                                  = 0x36019E,      SMSG_CREATE_SHIPMENT_RESPONSE                     = 0x360233, -    SMSG_CREATOR_VISUALS_OVERRIDE                     = 0x360336, +    SMSG_CREATOR_VISUALS_OVERRIDE                     = 0x360337,      SMSG_CRITERIA_DELETED                             = 0x360184,      SMSG_CRITERIA_UPDATE                              = 0x36017E,      SMSG_CROSSED_INEBRIATION_THRESHOLD                = 0x36015F, -    SMSG_CURRENCY_TRANSFER_LOG                        = 0x360348, -    SMSG_CURRENCY_TRANSFER_RESULT                     = 0x360347, +    SMSG_CURRENCY_TRANSFER_LOG                        = 0x360349, +    SMSG_CURRENCY_TRANSFER_RESULT                     = 0x360348,      SMSG_CUSTOM_LOAD_SCREEN                           = 0x360064,      SMSG_DAILY_QUESTS_RESET                           = 0x4B0000,      SMSG_DAMAGE_CALC_LOG                              = 0x4D0054, @@ -1259,7 +1267,7 @@ enum OpcodeServer : uint32      SMSG_DEFENSE_MESSAGE                              = 0x3B000C,      SMSG_DELETE_CHAR                                  = 0x36019F,      SMSG_DELETE_EXPIRED_MISSIONS_RESULT               = 0x400022, -    SMSG_DELVES_ACCOUNT_DATA_ELEMENT_CHANGED          = 0x36034D, +    SMSG_DELVES_ACCOUNT_DATA_ELEMENT_CHANGED          = 0x36034E,      SMSG_DESTROY_ARENA_UNIT                           = 0x3601DE,      SMSG_DESTRUCTIBLE_BUILDING_DAMAGE                 = 0x360196,      SMSG_DIFFERENT_INSTANCE_FROM_PARTY                = 0x360020, @@ -1297,12 +1305,12 @@ enum OpcodeServer : uint32      SMSG_EXPECTED_SPAM_RECORDS                        = 0x3B0005,      SMSG_EXPLORATION_EXPERIENCE                       = 0x3601FB,      SMSG_EXPORT_ACCOUNT_PROFILE                       = 0x3600F0, -    SMSG_EXTERNAL_TRANSACTION_ID_GENERATED            = 0x3602F8, +    SMSG_EXTERNAL_TRANSACTION_ID_GENERATED            = 0x3602F9,      SMSG_FACTION_BONUS_INFO                           = 0x3601C1,      SMSG_FAILED_PLAYER_CONDITION                      = 0x4A0002,      SMSG_FAILED_QUEST_TURN_IN                         = 0x3602A8,      SMSG_FEATURE_SYSTEM_STATUS                        = 0x360058, -    SMSG_FEATURE_SYSTEM_STATUS2                       = 0x360345, +    SMSG_FEATURE_SYSTEM_STATUS2                       = 0x360346,      SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN            = 0x360059,      SMSG_FEIGN_DEATH_RESISTED                         = 0x3601E0,      SMSG_FISH_ESCAPED                                 = 0x36016E, @@ -1317,11 +1325,11 @@ enum OpcodeServer : uint32      SMSG_FRIEND_STATUS                                = 0x360223,      SMSG_GAIN_MAW_POWER                               = 0x360279,      SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT                = 0x36005C, -    SMSG_GAME_OBJECT_BASE                             = 0x3602BF, -    SMSG_GAME_OBJECT_CLOSE_INTERACTION                = 0x36030F, +    SMSG_GAME_OBJECT_BASE                             = 0x3602C0, +    SMSG_GAME_OBJECT_CLOSE_INTERACTION                = 0x360310,      SMSG_GAME_OBJECT_CUSTOM_ANIM                      = 0x36005D,      SMSG_GAME_OBJECT_DESPAWN                          = 0x36005E, -    SMSG_GAME_OBJECT_INTERACTION                      = 0x36030E, +    SMSG_GAME_OBJECT_INTERACTION                      = 0x36030F,      SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL                = 0x4D003C,      SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT            = 0x4D003B,      SMSG_GAME_OBJECT_RESET_STATE                      = 0x3601BB, @@ -1400,11 +1408,11 @@ enum OpcodeServer : uint32      SMSG_GARRISON_UPGRADE_RESULT                      = 0x40000D,      SMSG_GARRISON_USE_RECALL_PORTAL_RESULT            = 0x40001F,      SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT        = 0x36001C, -    SMSG_GENERATE_SSO_TOKEN_RESPONSE                  = 0x3602B3, +    SMSG_GENERATE_SSO_TOKEN_RESPONSE                  = 0x3602B4,      SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT            = 0x3601FD,      SMSG_GET_GARRISON_INFO_RESULT                     = 0x400000,      SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE          = 0x360236, -    SMSG_GET_REALM_HIDDEN_RESULT                      = 0x36033C, +    SMSG_GET_REALM_HIDDEN_RESULT                      = 0x36033D,      SMSG_GET_REMAINING_GAME_TIME_RESPONSE             = 0x360271,      SMSG_GET_SELECTED_TROPHY_ID_RESPONSE              = 0x36025E,      SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE               = 0x360235, @@ -1487,7 +1495,7 @@ enum OpcodeServer : uint32      SMSG_GUILD_REWARD_LIST                            = 0x420008,      SMSG_GUILD_ROSTER                                 = 0x420003,      SMSG_GUILD_SEND_RANK_CHANGE                       = 0x420001, -    SMSG_HARDCORE_DEATH_ALERT                         = 0x360344, +    SMSG_HARDCORE_DEATH_ALERT                         = 0x360345,      SMSG_HEALTH_UPDATE                                = 0x36016F,      SMSG_HIGHEST_THREAT_UPDATE                        = 0x360177,      SMSG_HOTFIX_CONNECT                               = 0x3A0003, @@ -1525,7 +1533,7 @@ enum OpcodeServer : uint32      SMSG_INVALID_PROMOTION_CODE                       = 0x3601EF,      SMSG_INVENTORY_CHANGE_FAILURE                     = 0x4E0005,      SMSG_INVENTORY_FIXUP_COMPLETE                     = 0x3602AA, -    SMSG_INVENTORY_FULL_OVERFLOW                      = 0x3602BB, +    SMSG_INVENTORY_FULL_OVERFLOW                      = 0x3602BC,      SMSG_ISLAND_AZERITE_GAIN                          = 0x3601F8,      SMSG_ISLAND_COMPLETE                              = 0x3601F9,      SMSG_IS_QUEST_COMPLETE_RESPONSE                   = 0x4B0004, @@ -1533,17 +1541,17 @@ enum OpcodeServer : uint32      SMSG_ITEM_COOLDOWN                                = 0x36025F,      SMSG_ITEM_ENCHANT_TIME_UPDATE                     = 0x3601F1,      SMSG_ITEM_EXPIRE_PURCHASE_REFUND                  = 0x360034, -    SMSG_ITEM_INTERACTION_COMPLETE                    = 0x3602F0, +    SMSG_ITEM_INTERACTION_COMPLETE                    = 0x3602F1,      SMSG_ITEM_PURCHASE_REFUND_RESULT                  = 0x360032,      SMSG_ITEM_PUSH_RESULT                             = 0x3600C0,      SMSG_ITEM_TIME_UPDATE                             = 0x3601F0,      SMSG_KICK_REASON                                  = 0x360128, -    SMSG_LATENCY_REPORT_PING                          = 0x360300, +    SMSG_LATENCY_REPORT_PING                          = 0x360301,      SMSG_LEARNED_SPELLS                               = 0x4D003E,      SMSG_LEARN_PVP_TALENT_FAILED                      = 0x36006D,      SMSG_LEARN_TALENT_FAILED                          = 0x36006C, -    SMSG_LEGACY_LOOT_RULES                            = 0x3602C0, -    SMSG_LEVEL_LINKING_RESULT                         = 0x3602D6, +    SMSG_LEGACY_LOOT_RULES                            = 0x3602C1, +    SMSG_LEVEL_LINKING_RESULT                         = 0x3602D7,      SMSG_LEVEL_UP_INFO                                = 0x360186,      SMSG_LFG_BOOT_PLAYER                              = 0x440019,      SMSG_LFG_DISABLED                                 = 0x440017, @@ -1579,12 +1587,12 @@ enum OpcodeServer : uint32      SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT         = 0x36020C,      SMSG_LOAD_CUF_PROFILES                            = 0x360055,      SMSG_LOAD_EQUIPMENT_SET                           = 0x3601AC, -    SMSG_LOBBY_MATCHMAKER_LOBBY_ACQUIRED_SERVER       = 0x360311, -    SMSG_LOBBY_MATCHMAKER_PARTY_INFO                  = 0x360312, -    SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED       = 0x360313, -    SMSG_LOBBY_MATCHMAKER_QUEUE_PROPOSED              = 0x360315, -    SMSG_LOBBY_MATCHMAKER_QUEUE_RESULT                = 0x360316, -    SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE              = 0x360314, +    SMSG_LOBBY_MATCHMAKER_LOBBY_ACQUIRED_SERVER       = 0x360312, +    SMSG_LOBBY_MATCHMAKER_PARTY_INFO                  = 0x360313, +    SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED       = 0x360314, +    SMSG_LOBBY_MATCHMAKER_QUEUE_PROPOSED              = 0x360316, +    SMSG_LOBBY_MATCHMAKER_QUEUE_RESULT                = 0x360317, +    SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE              = 0x360315,      SMSG_LOGIN_SET_TIME_SPEED                         = 0x3601AB,      SMSG_LOGIN_VERIFY_WORLD                           = 0x36002F,      SMSG_LOGOUT_CANCEL_ACK                            = 0x360124, @@ -1608,17 +1616,17 @@ enum OpcodeServer : uint32      SMSG_MAP_OBJECTIVES_INIT                          = 0x3C002A,      SMSG_MAP_OBJ_EVENTS                               = 0x36005F,      SMSG_MASTER_LOOT_CANDIDATE_LIST                   = 0x3600BC, -    SMSG_MEETING_STONE_FAILED                         = 0x360317, +    SMSG_MEETING_STONE_FAILED                         = 0x360318,      SMSG_MESSAGE_BOX                                  = 0x36000A,      SMSG_MINIMAP_PING                                 = 0x36016C,      SMSG_MIRROR_IMAGE_COMPONENTED_DATA                = 0x4D0004,      SMSG_MIRROR_IMAGE_CREATURE_DATA                   = 0x4D0003, -    SMSG_MIRROR_VARS                                  = 0x360355, +    SMSG_MIRROR_VARS                                  = 0x360359,      SMSG_MISSILE_CANCEL                               = 0x360060,      SMSG_MODIFY_COOLDOWN                              = 0x360200,      SMSG_MOTD                                         = 0x3B0003,      SMSG_MOUNT_RESULT                                 = 0x36000F, -    SMSG_MOVEMENT_ENFORCEMENT_ALERT                   = 0x3602C6, +    SMSG_MOVEMENT_ENFORCEMENT_ALERT                   = 0x3602C7,      SMSG_MOVE_ADD_IMPULSE                             = 0x480062,      SMSG_MOVE_APPLY_INERTIA                           = 0x48005E,      SMSG_MOVE_APPLY_MOVEMENT_FORCE                    = 0x480045, @@ -1739,14 +1747,14 @@ enum OpcodeServer : uint32      SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD                  = 0x3600AF,      SMSG_MYTHIC_PLUS_SEASON_DATA                      = 0x3600A9,      SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT         = 0x360074, -    SMSG_NEW_DATA_BUILD                               = 0x36033B, +    SMSG_NEW_DATA_BUILD                               = 0x36033C,      SMSG_NEW_TAXI_PATH                                = 0x36011D,      SMSG_NEW_WORLD                                    = 0x36002B,      SMSG_NOTIFY_DEST_LOC_SPELL_CAST                   = 0x4D0034,      SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION          = 0x360149,      SMSG_NOTIFY_MONEY                                 = 0x360031,      SMSG_NOTIFY_RECEIVED_MAIL                         = 0x3600D9, -    SMSG_NPC_INTERACTION_OPEN_RESULT                  = 0x36030D, +    SMSG_NPC_INTERACTION_OPEN_RESULT                  = 0x36030E,      SMSG_OFFER_PETITION_ERROR                         = 0x360154,      SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA         = 0x360183,      SMSG_ON_MONSTER_MOVE                              = 0x480002, @@ -1757,21 +1765,21 @@ enum OpcodeServer : uint32      SMSG_OVERRIDE_LIGHT                               = 0x360159,      SMSG_PAGE_TEXT                                    = 0x3601B7,      SMSG_PARTY_COMMAND_RESULT                         = 0x36022C, -    SMSG_PARTY_ELIGIBILITY_FOR_DELVE_TIERS_RESPONSE   = 0x360350, +    SMSG_PARTY_ELIGIBILITY_FOR_DELVE_TIERS_RESPONSE   = 0x360351,      SMSG_PARTY_INVITE                                 = 0x360056,      SMSG_PARTY_KILL_LOG                               = 0x3601F6,      SMSG_PARTY_MEMBER_FULL_STATE                      = 0x3601F5,      SMSG_PARTY_MEMBER_PARTIAL_STATE                   = 0x3601F4, -    SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE               = 0x3602F6, +    SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE               = 0x3602F7,      SMSG_PARTY_UPDATE                                 = 0x36008C,      SMSG_PAST_TIME_EVENTS                             = 0x36005B,      SMSG_PAUSE_MIRROR_TIMER                           = 0x3601AE,      SMSG_PENDING_RAID_LOCK                            = 0x360195, -    SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE              = 0x36030A, -    SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE                = 0x360306, -    SMSG_PERKS_PROGRAM_DISABLED                       = 0x36030B, -    SMSG_PERKS_PROGRAM_RESULT                         = 0x360307, -    SMSG_PERKS_PROGRAM_VENDOR_UPDATE                  = 0x360305, +    SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE              = 0x36030B, +    SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE                = 0x360307, +    SMSG_PERKS_PROGRAM_DISABLED                       = 0x36030C, +    SMSG_PERKS_PROGRAM_RESULT                         = 0x360308, +    SMSG_PERKS_PROGRAM_VENDOR_UPDATE                  = 0x360306,      SMSG_PETITION_ALREADY_SIGNED                      = 0x360037,      SMSG_PETITION_RENAME_GUILD_RESPONSE               = 0x420042,      SMSG_PETITION_SHOW_LIST                           = 0x36015C, @@ -1844,7 +1852,7 @@ enum OpcodeServer : uint32      SMSG_POWER_UPDATE                                 = 0x360170,      SMSG_PRELOAD_CHILD_MAP                            = 0x36000D,      SMSG_PRELOAD_WORLD                                = 0x36002C, -    SMSG_PREPOPULATE_NAME_CACHE                       = 0x3602C9, +    SMSG_PREPOPULATE_NAME_CACHE                       = 0x3602CA,      SMSG_PRE_RESSURECT                                = 0x360203,      SMSG_PRINT_NOTIFICATION                           = 0x360063,      SMSG_PROC_RESIST                                  = 0x3601F7, @@ -1857,7 +1865,7 @@ enum OpcodeServer : uint32      SMSG_PVP_MATCH_START                              = 0x3C002D,      SMSG_PVP_MATCH_STATISTICS                         = 0x3C0010,      SMSG_PVP_OPTIONS_ENABLED                          = 0x3C0013, -    SMSG_PVP_TIER_RECORD                              = 0x360301, +    SMSG_PVP_TIER_RECORD                              = 0x360302,      SMSG_QUERY_BATTLE_PET_NAME_RESPONSE               = 0x3A000C,      SMSG_QUERY_CREATURE_RESPONSE                      = 0x3A0006,      SMSG_QUERY_GAME_OBJECT_RESPONSE                   = 0x3A0007, @@ -1892,10 +1900,10 @@ enum OpcodeServer : uint32      SMSG_QUEST_POI_QUERY_RESPONSE                     = 0x4B001D,      SMSG_QUEST_POI_UPDATE_RESPONSE                    = 0x4B001F,      SMSG_QUEST_PUSH_RESULT                            = 0x4B0010, -    SMSG_QUEST_SESSION_INFO_RESPONSE                  = 0x3602EC, -    SMSG_QUEST_SESSION_READY_CHECK                    = 0x3602DA, -    SMSG_QUEST_SESSION_READY_CHECK_RESPONSE           = 0x3602DB, -    SMSG_QUEST_SESSION_RESULT                         = 0x3602D9, +    SMSG_QUEST_SESSION_INFO_RESPONSE                  = 0x3602ED, +    SMSG_QUEST_SESSION_READY_CHECK                    = 0x3602DB, +    SMSG_QUEST_SESSION_READY_CHECK_RESPONSE           = 0x3602DC, +    SMSG_QUEST_SESSION_RESULT                         = 0x3602DA,      SMSG_QUEST_UPDATE_ADD_CREDIT                      = 0x4B000C,      SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE               = 0x4B000D,      SMSG_QUEST_UPDATE_ADD_PVP_CREDIT                  = 0x4B000E, @@ -1903,9 +1911,9 @@ enum OpcodeServer : uint32      SMSG_QUEST_UPDATE_FAILED                          = 0x4B000A,      SMSG_QUEST_UPDATE_FAILED_TIMER                    = 0x4B000B,      SMSG_QUEUE_SUMMARY_UPDATE                         = 0x3602A9, -    SMSG_RAF_ACCOUNT_INFO                             = 0x3602D7, -    SMSG_RAF_ACTIVITY_STATE_CHANGED                   = 0x3602E8, -    SMSG_RAF_DEBUG_FRIEND_MONTHS                      = 0x360338, +    SMSG_RAF_ACCOUNT_INFO                             = 0x3602D8, +    SMSG_RAF_ACTIVITY_STATE_CHANGED                   = 0x3602E9, +    SMSG_RAF_DEBUG_FRIEND_MONTHS                      = 0x360339,      SMSG_RAID_DIFFICULTY_SET                          = 0x360244,      SMSG_RAID_GROUP_ONLY                              = 0x360246,      SMSG_RAID_INSTANCE_MESSAGE                        = 0x3B000A, @@ -1921,7 +1929,9 @@ enum OpcodeServer : uint32      SMSG_REATTACH_RESURRECT                           = 0x3601E7,      SMSG_RECEIVE_PING_UNIT                            = 0x360039,      SMSG_RECEIVE_PING_WORLD_POINT                     = 0x36003A, -    SMSG_RECRAFT_ITEM_RESULT                          = 0x36032E, +    SMSG_RECENT_ALLY_DATA_RESPONSE                    = 0x360354, +    SMSG_RECENT_ALLY_NOTE_UPDATED                     = 0x360355, +    SMSG_RECRAFT_ITEM_RESULT                          = 0x36032F,      SMSG_RECRUIT_A_FRIEND_FAILURE                     = 0x36015E,      SMSG_REFRESH_COMPONENT                            = 0x3600ED,      SMSG_REGIONWIDE_CHARACTER_MAIL_DATA               = 0x36001A, @@ -1935,14 +1945,14 @@ enum OpcodeServer : uint32      SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE          = 0x3C0015,      SMSG_RESET_COMPRESSION_CONTEXT                    = 0x3D0007,      SMSG_RESET_FAILED_NOTIFY                          = 0x360155, -    SMSG_RESET_LAST_LOADED_CONFIG_CVARS               = 0x360335, +    SMSG_RESET_LAST_LOADED_CONFIG_CVARS               = 0x360336,      SMSG_RESET_QUEST_POI                              = 0x4B0020,      SMSG_RESET_RANGED_COMBAT_TIMER                    = 0x3C0023,      SMSG_RESET_WEEKLY_CURRENCY                        = 0x360009,      SMSG_RESPEC_WIPE_CONFIRM                          = 0x3600B0,      SMSG_RESPOND_INSPECT_ACHIEVEMENTS                 = 0x360006, -    SMSG_RESPONSE_PERK_PENDING_REWARDS                = 0x360308, -    SMSG_RESPONSE_PERK_RECENT_PURCHASES               = 0x360309, +    SMSG_RESPONSE_PERK_PENDING_REWARDS                = 0x360309, +    SMSG_RESPONSE_PERK_RECENT_PURCHASES               = 0x36030A,      SMSG_RESTART_GLOBAL_COOLDOWN                      = 0x4D0052,      SMSG_RESTRICTED_ACCOUNT_WARNING                   = 0x360052,      SMSG_RESUME_CAST                                  = 0x4D002C, @@ -1952,8 +1962,8 @@ enum OpcodeServer : uint32      SMSG_RESURRECT_REQUEST                            = 0x360012,      SMSG_RESYNC_RUNES                                 = 0x4D0050,      SMSG_RETURNING_PLAYER_PROMPT                      = 0x36023F, -    SMSG_RETURN_APPLICANT_LIST                        = 0x3602CD, -    SMSG_RETURN_RECRUITING_CLUBS                      = 0x3602CC, +    SMSG_RETURN_APPLICANT_LIST                        = 0x3602CE, +    SMSG_RETURN_RECRUITING_CLUBS                      = 0x3602CD,      SMSG_ROLE_CHANGED_INFORM                          = 0x360021,      SMSG_ROLE_CHOSEN                                  = 0x44001D,      SMSG_ROLE_POLL_INFORM                             = 0x360022, @@ -2000,7 +2010,7 @@ enum OpcodeServer : uint32      SMSG_SET_FACTION_STANDING                         = 0x3601C8,      SMSG_SET_FACTION_VISIBLE                          = 0x3601C6,      SMSG_SET_FLAT_SPELL_MODIFIER                      = 0x4D0027, -    SMSG_SET_INSTANCE_LEAVER                          = 0x360356, +    SMSG_SET_INSTANCE_LEAVER                          = 0x36035A,      SMSG_SET_ITEM_PURCHASE_DATA                       = 0x360033,      SMSG_SET_LOOT_METHOD_FAILED                       = 0x360267,      SMSG_SET_MAX_WEEKLY_QUANTITY                      = 0x360036, @@ -2011,25 +2021,25 @@ enum OpcodeServer : uint32      SMSG_SET_PLAYER_DECLINED_NAMES_RESULT             = 0x4A000B,      SMSG_SET_PLAY_HOVER_ANIM                          = 0x360053,      SMSG_SET_PROFICIENCY                              = 0x3601D1, -    SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE           = 0x3602E0, +    SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE           = 0x3602E1,      SMSG_SET_SHIPMENT_READY_RESPONSE                  = 0x40003A,      SMSG_SET_SPELL_CHARGES                            = 0x4D0018,      SMSG_SET_TIME_ZONE_INFORMATION                    = 0x360116,      SMSG_SET_VEHICLE_REC_ID                           = 0x360194, -    SMSG_SHADOWLANDS_CAPACITANCE_UPDATE               = 0x36030C, +    SMSG_SHADOWLANDS_CAPACITANCE_UPDATE               = 0x36030D,      SMSG_SHIPMENT_FACTION_UPDATE_RESULT               = 0x40003B, -    SMSG_SHOW_DELVES_COMPANION_CONFIGURATION_UI       = 0x36034E, -    SMSG_SHOW_DELVES_DISPLAY_UI                       = 0x36034C, +    SMSG_SHOW_DELVES_COMPANION_CONFIGURATION_UI       = 0x36034F, +    SMSG_SHOW_DELVES_DISPLAY_UI                       = 0x36034D,      SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI        = 0x360073,      SMSG_SHOW_QUEST_COMPLETION_TEXT                   = 0x4B0015,      SMSG_SHOW_TAXI_NODES                              = 0x36016B,      SMSG_SHOW_TRADE_SKILL_RESPONSE                    = 0x36020D, -    SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE             = 0x360318, +    SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE             = 0x360319,      SMSG_SOCKET_GEMS_FAILURE                          = 0x3601C4,      SMSG_SOCKET_GEMS_SUCCESS                          = 0x3601C3,      SMSG_SPECIAL_MOUNT_ANIM                           = 0x36013E, -    SMSG_SPECTATE_END                                 = 0x36033A, -    SMSG_SPECTATE_PLAYER                              = 0x360339, +    SMSG_SPECTATE_END                                 = 0x36033B, +    SMSG_SPECTATE_PLAYER                              = 0x36033A,      SMSG_SPEC_INVOLUNTARILY_CHANGED                   = 0x3601B6,      SMSG_SPELL_ABSORB_LOG                             = 0x4D000C,      SMSG_SPELL_CATEGORY_COOLDOWN                      = 0x4D0006, @@ -2059,7 +2069,7 @@ enum OpcodeServer : uint32      SMSG_SPELL_PREPARE                                = 0x4D0029,      SMSG_SPELL_START                                  = 0x4D002B,      SMSG_SPELL_VISUAL_LOAD_SCREEN                     = 0x360065, -    SMSG_SPLASH_SCREEN_SHOW_LATEST                    = 0x3602F2, +    SMSG_SPLASH_SCREEN_SHOW_LATEST                    = 0x3602F3,      SMSG_STAND_STATE_UPDATE                           = 0x3601BA,      SMSG_STARTER_BUILD_ACTIVATE_FAILED                = 0x36006B,      SMSG_START_ELAPSED_TIMER                          = 0x3600A0, @@ -2078,16 +2088,17 @@ enum OpcodeServer : uint32      SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED           = 0x360023,      SMSG_SUMMON_REQUEST                               = 0x3601BE,      SMSG_SUPERCEDED_SPELLS                            = 0x4D003D, +    SMSG_SURVEY_DELIVERED                             = 0x360357,      SMSG_SUSPEND_COMMS                                = 0x3D0002,      SMSG_SUSPEND_TOKEN                                = 0x360040, -    SMSG_SYNC_WOW_ENTITLEMENTS                        = 0x3602EA, +    SMSG_SYNC_WOW_ENTITLEMENTS                        = 0x3602EB,      SMSG_TALENTS_INVOLUNTARILY_RESET                  = 0x3601B5,      SMSG_TAXI_NODE_STATUS                             = 0x36011B,      SMSG_TEXT_EMOTE                                   = 0x360119,      SMSG_THREAT_CLEAR                                 = 0x36017A,      SMSG_THREAT_REMOVE                                = 0x360179,      SMSG_THREAT_UPDATE                                = 0x360178, -    SMSG_TIMERUNNING_SEASON_ENDED                     = 0x36034F, +    SMSG_TIMERUNNING_SEASON_ENDED                     = 0x360350,      SMSG_TIME_ADJUSTMENT                              = 0x480001,      SMSG_TIME_SYNC_REQUEST                            = 0x480000,      SMSG_TITLE_EARNED                                 = 0x360175, @@ -2114,21 +2125,21 @@ enum OpcodeServer : uint32      SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE            = 0x360263,      SMSG_UNLEARNED_SPELLS                             = 0x4D003F,      SMSG_UNLOAD_CHILD_MAP                             = 0x36000E, -    SMSG_UNSET_INSTANCE_LEAVER                        = 0x360357, -    SMSG_UPDATE_AADC_STATUS_RESPONSE                  = 0x360302, +    SMSG_UNSET_INSTANCE_LEAVER                        = 0x36035B, +    SMSG_UPDATE_AADC_STATUS_RESPONSE                  = 0x360303,      SMSG_UPDATE_ACCOUNT_DATA                          = 0x3601A6,      SMSG_UPDATE_ACCOUNT_DATA_COMPLETE                 = 0x3601A7,      SMSG_UPDATE_ACTION_BUTTONS                        = 0x360078, -    SMSG_UPDATE_BNET_SESSION_KEY                      = 0x3602BA, +    SMSG_UPDATE_BNET_SESSION_KEY                      = 0x3602BB,      SMSG_UPDATE_CAPTURE_POINT                         = 0x3C0007, -    SMSG_UPDATE_CELESTIAL_BODY                        = 0x3602B6, +    SMSG_UPDATE_CELESTIAL_BODY                        = 0x3602B7,      SMSG_UPDATE_CHARACTER_FLAGS                       = 0x36025B,      SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN              = 0x360202,      SMSG_UPDATE_COOLDOWN                              = 0x360201,      SMSG_UPDATE_CRAFTING_NPC_RECIPES                  = 0x400038,      SMSG_UPDATE_DAILY_MISSION_COUNTER                 = 0x400021,      SMSG_UPDATE_EXPANSION_LEVEL                       = 0x3600E3, -    SMSG_UPDATE_GAME_TIME_STATE                       = 0x3602BD, +    SMSG_UPDATE_GAME_TIME_STATE                       = 0x3602BE,      SMSG_UPDATE_INSTANCE_OWNERSHIP                    = 0x360148,      SMSG_UPDATE_LAST_INSTANCE                         = 0x360127,      SMSG_UPDATE_OBJECT                                = 0x460000, @@ -2140,16 +2151,16 @@ enum OpcodeServer : uint32      SMSG_USERLIST_REMOVE                              = 0x3B0010,      SMSG_USERLIST_UPDATE                              = 0x3B0011,      SMSG_USE_EQUIPMENT_SET_RESULT                     = 0x3601EB, -    SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE               = 0x3602B1, -    SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE               = 0x3602AF, -    SMSG_VAS_GET_SERVICE_STATUS_RESPONSE              = 0x3602AE, +    SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE               = 0x3602B2, +    SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE               = 0x3602B0, +    SMSG_VAS_GET_SERVICE_STATUS_RESPONSE              = 0x3602AF,      SMSG_VAS_PURCHASE_COMPLETE                        = 0x360289,      SMSG_VAS_PURCHASE_STATE_UPDATE                    = 0x360288,      SMSG_VENDOR_INVENTORY                             = 0x360051,      SMSG_VIGNETTE_UPDATE                              = 0x4A0010, -    SMSG_VOICE_CHANNEL_INFO_RESPONSE                  = 0x3602B5, -    SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE             = 0x3602FD, -    SMSG_VOICE_LOGIN_RESPONSE                         = 0x3602B4, +    SMSG_VOICE_CHANNEL_INFO_RESPONSE                  = 0x3602B6, +    SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE             = 0x3602FE, +    SMSG_VOICE_LOGIN_RESPONSE                         = 0x3602B5,      SMSG_VOID_ITEM_SWAP_RESPONSE                      = 0x4E0004,      SMSG_VOID_STORAGE_CONTENTS                        = 0x4E0001,      SMSG_VOID_STORAGE_FAILED                          = 0x4E0000, @@ -2158,29 +2169,29 @@ enum OpcodeServer : uint32      SMSG_WAIT_QUEUE_FINISH                            = 0x360003,      SMSG_WAIT_QUEUE_UPDATE                            = 0x360002,      SMSG_WARDEN3_DATA                                 = 0x36000B, -    SMSG_WARDEN3_DISABLED                             = 0x3602B8, -    SMSG_WARDEN3_ENABLED                              = 0x3602B7, +    SMSG_WARDEN3_DISABLED                             = 0x3602B9, +    SMSG_WARDEN3_ENABLED                              = 0x3602B8,      SMSG_WARFRONT_COMPLETE                            = 0x3601FA,      SMSG_WARGAME_REQUEST_OPPONENT_RESPONSE            = 0x3C0012,      SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x3C0011,      SMSG_WEATHER                                      = 0x360145, -    SMSG_WEEKLY_REWARDS_PROGRESS_RESULT               = 0x3602F5, -    SMSG_WEEKLY_REWARDS_RESULT                        = 0x3602F3, -    SMSG_WEEKLY_REWARD_CLAIM_RESULT                   = 0x3602F4, +    SMSG_WEEKLY_REWARDS_PROGRESS_RESULT               = 0x3602F6, +    SMSG_WEEKLY_REWARDS_RESULT                        = 0x3602F4, +    SMSG_WEEKLY_REWARD_CLAIM_RESULT                   = 0x3602F5,      SMSG_WHO                                          = 0x3B0002,      SMSG_WHO_IS                                       = 0x360144, -    SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME   = 0x3602BC, +    SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME   = 0x3602BD,      SMSG_WORLD_QUEST_UPDATE_RESPONSE                  = 0x4A0017,      SMSG_WORLD_SERVER_INFO                            = 0x360045, -    SMSG_WOW_ENTITLEMENT_NOTIFICATION                 = 0x3602EB, -    SMSG_WOW_LABS_AREA_INFO                           = 0x36031D, -    SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_END            = 0x360319, -    SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_STATE_CHANGED  = 0x36031A, -    SMSG_WOW_LABS_PARTY_ERROR                         = 0x360326, -    SMSG_WOW_LABS_SET_AREA_ID_RESULT                  = 0x36031B, -    SMSG_WOW_LABS_SET_PREDICTION_CIRCLE               = 0x36031F, -    SMSG_WOW_LABS_SET_SELECTED_AREA_ID                = 0x36031C, -    SMSG_XP_AWARDED_FROM_CURRENCY                     = 0x360334, +    SMSG_WOW_ENTITLEMENT_NOTIFICATION                 = 0x3602EC, +    SMSG_WOW_LABS_AREA_INFO                           = 0x36031E, +    SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_END            = 0x36031A, +    SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_STATE_CHANGED  = 0x36031B, +    SMSG_WOW_LABS_PARTY_ERROR                         = 0x360327, +    SMSG_WOW_LABS_SET_AREA_ID_RESULT                  = 0x36031C, +    SMSG_WOW_LABS_SET_PREDICTION_CIRCLE               = 0x360320, +    SMSG_WOW_LABS_SET_SELECTED_AREA_ID                = 0x36031D, +    SMSG_XP_AWARDED_FROM_CURRENCY                     = 0x360335,      SMSG_XP_GAIN_ABORTED                              = 0x360062,      SMSG_XP_GAIN_ENABLED                              = 0x360245,      SMSG_ZONE_UNDER_ATTACK                            = 0x3B000B, @@ -2194,30 +2205,30 @@ enum OpcodeServer : uint32      SMSG_ARENA_TEAM_STATS                             = UNKNOWN_OPCODE,  }; -inline constexpr std::size_t NUM_SMSG_OPCODES = 1479; +inline constexpr std::size_t NUM_SMSG_OPCODES = 1484;  inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeServer opcode)  {      uint32 idInGroup = opcode & 0xFFFF;      switch (opcode >> 16)      { -        case 0x36: return idInGroup < 857 ? idInGroup + 0 : -1; -        case 0x37: return idInGroup < 5 ? idInGroup + 857 : -1; -        case 0x3A: return idInGroup < 18 ? idInGroup + 862 : -1; -        case 0x3B: return idInGroup < 36 ? idInGroup + 880 : -1; -        case 0x3C: return idInGroup < 49 ? idInGroup + 916 : -1; -        case 0x3D: return idInGroup < 11 ? idInGroup + 965 : -1; -        case 0x3E: return idInGroup < 12 ? idInGroup + 976 : -1; -        case 0x40: return idInGroup < 82 ? idInGroup + 988 : -1; -        case 0x42: return idInGroup < 71 ? idInGroup + 1070 : -1; -        case 0x44: return idInGroup < 33 ? idInGroup + 1141 : -1; -        case 0x46: return idInGroup < 1 ? idInGroup + 1174 : -1; -        case 0x48: return idInGroup < 120 ? idInGroup + 1175 : -1; -        case 0x4A: return idInGroup < 49 ? idInGroup + 1295 : -1; -        case 0x4B: return idInGroup < 41 ? idInGroup + 1344 : -1; -        case 0x4D: return idInGroup < 85 ? idInGroup + 1385 : -1; -        case 0x4E: return idInGroup < 8 ? idInGroup + 1470 : -1; -        case 0x50: return idInGroup < 1 ? idInGroup + 1478 : -1; +        case 0x36: return idInGroup < 862 ? idInGroup + 0 : -1; +        case 0x37: return idInGroup < 5 ? idInGroup + 862 : -1; +        case 0x3A: return idInGroup < 18 ? idInGroup + 867 : -1; +        case 0x3B: return idInGroup < 36 ? idInGroup + 885 : -1; +        case 0x3C: return idInGroup < 49 ? idInGroup + 921 : -1; +        case 0x3D: return idInGroup < 11 ? idInGroup + 970 : -1; +        case 0x3E: return idInGroup < 12 ? idInGroup + 981 : -1; +        case 0x40: return idInGroup < 82 ? idInGroup + 993 : -1; +        case 0x42: return idInGroup < 71 ? idInGroup + 1075 : -1; +        case 0x44: return idInGroup < 33 ? idInGroup + 1146 : -1; +        case 0x46: return idInGroup < 1 ? idInGroup + 1179 : -1; +        case 0x48: return idInGroup < 120 ? idInGroup + 1180 : -1; +        case 0x4A: return idInGroup < 49 ? idInGroup + 1300 : -1; +        case 0x4B: return idInGroup < 41 ? idInGroup + 1349 : -1; +        case 0x4D: return idInGroup < 85 ? idInGroup + 1390 : -1; +        case 0x4E: return idInGroup < 8 ? idInGroup + 1475 : -1; +        case 0x50: return idInGroup < 1 ? idInGroup + 1483 : -1;          default: return -1;      }  } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 442e1495da3..409696dafe4 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -869,14 +869,17 @@ enum AccountDataType      GLOBAL_EDIT_MODE_CACHE              = 13,      PER_CHARACTER_EDIT_MODE_CACHE       = 14,      GLOBAL_FRONTEND_CHAT_SETTINGS       = 15, -    GLOBAL_CHARACTER_LIST_ORDER         = 16 +    GLOBAL_CHARACTER_LIST_ORDER         = 16, +    GLOBAL_COOLDOWN_MANAGER             = 17, +    PER_CHARACTER_COOLDOWN_MANAGER2     = 18, +    GLOBAL_SHOP2_PENDING_ORDERS         = 19  }; -#define NUM_ACCOUNT_DATA_TYPES        17 +#define NUM_ACCOUNT_DATA_TYPES        20 -#define ALL_ACCOUNT_DATA_CACHE_MASK 0x0001FFFFu -#define GLOBAL_CACHE_MASK           0x0001A515u -#define PER_CHARACTER_CACHE_MASK    0x00005AEAu +#define ALL_ACCOUNT_DATA_CACHE_MASK 0x000FFFFFu +#define GLOBAL_CACHE_MASK           0x000BA515u +#define PER_CHARACTER_CACHE_MASK    0x00045AEAu  struct AccountData  { diff --git a/src/server/game/Services/ClubService.cpp b/src/server/game/Services/ClubService.cpp index 0beb13ed6ba..d4689863605 100644 --- a/src/server/game/Services/ClubService.cpp +++ b/src/server/game/Services/ClubService.cpp @@ -160,7 +160,8 @@ uint32 ClubService::HandleGetMembers(club::v1::client::GetMembersRequest const*          clubMember->set_presence_level(club::v1::client::PresenceLevel::PRESENCE_LEVEL_RICH);          clubMember->set_whisper_level(club::v1::client::WhisperLevel::WHISPER_LEVEL_OPEN); -        clubMember->set_note(member.GetPublicNote()); +        std::string_view publicNote = member.GetPublicNote(); +        clubMember->set_note(publicNote.data(), publicNote.size());          clubMember->set_active(member.IsOnline());      } diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 248fd007871..7a4722f9cef 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -264,6 +264,9 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo      else if (!(auraData.Flags & AFLAG_NOCASTER))          auraData.CastUnit = aura->GetCasterGUID(); +    if (!aura->GetCastItemGUID().IsEmpty()) +        auraData.CastItem = aura->GetCastItemGUID(); +      if (auraData.Flags & AFLAG_DURATION)      {          auraData.Duration = aura->GetMaxDuration(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 01cf68b89c2..8ab3c15d1a1 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -6150,13 +6150,30 @@ void Spell::EffectCreateTraitTreeConfig()          return;      newConfig.TraitSystemID = sTraitTreeStore.AssertEntry(effectInfo->MiscValue)->TraitSystemID; -    int32 existingConfigForSystem = target->m_activePlayerData->TraitConfigs.FindIndexIf([&](UF::TraitConfig const& config) +    TraitSystemEntry const* traitSystem = sTraitSystemStore.LookupEntry(newConfig.TraitSystemID); +    if (!traitSystem) +        return; + +    switch (traitSystem->GetVariationType()) +    { +        case TraitSystemVariationType::None: +            newConfig.VariationID = 0; +            break; +        case TraitSystemVariationType::Spec: +            newConfig.VariationID = AsUnderlyingType(target->GetPrimarySpecialization()); +            break; +        default: +            return; +    } + +    int32 const* existingConfigIdForSystem = target->m_activePlayerData->TraitConfigs.FindIf([&](UF::TraitConfig const& config)      {          return static_cast<TraitConfigType>(*config.Type) == TraitConfigType::Generic -            && config.TraitSystemID == newConfig.TraitSystemID; -    }); +            && config.TraitSystemID == newConfig.TraitSystemID +            && config.VariationID == newConfig.VariationID; +    }).first; -    if (existingConfigForSystem < 0) +    if (!existingConfigIdForSystem)          target->CreateTraitConfig(newConfig);  } diff --git a/src/server/game/Spells/TraitMgr.cpp b/src/server/game/Spells/TraitMgr.cpp index 207b44e5d8a..825206942d5 100644 --- a/src/server/game/Spells/TraitMgr.cpp +++ b/src/server/game/Spells/TraitMgr.cpp @@ -459,6 +459,12 @@ void FillOwnedCurrenciesMap(WorldPackets::Traits::TraitConfig const& traitConfig                          }                      }                      break; +                case TraitCurrencyType::TraitSourcedPlayerDataElement: +                    if (currency->PlayerDataElementAccountID) +                        currencies[currency->ID] += std::visit([](auto value) { return static_cast<int32>(value); }, player.GetDataElementAccount(currency->CurrencyTypesID)); +                    else if (currency->PlayerDataElementCharacterID) +                        currencies[currency->ID] += std::visit([](auto value) { return static_cast<int32>(value); }, player.GetDataElementCharacter(currency->CurrencyTypesID)); +                    break;                  default:                      break;              } diff --git a/src/server/game/Spells/TraitMgr.h b/src/server/game/Spells/TraitMgr.h index 212abdf0351..f2f9634de8e 100644 --- a/src/server/game/Spells/TraitMgr.h +++ b/src/server/game/Spells/TraitMgr.h @@ -20,6 +20,7 @@  #include "Define.h"  #include <map> +#include <variant>  #include <vector>  class Player; @@ -69,6 +70,8 @@ struct PlayerDataAccessor      bool IsQuestRewarded(int32 questId) const;      bool HasAchieved(int32 achievementId) const;      uint32 GetPrimarySpecialization() const; +    std::variant<int64, float> GetDataElementAccount(uint32 dataElementId) const; +    std::variant<int64, float> GetDataElementCharacter(uint32 dataElementId) const;  private:      Player const* _player; diff --git a/src/server/game/Support/SupportMgr.h b/src/server/game/Support/SupportMgr.h index fc748d0a840..f224d70abe1 100644 --- a/src/server/game/Support/SupportMgr.h +++ b/src/server/game/Support/SupportMgr.h @@ -41,6 +41,10 @@ enum class ReportType : int32      Calendar                = 11,      Mail                    = 12,      PvP                     = 13, +    PvPScoreboard           = 14, +    PvPGroupMember          = 15, +    CraftingOrder           = 16, +    RecentAlly              = 17  };  enum class ReportMajorCategory : int32 diff --git a/src/server/proto/Client/api/client/v2/presence_types.pb.cc b/src/server/proto/Client/api/client/v2/presence_types.pb.cc index 5cae430dc00..a319a2ca35b 100644 --- a/src/server/proto/Client/api/client/v2/presence_types.pb.cc +++ b/src/server/proto/Client/api/client/v2/presence_types.pb.cc @@ -47,6 +47,18 @@ const ::google::protobuf::internal::GeneratedMessageReflection*  const ::google::protobuf::Descriptor* PresenceExternalIdentityFieldValue_descriptor_ = NULL;  const ::google::protobuf::internal::GeneratedMessageReflection*    PresenceExternalIdentityFieldValue_reflection_ = NULL; +const ::google::protobuf::Descriptor* LocalizedStringMapEntry_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  LocalizedStringMapEntry_reflection_ = NULL; +const ::google::protobuf::Descriptor* LocalizedStringMap_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  LocalizedStringMap_reflection_ = NULL; +const ::google::protobuf::Descriptor* RichPresenceParty_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  RichPresenceParty_reflection_ = NULL; +const ::google::protobuf::Descriptor* RichPresenceDetails_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  RichPresenceDetails_reflection_ = NULL;  const ::google::protobuf::EnumDescriptor* PresenceQueryBehavior_descriptor_ = NULL;  const ::google::protobuf::EnumDescriptor* PresenceAccountStatus_descriptor_ = NULL; @@ -193,6 +205,73 @@ void protobuf_AssignDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto() {        ::google::protobuf::DescriptorPool::generated_pool(),        ::google::protobuf::MessageFactory::generated_factory(),        sizeof(PresenceExternalIdentityFieldValue)); +  LocalizedStringMapEntry_descriptor_ = file->message_type(8); +  static const int LocalizedStringMapEntry_offsets_[2] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, locale_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, value_), +  }; +  LocalizedStringMapEntry_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      LocalizedStringMapEntry_descriptor_, +      LocalizedStringMapEntry::default_instance_, +      LocalizedStringMapEntry_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(LocalizedStringMapEntry)); +  LocalizedStringMap_descriptor_ = file->message_type(9); +  static const int LocalizedStringMap_offsets_[2] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, default_string_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, localized_entry_), +  }; +  LocalizedStringMap_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      LocalizedStringMap_descriptor_, +      LocalizedStringMap::default_instance_, +      LocalizedStringMap_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(LocalizedStringMap)); +  RichPresenceParty_descriptor_ = file->message_type(10); +  static const int RichPresenceParty_offsets_[3] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, id_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, current_size_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, max_size_), +  }; +  RichPresenceParty_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      RichPresenceParty_descriptor_, +      RichPresenceParty::default_instance_, +      RichPresenceParty_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(RichPresenceParty)); +  RichPresenceDetails_descriptor_ = file->message_type(11); +  static const int RichPresenceDetails_offsets_[4] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, state_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, party_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, large_image_url_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, small_image_url_), +  }; +  RichPresenceDetails_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      RichPresenceDetails_descriptor_, +      RichPresenceDetails::default_instance_, +      RichPresenceDetails_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(RichPresenceDetails));    PresenceQueryBehavior_descriptor_ = file->enum_type(0);    PresenceAccountStatus_descriptor_ = file->enum_type(1);  } @@ -223,6 +302,14 @@ void protobuf_RegisterTypes(const ::std::string&) {      PresenceOnlineGameAccountFieldValue_descriptor_, &PresenceOnlineGameAccountFieldValue::default_instance());    ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(      PresenceExternalIdentityFieldValue_descriptor_, &PresenceExternalIdentityFieldValue::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    LocalizedStringMapEntry_descriptor_, &LocalizedStringMapEntry::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    LocalizedStringMap_descriptor_, &LocalizedStringMap::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    RichPresenceParty_descriptor_, &RichPresenceParty::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    RichPresenceDetails_descriptor_, &RichPresenceDetails::default_instance());  }  }  // namespace @@ -244,6 +331,14 @@ void protobuf_ShutdownFile_api_2fclient_2fv2_2fpresence_5ftypes_2eproto() {    delete PresenceOnlineGameAccountFieldValue_reflection_;    delete PresenceExternalIdentityFieldValue::default_instance_;    delete PresenceExternalIdentityFieldValue_reflection_; +  delete LocalizedStringMapEntry::default_instance_; +  delete LocalizedStringMapEntry_reflection_; +  delete LocalizedStringMap::default_instance_; +  delete LocalizedStringMap_reflection_; +  delete RichPresenceParty::default_instance_; +  delete RichPresenceParty_reflection_; +  delete RichPresenceDetails::default_instance_; +  delete RichPresenceDetails_reflection_;  }  void protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto() { @@ -254,40 +349,55 @@ void protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto() {    ::bgs::protocol::v2::protobuf_AddDesc_api_2fcommon_2fv2_2fattribute_5ftypes_2eproto();    ::bgs::protocol::account::v2::protobuf_AddDesc_api_2fcommon_2fv2_2fgame_5faccount_5fhandle_2eproto(); +  ::bgs::protocol::protobuf_AddDesc_global_5fextensions_2ffield_5foptions_2eproto();    ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(      "\n\"api/client/v2/presence_types.proto\022\030bg"      "s.protocol.presence.v2\032#api/common/v2/at"      "tribute_types.proto\032\'api/common/v2/game_" -    "account_handle.proto\"L\n\017RichPresenceKey\022" -    "\020\n\010title_id\030\001 \001(\r\022\016\n\006stream\030\002 \001(\007\022\027\n\017loc" -    "alization_id\030\003 \001(\r\"U\n\020PresenceFieldKey\022\020" -    "\n\010title_id\030\001 \001(\r\022\r\n\005group\030\002 \001(\r\022\r\n\005field" -    "\030\003 \001(\r\022\021\n\tunique_id\030\004 \001(\004\"\233\001\n\rPresenceFi" -    "eld\0227\n\003key\030\001 \001(\0132*.bgs.protocol.presence" -    ".v2.PresenceFieldKey\022\'\n\005value\030\002 \001(\0132\030.bg" -    "s.protocol.v2.Variant\022\017\n\007deleted\030\003 \001(\010\022\027" -    "\n\017updated_time_us\030\004 \001(\004\"\273\001\n\022PresenceFiel" -    "dState\022\022\n\naccount_id\030\001 \001(\004\022@\n\014game_accou" -    "nt\030\002 \001(\0132*.bgs.protocol.account.v2.GameA" -    "ccountHandle\0227\n\006fields\030\003 \003(\0132\'.bgs.proto" -    "col.presence.v2.PresenceField\022\026\n\016oldest_" -    "time_us\030\004 \001(\004\"\207\001\n\023PresenceFieldUpdate\0227\n" -    "\003key\030\001 \001(\0132*.bgs.protocol.presence.v2.Pr" -    "esenceFieldKey\022\'\n\005value\030\002 \001(\0132\030.bgs.prot" -    "ocol.v2.Variant\022\016\n\006delete\030\003 \001(\010\"u\n\031Prese" -    "nceOnlineGameAccount\022@\n\014game_account\030\001 \001" -    "(\0132*.bgs.protocol.account.v2.GameAccount" -    "Handle\022\026\n\016online_time_us\030\002 \001(\004\"x\n#Presen" -    "ceOnlineGameAccountFieldValue\022Q\n\024online_" -    "game_accounts\030\001 \003(\01323.bgs.protocol.prese" -    "nce.v2.PresenceOnlineGameAccount\"K\n\"Pres" -    "enceExternalIdentityFieldValue\022\021\n\tunique" -    "_id\030\001 \001(\t\022\022\n\ndisplay_id\030\002 \001(\t*r\n\025Presenc" -    "eQueryBehavior\022\033\n\027BATTLE_NET_ACCOUNT_ONL" -    "Y\020\000\022\035\n\031INCLUDE_SAME_GAME_ACCOUNT\020\001\022\035\n\031IN" -    "CLUDE_ALL_GAME_ACCOUNTS\020\002*C\n\025PresenceAcc" -    "ountStatus\022\013\n\007OFFLINE\020\000\022\n\n\006ONLINE\020\001\022\010\n\004A" -    "WAY\020\002\022\007\n\003DND\020\003B\002H\002", 1298); +    "account_handle.proto\032%global_extensions/" +    "field_options.proto\"L\n\017RichPresenceKey\022\020" +    "\n\010title_id\030\001 \001(\r\022\016\n\006stream\030\002 \001(\007\022\027\n\017loca" +    "lization_id\030\003 \001(\r\"U\n\020PresenceFieldKey\022\020\n" +    "\010title_id\030\001 \001(\r\022\r\n\005group\030\002 \001(\r\022\r\n\005field\030" +    "\003 \001(\r\022\021\n\tunique_id\030\004 \001(\004\"\233\001\n\rPresenceFie" +    "ld\0227\n\003key\030\001 \001(\0132*.bgs.protocol.presence." +    "v2.PresenceFieldKey\022\'\n\005value\030\002 \001(\0132\030.bgs" +    ".protocol.v2.Variant\022\017\n\007deleted\030\003 \001(\010\022\027\n" +    "\017updated_time_us\030\004 \001(\004\"\273\001\n\022PresenceField" +    "State\022\022\n\naccount_id\030\001 \001(\004\022@\n\014game_accoun" +    "t\030\002 \001(\0132*.bgs.protocol.account.v2.GameAc" +    "countHandle\0227\n\006fields\030\003 \003(\0132\'.bgs.protoc" +    "ol.presence.v2.PresenceField\022\026\n\016oldest_t" +    "ime_us\030\004 \001(\004\"\207\001\n\023PresenceFieldUpdate\0227\n\003" +    "key\030\001 \001(\0132*.bgs.protocol.presence.v2.Pre" +    "senceFieldKey\022\'\n\005value\030\002 \001(\0132\030.bgs.proto" +    "col.v2.Variant\022\016\n\006delete\030\003 \001(\010\"u\n\031Presen" +    "ceOnlineGameAccount\022@\n\014game_account\030\001 \001(" +    "\0132*.bgs.protocol.account.v2.GameAccountH" +    "andle\022\026\n\016online_time_us\030\002 \001(\004\"x\n#Presenc" +    "eOnlineGameAccountFieldValue\022Q\n\024online_g" +    "ame_accounts\030\001 \003(\01323.bgs.protocol.presen" +    "ce.v2.PresenceOnlineGameAccount\"K\n\"Prese" +    "nceExternalIdentityFieldValue\022\021\n\tunique_" +    "id\030\001 \001(\t\022\022\n\ndisplay_id\030\002 \001(\t\"F\n\027Localize" +    "dStringMapEntry\022\016\n\006locale\030\001 \001(\t\022\033\n\005value" +    "\030\002 \001(\tB\014\212\371+\010\"\006\n\004\010\001\020@\"\224\001\n\022LocalizedString" +    "Map\022$\n\016default_string\030\001 \001(\tB\014\212\371+\010\"\006\n\004\010\001\020" +    "@\022X\n\017localized_entry\030\002 \003(\01321.bgs.protoco" +    "l.presence.v2.LocalizedStringMapEntryB\014\212" +    "\371+\010*\006\n\004\010\000\020 \"U\n\021RichPresenceParty\022\030\n\002id\030\001" +    " \001(\tB\014\212\371+\010\"\006\n\004\010\001\020(\022\024\n\014current_size\030\002 \001(\r" +    "\022\020\n\010max_size\030\003 \001(\r\"\336\001\n\023RichPresenceDetai" +    "ls\022;\n\005state\030\001 \001(\0132,.bgs.protocol.presenc" +    "e.v2.LocalizedStringMap\022:\n\005party\030\002 \001(\0132+" +    ".bgs.protocol.presence.v2.RichPresencePa" +    "rty\022&\n\017large_image_url\030\003 \001(\tB\r\212\371+\t\"\007\n\005\010\000" +    "\020\200\001\022&\n\017small_image_url\030\004 \001(\tB\r\212\371+\t\"\007\n\005\010\000" +    "\020\200\001*r\n\025PresenceQueryBehavior\022\033\n\027BATTLE_N" +    "ET_ACCOUNT_ONLY\020\000\022\035\n\031INCLUDE_SAME_GAME_A" +    "CCOUNT\020\001\022\035\n\031INCLUDE_ALL_GAME_ACCOUNTS\020\002*" +    "C\n\025PresenceAccountStatus\022\013\n\007OFFLINE\020\000\022\n\n" +    "\006ONLINE\020\001\022\010\n\004AWAY\020\002\022\007\n\003DND\020\003B\002H\002", 1872);    ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(      "api/client/v2/presence_types.proto", &protobuf_RegisterTypes);    RichPresenceKey::default_instance_ = new RichPresenceKey(); @@ -298,6 +408,10 @@ void protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto() {    PresenceOnlineGameAccount::default_instance_ = new PresenceOnlineGameAccount();    PresenceOnlineGameAccountFieldValue::default_instance_ = new PresenceOnlineGameAccountFieldValue();    PresenceExternalIdentityFieldValue::default_instance_ = new PresenceExternalIdentityFieldValue(); +  LocalizedStringMapEntry::default_instance_ = new LocalizedStringMapEntry(); +  LocalizedStringMap::default_instance_ = new LocalizedStringMap(); +  RichPresenceParty::default_instance_ = new RichPresenceParty(); +  RichPresenceDetails::default_instance_ = new RichPresenceDetails();    RichPresenceKey::default_instance_->InitAsDefaultInstance();    PresenceFieldKey::default_instance_->InitAsDefaultInstance();    PresenceField::default_instance_->InitAsDefaultInstance(); @@ -306,6 +420,10 @@ void protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto() {    PresenceOnlineGameAccount::default_instance_->InitAsDefaultInstance();    PresenceOnlineGameAccountFieldValue::default_instance_->InitAsDefaultInstance();    PresenceExternalIdentityFieldValue::default_instance_->InitAsDefaultInstance(); +  LocalizedStringMapEntry::default_instance_->InitAsDefaultInstance(); +  LocalizedStringMap::default_instance_->InitAsDefaultInstance(); +  RichPresenceParty::default_instance_->InitAsDefaultInstance(); +  RichPresenceDetails::default_instance_->InitAsDefaultInstance();    ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_api_2fclient_2fv2_2fpresence_5ftypes_2eproto);  } @@ -969,6 +1087,333 @@ void PresenceExternalIdentityFieldValue::Swap(PresenceExternalIdentityFieldValue    return metadata;  } +// =================================================================== + +#ifndef _MSC_VER +const int LocalizedStringMapEntry::kLocaleFieldNumber; +const int LocalizedStringMapEntry::kValueFieldNumber; +#endif  // !_MSC_VER + +LocalizedStringMapEntry::LocalizedStringMapEntry() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v2.LocalizedStringMapEntry) +} + +void LocalizedStringMapEntry::InitAsDefaultInstance() { +} + +LocalizedStringMapEntry::LocalizedStringMapEntry(const LocalizedStringMapEntry& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v2.LocalizedStringMapEntry) +} + +void LocalizedStringMapEntry::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LocalizedStringMapEntry::~LocalizedStringMapEntry() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v2.LocalizedStringMapEntry) +  SharedDtor(); +} + +void LocalizedStringMapEntry::SharedDtor() { +  if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete locale_; +  } +  if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete value_; +  } +  if (this != default_instance_) { +  } +} + +void LocalizedStringMapEntry::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LocalizedStringMapEntry::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return LocalizedStringMapEntry_descriptor_; +} + +const LocalizedStringMapEntry& LocalizedStringMapEntry::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  return *default_instance_; +} + +LocalizedStringMapEntry* LocalizedStringMapEntry::default_instance_ = NULL; + +LocalizedStringMapEntry* LocalizedStringMapEntry::New() const { +  return new LocalizedStringMapEntry; +} + +void LocalizedStringMapEntry::Swap(LocalizedStringMapEntry* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata LocalizedStringMapEntry::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = LocalizedStringMapEntry_descriptor_; +  metadata.reflection = LocalizedStringMapEntry_reflection_; +  return metadata; +} + +// =================================================================== + +#ifndef _MSC_VER +const int LocalizedStringMap::kDefaultStringFieldNumber; +const int LocalizedStringMap::kLocalizedEntryFieldNumber; +#endif  // !_MSC_VER + +LocalizedStringMap::LocalizedStringMap() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v2.LocalizedStringMap) +} + +void LocalizedStringMap::InitAsDefaultInstance() { +} + +LocalizedStringMap::LocalizedStringMap(const LocalizedStringMap& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v2.LocalizedStringMap) +} + +void LocalizedStringMap::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  default_string_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LocalizedStringMap::~LocalizedStringMap() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v2.LocalizedStringMap) +  SharedDtor(); +} + +void LocalizedStringMap::SharedDtor() { +  if (default_string_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete default_string_; +  } +  if (this != default_instance_) { +  } +} + +void LocalizedStringMap::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LocalizedStringMap::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return LocalizedStringMap_descriptor_; +} + +const LocalizedStringMap& LocalizedStringMap::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  return *default_instance_; +} + +LocalizedStringMap* LocalizedStringMap::default_instance_ = NULL; + +LocalizedStringMap* LocalizedStringMap::New() const { +  return new LocalizedStringMap; +} + +void LocalizedStringMap::Swap(LocalizedStringMap* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata LocalizedStringMap::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = LocalizedStringMap_descriptor_; +  metadata.reflection = LocalizedStringMap_reflection_; +  return metadata; +} + +// =================================================================== + +#ifndef _MSC_VER +const int RichPresenceParty::kIdFieldNumber; +const int RichPresenceParty::kCurrentSizeFieldNumber; +const int RichPresenceParty::kMaxSizeFieldNumber; +#endif  // !_MSC_VER + +RichPresenceParty::RichPresenceParty() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v2.RichPresenceParty) +} + +void RichPresenceParty::InitAsDefaultInstance() { +} + +RichPresenceParty::RichPresenceParty(const RichPresenceParty& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v2.RichPresenceParty) +} + +void RichPresenceParty::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  current_size_ = 0u; +  max_size_ = 0u; +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +RichPresenceParty::~RichPresenceParty() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v2.RichPresenceParty) +  SharedDtor(); +} + +void RichPresenceParty::SharedDtor() { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete id_; +  } +  if (this != default_instance_) { +  } +} + +void RichPresenceParty::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* RichPresenceParty::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return RichPresenceParty_descriptor_; +} + +const RichPresenceParty& RichPresenceParty::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  return *default_instance_; +} + +RichPresenceParty* RichPresenceParty::default_instance_ = NULL; + +RichPresenceParty* RichPresenceParty::New() const { +  return new RichPresenceParty; +} + +void RichPresenceParty::Swap(RichPresenceParty* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata RichPresenceParty::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = RichPresenceParty_descriptor_; +  metadata.reflection = RichPresenceParty_reflection_; +  return metadata; +} + +// =================================================================== + +#ifndef _MSC_VER +const int RichPresenceDetails::kStateFieldNumber; +const int RichPresenceDetails::kPartyFieldNumber; +const int RichPresenceDetails::kLargeImageUrlFieldNumber; +const int RichPresenceDetails::kSmallImageUrlFieldNumber; +#endif  // !_MSC_VER + +RichPresenceDetails::RichPresenceDetails() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v2.RichPresenceDetails) +} + +void RichPresenceDetails::InitAsDefaultInstance() { +  state_ = const_cast< ::bgs::protocol::presence::v2::LocalizedStringMap*>(&::bgs::protocol::presence::v2::LocalizedStringMap::default_instance()); +  party_ = const_cast< ::bgs::protocol::presence::v2::RichPresenceParty*>(&::bgs::protocol::presence::v2::RichPresenceParty::default_instance()); +} + +RichPresenceDetails::RichPresenceDetails(const RichPresenceDetails& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v2.RichPresenceDetails) +} + +void RichPresenceDetails::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  state_ = NULL; +  party_ = NULL; +  large_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  small_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +RichPresenceDetails::~RichPresenceDetails() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v2.RichPresenceDetails) +  SharedDtor(); +} + +void RichPresenceDetails::SharedDtor() { +  if (large_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete large_image_url_; +  } +  if (small_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete small_image_url_; +  } +  if (this != default_instance_) { +    delete state_; +    delete party_; +  } +} + +void RichPresenceDetails::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* RichPresenceDetails::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return RichPresenceDetails_descriptor_; +} + +const RichPresenceDetails& RichPresenceDetails::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  return *default_instance_; +} + +RichPresenceDetails* RichPresenceDetails::default_instance_ = NULL; + +RichPresenceDetails* RichPresenceDetails::New() const { +  return new RichPresenceDetails; +} + +void RichPresenceDetails::Swap(RichPresenceDetails* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata RichPresenceDetails::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = RichPresenceDetails_descriptor_; +  metadata.reflection = RichPresenceDetails_reflection_; +  return metadata; +} +  // @@protoc_insertion_point(namespace_scope)  }  // namespace v2 diff --git a/src/server/proto/Client/api/client/v2/presence_types.pb.h b/src/server/proto/Client/api/client/v2/presence_types.pb.h index d1b3259fd35..75c21494b8e 100644 --- a/src/server/proto/Client/api/client/v2/presence_types.pb.h +++ b/src/server/proto/Client/api/client/v2/presence_types.pb.h @@ -27,6 +27,7 @@  #include <google/protobuf/unknown_field_set.h>  #include "api/common/v2/attribute_types.pb.h"  #include "api/common/v2/game_account_handle.pb.h" +#include "global_extensions/field_options.pb.h"  #include "Define.h" // for TC_PROTO_API  // @@protoc_insertion_point(includes) @@ -48,6 +49,10 @@ class PresenceFieldUpdate;  class PresenceOnlineGameAccount;  class PresenceOnlineGameAccountFieldValue;  class PresenceExternalIdentityFieldValue; +class LocalizedStringMapEntry; +class LocalizedStringMap; +class RichPresenceParty; +class RichPresenceDetails;  enum PresenceQueryBehavior {    BATTLE_NET_ACCOUNT_ONLY = 0, @@ -796,6 +801,377 @@ class TC_PROTO_API PresenceExternalIdentityFieldValue : public ::google::protobu    void InitAsDefaultInstance();    static PresenceExternalIdentityFieldValue* default_instance_;  }; +// ------------------------------------------------------------------- + +class TC_PROTO_API LocalizedStringMapEntry : public ::google::protobuf::Message { + public: +  LocalizedStringMapEntry(); +  virtual ~LocalizedStringMapEntry(); + +  LocalizedStringMapEntry(const LocalizedStringMapEntry& from); + +  inline LocalizedStringMapEntry& operator=(const LocalizedStringMapEntry& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const LocalizedStringMapEntry& default_instance(); + +  void Swap(LocalizedStringMapEntry* other); + +  // implements Message ---------------------------------------------- + +  LocalizedStringMapEntry* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional string locale = 1; +  inline bool has_locale() const; +  inline void clear_locale(); +  static const int kLocaleFieldNumber = 1; +  inline const ::std::string& locale() const; +  inline void set_locale(const ::std::string& value); +  inline void set_locale(const char* value); +  inline void set_locale(const char* value, size_t size); +  inline ::std::string* mutable_locale(); +  inline ::std::string* release_locale(); +  inline void set_allocated_locale(::std::string* locale); + +  // optional string value = 2; +  inline bool has_value() const; +  inline void clear_value(); +  static const int kValueFieldNumber = 2; +  inline const ::std::string& value() const; +  inline void set_value(const ::std::string& value); +  inline void set_value(const char* value); +  inline void set_value(const char* value, size_t size); +  inline ::std::string* mutable_value(); +  inline ::std::string* release_value(); +  inline void set_allocated_value(::std::string* value); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v2.LocalizedStringMapEntry) + private: +  inline void set_has_locale(); +  inline void clear_has_locale(); +  inline void set_has_value(); +  inline void clear_has_value(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* locale_; +  ::std::string* value_; +  friend void TC_PROTO_API protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static LocalizedStringMapEntry* default_instance_; +}; +// ------------------------------------------------------------------- + +class TC_PROTO_API LocalizedStringMap : public ::google::protobuf::Message { + public: +  LocalizedStringMap(); +  virtual ~LocalizedStringMap(); + +  LocalizedStringMap(const LocalizedStringMap& from); + +  inline LocalizedStringMap& operator=(const LocalizedStringMap& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const LocalizedStringMap& default_instance(); + +  void Swap(LocalizedStringMap* other); + +  // implements Message ---------------------------------------------- + +  LocalizedStringMap* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional string default_string = 1; +  inline bool has_default_string() const; +  inline void clear_default_string(); +  static const int kDefaultStringFieldNumber = 1; +  inline const ::std::string& default_string() const; +  inline void set_default_string(const ::std::string& value); +  inline void set_default_string(const char* value); +  inline void set_default_string(const char* value, size_t size); +  inline ::std::string* mutable_default_string(); +  inline ::std::string* release_default_string(); +  inline void set_allocated_default_string(::std::string* default_string); + +  // repeated .bgs.protocol.presence.v2.LocalizedStringMapEntry localized_entry = 2; +  inline int localized_entry_size() const; +  inline void clear_localized_entry(); +  static const int kLocalizedEntryFieldNumber = 2; +  inline const ::bgs::protocol::presence::v2::LocalizedStringMapEntry& localized_entry(int index) const; +  inline ::bgs::protocol::presence::v2::LocalizedStringMapEntry* mutable_localized_entry(int index); +  inline ::bgs::protocol::presence::v2::LocalizedStringMapEntry* add_localized_entry(); +  inline const ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v2::LocalizedStringMapEntry >& +      localized_entry() const; +  inline ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v2::LocalizedStringMapEntry >* +      mutable_localized_entry(); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v2.LocalizedStringMap) + private: +  inline void set_has_default_string(); +  inline void clear_has_default_string(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* default_string_; +  ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v2::LocalizedStringMapEntry > localized_entry_; +  friend void TC_PROTO_API protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static LocalizedStringMap* default_instance_; +}; +// ------------------------------------------------------------------- + +class TC_PROTO_API RichPresenceParty : public ::google::protobuf::Message { + public: +  RichPresenceParty(); +  virtual ~RichPresenceParty(); + +  RichPresenceParty(const RichPresenceParty& from); + +  inline RichPresenceParty& operator=(const RichPresenceParty& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const RichPresenceParty& default_instance(); + +  void Swap(RichPresenceParty* other); + +  // implements Message ---------------------------------------------- + +  RichPresenceParty* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional string id = 1; +  inline bool has_id() const; +  inline void clear_id(); +  static const int kIdFieldNumber = 1; +  inline const ::std::string& id() const; +  inline void set_id(const ::std::string& value); +  inline void set_id(const char* value); +  inline void set_id(const char* value, size_t size); +  inline ::std::string* mutable_id(); +  inline ::std::string* release_id(); +  inline void set_allocated_id(::std::string* id); + +  // optional uint32 current_size = 2; +  inline bool has_current_size() const; +  inline void clear_current_size(); +  static const int kCurrentSizeFieldNumber = 2; +  inline ::google::protobuf::uint32 current_size() const; +  inline void set_current_size(::google::protobuf::uint32 value); + +  // optional uint32 max_size = 3; +  inline bool has_max_size() const; +  inline void clear_max_size(); +  static const int kMaxSizeFieldNumber = 3; +  inline ::google::protobuf::uint32 max_size() const; +  inline void set_max_size(::google::protobuf::uint32 value); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v2.RichPresenceParty) + private: +  inline void set_has_id(); +  inline void clear_has_id(); +  inline void set_has_current_size(); +  inline void clear_has_current_size(); +  inline void set_has_max_size(); +  inline void clear_has_max_size(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* id_; +  ::google::protobuf::uint32 current_size_; +  ::google::protobuf::uint32 max_size_; +  friend void TC_PROTO_API protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static RichPresenceParty* default_instance_; +}; +// ------------------------------------------------------------------- + +class TC_PROTO_API RichPresenceDetails : public ::google::protobuf::Message { + public: +  RichPresenceDetails(); +  virtual ~RichPresenceDetails(); + +  RichPresenceDetails(const RichPresenceDetails& from); + +  inline RichPresenceDetails& operator=(const RichPresenceDetails& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const RichPresenceDetails& default_instance(); + +  void Swap(RichPresenceDetails* other); + +  // implements Message ---------------------------------------------- + +  RichPresenceDetails* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional .bgs.protocol.presence.v2.LocalizedStringMap state = 1; +  inline bool has_state() const; +  inline void clear_state(); +  static const int kStateFieldNumber = 1; +  inline const ::bgs::protocol::presence::v2::LocalizedStringMap& state() const; +  inline ::bgs::protocol::presence::v2::LocalizedStringMap* mutable_state(); +  inline ::bgs::protocol::presence::v2::LocalizedStringMap* release_state(); +  inline void set_allocated_state(::bgs::protocol::presence::v2::LocalizedStringMap* state); + +  // optional .bgs.protocol.presence.v2.RichPresenceParty party = 2; +  inline bool has_party() const; +  inline void clear_party(); +  static const int kPartyFieldNumber = 2; +  inline const ::bgs::protocol::presence::v2::RichPresenceParty& party() const; +  inline ::bgs::protocol::presence::v2::RichPresenceParty* mutable_party(); +  inline ::bgs::protocol::presence::v2::RichPresenceParty* release_party(); +  inline void set_allocated_party(::bgs::protocol::presence::v2::RichPresenceParty* party); + +  // optional string large_image_url = 3; +  inline bool has_large_image_url() const; +  inline void clear_large_image_url(); +  static const int kLargeImageUrlFieldNumber = 3; +  inline const ::std::string& large_image_url() const; +  inline void set_large_image_url(const ::std::string& value); +  inline void set_large_image_url(const char* value); +  inline void set_large_image_url(const char* value, size_t size); +  inline ::std::string* mutable_large_image_url(); +  inline ::std::string* release_large_image_url(); +  inline void set_allocated_large_image_url(::std::string* large_image_url); + +  // optional string small_image_url = 4; +  inline bool has_small_image_url() const; +  inline void clear_small_image_url(); +  static const int kSmallImageUrlFieldNumber = 4; +  inline const ::std::string& small_image_url() const; +  inline void set_small_image_url(const ::std::string& value); +  inline void set_small_image_url(const char* value); +  inline void set_small_image_url(const char* value, size_t size); +  inline ::std::string* mutable_small_image_url(); +  inline ::std::string* release_small_image_url(); +  inline void set_allocated_small_image_url(::std::string* small_image_url); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v2.RichPresenceDetails) + private: +  inline void set_has_state(); +  inline void clear_has_state(); +  inline void set_has_party(); +  inline void clear_has_party(); +  inline void set_has_large_image_url(); +  inline void clear_has_large_image_url(); +  inline void set_has_small_image_url(); +  inline void clear_has_small_image_url(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::bgs::protocol::presence::v2::LocalizedStringMap* state_; +  ::bgs::protocol::presence::v2::RichPresenceParty* party_; +  ::std::string* large_image_url_; +  ::std::string* small_image_url_; +  friend void TC_PROTO_API protobuf_AddDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_api_2fclient_2fv2_2fpresence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static RichPresenceDetails* default_instance_; +};  // ===================================================================  // =================================================================== @@ -1602,6 +1978,638 @@ inline void PresenceExternalIdentityFieldValue::set_allocated_display_id(::std::    // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.PresenceExternalIdentityFieldValue.display_id)  } +// ------------------------------------------------------------------- + +// LocalizedStringMapEntry + +// optional string locale = 1; +inline bool LocalizedStringMapEntry::has_locale() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LocalizedStringMapEntry::set_has_locale() { +  _has_bits_[0] |= 0x00000001u; +} +inline void LocalizedStringMapEntry::clear_has_locale() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void LocalizedStringMapEntry::clear_locale() { +  if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_->clear(); +  } +  clear_has_locale(); +} +inline const ::std::string& LocalizedStringMapEntry::locale() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.LocalizedStringMapEntry.locale) +  return *locale_; +} +inline void LocalizedStringMapEntry::set_locale(const ::std::string& value) { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  locale_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.LocalizedStringMapEntry.locale) +} +inline void LocalizedStringMapEntry::set_locale(const char* value) { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  locale_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v2.LocalizedStringMapEntry.locale) +} +inline void LocalizedStringMapEntry::set_locale(const char* value, size_t size) { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  locale_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v2.LocalizedStringMapEntry.locale) +} +inline ::std::string* LocalizedStringMapEntry::mutable_locale() { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.LocalizedStringMapEntry.locale) +  return locale_; +} +inline ::std::string* LocalizedStringMapEntry::release_locale() { +  clear_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = locale_; +    locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void LocalizedStringMapEntry::set_allocated_locale(::std::string* locale) { +  if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete locale_; +  } +  if (locale) { +    set_has_locale(); +    locale_ = locale; +  } else { +    clear_has_locale(); +    locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.LocalizedStringMapEntry.locale) +} + +// optional string value = 2; +inline bool LocalizedStringMapEntry::has_value() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void LocalizedStringMapEntry::set_has_value() { +  _has_bits_[0] |= 0x00000002u; +} +inline void LocalizedStringMapEntry::clear_has_value() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void LocalizedStringMapEntry::clear_value() { +  if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_->clear(); +  } +  clear_has_value(); +} +inline const ::std::string& LocalizedStringMapEntry::value() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.LocalizedStringMapEntry.value) +  return *value_; +} +inline void LocalizedStringMapEntry::set_value(const ::std::string& value) { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  value_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.LocalizedStringMapEntry.value) +} +inline void LocalizedStringMapEntry::set_value(const char* value) { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  value_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v2.LocalizedStringMapEntry.value) +} +inline void LocalizedStringMapEntry::set_value(const char* value, size_t size) { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  value_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v2.LocalizedStringMapEntry.value) +} +inline ::std::string* LocalizedStringMapEntry::mutable_value() { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.LocalizedStringMapEntry.value) +  return value_; +} +inline ::std::string* LocalizedStringMapEntry::release_value() { +  clear_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = value_; +    value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void LocalizedStringMapEntry::set_allocated_value(::std::string* value) { +  if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete value_; +  } +  if (value) { +    set_has_value(); +    value_ = value; +  } else { +    clear_has_value(); +    value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.LocalizedStringMapEntry.value) +} + +// ------------------------------------------------------------------- + +// LocalizedStringMap + +// optional string default_string = 1; +inline bool LocalizedStringMap::has_default_string() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LocalizedStringMap::set_has_default_string() { +  _has_bits_[0] |= 0x00000001u; +} +inline void LocalizedStringMap::clear_has_default_string() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void LocalizedStringMap::clear_default_string() { +  if (default_string_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_->clear(); +  } +  clear_has_default_string(); +} +inline const ::std::string& LocalizedStringMap::default_string() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.LocalizedStringMap.default_string) +  return *default_string_; +} +inline void LocalizedStringMap::set_default_string(const ::std::string& value) { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  default_string_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.LocalizedStringMap.default_string) +} +inline void LocalizedStringMap::set_default_string(const char* value) { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  default_string_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v2.LocalizedStringMap.default_string) +} +inline void LocalizedStringMap::set_default_string(const char* value, size_t size) { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  default_string_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v2.LocalizedStringMap.default_string) +} +inline ::std::string* LocalizedStringMap::mutable_default_string() { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.LocalizedStringMap.default_string) +  return default_string_; +} +inline ::std::string* LocalizedStringMap::release_default_string() { +  clear_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = default_string_; +    default_string_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void LocalizedStringMap::set_allocated_default_string(::std::string* default_string) { +  if (default_string_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete default_string_; +  } +  if (default_string) { +    set_has_default_string(); +    default_string_ = default_string; +  } else { +    clear_has_default_string(); +    default_string_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.LocalizedStringMap.default_string) +} + +// repeated .bgs.protocol.presence.v2.LocalizedStringMapEntry localized_entry = 2; +inline int LocalizedStringMap::localized_entry_size() const { +  return localized_entry_.size(); +} +inline void LocalizedStringMap::clear_localized_entry() { +  localized_entry_.Clear(); +} +inline const ::bgs::protocol::presence::v2::LocalizedStringMapEntry& LocalizedStringMap::localized_entry(int index) const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.LocalizedStringMap.localized_entry) +  return localized_entry_.Get(index); +} +inline ::bgs::protocol::presence::v2::LocalizedStringMapEntry* LocalizedStringMap::mutable_localized_entry(int index) { +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.LocalizedStringMap.localized_entry) +  return localized_entry_.Mutable(index); +} +inline ::bgs::protocol::presence::v2::LocalizedStringMapEntry* LocalizedStringMap::add_localized_entry() { +  // @@protoc_insertion_point(field_add:bgs.protocol.presence.v2.LocalizedStringMap.localized_entry) +  return localized_entry_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v2::LocalizedStringMapEntry >& +LocalizedStringMap::localized_entry() const { +  // @@protoc_insertion_point(field_list:bgs.protocol.presence.v2.LocalizedStringMap.localized_entry) +  return localized_entry_; +} +inline ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v2::LocalizedStringMapEntry >* +LocalizedStringMap::mutable_localized_entry() { +  // @@protoc_insertion_point(field_mutable_list:bgs.protocol.presence.v2.LocalizedStringMap.localized_entry) +  return &localized_entry_; +} + +// ------------------------------------------------------------------- + +// RichPresenceParty + +// optional string id = 1; +inline bool RichPresenceParty::has_id() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void RichPresenceParty::set_has_id() { +  _has_bits_[0] |= 0x00000001u; +} +inline void RichPresenceParty::clear_has_id() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void RichPresenceParty::clear_id() { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_->clear(); +  } +  clear_has_id(); +} +inline const ::std::string& RichPresenceParty::id() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceParty.id) +  return *id_; +} +inline void RichPresenceParty::set_id(const ::std::string& value) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.RichPresenceParty.id) +} +inline void RichPresenceParty::set_id(const char* value) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v2.RichPresenceParty.id) +} +inline void RichPresenceParty::set_id(const char* value, size_t size) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v2.RichPresenceParty.id) +} +inline ::std::string* RichPresenceParty::mutable_id() { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.RichPresenceParty.id) +  return id_; +} +inline ::std::string* RichPresenceParty::release_id() { +  clear_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = id_; +    id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void RichPresenceParty::set_allocated_id(::std::string* id) { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete id_; +  } +  if (id) { +    set_has_id(); +    id_ = id; +  } else { +    clear_has_id(); +    id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.RichPresenceParty.id) +} + +// optional uint32 current_size = 2; +inline bool RichPresenceParty::has_current_size() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void RichPresenceParty::set_has_current_size() { +  _has_bits_[0] |= 0x00000002u; +} +inline void RichPresenceParty::clear_has_current_size() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void RichPresenceParty::clear_current_size() { +  current_size_ = 0u; +  clear_has_current_size(); +} +inline ::google::protobuf::uint32 RichPresenceParty::current_size() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceParty.current_size) +  return current_size_; +} +inline void RichPresenceParty::set_current_size(::google::protobuf::uint32 value) { +  set_has_current_size(); +  current_size_ = value; +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.RichPresenceParty.current_size) +} + +// optional uint32 max_size = 3; +inline bool RichPresenceParty::has_max_size() const { +  return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void RichPresenceParty::set_has_max_size() { +  _has_bits_[0] |= 0x00000004u; +} +inline void RichPresenceParty::clear_has_max_size() { +  _has_bits_[0] &= ~0x00000004u; +} +inline void RichPresenceParty::clear_max_size() { +  max_size_ = 0u; +  clear_has_max_size(); +} +inline ::google::protobuf::uint32 RichPresenceParty::max_size() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceParty.max_size) +  return max_size_; +} +inline void RichPresenceParty::set_max_size(::google::protobuf::uint32 value) { +  set_has_max_size(); +  max_size_ = value; +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.RichPresenceParty.max_size) +} + +// ------------------------------------------------------------------- + +// RichPresenceDetails + +// optional .bgs.protocol.presence.v2.LocalizedStringMap state = 1; +inline bool RichPresenceDetails::has_state() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void RichPresenceDetails::set_has_state() { +  _has_bits_[0] |= 0x00000001u; +} +inline void RichPresenceDetails::clear_has_state() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void RichPresenceDetails::clear_state() { +  if (state_ != NULL) state_->::bgs::protocol::presence::v2::LocalizedStringMap::Clear(); +  clear_has_state(); +} +inline const ::bgs::protocol::presence::v2::LocalizedStringMap& RichPresenceDetails::state() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceDetails.state) +  return state_ != NULL ? *state_ : *default_instance_->state_; +} +inline ::bgs::protocol::presence::v2::LocalizedStringMap* RichPresenceDetails::mutable_state() { +  set_has_state(); +  if (state_ == NULL) state_ = new ::bgs::protocol::presence::v2::LocalizedStringMap; +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.RichPresenceDetails.state) +  return state_; +} +inline ::bgs::protocol::presence::v2::LocalizedStringMap* RichPresenceDetails::release_state() { +  clear_has_state(); +  ::bgs::protocol::presence::v2::LocalizedStringMap* temp = state_; +  state_ = NULL; +  return temp; +} +inline void RichPresenceDetails::set_allocated_state(::bgs::protocol::presence::v2::LocalizedStringMap* state) { +  delete state_; +  state_ = state; +  if (state) { +    set_has_state(); +  } else { +    clear_has_state(); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.RichPresenceDetails.state) +} + +// optional .bgs.protocol.presence.v2.RichPresenceParty party = 2; +inline bool RichPresenceDetails::has_party() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void RichPresenceDetails::set_has_party() { +  _has_bits_[0] |= 0x00000002u; +} +inline void RichPresenceDetails::clear_has_party() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void RichPresenceDetails::clear_party() { +  if (party_ != NULL) party_->::bgs::protocol::presence::v2::RichPresenceParty::Clear(); +  clear_has_party(); +} +inline const ::bgs::protocol::presence::v2::RichPresenceParty& RichPresenceDetails::party() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceDetails.party) +  return party_ != NULL ? *party_ : *default_instance_->party_; +} +inline ::bgs::protocol::presence::v2::RichPresenceParty* RichPresenceDetails::mutable_party() { +  set_has_party(); +  if (party_ == NULL) party_ = new ::bgs::protocol::presence::v2::RichPresenceParty; +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.RichPresenceDetails.party) +  return party_; +} +inline ::bgs::protocol::presence::v2::RichPresenceParty* RichPresenceDetails::release_party() { +  clear_has_party(); +  ::bgs::protocol::presence::v2::RichPresenceParty* temp = party_; +  party_ = NULL; +  return temp; +} +inline void RichPresenceDetails::set_allocated_party(::bgs::protocol::presence::v2::RichPresenceParty* party) { +  delete party_; +  party_ = party; +  if (party) { +    set_has_party(); +  } else { +    clear_has_party(); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.RichPresenceDetails.party) +} + +// optional string large_image_url = 3; +inline bool RichPresenceDetails::has_large_image_url() const { +  return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void RichPresenceDetails::set_has_large_image_url() { +  _has_bits_[0] |= 0x00000004u; +} +inline void RichPresenceDetails::clear_has_large_image_url() { +  _has_bits_[0] &= ~0x00000004u; +} +inline void RichPresenceDetails::clear_large_image_url() { +  if (large_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_->clear(); +  } +  clear_has_large_image_url(); +} +inline const ::std::string& RichPresenceDetails::large_image_url() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceDetails.large_image_url) +  return *large_image_url_; +} +inline void RichPresenceDetails::set_large_image_url(const ::std::string& value) { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  large_image_url_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.RichPresenceDetails.large_image_url) +} +inline void RichPresenceDetails::set_large_image_url(const char* value) { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  large_image_url_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v2.RichPresenceDetails.large_image_url) +} +inline void RichPresenceDetails::set_large_image_url(const char* value, size_t size) { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  large_image_url_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v2.RichPresenceDetails.large_image_url) +} +inline ::std::string* RichPresenceDetails::mutable_large_image_url() { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.RichPresenceDetails.large_image_url) +  return large_image_url_; +} +inline ::std::string* RichPresenceDetails::release_large_image_url() { +  clear_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = large_image_url_; +    large_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void RichPresenceDetails::set_allocated_large_image_url(::std::string* large_image_url) { +  if (large_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete large_image_url_; +  } +  if (large_image_url) { +    set_has_large_image_url(); +    large_image_url_ = large_image_url; +  } else { +    clear_has_large_image_url(); +    large_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.RichPresenceDetails.large_image_url) +} + +// optional string small_image_url = 4; +inline bool RichPresenceDetails::has_small_image_url() const { +  return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void RichPresenceDetails::set_has_small_image_url() { +  _has_bits_[0] |= 0x00000008u; +} +inline void RichPresenceDetails::clear_has_small_image_url() { +  _has_bits_[0] &= ~0x00000008u; +} +inline void RichPresenceDetails::clear_small_image_url() { +  if (small_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_->clear(); +  } +  clear_has_small_image_url(); +} +inline const ::std::string& RichPresenceDetails::small_image_url() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v2.RichPresenceDetails.small_image_url) +  return *small_image_url_; +} +inline void RichPresenceDetails::set_small_image_url(const ::std::string& value) { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  small_image_url_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v2.RichPresenceDetails.small_image_url) +} +inline void RichPresenceDetails::set_small_image_url(const char* value) { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  small_image_url_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v2.RichPresenceDetails.small_image_url) +} +inline void RichPresenceDetails::set_small_image_url(const char* value, size_t size) { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  small_image_url_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v2.RichPresenceDetails.small_image_url) +} +inline ::std::string* RichPresenceDetails::mutable_small_image_url() { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v2.RichPresenceDetails.small_image_url) +  return small_image_url_; +} +inline ::std::string* RichPresenceDetails::release_small_image_url() { +  clear_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = small_image_url_; +    small_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void RichPresenceDetails::set_allocated_small_image_url(::std::string* small_image_url) { +  if (small_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete small_image_url_; +  } +  if (small_image_url) { +    set_has_small_image_url(); +    small_image_url_ = small_image_url; +  } else { +    clear_has_small_image_url(); +    small_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v2.RichPresenceDetails.small_image_url) +} +  // @@protoc_insertion_point(namespace_scope)  }  // namespace v2 diff --git a/src/server/proto/Client/api/common/v1/message_types.pb.cc b/src/server/proto/Client/api/common/v1/message_types.pb.cc index 9acca966ec1..ea994f03aaf 100644 --- a/src/server/proto/Client/api/common/v1/message_types.pb.cc +++ b/src/server/proto/Client/api/common/v1/message_types.pb.cc @@ -24,7 +24,11 @@ namespace {  const ::google::protobuf::Descriptor* MessageId_descriptor_ = NULL;  const ::google::protobuf::internal::GeneratedMessageReflection*    MessageId_reflection_ = NULL; +const ::google::protobuf::Descriptor* ExternalMessageId_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  ExternalMessageId_reflection_ = NULL;  const ::google::protobuf::EnumDescriptor* TypingIndicator_descriptor_ = NULL; +const ::google::protobuf::EnumDescriptor* ExternalMessagePlatform_descriptor_ = NULL;  const ::google::protobuf::EnumDescriptor* MessageOrigin_descriptor_ = NULL;  }  // namespace @@ -36,9 +40,11 @@ void protobuf_AssignDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto() {        "api/common/v1/message_types.proto");    GOOGLE_CHECK(file != NULL);    MessageId_descriptor_ = file->message_type(0); -  static const int MessageId_offsets_[2] = { +  static const int MessageId_offsets_[4] = {      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageId, epoch_),      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageId, position_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageId, origin_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageId, external_message_id_),    };    MessageId_reflection_ =      new ::google::protobuf::internal::GeneratedMessageReflection( @@ -51,8 +57,28 @@ void protobuf_AssignDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto() {        ::google::protobuf::DescriptorPool::generated_pool(),        ::google::protobuf::MessageFactory::generated_factory(),        sizeof(MessageId)); +  ExternalMessageId_descriptor_ = file->message_type(1); +  static const int ExternalMessageId_offsets_[5] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, platform_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, id_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, creator_id_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, creator_display_name_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, platform_data_), +  }; +  ExternalMessageId_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      ExternalMessageId_descriptor_, +      ExternalMessageId::default_instance_, +      ExternalMessageId_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ExternalMessageId, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(ExternalMessageId));    TypingIndicator_descriptor_ = file->enum_type(0); -  MessageOrigin_descriptor_ = file->enum_type(1); +  ExternalMessagePlatform_descriptor_ = file->enum_type(1); +  MessageOrigin_descriptor_ = file->enum_type(2);  }  namespace { @@ -67,6 +93,8 @@ void protobuf_RegisterTypes(const ::std::string&) {    protobuf_AssignDescriptorsOnce();    ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(      MessageId_descriptor_, &MessageId::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    ExternalMessageId_descriptor_, &ExternalMessageId::default_instance());  }  }  // namespace @@ -74,6 +102,8 @@ void protobuf_RegisterTypes(const ::std::string&) {  void protobuf_ShutdownFile_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto() {    delete MessageId::default_instance_;    delete MessageId_reflection_; +  delete ExternalMessageId::default_instance_; +  delete ExternalMessageId_reflection_;  }  void protobuf_AddDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto() { @@ -82,17 +112,34 @@ void protobuf_AddDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto() {    already_here = true;    GOOGLE_PROTOBUF_VERIFY_VERSION; +  ::bgs::protocol::v2::protobuf_AddDesc_api_2fcommon_2fv2_2fattribute_5ftypes_2eproto(); +  ::bgs::protocol::protobuf_AddDesc_global_5fextensions_2ffield_5foptions_2eproto();    ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(      "\n!api/common/v1/message_types.proto\022\014bgs" -    ".protocol\",\n\tMessageId\022\r\n\005epoch\030\001 \001(\004\022\020\n" -    "\010position\030\002 \001(\004*4\n\017TypingIndicator\022\020\n\014TY" -    "PING_START\020\000\022\017\n\013TYPING_STOP\020\001*E\n\rMessage" -    "Origin\022\031\n\025MESSAGE_ORIGIN_PLAYER\020\000\022\031\n\025MES" -    "SAGE_ORIGIN_SYSTEM\020\001B\002H\002", 224); +    ".protocol\032#api/common/v2/attribute_types" +    ".proto\032%global_extensions/field_options." +    "proto\"\217\001\n\tMessageId\022\r\n\005epoch\030\001 \001(\004\022\020\n\010po" +    "sition\030\002 \001(\004\022#\n\006origin\030\003 \001(\rB\023\202\371+\017*\rMess" +    "ageOrigin\022<\n\023external_message_id\030\004 \001(\0132\037" +    ".bgs.protocol.ExternalMessageId\"\342\001\n\021Exte" +    "rnalMessageId\022/\n\010platform\030\001 \001(\rB\035\202\371+\031*\027E" +    "xternalMessagePlatform\022\031\n\002id\030\002 \001(\tB\r\212\371+\t" +    "\"\007\n\005\010\001\020\200\002\022!\n\ncreator_id\030\003 \001(\tB\r\212\371+\t\"\007\n\005\010" +    "\001\020\200\002\022+\n\024creator_display_name\030\004 \001(\tB\r\212\371+\t" +    "\"\007\n\005\010\001\020\200\002\0221\n\rplatform_data\030\005 \003(\0132\032.bgs.p" +    "rotocol.v2.Attribute*4\n\017TypingIndicator\022" +    "\020\n\014TYPING_START\020\000\022\017\n\013TYPING_STOP\020\001*d\n\027Ex" +    "ternalMessagePlatform\022\"\n\036EXTERNAL_MESSAG" +    "E_PLATFORM_NONE\020\000\022%\n!EXTERNAL_MESSAGE_PL" +    "ATFORM_DISCORD\020\001*a\n\rMessageOrigin\022\031\n\025MES" +    "SAGE_ORIGIN_PLAYER\020\000\022\031\n\025MESSAGE_ORIGIN_S" +    "YSTEM\020\001\022\032\n\026MESSAGE_ORIGIN_DISCORD\020\002B\002H\002", 759);    ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(      "api/common/v1/message_types.proto", &protobuf_RegisterTypes);    MessageId::default_instance_ = new MessageId(); +  ExternalMessageId::default_instance_ = new ExternalMessageId();    MessageId::default_instance_->InitAsDefaultInstance(); +  ExternalMessageId::default_instance_->InitAsDefaultInstance();    ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto);  } @@ -116,6 +163,20 @@ bool TypingIndicator_IsValid(int value) {    }  } +const ::google::protobuf::EnumDescriptor* ExternalMessagePlatform_descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return ExternalMessagePlatform_descriptor_; +} +bool ExternalMessagePlatform_IsValid(int value) { +  switch(value) { +    case 0: +    case 1: +      return true; +    default: +      return false; +  } +} +  const ::google::protobuf::EnumDescriptor* MessageOrigin_descriptor() {    protobuf_AssignDescriptorsOnce();    return MessageOrigin_descriptor_; @@ -124,6 +185,7 @@ bool MessageOrigin_IsValid(int value) {    switch(value) {      case 0:      case 1: +    case 2:        return true;      default:        return false; @@ -135,6 +197,8 @@ bool MessageOrigin_IsValid(int value) {  #ifndef _MSC_VER  const int MessageId::kEpochFieldNumber;  const int MessageId::kPositionFieldNumber; +const int MessageId::kOriginFieldNumber; +const int MessageId::kExternalMessageIdFieldNumber;  #endif  // !_MSC_VER  MessageId::MessageId() @@ -144,6 +208,7 @@ MessageId::MessageId()  }  void MessageId::InitAsDefaultInstance() { +  external_message_id_ = const_cast< ::bgs::protocol::ExternalMessageId*>(&::bgs::protocol::ExternalMessageId::default_instance());  }  MessageId::MessageId(const MessageId& from) @@ -157,6 +222,8 @@ void MessageId::SharedCtor() {    _cached_size_ = 0;    epoch_ = GOOGLE_ULONGLONG(0);    position_ = GOOGLE_ULONGLONG(0); +  origin_ = 0u; +  external_message_id_ = NULL;    ::memset(_has_bits_, 0, sizeof(_has_bits_));  } @@ -167,6 +234,7 @@ MessageId::~MessageId() {  void MessageId::SharedDtor() {    if (this != default_instance_) { +    delete external_message_id_;    }  } @@ -204,6 +272,95 @@ void MessageId::Swap(MessageId* other) {    return metadata;  } +// =================================================================== + +#ifndef _MSC_VER +const int ExternalMessageId::kPlatformFieldNumber; +const int ExternalMessageId::kIdFieldNumber; +const int ExternalMessageId::kCreatorIdFieldNumber; +const int ExternalMessageId::kCreatorDisplayNameFieldNumber; +const int ExternalMessageId::kPlatformDataFieldNumber; +#endif  // !_MSC_VER + +ExternalMessageId::ExternalMessageId() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.ExternalMessageId) +} + +void ExternalMessageId::InitAsDefaultInstance() { +} + +ExternalMessageId::ExternalMessageId(const ExternalMessageId& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.ExternalMessageId) +} + +void ExternalMessageId::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  platform_ = 0u; +  id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  creator_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  creator_display_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ExternalMessageId::~ExternalMessageId() { +  // @@protoc_insertion_point(destructor:bgs.protocol.ExternalMessageId) +  SharedDtor(); +} + +void ExternalMessageId::SharedDtor() { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete id_; +  } +  if (creator_id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete creator_id_; +  } +  if (creator_display_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete creator_display_name_; +  } +  if (this != default_instance_) { +  } +} + +void ExternalMessageId::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ExternalMessageId::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return ExternalMessageId_descriptor_; +} + +const ExternalMessageId& ExternalMessageId::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto(); +  return *default_instance_; +} + +ExternalMessageId* ExternalMessageId::default_instance_ = NULL; + +ExternalMessageId* ExternalMessageId::New() const { +  return new ExternalMessageId; +} + +void ExternalMessageId::Swap(ExternalMessageId* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata ExternalMessageId::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = ExternalMessageId_descriptor_; +  metadata.reflection = ExternalMessageId_reflection_; +  return metadata; +} +  // @@protoc_insertion_point(namespace_scope)  }  // namespace protocol diff --git a/src/server/proto/Client/api/common/v1/message_types.pb.h b/src/server/proto/Client/api/common/v1/message_types.pb.h index ad1be18e5fe..a87984bcc44 100644 --- a/src/server/proto/Client/api/common/v1/message_types.pb.h +++ b/src/server/proto/Client/api/common/v1/message_types.pb.h @@ -25,6 +25,8 @@  #include <google/protobuf/extension_set.h>  #include <google/protobuf/generated_enum_reflection.h>  #include <google/protobuf/unknown_field_set.h> +#include "api/common/v2/attribute_types.pb.h" +#include "global_extensions/field_options.pb.h"  #include "Define.h" // for TC_PROTO_API  // @@protoc_insertion_point(includes) @@ -37,6 +39,7 @@ void protobuf_AssignDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto();  void protobuf_ShutdownFile_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto();  class MessageId; +class ExternalMessageId;  enum TypingIndicator {    TYPING_START = 0, @@ -57,13 +60,33 @@ inline bool TypingIndicator_Parse(    return ::google::protobuf::internal::ParseNamedEnum<TypingIndicator>(      TypingIndicator_descriptor(), name, value);  } +enum ExternalMessagePlatform { +  EXTERNAL_MESSAGE_PLATFORM_NONE = 0, +  EXTERNAL_MESSAGE_PLATFORM_DISCORD = 1 +}; +TC_PROTO_API bool ExternalMessagePlatform_IsValid(int value); +const ExternalMessagePlatform ExternalMessagePlatform_MIN = EXTERNAL_MESSAGE_PLATFORM_NONE; +const ExternalMessagePlatform ExternalMessagePlatform_MAX = EXTERNAL_MESSAGE_PLATFORM_DISCORD; +const int ExternalMessagePlatform_ARRAYSIZE = ExternalMessagePlatform_MAX + 1; + +TC_PROTO_API const ::google::protobuf::EnumDescriptor* ExternalMessagePlatform_descriptor(); +inline const ::std::string& ExternalMessagePlatform_Name(ExternalMessagePlatform value) { +  return ::google::protobuf::internal::NameOfEnum( +    ExternalMessagePlatform_descriptor(), value); +} +inline bool ExternalMessagePlatform_Parse( +    const ::std::string& name, ExternalMessagePlatform* value) { +  return ::google::protobuf::internal::ParseNamedEnum<ExternalMessagePlatform>( +    ExternalMessagePlatform_descriptor(), name, value); +}  enum MessageOrigin {    MESSAGE_ORIGIN_PLAYER = 0, -  MESSAGE_ORIGIN_SYSTEM = 1 +  MESSAGE_ORIGIN_SYSTEM = 1, +  MESSAGE_ORIGIN_DISCORD = 2  };  TC_PROTO_API bool MessageOrigin_IsValid(int value);  const MessageOrigin MessageOrigin_MIN = MESSAGE_ORIGIN_PLAYER; -const MessageOrigin MessageOrigin_MAX = MESSAGE_ORIGIN_SYSTEM; +const MessageOrigin MessageOrigin_MAX = MESSAGE_ORIGIN_DISCORD;  const int MessageOrigin_ARRAYSIZE = MessageOrigin_MAX + 1;  TC_PROTO_API const ::google::protobuf::EnumDescriptor* MessageOrigin_descriptor(); @@ -132,12 +155,32 @@ class TC_PROTO_API MessageId : public ::google::protobuf::Message {    inline ::google::protobuf::uint64 position() const;    inline void set_position(::google::protobuf::uint64 value); +  // optional uint32 origin = 3; +  inline bool has_origin() const; +  inline void clear_origin(); +  static const int kOriginFieldNumber = 3; +  inline ::google::protobuf::uint32 origin() const; +  inline void set_origin(::google::protobuf::uint32 value); + +  // optional .bgs.protocol.ExternalMessageId external_message_id = 4; +  inline bool has_external_message_id() const; +  inline void clear_external_message_id(); +  static const int kExternalMessageIdFieldNumber = 4; +  inline const ::bgs::protocol::ExternalMessageId& external_message_id() const; +  inline ::bgs::protocol::ExternalMessageId* mutable_external_message_id(); +  inline ::bgs::protocol::ExternalMessageId* release_external_message_id(); +  inline void set_allocated_external_message_id(::bgs::protocol::ExternalMessageId* external_message_id); +    // @@protoc_insertion_point(class_scope:bgs.protocol.MessageId)   private:    inline void set_has_epoch();    inline void clear_has_epoch();    inline void set_has_position();    inline void clear_has_position(); +  inline void set_has_origin(); +  inline void clear_has_origin(); +  inline void set_has_external_message_id(); +  inline void clear_has_external_message_id();    ::google::protobuf::UnknownFieldSet _unknown_fields_; @@ -145,6 +188,8 @@ class TC_PROTO_API MessageId : public ::google::protobuf::Message {    mutable int _cached_size_;    ::google::protobuf::uint64 epoch_;    ::google::protobuf::uint64 position_; +  ::bgs::protocol::ExternalMessageId* external_message_id_; +  ::google::protobuf::uint32 origin_;    friend void TC_PROTO_API protobuf_AddDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto();    friend void protobuf_AssignDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto();    friend void protobuf_ShutdownFile_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto(); @@ -152,6 +197,130 @@ class TC_PROTO_API MessageId : public ::google::protobuf::Message {    void InitAsDefaultInstance();    static MessageId* default_instance_;  }; +// ------------------------------------------------------------------- + +class TC_PROTO_API ExternalMessageId : public ::google::protobuf::Message { + public: +  ExternalMessageId(); +  virtual ~ExternalMessageId(); + +  ExternalMessageId(const ExternalMessageId& from); + +  inline ExternalMessageId& operator=(const ExternalMessageId& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const ExternalMessageId& default_instance(); + +  void Swap(ExternalMessageId* other); + +  // implements Message ---------------------------------------------- + +  ExternalMessageId* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional uint32 platform = 1; +  inline bool has_platform() const; +  inline void clear_platform(); +  static const int kPlatformFieldNumber = 1; +  inline ::google::protobuf::uint32 platform() const; +  inline void set_platform(::google::protobuf::uint32 value); + +  // optional string id = 2; +  inline bool has_id() const; +  inline void clear_id(); +  static const int kIdFieldNumber = 2; +  inline const ::std::string& id() const; +  inline void set_id(const ::std::string& value); +  inline void set_id(const char* value); +  inline void set_id(const char* value, size_t size); +  inline ::std::string* mutable_id(); +  inline ::std::string* release_id(); +  inline void set_allocated_id(::std::string* id); + +  // optional string creator_id = 3; +  inline bool has_creator_id() const; +  inline void clear_creator_id(); +  static const int kCreatorIdFieldNumber = 3; +  inline const ::std::string& creator_id() const; +  inline void set_creator_id(const ::std::string& value); +  inline void set_creator_id(const char* value); +  inline void set_creator_id(const char* value, size_t size); +  inline ::std::string* mutable_creator_id(); +  inline ::std::string* release_creator_id(); +  inline void set_allocated_creator_id(::std::string* creator_id); + +  // optional string creator_display_name = 4; +  inline bool has_creator_display_name() const; +  inline void clear_creator_display_name(); +  static const int kCreatorDisplayNameFieldNumber = 4; +  inline const ::std::string& creator_display_name() const; +  inline void set_creator_display_name(const ::std::string& value); +  inline void set_creator_display_name(const char* value); +  inline void set_creator_display_name(const char* value, size_t size); +  inline ::std::string* mutable_creator_display_name(); +  inline ::std::string* release_creator_display_name(); +  inline void set_allocated_creator_display_name(::std::string* creator_display_name); + +  // repeated .bgs.protocol.v2.Attribute platform_data = 5; +  inline int platform_data_size() const; +  inline void clear_platform_data(); +  static const int kPlatformDataFieldNumber = 5; +  inline const ::bgs::protocol::v2::Attribute& platform_data(int index) const; +  inline ::bgs::protocol::v2::Attribute* mutable_platform_data(int index); +  inline ::bgs::protocol::v2::Attribute* add_platform_data(); +  inline const ::google::protobuf::RepeatedPtrField< ::bgs::protocol::v2::Attribute >& +      platform_data() const; +  inline ::google::protobuf::RepeatedPtrField< ::bgs::protocol::v2::Attribute >* +      mutable_platform_data(); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.ExternalMessageId) + private: +  inline void set_has_platform(); +  inline void clear_has_platform(); +  inline void set_has_id(); +  inline void clear_has_id(); +  inline void set_has_creator_id(); +  inline void clear_has_creator_id(); +  inline void set_has_creator_display_name(); +  inline void clear_has_creator_display_name(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* id_; +  ::std::string* creator_id_; +  ::std::string* creator_display_name_; +  ::google::protobuf::RepeatedPtrField< ::bgs::protocol::v2::Attribute > platform_data_; +  ::google::protobuf::uint32 platform_; +  friend void TC_PROTO_API protobuf_AddDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_api_2fcommon_2fv1_2fmessage_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static ExternalMessageId* default_instance_; +};  // ===================================================================  // =================================================================== @@ -208,6 +377,357 @@ inline void MessageId::set_position(::google::protobuf::uint64 value) {    // @@protoc_insertion_point(field_set:bgs.protocol.MessageId.position)  } +// optional uint32 origin = 3; +inline bool MessageId::has_origin() const { +  return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MessageId::set_has_origin() { +  _has_bits_[0] |= 0x00000004u; +} +inline void MessageId::clear_has_origin() { +  _has_bits_[0] &= ~0x00000004u; +} +inline void MessageId::clear_origin() { +  origin_ = 0u; +  clear_has_origin(); +} +inline ::google::protobuf::uint32 MessageId::origin() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.MessageId.origin) +  return origin_; +} +inline void MessageId::set_origin(::google::protobuf::uint32 value) { +  set_has_origin(); +  origin_ = value; +  // @@protoc_insertion_point(field_set:bgs.protocol.MessageId.origin) +} + +// optional .bgs.protocol.ExternalMessageId external_message_id = 4; +inline bool MessageId::has_external_message_id() const { +  return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void MessageId::set_has_external_message_id() { +  _has_bits_[0] |= 0x00000008u; +} +inline void MessageId::clear_has_external_message_id() { +  _has_bits_[0] &= ~0x00000008u; +} +inline void MessageId::clear_external_message_id() { +  if (external_message_id_ != NULL) external_message_id_->::bgs::protocol::ExternalMessageId::Clear(); +  clear_has_external_message_id(); +} +inline const ::bgs::protocol::ExternalMessageId& MessageId::external_message_id() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.MessageId.external_message_id) +  return external_message_id_ != NULL ? *external_message_id_ : *default_instance_->external_message_id_; +} +inline ::bgs::protocol::ExternalMessageId* MessageId::mutable_external_message_id() { +  set_has_external_message_id(); +  if (external_message_id_ == NULL) external_message_id_ = new ::bgs::protocol::ExternalMessageId; +  // @@protoc_insertion_point(field_mutable:bgs.protocol.MessageId.external_message_id) +  return external_message_id_; +} +inline ::bgs::protocol::ExternalMessageId* MessageId::release_external_message_id() { +  clear_has_external_message_id(); +  ::bgs::protocol::ExternalMessageId* temp = external_message_id_; +  external_message_id_ = NULL; +  return temp; +} +inline void MessageId::set_allocated_external_message_id(::bgs::protocol::ExternalMessageId* external_message_id) { +  delete external_message_id_; +  external_message_id_ = external_message_id; +  if (external_message_id) { +    set_has_external_message_id(); +  } else { +    clear_has_external_message_id(); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.MessageId.external_message_id) +} + +// ------------------------------------------------------------------- + +// ExternalMessageId + +// optional uint32 platform = 1; +inline bool ExternalMessageId::has_platform() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ExternalMessageId::set_has_platform() { +  _has_bits_[0] |= 0x00000001u; +} +inline void ExternalMessageId::clear_has_platform() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void ExternalMessageId::clear_platform() { +  platform_ = 0u; +  clear_has_platform(); +} +inline ::google::protobuf::uint32 ExternalMessageId::platform() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.ExternalMessageId.platform) +  return platform_; +} +inline void ExternalMessageId::set_platform(::google::protobuf::uint32 value) { +  set_has_platform(); +  platform_ = value; +  // @@protoc_insertion_point(field_set:bgs.protocol.ExternalMessageId.platform) +} + +// optional string id = 2; +inline bool ExternalMessageId::has_id() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void ExternalMessageId::set_has_id() { +  _has_bits_[0] |= 0x00000002u; +} +inline void ExternalMessageId::clear_has_id() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void ExternalMessageId::clear_id() { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_->clear(); +  } +  clear_has_id(); +} +inline const ::std::string& ExternalMessageId::id() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.ExternalMessageId.id) +  return *id_; +} +inline void ExternalMessageId::set_id(const ::std::string& value) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.ExternalMessageId.id) +} +inline void ExternalMessageId::set_id(const char* value) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.ExternalMessageId.id) +} +inline void ExternalMessageId::set_id(const char* value, size_t size) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.ExternalMessageId.id) +} +inline ::std::string* ExternalMessageId::mutable_id() { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.ExternalMessageId.id) +  return id_; +} +inline ::std::string* ExternalMessageId::release_id() { +  clear_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = id_; +    id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void ExternalMessageId::set_allocated_id(::std::string* id) { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete id_; +  } +  if (id) { +    set_has_id(); +    id_ = id; +  } else { +    clear_has_id(); +    id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.ExternalMessageId.id) +} + +// optional string creator_id = 3; +inline bool ExternalMessageId::has_creator_id() const { +  return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ExternalMessageId::set_has_creator_id() { +  _has_bits_[0] |= 0x00000004u; +} +inline void ExternalMessageId::clear_has_creator_id() { +  _has_bits_[0] &= ~0x00000004u; +} +inline void ExternalMessageId::clear_creator_id() { +  if (creator_id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_id_->clear(); +  } +  clear_has_creator_id(); +} +inline const ::std::string& ExternalMessageId::creator_id() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.ExternalMessageId.creator_id) +  return *creator_id_; +} +inline void ExternalMessageId::set_creator_id(const ::std::string& value) { +  set_has_creator_id(); +  if (creator_id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_id_ = new ::std::string; +  } +  creator_id_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.ExternalMessageId.creator_id) +} +inline void ExternalMessageId::set_creator_id(const char* value) { +  set_has_creator_id(); +  if (creator_id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_id_ = new ::std::string; +  } +  creator_id_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.ExternalMessageId.creator_id) +} +inline void ExternalMessageId::set_creator_id(const char* value, size_t size) { +  set_has_creator_id(); +  if (creator_id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_id_ = new ::std::string; +  } +  creator_id_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.ExternalMessageId.creator_id) +} +inline ::std::string* ExternalMessageId::mutable_creator_id() { +  set_has_creator_id(); +  if (creator_id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_id_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.ExternalMessageId.creator_id) +  return creator_id_; +} +inline ::std::string* ExternalMessageId::release_creator_id() { +  clear_has_creator_id(); +  if (creator_id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = creator_id_; +    creator_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void ExternalMessageId::set_allocated_creator_id(::std::string* creator_id) { +  if (creator_id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete creator_id_; +  } +  if (creator_id) { +    set_has_creator_id(); +    creator_id_ = creator_id; +  } else { +    clear_has_creator_id(); +    creator_id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.ExternalMessageId.creator_id) +} + +// optional string creator_display_name = 4; +inline bool ExternalMessageId::has_creator_display_name() const { +  return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void ExternalMessageId::set_has_creator_display_name() { +  _has_bits_[0] |= 0x00000008u; +} +inline void ExternalMessageId::clear_has_creator_display_name() { +  _has_bits_[0] &= ~0x00000008u; +} +inline void ExternalMessageId::clear_creator_display_name() { +  if (creator_display_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_display_name_->clear(); +  } +  clear_has_creator_display_name(); +} +inline const ::std::string& ExternalMessageId::creator_display_name() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.ExternalMessageId.creator_display_name) +  return *creator_display_name_; +} +inline void ExternalMessageId::set_creator_display_name(const ::std::string& value) { +  set_has_creator_display_name(); +  if (creator_display_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_display_name_ = new ::std::string; +  } +  creator_display_name_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.ExternalMessageId.creator_display_name) +} +inline void ExternalMessageId::set_creator_display_name(const char* value) { +  set_has_creator_display_name(); +  if (creator_display_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_display_name_ = new ::std::string; +  } +  creator_display_name_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.ExternalMessageId.creator_display_name) +} +inline void ExternalMessageId::set_creator_display_name(const char* value, size_t size) { +  set_has_creator_display_name(); +  if (creator_display_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_display_name_ = new ::std::string; +  } +  creator_display_name_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.ExternalMessageId.creator_display_name) +} +inline ::std::string* ExternalMessageId::mutable_creator_display_name() { +  set_has_creator_display_name(); +  if (creator_display_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    creator_display_name_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.ExternalMessageId.creator_display_name) +  return creator_display_name_; +} +inline ::std::string* ExternalMessageId::release_creator_display_name() { +  clear_has_creator_display_name(); +  if (creator_display_name_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = creator_display_name_; +    creator_display_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void ExternalMessageId::set_allocated_creator_display_name(::std::string* creator_display_name) { +  if (creator_display_name_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete creator_display_name_; +  } +  if (creator_display_name) { +    set_has_creator_display_name(); +    creator_display_name_ = creator_display_name; +  } else { +    clear_has_creator_display_name(); +    creator_display_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.ExternalMessageId.creator_display_name) +} + +// repeated .bgs.protocol.v2.Attribute platform_data = 5; +inline int ExternalMessageId::platform_data_size() const { +  return platform_data_.size(); +} +inline void ExternalMessageId::clear_platform_data() { +  platform_data_.Clear(); +} +inline const ::bgs::protocol::v2::Attribute& ExternalMessageId::platform_data(int index) const { +  // @@protoc_insertion_point(field_get:bgs.protocol.ExternalMessageId.platform_data) +  return platform_data_.Get(index); +} +inline ::bgs::protocol::v2::Attribute* ExternalMessageId::mutable_platform_data(int index) { +  // @@protoc_insertion_point(field_mutable:bgs.protocol.ExternalMessageId.platform_data) +  return platform_data_.Mutable(index); +} +inline ::bgs::protocol::v2::Attribute* ExternalMessageId::add_platform_data() { +  // @@protoc_insertion_point(field_add:bgs.protocol.ExternalMessageId.platform_data) +  return platform_data_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::bgs::protocol::v2::Attribute >& +ExternalMessageId::platform_data() const { +  // @@protoc_insertion_point(field_list:bgs.protocol.ExternalMessageId.platform_data) +  return platform_data_; +} +inline ::google::protobuf::RepeatedPtrField< ::bgs::protocol::v2::Attribute >* +ExternalMessageId::mutable_platform_data() { +  // @@protoc_insertion_point(field_mutable_list:bgs.protocol.ExternalMessageId.platform_data) +  return &platform_data_; +} +  // @@protoc_insertion_point(namespace_scope)  }  // namespace protocol @@ -221,6 +741,11 @@ template <>  inline const EnumDescriptor* GetEnumDescriptor< ::bgs::protocol::TypingIndicator>() {    return ::bgs::protocol::TypingIndicator_descriptor();  } +template <> struct is_proto_enum< ::bgs::protocol::ExternalMessagePlatform> : ::google::protobuf::internal::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::bgs::protocol::ExternalMessagePlatform>() { +  return ::bgs::protocol::ExternalMessagePlatform_descriptor(); +}  template <> struct is_proto_enum< ::bgs::protocol::MessageOrigin> : ::google::protobuf::internal::true_type {};  template <>  inline const EnumDescriptor* GetEnumDescriptor< ::bgs::protocol::MessageOrigin>() { diff --git a/src/server/proto/Client/presence_types.pb.cc b/src/server/proto/Client/presence_types.pb.cc index 3316f5b3952..31ba589d166 100644 --- a/src/server/proto/Client/presence_types.pb.cc +++ b/src/server/proto/Client/presence_types.pb.cc @@ -42,6 +42,18 @@ const ::google::protobuf::internal::GeneratedMessageReflection*  const ::google::protobuf::Descriptor* ChannelState_descriptor_ = NULL;  const ::google::protobuf::internal::GeneratedMessageReflection*    ChannelState_reflection_ = NULL; +const ::google::protobuf::Descriptor* LocalizedStringMapEntry_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  LocalizedStringMapEntry_reflection_ = NULL; +const ::google::protobuf::Descriptor* LocalizedStringMap_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  LocalizedStringMap_reflection_ = NULL; +const ::google::protobuf::Descriptor* RichPresenceParty_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  RichPresenceParty_reflection_ = NULL; +const ::google::protobuf::Descriptor* RichPresenceDetails_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* +  RichPresenceDetails_reflection_ = NULL;  }  // namespace @@ -152,6 +164,73 @@ void protobuf_AssignDesc_presence_5ftypes_2eproto() {        ::google::protobuf::DescriptorPool::generated_pool(),        ::google::protobuf::MessageFactory::generated_factory(),        sizeof(ChannelState)); +  LocalizedStringMapEntry_descriptor_ = file->message_type(6); +  static const int LocalizedStringMapEntry_offsets_[2] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, locale_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, value_), +  }; +  LocalizedStringMapEntry_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      LocalizedStringMapEntry_descriptor_, +      LocalizedStringMapEntry::default_instance_, +      LocalizedStringMapEntry_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMapEntry, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(LocalizedStringMapEntry)); +  LocalizedStringMap_descriptor_ = file->message_type(7); +  static const int LocalizedStringMap_offsets_[2] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, default_string_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, localized_entry_), +  }; +  LocalizedStringMap_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      LocalizedStringMap_descriptor_, +      LocalizedStringMap::default_instance_, +      LocalizedStringMap_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LocalizedStringMap, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(LocalizedStringMap)); +  RichPresenceParty_descriptor_ = file->message_type(8); +  static const int RichPresenceParty_offsets_[3] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, id_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, current_size_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, max_size_), +  }; +  RichPresenceParty_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      RichPresenceParty_descriptor_, +      RichPresenceParty::default_instance_, +      RichPresenceParty_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceParty, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(RichPresenceParty)); +  RichPresenceDetails_descriptor_ = file->message_type(9); +  static const int RichPresenceDetails_offsets_[4] = { +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, state_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, party_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, large_image_url_), +    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, small_image_url_), +  }; +  RichPresenceDetails_reflection_ = +    new ::google::protobuf::internal::GeneratedMessageReflection( +      RichPresenceDetails_descriptor_, +      RichPresenceDetails::default_instance_, +      RichPresenceDetails_offsets_, +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, _has_bits_[0]), +      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(RichPresenceDetails, _unknown_fields_), +      -1, +      ::google::protobuf::DescriptorPool::generated_pool(), +      ::google::protobuf::MessageFactory::generated_factory(), +      sizeof(RichPresenceDetails));  }  namespace { @@ -176,6 +255,14 @@ void protobuf_RegisterTypes(const ::std::string&) {      PresenceState_descriptor_, &PresenceState::default_instance());    ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(      ChannelState_descriptor_, &ChannelState::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    LocalizedStringMapEntry_descriptor_, &LocalizedStringMapEntry::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    LocalizedStringMap_descriptor_, &LocalizedStringMap::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    RichPresenceParty_descriptor_, &RichPresenceParty::default_instance()); +  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( +    RichPresenceDetails_descriptor_, &RichPresenceDetails::default_instance());  }  }  // namespace @@ -193,6 +280,14 @@ void protobuf_ShutdownFile_presence_5ftypes_2eproto() {    delete PresenceState_reflection_;    delete ChannelState::default_instance_;    delete ChannelState_reflection_; +  delete LocalizedStringMapEntry::default_instance_; +  delete LocalizedStringMapEntry_reflection_; +  delete LocalizedStringMap::default_instance_; +  delete LocalizedStringMap_reflection_; +  delete RichPresenceParty::default_instance_; +  delete RichPresenceParty_reflection_; +  delete RichPresenceDetails::default_instance_; +  delete RichPresenceDetails_reflection_;  }  void protobuf_AddDesc_presence_5ftypes_2eproto() { @@ -203,32 +298,47 @@ void protobuf_AddDesc_presence_5ftypes_2eproto() {    ::bgs::protocol::protobuf_AddDesc_attribute_5ftypes_2eproto();    ::bgs::protocol::protobuf_AddDesc_entity_5ftypes_2eproto(); +  ::bgs::protocol::protobuf_AddDesc_global_5fextensions_2ffield_5foptions_2eproto();    ::bgs::protocol::channel::v1::protobuf_AddDesc_api_2fclient_2fv1_2fchannel_5ftypes_2eproto();    ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(      "\n\024presence_types.proto\022\030bgs.protocol.pre"      "sence.v1\032\025attribute_types.proto\032\022entity_" -    "types.proto\032!api/client/v1/channel_types" -    ".proto\"W\n\033RichPresenceLocalizationKey\022\017\n" -    "\007program\030\001 \002(\007\022\016\n\006stream\030\002 \002(\007\022\027\n\017locali" -    "zation_id\030\003 \002(\r\"L\n\010FieldKey\022\017\n\007program\030\001" -    " \002(\r\022\r\n\005group\030\002 \002(\r\022\r\n\005field\030\003 \002(\r\022\021\n\tun" -    "ique_id\030\004 \001(\004\"^\n\005Field\022/\n\003key\030\001 \002(\0132\".bg" -    "s.protocol.presence.v1.FieldKey\022$\n\005value" -    "\030\002 \002(\0132\025.bgs.protocol.Variant\"\265\001\n\016FieldO" -    "peration\022.\n\005field\030\001 \002(\0132\037.bgs.protocol.p" -    "resence.v1.Field\022N\n\toperation\030\002 \001(\01626.bg" -    "s.protocol.presence.v1.FieldOperation.Op" -    "erationType:\003SET\"#\n\rOperationType\022\007\n\003SET" -    "\020\000\022\t\n\005CLEAR\020\001\"}\n\rPresenceState\022)\n\tentity" -    "_id\030\001 \001(\0132\026.bgs.protocol.EntityId\022A\n\017fie" -    "ld_operation\030\002 \003(\0132(.bgs.protocol.presen" -    "ce.v1.FieldOperation\"\356\001\n\014ChannelState\022)\n" -    "\tentity_id\030\001 \001(\0132\026.bgs.protocol.EntityId" -    "\022A\n\017field_operation\030\002 \003(\0132(.bgs.protocol" -    ".presence.v1.FieldOperation\022\017\n\007healing\030\003" -    " \001(\0102_\n\010presence\022%.bgs.protocol.channel." -    "v1.ChannelState\030e \001(\0132&.bgs.protocol.pre" -    "sence.v1.ChannelStateB\002H\002", 945); +    "types.proto\032%global_extensions/field_opt" +    "ions.proto\032!api/client/v1/channel_types." +    "proto\"W\n\033RichPresenceLocalizationKey\022\017\n\007" +    "program\030\001 \002(\007\022\016\n\006stream\030\002 \002(\007\022\027\n\017localiz" +    "ation_id\030\003 \002(\r\"L\n\010FieldKey\022\017\n\007program\030\001 " +    "\002(\r\022\r\n\005group\030\002 \002(\r\022\r\n\005field\030\003 \002(\r\022\021\n\tuni" +    "que_id\030\004 \001(\004\"^\n\005Field\022/\n\003key\030\001 \002(\0132\".bgs" +    ".protocol.presence.v1.FieldKey\022$\n\005value\030" +    "\002 \002(\0132\025.bgs.protocol.Variant\"\265\001\n\016FieldOp" +    "eration\022.\n\005field\030\001 \002(\0132\037.bgs.protocol.pr" +    "esence.v1.Field\022N\n\toperation\030\002 \001(\01626.bgs" +    ".protocol.presence.v1.FieldOperation.Ope" +    "rationType:\003SET\"#\n\rOperationType\022\007\n\003SET\020" +    "\000\022\t\n\005CLEAR\020\001\"}\n\rPresenceState\022)\n\tentity_" +    "id\030\001 \001(\0132\026.bgs.protocol.EntityId\022A\n\017fiel" +    "d_operation\030\002 \003(\0132(.bgs.protocol.presenc" +    "e.v1.FieldOperation\"\356\001\n\014ChannelState\022)\n\t" +    "entity_id\030\001 \001(\0132\026.bgs.protocol.EntityId\022" +    "A\n\017field_operation\030\002 \003(\0132(.bgs.protocol." +    "presence.v1.FieldOperation\022\017\n\007healing\030\003 " +    "\001(\0102_\n\010presence\022%.bgs.protocol.channel.v" +    "1.ChannelState\030e \001(\0132&.bgs.protocol.pres" +    "ence.v1.ChannelState\"F\n\027LocalizedStringM" +    "apEntry\022\016\n\006locale\030\001 \001(\t\022\033\n\005value\030\002 \001(\tB\014" +    "\212\371+\010\"\006\n\004\010\001\020@\"\224\001\n\022LocalizedStringMap\022$\n\016d" +    "efault_string\030\001 \001(\tB\014\212\371+\010\"\006\n\004\010\001\020@\022X\n\017loc" +    "alized_entry\030\002 \003(\01321.bgs.protocol.presen" +    "ce.v1.LocalizedStringMapEntryB\014\212\371+\010*\006\n\004\010" +    "\000\020 \"U\n\021RichPresenceParty\022\030\n\002id\030\001 \001(\tB\014\212\371" +    "+\010\"\006\n\004\010\001\020(\022\024\n\014current_size\030\002 \001(\r\022\020\n\010max_" +    "size\030\003 \001(\r\"\336\001\n\023RichPresenceDetails\022;\n\005st" +    "ate\030\001 \001(\0132,.bgs.protocol.presence.v1.Loc" +    "alizedStringMap\022:\n\005party\030\002 \001(\0132+.bgs.pro" +    "tocol.presence.v1.RichPresenceParty\022&\n\017l" +    "arge_image_url\030\003 \001(\tB\r\212\371+\t\"\007\n\005\010\000\020\200\001\022&\n\017s" +    "mall_image_url\030\004 \001(\tB\r\212\371+\t\"\007\n\005\010\000\020\200\001B\002H\002", 1519);    ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(      "presence_types.proto", &protobuf_RegisterTypes);    RichPresenceLocalizationKey::default_instance_ = new RichPresenceLocalizationKey(); @@ -237,6 +347,10 @@ void protobuf_AddDesc_presence_5ftypes_2eproto() {    FieldOperation::default_instance_ = new FieldOperation();    PresenceState::default_instance_ = new PresenceState();    ChannelState::default_instance_ = new ChannelState(); +  LocalizedStringMapEntry::default_instance_ = new LocalizedStringMapEntry(); +  LocalizedStringMap::default_instance_ = new LocalizedStringMap(); +  RichPresenceParty::default_instance_ = new RichPresenceParty(); +  RichPresenceDetails::default_instance_ = new RichPresenceDetails();    RichPresenceLocalizationKey::default_instance_->InitAsDefaultInstance();    FieldKey::default_instance_->InitAsDefaultInstance();    Field::default_instance_->InitAsDefaultInstance(); @@ -247,6 +361,10 @@ void protobuf_AddDesc_presence_5ftypes_2eproto() {      &::bgs::protocol::channel::v1::ChannelState::default_instance(),      101, 11, false, false,      &::bgs::protocol::presence::v1::ChannelState::default_instance()); +  LocalizedStringMapEntry::default_instance_->InitAsDefaultInstance(); +  LocalizedStringMap::default_instance_->InitAsDefaultInstance(); +  RichPresenceParty::default_instance_->InitAsDefaultInstance(); +  RichPresenceDetails::default_instance_->InitAsDefaultInstance();    ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_presence_5ftypes_2eproto);  } @@ -743,6 +861,333 @@ void ChannelState::Swap(ChannelState* other) {    return metadata;  } +// =================================================================== + +#ifndef _MSC_VER +const int LocalizedStringMapEntry::kLocaleFieldNumber; +const int LocalizedStringMapEntry::kValueFieldNumber; +#endif  // !_MSC_VER + +LocalizedStringMapEntry::LocalizedStringMapEntry() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v1.LocalizedStringMapEntry) +} + +void LocalizedStringMapEntry::InitAsDefaultInstance() { +} + +LocalizedStringMapEntry::LocalizedStringMapEntry(const LocalizedStringMapEntry& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v1.LocalizedStringMapEntry) +} + +void LocalizedStringMapEntry::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LocalizedStringMapEntry::~LocalizedStringMapEntry() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v1.LocalizedStringMapEntry) +  SharedDtor(); +} + +void LocalizedStringMapEntry::SharedDtor() { +  if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete locale_; +  } +  if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete value_; +  } +  if (this != default_instance_) { +  } +} + +void LocalizedStringMapEntry::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LocalizedStringMapEntry::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return LocalizedStringMapEntry_descriptor_; +} + +const LocalizedStringMapEntry& LocalizedStringMapEntry::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_presence_5ftypes_2eproto(); +  return *default_instance_; +} + +LocalizedStringMapEntry* LocalizedStringMapEntry::default_instance_ = NULL; + +LocalizedStringMapEntry* LocalizedStringMapEntry::New() const { +  return new LocalizedStringMapEntry; +} + +void LocalizedStringMapEntry::Swap(LocalizedStringMapEntry* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata LocalizedStringMapEntry::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = LocalizedStringMapEntry_descriptor_; +  metadata.reflection = LocalizedStringMapEntry_reflection_; +  return metadata; +} + +// =================================================================== + +#ifndef _MSC_VER +const int LocalizedStringMap::kDefaultStringFieldNumber; +const int LocalizedStringMap::kLocalizedEntryFieldNumber; +#endif  // !_MSC_VER + +LocalizedStringMap::LocalizedStringMap() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v1.LocalizedStringMap) +} + +void LocalizedStringMap::InitAsDefaultInstance() { +} + +LocalizedStringMap::LocalizedStringMap(const LocalizedStringMap& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v1.LocalizedStringMap) +} + +void LocalizedStringMap::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  default_string_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +LocalizedStringMap::~LocalizedStringMap() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v1.LocalizedStringMap) +  SharedDtor(); +} + +void LocalizedStringMap::SharedDtor() { +  if (default_string_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete default_string_; +  } +  if (this != default_instance_) { +  } +} + +void LocalizedStringMap::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* LocalizedStringMap::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return LocalizedStringMap_descriptor_; +} + +const LocalizedStringMap& LocalizedStringMap::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_presence_5ftypes_2eproto(); +  return *default_instance_; +} + +LocalizedStringMap* LocalizedStringMap::default_instance_ = NULL; + +LocalizedStringMap* LocalizedStringMap::New() const { +  return new LocalizedStringMap; +} + +void LocalizedStringMap::Swap(LocalizedStringMap* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata LocalizedStringMap::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = LocalizedStringMap_descriptor_; +  metadata.reflection = LocalizedStringMap_reflection_; +  return metadata; +} + +// =================================================================== + +#ifndef _MSC_VER +const int RichPresenceParty::kIdFieldNumber; +const int RichPresenceParty::kCurrentSizeFieldNumber; +const int RichPresenceParty::kMaxSizeFieldNumber; +#endif  // !_MSC_VER + +RichPresenceParty::RichPresenceParty() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v1.RichPresenceParty) +} + +void RichPresenceParty::InitAsDefaultInstance() { +} + +RichPresenceParty::RichPresenceParty(const RichPresenceParty& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v1.RichPresenceParty) +} + +void RichPresenceParty::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  current_size_ = 0u; +  max_size_ = 0u; +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +RichPresenceParty::~RichPresenceParty() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v1.RichPresenceParty) +  SharedDtor(); +} + +void RichPresenceParty::SharedDtor() { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete id_; +  } +  if (this != default_instance_) { +  } +} + +void RichPresenceParty::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* RichPresenceParty::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return RichPresenceParty_descriptor_; +} + +const RichPresenceParty& RichPresenceParty::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_presence_5ftypes_2eproto(); +  return *default_instance_; +} + +RichPresenceParty* RichPresenceParty::default_instance_ = NULL; + +RichPresenceParty* RichPresenceParty::New() const { +  return new RichPresenceParty; +} + +void RichPresenceParty::Swap(RichPresenceParty* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata RichPresenceParty::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = RichPresenceParty_descriptor_; +  metadata.reflection = RichPresenceParty_reflection_; +  return metadata; +} + +// =================================================================== + +#ifndef _MSC_VER +const int RichPresenceDetails::kStateFieldNumber; +const int RichPresenceDetails::kPartyFieldNumber; +const int RichPresenceDetails::kLargeImageUrlFieldNumber; +const int RichPresenceDetails::kSmallImageUrlFieldNumber; +#endif  // !_MSC_VER + +RichPresenceDetails::RichPresenceDetails() +  : ::google::protobuf::Message() { +  SharedCtor(); +  // @@protoc_insertion_point(constructor:bgs.protocol.presence.v1.RichPresenceDetails) +} + +void RichPresenceDetails::InitAsDefaultInstance() { +  state_ = const_cast< ::bgs::protocol::presence::v1::LocalizedStringMap*>(&::bgs::protocol::presence::v1::LocalizedStringMap::default_instance()); +  party_ = const_cast< ::bgs::protocol::presence::v1::RichPresenceParty*>(&::bgs::protocol::presence::v1::RichPresenceParty::default_instance()); +} + +RichPresenceDetails::RichPresenceDetails(const RichPresenceDetails& from) +  : ::google::protobuf::Message() { +  SharedCtor(); +  MergeFrom(from); +  // @@protoc_insertion_point(copy_constructor:bgs.protocol.presence.v1.RichPresenceDetails) +} + +void RichPresenceDetails::SharedCtor() { +  ::google::protobuf::internal::GetEmptyString(); +  _cached_size_ = 0; +  state_ = NULL; +  party_ = NULL; +  large_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  small_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +RichPresenceDetails::~RichPresenceDetails() { +  // @@protoc_insertion_point(destructor:bgs.protocol.presence.v1.RichPresenceDetails) +  SharedDtor(); +} + +void RichPresenceDetails::SharedDtor() { +  if (large_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete large_image_url_; +  } +  if (small_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete small_image_url_; +  } +  if (this != default_instance_) { +    delete state_; +    delete party_; +  } +} + +void RichPresenceDetails::SetCachedSize(int size) const { +  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); +  _cached_size_ = size; +  GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* RichPresenceDetails::descriptor() { +  protobuf_AssignDescriptorsOnce(); +  return RichPresenceDetails_descriptor_; +} + +const RichPresenceDetails& RichPresenceDetails::default_instance() { +  if (default_instance_ == NULL) protobuf_AddDesc_presence_5ftypes_2eproto(); +  return *default_instance_; +} + +RichPresenceDetails* RichPresenceDetails::default_instance_ = NULL; + +RichPresenceDetails* RichPresenceDetails::New() const { +  return new RichPresenceDetails; +} + +void RichPresenceDetails::Swap(RichPresenceDetails* other) { +  if (other != this) { +    GetReflection()->Swap(this, other);} +} + +::google::protobuf::Metadata RichPresenceDetails::GetMetadata() const { +  protobuf_AssignDescriptorsOnce(); +  ::google::protobuf::Metadata metadata; +  metadata.descriptor = RichPresenceDetails_descriptor_; +  metadata.reflection = RichPresenceDetails_reflection_; +  return metadata; +} +  // @@protoc_insertion_point(namespace_scope)  }  // namespace v1 diff --git a/src/server/proto/Client/presence_types.pb.h b/src/server/proto/Client/presence_types.pb.h index a75999f5a4b..dcd2510b86c 100644 --- a/src/server/proto/Client/presence_types.pb.h +++ b/src/server/proto/Client/presence_types.pb.h @@ -27,6 +27,7 @@  #include <google/protobuf/unknown_field_set.h>  #include "attribute_types.pb.h"  #include "entity_types.pb.h" +#include "global_extensions/field_options.pb.h"  #include "api/client/v1/channel_types.pb.h"  #include "Define.h" // for TC_PROTO_API  // @@protoc_insertion_point(includes) @@ -47,6 +48,10 @@ class Field;  class FieldOperation;  class PresenceState;  class ChannelState; +class LocalizedStringMapEntry; +class LocalizedStringMap; +class RichPresenceParty; +class RichPresenceDetails;  enum FieldOperation_OperationType {    FieldOperation_OperationType_SET = 0, @@ -607,6 +612,377 @@ class TC_PROTO_API ChannelState : public ::google::protobuf::Message {    void InitAsDefaultInstance();    static ChannelState* default_instance_;  }; +// ------------------------------------------------------------------- + +class TC_PROTO_API LocalizedStringMapEntry : public ::google::protobuf::Message { + public: +  LocalizedStringMapEntry(); +  virtual ~LocalizedStringMapEntry(); + +  LocalizedStringMapEntry(const LocalizedStringMapEntry& from); + +  inline LocalizedStringMapEntry& operator=(const LocalizedStringMapEntry& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const LocalizedStringMapEntry& default_instance(); + +  void Swap(LocalizedStringMapEntry* other); + +  // implements Message ---------------------------------------------- + +  LocalizedStringMapEntry* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional string locale = 1; +  inline bool has_locale() const; +  inline void clear_locale(); +  static const int kLocaleFieldNumber = 1; +  inline const ::std::string& locale() const; +  inline void set_locale(const ::std::string& value); +  inline void set_locale(const char* value); +  inline void set_locale(const char* value, size_t size); +  inline ::std::string* mutable_locale(); +  inline ::std::string* release_locale(); +  inline void set_allocated_locale(::std::string* locale); + +  // optional string value = 2; +  inline bool has_value() const; +  inline void clear_value(); +  static const int kValueFieldNumber = 2; +  inline const ::std::string& value() const; +  inline void set_value(const ::std::string& value); +  inline void set_value(const char* value); +  inline void set_value(const char* value, size_t size); +  inline ::std::string* mutable_value(); +  inline ::std::string* release_value(); +  inline void set_allocated_value(::std::string* value); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v1.LocalizedStringMapEntry) + private: +  inline void set_has_locale(); +  inline void clear_has_locale(); +  inline void set_has_value(); +  inline void clear_has_value(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* locale_; +  ::std::string* value_; +  friend void TC_PROTO_API protobuf_AddDesc_presence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_presence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_presence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static LocalizedStringMapEntry* default_instance_; +}; +// ------------------------------------------------------------------- + +class TC_PROTO_API LocalizedStringMap : public ::google::protobuf::Message { + public: +  LocalizedStringMap(); +  virtual ~LocalizedStringMap(); + +  LocalizedStringMap(const LocalizedStringMap& from); + +  inline LocalizedStringMap& operator=(const LocalizedStringMap& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const LocalizedStringMap& default_instance(); + +  void Swap(LocalizedStringMap* other); + +  // implements Message ---------------------------------------------- + +  LocalizedStringMap* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional string default_string = 1; +  inline bool has_default_string() const; +  inline void clear_default_string(); +  static const int kDefaultStringFieldNumber = 1; +  inline const ::std::string& default_string() const; +  inline void set_default_string(const ::std::string& value); +  inline void set_default_string(const char* value); +  inline void set_default_string(const char* value, size_t size); +  inline ::std::string* mutable_default_string(); +  inline ::std::string* release_default_string(); +  inline void set_allocated_default_string(::std::string* default_string); + +  // repeated .bgs.protocol.presence.v1.LocalizedStringMapEntry localized_entry = 2; +  inline int localized_entry_size() const; +  inline void clear_localized_entry(); +  static const int kLocalizedEntryFieldNumber = 2; +  inline const ::bgs::protocol::presence::v1::LocalizedStringMapEntry& localized_entry(int index) const; +  inline ::bgs::protocol::presence::v1::LocalizedStringMapEntry* mutable_localized_entry(int index); +  inline ::bgs::protocol::presence::v1::LocalizedStringMapEntry* add_localized_entry(); +  inline const ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v1::LocalizedStringMapEntry >& +      localized_entry() const; +  inline ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v1::LocalizedStringMapEntry >* +      mutable_localized_entry(); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v1.LocalizedStringMap) + private: +  inline void set_has_default_string(); +  inline void clear_has_default_string(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* default_string_; +  ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v1::LocalizedStringMapEntry > localized_entry_; +  friend void TC_PROTO_API protobuf_AddDesc_presence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_presence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_presence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static LocalizedStringMap* default_instance_; +}; +// ------------------------------------------------------------------- + +class TC_PROTO_API RichPresenceParty : public ::google::protobuf::Message { + public: +  RichPresenceParty(); +  virtual ~RichPresenceParty(); + +  RichPresenceParty(const RichPresenceParty& from); + +  inline RichPresenceParty& operator=(const RichPresenceParty& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const RichPresenceParty& default_instance(); + +  void Swap(RichPresenceParty* other); + +  // implements Message ---------------------------------------------- + +  RichPresenceParty* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional string id = 1; +  inline bool has_id() const; +  inline void clear_id(); +  static const int kIdFieldNumber = 1; +  inline const ::std::string& id() const; +  inline void set_id(const ::std::string& value); +  inline void set_id(const char* value); +  inline void set_id(const char* value, size_t size); +  inline ::std::string* mutable_id(); +  inline ::std::string* release_id(); +  inline void set_allocated_id(::std::string* id); + +  // optional uint32 current_size = 2; +  inline bool has_current_size() const; +  inline void clear_current_size(); +  static const int kCurrentSizeFieldNumber = 2; +  inline ::google::protobuf::uint32 current_size() const; +  inline void set_current_size(::google::protobuf::uint32 value); + +  // optional uint32 max_size = 3; +  inline bool has_max_size() const; +  inline void clear_max_size(); +  static const int kMaxSizeFieldNumber = 3; +  inline ::google::protobuf::uint32 max_size() const; +  inline void set_max_size(::google::protobuf::uint32 value); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v1.RichPresenceParty) + private: +  inline void set_has_id(); +  inline void clear_has_id(); +  inline void set_has_current_size(); +  inline void clear_has_current_size(); +  inline void set_has_max_size(); +  inline void clear_has_max_size(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::std::string* id_; +  ::google::protobuf::uint32 current_size_; +  ::google::protobuf::uint32 max_size_; +  friend void TC_PROTO_API protobuf_AddDesc_presence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_presence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_presence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static RichPresenceParty* default_instance_; +}; +// ------------------------------------------------------------------- + +class TC_PROTO_API RichPresenceDetails : public ::google::protobuf::Message { + public: +  RichPresenceDetails(); +  virtual ~RichPresenceDetails(); + +  RichPresenceDetails(const RichPresenceDetails& from); + +  inline RichPresenceDetails& operator=(const RichPresenceDetails& from) { +    CopyFrom(from); +    return *this; +  } + +  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { +    return _unknown_fields_; +  } + +  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { +    return &_unknown_fields_; +  } + +  static const ::google::protobuf::Descriptor* descriptor(); +  static const RichPresenceDetails& default_instance(); + +  void Swap(RichPresenceDetails* other); + +  // implements Message ---------------------------------------------- + +  RichPresenceDetails* New() const; +  int GetCachedSize() const { return _cached_size_; } +  private: +  void SharedCtor(); +  void SharedDtor(); +  void SetCachedSize(int size) const; +  public: +  ::google::protobuf::Metadata GetMetadata() const; + +  // nested types ---------------------------------------------------- + +  // accessors ------------------------------------------------------- + +  // optional .bgs.protocol.presence.v1.LocalizedStringMap state = 1; +  inline bool has_state() const; +  inline void clear_state(); +  static const int kStateFieldNumber = 1; +  inline const ::bgs::protocol::presence::v1::LocalizedStringMap& state() const; +  inline ::bgs::protocol::presence::v1::LocalizedStringMap* mutable_state(); +  inline ::bgs::protocol::presence::v1::LocalizedStringMap* release_state(); +  inline void set_allocated_state(::bgs::protocol::presence::v1::LocalizedStringMap* state); + +  // optional .bgs.protocol.presence.v1.RichPresenceParty party = 2; +  inline bool has_party() const; +  inline void clear_party(); +  static const int kPartyFieldNumber = 2; +  inline const ::bgs::protocol::presence::v1::RichPresenceParty& party() const; +  inline ::bgs::protocol::presence::v1::RichPresenceParty* mutable_party(); +  inline ::bgs::protocol::presence::v1::RichPresenceParty* release_party(); +  inline void set_allocated_party(::bgs::protocol::presence::v1::RichPresenceParty* party); + +  // optional string large_image_url = 3; +  inline bool has_large_image_url() const; +  inline void clear_large_image_url(); +  static const int kLargeImageUrlFieldNumber = 3; +  inline const ::std::string& large_image_url() const; +  inline void set_large_image_url(const ::std::string& value); +  inline void set_large_image_url(const char* value); +  inline void set_large_image_url(const char* value, size_t size); +  inline ::std::string* mutable_large_image_url(); +  inline ::std::string* release_large_image_url(); +  inline void set_allocated_large_image_url(::std::string* large_image_url); + +  // optional string small_image_url = 4; +  inline bool has_small_image_url() const; +  inline void clear_small_image_url(); +  static const int kSmallImageUrlFieldNumber = 4; +  inline const ::std::string& small_image_url() const; +  inline void set_small_image_url(const ::std::string& value); +  inline void set_small_image_url(const char* value); +  inline void set_small_image_url(const char* value, size_t size); +  inline ::std::string* mutable_small_image_url(); +  inline ::std::string* release_small_image_url(); +  inline void set_allocated_small_image_url(::std::string* small_image_url); + +  // @@protoc_insertion_point(class_scope:bgs.protocol.presence.v1.RichPresenceDetails) + private: +  inline void set_has_state(); +  inline void clear_has_state(); +  inline void set_has_party(); +  inline void clear_has_party(); +  inline void set_has_large_image_url(); +  inline void clear_has_large_image_url(); +  inline void set_has_small_image_url(); +  inline void clear_has_small_image_url(); + +  ::google::protobuf::UnknownFieldSet _unknown_fields_; + +  ::google::protobuf::uint32 _has_bits_[1]; +  mutable int _cached_size_; +  ::bgs::protocol::presence::v1::LocalizedStringMap* state_; +  ::bgs::protocol::presence::v1::RichPresenceParty* party_; +  ::std::string* large_image_url_; +  ::std::string* small_image_url_; +  friend void TC_PROTO_API protobuf_AddDesc_presence_5ftypes_2eproto(); +  friend void protobuf_AssignDesc_presence_5ftypes_2eproto(); +  friend void protobuf_ShutdownFile_presence_5ftypes_2eproto(); + +  void InitAsDefaultInstance(); +  static RichPresenceDetails* default_instance_; +};  // ===================================================================  // =================================================================== @@ -1117,6 +1493,638 @@ inline void ChannelState::set_healing(bool value) {    // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.ChannelState.healing)  } +// ------------------------------------------------------------------- + +// LocalizedStringMapEntry + +// optional string locale = 1; +inline bool LocalizedStringMapEntry::has_locale() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LocalizedStringMapEntry::set_has_locale() { +  _has_bits_[0] |= 0x00000001u; +} +inline void LocalizedStringMapEntry::clear_has_locale() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void LocalizedStringMapEntry::clear_locale() { +  if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_->clear(); +  } +  clear_has_locale(); +} +inline const ::std::string& LocalizedStringMapEntry::locale() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.LocalizedStringMapEntry.locale) +  return *locale_; +} +inline void LocalizedStringMapEntry::set_locale(const ::std::string& value) { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  locale_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.LocalizedStringMapEntry.locale) +} +inline void LocalizedStringMapEntry::set_locale(const char* value) { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  locale_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v1.LocalizedStringMapEntry.locale) +} +inline void LocalizedStringMapEntry::set_locale(const char* value, size_t size) { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  locale_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v1.LocalizedStringMapEntry.locale) +} +inline ::std::string* LocalizedStringMapEntry::mutable_locale() { +  set_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    locale_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.LocalizedStringMapEntry.locale) +  return locale_; +} +inline ::std::string* LocalizedStringMapEntry::release_locale() { +  clear_has_locale(); +  if (locale_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = locale_; +    locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void LocalizedStringMapEntry::set_allocated_locale(::std::string* locale) { +  if (locale_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete locale_; +  } +  if (locale) { +    set_has_locale(); +    locale_ = locale; +  } else { +    clear_has_locale(); +    locale_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.LocalizedStringMapEntry.locale) +} + +// optional string value = 2; +inline bool LocalizedStringMapEntry::has_value() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void LocalizedStringMapEntry::set_has_value() { +  _has_bits_[0] |= 0x00000002u; +} +inline void LocalizedStringMapEntry::clear_has_value() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void LocalizedStringMapEntry::clear_value() { +  if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_->clear(); +  } +  clear_has_value(); +} +inline const ::std::string& LocalizedStringMapEntry::value() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.LocalizedStringMapEntry.value) +  return *value_; +} +inline void LocalizedStringMapEntry::set_value(const ::std::string& value) { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  value_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.LocalizedStringMapEntry.value) +} +inline void LocalizedStringMapEntry::set_value(const char* value) { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  value_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v1.LocalizedStringMapEntry.value) +} +inline void LocalizedStringMapEntry::set_value(const char* value, size_t size) { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  value_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v1.LocalizedStringMapEntry.value) +} +inline ::std::string* LocalizedStringMapEntry::mutable_value() { +  set_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    value_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.LocalizedStringMapEntry.value) +  return value_; +} +inline ::std::string* LocalizedStringMapEntry::release_value() { +  clear_has_value(); +  if (value_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = value_; +    value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void LocalizedStringMapEntry::set_allocated_value(::std::string* value) { +  if (value_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete value_; +  } +  if (value) { +    set_has_value(); +    value_ = value; +  } else { +    clear_has_value(); +    value_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.LocalizedStringMapEntry.value) +} + +// ------------------------------------------------------------------- + +// LocalizedStringMap + +// optional string default_string = 1; +inline bool LocalizedStringMap::has_default_string() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void LocalizedStringMap::set_has_default_string() { +  _has_bits_[0] |= 0x00000001u; +} +inline void LocalizedStringMap::clear_has_default_string() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void LocalizedStringMap::clear_default_string() { +  if (default_string_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_->clear(); +  } +  clear_has_default_string(); +} +inline const ::std::string& LocalizedStringMap::default_string() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.LocalizedStringMap.default_string) +  return *default_string_; +} +inline void LocalizedStringMap::set_default_string(const ::std::string& value) { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  default_string_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.LocalizedStringMap.default_string) +} +inline void LocalizedStringMap::set_default_string(const char* value) { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  default_string_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v1.LocalizedStringMap.default_string) +} +inline void LocalizedStringMap::set_default_string(const char* value, size_t size) { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  default_string_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v1.LocalizedStringMap.default_string) +} +inline ::std::string* LocalizedStringMap::mutable_default_string() { +  set_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    default_string_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.LocalizedStringMap.default_string) +  return default_string_; +} +inline ::std::string* LocalizedStringMap::release_default_string() { +  clear_has_default_string(); +  if (default_string_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = default_string_; +    default_string_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void LocalizedStringMap::set_allocated_default_string(::std::string* default_string) { +  if (default_string_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete default_string_; +  } +  if (default_string) { +    set_has_default_string(); +    default_string_ = default_string; +  } else { +    clear_has_default_string(); +    default_string_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.LocalizedStringMap.default_string) +} + +// repeated .bgs.protocol.presence.v1.LocalizedStringMapEntry localized_entry = 2; +inline int LocalizedStringMap::localized_entry_size() const { +  return localized_entry_.size(); +} +inline void LocalizedStringMap::clear_localized_entry() { +  localized_entry_.Clear(); +} +inline const ::bgs::protocol::presence::v1::LocalizedStringMapEntry& LocalizedStringMap::localized_entry(int index) const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.LocalizedStringMap.localized_entry) +  return localized_entry_.Get(index); +} +inline ::bgs::protocol::presence::v1::LocalizedStringMapEntry* LocalizedStringMap::mutable_localized_entry(int index) { +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.LocalizedStringMap.localized_entry) +  return localized_entry_.Mutable(index); +} +inline ::bgs::protocol::presence::v1::LocalizedStringMapEntry* LocalizedStringMap::add_localized_entry() { +  // @@protoc_insertion_point(field_add:bgs.protocol.presence.v1.LocalizedStringMap.localized_entry) +  return localized_entry_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v1::LocalizedStringMapEntry >& +LocalizedStringMap::localized_entry() const { +  // @@protoc_insertion_point(field_list:bgs.protocol.presence.v1.LocalizedStringMap.localized_entry) +  return localized_entry_; +} +inline ::google::protobuf::RepeatedPtrField< ::bgs::protocol::presence::v1::LocalizedStringMapEntry >* +LocalizedStringMap::mutable_localized_entry() { +  // @@protoc_insertion_point(field_mutable_list:bgs.protocol.presence.v1.LocalizedStringMap.localized_entry) +  return &localized_entry_; +} + +// ------------------------------------------------------------------- + +// RichPresenceParty + +// optional string id = 1; +inline bool RichPresenceParty::has_id() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void RichPresenceParty::set_has_id() { +  _has_bits_[0] |= 0x00000001u; +} +inline void RichPresenceParty::clear_has_id() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void RichPresenceParty::clear_id() { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_->clear(); +  } +  clear_has_id(); +} +inline const ::std::string& RichPresenceParty::id() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceParty.id) +  return *id_; +} +inline void RichPresenceParty::set_id(const ::std::string& value) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.RichPresenceParty.id) +} +inline void RichPresenceParty::set_id(const char* value) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v1.RichPresenceParty.id) +} +inline void RichPresenceParty::set_id(const char* value, size_t size) { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  id_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v1.RichPresenceParty.id) +} +inline ::std::string* RichPresenceParty::mutable_id() { +  set_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    id_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.RichPresenceParty.id) +  return id_; +} +inline ::std::string* RichPresenceParty::release_id() { +  clear_has_id(); +  if (id_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = id_; +    id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void RichPresenceParty::set_allocated_id(::std::string* id) { +  if (id_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete id_; +  } +  if (id) { +    set_has_id(); +    id_ = id; +  } else { +    clear_has_id(); +    id_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.RichPresenceParty.id) +} + +// optional uint32 current_size = 2; +inline bool RichPresenceParty::has_current_size() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void RichPresenceParty::set_has_current_size() { +  _has_bits_[0] |= 0x00000002u; +} +inline void RichPresenceParty::clear_has_current_size() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void RichPresenceParty::clear_current_size() { +  current_size_ = 0u; +  clear_has_current_size(); +} +inline ::google::protobuf::uint32 RichPresenceParty::current_size() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceParty.current_size) +  return current_size_; +} +inline void RichPresenceParty::set_current_size(::google::protobuf::uint32 value) { +  set_has_current_size(); +  current_size_ = value; +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.RichPresenceParty.current_size) +} + +// optional uint32 max_size = 3; +inline bool RichPresenceParty::has_max_size() const { +  return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void RichPresenceParty::set_has_max_size() { +  _has_bits_[0] |= 0x00000004u; +} +inline void RichPresenceParty::clear_has_max_size() { +  _has_bits_[0] &= ~0x00000004u; +} +inline void RichPresenceParty::clear_max_size() { +  max_size_ = 0u; +  clear_has_max_size(); +} +inline ::google::protobuf::uint32 RichPresenceParty::max_size() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceParty.max_size) +  return max_size_; +} +inline void RichPresenceParty::set_max_size(::google::protobuf::uint32 value) { +  set_has_max_size(); +  max_size_ = value; +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.RichPresenceParty.max_size) +} + +// ------------------------------------------------------------------- + +// RichPresenceDetails + +// optional .bgs.protocol.presence.v1.LocalizedStringMap state = 1; +inline bool RichPresenceDetails::has_state() const { +  return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void RichPresenceDetails::set_has_state() { +  _has_bits_[0] |= 0x00000001u; +} +inline void RichPresenceDetails::clear_has_state() { +  _has_bits_[0] &= ~0x00000001u; +} +inline void RichPresenceDetails::clear_state() { +  if (state_ != NULL) state_->::bgs::protocol::presence::v1::LocalizedStringMap::Clear(); +  clear_has_state(); +} +inline const ::bgs::protocol::presence::v1::LocalizedStringMap& RichPresenceDetails::state() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceDetails.state) +  return state_ != NULL ? *state_ : *default_instance_->state_; +} +inline ::bgs::protocol::presence::v1::LocalizedStringMap* RichPresenceDetails::mutable_state() { +  set_has_state(); +  if (state_ == NULL) state_ = new ::bgs::protocol::presence::v1::LocalizedStringMap; +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.RichPresenceDetails.state) +  return state_; +} +inline ::bgs::protocol::presence::v1::LocalizedStringMap* RichPresenceDetails::release_state() { +  clear_has_state(); +  ::bgs::protocol::presence::v1::LocalizedStringMap* temp = state_; +  state_ = NULL; +  return temp; +} +inline void RichPresenceDetails::set_allocated_state(::bgs::protocol::presence::v1::LocalizedStringMap* state) { +  delete state_; +  state_ = state; +  if (state) { +    set_has_state(); +  } else { +    clear_has_state(); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.RichPresenceDetails.state) +} + +// optional .bgs.protocol.presence.v1.RichPresenceParty party = 2; +inline bool RichPresenceDetails::has_party() const { +  return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void RichPresenceDetails::set_has_party() { +  _has_bits_[0] |= 0x00000002u; +} +inline void RichPresenceDetails::clear_has_party() { +  _has_bits_[0] &= ~0x00000002u; +} +inline void RichPresenceDetails::clear_party() { +  if (party_ != NULL) party_->::bgs::protocol::presence::v1::RichPresenceParty::Clear(); +  clear_has_party(); +} +inline const ::bgs::protocol::presence::v1::RichPresenceParty& RichPresenceDetails::party() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceDetails.party) +  return party_ != NULL ? *party_ : *default_instance_->party_; +} +inline ::bgs::protocol::presence::v1::RichPresenceParty* RichPresenceDetails::mutable_party() { +  set_has_party(); +  if (party_ == NULL) party_ = new ::bgs::protocol::presence::v1::RichPresenceParty; +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.RichPresenceDetails.party) +  return party_; +} +inline ::bgs::protocol::presence::v1::RichPresenceParty* RichPresenceDetails::release_party() { +  clear_has_party(); +  ::bgs::protocol::presence::v1::RichPresenceParty* temp = party_; +  party_ = NULL; +  return temp; +} +inline void RichPresenceDetails::set_allocated_party(::bgs::protocol::presence::v1::RichPresenceParty* party) { +  delete party_; +  party_ = party; +  if (party) { +    set_has_party(); +  } else { +    clear_has_party(); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.RichPresenceDetails.party) +} + +// optional string large_image_url = 3; +inline bool RichPresenceDetails::has_large_image_url() const { +  return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void RichPresenceDetails::set_has_large_image_url() { +  _has_bits_[0] |= 0x00000004u; +} +inline void RichPresenceDetails::clear_has_large_image_url() { +  _has_bits_[0] &= ~0x00000004u; +} +inline void RichPresenceDetails::clear_large_image_url() { +  if (large_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_->clear(); +  } +  clear_has_large_image_url(); +} +inline const ::std::string& RichPresenceDetails::large_image_url() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceDetails.large_image_url) +  return *large_image_url_; +} +inline void RichPresenceDetails::set_large_image_url(const ::std::string& value) { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  large_image_url_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.RichPresenceDetails.large_image_url) +} +inline void RichPresenceDetails::set_large_image_url(const char* value) { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  large_image_url_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v1.RichPresenceDetails.large_image_url) +} +inline void RichPresenceDetails::set_large_image_url(const char* value, size_t size) { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  large_image_url_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v1.RichPresenceDetails.large_image_url) +} +inline ::std::string* RichPresenceDetails::mutable_large_image_url() { +  set_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    large_image_url_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.RichPresenceDetails.large_image_url) +  return large_image_url_; +} +inline ::std::string* RichPresenceDetails::release_large_image_url() { +  clear_has_large_image_url(); +  if (large_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = large_image_url_; +    large_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void RichPresenceDetails::set_allocated_large_image_url(::std::string* large_image_url) { +  if (large_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete large_image_url_; +  } +  if (large_image_url) { +    set_has_large_image_url(); +    large_image_url_ = large_image_url; +  } else { +    clear_has_large_image_url(); +    large_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.RichPresenceDetails.large_image_url) +} + +// optional string small_image_url = 4; +inline bool RichPresenceDetails::has_small_image_url() const { +  return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void RichPresenceDetails::set_has_small_image_url() { +  _has_bits_[0] |= 0x00000008u; +} +inline void RichPresenceDetails::clear_has_small_image_url() { +  _has_bits_[0] &= ~0x00000008u; +} +inline void RichPresenceDetails::clear_small_image_url() { +  if (small_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_->clear(); +  } +  clear_has_small_image_url(); +} +inline const ::std::string& RichPresenceDetails::small_image_url() const { +  // @@protoc_insertion_point(field_get:bgs.protocol.presence.v1.RichPresenceDetails.small_image_url) +  return *small_image_url_; +} +inline void RichPresenceDetails::set_small_image_url(const ::std::string& value) { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  small_image_url_->assign(value); +  // @@protoc_insertion_point(field_set:bgs.protocol.presence.v1.RichPresenceDetails.small_image_url) +} +inline void RichPresenceDetails::set_small_image_url(const char* value) { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  small_image_url_->assign(value); +  // @@protoc_insertion_point(field_set_char:bgs.protocol.presence.v1.RichPresenceDetails.small_image_url) +} +inline void RichPresenceDetails::set_small_image_url(const char* value, size_t size) { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  small_image_url_->assign(reinterpret_cast<const char*>(value), size); +  // @@protoc_insertion_point(field_set_pointer:bgs.protocol.presence.v1.RichPresenceDetails.small_image_url) +} +inline ::std::string* RichPresenceDetails::mutable_small_image_url() { +  set_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    small_image_url_ = new ::std::string; +  } +  // @@protoc_insertion_point(field_mutable:bgs.protocol.presence.v1.RichPresenceDetails.small_image_url) +  return small_image_url_; +} +inline ::std::string* RichPresenceDetails::release_small_image_url() { +  clear_has_small_image_url(); +  if (small_image_url_ == &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    return NULL; +  } else { +    ::std::string* temp = small_image_url_; +    small_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +    return temp; +  } +} +inline void RichPresenceDetails::set_allocated_small_image_url(::std::string* small_image_url) { +  if (small_image_url_ != &::google::protobuf::internal::GetEmptyStringAlreadyInited()) { +    delete small_image_url_; +  } +  if (small_image_url) { +    set_has_small_image_url(); +    small_image_url_ = small_image_url; +  } else { +    clear_has_small_image_url(); +    small_image_url_ = const_cast< ::std::string*>(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +  } +  // @@protoc_insertion_point(field_set_allocated:bgs.protocol.presence.v1.RichPresenceDetails.small_image_url) +} +  // @@protoc_insertion_point(namespace_scope)  }  // namespace v1  | 
