diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-08-13 00:31:39 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-08-13 00:31:39 +0200 |
| commit | 5cf0c6c8bb2c4e58a2d66ba5f304af34d18a4782 (patch) | |
| tree | 0616f3e83f511aae0e10916f0c22161017e09c24 /src/server/game | |
| parent | 82f19c898815e3bc5bb6288b0191ee897594f9b5 (diff) | |
Core: Updated to 11.2.0
Diffstat (limited to 'src/server/game')
70 files changed, 6207 insertions, 5518 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index eacc492e97a..3e1b4887956 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -792,6 +792,19 @@ void CriteriaHandler::UpdateCriteria(Criteria const* criteria, uint64 miscValue1 case CriteriaType::GuildAttainedLevel: SetCriteriaProgress(criteria, miscValue1, referencePlayer); break; + case CriteriaType::BankTabPurchased: + switch (BankType(criteria->Entry->Asset.BankType)) + { + case BankType::Character: + SetCriteriaProgress(criteria, referencePlayer->GetCharacterBankTabCount(), referencePlayer); + break; + case BankType::Account: + SetCriteriaProgress(criteria, referencePlayer->GetAccountBankTabCount(), referencePlayer); + break; + default: + break; + } + break; // FIXME: not triggered in code as result, need to implement case CriteriaType::RunInstance: case CriteriaType::EarnTeamArenaRating: @@ -1237,6 +1250,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi case CriteriaType::SellItemsToVendors: case CriteriaType::GainLevels: case CriteriaType::ReachRenownLevel: + case CriteriaType::BankTabPurchased: case CriteriaType::LearnTaxiNode: return progress->Counter >= requiredAmount; case CriteriaType::EarnAchievement: @@ -1691,6 +1705,10 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis if (!referencePlayer->IsMaxLevel()) return false; break; + case CriteriaType::BankTabPurchased: + if (miscValue1 /*allow any at login*/ && miscValue1 != uint32(criteria->Entry->Asset.BankType)) + return false; + break; case CriteriaType::LearnTaxiNode: if (miscValue1 != uint32(criteria->Entry->Asset.TaxiNodesID)) return false; @@ -4546,8 +4564,8 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaType type) return "GainLevels"; case CriteriaType::CompleteQuestsCountOnAccount: return "CompleteQuestsCountOnAccount"; - case CriteriaType::WarbandBankTabPurchased: - return "WarbandBankTabPurchased"; + case CriteriaType::BankTabPurchased: + return "BankTabPurchased"; case CriteriaType::ReachRenownLevel: return "ReachRenownLevel"; case CriteriaType::LearnTaxiNode: @@ -5036,7 +5054,7 @@ std::span<CriteriaType const> CriteriaMgr::GetRetroactivelyUpdateableCriteriaTyp //CriteriaType::MythicPlusRatingAttained, /*NYI*/ //CriteriaType::MythicPlusDisplaySeasonEnded, /*NYI*/ //CriteriaType::CompleteTrackingQuest, /*NYI*/ - //CriteriaType::WarbandBankTabPurchased, /*NYI*/ + CriteriaType::BankTabPurchased, CriteriaType::LearnTaxiNode, CriteriaType::EarnAchievementPoints, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 926c5095f0a..65244d6ddf8 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -127,7 +127,7 @@ struct AnimationDataLoadInfo { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "Fallback" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "BehaviorTier" }, + { .IsSigned = true, .Type = FT_BYTE, .Name = "BehaviorTier" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "BehaviorID" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags1" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags2" }, @@ -606,15 +606,23 @@ struct AzeriteUnlockMappingLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 6, &AzeriteUnlockMappingMeta::Instance, HOTFIX_SEL_AZERITE_UNLOCK_MAPPING }; }; -struct BankBagSlotPricesLoadInfo +struct BankTabLoadInfo { - static constexpr DB2FieldMeta Fields[2] = + static constexpr DB2FieldMeta Fields[10] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, - { .IsSigned = false, .Type = FT_INT, .Name = "Cost" }, + { .IsSigned = false, .Type = FT_LONG, .Name = "Cost" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "BankType" }, + { .IsSigned = true, .Type = FT_BYTE, .Name = "OrderIndex" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PlayerConditionID" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PurchasePromptTitle" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PurchasePromptBody" }, + { .IsSigned = true, .Type = FT_INT, .Name = "PurchasePromptConfirmation" }, + { .IsSigned = true, .Type = FT_INT, .Name = "TabCleanupConfirmation" }, + { .IsSigned = true, .Type = FT_INT, .Name = "TabNameEditBoxHeader" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 2, &BankBagSlotPricesMeta::Instance, HOTFIX_SEL_BANK_BAG_SLOT_PRICES }; + static constexpr DB2LoadInfo Instance{ Fields, 10, &BankTabMeta::Instance, HOTFIX_SEL_BANK_TAB }; }; struct BannedAddonsLoadInfo @@ -624,7 +632,7 @@ struct BannedAddonsLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Version" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, }; static constexpr DB2LoadInfo Instance{ Fields, 4, &BannedAddonsMeta::Instance, HOTFIX_SEL_BANNED_ADDONS }; @@ -819,7 +827,7 @@ struct CfgCategoriesLoadInfo struct CfgRegionsLoadInfo { - static constexpr DB2FieldMeta Fields[6] = + static constexpr DB2FieldMeta Fields[7] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Tag" }, @@ -827,9 +835,10 @@ struct CfgRegionsLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "Raidorigin" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "RegionGroupMask" }, { .IsSigned = false, .Type = FT_INT, .Name = "ChallengeOrigin" }, + { .IsSigned = true, .Type = FT_INT, .Name = "TimeEventRegionGroupID" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 6, &Cfg_RegionsMeta::Instance, HOTFIX_SEL_CFG_REGIONS }; + static constexpr DB2LoadInfo Instance{ Fields, 7, &Cfg_RegionsMeta::Instance, HOTFIX_SEL_CFG_REGIONS }; }; struct ChallengeModeItemBonusOverrideLoadInfo @@ -869,7 +878,7 @@ struct CharTitlesLoadInfo { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Name1" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "MaskID" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, }; static constexpr DB2LoadInfo Instance{ Fields, 5, &CharTitlesMeta::Instance, HOTFIX_SEL_CHAR_TITLES }; @@ -931,7 +940,7 @@ struct ChrClassUiDisplayLoadInfo struct ChrClassesLoadInfo { - static constexpr DB2FieldMeta Fields[39] = + static constexpr DB2FieldMeta Fields[43] = { { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING_NOT_LOCALIZED, .Name = "Filename" }, @@ -948,6 +957,7 @@ struct ChrClassesLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "IconFileDataID" }, { .IsSigned = false, .Type = FT_INT, .Name = "LowResScreenFileDataID" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "StartingLevel" }, { .IsSigned = false, .Type = FT_INT, .Name = "SpellTextureBlobFileDataID" }, { .IsSigned = false, .Type = FT_INT, .Name = "ArmorTypeMask" }, { .IsSigned = true, .Type = FT_INT, .Name = "CharStartKitUnknown901" }, @@ -962,6 +972,7 @@ struct ChrClassesLoadInfo { .IsSigned = false, .Type = FT_SHORT, .Name = "CinematicSequenceID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "DefaultSpec" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "ID" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "HasStrengthBonus" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "PrimaryStatPriority" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "DisplayPower" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "RangedAttackPowerPerAgility" }, @@ -972,9 +983,11 @@ struct ChrClassesLoadInfo { .IsSigned = false, .Type = FT_BYTE, .Name = "ClassColorG" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "ClassColorB" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "RolesMask" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "DamageBonusStat" }, + { .IsSigned = false, .Type = FT_BYTE, .Name = "HasRelicSlot" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 39, &ChrClassesMeta::Instance, HOTFIX_SEL_CHR_CLASSES }; + static constexpr DB2LoadInfo Instance{ Fields, 43, &ChrClassesMeta::Instance, HOTFIX_SEL_CHR_CLASSES }; }; struct ChrClassesXPowerTypesLoadInfo @@ -1458,7 +1471,7 @@ struct CreatureDisplayInfoExtraLoadInfo struct CreatureFamilyLoadInfo { - static constexpr DB2FieldMeta Fields[11] = + static constexpr DB2FieldMeta Fields[12] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, @@ -1468,12 +1481,13 @@ struct CreatureFamilyLoadInfo { .IsSigned = true, .Type = FT_BYTE, .Name = "MaxScaleLevel" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "PetFoodMask" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "PetTalentType" }, + { .IsSigned = true, .Type = FT_INT, .Name = "CategoryEnumID" }, { .IsSigned = true, .Type = FT_INT, .Name = "IconFileID" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "SkillLine1" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "SkillLine2" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 11, &CreatureFamilyMeta::Instance, HOTFIX_SEL_CREATURE_FAMILY }; + static constexpr DB2LoadInfo Instance{ Fields, 12, &CreatureFamilyMeta::Instance, HOTFIX_SEL_CREATURE_FAMILY }; }; struct CreatureLabelLoadInfo @@ -1838,7 +1852,7 @@ struct EmotesTextSoundLoadInfo struct ExpectedStatLoadInfo { - static constexpr DB2FieldMeta Fields[12] = + static constexpr DB2FieldMeta Fields[13] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = true, .Type = FT_INT, .Name = "ExpansionID" }, @@ -1851,10 +1865,11 @@ struct ExpectedStatLoadInfo { .IsSigned = false, .Type = FT_FLOAT, .Name = "PlayerSecondaryStat" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "ArmorConstant" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "CreatureSpellDamage" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ContentSetID" }, { .IsSigned = false, .Type = FT_INT, .Name = "Lvl" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 12, &ExpectedStatMeta::Instance, HOTFIX_SEL_EXPECTED_STAT }; + static constexpr DB2LoadInfo Instance{ Fields, 13, &ExpectedStatMeta::Instance, HOTFIX_SEL_EXPECTED_STAT }; }; struct ExpectedStatModLoadInfo @@ -2667,7 +2682,7 @@ struct ItemLoadInfo static constexpr DB2FieldMeta Fields[12] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "ClassID" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ClassID" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "SubclassID" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "Material" }, { .IsSigned = true, .Type = FT_BYTE, .Name = "InventoryType" }, @@ -3232,16 +3247,17 @@ struct ItemSetLoadInfo struct ItemSetSpellLoadInfo { - static constexpr DB2FieldMeta Fields[5] = + static constexpr DB2FieldMeta Fields[6] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "ChrSpecID" }, { .IsSigned = false, .Type = FT_INT, .Name = "SpellID" }, + { .IsSigned = false, .Type = FT_SHORT, .Name = "TraitSubTreeID" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "Threshold" }, { .IsSigned = false, .Type = FT_INT, .Name = "ItemSetID" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 5, &ItemSetSpellMeta::Instance, HOTFIX_SEL_ITEM_SET_SPELL }; + static constexpr DB2LoadInfo Instance{ Fields, 6, &ItemSetSpellMeta::Instance, HOTFIX_SEL_ITEM_SET_SPELL }; }; struct ItemSparseLoadInfo @@ -3809,20 +3825,32 @@ struct MapLoadInfo struct MapChallengeModeLoadInfo { - static constexpr DB2FieldMeta Fields[9] = + static constexpr DB2FieldMeta Fields[21] = { { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "MapID" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, { .IsSigned = false, .Type = FT_INT, .Name = "ExpansionLevel" }, { .IsSigned = true, .Type = FT_INT, .Name = "RequiredWorldStateID" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "CriteriaCount1" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "CriteriaCount2" }, { .IsSigned = true, .Type = FT_SHORT, .Name = "CriteriaCount3" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID1" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID2" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID3" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID4" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID5" }, + { .IsSigned = true, .Type = FT_INT, .Name = "FirstRewardQuestID6" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID1" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID2" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID3" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID4" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID5" }, + { .IsSigned = true, .Type = FT_INT, .Name = "RewardQuestID6" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 9, &MapChallengeModeMeta::Instance, HOTFIX_SEL_MAP_CHALLENGE_MODE }; + static constexpr DB2LoadInfo Instance{ Fields, 21, &MapChallengeModeMeta::Instance, HOTFIX_SEL_MAP_CHALLENGE_MODE }; }; struct MapDifficultyLoadInfo @@ -5131,8 +5159,8 @@ struct SpellCategoryLoadInfo { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, - { .IsSigned = false, .Type = FT_BYTE, .Name = "UsesPerWeek" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "MaxCharges" }, + { .IsSigned = true, .Type = FT_INT, .Name = "UsesPerWeek" }, + { .IsSigned = true, .Type = FT_INT, .Name = "MaxCharges" }, { .IsSigned = true, .Type = FT_INT, .Name = "ChargeRecoveryTime" }, { .IsSigned = true, .Type = FT_INT, .Name = "TypeMask" }, }; @@ -5261,7 +5289,7 @@ struct SpellEquippedItemsLoadInfo { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = true, .Type = FT_INT, .Name = "SpellID" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "EquippedItemClass" }, + { .IsSigned = true, .Type = FT_INT, .Name = "EquippedItemClass" }, { .IsSigned = true, .Type = FT_INT, .Name = "EquippedItemInvTypes" }, { .IsSigned = true, .Type = FT_INT, .Name = "EquippedItemSubclass" }, }; @@ -5783,18 +5811,22 @@ struct SpellVisualEffectNameLoadInfo struct SpellVisualKitLoadInfo { - static constexpr DB2FieldMeta Fields[7] = + static constexpr DB2FieldMeta Fields[11] = { { .IsSigned = false, .Type = FT_INT, .Name = "ID" }, { .IsSigned = true, .Type = FT_INT, .Name = "ClutterLevel" }, { .IsSigned = true, .Type = FT_INT, .Name = "FallbackSpellVisualKitId" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "DelayMin" }, { .IsSigned = false, .Type = FT_SHORT, .Name = "DelayMax" }, + { .IsSigned = true, .Type = FT_INT, .Name = "MinimumSpellVisualDensityFilterType" }, + { .IsSigned = true, .Type = FT_INT, .Name = "MinimumSpellVisualDensityFilterParam" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ReducedSpellVisualDensityFilterType" }, + { .IsSigned = true, .Type = FT_INT, .Name = "ReducedSpellVisualDensityFilterParam" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags1" }, { .IsSigned = true, .Type = FT_INT, .Name = "Flags2" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 7, &SpellVisualKitMeta::Instance, HOTFIX_SEL_SPELL_VISUAL_KIT }; + static constexpr DB2LoadInfo Instance{ Fields, 11, &SpellVisualKitMeta::Instance, HOTFIX_SEL_SPELL_VISUAL_KIT }; }; struct SpellVisualMissileLoadInfo @@ -6622,7 +6654,7 @@ struct UnitPowerBarLoadInfo { .IsSigned = false, .Type = FT_FLOAT, .Name = "RegenerationPeace" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "RegenerationCombat" }, { .IsSigned = false, .Type = FT_BYTE, .Name = "BarType" }, - { .IsSigned = false, .Type = FT_SHORT, .Name = "Flags" }, + { .IsSigned = true, .Type = FT_INT, .Name = "Flags" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "StartInset" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "EndInset" }, { .IsSigned = true, .Type = FT_INT, .Name = "FileDataID1" }, @@ -6778,11 +6810,10 @@ struct VignetteLoadInfo struct WarbandSceneLoadInfo { - static constexpr DB2FieldMeta Fields[19] = + static constexpr DB2FieldMeta Fields[17] = { { .IsSigned = false, .Type = FT_STRING, .Name = "Name" }, { .IsSigned = false, .Type = FT_STRING, .Name = "Description" }, - { .IsSigned = false, .Type = FT_STRING, .Name = "Source" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionX" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionY" }, { .IsSigned = false, .Type = FT_FLOAT, .Name = "PositionZ" }, @@ -6798,10 +6829,9 @@ struct WarbandSceneLoadInfo { .IsSigned = true, .Type = FT_BYTE, .Name = "Quality" }, { .IsSigned = true, .Type = FT_INT, .Name = "TextureKit" }, { .IsSigned = true, .Type = FT_INT, .Name = "DefaultScenePriority" }, - { .IsSigned = true, .Type = FT_BYTE, .Name = "SourceType" }, }; - static constexpr DB2LoadInfo Instance{ Fields, 19, &WarbandSceneMeta::Instance, HOTFIX_SEL_WARBAND_SCENE }; + static constexpr DB2LoadInfo Instance{ Fields, 17, &WarbandSceneMeta::Instance, HOTFIX_SEL_WARBAND_SCENE }; }; struct WmoAreaTableLoadInfo diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h index 33da4246e1f..aa6cf7289bb 100644 --- a/src/server/game/DataStores/DB2Metadata.h +++ b/src/server/game/DataStores/DB2Metadata.h @@ -718,7 +718,7 @@ struct AnimationDataMeta static constexpr DB2MetaField Fields[4] = { { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 2, .IsSigned = true }, }; @@ -730,7 +730,7 @@ struct AnimationDataMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0x18A959FC, + .LayoutHash = 0xBBF66A3C, .Fields = Fields }; }; @@ -1822,12 +1822,17 @@ struct BankBagSlotPricesMeta struct BankTabMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[9] = { { .Type = FT_LONG, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -1835,9 +1840,9 @@ struct BankTabMeta .FileDataId = 5242411, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 4, - .FileFieldCount = 4, - .LayoutHash = 0xD47B62CA, + .FieldCount = 9, + .FileFieldCount = 9, + .LayoutHash = 0x5B2F9B36, .Fields = Fields }; }; @@ -1848,7 +1853,7 @@ struct BannedAddonsMeta { { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -1858,7 +1863,7 @@ struct BannedAddonsMeta .ParentIndexField = -1, .FieldCount = 3, .FileFieldCount = 3, - .LayoutHash = 0xC7F734D9, + .LayoutHash = 0x56583F69, .Fields = Fields }; }; @@ -2778,13 +2783,14 @@ struct Cfg_GameRulesMeta struct Cfg_RegionsMeta { - static constexpr DB2MetaField Fields[5] = + static constexpr DB2MetaField Fields[6] = { { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -2792,9 +2798,28 @@ struct Cfg_RegionsMeta .FileDataId = 1082876, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 5, - .FileFieldCount = 5, - .LayoutHash = 0x8CDAAC27, + .FieldCount = 6, + .FileFieldCount = 6, + .LayoutHash = 0xFB9CBD8A, + .Fields = Fields + }; +}; + +struct Cfg_TimeEventRegionGroupMeta +{ + static constexpr DB2MetaField Fields[1] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 3055692, + .IndexField = -1, + .ParentIndexField = -1, + .FieldCount = 1, + .FileFieldCount = 1, + .LayoutHash = 0x5F8D94FE, .Fields = Fields }; }; @@ -2823,6 +2848,52 @@ struct ChallengeModeItemBonusOverrideMeta }; }; +struct ChallengeModeRewardMeta +{ + static constexpr DB2MetaField Fields[8] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6982016, + .IndexField = 0, + .ParentIndexField = -1, + .FieldCount = 8, + .FileFieldCount = 8, + .LayoutHash = 0xCBC6D48A, + .Fields = Fields + }; +}; + +struct ChallengeModeXRewardMeta +{ + static constexpr DB2MetaField Fields[2] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6984186, + .IndexField = -1, + .ParentIndexField = 1, + .FieldCount = 2, + .FileFieldCount = 1, + .LayoutHash = 0x186816F5, + .Fields = Fields + }; +}; + struct CharBaseInfoMeta { static constexpr DB2MetaField Fields[3] = @@ -3065,7 +3136,7 @@ struct CharTitlesMeta { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -3075,7 +3146,7 @@ struct CharTitlesMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0x1EEF17FF, + .LayoutHash = 0x2F5DFF7F, .Fields = Fields }; }; @@ -3352,7 +3423,7 @@ struct ChrClassVillainMeta struct ChrClassesMeta { - static constexpr DB2MetaField Fields[39] = + static constexpr DB2MetaField Fields[43] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, @@ -3369,6 +3440,7 @@ struct ChrClassesMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -3383,6 +3455,7 @@ struct ChrClassesMeta { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, @@ -3393,16 +3466,18 @@ struct ChrClassesMeta { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, }; static constexpr DB2Meta Instance = { .FileDataId = 1361031, - .IndexField = 28, + .IndexField = 29, .ParentIndexField = -1, - .FieldCount = 39, - .FileFieldCount = 39, - .LayoutHash = 0x03A0FD4D, + .FieldCount = 43, + .FileFieldCount = 43, + .LayoutHash = 0xAFC9B0C2, .Fields = Fields }; }; @@ -5523,7 +5598,7 @@ struct CreatureMeta { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 3, .IsSigned = true }, @@ -5536,7 +5611,7 @@ struct CreatureMeta .ParentIndexField = -1, .FieldCount = 11, .FileFieldCount = 11, - .LayoutHash = 0xAEA084C0, + .LayoutHash = 0x6E14C900, .Fields = Fields }; }; @@ -5549,7 +5624,7 @@ struct CreatureDifficultyMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_INT, .ArraySize = 8, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 9, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -5560,7 +5635,7 @@ struct CreatureDifficultyMeta .ParentIndexField = 5, .FieldCount = 6, .FileFieldCount = 5, - .LayoutHash = 0xFC42F936, + .LayoutHash = 0x29113DAF, .Fields = Fields }; }; @@ -5833,7 +5908,7 @@ struct CreatureDisplayXUIModelSceneMeta struct CreatureFamilyMeta { - static constexpr DB2MetaField Fields[9] = + static constexpr DB2MetaField Fields[10] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -5843,6 +5918,7 @@ struct CreatureFamilyMeta { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 2, .IsSigned = true }, }; @@ -5851,9 +5927,9 @@ struct CreatureFamilyMeta .FileDataId = 1351351, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 9, - .FileFieldCount = 9, - .LayoutHash = 0x4EBC1C18, + .FieldCount = 10, + .FileFieldCount = 10, + .LayoutHash = 0x7FE3CBA7, .Fields = Fields }; }; @@ -6387,7 +6463,7 @@ struct DeathThudLookupsMeta struct DecalPropertiesMeta { - static constexpr DB2MetaField Fields[25] = + static constexpr DB2MetaField Fields[28] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -6411,6 +6487,9 @@ struct DecalPropertiesMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 4, .IsSigned = true }, @@ -6421,9 +6500,9 @@ struct DecalPropertiesMeta .FileDataId = 1278176, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 25, - .FileFieldCount = 25, - .LayoutHash = 0x6F09046F, + .FieldCount = 28, + .FileFieldCount = 28, + .LayoutHash = 0xBED177F0, .Fields = Fields }; }; @@ -6984,7 +7063,7 @@ struct ExhaustionMeta struct ExpectedStatMeta { - static constexpr DB2MetaField Fields[11] = + static constexpr DB2MetaField Fields[12] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -6997,16 +7076,17 @@ struct ExpectedStatMeta { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = { .FileDataId = 1937326, .IndexField = -1, - .ParentIndexField = 10, - .FieldCount = 11, - .FileFieldCount = 10, - .LayoutHash = 0xFD4F2D39, + .ParentIndexField = 11, + .FieldCount = 12, + .FileFieldCount = 11, + .LayoutHash = 0x0FD90F9C, .Fields = Fields }; }; @@ -10024,10 +10104,32 @@ struct HolidayNamesMeta }; }; +struct HolidayXTimeEventMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6905813, + .IndexField = -1, + .ParentIndexField = 2, + .FieldCount = 3, + .FileFieldCount = 2, + .LayoutHash = 0x3341B6A4, + .Fields = Fields + }; +}; + struct HolidaysMeta { - static constexpr DB2MetaField Fields[11] = + static constexpr DB2MetaField Fields[12] = { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, @@ -10044,11 +10146,11 @@ struct HolidaysMeta static constexpr DB2Meta Instance = { .FileDataId = 996357, - .IndexField = -1, + .IndexField = 0, .ParentIndexField = -1, - .FieldCount = 11, - .FileFieldCount = 11, - .LayoutHash = 0xDB91019C, + .FieldCount = 12, + .FileFieldCount = 12, + .LayoutHash = 0xB3A34A20, .Fields = Fields }; }; @@ -10186,7 +10288,7 @@ struct ItemMeta { static constexpr DB2MetaField Fields[11] = { - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, @@ -10206,7 +10308,7 @@ struct ItemMeta .ParentIndexField = -1, .FieldCount = 11, .FileFieldCount = 11, - .LayoutHash = 0xD43146DA, + .LayoutHash = 0x12C03F1A, .Fields = Fields }; }; @@ -11571,10 +11673,11 @@ struct ItemSetMeta struct ItemSetSpellMeta { - static constexpr DB2MetaField Fields[4] = + static constexpr DB2MetaField Fields[5] = { { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -11583,10 +11686,10 @@ struct ItemSetSpellMeta { .FileDataId = 1314689, .IndexField = -1, - .ParentIndexField = 3, - .FieldCount = 4, - .FileFieldCount = 3, - .LayoutHash = 0xCDEF234D, + .ParentIndexField = 4, + .FieldCount = 5, + .FileFieldCount = 4, + .LayoutHash = 0x2666A73F, .Fields = Fields }; }; @@ -13180,25 +13283,6 @@ struct ManifestInterfaceItemIconMeta }; }; -struct ManifestInterfaceTOCDataMeta -{ - static constexpr DB2MetaField Fields[1] = - { - { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, - }; - - static constexpr DB2Meta Instance = - { - .FileDataId = 1267335, - .IndexField = -1, - .ParentIndexField = -1, - .FieldCount = 1, - .FileFieldCount = 1, - .LayoutHash = 0x4AB64495, - .Fields = Fields - }; -}; - struct MapMeta { static constexpr DB2MetaField Fields[25] = @@ -13265,15 +13349,17 @@ struct MapCelestialBodyMeta struct MapChallengeModeMeta { - static constexpr DB2MetaField Fields[7] = + static constexpr DB2MetaField Fields[9] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 3, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 6, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 6, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -13281,9 +13367,9 @@ struct MapChallengeModeMeta .FileDataId = 801709, .IndexField = 1, .ParentIndexField = 2, - .FieldCount = 7, - .FileFieldCount = 7, - .LayoutHash = 0xC31A3CC1, + .FieldCount = 9, + .FileFieldCount = 9, + .LayoutHash = 0x531A0D41, .Fields = Fields }; }; @@ -13600,7 +13686,7 @@ struct ModelFileDataMeta { { .Type = FT_FLOAT, .ArraySize = 6, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, }; @@ -13612,7 +13698,7 @@ struct ModelFileDataMeta .ParentIndexField = 4, .FieldCount = 5, .FileFieldCount = 5, - .LayoutHash = 0x1045BE38, + .LayoutHash = 0x2AE4E788, .Fields = Fields }; }; @@ -13771,7 +13857,7 @@ struct ModifiedCraftingReagentItemMeta struct ModifiedCraftingReagentSlotMeta { - static constexpr DB2MetaField Fields[6] = + static constexpr DB2MetaField Fields[7] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, @@ -13779,6 +13865,7 @@ struct ModifiedCraftingReagentSlotMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -13786,9 +13873,9 @@ struct ModifiedCraftingReagentSlotMeta .FileDataId = 3386488, .IndexField = 1, .ParentIndexField = -1, - .FieldCount = 6, - .FileFieldCount = 6, - .LayoutHash = 0x61863510, + .FieldCount = 7, + .FileFieldCount = 7, + .LayoutHash = 0x32F2149E, .Fields = Fields }; }; @@ -18402,7 +18489,7 @@ struct SoundKitMeta struct SoundKitAdvancedMeta { - static constexpr DB2MetaField Fields[56] = + static constexpr DB2MetaField Fields[57] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -18427,6 +18514,7 @@ struct SoundKitAdvancedMeta { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -18467,9 +18555,9 @@ struct SoundKitAdvancedMeta .FileDataId = 1237436, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 56, - .FileFieldCount = 56, - .LayoutHash = 0x3EE0D3A8, + .FieldCount = 57, + .FileFieldCount = 57, + .LayoutHash = 0xF65DB810, .Fields = Fields }; }; @@ -19019,8 +19107,8 @@ struct SpellCategoryMeta { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -19032,7 +19120,7 @@ struct SpellCategoryMeta .ParentIndexField = -1, .FieldCount = 6, .FileFieldCount = 6, - .LayoutHash = 0x1691EA31, + .LayoutHash = 0xB79B78E1, .Fields = Fields }; }; @@ -19391,7 +19479,7 @@ struct SpellEffectMeta .ParentIndexField = 28, .FieldCount = 29, .FileFieldCount = 28, - .LayoutHash = 0xE745F803, + .LayoutHash = 0x239B1B53, .Fields = Fields }; }; @@ -19492,7 +19580,7 @@ struct SpellEquippedItemsMeta static constexpr DB2MetaField Fields[4] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; @@ -19504,7 +19592,7 @@ struct SpellEquippedItemsMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0xEB6AC546, + .LayoutHash = 0xD9177916, .Fields = Fields }; }; @@ -20455,12 +20543,16 @@ struct SpellVisualEventMeta struct SpellVisualKitMeta { - static constexpr DB2MetaField Fields[5] = + static constexpr DB2MetaField Fields[9] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 2, .IsSigned = true }, }; @@ -20469,9 +20561,9 @@ struct SpellVisualKitMeta .FileDataId = 897949, .IndexField = -1, .ParentIndexField = -1, - .FieldCount = 5, - .FileFieldCount = 5, - .LayoutHash = 0x0B92E9E2, + .FieldCount = 9, + .FileFieldCount = 9, + .LayoutHash = 0x15838B24, .Fields = Fields }; }; @@ -20869,6 +20961,55 @@ struct TalentMeta }; }; +struct TalentTabMeta +{ + static constexpr DB2MetaField Fields[10] = + { + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_STRING_NOT_LOCALIZED, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 2, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 2178102, + .IndexField = -1, + .ParentIndexField = -1, + .FieldCount = 10, + .FileFieldCount = 10, + .LayoutHash = 0xB436F3C7, + .Fields = Fields + }; +}; + +struct TalentTreePrimarySpellsMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 5581887, + .IndexField = -1, + .ParentIndexField = -1, + .FieldCount = 3, + .FileFieldCount = 3, + .LayoutHash = 0x0C4D9DD6, + .Fields = Fields + }; +}; + struct TaxiNodesMeta { static constexpr DB2MetaField Fields[15] = @@ -21090,7 +21231,7 @@ struct TierTransitionMeta { static constexpr DB2MetaField Fields[4] = { - { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, @@ -21103,7 +21244,28 @@ struct TierTransitionMeta .ParentIndexField = -1, .FieldCount = 4, .FileFieldCount = 4, - .LayoutHash = 0x2591A17F, + .LayoutHash = 0x6019C9CF, + .Fields = Fields + }; +}; + +struct TimeEventDataMeta +{ + static constexpr DB2MetaField Fields[3] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 3055910, + .IndexField = -1, + .ParentIndexField = 1, + .FieldCount = 3, + .FileFieldCount = 3, + .LayoutHash = 0x3E90B195, .Fields = Fields }; }; @@ -21661,11 +21823,12 @@ struct TraitSubTreeMeta struct TraitSystemMeta { - static constexpr DB2MetaField Fields[3] = + static constexpr DB2MetaField Fields[4] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -21673,9 +21836,9 @@ struct TraitSystemMeta .FileDataId = 4635649, .IndexField = 0, .ParentIndexField = -1, - .FieldCount = 3, - .FileFieldCount = 3, - .LayoutHash = 0x46225291, + .FieldCount = 4, + .FileFieldCount = 4, + .LayoutHash = 0xB304261C, .Fields = Fields }; }; @@ -22304,7 +22467,7 @@ struct UIEventToastMeta struct UIExpansionDisplayInfoMeta { - static constexpr DB2MetaField Fields[6] = + static constexpr DB2MetaField Fields[7] = { { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, @@ -22312,6 +22475,7 @@ struct UIExpansionDisplayInfoMeta { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = @@ -22319,9 +22483,9 @@ struct UIExpansionDisplayInfoMeta .FileDataId = 1729547, .IndexField = 0, .ParentIndexField = -1, - .FieldCount = 6, - .FileFieldCount = 6, - .LayoutHash = 0x4C41293C, + .FieldCount = 7, + .FileFieldCount = 7, + .LayoutHash = 0x788C5B88, .Fields = Fields }; }; @@ -23557,7 +23721,7 @@ struct UnitPowerBarMeta { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = false }, - { .Type = FT_SHORT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 6, .IsSigned = true }, @@ -23571,7 +23735,7 @@ struct UnitPowerBarMeta .ParentIndexField = -1, .FieldCount = 16, .FileFieldCount = 16, - .LayoutHash = 0x9840FB71, + .LayoutHash = 0x9F140C01, .Fields = Fields }; }; @@ -23968,13 +24132,35 @@ struct WMOMinimapTextureMeta }; }; +struct WarbandPlacementDisplayInfoMeta +{ + static constexpr DB2MetaField Fields[5] = + { + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6655794, + .IndexField = -1, + .ParentIndexField = 0, + .FieldCount = 5, + .FileFieldCount = 5, + .LayoutHash = 0x2998B81D, + .Fields = Fields + }; +}; + struct WarbandSceneMeta { - static constexpr DB2MetaField Fields[15] = + static constexpr DB2MetaField Fields[13] = { { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 3, .IsSigned = true }, { .Type = FT_FLOAT, .ArraySize = 3, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, @@ -23986,17 +24172,16 @@ struct WarbandSceneMeta { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, - { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, }; static constexpr DB2Meta Instance = { .FileDataId = 5736126, - .IndexField = 5, - .ParentIndexField = 6, - .FieldCount = 15, - .FileFieldCount = 15, - .LayoutHash = 0xF0593458, + .IndexField = 4, + .ParentIndexField = 5, + .FieldCount = 13, + .FileFieldCount = 13, + .LayoutHash = 0xDF56107A, .Fields = Fields }; }; @@ -24146,6 +24331,28 @@ struct WarbandScenePlcmntAnimOverrideMeta }; }; +struct WarbandSceneSourceInfoMeta +{ + static constexpr DB2MetaField Fields[4] = + { + { .Type = FT_STRING, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = false }, + { .Type = FT_INT, .ArraySize = 1, .IsSigned = true }, + { .Type = FT_BYTE, .ArraySize = 1, .IsSigned = true }, + }; + + static constexpr DB2Meta Instance = + { + .FileDataId = 6388961, + .IndexField = 1, + .ParentIndexField = 2, + .FieldCount = 4, + .FileFieldCount = 4, + .LayoutHash = 0xEB093F55, + .Fields = Fields + }; +}; + struct WaterfallDataMeta { static constexpr DB2MetaField Fields[19] = @@ -24453,7 +24660,7 @@ struct WeatherMeta .ParentIndexField = -1, .FieldCount = 23, .FileFieldCount = 23, - .LayoutHash = 0x62855DFC, + .LayoutHash = 0x1628B83C, .Fields = Fields }; }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 0d26fbf5529..514cf7f9396 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -73,7 +73,7 @@ DB2Storage<AzeritePowerSetMemberEntry> sAzeritePowerSetMemberStore("Aze DB2Storage<AzeriteTierUnlockEntry> sAzeriteTierUnlockStore("AzeriteTierUnlock.db2", &AzeriteTierUnlockLoadInfo::Instance); DB2Storage<AzeriteTierUnlockSetEntry> sAzeriteTierUnlockSetStore("AzeriteTierUnlockSet.db2", &AzeriteTierUnlockSetLoadInfo::Instance); DB2Storage<AzeriteUnlockMappingEntry> sAzeriteUnlockMappingStore("AzeriteUnlockMapping.db2", &AzeriteUnlockMappingLoadInfo::Instance); -DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", &BankBagSlotPricesLoadInfo::Instance); +DB2Storage<BankTabEntry> sBankTabStore("BankTab.db2", &BankTabLoadInfo::Instance); DB2Storage<BannedAddonsEntry> sBannedAddonsStore("BannedAddons.db2", &BannedAddonsLoadInfo::Instance); DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", &BarberShopStyleLoadInfo::Instance); DB2Storage<BattlePetAbilityEntry> sBattlePetAbilityStore("BattlePetAbility.db2", &BattlePetAbilityLoadInfo::Instance); @@ -699,7 +699,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sAzeriteTierUnlockStore); LOAD_DB2(sAzeriteTierUnlockSetStore); LOAD_DB2(sAzeriteUnlockMappingStore); - LOAD_DB2(sBankBagSlotPricesStore); + LOAD_DB2(sBankTabStore); LOAD_DB2(sBannedAddonsStore); LOAD_DB2(sBarberShopStyleStore); LOAD_DB2(sBattlePetAbilityStore); @@ -1034,14 +1034,16 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } // Check loaded DB2 files proper version - if (!sAreaTableStore.LookupEntry(16108) || // last area added in 11.0.7 (58162) - !sCharTitlesStore.LookupEntry(876) || // last char title added in 11.0.7 (58162) + if (!sAreaTableStore.LookupEntry(16579) || // last area added in 11.2.0 (62213) + !sCharTitlesStore.LookupEntry(937) || // last char title added in 11.2.0 (62213) !sFlightCapabilityStore.LookupEntry(1) || // default flight capability (required) - !sGemPropertiesStore.LookupEntry(4266) || // last gem property added in 11.0.7 (58162) - !sItemStore.LookupEntry(235551) || // last item added in 11.0.7 (58162) - !sItemExtendedCostStore.LookupEntry(9918) || // last item extended cost added in 11.0.7 (58162) - !sMapStore.LookupEntry(2829) || // last map added in 11.0.7 (58162) - !sSpellNameStore.LookupEntry(1218101)) // last spell added in 11.0.7 (58162) + !sGemPropertiesStore.LookupEntry(4287) || // last gem property added in 11.2.0 (62213) + !sItemStore.LookupEntry(252009) || // last item added in 11.2.0 (62213) + !sItemSparseStore.LookupEntry(ITEM_ACCOUNT_BANK_TAB_BAG) || + !sItemSparseStore.LookupEntry(ITEM_CHARACTER_BANK_TAB_BAG) || + !sItemExtendedCostStore.LookupEntry(10637) || // last item extended cost added in 11.2.0 (62213) + !sMapStore.LookupEntry(2951) || // last map added in 11.2.0 (62213) + !sSpellNameStore.LookupEntry(1254022)) // last spell added in 11.2.0 (62213) { TC_LOG_FATAL("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); return 0; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index b90d247c83a..f5bef9577af 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -56,7 +56,7 @@ TC_GAME_API extern DB2Storage<AzeriteItemMilestonePowerEntry> sAzeriteItem TC_GAME_API extern DB2Storage<AzeriteLevelInfoEntry> sAzeriteLevelInfoStore; TC_GAME_API extern DB2Storage<AzeritePowerEntry> sAzeritePowerStore; TC_GAME_API extern DB2Storage<AzeriteUnlockMappingEntry> sAzeriteUnlockMappingStore; -TC_GAME_API extern DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore; +TC_GAME_API extern DB2Storage<BankTabEntry> sBankTabStore; TC_GAME_API extern DB2Storage<BannedAddonsEntry> sBannedAddonsStore; TC_GAME_API extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore; TC_GAME_API extern DB2Storage<BattlePetAbilityEntry> sBattlePetAbilityStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 3fe06f40106..c1f86a09c61 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -102,7 +102,7 @@ struct AnimationDataEntry { uint32 ID; uint16 Fallback; - uint8 BehaviorTier; + int8 BehaviorTier; int16 BehaviorID; std::array<int32, 2> Flags; }; @@ -425,10 +425,18 @@ struct AzeriteUnlockMappingEntry uint32 AzeriteUnlockMappingSetID; }; -struct BankBagSlotPricesEntry +struct BankTabEntry { uint32 ID; - uint32 Cost; + uint64 Cost; + uint8 BankType; + int8 OrderIndex; + int32 PlayerConditionID; + int32 PurchasePromptTitle; + int32 PurchasePromptBody; + int32 PurchasePromptConfirmation; + int32 TabCleanupConfirmation; + int32 TabNameEditBoxHeader; }; struct BannedAddonsEntry @@ -436,7 +444,7 @@ struct BannedAddonsEntry uint32 ID; char const* Name; char const* Version; - uint8 Flags; + int32 Flags; }; struct BarberShopStyleEntry @@ -585,6 +593,7 @@ struct Cfg_RegionsEntry uint32 Raidorigin; // Date of first raid reset, all other resets are calculated as this date plus interval uint8 RegionGroupMask; uint32 ChallengeOrigin; + int32 TimeEventRegionGroupID; }; struct ChallengeModeItemBonusOverrideEntry @@ -612,7 +621,7 @@ struct CharTitlesEntry LocalizedString Name; LocalizedString Name1; int16 MaskID; - int8 Flags; + int32 Flags; }; struct CharacterLoadoutEntry @@ -671,6 +680,7 @@ struct ChrClassesEntry uint32 IconFileDataID; uint32 LowResScreenFileDataID; int32 Flags; + int32 StartingLevel; uint32 SpellTextureBlobFileDataID; uint32 ArmorTypeMask; int32 CharStartKitUnknown901; @@ -685,6 +695,7 @@ struct ChrClassesEntry uint16 CinematicSequenceID; uint16 DefaultSpec; uint8 ID; + uint8 HasStrengthBonus; int8 PrimaryStatPriority; int8 DisplayPower; uint8 RangedAttackPowerPerAgility; @@ -695,6 +706,8 @@ struct ChrClassesEntry uint8 ClassColorG; uint8 ClassColorB; uint8 RolesMask; + uint8 DamageBonusStat; + uint8 HasRelicSlot; }; struct ChrClassesXPowerTypesEntry @@ -1025,7 +1038,7 @@ struct CraftingQualityEntry // int32 LevelDeltaMax; // uint16 FactionID; // int32 ContentTuningID; -// int32 Flags[8]; +// int32 Flags[9]; // uint32 CreatureID; //}; @@ -1082,6 +1095,7 @@ struct CreatureFamilyEntry int8 MaxScaleLevel; int16 PetFoodMask; int8 PetTalentType; + int32 CategoryEnumID; int32 IconFileID; std::array<int16, 2> SkillLine; }; @@ -1344,6 +1358,9 @@ struct CriteriaEntry // CriteriaType::MythicPlusRatingAttained = 230 int32 DungeonScore; + // CriteriaType::BankTabPurchased = 260 + int32 BankType; + // CriteriaType::LearnTaxiNode = 262 int32 TaxiNodesID; } Asset; @@ -1599,6 +1616,7 @@ struct ExpectedStatEntry float PlayerSecondaryStat; float ArmorConstant; float CreatureSpellDamage; + int32 ContentSetID; uint32 Lvl; }; @@ -2162,7 +2180,7 @@ struct ImportPriceWeaponEntry struct ItemEntry { uint32 ID; - uint8 ClassID; + int32 ClassID; uint8 SubclassID; uint8 Material; int8 InventoryType; @@ -2494,6 +2512,7 @@ struct ItemSetSpellEntry uint32 ID; uint16 ChrSpecID; uint32 SpellID; + uint16 TraitSubTreeID; uint8 Threshold; uint32 ItemSetID; }; @@ -2861,6 +2880,7 @@ struct MapEntry case 1643: case 2222: case 2444: + case 2601: return true; default: return false; @@ -2888,10 +2908,12 @@ struct MapChallengeModeEntry LocalizedString Name; uint32 ID; uint16 MapID; - uint8 Flags; + int32 Flags; uint32 ExpansionLevel; int32 RequiredWorldStateID; // maybe? std::array<int16, 3> CriteriaCount; + std::array<int32, 6> FirstRewardQuestID; + std::array<int32, 6> RewardQuestID; }; struct MapDifficultyEntry @@ -3743,8 +3765,8 @@ struct SpellCategoryEntry uint32 ID; LocalizedString Name; int32 Flags; - uint8 UsesPerWeek; - int8 MaxCharges; + int32 UsesPerWeek; + int32 MaxCharges; int32 ChargeRecoveryTime; int32 TypeMask; }; @@ -3831,7 +3853,7 @@ struct SpellEquippedItemsEntry { uint32 ID; int32 SpellID; - int8 EquippedItemClass; + int32 EquippedItemClass; int32 EquippedItemInvTypes; int32 EquippedItemSubclass; }; @@ -4149,6 +4171,10 @@ struct SpellVisualKitEntry int32 FallbackSpellVisualKitId; uint16 DelayMin; uint16 DelayMax; + int32 MinimumSpellVisualDensityFilterType; + int32 MinimumSpellVisualDensityFilterParam; + int32 ReducedSpellVisualDensityFilterType; + int32 ReducedSpellVisualDensityFilterParam; std::array<int32, 2> Flags; }; @@ -4707,7 +4733,7 @@ struct UnitPowerBarEntry float RegenerationPeace; float RegenerationCombat; uint8 BarType; - uint16 Flags; + int32 Flags; float StartInset; float EndInset; std::array<int32, 6> FileDataID; @@ -4841,7 +4867,6 @@ struct WarbandSceneEntry { LocalizedString Name; LocalizedString Description; - LocalizedString Source; DBCPosition3D Position; DBCPosition3D LookAt; uint32 ID; @@ -4853,7 +4878,6 @@ struct WarbandSceneEntry int8 Quality; int32 TextureKit; int32 DefaultScenePriority; - int8 SourceType; EnumFlag<WarbandSceneFlags> GetFlags() const { return static_cast<WarbandSceneFlags>(Flags); } }; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 518f6ed81df..a0b47fd550f 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -791,11 +791,11 @@ enum class CriteriaType : int16 CompleteQuestsCountOnAccount = 257, /*NYI*/ - WarbandBankTabPurchased = 260, /*NYI*/ + BankTabPurchased = 260, // Bank Tab Purchased in {#BankType} ReachRenownLevel = 261, LearnTaxiNode = 262, - Count = 264 + Count = 270 }; enum class CriteriaTreeFlags : uint16 diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 868ad6fbbc1..f1bff65dc63 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -24,6 +24,8 @@ #include "Containers.h" #include "CreatureAISelector.h" #include "DB2Stores.h" +#include "G3DPosition.hpp" +#include "GameTime.h" #include "GridNotifiersImpl.h" #include "Language.h" #include "Log.h" @@ -46,15 +48,14 @@ #include <bit> AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _spawnId(0), _aurEff(nullptr), - _duration(0), _totalDuration(0), _timeSinceCreated(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()), - _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0), + _duration(0), _totalDuration(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()), + _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr) { m_objectType |= TYPEMASK_AREATRIGGER; m_objectTypeId = TYPEID_AREATRIGGER; m_updateFlag.Stationary = true; - m_updateFlag.AreaTrigger = true; m_entityFragments.Add(WowCS::EntityFragment::Tag_AreaTrigger, false); } @@ -146,7 +147,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti SetObjectScale(1.0f); SetDuration(duration); - _shape = GetCreateProperties()->Shape; + SetShape(GetCreateProperties()->Shape); auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); if (caster) @@ -199,6 +200,33 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti if (GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::VisualAnimIsDecay)) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::IsDecay), true); + AreaTriggerFieldFlags fieldFlags = [flags = GetCreateProperties()->Flags]() + { + AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) + fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape)) + fieldFlags |= AreaTriggerFieldFlags::DynamicShape; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + fieldFlags |= AreaTriggerFieldFlags::Attached; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir)) + fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain)) + fieldFlags |= AreaTriggerFieldFlags::FollowsTerrain; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior)) + fieldFlags |= AreaTriggerFieldFlags::AlwaysExterior; + return fieldFlags; + }(); + ReplaceAllAreaTriggerFlags(fieldFlags); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreationTime), GameTime::GetGameTimeMS()); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ScaleCurveId), GetCreateProperties()->ScaleCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::FacingCurveId), GetCreateProperties()->FacingCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MorphCurveId), GetCreateProperties()->MorphCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MoveCurveId), GetCreateProperties()->MoveCurveId); + if (caster) PhasingHandler::InheritPhaseShift(this, caster); else if (IsStaticSpawn() && spawnData) @@ -207,7 +235,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti PhasingHandler::InitDbPhaseShift(GetPhaseShift(), spawnData->phaseUseFlags, spawnData->phaseId, spawnData->phaseGroup); } - if (target && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) m_movementInfo.transport.guid = target->GetGUID(); if (!IsStaticSpawn()) @@ -218,7 +246,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti if (GetCreateProperties()->OrbitInfo) { AreaTriggerOrbitInfo orbit = *GetCreateProperties()->OrbitInfo; - if (target && GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) orbit.PathTarget = target->GetGUID(); else orbit.Center = pos; @@ -229,6 +257,10 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti { InitSplineOffsets(GetCreateProperties()->SplinePoints); } + else + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), int32(AreaTriggerPathType::None)); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Facing), _stationaryPosition.GetOrientation()); // movement on transport of areatriggers on unit is handled by themself TransportBase* transport = nullptr; @@ -307,7 +339,6 @@ bool AreaTrigger::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool /*addTo void AreaTrigger::Update(uint32 diff) { WorldObject::Update(diff); - _timeSinceCreated += diff; if (!IsStaticSpawn()) { @@ -318,18 +349,17 @@ void AreaTrigger::Update(uint32 diff) } else if (HasOrbit()) { - UpdateOrbitPosition(*std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement), diff); + UpdateOrbitPosition(); } - else if (GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + else if (HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) { if (Unit* target = GetTarget()) { float orientation = 0.0f; - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->FacingCurveId) - orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); + if (m_areaTriggerData->FacingCurveId) + orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) orientation += target->GetOrientation(); GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), orientation); @@ -337,20 +367,17 @@ void AreaTrigger::Update(uint32 diff) } else if (HasSplines()) { - UpdateSplinePosition(*std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement), diff); + UpdateSplinePosition(*_spline); } else { - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) + if (m_areaTriggerData->FacingCurveId) { - if (createProperties->FacingCurveId) - { - float orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) - orientation += _stationaryPosition.GetOrientation(); + float orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) + orientation += m_areaTriggerData->Facing; - SetOrientation(orientation); - } + SetOrientation(orientation); } UpdateShape(); @@ -381,6 +408,14 @@ void AreaTrigger::Remove() } } +uint32 AreaTrigger::GetTimeSinceCreated() const +{ + uint32 now = GameTime::GetGameTimeMS(); + if (now >= *m_areaTriggerData->CreationTime) + return now - *m_areaTriggerData->CreationTime; + return 0; +} + void AreaTrigger::SetOverrideScaleCurve(float overrideScale) { SetScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), overrideScale); @@ -467,9 +502,8 @@ float AreaTrigger::CalcCurrentScale() const float scale = 1.0f; if (m_areaTriggerData->OverrideScaleCurve->OverrideActive) scale *= std::max(GetScaleCurveValue(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale), 0.000001f); - else if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->ScaleCurveId) - scale *= std::max(sDB2Manager.GetCurveValueAt(createProperties->ScaleCurveId, GetScaleCurveProgress(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale)), 0.000001f); + else if (m_areaTriggerData->ScaleCurveId) + scale *= std::max(sDB2Manager.GetCurveValueAt(m_areaTriggerData->ScaleCurveId, GetScaleCurveProgress(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale)), 0.000001f); scale *= std::max(GetScaleCurveValue(*m_areaTriggerData->ExtraScaleCurve, m_areaTriggerData->TimeToTargetExtraScale), 0.000001f); @@ -609,29 +643,21 @@ void AreaTrigger::UpdateTargetList() { std::vector<Unit*> targetList; - switch (_shape.Type) + m_areaTriggerData->ShapeData.Visit([&]<typename ShapeType>(ShapeType const& shape) { - case AreaTriggerShapeType::Sphere: - SearchUnitInSphere(targetList); - break; - case AreaTriggerShapeType::Box: - SearchUnitInBox(targetList); - break; - case AreaTriggerShapeType::Polygon: - SearchUnitInPolygon(targetList); - break; - case AreaTriggerShapeType::Cylinder: - SearchUnitInCylinder(targetList); - break; - case AreaTriggerShapeType::Disk: - SearchUnitInDisk(targetList); - break; - case AreaTriggerShapeType::BoundedPlane: - SearchUnitInBoundedPlane(targetList); - break; - default: - break; - } + if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerSphere>) + this->SearchUnitInSphere(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBox>) + this->SearchUnitInBox(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerPolygon>) + this->SearchUnitInPolygon(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerCylinder>) + this->SearchUnitInCylinder(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerDisk>) + this->SearchUnitInDisk(shape, targetList); + else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBoundedPlane>) + this->SearchUnitInBoundedPlane(shape, targetList); + }); if (GetTemplate()) { @@ -704,30 +730,28 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool } } -void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float radius = G3D::lerp(_shape.SphereDatas.Radius, _shape.SphereDatas.RadiusTarget, progress) * scale; + float radius = G3D::lerp(sphere.Radius, sphere.RadiusTarget, progress) * scale; SearchUnits(targetList, radius, true); } -void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float extentsX = G3D::lerp(_shape.BoxDatas.Extents[0], _shape.BoxDatas.ExtentsTarget[0], progress) * scale; - float extentsY = G3D::lerp(_shape.BoxDatas.Extents[1], _shape.BoxDatas.ExtentsTarget[1], progress) * scale; - float extentsZ = G3D::lerp(_shape.BoxDatas.Extents[2], _shape.BoxDatas.ExtentsTarget[2], progress) * scale; + float extentsX = G3D::lerp(box.Extents->Pos.GetPositionX(), box.ExtentsTarget->Pos.GetPositionX(), progress) * scale; + float extentsY = G3D::lerp(box.Extents->Pos.GetPositionY(), box.ExtentsTarget->Pos.GetPositionY(), progress) * scale; + float extentsZ = G3D::lerp(box.Extents->Pos.GetPositionZ(), box.ExtentsTarget->Pos.GetPositionZ(), progress) * scale; float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY); SearchUnits(targetList, radius, false); @@ -739,14 +763,13 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); - float height = G3D::lerp(_shape.PolygonDatas.Height, _shape.PolygonDatas.HeightTarget, progress); + float height = G3D::lerp(polygon.Height, polygon.HeightTarget, progress); float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -760,17 +783,16 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float radius = G3D::lerp(_shape.CylinderDatas.Radius, _shape.CylinderDatas.RadiusTarget, progress) * scale; - float height = G3D::lerp(_shape.CylinderDatas.Height, _shape.CylinderDatas.HeightTarget, progress); - if (!m_areaTriggerData->HeightIgnoresScale) + float radius = G3D::lerp(cylinder.Radius, cylinder.RadiusTarget, progress) * scale; + float height = G3D::lerp(cylinder.Height, cylinder.HeightTarget, progress); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale)) height *= scale; float minZ = GetPositionZ() - height; @@ -785,18 +807,17 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float innerRadius = G3D::lerp(_shape.DiskDatas.InnerRadius, _shape.DiskDatas.InnerRadiusTarget, progress) * scale; - float outerRadius = G3D::lerp(_shape.DiskDatas.OuterRadius, _shape.DiskDatas.OuterRadiusTarget, progress) * scale; - float height = G3D::lerp(_shape.DiskDatas.Height, _shape.DiskDatas.HeightTarget, progress); - if (!m_areaTriggerData->HeightIgnoresScale) + float innerRadius = G3D::lerp(disk.InnerRadius, disk.InnerRadiusTarget, progress) * scale; + float outerRadius = G3D::lerp(disk.OuterRadius, disk.OuterRadiusTarget, progress) * scale; + float height = G3D::lerp(disk.Height, disk.HeightTarget, progress); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale)) height *= scale; float minZ = GetPositionZ() - height; @@ -810,16 +831,15 @@ void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) }); } -void AreaTrigger::SearchUnitInBoundedPlane(std::vector<Unit*>& targetList) +void AreaTrigger::SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList) { float progress = GetProgress(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); float scale = CalcCurrentScale(); - float extentsX = G3D::lerp(_shape.BoundedPlaneDatas.Extents[0], _shape.BoundedPlaneDatas.ExtentsTarget[0], progress) * scale; - float extentsY = G3D::lerp(_shape.BoundedPlaneDatas.Extents[1], _shape.BoundedPlaneDatas.ExtentsTarget[1], progress) * scale; + float extentsX = G3D::lerp(boundedPlane.Extents->Pos.GetPositionX(), boundedPlane.ExtentsTarget->Pos.GetPositionX(), progress) * scale; + float extentsY = G3D::lerp(boundedPlane.Extents->Pos.GetPositionY(), boundedPlane.ExtentsTarget->Pos.GetPositionY(), progress) * scale; float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY); SearchUnits(targetList, radius, false); @@ -885,9 +905,10 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) } } - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumUnitsInside), _insideUnits.size()); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumPlayersInside), - std::ranges::count_if(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); })); + if (std::ranges::any_of(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); })) + SetAreaTriggerFlag(AreaTriggerFieldFlags::HasPlayers); + else + RemoveAreaTriggerFlag(AreaTriggerFieldFlags::HasPlayers); if (IsStaticSpawn()) setActive(!_insideUnits.empty()); @@ -928,6 +949,83 @@ uint32 AreaTrigger::GetFaction() const return 0; } +void AreaTrigger::SetShape(AreaTriggerShapeInfo const& shape) +{ + auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); + + switch (shape.Type) + { + case AreaTriggerShapeType::Sphere: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 0); + auto sphere = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerSphere>); + SetUpdateFieldValue(sphere.ModifyValue(&UF::AreaTriggerSphere::Radius), shape.SphereDatas.Radius); + SetUpdateFieldValue(sphere.ModifyValue(&UF::AreaTriggerSphere::RadiusTarget), shape.SphereDatas.RadiusTarget); + break; + } + case AreaTriggerShapeType::Box: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 1); + auto box = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerBox>); + SetUpdateFieldValue(box.ModifyValue(&UF::AreaTriggerBox::Extents), { shape.BoxDatas.Extents[0], shape.BoxDatas.Extents[1], shape.BoxDatas.Extents[2] }); + SetUpdateFieldValue(box.ModifyValue(&UF::AreaTriggerBox::ExtentsTarget), { shape.BoxDatas.ExtentsTarget[0], shape.BoxDatas.ExtentsTarget[1], shape.BoxDatas.ExtentsTarget[2] }); + break; + } + case AreaTriggerShapeType::Polygon: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 3); + auto polygon = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerPolygon>); + auto vertices = polygon.ModifyValue(&UF::AreaTriggerPolygon::Vertices); + ClearDynamicUpdateFieldValues(vertices); + for (TaggedPosition<XY> const& vertex : shape.PolygonVertices) + AddDynamicUpdateFieldValue(vertices) = vertex; + auto verticesTarget = polygon.ModifyValue(&UF::AreaTriggerPolygon::VerticesTarget); + ClearDynamicUpdateFieldValues(verticesTarget); + for (TaggedPosition<XY> const& vertex : shape.PolygonVerticesTarget) + AddDynamicUpdateFieldValue(verticesTarget) = vertex; + SetUpdateFieldValue(polygon.ModifyValue(&UF::AreaTriggerPolygon::Height), shape.PolygonDatas.Height); + SetUpdateFieldValue(polygon.ModifyValue(&UF::AreaTriggerPolygon::HeightTarget), shape.PolygonDatas.HeightTarget); + break; + } + case AreaTriggerShapeType::Cylinder: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 4); + auto cylinder = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerCylinder>); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::Radius), shape.CylinderDatas.Radius); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::RadiusTarget), shape.CylinderDatas.RadiusTarget); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::Height), shape.CylinderDatas.Height); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::HeightTarget), shape.CylinderDatas.HeightTarget); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::LocationZOffset), shape.CylinderDatas.LocationZOffset); + SetUpdateFieldValue(cylinder.ModifyValue(&UF::AreaTriggerCylinder::LocationZOffsetTarget), shape.CylinderDatas.LocationZOffsetTarget); + break; + } + case AreaTriggerShapeType::Disk: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 7); + auto disk = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerDisk>); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::InnerRadius), shape.DiskDatas.InnerRadius); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::InnerRadiusTarget), shape.DiskDatas.InnerRadiusTarget); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::OuterRadius), shape.DiskDatas.OuterRadius); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::OuterRadiusTarget), shape.DiskDatas.OuterRadiusTarget); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::Height), shape.DiskDatas.Height); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::HeightTarget), shape.DiskDatas.HeightTarget); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::LocationZOffset), shape.DiskDatas.LocationZOffset); + SetUpdateFieldValue(disk.ModifyValue(&UF::AreaTriggerDisk::LocationZOffsetTarget), shape.DiskDatas.LocationZOffsetTarget); + break; + } + case AreaTriggerShapeType::BoundedPlane: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 8); + auto boundedPlane = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerBoundedPlane>); + SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::Extents), { shape.BoundedPlaneDatas.Extents[0], shape.BoundedPlaneDatas.Extents[1] }); + SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsTarget), { shape.BoundedPlaneDatas.ExtentsTarget[0], shape.BoundedPlaneDatas.ExtentsTarget[1] }); + break; + } + default: + break; + } +} + float AreaTrigger::GetMaxSearchRadius() const { return *m_areaTriggerData->BoundsRadius2D * CalcCurrentScale(); @@ -935,25 +1033,24 @@ float AreaTrigger::GetMaxSearchRadius() const void AreaTrigger::UpdatePolygonVertices() { - AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); - AreaTriggerShapeInfo const& shape = GetShape(); + UF::AreaTriggerPolygon const* shape = m_areaTriggerData->ShapeData.Get<UF::AreaTriggerPolygon>(); float newOrientation = GetOrientation(); // No need to recalculate, orientation didn't change - if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape.PolygonVerticesTarget.empty()) + if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape->VerticesTarget.empty()) return; - _polygonVertices.assign(shape.PolygonVertices.begin(), shape.PolygonVertices.end()); - if (!shape.PolygonVerticesTarget.empty()) + _polygonVertices.assign(shape->Vertices.begin(), shape->Vertices.end()); + if (!shape->VerticesTarget.empty()) { float progress = GetProgress(); - if (createProperties->MorphCurveId) - progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress); + if (m_areaTriggerData->MorphCurveId) + progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); for (std::size_t i = 0; i < _polygonVertices.size(); ++i) { Position& vertex = _polygonVertices[i]; - Position const& vertexTarget = shape.PolygonVerticesTarget[i].Pos; + Position const& vertexTarget = shape->VerticesTarget[i].Pos; vertex.m_positionX = G3D::lerp(vertex.GetPositionX(), vertexTarget.GetPositionX(), progress); vertex.m_positionY = G3D::lerp(vertex.GetPositionY(), vertexTarget.GetPositionY(), progress); @@ -983,7 +1080,7 @@ bool AreaTrigger::HasOverridePosition() const void AreaTrigger::UpdateShape() { - if (_shape.IsPolygon()) + if (m_areaTriggerData->ShapeData.Is<UF::AreaTriggerPolygon>()) UpdatePolygonVertices(); } @@ -1120,8 +1217,6 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt if (splinePoints.size() < 2) return; - _movementTime = 0; - std::unique_ptr<Movement::Spline<float>> spline = std::make_unique<::Movement::Spline<float>>(); spline->init_spline(splinePoints.data(), splinePoints.size(), ::Movement::SplineBase::ModeLinear, _stationaryPosition.GetOrientation()); spline->initLengths(); @@ -1131,29 +1226,29 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt speed = 1.0f; uint32 timeToTarget = spline->length() / speed * float(IN_MILLISECONDS); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); - - if (IsInWorld()) - { - if (_reachedDestination) - { - WorldPackets::AreaTrigger::AreaTriggerRePath reshape; - reshape.TriggerGUID = GetGUID(); - SendMessageToSet(reshape.Write(), true); - } - WorldPackets::AreaTrigger::AreaTriggerRePath reshape; - reshape.TriggerGUID = GetGUID(); - reshape.AreaTriggerSpline.emplace(); - reshape.AreaTriggerSpline->ElapsedTimeForMovement = GetElapsedTimeForMovement(); - reshape.AreaTriggerSpline->TimeToTarget = timeToTarget; - reshape.AreaTriggerSpline->Points = spline.get(); + auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS()); - SendMessageToSet(reshape.Write(), true); - } + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::Spline)); + auto pathData = areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathData, UF::VariantCase<UF::AreaTriggerSplineCalculator>); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerSplineCalculator::Catmullrom), spline->getPointCount() >= 4); + auto points = pathData.ModifyValue(&UF::AreaTriggerSplineCalculator::Points); + ClearDynamicUpdateFieldValues(points); + for (G3D::Vector3 const& point : spline->getPoints()) + AddDynamicUpdateFieldValue(points) = Vector3ToPosition(point); _reachedDestination = false; - _movement = std::move(spline); + _spline = std::move(spline); +} + +uint32 AreaTrigger::GetElapsedTimeForMovement() const +{ + uint32 now = GameTime::GetGameTimeMS(); + if (now >= *m_areaTriggerData->MovementStartTime) + return now - *m_areaTriggerData->MovementStartTime; + return 0; } void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed) @@ -1167,40 +1262,37 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> o uint32 timeToTarget = static_cast<uint32>(orbit.Radius * 2.0f * static_cast<float>(M_PI) * static_cast<float>(IN_MILLISECONDS) / speed); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); - SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OrbitPathTarget), orbit.PathTarget.value_or(ObjectGuid::Empty)); - - std::unique_ptr<AreaTriggerOrbitInfo> movementOrbit = std::make_unique<AreaTriggerOrbitInfo>(); - - movementOrbit->TimeToTarget = timeToTarget; - movementOrbit->ElapsedTimeForMovement = 0; - - if (IsInWorld()) - { - WorldPackets::AreaTrigger::AreaTriggerRePath reshape; - reshape.TriggerGUID = GetGUID(); - reshape.AreaTriggerOrbit = *movementOrbit; - - SendMessageToSet(reshape.Write(), true); - } + auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OrbitPathTarget), orbit.PathTarget.value_or(ObjectGuid::Empty)); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ZOffset), orbit.ZOffset); + if (orbit.CanLoop) + SetAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop); + else + RemoveAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop); - _movement = std::move(movementOrbit); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::Orbit)); + auto pathData = areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathData, UF::VariantCase<UF::AreaTriggerOrbit>); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::CounterClockwise), orbit.CounterClockwise); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::Center), orbit.Center.value_or(Position())); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::Radius), orbit.Radius); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::InitialAngle), orbit.InitialAngle); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::BlendFromRadius), orbit.BlendFromRadius); + SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::ExtraTimeForBlending), orbit.ExtraTimeForBlending); } Position const* AreaTrigger::GetOrbitCenterPosition() const { - if (!HasOrbit()) + UF::AreaTriggerOrbit const* orbit = m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); + if (!orbit) return nullptr; - AreaTriggerOrbitInfo const& orbit = *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); - if (orbit.PathTarget) - if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *orbit.PathTarget)) + if (!m_areaTriggerData->OrbitPathTarget->IsEmpty()) + if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *m_areaTriggerData->OrbitPathTarget)) return center; - if (orbit.Center) - return &orbit.Center->Pos; - - return nullptr; + return &orbit->Center->Pos; } Position AreaTrigger::CalculateOrbitPosition() const @@ -1209,26 +1301,24 @@ Position AreaTrigger::CalculateOrbitPosition() const if (!centerPos) return GetPosition(); - AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); - AreaTriggerOrbitInfo const& cmi = GetOrbit(); + UF::AreaTriggerOrbit const& cmi = *m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); // AreaTrigger make exactly "Duration / TimeToTarget" loops during his life time - float pathProgress = float(cmi.ElapsedTimeForMovement) / float(cmi.TimeToTarget); - if (createProperties && createProperties->MoveCurveId) - pathProgress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, pathProgress); + float pathProgress = float(GetElapsedTimeForMovement() + *cmi.ExtraTimeForBlending) / float(GetTimeToTarget()); + if (m_areaTriggerData->MoveCurveId) + pathProgress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MoveCurveId, pathProgress); // We already made one circle and can't loop - if (!cmi.CanLoop) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop)) pathProgress = std::min(1.f, pathProgress); float radius = cmi.Radius; - if (G3D::fuzzyNe(cmi.BlendFromRadius, radius)) + if (pathProgress <= 1.0f && G3D::fuzzyNe(cmi.BlendFromRadius, radius)) { float blendCurve = (cmi.BlendFromRadius - radius) / radius; - // 4.f Defines four quarters - blendCurve = RoundToInterval(blendCurve, 1.f, 4.f) / 4.f; - float blendProgress = std::min(1.f, pathProgress / blendCurve); - radius = G3D::lerp(cmi.BlendFromRadius, cmi.Radius, blendProgress); + RoundToInterval(blendCurve, 1.f, 4.f); + float blendProgress = std::min(1.f, pathProgress / blendCurve * 0.63661975f); + radius = G3D::lerp(cmi.BlendFromRadius, radius, blendProgress); } // Adapt Path progress depending of circle direction @@ -1238,13 +1328,13 @@ Position AreaTrigger::CalculateOrbitPosition() const float angle = cmi.InitialAngle + 2.f * float(M_PI) * pathProgress; float x = centerPos->GetPositionX() + (radius * std::cos(angle)); float y = centerPos->GetPositionY() + (radius * std::sin(angle)); - float z = centerPos->GetPositionZ() + cmi.ZOffset; + float z = centerPos->GetPositionZ() + *m_areaTriggerData->ZOffset; float orientation = 0.0f; - if (createProperties && createProperties->FacingCurveId) - orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); + if (m_areaTriggerData->FacingCurveId) + orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) { orientation += angle; orientation += cmi.CounterClockwise ? float(M_PI_4) : -float(M_PI_4); @@ -1253,13 +1343,8 @@ Position AreaTrigger::CalculateOrbitPosition() const return { x, y, z, orientation }; } -void AreaTrigger::UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 /*diff*/) +void AreaTrigger::UpdateOrbitPosition() { - if (orbit.StartDelay > GetElapsedTimeForMovement()) - return; - - orbit.ElapsedTimeForMovement = GetElapsedTimeForMovement() - orbit.StartDelay; - Position pos = CalculateOrbitPosition(); GetMap()->AreaTriggerRelocation(this, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); @@ -1268,14 +1353,12 @@ void AreaTrigger::UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 /*diff #endif } -void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 diff) +void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline) { if (_reachedDestination) return; - _movementTime += diff; - - if (_movementTime >= GetTimeToTarget()) + if (GetElapsedTimeForMovement() >= GetTimeToTarget()) { _reachedDestination = true; _lastSplineIndex = int32(spline.last()); @@ -1291,19 +1374,19 @@ void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 d return; } - float currentTimePercent = float(_movementTime) / float(GetTimeToTarget()); + float currentTimePercent = float(GetElapsedTimeForMovement()) / float(GetTimeToTarget()); if (currentTimePercent <= 0.f) return; - AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); - if (createProperties && createProperties->MoveCurveId) + if (m_areaTriggerData->MoveCurveId) { - float progress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, currentTimePercent); + float progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MoveCurveId, currentTimePercent); if (progress < 0.f || progress > 1.f) { + AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})", - GetEntry(), createProperties->Id.Id, uint32(createProperties->Id.IsCustom), progress, createProperties->MoveCurveId); + GetEntry(), createProperties->Id.Id, uint32(createProperties->Id.IsCustom), progress, *m_areaTriggerData->MoveCurveId); } else currentTimePercent = progress; @@ -1317,10 +1400,10 @@ void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 d spline.evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition); float orientation = _stationaryPosition.GetOrientation(); - if (createProperties && createProperties->FacingCurveId) - orientation += sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); + if (m_areaTriggerData->FacingCurveId) + orientation += sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); - if (GetCreateProperties() && !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation) && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation) && HasAreaTriggerFlag(AreaTriggerFieldFlags::FaceMovementDir)) { G3D::Vector3 derivative; spline.evaluate_derivative(lastPositionIndex, percentFromLastPoint, derivative); @@ -1349,14 +1432,11 @@ void AreaTrigger::UpdateOverridePosition() float z = GetScaleCurveValueAtProgress(*m_areaTriggerData->OverrideMoveCurveZ, progress); float orientation = GetOrientation(); - if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties()) + if (m_areaTriggerData->FacingCurveId) { - if (createProperties->FacingCurveId) - { - orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) - orientation += _stationaryPosition.GetOrientation(); - } + orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetProgress()); + if (HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) + orientation += m_areaTriggerData->Facing; } GetMap()->AreaTriggerRelocation(this, x, y, z, orientation); diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 67074b04d36..6d10f853063 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -39,6 +39,32 @@ namespace Movement class Spline; } +enum class AreaTriggerFieldFlags : uint32 +{ + None = 0x0000, + HeightIgnoresScale = 0x0001, + WowLabsCircle = 0x0002, + CanLoop = 0x0004, + AbsoluteOrientation = 0x0008, + DynamicShape = 0x0010, + Attached = 0x0020, + FaceMovementDir = 0x0040, + FollowsTerrain = 0x0080, + Unknown1025 = 0x0100, + AlwaysExterior = 0x0200, + HasPlayers = 0x0400, +}; + +DEFINE_ENUM_FLAG(AreaTriggerFieldFlags); + +enum class AreaTriggerPathType : int32 +{ + Spline = 0, + Orbit = 1, + None = 2, + MovementScript = 3 +}; + class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<AreaTrigger>, public MapObject { public: @@ -97,9 +123,13 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area bool IsRemoved() const { return _isRemoved; } uint32 GetSpellId() const { return m_areaTriggerData->SpellID; } AuraEffect const* GetAuraEffect() const { return _aurEff; } - uint32 GetTimeSinceCreated() const { return _timeSinceCreated; } + uint32 GetTimeSinceCreated() const; - void SetHeightIgnoresScale(bool heightIgnoresScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::HeightIgnoresScale), heightIgnoresScale); } + EnumFlag<AreaTriggerFieldFlags> GetAreaTriggerFlags() const { return static_cast<AreaTriggerFieldFlags>(*m_areaTriggerData->Flags); } + bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) const { return GetAreaTriggerFlags().HasFlag(flag); } + void SetAreaTriggerFlag(AreaTriggerFieldFlags flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Flags), uint32(flag)); } + void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Flags), uint32(flag)); } + void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Flags), uint32(flag)); } void SetOverrideScaleCurve(float overrideScale); void SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear); @@ -147,19 +177,17 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area uint32 GetFaction() const override; - AreaTriggerShapeInfo const& GetShape() const { return _shape; } + void SetShape(AreaTriggerShapeInfo const& shape); float GetMaxSearchRadius() const; - Position const& GetRollPitchYaw() const { return _rollPitchYaw; } - Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; } void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {}); void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {}); - bool HasSplines() const { return std::holds_alternative<std::unique_ptr<::Movement::Spline<float>>>(_movement); } - ::Movement::Spline<float> const& GetSpline() const { return *std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement); } - uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); } /// @todo: research the right value, in sniffs both timers are nearly identical + bool HasSplines() const { return _spline != nullptr; } + ::Movement::Spline<float> const& GetSpline() const { return *_spline; } + uint32 GetElapsedTimeForMovement() const; void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {}); - bool HasOrbit() const { return std::holds_alternative<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); } - AreaTriggerOrbitInfo const& GetOrbit() const { return *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); } + bool HasOrbit() const { return m_areaTriggerData->PathData.Is<UF::AreaTriggerOrbit>(); } + UF::AreaTriggerOrbit const& GetOrbit() const { return *m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); } bool HasOverridePosition() const; @@ -184,20 +212,20 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area void UpdateTargetList(); void SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D); - void SearchUnitInSphere(std::vector<Unit*>& targetList); - void SearchUnitInBox(std::vector<Unit*>& targetList); - void SearchUnitInPolygon(std::vector<Unit*>& targetList); - void SearchUnitInCylinder(std::vector<Unit*>& targetList); - void SearchUnitInDisk(std::vector<Unit*>& targetList); - void SearchUnitInBoundedPlane(std::vector<Unit*>& targetList); + void SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList); + void SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList); + void SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList); + void SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList); + void SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList); + void SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList); void HandleUnitEnterExit(std::vector<Unit*> const& targetList); void DoActions(Unit* unit); void UndoActions(Unit* unit); void UpdatePolygonVertices(); - void UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 diff); - void UpdateSplinePosition(Movement::Spline<float>& spline, uint32 diff); + void UpdateOrbitPosition(); + void UpdateSplinePosition(Movement::Spline<float>& spline); void UpdateOverridePosition(); Position const* GetOrbitCenterPosition() const; @@ -212,21 +240,16 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area AuraEffect const* _aurEff; Position _stationaryPosition; - AreaTriggerShapeInfo _shape; int32 _duration; int32 _totalDuration; - uint32 _timeSinceCreated; float _verticesUpdatePreviousOrientation; bool _isRemoved; - Position _rollPitchYaw; - Position _targetRollPitchYaw; std::vector<Position> _polygonVertices; - std::variant<std::monostate, std::unique_ptr<::Movement::Spline<float>>, std::unique_ptr<AreaTriggerOrbitInfo>> _movement; + std::unique_ptr<::Movement::Spline<float>> _spline; bool _reachedDestination; int32 _lastSplineIndex; - uint32 _movementTime; AreaTriggerCreateProperties const* _areaTriggerCreateProperties; AreaTriggerTemplate const* _areaTriggerTemplate; diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 5dba3e6b499..74ce4e2be79 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -193,9 +193,7 @@ struct AreaTriggerOrbitInfo Optional<TaggedPosition<Position::XYZ>> Center; bool CounterClockwise = false; bool CanLoop = false; - uint32 TimeToTarget = 0; - int32 ElapsedTimeForMovement = 0; - uint32 StartDelay = 0; + int32 ExtraTimeForBlending = 0; float Radius = 0.0f; float BlendFromRadius = 0.0f; float InitialAngle = 0.0f; diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 1331c819578..472610d4c0f 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -195,6 +195,7 @@ WorldPacket CreatureTemplate::BuildQueryData(LocaleConstant loc, Difficulty diff stats.Flags[0] = creatureDifficulty->TypeFlags; stats.Flags[1] = creatureDifficulty->TypeFlags2; + stats.Flags[2] = creatureDifficulty->TypeFlags3; stats.CreatureType = type; stats.CreatureFamily = family; @@ -273,6 +274,7 @@ CreatureDifficulty const* CreatureTemplate::GetDifficulty(Difficulty difficulty) CreatureDifficultyID = 0; TypeFlags = 0; TypeFlags2 = 0; + TypeFlags3 = 0; LootID = 0; PickPocketLootID = 0; SkinLootID = 0; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 1f4f4b5e216..81fcb06a14f 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -456,6 +456,7 @@ struct CreatureDifficulty int32 CreatureDifficultyID; uint32 TypeFlags; uint32 TypeFlags2; + uint32 TypeFlags3; uint32 LootID; uint32 PickPocketLootID; uint32 SkinLootID; diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 16f4896d968..1938d8d36d4 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -707,7 +707,7 @@ struct GameObjectTemplate uint32 radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10 uint32 InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 uint32 ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0 - uint32 PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, PlaceholderType77, }; Default: None + uint32 PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, GuildRename, PlaceholderType76, }; Default: None } UILink; // 49 GAMEOBJECT_TYPE_KEYSTONE_RECEPTACLE struct @@ -838,6 +838,19 @@ struct GameObjectTemplate uint32 Script; // 0 Script, References: SpellScript, NoValue = 0 uint32 autoClose; // 1 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000 } PerksProgramChest; + // 63 GAMEOBJECT_TYPE_FUTURE_PATCH + struct + { + } futurePatchGameObject; + // 64 GAMEOBJECT_TYPE_ASSIST_ACTION + struct + { + uint32 AssistActionType; // 0 Assist Action Type, enum { None, Lounging Player, Grave Marker, Placed VO, Player Guardian, Player Slayer, Captured Buff, }; Default: None + uint32 cooldown; // 1 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000 + uint32 gossipID; // 2 gossipID, References: Gossip, NoValue = 0 + uint32 spell; // 3 spell, References: Spell, NoValue = 0 + uint32 playerCast; // 4 playerCast, enum { false, true, }; Default: false + } assistAction; struct { uint32 data[MAX_GAMEOBJECT_DATA]; @@ -1114,6 +1127,8 @@ struct GameObjectTemplate { case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.gossipID; case GAMEOBJECT_TYPE_GOOBER: return goober.gossipID; + case GAMEOBJECT_TYPE_SPELL_FOCUS: return spellFocus.gossipID; + case GAMEOBJECT_TYPE_ASSIST_ACTION: return assistAction.gossipID; default: return 0; } } @@ -1216,8 +1231,9 @@ struct GameObjectTemplate { switch (type) { - case GAMEOBJECT_TYPE_TRAP: return trap.cooldown; - case GAMEOBJECT_TYPE_GOOBER: return goober.cooldown; + case GAMEOBJECT_TYPE_TRAP: return trap.cooldown; + case GAMEOBJECT_TYPE_GOOBER: return goober.cooldown; + case GAMEOBJECT_TYPE_ASSIST_ACTION: return assistAction.cooldown; default: return 0; } } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 247517163df..a3b1187cbff 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -141,9 +141,6 @@ void AddItemsSetItem(Player* player, Item const* item) if (itemSetSpell->Threshold > eff->EquippedItems.size()) continue; - if (eff->SetBonuses.count(itemSetSpell)) - continue; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE); if (!spellInfo) { @@ -151,10 +148,17 @@ void AddItemsSetItem(Player* player, Item const* item) continue; } - eff->SetBonuses.insert(itemSetSpell); + if (!eff->SetBonuses.insert(itemSetSpell).second) + continue; + // spell cast only if fit form requirement, in other case will cast at form change - if (!itemSetSpell->ChrSpecID || ChrSpecialization(itemSetSpell->ChrSpecID) == player->GetPrimarySpecialization()) - player->ApplyEquipSpell(spellInfo, nullptr, true); + if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization()) + continue; + + if (itemSetSpell->TraitSubTreeID && int32(itemSetSpell->TraitSubTreeID) != player->m_playerData->CurrentCombatTraitConfigSubTreeID) + continue; + + player->ApplyEquipSpell(spellInfo, nullptr, true); } } } @@ -196,11 +200,10 @@ void RemoveItemsSetItem(Player* player, Item const* item) if (itemSetSpell->Threshold <= eff->EquippedItems.size()) continue; - if (!eff->SetBonuses.count(itemSetSpell)) + if (!eff->SetBonuses.erase(itemSetSpell)) continue; player->ApplyEquipSpell(sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE), nullptr, false); - eff->SetBonuses.erase(itemSetSpell); } } @@ -224,7 +227,8 @@ void UpdateItemSetAuras(Player* player, bool formChange) { SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE); - if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization()) + if ((itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != player->GetPrimarySpecialization()) + || (itemSetSpell->TraitSubTreeID && int32(itemSetSpell->TraitSubTreeID) != player->m_playerData->CurrentCombatTraitConfigSubTreeID)) player->ApplyEquipSpell(spellInfo, nullptr, false, false); // item set aura is not for current spec else { diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h index d3278c4987f..0df2bb3bba6 100644 --- a/src/server/game/Entities/Item/ItemDefines.h +++ b/src/server/game/Entities/Item/ItemDefines.h @@ -154,6 +154,8 @@ enum InventoryResult : uint8 EQUIP_ERR_BANK_NOT_ACCESSIBLE = 128,// This character does not have access to this bank. EQUIP_ERR_CANT_TRADE_ACCOUNT_ITEM = 129,// You can't trade an item from the Warband bank. EQUIP_ERR_ACCOUNT_MONEY_LOCKED = 130,// You cannot withdraw or deposit gold from the warband bank currently; please try again later. + EQUIP_ERR_CHARACTER_BANK_NOT_ACCESSIBLE = 131,// This character does not have access to this bank. + EQUIP_ERR_CHARACTER_BANK_NOT_CONVERTED = 132,// Your character's bank has not been converted. Please try again later. }; // EnumUtils: DESCRIBE THIS diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index 42b23f04005..c7d97e22fd0 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -811,6 +811,9 @@ enum ItemIdConstants ITEM_PURPLE_RIBBONED_HOLIDAY_GIFT = 17308, // Purple Ribboned Holiday Gift ITEM_EMPTY_WRAPPER = 21830, // Empty Wrapper ITEM_WRAPPED_GIFT = 21831, // Wrappered Gift + + ITEM_ACCOUNT_BANK_TAB_BAG = 208392, // Account Bank Tab Bag (DNT) + ITEM_CHARACTER_BANK_TAB_BAG = 242709, // Character Bank Tab Bag (DNT) }; class Player; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index eaea679d01a..d5b732a145e 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -16,8 +16,6 @@ */ #include "Object.h" -#include "AreaTriggerPackets.h" -#include "AreaTriggerTemplate.h" #include "BattlefieldMgr.h" #include "CellImpl.h" #include "CinematicMgr.h" @@ -46,7 +44,6 @@ #include "SpellAuraEffects.h" #include "SpellMgr.h" #include "SpellPackets.h" -#include "StringConvert.h" #include "TemporarySummon.h" #include "Totem.h" #include "Transport.h" @@ -310,6 +307,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(flags.NoBirthAnim); data->WriteBit(flags.EnablePortals); data->WriteBit(flags.PlayHoverAnim); + data->WriteBit(flags.ThisIsYou); data->WriteBit(flags.MovementUpdate); data->WriteBit(flags.MovementTransport); data->WriteBit(flags.Stationary); @@ -318,10 +316,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(flags.Vehicle); data->WriteBit(flags.AnimKit); data->WriteBit(flags.Rotation); - data->WriteBit(flags.AreaTrigger); data->WriteBit(flags.GameObject); data->WriteBit(flags.SmoothPhasing); - data->WriteBit(flags.ThisIsYou); data->WriteBit(flags.SceneObject); data->WriteBit(flags.ActivePlayer); data->WriteBit(flags.Conversation); @@ -329,7 +325,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (flags.MovementUpdate) { - Unit const* unit = ToUnit(); + Unit const* unit = static_cast<Unit const*>(this); bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING); bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0; bool HasSpline = unit->IsSplineEnabled(); @@ -470,14 +466,17 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe } if (flags.CombatVictim) - *data << ToUnit()->GetVictim()->GetGUID(); // CombatVictim + { + Unit const* unit = static_cast<Unit const*>(this); + *data << unit->GetVictim()->GetGUID(); // CombatVictim + } if (flags.ServerTime) *data << uint32(GameTime::GetGameTimeMS()); if (flags.Vehicle) { - Unit const* unit = ToUnit(); + Unit const* unit = static_cast<Unit const*>(this); *data << uint32(unit->GetVehicleKit()->GetVehicleInfo()->ID); // RecID *data << float(unit->GetOrientation()); // InitialRawFacing } @@ -491,7 +490,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe } if (flags.Rotation) - *data << uint64(ToGameObject()->GetPackedLocalRotation()); // Rotation + { + GameObject const* gameObject = static_cast<GameObject const*>(this); + *data << uint64(gameObject->GetPackedLocalRotation()); // Rotation + } if (PauseTimes && !PauseTimes->empty()) data->append(PauseTimes->data(), PauseTimes->size()); @@ -502,144 +504,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe *data << self->m_movementInfo.transport; } - if (flags.AreaTrigger) - { - AreaTrigger const* areaTrigger = static_cast<AreaTrigger const*>(this); - AreaTriggerCreateProperties const* createProperties = areaTrigger->GetCreateProperties(); - AreaTriggerShapeInfo const& shape = areaTrigger->GetShape(); - - *data << uint32(areaTrigger->GetTimeSinceCreated()); - - *data << areaTrigger->GetRollPitchYaw().PositionXYZStream(); - - switch (shape.Type) - { - case AreaTriggerShapeType::Sphere: - *data << int8(0); - *data << float(shape.SphereDatas.Radius); - *data << float(shape.SphereDatas.RadiusTarget); - break; - case AreaTriggerShapeType::Box: - *data << int8(1); - *data << float(shape.BoxDatas.Extents[0]); - *data << float(shape.BoxDatas.Extents[1]); - *data << float(shape.BoxDatas.Extents[2]); - *data << float(shape.BoxDatas.ExtentsTarget[0]); - *data << float(shape.BoxDatas.ExtentsTarget[1]); - *data << float(shape.BoxDatas.ExtentsTarget[2]); - break; - case AreaTriggerShapeType::Polygon: - *data << int8(3); - *data << int32(shape.PolygonVertices.size()); - *data << int32(shape.PolygonVerticesTarget.size()); - *data << float(shape.PolygonDatas.Height); - *data << float(shape.PolygonDatas.HeightTarget); - - for (TaggedPosition<Position::XY> const& vertice : shape.PolygonVertices) - *data << vertice; - - for (TaggedPosition<Position::XY> const& vertice : shape.PolygonVerticesTarget) - *data << vertice; - break; - case AreaTriggerShapeType::Cylinder: - *data << int8(4); - *data << float(shape.CylinderDatas.Radius); - *data << float(shape.CylinderDatas.RadiusTarget); - *data << float(shape.CylinderDatas.Height); - *data << float(shape.CylinderDatas.HeightTarget); - *data << float(shape.CylinderDatas.LocationZOffset); - *data << float(shape.CylinderDatas.LocationZOffsetTarget); - break; - case AreaTriggerShapeType::Disk: - *data << int8(7); - *data << float(shape.DiskDatas.InnerRadius); - *data << float(shape.DiskDatas.InnerRadiusTarget); - *data << float(shape.DiskDatas.OuterRadius); - *data << float(shape.DiskDatas.OuterRadiusTarget); - *data << float(shape.DiskDatas.Height); - *data << float(shape.DiskDatas.HeightTarget); - *data << float(shape.DiskDatas.LocationZOffset); - *data << float(shape.DiskDatas.LocationZOffsetTarget); - break; - case AreaTriggerShapeType::BoundedPlane: - *data << int8(8); - *data << float(shape.BoundedPlaneDatas.Extents[0]); - *data << float(shape.BoundedPlaneDatas.Extents[1]); - *data << float(shape.BoundedPlaneDatas.ExtentsTarget[0]); - *data << float(shape.BoundedPlaneDatas.ExtentsTarget[1]); - break; - default: - break; - } - - bool hasAbsoluteOrientation = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation); - bool hasDynamicShape = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape); - bool hasAttached = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached); - bool hasFaceMovementDir = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir); - bool hasFollowsTerrain = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain); - bool hasAlwaysExterior = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior); - bool hasUnknown1025 = false; - bool hasTargetRollPitchYaw = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasTargetRollPitchYaw); - bool hasScaleCurveID = createProperties && createProperties->ScaleCurveId != 0; - bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0; - bool hasFacingCurveID = createProperties && createProperties->FacingCurveId != 0; - bool hasMoveCurveID = createProperties && createProperties->MoveCurveId != 0; - bool hasMovementScript = false; - bool hasPositionalSoundKitID= false; - - data->WriteBit(hasAbsoluteOrientation); - data->WriteBit(hasDynamicShape); - data->WriteBit(hasAttached); - data->WriteBit(hasFaceMovementDir); - data->WriteBit(hasFollowsTerrain); - data->WriteBit(hasAlwaysExterior); - data->WriteBit(hasUnknown1025); - data->WriteBit(hasTargetRollPitchYaw); - data->WriteBit(hasScaleCurveID); - data->WriteBit(hasMorphCurveID); - data->WriteBit(hasFacingCurveID); - data->WriteBit(hasMoveCurveID); - data->WriteBit(hasPositionalSoundKitID); - data->WriteBit(areaTrigger->HasSplines()); - data->WriteBit(areaTrigger->HasOrbit()); - data->WriteBit(hasMovementScript); - - data->FlushBits(); - - if (areaTrigger->HasSplines()) - WorldPackets::AreaTrigger::WriteAreaTriggerSpline(*data, areaTrigger->GetTimeToTarget(), areaTrigger->GetElapsedTimeForMovement(), areaTrigger->GetSpline()); - - if (hasTargetRollPitchYaw) - *data << areaTrigger->GetTargetRollPitchYaw().PositionXYZStream(); - - if (hasScaleCurveID) - *data << uint32(createProperties->ScaleCurveId); - - if (hasMorphCurveID) - *data << uint32(createProperties->MorphCurveId); - - if (hasFacingCurveID) - *data << uint32(createProperties->FacingCurveId); - - if (hasMoveCurveID) - *data << uint32(createProperties->MoveCurveId); - - if (hasPositionalSoundKitID) - *data << uint32(0); - - //if (hasMovementScript) - // *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo - - if (areaTrigger->HasOrbit()) - { - using WorldPackets::AreaTrigger::operator<<; - *data << areaTrigger->GetOrbit(); - } - } - if (flags.GameObject) { - GameObject const* gameObject = ToGameObject(); + GameObject const* gameObject = static_cast<GameObject const*>(this); Transport const* transport = gameObject->ToTransport(); bool bit8 = false; @@ -794,10 +661,10 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (flags.ActivePlayer) { - Player const* player = ToPlayer(); + Player const* player = static_cast<Player const*>(this); bool HasSceneInstanceIDs = !player->GetSceneMgr().GetSceneTemplateByInstanceMap().empty(); - bool HasRuneState = ToUnit()->GetPowerIndex(POWER_RUNES) != MAX_POWERS; + bool HasRuneState = player->GetPowerIndex(POWER_RUNES) != MAX_POWERS; data->WriteBit(HasSceneInstanceIDs); data->WriteBit(HasRuneState); @@ -805,8 +672,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (HasSceneInstanceIDs) { *data << uint32(player->GetSceneMgr().GetSceneTemplateByInstanceMap().size()); - for (auto const& itr : player->GetSceneMgr().GetSceneTemplateByInstanceMap()) - *data << uint32(itr.first); + for (auto const& [sceneInstanceId, _] : player->GetSceneMgr().GetSceneTemplateByInstanceMap()) + *data << uint32(sceneInstanceId); } if (HasRuneState) { @@ -823,7 +690,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (flags.Conversation) { - Conversation const* self = ToConversation(); + Conversation const* self = static_cast<Conversation const*>(this); if (data->WriteBit(self->GetTextureKitId() != 0)) *data << uint32(self->GetTextureKitId()); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index b5940dc0b73..971b74494e0 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -93,7 +93,6 @@ struct CreateObjectBits bool Vehicle : 1; bool AnimKit : 1; bool Rotation : 1; - bool AreaTrigger : 1; bool GameObject : 1; bool SmoothPhasing : 1; bool ThisIsYou : 1; diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h index ef802f8447d..874b38d87d8 100644 --- a/src/server/game/Entities/Object/Updates/UpdateField.h +++ b/src/server/game/Entities/Object/Updates/UpdateField.h @@ -23,6 +23,7 @@ #include "UpdateMask.h" #include <algorithm> #include <memory> +#include <variant> #include <vector> class ByteBuffer; @@ -68,6 +69,15 @@ namespace UF template<typename T, int32 BlockBit, uint32 Bit> class OptionalUpdateField; + template<typename T> + inline constexpr std::type_identity<T> VariantCase; + + template<typename... Types> + class VariantUpdateFieldBase; + + template<int32 BlockBit, uint32 Bit, typename... Types> + class VariantUpdateField; + template<typename T, bool PublicSet> struct MutableFieldReferenceWithChangesMask; @@ -352,6 +362,24 @@ namespace UF return { *((_value.*field)._value) }; } + template<typename V, int32 BlockBit, uint32 Bit, typename... Types> + std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>, + MutableFieldReference<V, PublicSet>, + std::conditional_t<std::is_base_of_v<IsUpdateFieldHolderTag, V>, + MutableNestedFieldReference<V, PublicSet>, + UpdateFieldSetter<V, PublicSet>>> + ModifyValue(VariantUpdateField<BlockBit, Bit, Types...>(T::* field), [[maybe_unused]] std::type_identity<V> type) + { + if (!(_value.*field).template Is<V>()) + (_value.*field).template ConstructValue<V>(); + + if constexpr (BlockBit >= 0) + _value._changesMask.Set(BlockBit); + + _value._changesMask.Set(Bit); + return { *((_value.*field).template Get<V>()) }; + } + private: T& _value; }; @@ -538,6 +566,17 @@ namespace UF _changesMask.Set(Bit); } + template<typename Derived, int32 BlockBit, uint32 Bit, typename... Types> + void MarkChanged(VariantUpdateField<BlockBit, Bit, Types...>(Derived::*)) + { + static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); + + if constexpr (BlockBit >= 0) + _changesMask.Set(BlockBit); + + _changesMask.Set(Bit); + } + template<typename Derived, typename T, int32 BlockBit, uint32 Bit> void ClearChanged(UpdateField<T, BlockBit, Bit>(Derived::*)) { @@ -578,6 +617,14 @@ namespace UF _changesMask.Reset(Bit); } + template<typename Derived, int32 BlockBit, uint32 Bit, typename... Types> + void ClearChanged(VariantUpdateField<BlockBit, Bit, Types...>(Derived::*)) + { + static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask"); + + _changesMask.Reset(Bit); + } + Mask const& GetChangesMask() const { return _changesMask; } protected: @@ -614,6 +661,17 @@ namespace UF field._value->ClearChangesMask(); } + template<int32 BlockBit, uint32 Bit, typename... Types> + static void ClearChangesMask(VariantUpdateField<BlockBit, Bit, Types...>& field) + { + if constexpr ((std::is_base_of_v<HasChangesMaskTag, Types> || ...)) + std::visit([]<typename T>(T& value) + { + if constexpr (std::is_base_of_v<HasChangesMaskTag, T>) + value.ClearChangesMask(); + }, field._value); + } + Mask _changesMask; }; @@ -894,6 +952,64 @@ namespace UF { }; + template<typename... Types> + class VariantUpdateFieldBase : public IsUpdateFieldHolderTag + { + template<typename F, bool PublicSet> + friend struct MutableFieldReferenceWithChangesMask; + + template<typename F, bool PublicSet> + friend struct MutableFieldReferenceNoChangesMask; + + template<typename F, bool PublicSet> + friend struct MutableNestedFieldReference; + + template<std::size_t Bits> + friend class HasChangesMask; + + friend class UpdateFieldHolder; + + public: + template<typename T> + bool Is() const { return std::holds_alternative<T>(_value); } + + template<typename T> + T const* Get() const noexcept + { + if (std::holds_alternative<T>(_value)) + return &std::get<T>(_value); + return nullptr; + } + + template<typename Visitor> + decltype(auto) Visit(Visitor&& visitor) const noexcept + { + return std::visit(std::forward<Visitor>(visitor), _value); + } + + private: + template<typename T> + void ConstructValue() + { + _value.template emplace<T>(); + } + + template<typename T> + T* Get() noexcept + { + if (std::holds_alternative<T>(_value)) + return &std::get<T>(_value); + return nullptr; + } + + std::variant<std::monostate, Types...> _value; + }; + + template<int32 BlockBit, uint32 Bit, typename... Types> + class VariantUpdateField : public VariantUpdateFieldBase<Types...> + { + }; + template<typename T> struct ViewerDependentValueTag { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index a86aa7f9988..f70dc26de37 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -20,6 +20,7 @@ #include "ByteBuffer.h" #include "Corpse.h" #include "DynamicObject.h" +#include "PacketOperators.h" #include "Player.h" #include "ViewerDependentValues.h" @@ -852,18 +853,24 @@ void UnitChannel::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* { data << int32(SpellID); SpellVisual.WriteCreate(data, owner, receiver); + data << uint32(StartTimeMs); + data << uint32(Duration); } void UnitChannel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const { data << int32(SpellID); SpellVisual.WriteUpdate(data, ignoreChangesMask, owner, receiver); + data << uint32(StartTimeMs); + data << uint32(Duration); } bool UnitChannel::operator==(UnitChannel const& right) const { return SpellID == right.SpellID - && SpellVisual == right.SpellVisual; + && SpellVisual == right.SpellVisual + && StartTimeMs == right.StartTimeMs + && Duration == right.Duration; } void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const @@ -937,6 +944,51 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const && AuraSpellID == right.AuraSpellID; } +void UnitAssistActionData::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const +{ + data << uint8(Type); + data << uint32(VirtualRealmAddress); + data.WriteBits(PlayerName->size(), 6); + data.FlushBits(); + data << WorldPackets::SizedString::Data(*PlayerName); +} + +void UnitAssistActionData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << uint8(Type); + } + if (changesMask[3]) + { + data << uint32(VirtualRealmAddress); + } + if (changesMask[2]) + { + data.WriteBits(PlayerName->size(), 6); + data.FlushBits(); + data << WorldPackets::SizedString::Data(*PlayerName); + } + } +} + +void UnitAssistActionData::ClearChangesMask() +{ + Base::ClearChangesMask(Type); + Base::ClearChangesMask(PlayerName); + Base::ClearChangesMask(VirtualRealmAddress); + _changesMask.ResetAll(); +} + void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; @@ -1148,18 +1200,24 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi { data << ChannelObjects[i]; } + data.FlushBits(); data.WriteBit(Field_314); + data.WriteBits(AssistActionData.has_value(), 1); + if (AssistActionData.has_value()) + { + AssistActionData->WriteCreate(data, owner, receiver); + } data.FlushBits(); } static constexpr void UnitDataAppendAllowedFieldsMaskForFlag(UnitData::Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xF0000080u, 0xFF80FFFFu, 0x3FFFFFFFu }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xE0000100u, 0xFF01FFFFu, 0x7FFFFFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF0000080u, 0x0000FFFFu, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xE0000100u, 0x0001FFFFu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0001FE00u }; } void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -1169,14 +1227,14 @@ void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFl void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u }); UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u }); UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1776,84 +1834,93 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor { data << *NameplateAttachToGUID; } + data.WriteBits(AssistActionData.has_value(), 1); + data.FlushBits(); + if (changesMask[135]) + { + if (AssistActionData.has_value()) + { + AssistActionData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[135]) + if (changesMask[136]) { for (uint32 i = 0; i < 10; ++i) { - if (changesMask[136 + i]) + if (changesMask[137 + i]) { data << int32(Power[i]); } - if (changesMask[146 + i]) + if (changesMask[147 + i]) { data << int32(MaxPower[i]); } - if (changesMask[156 + i]) + if (changesMask[157 + i]) { data << float(PowerRegenFlatModifier[i]); } - if (changesMask[166 + i]) + if (changesMask[167 + i]) { data << float(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[176]) + if (changesMask[177]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[177 + i]) + if (changesMask[178 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[180]) + if (changesMask[181]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[181 + i]) + if (changesMask[182 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[183]) + if (changesMask[184]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[184 + i]) + if (changesMask[185 + i]) { data << int32(Stats[i]); } - if (changesMask[188 + i]) + if (changesMask[189 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[192 + i]) + if (changesMask[193 + i]) { data << int32(StatNegBuff[i]); } - if (changesMask[196 + i]) + if (changesMask[197 + i]) { data << int32(StatSupportBuff[i]); } } } - if (changesMask[200]) + if (changesMask[201]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[201 + i]) + if (changesMask[202 + i]) { data << int32(Resistances[i]); } - if (changesMask[208 + i]) + if (changesMask[209 + i]) { data << int32(BonusResistanceMods[i]); } - if (changesMask[215 + i]) + if (changesMask[216 + i]) { data << int32(ManaCostModifier[i]); } @@ -1994,6 +2061,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(Field_31C); Base::ClearChangesMask(Field_320); Base::ClearChangesMask(NameplateAttachToGUID); + Base::ClearChangesMask(AssistActionData); Base::ClearChangesMask(Power); Base::ClearChangesMask(MaxPower); Base::ClearChangesMask(PowerRegenFlatModifier); @@ -2196,7 +2264,7 @@ void PetCreatureName::WriteCreate(ByteBuffer& data, Player const* owner, Player { data << uint32(CreatureID); data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); data.FlushBits(); } @@ -2218,7 +2286,7 @@ void PetCreatureName::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Play if (changesMask[2]) { data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } } data.FlushBits(); @@ -2252,6 +2320,50 @@ bool CTROptions::operator==(CTROptions const& right) const && ChromieTimeExpansionMask == right.ChromieTimeExpansionMask; } +void LeaverInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << BnetAccountGUID; + data << float(LeaveScore); + data << uint32(SeasonID); + data << uint32(TotalLeaves); + data << uint32(TotalSuccesses); + data << int32(ConsecutiveSuccesses); + data << int64(LastPenaltyTime); + data << int64(LeaverExpirationTime); + data << int32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); +} + +void LeaverInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << BnetAccountGUID; + data << float(LeaveScore); + data << uint32(SeasonID); + data << uint32(TotalLeaves); + data << uint32(TotalSuccesses); + data << int32(ConsecutiveSuccesses); + data << int64(LastPenaltyTime); + data << int64(LeaverExpirationTime); + data << int32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); +} + +bool LeaverInfo::operator==(LeaverInfo const& right) const +{ + return BnetAccountGUID == right.BnetAccountGUID + && LeaveScore == right.LeaveScore + && SeasonID == right.SeasonID + && TotalLeaves == right.TotalLeaves + && TotalSuccesses == right.TotalSuccesses + && ConsecutiveSuccesses == right.ConsecutiveSuccesses + && LastPenaltyTime == right.LastPenaltyTime + && LeaverExpirationTime == right.LeaverExpirationTime + && Unknown_1120 == right.Unknown_1120 + && LeaverStatus == right.LeaverStatus; +} + void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { for (uint32 i = 0; i < 5; ++i) @@ -2260,7 +2372,7 @@ void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player co } for (uint32 i = 0; i < 5; ++i) { - data.WriteString(Name[i]); + data << WorldPackets::SizedString::Data(Name[i]); } data.FlushBits(); } @@ -2292,7 +2404,7 @@ void DeclinedNames::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player { if (changesMask[1 + i]) { - data.WriteString(Name[i]); + data << WorldPackets::SizedString::Data(Name[i]); } } } @@ -2398,6 +2510,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << int32(FakeInebriation); data << uint32(VirtualPlayerRealm); data << uint32(CurrentSpecID); + data << int32(CurrentCombatTraitConfigSubTreeID); data << int32(TaxiMountAnimKitID); for (uint32 i = 0; i < 6; ++i) { @@ -2458,7 +2571,8 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data.WriteBit(HasLevelLink); data.WriteBits(DeclinedNames.has_value(), 1); data << *DungeonScore; - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); + LeaverInfo->WriteCreate(data, owner, receiver); for (uint32 i = 0; i < 16; ++i) { data << VisibleEquipableSpells[i]; @@ -2477,7 +2591,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi static constexpr void PlayerDataAppendAllowedFieldsMaskForFlag(PlayerData::Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= std::array<uint32, 11>{ 0x00000022u, 0xFFFE0000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u, 0x00000000u, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 11>{ 0x00000022u, 0xFFF80000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u }; } void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) @@ -2487,14 +2601,14 @@ void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, Enum void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0001FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFEu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000003u }); + Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu }); PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0001FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFEu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000003u }); + Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu }); PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2708,74 +2822,82 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } if (changesMask[29]) { - data << int32(TaxiMountAnimKitID); + data << int32(CurrentCombatTraitConfigSubTreeID); } if (changesMask[30]) { - data << uint8(CurrentBattlePetBreedQuality); + data << int32(TaxiMountAnimKitID); } if (changesMask[31]) { - data << int32(HonorLevel); + data << uint8(CurrentBattlePetBreedQuality); } } if (changesMask[32]) { if (changesMask[33]) { + data << int32(HonorLevel); + } + if (changesMask[34]) + { data << int64(LogoutTime); } - if (changesMask[35]) + if (changesMask[36]) { data << int32(Field_1AC); } - if (changesMask[36]) + if (changesMask[37]) { data << int32(Field_1B0); } - if (changesMask[37]) + if (changesMask[38]) { data << int32(CurrentBattlePetSpeciesID); } - if (changesMask[38]) + if (changesMask[39]) { CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[39]) + if (changesMask[40]) { data << int32(CovenantID); } - if (changesMask[40]) + if (changesMask[41]) { data << int32(SoulbindID); } - if (changesMask[42]) + if (changesMask[44]) { data << *SpectateTarget; } - if (changesMask[43]) + if (changesMask[45]) { data << int32(Field_200); } - if (changesMask[45]) + if (changesMask[47]) { PersonalTabard->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[34]) + if (changesMask[35]) { data.WriteBits(Name->size(), 6); } data.WriteBits(DeclinedNames.has_value(), 1); data.FlushBits(); - if (changesMask[41]) + if (changesMask[42]) { data << *DungeonScore; } - if (changesMask[34]) + if (changesMask[35]) { - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } - if (changesMask[44]) + if (changesMask[43]) + { + LeaverInfo->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[46]) { if (DeclinedNames.has_value()) { @@ -2783,21 +2905,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[46]) + if (changesMask[48]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[47 + i]) + if (changesMask[49 + i]) { data << uint8(PartyType[i]); } } } - if (changesMask[49]) + if (changesMask[51]) { for (uint32 i = 0; i < 175; ++i) { - if (changesMask[50 + i]) + if (changesMask[52 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2806,51 +2928,51 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[225]) + if (changesMask[227]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[226 + i]) + if (changesMask[228 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[245]) + if (changesMask[247]) { for (uint32 i = 0; i < 6; ++i) { - if (changesMask[246 + i]) + if (changesMask[248 + i]) { data << float(AvgItemLevel[i]); } } } - if (changesMask[252]) + if (changesMask[254]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[253 + i]) + if (changesMask[255 + i]) { ForcedReactions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[302]) + if (changesMask[304]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[303 + i]) + if (changesMask[305 + i]) { data << uint32(Field_3120[i]); } } } - if (changesMask[285]) + if (changesMask[287]) { for (uint32 i = 0; i < 16; ++i) { - if (changesMask[286 + i]) + if (changesMask[288 + i]) { data << VisibleEquipableSpells[i]; } @@ -2889,6 +3011,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(FakeInebriation); Base::ClearChangesMask(VirtualPlayerRealm); Base::ClearChangesMask(CurrentSpecID); + Base::ClearChangesMask(CurrentCombatTraitConfigSubTreeID); Base::ClearChangesMask(TaxiMountAnimKitID); Base::ClearChangesMask(CurrentBattlePetBreedQuality); Base::ClearChangesMask(HonorLevel); @@ -2901,6 +3024,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(CovenantID); Base::ClearChangesMask(SoulbindID); Base::ClearChangesMask(DungeonScore); + Base::ClearChangesMask(LeaverInfo); Base::ClearChangesMask(SpectateTarget); Base::ClearChangesMask(Field_200); Base::ClearChangesMask(DeclinedNames); @@ -3613,6 +3737,7 @@ void TraitEntry::WriteCreate(ByteBuffer& data, Player const* owner, Player const data << int32(TraitNodeEntryID); data << int32(Rank); data << int32(GrantedRanks); + data << int32(BonusRanks); } void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const @@ -3621,6 +3746,7 @@ void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player co data << int32(TraitNodeEntryID); data << int32(Rank); data << int32(GrantedRanks); + data << int32(BonusRanks); } bool TraitEntry::operator==(TraitEntry const& right) const @@ -3628,7 +3754,8 @@ bool TraitEntry::operator==(TraitEntry const& right) const return TraitNodeID == right.TraitNodeID && TraitNodeEntryID == right.TraitNodeEntryID && Rank == right.Rank - && GrantedRanks == right.GrantedRanks; + && GrantedRanks == right.GrantedRanks + && BonusRanks == right.BonusRanks; } void TraitSubTreeCache::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const @@ -3692,7 +3819,7 @@ void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player cons { SubTrees[i].WriteCreate(data, owner, receiver); } - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); data.FlushBits(); } @@ -3802,7 +3929,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c if (changesMask[5]) { data.WriteBits(Name->size(), 9); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } } data.FlushBits(); @@ -3987,7 +4114,7 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe { Reagents[i].WriteCreate(data, owner, receiver); } - data.WriteString(CustomerNotes); + data << WorldPackets::SizedString::Data(*CustomerNotes); if (Customer.has_value()) { Customer->WriteCreate(data, owner, receiver); @@ -4123,7 +4250,7 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl { if (changesMask[20]) { - data.WriteString(CustomerNotes); + data << WorldPackets::SizedString::Data(*CustomerNotes); } if (changesMask[21]) { @@ -4398,7 +4525,7 @@ void StablePetInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player co data << uint8(PetFlags); data << uint32(Specialization); data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); data.FlushBits(); } @@ -4444,7 +4571,7 @@ void StablePetInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player if (changesMask[6]) { data.WriteBits(Name->size(), 8); - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } } data.FlushBits(); @@ -4565,9 +4692,9 @@ void BankTabSettings::WriteCreate(ByteBuffer& data, Player const* owner, Player data.WriteBits(Icon->size(), 9); data.WriteBits(Description->size(), 14); data << int32(DepositFlags); - data.WriteString(Name); - data.WriteString(Icon); - data.WriteString(Description); + data << WorldPackets::SizedString::Data(*Name); + data << WorldPackets::SizedString::Data(*Icon); + data << WorldPackets::SizedString::Data(*Description); data.FlushBits(); } @@ -4598,15 +4725,15 @@ void BankTabSettings::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Play } if (changesMask[0]) { - data.WriteString(Name); + data << WorldPackets::SizedString::Data(*Name); } if (changesMask[1]) { - data.WriteString(Icon); + data << WorldPackets::SizedString::Data(*Icon); } if (changesMask[2]) { - data.WriteString(Description); + data << WorldPackets::SizedString::Data(*Description); } data.FlushBits(); } @@ -4687,6 +4814,47 @@ bool DelveData::operator==(DelveData const& right) const && Started == right.Started; } +void ChallengeModeData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(Unknown_1120_1); + data << int32(Unknown_1120_2); + data << uint64(Unknown_1120_3); + data << int64(Unknown_1120_4); + data << KeystoneOwnerGUID; + data << LeaverGUID; + data.WriteBits(IsActive, 1); + data.WriteBits(HasRestrictions, 1); + data.WriteBits(CanVoteAbandon, 1); + data.FlushBits(); +} + +void ChallengeModeData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(Unknown_1120_1); + data << int32(Unknown_1120_2); + data << uint64(Unknown_1120_3); + data << int64(Unknown_1120_4); + data << KeystoneOwnerGUID; + data << LeaverGUID; + data.WriteBits(IsActive, 1); + data.WriteBits(HasRestrictions, 1); + data.WriteBits(CanVoteAbandon, 1); + data.FlushBits(); +} + +bool ChallengeModeData::operator==(ChallengeModeData const& right) const +{ + return Unknown_1120_1 == right.Unknown_1120_1 + && Unknown_1120_2 == right.Unknown_1120_2 + && Unknown_1120_3 == right.Unknown_1120_3 + && Unknown_1120_4 == right.Unknown_1120_4 + && KeystoneOwnerGUID == right.KeystoneOwnerGUID + && LeaverGUID == right.LeaverGUID + && IsActive == right.IsActive + && HasRestrictions == right.HasRestrictions + && CanVoteAbandon == right.CanVoteAbandon; +} + void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { data << int16(ResearchProjectID); @@ -4704,7 +4872,7 @@ bool Research::operator==(Research const& right) const void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 232; ++i) + for (uint32 i = 0; i < 105; ++i) { data << InvSlots[i]; } @@ -4819,14 +4987,11 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << uint32(BagSlotFlags[i]); } - for (uint32 i = 0; i < 7; ++i) - { - data << uint32(BankBagSlotFlags[i]); - } data << int32(Honor); data << int32(HonorNextLevel); data << int32(PerksProgramCurrency); data << uint8(NumBankSlots); + data << uint8(NumCharacterBankTabs); data << uint8(NumAccountBankTabs); for (uint32 i = 0; i < 1; ++i) { @@ -5017,9 +5182,11 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data.WriteBit(HasPerksProgramPendingReward); data.WriteBits(QuestSession.has_value(), 1); data.WriteBits(PetStable.has_value(), 1); + data.WriteBits(CharacterBankTabSettings.size(), 3); data.WriteBits(AccountBankTabSettings.size(), 3); data.WriteBits(WalkInData.has_value(), 1); data.WriteBits(DelveData.has_value(), 1); + data.WriteBits(ChallengeModeData.has_value(), 1); data.FlushBits(); ResearchHistory->WriteCreate(data, owner, receiver); if (QuestSession.has_value()) @@ -5049,6 +5216,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { PetStable->WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i) + { + CharacterBankTabSettings[i].WriteCreate(data, owner, receiver); + } for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) { AccountBankTabSettings[i].WriteCreate(data, owner, receiver); @@ -5061,6 +5232,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { DelveData->WriteCreate(data, owner, receiver); } + if (ChallengeModeData.has_value()) + { + ChallengeModeData->WriteCreate(data, owner, receiver); + } data.FlushBits(); } @@ -5071,8 +5246,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 17); - for (uint32 i = 0; i < 17; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 13); + for (uint32 i = 0; i < 13; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -5131,11 +5306,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data); } } - if (changesMask[42]) + if (changesMask[43]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { if (!ignoreNestedChangesMask) ResearchSites[i].WriteUpdateMask(data); @@ -5144,11 +5319,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[44]) + if (changesMask[45]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { if (!ignoreNestedChangesMask) ResearchSiteProgress[i].WriteUpdateMask(data); @@ -5157,11 +5332,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[46]) + if (changesMask[47]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[47]) + if (changesMask[48]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -5170,11 +5345,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[42]) + if (changesMask[43]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { for (uint32 j = 0; j < ResearchSites[i].size(); ++j) { @@ -5186,11 +5361,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[44]) + if (changesMask[45]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j) { @@ -5202,11 +5377,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[46]) + if (changesMask[47]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[47]) + if (changesMask[48]) { for (uint32 j = 0; j < Research[i].size(); ++j) { @@ -5731,6 +5906,13 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo if (changesMask[41]) { if (!ignoreNestedChangesMask) + CharacterBankTabSettings.WriteUpdateMask(data, 3); + else + WriteCompleteDynamicFieldUpdateMask(CharacterBankTabSettings.size(), data, 3); + } + if (changesMask[42]) + { + if (!ignoreNestedChangesMask) AccountBankTabSettings.WriteUpdateMask(data, 3); else WriteCompleteDynamicFieldUpdateMask(AccountBankTabSettings.size(), data, 3); @@ -5784,6 +5966,16 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[41]) { + for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i) + { + if (CharacterBankTabSettings.HasChanged(i) || ignoreNestedChangesMask) + { + CharacterBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[42]) + { for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) { if (AccountBankTabSettings.HasChanged(i) || ignoreNestedChangesMask) @@ -5792,364 +5984,368 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[48]) - { - data << *FarsightObject; - } if (changesMask[49]) { - data << *SummonedBattlePetGUID; + data << *FarsightObject; } if (changesMask[50]) { - data << uint64(Coinage); + data << *SummonedBattlePetGUID; } if (changesMask[51]) { - data << uint64(AccountBankCoinage); + data << uint64(Coinage); } if (changesMask[52]) { - data << int32(XP); + data << uint64(AccountBankCoinage); } if (changesMask[53]) { - data << int32(NextLevelXP); + data << int32(XP); } if (changesMask[54]) { - data << int32(TrialXP); + data << int32(NextLevelXP); } if (changesMask[55]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(TrialXP); } if (changesMask[56]) { - data << int32(CharacterPoints); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[57]) { - data << int32(MaxTalentTiers); + data << int32(CharacterPoints); } if (changesMask[58]) { - data << uint32(TrackCreatureMask); + data << int32(MaxTalentTiers); } if (changesMask[59]) { - data << float(MainhandExpertise); + data << uint32(TrackCreatureMask); } if (changesMask[60]) { - data << float(OffhandExpertise); + data << float(MainhandExpertise); } if (changesMask[61]) { - data << float(RangedExpertise); + data << float(OffhandExpertise); } if (changesMask[62]) { - data << float(CombatRatingExpertise); + data << float(RangedExpertise); } if (changesMask[63]) { - data << float(BlockPercentage); + data << float(CombatRatingExpertise); } if (changesMask[64]) { - data << float(DodgePercentage); + data << float(BlockPercentage); } if (changesMask[65]) { - data << float(DodgePercentageFromAttribute); + data << float(DodgePercentage); } if (changesMask[66]) { - data << float(ParryPercentage); + data << float(DodgePercentageFromAttribute); } if (changesMask[67]) { - data << float(ParryPercentageFromAttribute); + data << float(ParryPercentage); } if (changesMask[68]) { - data << float(CritPercentage); + data << float(ParryPercentageFromAttribute); } if (changesMask[69]) { - data << float(RangedCritPercentage); + data << float(CritPercentage); } } if (changesMask[70]) { if (changesMask[71]) { - data << float(OffhandCritPercentage); + data << float(RangedCritPercentage); } if (changesMask[72]) { - data << float(SpellCritPercentage); + data << float(OffhandCritPercentage); } if (changesMask[73]) { - data << int32(ShieldBlock); + data << float(SpellCritPercentage); } if (changesMask[74]) { - data << float(ShieldBlockCritPercentage); + data << int32(ShieldBlock); } if (changesMask[75]) { - data << float(Mastery); + data << float(ShieldBlockCritPercentage); } if (changesMask[76]) { - data << float(Speed); + data << float(Mastery); } if (changesMask[77]) { - data << float(Avoidance); + data << float(Speed); } if (changesMask[78]) { - data << float(Sturdiness); + data << float(Avoidance); } if (changesMask[79]) { - data << int32(Versatility); + data << float(Sturdiness); } if (changesMask[80]) { - data << float(VersatilityBonus); + data << int32(Versatility); } if (changesMask[81]) { - data << float(PvpPowerDamage); + data << float(VersatilityBonus); } if (changesMask[82]) { - data << float(PvpPowerHealing); + data << float(PvpPowerDamage); } if (changesMask[83]) { - BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << float(PvpPowerHealing); } if (changesMask[84]) { - data << int32(ModHealingDonePos); + BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[85]) { - data << float(ModHealingPercent); + data << int32(ModHealingDonePos); } if (changesMask[86]) { - data << float(ModPeriodicHealingDonePercent); + data << float(ModHealingPercent); } if (changesMask[87]) { - data << float(ModSpellPowerPercent); + data << float(ModPeriodicHealingDonePercent); } if (changesMask[88]) { - data << float(ModResiliencePercent); + data << float(ModSpellPowerPercent); } if (changesMask[89]) { - data << float(OverrideSpellPowerByAPPercent); + data << float(ModResiliencePercent); } if (changesMask[90]) { - data << float(OverrideAPBySpellPowerPercent); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[91]) { - data << int32(ModTargetResistance); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[92]) { - data << int32(ModTargetPhysicalResistance); + data << int32(ModTargetResistance); } if (changesMask[93]) { - data << uint32(LocalFlags); + data << int32(ModTargetPhysicalResistance); } if (changesMask[94]) { - data << uint8(GrantableLevels); + data << uint32(LocalFlags); } if (changesMask[95]) { - data << uint8(MultiActionBars); + data << uint8(GrantableLevels); } if (changesMask[96]) { - data << uint8(LifetimeMaxRank); + data << uint8(MultiActionBars); } if (changesMask[97]) { - data << uint8(NumRespecs); + data << uint8(LifetimeMaxRank); } if (changesMask[98]) { - data << uint32(PvpMedals); + data << uint8(NumRespecs); } if (changesMask[99]) { - data << uint16(TodayHonorableKills); + data << uint32(PvpMedals); } if (changesMask[100]) { - data << uint16(YesterdayHonorableKills); + data << uint16(TodayHonorableKills); } if (changesMask[101]) { - data << uint32(LifetimeHonorableKills); + data << uint16(YesterdayHonorableKills); } } if (changesMask[102]) { if (changesMask[103]) { - data << int32(WatchedFactionIndex); + data << uint32(LifetimeHonorableKills); } if (changesMask[104]) { - data << int32(MaxLevel); + data << int32(WatchedFactionIndex); } if (changesMask[105]) { - data << int32(ScalingPlayerLevelDelta); + data << int32(MaxLevel); } if (changesMask[106]) { - data << int32(MaxCreatureScalingLevel); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[107]) { - data << int32(PetSpellPower); + data << int32(MaxCreatureScalingLevel); } if (changesMask[108]) { - data << float(UiHitModifier); + data << int32(PetSpellPower); } if (changesMask[109]) { - data << float(UiSpellHitModifier); + data << float(UiHitModifier); } if (changesMask[110]) { - data << int32(HomeRealmTimeOffset); + data << float(UiSpellHitModifier); } if (changesMask[111]) { - data << float(ModPetHaste); + data << int32(HomeRealmTimeOffset); } if (changesMask[112]) { - data << int8(JailersTowerLevelMax); + data << float(ModPetHaste); } if (changesMask[113]) { - data << int8(JailersTowerLevel); + data << int8(JailersTowerLevelMax); } if (changesMask[114]) { - data << uint8(LocalRegenFlags); + data << int8(JailersTowerLevel); } if (changesMask[115]) { - data << uint8(AuraVision); + data << uint8(LocalRegenFlags); } if (changesMask[116]) { - data << uint8(NumBackpackSlots); + data << uint8(AuraVision); } if (changesMask[117]) { - data << int32(OverrideSpellsID); + data << uint8(NumBackpackSlots); } if (changesMask[118]) { - data << uint16(LootSpecID); + data << int32(OverrideSpellsID); } if (changesMask[119]) { - data << uint32(OverrideZonePVPType); + data << uint16(LootSpecID); } if (changesMask[120]) { - data << int32(Honor); + data << uint32(OverrideZonePVPType); } if (changesMask[121]) { - data << int32(HonorNextLevel); + data << int32(Honor); } if (changesMask[122]) { - data << int32(PerksProgramCurrency); + data << int32(HonorNextLevel); } if (changesMask[123]) { - data << uint8(NumBankSlots); + data << int32(PerksProgramCurrency); } if (changesMask[124]) { - data << uint8(NumAccountBankTabs); + data << uint8(NumBankSlots); } - if (changesMask[129]) + if (changesMask[125]) { - data << int32(UiChromieTimeExpansionID); + data << uint8(NumCharacterBankTabs); } - if (changesMask[130]) + if (changesMask[126]) { - data << int32(TimerunningSeasonID); + data << uint8(NumAccountBankTabs); } if (changesMask[131]) { - data << int32(TransportServerTime); + data << int32(UiChromieTimeExpansionID); } if (changesMask[132]) { - data << uint32(WeeklyRewardsPeriodSinceOrigin); + data << int32(TimerunningSeasonID); } if (changesMask[133]) { - data << int16(DEBUGSoulbindConduitRank); + data << int32(TransportServerTime); } } if (changesMask[134]) { + if (changesMask[135]) + { + data << uint32(WeeklyRewardsPeriodSinceOrigin); + } if (changesMask[136]) { + data << int16(DEBUGSoulbindConduitRank); + } + if (changesMask[138]) + { data << uint32(ActiveCombatTraitConfigID); } - if (changesMask[137]) + if (changesMask[139]) { data << int32(ItemUpgradeHighOnehandWeaponItemID); } - if (changesMask[138]) + if (changesMask[140]) { data << int32(ItemUpgradeHighFingerItemID); } - if (changesMask[139]) + if (changesMask[141]) { data << float(ItemUpgradeHighFingerWatermark); } - if (changesMask[140]) + if (changesMask[142]) { data << int32(ItemUpgradeHighTrinketItemID); } - if (changesMask[141]) + if (changesMask[143]) { data << float(ItemUpgradeHighTrinketWatermark); } - if (changesMask[142]) + if (changesMask[144]) { data << uint64(LootHistoryInstanceID); } - if (changesMask[144]) + if (changesMask[146]) { data << uint8(RequiredMountCapabilityFlags); } @@ -6163,183 +6359,181 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.WriteBits(PetStable.has_value(), 1); data.WriteBits(WalkInData.has_value(), 1); data.WriteBits(DelveData.has_value(), 1); + data.WriteBits(ChallengeModeData.has_value(), 1); } data.FlushBits(); if (changesMask[102]) { - if (changesMask[125]) + if (changesMask[127]) { ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[127]) + if (changesMask[129]) { if (QuestSession.has_value()) { QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[126]) + if (changesMask[128]) { data << *FrozenPerksVendorItem; } - if (changesMask[128]) + if (changesMask[130]) { Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } if (changesMask[134]) { - if (changesMask[135]) + if (changesMask[137]) { data << *DungeonScore; } - if (changesMask[143]) + if (changesMask[145]) { if (PetStable.has_value()) { PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[145]) + if (changesMask[147]) { if (WalkInData.has_value()) { WalkInData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[146]) + if (changesMask[148]) { if (DelveData.has_value()) { DelveData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } + if (changesMask[149]) + { + if (ChallengeModeData.has_value()) + { + ChallengeModeData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[147]) + if (changesMask[150]) { - for (uint32 i = 0; i < 232; ++i) + for (uint32 i = 0; i < 105; ++i) { - if (changesMask[148 + i]) + if (changesMask[151 + i]) { data << InvSlots[i]; } } } - if (changesMask[380]) + if (changesMask[256]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[381 + i]) + if (changesMask[257 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[383]) + if (changesMask[259]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[384 + i]) + if (changesMask[260 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[391 + i]) + if (changesMask[267 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[398 + i]) + if (changesMask[274 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[405 + i]) + if (changesMask[281 + i]) { data << float(ModHealingDonePercent[i]); } } } - if (changesMask[412]) + if (changesMask[288]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[413 + i]) + if (changesMask[289 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[416 + i]) + if (changesMask[292 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[419]) + if (changesMask[295]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[420 + i]) + if (changesMask[296 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[432 + i]) + if (changesMask[308 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[444]) + if (changesMask[320]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[445 + i]) + if (changesMask[321 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[477]) + if (changesMask[353]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[478 + i]) + if (changesMask[354 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[482]) + if (changesMask[358]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[483 + i]) + if (changesMask[359 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[485]) + if (changesMask[361]) { for (uint32 i = 0; i < 5; ++i) { - if (changesMask[486 + i]) + if (changesMask[362 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[491]) - { - for (uint32 i = 0; i < 7; ++i) - { - if (changesMask[492 + i]) - { - data << uint32(BankBagSlotFlags[i]); - } - } - } - if (changesMask[499]) + if (changesMask[367]) { for (uint32 i = 0; i < 17; ++i) { - if (changesMask[500 + i]) + if (changesMask[368 + i]) { data << float(ItemUpgradeHighWatermark[i]); } @@ -6392,6 +6586,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(CharacterRestrictions); Base::ClearChangesMask(TraitConfigs); Base::ClearChangesMask(CraftingOrders); + Base::ClearChangesMask(CharacterBankTabSettings); Base::ClearChangesMask(AccountBankTabSettings); Base::ClearChangesMask(FarsightObject); Base::ClearChangesMask(SummonedBattlePetGUID); @@ -6467,6 +6662,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(HonorNextLevel); Base::ClearChangesMask(PerksProgramCurrency); Base::ClearChangesMask(NumBankSlots); + Base::ClearChangesMask(NumCharacterBankTabs); Base::ClearChangesMask(NumAccountBankTabs); Base::ClearChangesMask(ResearchHistory); Base::ClearChangesMask(FrozenPerksVendorItem); @@ -6489,6 +6685,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(RequiredMountCapabilityFlags); Base::ClearChangesMask(WalkInData); Base::ClearChangesMask(DelveData); + Base::ClearChangesMask(ChallengeModeData); Base::ClearChangesMask(InvSlots); Base::ClearChangesMask(RestInfo); Base::ClearChangesMask(ModDamageDonePos); @@ -6503,11 +6700,44 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(NoReagentCostMask); Base::ClearChangesMask(ProfessionSkillLine); Base::ClearChangesMask(BagSlotFlags); - Base::ClearChangesMask(BankBagSlotFlags); Base::ClearChangesMask(ItemUpgradeHighWatermark); _changesMask.ResetAll(); } +void GameObjectAssistActionData::WriteCreate(ByteBuffer& data, GameObject const* owner, Player const* receiver) const +{ + data.WriteBits(PlayerName.size(), 6); + data.WriteBits(MonsterName.size() + 1, 11); + data << uint32(VirtualRealmAddress); + data << uint8(Sex); + data << int64(Time); + data << int32(DelveTier); + data << WorldPackets::SizedString::Data(PlayerName); + data << WorldPackets::SizedCString::Data(MonsterName); +} + +void GameObjectAssistActionData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, GameObject const* owner, Player const* receiver) const +{ + data.WriteBits(PlayerName.size(), 6); + data.WriteBits(MonsterName.size() + 1, 11); + data << uint32(VirtualRealmAddress); + data << uint8(Sex); + data << int64(Time); + data << int32(DelveTier); + data << WorldPackets::SizedString::Data(PlayerName); + data << WorldPackets::SizedCString::Data(MonsterName); +} + +bool GameObjectAssistActionData::operator==(GameObjectAssistActionData const& right) const +{ + return PlayerName == right.PlayerName + && MonsterName == right.MonsterName + && VirtualRealmAddress == right.VirtualRealmAddress + && Sex == right.Sex + && Time == right.Time + && DelveTier == right.DelveTier; +} + void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const { ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; @@ -6552,6 +6782,12 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie { data << int32(WorldEffects[i]); } + data.WriteBits(AssistActionData.has_value(), 1); + data.FlushBits(); + if (AssistActionData.has_value()) + { + AssistActionData->WriteCreate(data, owner, receiver); + } } void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const @@ -6561,7 +6797,7 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 25); + data.WriteBits(changesMask.GetBlock(0), 26); ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; @@ -6705,6 +6941,15 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool { data << uint32(UiWidgetItemUnknown1000); } + data.WriteBits(AssistActionData.has_value(), 1); + data.FlushBits(); + if (changesMask[25]) + { + if (AssistActionData.has_value()) + { + AssistActionData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } } @@ -6734,6 +6979,7 @@ void GameObjectData::ClearChangesMask() Base::ClearChangesMask(UiWidgetItemID); Base::ClearChangesMask(UiWidgetItemQuality); Base::ClearChangesMask(UiWidgetItemUnknown1000); + Base::ClearChangesMask(AssistActionData); _changesMask.ResetAll(); } @@ -7044,6 +7290,514 @@ void VisualAnim::ClearChangesMask() _changesMask.ResetAll(); } +void ForceSetAreaTriggerPositionAndRotation::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << TriggerGUID; + data << Position; + data << float(Rotation.x); + data << float(Rotation.y); + data << float(Rotation.z); + data << float(Rotation.w); +} + +void ForceSetAreaTriggerPositionAndRotation::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + data << TriggerGUID; + data << Position; + data << float(Rotation.x); + data << float(Rotation.y); + data << float(Rotation.z); + data << float(Rotation.w); +} + +bool ForceSetAreaTriggerPositionAndRotation::operator==(ForceSetAreaTriggerPositionAndRotation const& right) const +{ + return TriggerGUID == right.TriggerGUID + && Position == right.Position + && Rotation == right.Rotation; +} + +void AreaTriggerSplineCalculator::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data.WriteBits(Points.size(), 16); + data.WriteBit(Catmullrom); + for (uint32 i = 0; i < Points.size(); ++i) + { + data << Points[i]; + } + data.FlushBits(); +} + +void AreaTriggerSplineCalculator::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(Catmullrom); + } + if (changesMask[2]) + { + if (!ignoreChangesMask) + Points.WriteUpdateMask(data, 16); + else + WriteCompleteDynamicFieldUpdateMask(Points.size(), data, 16); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[2]) + { + for (uint32 i = 0; i < Points.size(); ++i) + { + if (Points.HasChanged(i) || ignoreChangesMask) + { + data << Points[i]; + } + } + } + } + data.FlushBits(); +} + +void AreaTriggerSplineCalculator::ClearChangesMask() +{ + Base::ClearChangesMask(Catmullrom); + Base::ClearChangesMask(Points); + _changesMask.ResetAll(); +} + +void AreaTriggerOrbit::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << *Center; + data << float(Radius); + data << float(InitialAngle); + data << float(BlendFromRadius); + data << int32(ExtraTimeForBlending); + data.WriteBit(CounterClockwise); + data.FlushBits(); +} + +void AreaTriggerOrbit::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(CounterClockwise); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data << *Center; + } + if (changesMask[3]) + { + data << float(Radius); + } + if (changesMask[4]) + { + data << float(InitialAngle); + } + if (changesMask[5]) + { + data << float(BlendFromRadius); + } + if (changesMask[6]) + { + data << int32(ExtraTimeForBlending); + } + } + data.FlushBits(); +} + +void AreaTriggerOrbit::ClearChangesMask() +{ + Base::ClearChangesMask(CounterClockwise); + Base::ClearChangesMask(Center); + Base::ClearChangesMask(Radius); + Base::ClearChangesMask(InitialAngle); + Base::ClearChangesMask(BlendFromRadius); + Base::ClearChangesMask(ExtraTimeForBlending); + _changesMask.ResetAll(); +} + +void AreaTriggerMovementScript::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << int32(SpellScriptID); + data << *Center; + data << uint32(CreationTime); +} + +void AreaTriggerMovementScript::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << int32(SpellScriptID); + } + if (changesMask[2]) + { + data << *Center; + } + if (changesMask[3]) + { + data << uint32(CreationTime); + } + } +} + +void AreaTriggerMovementScript::ClearChangesMask() +{ + Base::ClearChangesMask(SpellScriptID); + Base::ClearChangesMask(Center); + Base::ClearChangesMask(CreationTime); + _changesMask.ResetAll(); +} + +void AreaTriggerSphere::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << float(Radius); + data << float(RadiusTarget); +} + +void AreaTriggerSphere::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << float(Radius); + } + if (changesMask[2]) + { + data << float(RadiusTarget); + } + } +} + +void AreaTriggerSphere::ClearChangesMask() +{ + Base::ClearChangesMask(Radius); + Base::ClearChangesMask(RadiusTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerBox::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << *Extents; + data << *ExtentsTarget; +} + +void AreaTriggerBox::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << *Extents; + } + if (changesMask[2]) + { + data << *ExtentsTarget; + } + } +} + +void AreaTriggerBox::ClearChangesMask() +{ + Base::ClearChangesMask(Extents); + Base::ClearChangesMask(ExtentsTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerPolygon::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << uint32(Vertices.size()); + data << uint32(VerticesTarget.size()); + data << float(Height); + data << float(HeightTarget); + for (uint32 i = 0; i < Vertices.size(); ++i) + { + data << Vertices[i]; + } + for (uint32 i = 0; i < VerticesTarget.size(); ++i) + { + data << VerticesTarget[i]; + } +} + +void AreaTriggerPolygon::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 5); + + if (changesMask[0]) + { + if (changesMask[1]) + { + if (!ignoreChangesMask) + Vertices.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Vertices.size(), data); + } + if (changesMask[2]) + { + if (!ignoreChangesMask) + VerticesTarget.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(VerticesTarget.size(), data); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (uint32 i = 0; i < Vertices.size(); ++i) + { + if (Vertices.HasChanged(i) || ignoreChangesMask) + { + data << Vertices[i]; + } + } + } + if (changesMask[2]) + { + for (uint32 i = 0; i < VerticesTarget.size(); ++i) + { + if (VerticesTarget.HasChanged(i) || ignoreChangesMask) + { + data << VerticesTarget[i]; + } + } + } + if (changesMask[3]) + { + data << float(Height); + } + if (changesMask[4]) + { + data << float(HeightTarget); + } + } +} + +void AreaTriggerPolygon::ClearChangesMask() +{ + Base::ClearChangesMask(Vertices); + Base::ClearChangesMask(VerticesTarget); + Base::ClearChangesMask(Height); + Base::ClearChangesMask(HeightTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerCylinder::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << float(Radius); + data << float(RadiusTarget); + data << float(Height); + data << float(HeightTarget); + data << float(LocationZOffset); + data << float(LocationZOffsetTarget); +} + +void AreaTriggerCylinder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << float(Radius); + } + if (changesMask[2]) + { + data << float(RadiusTarget); + } + if (changesMask[3]) + { + data << float(Height); + } + if (changesMask[4]) + { + data << float(HeightTarget); + } + if (changesMask[5]) + { + data << float(LocationZOffset); + } + if (changesMask[6]) + { + data << float(LocationZOffsetTarget); + } + } +} + +void AreaTriggerCylinder::ClearChangesMask() +{ + Base::ClearChangesMask(Radius); + Base::ClearChangesMask(RadiusTarget); + Base::ClearChangesMask(Height); + Base::ClearChangesMask(HeightTarget); + Base::ClearChangesMask(LocationZOffset); + Base::ClearChangesMask(LocationZOffsetTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerDisk::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << float(InnerRadius); + data << float(InnerRadiusTarget); + data << float(OuterRadius); + data << float(OuterRadiusTarget); + data << float(Height); + data << float(HeightTarget); + data << float(LocationZOffset); + data << float(LocationZOffsetTarget); +} + +void AreaTriggerDisk::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 9); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << float(InnerRadius); + } + if (changesMask[2]) + { + data << float(InnerRadiusTarget); + } + if (changesMask[3]) + { + data << float(OuterRadius); + } + if (changesMask[4]) + { + data << float(OuterRadiusTarget); + } + if (changesMask[5]) + { + data << float(Height); + } + if (changesMask[6]) + { + data << float(HeightTarget); + } + if (changesMask[7]) + { + data << float(LocationZOffset); + } + if (changesMask[8]) + { + data << float(LocationZOffsetTarget); + } + } +} + +void AreaTriggerDisk::ClearChangesMask() +{ + Base::ClearChangesMask(InnerRadius); + Base::ClearChangesMask(InnerRadiusTarget); + Base::ClearChangesMask(OuterRadius); + Base::ClearChangesMask(OuterRadiusTarget); + Base::ClearChangesMask(Height); + Base::ClearChangesMask(HeightTarget); + Base::ClearChangesMask(LocationZOffset); + Base::ClearChangesMask(LocationZOffsetTarget); + _changesMask.ResetAll(); +} + +void AreaTriggerBoundedPlane::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const +{ + data << *Extents; + data << *ExtentsTarget; +} + +void AreaTriggerBoundedPlane::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const +{ + Mask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data << *Extents; + } + if (changesMask[2]) + { + data << *ExtentsTarget; + } + } +} + +void AreaTriggerBoundedPlane::ClearChangesMask() +{ + Base::ClearChangesMask(Extents); + Base::ClearChangesMask(ExtentsTarget); + _changesMask.ResetAll(); +} + void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { OverrideScaleCurve->WriteCreate(data, owner, receiver); @@ -7059,20 +7813,72 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << float(BoundsRadius2D); data << uint32(DecalPropertiesID); data << *CreatingEffectGUID; - data << uint32(NumUnitsInside); - data << uint32(NumPlayersInside); data << *OrbitPathTarget; data << *RollPitchYaw; data << int32(PositionalSoundKitID); + data << uint32(MovementStartTime); + data << uint32(CreationTime); + data << float(ZOffset); + data << uint32(Flags); + data << uint32(ScaleCurveId); + data << uint32(FacingCurveId); + data << uint32(MorphCurveId); + data << uint32(MoveCurveId); + data << float(Facing); + data << int32(PathType); + data << uint8(ShapeType); + if (PathType == 3) + { + PathData.Get<UF::AreaTriggerMovementScript>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 0) + { + ShapeData.Get<UF::AreaTriggerSphere>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 1) + { + ShapeData.Get<UF::AreaTriggerBox>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 3) + { + ShapeData.Get<UF::AreaTriggerPolygon>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 4) + { + ShapeData.Get<UF::AreaTriggerCylinder>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 7) + { + ShapeData.Get<UF::AreaTriggerDisk>()->WriteCreate(data, owner, receiver); + } + if (ShapeType == 8) + { + ShapeData.Get<UF::AreaTriggerBoundedPlane>()->WriteCreate(data, owner, receiver); + } ExtraScaleCurve->WriteCreate(data, owner, receiver); data.FlushBits(); - data.WriteBit(HeightIgnoresScale); - data.WriteBit(Field_261); + data.WriteBits(TargetRollPitchYaw.has_value(), 1); + data.WriteBits(ForcedPositionAndRotation.has_value(), 1); OverrideMoveCurveX->WriteCreate(data, owner, receiver); + if (TargetRollPitchYaw.has_value()) + { + data << *TargetRollPitchYaw; + } + if (ForcedPositionAndRotation.has_value()) + { + ForcedPositionAndRotation->WriteCreate(data, owner, receiver); + } OverrideMoveCurveY->WriteCreate(data, owner, receiver); OverrideMoveCurveZ->WriteCreate(data, owner, receiver); VisualAnim->WriteCreate(data, owner, receiver); - data.FlushBits(); + if (PathType == 0) + { + PathData.Get<UF::AreaTriggerSplineCalculator>()->WriteCreate(data, owner, receiver); + } + if (PathType == 1) + { + PathData.Get<UF::AreaTriggerOrbit>()->WriteCreate(data, owner, receiver); + } } void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const @@ -7082,122 +7888,232 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 26); + data << uint32(changesMask.GetBlock(0)); + data.WriteBits(changesMask.GetBlock(1), 4); + data.FlushBits(); if (changesMask[0]) { if (changesMask[1]) { - data.WriteBit(HeightIgnoresScale); + OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[2]) + if (changesMask[6]) { - data.WriteBit(Field_261); + data << *Caster; } - } - data.FlushBits(); - if (changesMask[0]) - { - if (changesMask[3]) + if (changesMask[7]) { - OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << uint32(Duration); } if (changesMask[8]) { - data << *Caster; + data << uint32(TimeToTarget); } if (changesMask[9]) { - data << uint32(Duration); + data << uint32(TimeToTargetScale); } if (changesMask[10]) { - data << uint32(TimeToTarget); + data << uint32(TimeToTargetExtraScale); } if (changesMask[11]) { - data << uint32(TimeToTargetScale); + data << uint32(TimeToTargetPos); } if (changesMask[12]) { - data << uint32(TimeToTargetExtraScale); + data << int32(SpellID); } if (changesMask[13]) { - data << uint32(TimeToTargetPos); + data << int32(SpellForVisuals); } if (changesMask[14]) { - data << int32(SpellID); + SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[15]) { - data << int32(SpellForVisuals); + data << float(BoundsRadius2D); } if (changesMask[16]) { - SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << uint32(DecalPropertiesID); } if (changesMask[17]) { - data << float(BoundsRadius2D); + data << *CreatingEffectGUID; } if (changesMask[18]) { - data << uint32(DecalPropertiesID); + data << *OrbitPathTarget; } if (changesMask[19]) { - data << *CreatingEffectGUID; + data << *RollPitchYaw; } if (changesMask[20]) { - data << uint32(NumUnitsInside); + data << int32(PositionalSoundKitID); } if (changesMask[21]) { - data << uint32(NumPlayersInside); + data << uint32(MovementStartTime); } if (changesMask[22]) { - data << *OrbitPathTarget; + data << uint32(CreationTime); } if (changesMask[23]) { - data << *RollPitchYaw; + data << float(ZOffset); } - if (changesMask[24]) + if (changesMask[25]) { - data << int32(PositionalSoundKitID); + data << uint32(Flags); } - if (changesMask[4]) + if (changesMask[27]) + { + data << uint32(ScaleCurveId); + } + if (changesMask[28]) + { + data << uint32(FacingCurveId); + } + if (changesMask[29]) + { + data << uint32(MorphCurveId); + } + if (changesMask[30]) + { + data << uint32(MoveCurveId); + } + if (changesMask[31]) + { + data << float(Facing); + } + } + if (changesMask[32]) + { + if (changesMask[34]) + { + data << int32(PathType); + } + if (changesMask[35]) + { + data << uint8(ShapeType); + } + if (changesMask[34]) + { + if (PathType == 3) + { + PathData.Get<UF::AreaTriggerMovementScript>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + if (changesMask[35]) + { + if (ShapeType == 0) + { + ShapeData.Get<UF::AreaTriggerSphere>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 1) + { + ShapeData.Get<UF::AreaTriggerBox>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 3) + { + ShapeData.Get<UF::AreaTriggerPolygon>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 4) + { + ShapeData.Get<UF::AreaTriggerCylinder>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 7) + { + ShapeData.Get<UF::AreaTriggerDisk>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 8) + { + ShapeData.Get<UF::AreaTriggerBoundedPlane>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[0]) + { + if (changesMask[2]) { ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[5]) + } + data.FlushBits(); + if (changesMask[0]) + { + data.WriteBits(TargetRollPitchYaw.has_value(), 1); + } + if (changesMask[32]) + { + data.WriteBits(ForcedPositionAndRotation.has_value(), 1); + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[3]) { OverrideMoveCurveX->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[6]) + if (changesMask[24]) + { + if (TargetRollPitchYaw.has_value()) + { + data << *TargetRollPitchYaw; + } + } + } + if (changesMask[32]) + { + if (changesMask[33]) + { + if (ForcedPositionAndRotation.has_value()) + { + ForcedPositionAndRotation->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[0]) + { + if (changesMask[4]) { OverrideMoveCurveY->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[7]) + if (changesMask[5]) { OverrideMoveCurveZ->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[25]) + if (changesMask[26]) { VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - data.FlushBits(); + if (changesMask[32]) + { + if (changesMask[34]) + { + if (PathType == 0) + { + PathData.Get<UF::AreaTriggerSplineCalculator>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (PathType == 1) + { + PathData.Get<UF::AreaTriggerOrbit>()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } } void AreaTriggerData::ClearChangesMask() { - Base::ClearChangesMask(HeightIgnoresScale); - Base::ClearChangesMask(Field_261); Base::ClearChangesMask(OverrideScaleCurve); Base::ClearChangesMask(ExtraScaleCurve); Base::ClearChangesMask(OverrideMoveCurveX); @@ -7215,12 +8131,25 @@ void AreaTriggerData::ClearChangesMask() Base::ClearChangesMask(BoundsRadius2D); Base::ClearChangesMask(DecalPropertiesID); Base::ClearChangesMask(CreatingEffectGUID); - Base::ClearChangesMask(NumUnitsInside); - Base::ClearChangesMask(NumPlayersInside); Base::ClearChangesMask(OrbitPathTarget); Base::ClearChangesMask(RollPitchYaw); Base::ClearChangesMask(PositionalSoundKitID); + Base::ClearChangesMask(MovementStartTime); + Base::ClearChangesMask(CreationTime); + Base::ClearChangesMask(ZOffset); + Base::ClearChangesMask(TargetRollPitchYaw); + Base::ClearChangesMask(Flags); Base::ClearChangesMask(VisualAnim); + Base::ClearChangesMask(ScaleCurveId); + Base::ClearChangesMask(FacingCurveId); + Base::ClearChangesMask(MorphCurveId); + Base::ClearChangesMask(MoveCurveId); + Base::ClearChangesMask(Facing); + Base::ClearChangesMask(ForcedPositionAndRotation); + Base::ClearChangesMask(PathType); + Base::ClearChangesMask(ShapeType); + Base::ClearChangesMask(PathData); + Base::ClearChangesMask(ShapeData); _changesMask.ResetAll(); } diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 6635950cc62..db0f1859545 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -227,6 +227,8 @@ struct UnitChannel : public IsUpdateFieldStructureTag { int32 SpellID; UF::SpellCastVisual SpellVisual; + uint32 StartTimeMs; + uint32 Duration; void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; @@ -258,7 +260,18 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<222> +struct UnitAssistActionData : public IsUpdateFieldStructureTag, public HasChangesMask<4> +{ + UpdateField<uint8, 0, 1> Type; + UpdateField<std::string, 0, 2> PlayerName; + UpdateField<uint32, 0, 3> VirtualRealmAddress; + + void WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<223> { UpdateField<bool, 0, 1> Field_314; UpdateField<std::vector<uint32>, 0, 2> StateWorldEffectIDs; @@ -406,19 +419,20 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<222> UpdateField<float, 128, 132> Field_31C; UpdateField<float, 128, 133> Field_320; // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount UpdateField<ObjectGuid, 128, 134> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object - UpdateFieldArray<int32, 10, 135, 136> Power; - UpdateFieldArray<int32, 10, 135, 146> MaxPower; - UpdateFieldArray<float, 10, 135, 156> PowerRegenFlatModifier; - UpdateFieldArray<float, 10, 135, 166> PowerRegenInterruptedFlatModifier; - UpdateFieldArray<UF::VisibleItem, 3, 176, 177> VirtualItems; - UpdateFieldArray<uint32, 2, 180, 181> AttackRoundBaseTime; - UpdateFieldArray<int32, 4, 183, 184> Stats; - UpdateFieldArray<int32, 4, 183, 188> StatPosBuff; - UpdateFieldArray<int32, 4, 183, 192> StatNegBuff; - UpdateFieldArray<int32, 4, 183, 196> StatSupportBuff; - UpdateFieldArray<int32, 7, 200, 201> Resistances; - UpdateFieldArray<int32, 7, 200, 208> BonusResistanceMods; - UpdateFieldArray<int32, 7, 200, 215> ManaCostModifier; + OptionalUpdateField<UF::UnitAssistActionData, 128, 135> AssistActionData; + UpdateFieldArray<int32, 10, 136, 137> Power; + UpdateFieldArray<int32, 10, 136, 147> MaxPower; + UpdateFieldArray<float, 10, 136, 157> PowerRegenFlatModifier; + UpdateFieldArray<float, 10, 136, 167> PowerRegenInterruptedFlatModifier; + UpdateFieldArray<UF::VisibleItem, 3, 177, 178> VirtualItems; + UpdateFieldArray<uint32, 2, 181, 182> AttackRoundBaseTime; + UpdateFieldArray<int32, 4, 184, 185> Stats; + UpdateFieldArray<int32, 4, 184, 189> StatPosBuff; + UpdateFieldArray<int32, 4, 184, 193> StatNegBuff; + UpdateFieldArray<int32, 4, 184, 197> StatSupportBuff; + UpdateFieldArray<int32, 7, 201, 202> Resistances; + UpdateFieldArray<int32, 7, 201, 209> BonusResistanceMods; + UpdateFieldArray<int32, 7, 201, 216> ManaCostModifier; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; @@ -499,6 +513,25 @@ struct CTROptions : public IsUpdateFieldStructureTag bool operator!=(CTROptions const& right) const { return !(*this == right); } }; +struct LeaverInfo : public IsUpdateFieldStructureTag +{ + ObjectGuid BnetAccountGUID; + float LeaveScore; + uint32 SeasonID; + uint32 TotalLeaves; + uint32 TotalSuccesses; + int32 ConsecutiveSuccesses; + int64 LastPenaltyTime; + int64 LeaverExpirationTime; + int32 Unknown_1120; + uint32 LeaverStatus; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(LeaverInfo const& right) const; + bool operator!=(LeaverInfo const& right) const { return !(*this == right); } +}; + struct DeclinedNames : public IsUpdateFieldStructureTag, public HasChangesMask<6> { UpdateFieldArray<std::string, 5, 0, 1> Name; @@ -521,7 +554,7 @@ struct CustomTabardInfo : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<322> +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<324> { UpdateField<bool, 0, 1> HasQuestSession; UpdateField<bool, 0, 2> HasLevelLink; @@ -551,29 +584,31 @@ struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<322> UpdateField<int32, 0, 26> FakeInebriation; UpdateField<uint32, 0, 27> VirtualPlayerRealm; UpdateField<uint32, 0, 28> CurrentSpecID; - UpdateField<int32, 0, 29> TaxiMountAnimKitID; - UpdateField<uint8, 0, 30> CurrentBattlePetBreedQuality; - UpdateField<int32, 0, 31> HonorLevel; - UpdateField<int64, 32, 33> LogoutTime; - UpdateField<std::string, 32, 34> Name; - UpdateField<int32, 32, 35> Field_1AC; - UpdateField<int32, 32, 36> Field_1B0; - UpdateField<int32, 32, 37> CurrentBattlePetSpeciesID; - UpdateField<UF::CTROptions, 32, 38> CtrOptions; - UpdateField<int32, 32, 39> CovenantID; - UpdateField<int32, 32, 40> SoulbindID; - UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 41> DungeonScore; - UpdateField<ObjectGuid, 32, 42> SpectateTarget; - UpdateField<int32, 32, 43> Field_200; - OptionalUpdateField<UF::DeclinedNames, 32, 44> DeclinedNames; - UpdateField<UF::CustomTabardInfo, 32, 45> PersonalTabard; - UpdateFieldArray<uint8, 2, 46, 47> PartyType; - UpdateFieldArray<UF::QuestLog, 175, 49, 50> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 225, 226> VisibleItems; - UpdateFieldArray<float, 6, 245, 246> AvgItemLevel; - UpdateFieldArray<UF::ZonePlayerForcedReaction, 32, 252, 253> ForcedReactions; - UpdateFieldArray<WorldPackets::Item::ItemInstance, 16, 285, 286> VisibleEquipableSpells; - UpdateFieldArray<uint32, 19, 302, 303> Field_3120; + UpdateField<int32, 0, 29> CurrentCombatTraitConfigSubTreeID; + UpdateField<int32, 0, 30> TaxiMountAnimKitID; + UpdateField<uint8, 0, 31> CurrentBattlePetBreedQuality; + UpdateField<int32, 32, 33> HonorLevel; + UpdateField<int64, 32, 34> LogoutTime; + UpdateField<std::string, 32, 35> Name; + UpdateField<int32, 32, 36> Field_1AC; + UpdateField<int32, 32, 37> Field_1B0; + UpdateField<int32, 32, 38> CurrentBattlePetSpeciesID; + UpdateField<UF::CTROptions, 32, 39> CtrOptions; + UpdateField<int32, 32, 40> CovenantID; + UpdateField<int32, 32, 41> SoulbindID; + UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 42> DungeonScore; + UpdateField<UF::LeaverInfo, 32, 43> LeaverInfo; + UpdateField<ObjectGuid, 32, 44> SpectateTarget; + UpdateField<int32, 32, 45> Field_200; + OptionalUpdateField<UF::DeclinedNames, 32, 46> DeclinedNames; + UpdateField<UF::CustomTabardInfo, 32, 47> PersonalTabard; + UpdateFieldArray<uint8, 2, 48, 49> PartyType; + UpdateFieldArray<UF::QuestLog, 175, 51, 52> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 227, 228> VisibleItems; + UpdateFieldArray<float, 6, 247, 248> AvgItemLevel; + UpdateFieldArray<UF::ZonePlayerForcedReaction, 32, 254, 255> ForcedReactions; + UpdateFieldArray<WorldPackets::Item::ItemInstance, 16, 287, 288> VisibleEquipableSpells; + UpdateFieldArray<uint32, 19, 304, 305> Field_3120; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -791,6 +826,7 @@ struct TraitEntry : public IsUpdateFieldStructureTag int32 TraitNodeEntryID; int32 Rank; int32 GrantedRanks; + int32 BonusRanks; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -1025,6 +1061,24 @@ struct DelveData : public IsUpdateFieldStructureTag bool operator!=(DelveData const& right) const { return !(*this == right); } }; +struct ChallengeModeData : public IsUpdateFieldStructureTag +{ + int32 Unknown_1120_1; + int32 Unknown_1120_2; + uint64 Unknown_1120_3; + int64 Unknown_1120_4; + ObjectGuid KeystoneOwnerGUID; + ObjectGuid LeaverGUID; + uint32 IsActive; + uint32 HasRestrictions; + uint32 CanVoteAbandon; + + void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; + bool operator==(ChallengeModeData const& right) const; + bool operator!=(ChallengeModeData const& right) const { return !(*this == right); } +}; + struct Research : public IsUpdateFieldStructureTag { int16 ResearchProjectID; @@ -1035,7 +1089,7 @@ struct Research : public IsUpdateFieldStructureTag bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<517> +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<385> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BackpackSellJunkDisabled; @@ -1043,9 +1097,9 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField<bool, 0, 4> SortBagsRightToLeft; UpdateField<bool, 0, 5> InsertItemsLeftToRight; UpdateField<bool, 0, 6> HasPerksProgramPendingReward; - UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 42, 43> ResearchSites; - UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 44, 45> ResearchSiteProgress; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 46, 47> Research; + UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 43, 44> ResearchSites; + UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 45, 46> ResearchSiteProgress; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 47, 48> Research; DynamicUpdateField<uint64, 0, 7> KnownTitles; DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements; DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements; @@ -1079,119 +1133,121 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField<UF::CharacterRestriction, 0, 24> CharacterRestrictions; DynamicUpdateField<UF::TraitConfig, 32, 34> TraitConfigs; DynamicUpdateField<UF::CraftingOrder, 32, 35> CraftingOrders; - DynamicUpdateField<UF::BankTabSettings, 32, 41> AccountBankTabSettings; - UpdateField<ObjectGuid, 32, 48> FarsightObject; - UpdateField<ObjectGuid, 32, 49> SummonedBattlePetGUID; - UpdateField<uint64, 32, 50> Coinage; - UpdateField<uint64, 32, 51> AccountBankCoinage; - UpdateField<int32, 32, 52> XP; - UpdateField<int32, 32, 53> NextLevelXP; - UpdateField<int32, 32, 54> TrialXP; - UpdateField<UF::SkillInfo, 32, 55> Skill; - UpdateField<int32, 32, 56> CharacterPoints; - UpdateField<int32, 32, 57> MaxTalentTiers; - UpdateField<uint32, 32, 58> TrackCreatureMask; - UpdateField<float, 32, 59> MainhandExpertise; - UpdateField<float, 32, 60> OffhandExpertise; - UpdateField<float, 32, 61> RangedExpertise; - UpdateField<float, 32, 62> CombatRatingExpertise; - UpdateField<float, 32, 63> BlockPercentage; - UpdateField<float, 32, 64> DodgePercentage; - UpdateField<float, 32, 65> DodgePercentageFromAttribute; - UpdateField<float, 32, 66> ParryPercentage; - UpdateField<float, 32, 67> ParryPercentageFromAttribute; - UpdateField<float, 32, 68> CritPercentage; - UpdateField<float, 32, 69> RangedCritPercentage; - UpdateField<float, 70, 71> OffhandCritPercentage; - UpdateField<float, 70, 72> SpellCritPercentage; - UpdateField<int32, 70, 73> ShieldBlock; - UpdateField<float, 70, 74> ShieldBlockCritPercentage; - UpdateField<float, 70, 75> Mastery; - UpdateField<float, 70, 76> Speed; - UpdateField<float, 70, 77> Avoidance; - UpdateField<float, 70, 78> Sturdiness; - UpdateField<int32, 70, 79> Versatility; - UpdateField<float, 70, 80> VersatilityBonus; - UpdateField<float, 70, 81> PvpPowerDamage; - UpdateField<float, 70, 82> PvpPowerHealing; - UpdateField<UF::BitVectors, 70, 83> BitVectors; - UpdateField<int32, 70, 84> ModHealingDonePos; - UpdateField<float, 70, 85> ModHealingPercent; - UpdateField<float, 70, 86> ModPeriodicHealingDonePercent; - UpdateField<float, 70, 87> ModSpellPowerPercent; - UpdateField<float, 70, 88> ModResiliencePercent; - UpdateField<float, 70, 89> OverrideSpellPowerByAPPercent; - UpdateField<float, 70, 90> OverrideAPBySpellPowerPercent; - UpdateField<int32, 70, 91> ModTargetResistance; - UpdateField<int32, 70, 92> ModTargetPhysicalResistance; - UpdateField<uint32, 70, 93> LocalFlags; - UpdateField<uint8, 70, 94> GrantableLevels; - UpdateField<uint8, 70, 95> MultiActionBars; - UpdateField<uint8, 70, 96> LifetimeMaxRank; - UpdateField<uint8, 70, 97> NumRespecs; - UpdateField<uint32, 70, 98> PvpMedals; - UpdateField<uint16, 70, 99> TodayHonorableKills; - UpdateField<uint16, 70, 100> YesterdayHonorableKills; - UpdateField<uint32, 70, 101> LifetimeHonorableKills; - UpdateField<int32, 102, 103> WatchedFactionIndex; - UpdateField<int32, 102, 104> MaxLevel; - UpdateField<int32, 102, 105> ScalingPlayerLevelDelta; - UpdateField<int32, 102, 106> MaxCreatureScalingLevel; - UpdateField<int32, 102, 107> PetSpellPower; - UpdateField<float, 102, 108> UiHitModifier; - UpdateField<float, 102, 109> UiSpellHitModifier; - UpdateField<int32, 102, 110> HomeRealmTimeOffset; - UpdateField<float, 102, 111> ModPetHaste; - UpdateField<int8, 102, 112> JailersTowerLevelMax; - UpdateField<int8, 102, 113> JailersTowerLevel; - UpdateField<uint8, 102, 114> LocalRegenFlags; - UpdateField<uint8, 102, 115> AuraVision; - UpdateField<uint8, 102, 116> NumBackpackSlots; - UpdateField<int32, 102, 117> OverrideSpellsID; - UpdateField<uint16, 102, 118> LootSpecID; - UpdateField<uint32, 102, 119> OverrideZonePVPType; - UpdateField<int32, 102, 120> Honor; - UpdateField<int32, 102, 121> HonorNextLevel; - UpdateField<int32, 102, 122> PerksProgramCurrency; - UpdateField<uint8, 102, 123> NumBankSlots; - UpdateField<uint8, 102, 124> NumAccountBankTabs; - UpdateField<UF::ResearchHistory, 102, 125> ResearchHistory; - UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 126> FrozenPerksVendorItem; - UpdateField<UF::ActivePlayerUnk901, 102, 128> Field_1410; - OptionalUpdateField<UF::QuestSession, 102, 127> QuestSession; - UpdateField<int32, 102, 129> UiChromieTimeExpansionID; - UpdateField<int32, 102, 130> TimerunningSeasonID; - UpdateField<int32, 102, 131> TransportServerTime; - UpdateField<uint32, 102, 132> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField<int16, 102, 133> DEBUGSoulbindConduitRank; - UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 134, 135> DungeonScore; - UpdateField<uint32, 134, 136> ActiveCombatTraitConfigID; - UpdateField<int32, 134, 137> ItemUpgradeHighOnehandWeaponItemID; - UpdateField<int32, 134, 138> ItemUpgradeHighFingerItemID; - UpdateField<float, 134, 139> ItemUpgradeHighFingerWatermark; - UpdateField<int32, 134, 140> ItemUpgradeHighTrinketItemID; - UpdateField<float, 134, 141> ItemUpgradeHighTrinketWatermark; - UpdateField<uint64, 134, 142> LootHistoryInstanceID; - OptionalUpdateField<UF::StableInfo, 134, 143> PetStable; - UpdateField<uint8, 134, 144> RequiredMountCapabilityFlags; - OptionalUpdateField<UF::WalkInData, 134, 145> WalkInData; - OptionalUpdateField<UF::DelveData, 134, 146> DelveData; - UpdateFieldArray<ObjectGuid, 232, 147, 148> InvSlots; - UpdateFieldArray<UF::RestInfo, 2, 380, 381> RestInfo; - UpdateFieldArray<int32, 7, 383, 384> ModDamageDonePos; - UpdateFieldArray<int32, 7, 383, 391> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 383, 398> ModDamageDonePercent; - UpdateFieldArray<float, 7, 383, 405> ModHealingDonePercent; - UpdateFieldArray<float, 3, 412, 413> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 412, 416> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 419, 420> BuybackPrice; - UpdateFieldArray<int64, 12, 419, 432> BuybackTimestamp; - UpdateFieldArray<int32, 32, 444, 445> CombatRatings; - UpdateFieldArray<uint32, 4, 477, 478> NoReagentCostMask; - UpdateFieldArray<int32, 2, 482, 483> ProfessionSkillLine; - UpdateFieldArray<uint32, 5, 485, 486> BagSlotFlags; - UpdateFieldArray<uint32, 7, 491, 492> BankBagSlotFlags; - UpdateFieldArray<float, 17, 499, 500> ItemUpgradeHighWatermark; + DynamicUpdateField<UF::BankTabSettings, 32, 41> CharacterBankTabSettings; + DynamicUpdateField<UF::BankTabSettings, 32, 42> AccountBankTabSettings; + UpdateField<ObjectGuid, 32, 49> FarsightObject; + UpdateField<ObjectGuid, 32, 50> SummonedBattlePetGUID; + UpdateField<uint64, 32, 51> Coinage; + UpdateField<uint64, 32, 52> AccountBankCoinage; + UpdateField<int32, 32, 53> XP; + UpdateField<int32, 32, 54> NextLevelXP; + UpdateField<int32, 32, 55> TrialXP; + UpdateField<UF::SkillInfo, 32, 56> Skill; + UpdateField<int32, 32, 57> CharacterPoints; + UpdateField<int32, 32, 58> MaxTalentTiers; + UpdateField<uint32, 32, 59> TrackCreatureMask; + UpdateField<float, 32, 60> MainhandExpertise; + UpdateField<float, 32, 61> OffhandExpertise; + UpdateField<float, 32, 62> RangedExpertise; + UpdateField<float, 32, 63> CombatRatingExpertise; + UpdateField<float, 32, 64> BlockPercentage; + UpdateField<float, 32, 65> DodgePercentage; + UpdateField<float, 32, 66> DodgePercentageFromAttribute; + UpdateField<float, 32, 67> ParryPercentage; + UpdateField<float, 32, 68> ParryPercentageFromAttribute; + UpdateField<float, 32, 69> CritPercentage; + UpdateField<float, 70, 71> RangedCritPercentage; + UpdateField<float, 70, 72> OffhandCritPercentage; + UpdateField<float, 70, 73> SpellCritPercentage; + UpdateField<int32, 70, 74> ShieldBlock; + UpdateField<float, 70, 75> ShieldBlockCritPercentage; + UpdateField<float, 70, 76> Mastery; + UpdateField<float, 70, 77> Speed; + UpdateField<float, 70, 78> Avoidance; + UpdateField<float, 70, 79> Sturdiness; + UpdateField<int32, 70, 80> Versatility; + UpdateField<float, 70, 81> VersatilityBonus; + UpdateField<float, 70, 82> PvpPowerDamage; + UpdateField<float, 70, 83> PvpPowerHealing; + UpdateField<UF::BitVectors, 70, 84> BitVectors; + UpdateField<int32, 70, 85> ModHealingDonePos; + UpdateField<float, 70, 86> ModHealingPercent; + UpdateField<float, 70, 87> ModPeriodicHealingDonePercent; + UpdateField<float, 70, 88> ModSpellPowerPercent; + UpdateField<float, 70, 89> ModResiliencePercent; + UpdateField<float, 70, 90> OverrideSpellPowerByAPPercent; + UpdateField<float, 70, 91> OverrideAPBySpellPowerPercent; + UpdateField<int32, 70, 92> ModTargetResistance; + UpdateField<int32, 70, 93> ModTargetPhysicalResistance; + UpdateField<uint32, 70, 94> LocalFlags; + UpdateField<uint8, 70, 95> GrantableLevels; + UpdateField<uint8, 70, 96> MultiActionBars; + UpdateField<uint8, 70, 97> LifetimeMaxRank; + UpdateField<uint8, 70, 98> NumRespecs; + UpdateField<uint32, 70, 99> PvpMedals; + UpdateField<uint16, 70, 100> TodayHonorableKills; + UpdateField<uint16, 70, 101> YesterdayHonorableKills; + UpdateField<uint32, 102, 103> LifetimeHonorableKills; + UpdateField<int32, 102, 104> WatchedFactionIndex; + UpdateField<int32, 102, 105> MaxLevel; + UpdateField<int32, 102, 106> ScalingPlayerLevelDelta; + UpdateField<int32, 102, 107> MaxCreatureScalingLevel; + UpdateField<int32, 102, 108> PetSpellPower; + UpdateField<float, 102, 109> UiHitModifier; + UpdateField<float, 102, 110> UiSpellHitModifier; + UpdateField<int32, 102, 111> HomeRealmTimeOffset; + UpdateField<float, 102, 112> ModPetHaste; + UpdateField<int8, 102, 113> JailersTowerLevelMax; + UpdateField<int8, 102, 114> JailersTowerLevel; + UpdateField<uint8, 102, 115> LocalRegenFlags; + UpdateField<uint8, 102, 116> AuraVision; + UpdateField<uint8, 102, 117> NumBackpackSlots; + UpdateField<int32, 102, 118> OverrideSpellsID; + UpdateField<uint16, 102, 119> LootSpecID; + UpdateField<uint32, 102, 120> OverrideZonePVPType; + UpdateField<int32, 102, 121> Honor; + UpdateField<int32, 102, 122> HonorNextLevel; + UpdateField<int32, 102, 123> PerksProgramCurrency; + UpdateField<uint8, 102, 124> NumBankSlots; + UpdateField<uint8, 102, 125> NumCharacterBankTabs; + UpdateField<uint8, 102, 126> NumAccountBankTabs; + UpdateField<UF::ResearchHistory, 102, 127> ResearchHistory; + UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 128> FrozenPerksVendorItem; + UpdateField<UF::ActivePlayerUnk901, 102, 130> Field_1410; + OptionalUpdateField<UF::QuestSession, 102, 129> QuestSession; + UpdateField<int32, 102, 131> UiChromieTimeExpansionID; + UpdateField<int32, 102, 132> TimerunningSeasonID; + UpdateField<int32, 102, 133> TransportServerTime; + UpdateField<uint32, 134, 135> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin + UpdateField<int16, 134, 136> DEBUGSoulbindConduitRank; + UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 134, 137> DungeonScore; + UpdateField<uint32, 134, 138> ActiveCombatTraitConfigID; + UpdateField<int32, 134, 139> ItemUpgradeHighOnehandWeaponItemID; + UpdateField<int32, 134, 140> ItemUpgradeHighFingerItemID; + UpdateField<float, 134, 141> ItemUpgradeHighFingerWatermark; + UpdateField<int32, 134, 142> ItemUpgradeHighTrinketItemID; + UpdateField<float, 134, 143> ItemUpgradeHighTrinketWatermark; + UpdateField<uint64, 134, 144> LootHistoryInstanceID; + OptionalUpdateField<UF::StableInfo, 134, 145> PetStable; + UpdateField<uint8, 134, 146> RequiredMountCapabilityFlags; + OptionalUpdateField<UF::WalkInData, 134, 147> WalkInData; + OptionalUpdateField<UF::DelveData, 134, 148> DelveData; + OptionalUpdateField<UF::ChallengeModeData, 134, 149> ChallengeModeData; + UpdateFieldArray<ObjectGuid, 105, 150, 151> InvSlots; + UpdateFieldArray<UF::RestInfo, 2, 256, 257> RestInfo; + UpdateFieldArray<int32, 7, 259, 260> ModDamageDonePos; + UpdateFieldArray<int32, 7, 259, 267> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 259, 274> ModDamageDonePercent; + UpdateFieldArray<float, 7, 259, 281> ModHealingDonePercent; + UpdateFieldArray<float, 3, 288, 289> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 288, 292> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 295, 296> BuybackPrice; + UpdateFieldArray<int64, 12, 295, 308> BuybackTimestamp; + UpdateFieldArray<int32, 32, 320, 321> CombatRatings; + UpdateFieldArray<uint32, 4, 353, 354> NoReagentCostMask; + UpdateFieldArray<int32, 2, 358, 359> ProfessionSkillLine; + UpdateFieldArray<uint32, 5, 361, 362> BagSlotFlags; + UpdateFieldArray<float, 17, 367, 368> ItemUpgradeHighWatermark; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const; @@ -1199,7 +1255,22 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas void ClearChangesMask(); }; -struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<25> +struct GameObjectAssistActionData : public IsUpdateFieldStructureTag +{ + std::string PlayerName; + std::string MonsterName; + uint32 VirtualRealmAddress; + uint8 Sex; + int64 Time; + int32 DelveTier; + + void WriteCreate(ByteBuffer& data, GameObject const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, GameObject const* owner, Player const* receiver) const; + bool operator==(GameObjectAssistActionData const& right) const; + bool operator!=(GameObjectAssistActionData const& right) const { return !(*this == right); } +}; + +struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<26> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; struct StateWorldEffectIDsTag : ViewerDependentValueTag<std::vector<uint32>> {}; @@ -1232,6 +1303,7 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask< UpdateField<uint32, 0, 22> UiWidgetItemID; UpdateField<uint32, 0, 23> UiWidgetItemQuality; UpdateField<uint32, 0, 24> UiWidgetItemUnknown1000; + OptionalUpdateField<UF::GameObjectAssistActionData, 0, 25> AssistActionData; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const; @@ -1300,33 +1372,163 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5> void ClearChangesMask(); }; -struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<26> -{ - UpdateField<bool, 0, 1> HeightIgnoresScale; - UpdateField<bool, 0, 2> Field_261; - UpdateField<UF::ScaleCurve, 0, 3> OverrideScaleCurve; - UpdateField<UF::ScaleCurve, 0, 4> ExtraScaleCurve; - UpdateField<UF::ScaleCurve, 0, 5> OverrideMoveCurveX; - UpdateField<UF::ScaleCurve, 0, 6> OverrideMoveCurveY; - UpdateField<UF::ScaleCurve, 0, 7> OverrideMoveCurveZ; - UpdateField<ObjectGuid, 0, 8> Caster; - UpdateField<uint32, 0, 9> Duration; - UpdateField<uint32, 0, 10> TimeToTarget; - UpdateField<uint32, 0, 11> TimeToTargetScale; - UpdateField<uint32, 0, 12> TimeToTargetExtraScale; - UpdateField<uint32, 0, 13> TimeToTargetPos; // Linked to m_overrideMoveCurve - UpdateField<int32, 0, 14> SpellID; - UpdateField<int32, 0, 15> SpellForVisuals; - UpdateField<UF::SpellCastVisual, 0, 16> SpellVisual; - UpdateField<float, 0, 17> BoundsRadius2D; - UpdateField<uint32, 0, 18> DecalPropertiesID; - UpdateField<ObjectGuid, 0, 19> CreatingEffectGUID; - UpdateField<uint32, 0, 20> NumUnitsInside; - UpdateField<uint32, 0, 21> NumPlayersInside; // When not 0 this causes SpellVisualEvent 14 to trigger, playing alternate visuals, typically used by "SOAK THIS" areatriggers - UpdateField<ObjectGuid, 0, 22> OrbitPathTarget; - UpdateField<TaggedPosition<Position::XYZ>, 0, 23> RollPitchYaw; - UpdateField<int32, 0, 24> PositionalSoundKitID; - UpdateField<UF::VisualAnim, 0, 25> VisualAnim; +struct ForceSetAreaTriggerPositionAndRotation : public IsUpdateFieldStructureTag +{ + ObjectGuid TriggerGUID; + TaggedPosition<::Position::XYZ> Position; + QuaternionData Rotation; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + bool operator==(ForceSetAreaTriggerPositionAndRotation const& right) const; + bool operator!=(ForceSetAreaTriggerPositionAndRotation const& right) const { return !(*this == right); } +}; + +struct AreaTriggerSplineCalculator : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<bool, 0, 1> Catmullrom; + DynamicUpdateField<TaggedPosition<Position::XYZ>, 0, 2> Points; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerOrbit : public IsUpdateFieldStructureTag, public HasChangesMask<7> +{ + UpdateField<bool, 0, 1> CounterClockwise; + UpdateField<TaggedPosition<Position::XYZ>, 0, 2> Center; + UpdateField<float, 0, 3> Radius; + UpdateField<float, 0, 4> InitialAngle; + UpdateField<float, 0, 5> BlendFromRadius; + UpdateField<int32, 0, 6> ExtraTimeForBlending; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerMovementScript : public IsUpdateFieldStructureTag, public HasChangesMask<4> +{ + UpdateField<int32, 0, 1> SpellScriptID; + UpdateField<TaggedPosition<Position::XYZ>, 0, 2> Center; + UpdateField<uint32, 0, 3> CreationTime; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerSphere : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<float, 0, 1> Radius; + UpdateField<float, 0, 2> RadiusTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerBox : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<TaggedPosition<Position::XYZ>, 0, 1> Extents; + UpdateField<TaggedPosition<Position::XYZ>, 0, 2> ExtentsTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerPolygon : public IsUpdateFieldStructureTag, public HasChangesMask<5> +{ + DynamicUpdateField<TaggedPosition<Position::XY>, 0, 1> Vertices; + DynamicUpdateField<TaggedPosition<Position::XY>, 0, 2> VerticesTarget; + UpdateField<float, 0, 3> Height; + UpdateField<float, 0, 4> HeightTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerCylinder : public IsUpdateFieldStructureTag, public HasChangesMask<7> +{ + UpdateField<float, 0, 1> Radius; + UpdateField<float, 0, 2> RadiusTarget; + UpdateField<float, 0, 3> Height; + UpdateField<float, 0, 4> HeightTarget; + UpdateField<float, 0, 5> LocationZOffset; + UpdateField<float, 0, 6> LocationZOffsetTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerDisk : public IsUpdateFieldStructureTag, public HasChangesMask<9> +{ + UpdateField<float, 0, 1> InnerRadius; + UpdateField<float, 0, 2> InnerRadiusTarget; + UpdateField<float, 0, 3> OuterRadius; + UpdateField<float, 0, 4> OuterRadiusTarget; + UpdateField<float, 0, 5> Height; + UpdateField<float, 0, 6> HeightTarget; + UpdateField<float, 0, 7> LocationZOffset; + UpdateField<float, 0, 8> LocationZOffsetTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerBoundedPlane : public IsUpdateFieldStructureTag, public HasChangesMask<3> +{ + UpdateField<TaggedPosition<Position::XY>, 0, 1> Extents; + UpdateField<TaggedPosition<Position::XY>, 0, 2> ExtentsTarget; + + void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const; + void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); +}; + +struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<36> +{ + UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve; + UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve; + UpdateField<UF::ScaleCurve, 0, 3> OverrideMoveCurveX; + UpdateField<UF::ScaleCurve, 0, 4> OverrideMoveCurveY; + UpdateField<UF::ScaleCurve, 0, 5> OverrideMoveCurveZ; + UpdateField<ObjectGuid, 0, 6> Caster; + UpdateField<uint32, 0, 7> Duration; + UpdateField<uint32, 0, 8> TimeToTarget; + UpdateField<uint32, 0, 9> TimeToTargetScale; + UpdateField<uint32, 0, 10> TimeToTargetExtraScale; + UpdateField<uint32, 0, 11> TimeToTargetPos; // Linked to m_overrideMoveCurve + UpdateField<int32, 0, 12> SpellID; + UpdateField<int32, 0, 13> SpellForVisuals; + UpdateField<UF::SpellCastVisual, 0, 14> SpellVisual; + UpdateField<float, 0, 15> BoundsRadius2D; + UpdateField<uint32, 0, 16> DecalPropertiesID; + UpdateField<ObjectGuid, 0, 17> CreatingEffectGUID; + UpdateField<ObjectGuid, 0, 18> OrbitPathTarget; + UpdateField<TaggedPosition<Position::XYZ>, 0, 19> RollPitchYaw; + UpdateField<int32, 0, 20> PositionalSoundKitID; + UpdateField<uint32, 0, 21> MovementStartTime; + UpdateField<uint32, 0, 22> CreationTime; + UpdateField<float, 0, 23> ZOffset; + OptionalUpdateField<TaggedPosition<Position::XYZ>, 0, 24> TargetRollPitchYaw; + UpdateField<uint32, 0, 25> Flags; + UpdateField<UF::VisualAnim, 0, 26> VisualAnim; + UpdateField<uint32, 0, 27> ScaleCurveId; + UpdateField<uint32, 0, 28> FacingCurveId; + UpdateField<uint32, 0, 29> MorphCurveId; + UpdateField<uint32, 0, 30> MoveCurveId; + UpdateField<float, 0, 31> Facing; + OptionalUpdateField<UF::ForceSetAreaTriggerPositionAndRotation, 32, 33> ForcedPositionAndRotation; + UpdateField<int32, 32, 34> PathType; + UpdateField<uint8, 32, 35> ShapeType; + VariantUpdateField<32, 34, UF::AreaTriggerSplineCalculator, UF::AreaTriggerOrbit, UF::AreaTriggerMovementScript> PathData; + VariantUpdateField<32, 35, UF::AreaTriggerSphere, UF::AreaTriggerBox, UF::AreaTriggerPolygon, UF::AreaTriggerCylinder, UF::AreaTriggerDisk, UF::AreaTriggerBoundedPlane> ShapeData; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3ac1815f4f6..1d28e4f8aac 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -337,8 +337,6 @@ Player::Player(WorldSession* session) : Unit(true), m_sceneMgr(this) healthBeforeDuel = 0; manaBeforeDuel = 0; - memset(_voidStorageItems, 0, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*)); - _cinematicMgr = std::make_unique<CinematicMgr>(this); m_achievementMgr = std::make_unique<PlayerAchievementMgr>(this); @@ -374,9 +372,6 @@ Player::~Player() for (ItemSetEffect* itemSetEff : ItemSetEff) DeleteItemSetEffects(itemSetEff); - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - delete _voidStorageItems[i]; - sWorld->DecreasePlayerCount(); } @@ -3719,21 +3714,9 @@ void Player::DestroyForPlayer(Player* target) const if (target == this) { - for (uint8 i = EQUIPMENT_SLOT_START; i < BANK_SLOT_BAG_END; ++i) - { - if (m_items[i] == nullptr) - continue; - - m_items[i]->DestroyForPlayer(target); - } - - for (uint8 i = REAGENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) - { - if (m_items[i] == nullptr) - continue; - - m_items[i]->DestroyForPlayer(target); - } + for (Item* item : m_items) + if (item) + item->DestroyForPlayer(target); } } @@ -4195,10 +4178,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID); - stmt->setUInt64(0, guid); - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_FISHINGSTEPS); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4233,6 +4212,18 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID); + stmt->setUInt64(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID); + stmt->setUInt64(0, guid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, guid); + trans->Append(stmt); + sCharacterCache->DeleteCharacterCacheEntry(playerguid, name); break; } @@ -9488,10 +9479,6 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location / if (location.HasFlag(ItemSearchLocation::Bank)) { - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) - if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - ++freeSlotCount; - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) if (Bag* bag = GetBagByPos(i)) for (uint32 j = 0; j < GetBagSize(bag); ++j) @@ -9506,10 +9493,6 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location / for (uint32 j = 0; j < GetBagSize(bag); ++j) if (!GetItemInBag(bag, j)) ++freeSlotCount; - - for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) - if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - ++freeSlotCount; } return freeSlotCount; @@ -9759,21 +9742,10 @@ bool Player::IsEquipmentPos(uint8 bag, uint8 slot) bool Player::IsBankPos(uint8 bag, uint8 slot) { - if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)) - return true; if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)) return true; if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END) return true; - if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END)) - return true; - return false; -} - -bool Player::IsReagentBankPos(uint8 bag, uint8 slot) -{ - if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END)) - return true; return false; } @@ -9795,6 +9767,13 @@ bool Player::IsChildEquipmentPos(uint8 bag, uint8 slot) return bag == INVENTORY_SLOT_BAG_0 && (slot >= CHILD_EQUIPMENT_SLOT_START && slot < CHILD_EQUIPMENT_SLOT_END); } +bool Player::IsAccountBankPos(uint8 bag, uint8 /*slot*/) +{ + if (bag >= ACCOUNT_BANK_SLOT_BAG_START && bag < ACCOUNT_BANK_SLOT_BAG_END) + return true; + return false; +} + bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const { // post selected @@ -9827,18 +9806,10 @@ bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const if (slot >= INVENTORY_SLOT_ITEM_START && slot < INVENTORY_SLOT_ITEM_START + GetInventorySlotCount()) return true; - // bank main slots - if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END) - return true; - // bank bag slots if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END) return true; - // reagent bank bag slots - if (slot >= REAGENT_SLOT_START && slot < REAGENT_SLOT_END) - return true; - return false; } @@ -10126,10 +10097,6 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP // prevent cheating if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END) return EQUIP_ERR_WRONG_BAG_TYPE; - - // can't store anything else than crafting reagents in Reagent Bank - if (IsReagentBankPos(bag, slot) && (!IsReagentBankUnlocked() || !pProto->IsCraftingReagent())) - return EQUIP_ERR_WRONG_BAG_TYPE; } else { @@ -11072,12 +11039,6 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest ASSERT(bag == NULL_BAG && slot == NULL_SLOT); // when reagentBankOnly is true then bag & slot must be hardcoded constants, not client input } - if ((IsReagentBankPos(bag, slot) || reagentBankOnly) && !IsReagentBankUnlocked()) - return EQUIP_ERR_REAGENT_BANK_LOCKED; - - uint8 slotStart = reagentBankOnly ? uint8(REAGENT_SLOT_START) : uint8(BANK_SLOT_ITEM_START); - uint8 slotEnd = reagentBankOnly ? uint8(REAGENT_SLOT_END) : uint8(BANK_SLOT_ITEM_END); - uint32 count = pItem->GetCount(); TC_LOG_DEBUG("entities.player.items", "Player::CanBankItem: Player '{}' ({}), Bag: {}, Slot: {}, Item: {}, Count: {}", @@ -11114,7 +11075,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest if (!pItem->IsBag()) return EQUIP_ERR_WRONG_SLOT; - if (slot - BANK_SLOT_BAG_START >= GetBankBagSlotCount()) + if (slot - BANK_SLOT_BAG_START >= GetCharacterBankTabCount()) return EQUIP_ERR_NO_BANK_SLOT; res = CanUseItem(pItem, not_loading); @@ -11143,12 +11104,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest { if (bag == INVENTORY_SLOT_BAG_0) { - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; + return EQUIP_ERR_WRONG_SLOT; // TODO: check if INVENTORY_SLOT_BAG_0 condition is neccessary } else { @@ -11167,12 +11123,7 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest // search free slot in bag if (bag == INVENTORY_SLOT_BAG_0) { - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, false, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; + return EQUIP_ERR_WRONG_SLOT; // TODO: check if INVENTORY_SLOT_BAG_0 condition is neccessary } else { @@ -11193,50 +11144,14 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest // search stack for merge to if (pProto->GetMaxStackSize() != 1) { - // in slots - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; - - // don't try to store reagents anywhere else than in Reagent Bank if we're on it - if (!reagentBankOnly) - { - // in special bags - if (pProto->GetBagFamily()) - { - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - continue; - - if (count == 0) - return EQUIP_ERR_OK; - } - } - - // in regular bags - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - continue; - - if (count == 0) - return EQUIP_ERR_OK; - } - } - } - - // search free space in special bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it) - if (!reagentBankOnly && pProto->GetBagFamily()) - { + // in regular bags for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { - res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot); + // only consider tabs marked as reagents if requested + if (reagentBankOnly && !(*m_activePlayerData->CharacterBankTabSettings[i - BANK_SLOT_BAG_START].DepositFlags & AsUnderlyingType(BagSlotFlags::PriorityReagents))) + continue; + + res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot); if (res != EQUIP_ERR_OK) continue; @@ -11245,26 +11160,19 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest } } - // search free space - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, count, false, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - return res; - - if (count == 0) - return EQUIP_ERR_OK; - - // search free space in regular bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it) - if (!reagentBankOnly) + // search free space in regular bags + for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot); - if (res != EQUIP_ERR_OK) - continue; + // only consider tabs marked as reagents if requested + if (reagentBankOnly && !(*m_activePlayerData->CharacterBankTabSettings[i - BANK_SLOT_BAG_START].DepositFlags & AsUnderlyingType(BagSlotFlags::PriorityReagents))) + continue; - if (count == 0) - return EQUIP_ERR_OK; - } + res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot); + if (res != EQUIP_ERR_OK) + continue; + + if (count == 0) + return EQUIP_ERR_OK; } return reagentBankOnly ? EQUIP_ERR_REAGENT_BANK_FULL : EQUIP_ERR_BANK_FULL; @@ -12272,33 +12180,6 @@ uint32 Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, boo } } - // in bank - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; i++) - { - if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - { - if (item->GetEntry() == itemEntry && !item->IsInTrade()) - { - if (item->GetCount() + remcount <= count) - { - remcount += item->GetCount(); - DestroyItem(INVENTORY_SLOT_BAG_0, i, update); - if (remcount >= count) - return remcount; - } - else - { - item->SetCount(item->GetCount() - count + remcount); - ItemRemovedQuestCheck(item->GetEntry(), count - remcount); - if (IsInWorld() && update) - item->SendUpdateToPlayer(this); - item->SetState(ITEM_CHANGED, this); - return count; - } - } - } - } - // in bank bags for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { @@ -12364,34 +12245,6 @@ uint32 Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, boo } } - for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) - { - if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - { - if (item->GetEntry() == itemEntry && !item->IsInTrade()) - { - if (item->GetCount() + remcount <= count) - { - // all keys can be unequipped - remcount += item->GetCount(); - DestroyItem(INVENTORY_SLOT_BAG_0, i, update); - - if (remcount >= count) - return remcount; - } - else - { - item->SetCount(item->GetCount() - count + remcount); - ItemRemovedQuestCheck(item->GetEntry(), count - remcount); - if (IsInWorld() && update) - item->SendUpdateToPlayer(this); - item->SetState(ITEM_CHANGED, this); - return count; - } - } - } - } - for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i) { if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) @@ -12746,12 +12599,6 @@ void Player::SwapItem(uint16 src, uint16 dst) } } - if (IsReagentBankPos(dst) && !IsReagentBankUnlocked()) - { - SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED, pSrcItem, pDstItem); - return; - } - // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions) // or swap empty bag with another empty or not empty bag (with items exchange) @@ -12785,8 +12632,7 @@ void Player::SwapItem(uint16 src, uint16 dst) RemoveItem(srcbag, srcslot, true); BankItem(dest, pSrcItem, true); - if (!IsReagentBankPos(dst)) - ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount()); + ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount()); } else if (IsEquipmentPos(dst)) { @@ -17819,7 +17665,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol struct PlayerLoadData { // "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " - // "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " + // "bankSlots, bankTabs, bankBagFlags, restState, playerFlags, playerFlagsEx, " // "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " // "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " // "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " @@ -17841,8 +17687,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol EnumFlag<BagSlotFlags> inventoryBagFlags = BagSlotFlags::None; std::array<BagSlotFlags, 5> bagSlotFlags; uint8 bankSlots; + uint8 bankTabs; EnumFlag<BagSlotFlags> bankBagFlags = BagSlotFlags::None; - std::array<BagSlotFlags, 7> bankBagSlotFlags; PlayerRestState restState; PlayerFlags playerFlags; PlayerFlagsEx playerFlagsEx; @@ -17921,9 +17767,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol for (BagSlotFlags& flags : bagSlotFlags) flags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); bankSlots = fields[i++].GetUInt8(); + bankTabs = fields[i++].GetUInt8(); bankBagFlags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); - for (BagSlotFlags& flags : bankBagSlotFlags) - flags = static_cast<BagSlotFlags>(fields[i++].GetUInt32()); restState = PlayerRestState(fields[i++].GetUInt8()); playerFlags = PlayerFlags(fields[i++].GetUInt32()); playerFlagsEx = PlayerFlagsEx(fields[i++].GetUInt32()); @@ -18083,9 +17928,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol for (uint32 bagIndex = 0; bagIndex < fields.bagSlotFlags.size(); ++bagIndex) ReplaceAllBagSlotFlags(bagIndex, fields.bagSlotFlags[bagIndex]); SetBankBagSlotCount(fields.bankSlots); + SetCharacterBankTabCount(fields.bankTabs); SetBankAutoSortDisabled(fields.bankBagFlags.HasFlag(BagSlotFlags::DisableAutoSort)); - for (uint32 bagIndex = 0; bagIndex < fields.bankBagSlotFlags.size(); ++bagIndex) - ReplaceAllBankBagSlotFlags(bagIndex, fields.bankBagSlotFlags[bagIndex]); SetNativeGender(fields.gender); SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::Inebriation), fields.drunk); ReplaceAllPlayerFlags(fields.playerFlags); @@ -18520,6 +18364,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol // must be before inventory (some items required reputation check) m_reputationMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_REPUTATION)); + _LoadCharacterBankTabSettings(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANK_TAB_SETTINGS)); + _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ARTIFACTS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE), @@ -18528,9 +18374,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED), time_diff); - if (IsVoidStorageUnlocked()) - _LoadVoidStorage(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE)); - // update items with duration and realtime UpdateItemDuration(time_diff, true); @@ -19195,63 +19038,6 @@ void Player::_LoadInventory(PreparedQueryResult result, PreparedQueryResult arti ApplyAllAzeriteItemMods(true); } -void Player::_LoadVoidStorage(PreparedQueryResult result) -{ - if (!result) - return; - - do - { - // SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? - Field* fields = result->Fetch(); - - uint64 itemId = fields[0].GetUInt64(); - uint32 itemEntry = fields[1].GetUInt32(); - uint8 slot = fields[2].GetUInt8(); - ObjectGuid creatorGuid = fields[3].GetUInt64() ? ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()) : ObjectGuid::Empty; - ItemRandomBonusListId randomBonusListId = fields[4].GetUInt32(); - uint32 fixedScalingLevel = fields[5].GetUInt32(); - uint32 artifactKnowledgeLevel = fields[6].GetUInt32(); - ItemContext context = ItemContext(fields[7].GetUInt8()); - std::vector<int32> bonusListIDs; - for (std::string_view bonusListIDtoken : Trinity::Tokenize(fields[8].GetStringView(), ' ', false)) - if (Optional<int32> bonusListID = Trinity::StringTo<int32>(bonusListIDtoken)) - bonusListIDs.push_back(*bonusListID); - - if (!itemId) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '{}' ({}) has an item with an invalid id (item id: {}, entry: {}).", - GetName(), GetGUID().ToString(), itemId, itemEntry); - continue; - } - - if (!sObjectMgr->GetItemTemplate(itemEntry)) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '{}' ({}) has an item with an invalid entry (item id: {}, entry: {}).", - GetName(), GetGUID().ToString(), itemId, itemEntry); - continue; - } - - if (slot >= VOID_STORAGE_MAX_SLOT) - { - TC_LOG_ERROR("entities.player", "Player::_LoadVoidStorage: Player '{}' ({}) has an item with an invalid slot (item id: {}, entry: {}, slot: {}).", - GetName(), GetGUID().ToString(), itemId, itemEntry, slot); - continue; - } - - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, - context, bonusListIDs); - - WorldPackets::Item::ItemInstance voidInstance; - voidInstance.Initialize(_voidStorageItems[slot]); - BonusData bonus; - bonus.Initialize(voidInstance); - - GetSession()->GetCollectionMgr()->AddItemAppearance(itemEntry, bonus.AppearanceModID); - } - while (result->NextRow()); -} - Item* Player::_LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field* fields) { Item* item = nullptr; @@ -20300,6 +20086,27 @@ void Player::_LoadPlayerData(PreparedQueryResult elementsResult, PreparedQueryRe } } +void Player::_LoadCharacterBankTabSettings(PreparedQueryResult result) +{ + if (result) + { + do + { + DEFINE_FIELD_ACCESSOR_CACHE_ANONYMOUS(PreparedResultSet, (tabId)(name)(icon)(description)(depositFlags)) fields { *result }; + + if (fields.tabId().GetUInt8() >= (BANK_SLOT_BAG_END - BANK_SLOT_BAG_START)) + continue; + + SetCharacterBankTabSettings(fields.tabId().GetUInt8(), fields.name().GetString(), fields.icon().GetString(), + fields.description().GetString(), static_cast<BagSlotFlags>(fields.depositFlags().GetUInt32())); + + } while (result->NextRow()); + } + + while (m_activePlayerData->CharacterBankTabSettings.size() < *m_activePlayerData->NumCharacterBankTabs) + AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterBankTabSettings)); +} + /*********************************************************/ /*** SAVE SYSTEM ***/ /*********************************************************/ @@ -20372,6 +20179,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba for (uint32 bagSlotFlag : m_activePlayerData->BagSlotFlags) stmt->setUInt32(index++, bagSlotFlag); stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt8(index++, GetCharacterBankTabCount()); stmt->setUInt32(index++, [&] { BagSlotFlags inventoryFlags = BagSlotFlags::None; @@ -20379,8 +20187,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba inventoryFlags |= BagSlotFlags::DisableAutoSort; return AsUnderlyingType(inventoryFlags); }()); - for (uint32 bankBagSlotFlag : m_activePlayerData->BankBagSlotFlags) - stmt->setUInt32(index++, bankBagSlotFlag); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); stmt->setUInt32(index++, m_playerData->PlayerFlags); stmt->setUInt32(index++, m_playerData->PlayerFlagsEx); @@ -20512,6 +20318,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba for (uint32 bagSlotFlag : m_activePlayerData->BagSlotFlags) stmt->setUInt32(index++, bagSlotFlag); stmt->setUInt8(index++, GetBankBagSlotCount()); + stmt->setUInt8(index++, GetCharacterBankTabCount()); stmt->setUInt32(index++, [&] { BagSlotFlags inventoryFlags = BagSlotFlags::None; @@ -20519,8 +20326,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba inventoryFlags |= BagSlotFlags::DisableAutoSort; return AsUnderlyingType(inventoryFlags); }()); - for (uint32 bankBagSlotFlag : m_activePlayerData->BankBagSlotFlags) - stmt->setUInt32(index++, bankBagSlotFlag); stmt->setUInt8(index++, m_activePlayerData->RestInfo[REST_TYPE_XP].StateID); stmt->setUInt32(index++, m_playerData->PlayerFlags); stmt->setUInt32(index++, m_playerData->PlayerFlagsEx); @@ -20675,7 +20480,6 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba _SaveCustomizations(trans); _SaveBGData(trans); _SaveInventory(trans); - _SaveVoidStorage(trans); _SaveQuestStatus(trans); _SaveDailyQuestStatus(trans); _SaveWeeklyQuestStatus(trans); @@ -20699,6 +20503,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba _SaveCurrency(trans); _SaveCUFProfiles(trans); _SavePlayerData(trans); + _SaveCharacterBankTabSettings(trans); if (_garrison) _garrison->SaveToDB(trans); @@ -21044,42 +20849,6 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans) m_itemUpdateQueue.clear(); } -void Player::_SaveVoidStorage(CharacterDatabaseTransaction trans) -{ - CharacterDatabasePreparedStatement* stmt = nullptr; - - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - { - if (!_voidStorageItems[i]) // unused item - { - // DELETE FROM void_storage WHERE slot = ? AND playerGuid = ? - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT); - stmt->setUInt8(0, i); - stmt->setUInt64(1, GetGUID().GetCounter()); - } - else - { - // REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_VOID_STORAGE_ITEM); - stmt->setUInt64(0, _voidStorageItems[i]->ItemId); - stmt->setUInt64(1, GetGUID().GetCounter()); - stmt->setUInt32(2, _voidStorageItems[i]->ItemEntry); - stmt->setUInt8(3, i); - stmt->setUInt64(4, _voidStorageItems[i]->CreatorGuid.GetCounter()); - stmt->setUInt32(5, _voidStorageItems[i]->RandomBonusListId); - stmt->setUInt32(6, _voidStorageItems[i]->FixedScalingLevel); - stmt->setUInt32(7, _voidStorageItems[i]->ArtifactKnowledgeLevel); - stmt->setUInt8(8, AsUnderlyingType(_voidStorageItems[i]->Context)); - std::ostringstream bonusListIDs; - for (int32 bonusListID : _voidStorageItems[i]->BonusListIDs) - bonusListIDs << bonusListID << ' '; - stmt->setString(9, bonusListIDs.str()); - } - - trans->Append(stmt); - } -} - void Player::_SaveCUFProfiles(CharacterDatabaseTransaction trans) { CharacterDatabasePreparedStatement* stmt; @@ -21666,6 +21435,26 @@ void Player::_SavePlayerData(CharacterDatabaseTransaction trans) _playerDataFlagsNeedSave.clear(); } +void Player::_SaveCharacterBankTabSettings(CharacterDatabaseTransaction trans) const +{ + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, GetGUID().GetCounter()); + trans->Append(stmt); + + for (std::size_t i = 0; i < m_activePlayerData->CharacterBankTabSettings.size(); ++i) + { + UF::BankTabSettings const& tabSetting = m_activePlayerData->CharacterBankTabSettings[i]; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, GetGUID().GetCounter()); + stmt->setUInt8(1, i); + stmt->setString(2, *tabSetting.Name); + stmt->setString(3, *tabSetting.Icon); + stmt->setString(4, *tabSetting.Description); + stmt->setInt32(5, *tabSetting.DepositFlags); + trans->Append(stmt); + } +} + void Player::outDebugValues() const { if (!sLog->ShouldLog("entities.unit", LOG_LEVEL_DEBUG)) @@ -28387,7 +28176,13 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult }); if (activeConfig >= 0) - SetActiveCombatTraitConfigID(m_activePlayerData->TraitConfigs[activeConfig].ID); + { + UF::TraitConfig const& activeTraitConfig = m_activePlayerData->TraitConfigs[activeConfig]; + SetActiveCombatTraitConfigID(activeTraitConfig.ID); + int32 activeSubTree = activeTraitConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); + } for (UF::TraitConfig const& traitConfig : m_activePlayerData->TraitConfigs) { @@ -28657,9 +28452,20 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec) && (static_cast<TraitCombatConfigFlags>(*traitConfig.CombatConfigFlags) & TraitCombatConfigFlags::ActiveForSpec) != TraitCombatConfigFlags::None; }); if (specTraitConfigIndex >= 0) - SetActiveCombatTraitConfigID(m_activePlayerData->TraitConfigs[specTraitConfigIndex].ID); + { + UF::TraitConfig const& activeTraitConfig = m_activePlayerData->TraitConfigs[specTraitConfigIndex]; + SetActiveCombatTraitConfigID(activeTraitConfig.ID); + int32 activeSubTree = activeTraitConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); + else + SetCurrentCombatTraitConfigSubTreeID(0); + } else + { SetActiveCombatTraitConfigID(0); + SetCurrentCombatTraitConfigSubTreeID(0); + } for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { @@ -29097,6 +28903,17 @@ void Player::ApplyTraitEntryChanges(int32 editedConfigId, WorldPackets::Traits:: } } + if (applyTraits) + { + int32 activeSubTree = editedConfig.SubTrees.FindIndexIf([](UF::TraitSubTreeCache const& subTree) { return subTree.Active != 0; }); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(editedConfig.SubTrees[activeSubTree].TraitSubTreeID); + else + SetCurrentCombatTraitConfigSubTreeID(0); + + UpdateItemSetAuras(this, false); + } + m_traitConfigStates[editedConfigId] = PLAYERSPELL_CHANGED; } @@ -29856,86 +29673,6 @@ bool Player::IsInWhisperWhiteList(ObjectGuid guid) return false; } -uint8 Player::GetNextVoidStorageFreeSlot() const -{ - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - if (!_voidStorageItems[i]) // unused item - return i; - - return VOID_STORAGE_MAX_SLOT; -} - -uint8 Player::GetNumOfVoidStorageFreeSlots() const -{ - uint8 count = 0; - - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - if (!_voidStorageItems[i]) - count++; - - return count; -} - -uint8 Player::AddVoidStorageItem(VoidStorageItem&& item) -{ - uint8 slot = GetNextVoidStorageFreeSlot(); - - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); - return 255; - } - - _voidStorageItems[slot] = new VoidStorageItem(std::move(item)); - return slot; -} - -void Player::DeleteVoidStorageItem(uint8 slot) -{ - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return; - } - - delete _voidStorageItems[slot]; - _voidStorageItems[slot] = nullptr; -} - -bool Player::SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot) -{ - if (oldSlot >= VOID_STORAGE_MAX_SLOT || newSlot >= VOID_STORAGE_MAX_SLOT || oldSlot == newSlot) - return false; - - std::swap(_voidStorageItems[newSlot], _voidStorageItems[oldSlot]); - return true; -} - -VoidStorageItem* Player::GetVoidStorageItem(uint8 slot) const -{ - if (slot >= VOID_STORAGE_MAX_SLOT) - { - GetSession()->SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return nullptr; - } - - return _voidStorageItems[slot]; -} - -VoidStorageItem* Player::GetVoidStorageItem(uint64 id, uint8& slot) const -{ - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - { - if (_voidStorageItems[i] && _voidStorageItems[i]->ItemId == id) - { - slot = i; - return _voidStorageItems[i]; - } - } - - return nullptr; -} - void Player::CreateGarrison(uint32 garrSiteId) { std::unique_ptr<Garrison> garrison(new Garrison(this)); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2a51422b9a7..2a28c516dc0 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -511,21 +511,24 @@ DEFINE_ENUM_FLAG(PlayerFlagsEx); enum PlayerLocalFlags { - PLAYER_LOCAL_FLAG_CONTROLLING_PET = 0x00000001, // Displays "You have an active summon already" when trying to tame new pet - PLAYER_LOCAL_FLAG_TRACK_STEALTHED = 0x00000002, - PLAYER_LOCAL_FLAG_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit - PLAYER_LOCAL_FLAG_NO_RELEASE_WINDOW = 0x00000010, // Display no "release spirit" window at all - PLAYER_LOCAL_FLAG_NO_PET_BAR = 0x00000020, // CGPetInfo::IsPetBarUsed - PLAYER_LOCAL_FLAG_OVERRIDE_CAMERA_MIN_HEIGHT = 0x00000040, - PLAYER_LOCAL_FLAG_NEWLY_BOOSTED_CHARACTER = 0x00000080, - PLAYER_LOCAL_FLAG_USING_PARTY_GARRISON = 0x00000100, - PLAYER_LOCAL_FLAG_CAN_USE_OBJECTS_MOUNTED = 0x00000200, - PLAYER_LOCAL_FLAG_CAN_VISIT_PARTY_GARRISON = 0x00000400, - PLAYER_LOCAL_FLAG_WAR_MODE = 0x00000800, - PLAYER_LOCAL_FLAG_ACCOUNT_SECURED = 0x00001000, // Script_IsAccountSecured - PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME= 0x00008000, - PLAYER_LOCAL_FLAG_MENTOR_RESTRICTED = 0x00020000, - PLAYER_LOCAL_FLAG_WEEKLY_REWARD_AVAILABLE = 0x00040000, + PLAYER_LOCAL_FLAG_CONTROLLING_PET = 0x00000001, // Displays "You have an active summon already" when trying to tame new pet + PLAYER_LOCAL_FLAG_TRACK_STEALTHED = 0x00000002, + PLAYER_LOCAL_FLAG_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit + PLAYER_LOCAL_FLAG_NO_RELEASE_WINDOW = 0x00000010, // Display no "release spirit" window at all + PLAYER_LOCAL_FLAG_NO_PET_BAR = 0x00000020, // CGPetInfo::IsPetBarUsed + PLAYER_LOCAL_FLAG_OVERRIDE_CAMERA_MIN_HEIGHT = 0x00000040, + PLAYER_LOCAL_FLAG_NEWLY_BOOSTED_CHARACTER = 0x00000080, + PLAYER_LOCAL_FLAG_USING_PARTY_GARRISON = 0x00000100, + PLAYER_LOCAL_FLAG_CAN_USE_OBJECTS_MOUNTED = 0x00000200, + PLAYER_LOCAL_FLAG_CAN_VISIT_PARTY_GARRISON = 0x00000400, + PLAYER_LOCAL_FLAG_WAR_MODE = 0x00000800, + PLAYER_LOCAL_FLAG_ACCOUNT_SECURED = 0x00001000, // Script_IsAccountSecured + PLAYER_LOCAL_FLAG_OVERRIDE_TRANSPORT_SERVER_TIME = 0x00008000, + PLAYER_LOCAL_FLAG_MENTOR_RESTRICTED = 0x00020000, + PLAYER_LOCAL_FLAG_HAS_ACCOUNT_BANK_LOCK = 0x00040000, + PLAYER_LOCAL_FLAG_CHARACTER_BANK_DISABLED = 0x00080000, + PLAYER_LOCAL_FLAG_CHARACTER_BANK_CONVERSION_FAILED = 0x00100000, + PLAYER_LOCAL_FLAG_ACCOUNT_BANK_DISABLED = 0x00200000, }; DEFINE_ENUM_FLAG(PlayerLocalFlags); @@ -642,7 +645,6 @@ typedef std::unordered_map<uint32, SkillStatusData> SkillStatusMap; class Quest; class Spell; -class Item; class WorldSession; enum PlayerSlots @@ -650,7 +652,7 @@ enum PlayerSlots // first slot for item stored (in any way in player m_items data) PLAYER_SLOT_START = 0, // last+1 slot for item stored (in any way in player m_items data) - PLAYER_SLOT_END = 232, + PLAYER_SLOT_END = 105, PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START) }; @@ -722,61 +724,49 @@ enum InventoryPackSlots : uint8 // 28 slots INVENTORY_SLOT_ITEM_END = 63 }; -enum BankItemSlots // 28 slots -{ - BANK_SLOT_ITEM_START = 63, - BANK_SLOT_ITEM_END = 91 -}; - -enum BankBagSlots // 7 slots +enum BankBagSlots // 6 slots { - BANK_SLOT_BAG_START = 91, - BANK_SLOT_BAG_END = 98 + BANK_SLOT_BAG_START = 63, + BANK_SLOT_BAG_END = 69 }; enum BuyBackSlots // 12 slots { // stored in m_buybackitems - BUYBACK_SLOT_START = 98, - BUYBACK_SLOT_END = 110 -}; - -enum ReagentSlots // 98 slots -{ - REAGENT_SLOT_START = 110, - REAGENT_SLOT_END = 208, + BUYBACK_SLOT_START = 69, + BUYBACK_SLOT_END = 81 }; enum ChildEquipmentSlots { - CHILD_EQUIPMENT_SLOT_START = 208, - CHILD_EQUIPMENT_SLOT_END = 211, + CHILD_EQUIPMENT_SLOT_START = 81, + CHILD_EQUIPMENT_SLOT_END = 84, }; enum EquipableSpellSlots { - EQUIPABLE_SPELL_OFFENSIVE_SLOT1 = 211, - EQUIPABLE_SPELL_OFFENSIVE_SLOT2 = 212, - EQUIPABLE_SPELL_OFFENSIVE_SLOT3 = 213, - EQUIPABLE_SPELL_OFFENSIVE_SLOT4 = 214, - EQUIPABLE_SPELL_UTILITY_SLOT1 = 215, - EQUIPABLE_SPELL_UTILITY_SLOT2 = 216, - EQUIPABLE_SPELL_UTILITY_SLOT3 = 217, - EQUIPABLE_SPELL_UTILITY_SLOT4 = 218, - EQUIPABLE_SPELL_DEFENSIVE_SLOT1 = 219, - EQUIPABLE_SPELL_DEFENSIVE_SLOT2 = 220, - EQUIPABLE_SPELL_DEFENSIVE_SLOT3 = 221, - EQUIPABLE_SPELL_DEFENSIVE_SLOT4 = 222, - EQUIPABLE_SPELL_WEAPON_SLOT1 = 223, - EQUIPABLE_SPELL_WEAPON_SLOT2 = 224, - EQUIPABLE_SPELL_WEAPON_SLOT3 = 225, - EQUIPABLE_SPELL_WEAPON_SLOT4 = 226, + EQUIPABLE_SPELL_OFFENSIVE_SLOT1 = 84, + EQUIPABLE_SPELL_OFFENSIVE_SLOT2 = 85, + EQUIPABLE_SPELL_OFFENSIVE_SLOT3 = 86, + EQUIPABLE_SPELL_OFFENSIVE_SLOT4 = 87, + EQUIPABLE_SPELL_UTILITY_SLOT1 = 88, + EQUIPABLE_SPELL_UTILITY_SLOT2 = 89, + EQUIPABLE_SPELL_UTILITY_SLOT3 = 90, + EQUIPABLE_SPELL_UTILITY_SLOT4 = 91, + EQUIPABLE_SPELL_DEFENSIVE_SLOT1 = 92, + EQUIPABLE_SPELL_DEFENSIVE_SLOT2 = 93, + EQUIPABLE_SPELL_DEFENSIVE_SLOT3 = 94, + EQUIPABLE_SPELL_DEFENSIVE_SLOT4 = 95, + EQUIPABLE_SPELL_WEAPON_SLOT1 = 96, + EQUIPABLE_SPELL_WEAPON_SLOT2 = 97, + EQUIPABLE_SPELL_WEAPON_SLOT3 = 98, + EQUIPABLE_SPELL_WEAPON_SLOT4 = 99, }; enum AccountBankBagSlots { - ACCOUNT_BANK_SLOT_BAG_START = 227, - ACCOUNT_BANK_SLOT_BAG_END = 232 + ACCOUNT_BANK_SLOT_BAG_START = 100, + ACCOUNT_BANK_SLOT_BAG_END = 105 }; struct ItemPosCount @@ -810,14 +800,17 @@ enum class ItemSearchCallbackResult enum class BagSlotFlags : uint32 { - None = 0x00, - DisableAutoSort = 0x01, - PriorityEquipment = 0x02, - PriorityConsumables = 0x04, - PriorityTradeGoods = 0x08, - PriorityJunk = 0x10, - PriorityQuestItems = 0x20, - ExcludeJunkSell = 0x40, + None = 0x0000, + DisableAutoSort = 0x0001, + PriorityEquipment = 0x0002, + PriorityConsumables = 0x0004, + PriorityTradeGoods = 0x0008, + PriorityJunk = 0x0010, + PriorityQuestItems = 0x0020, + ExcludeJunkSell = 0x0040, + PriorityReagents = 0x0080, + ExpansionCurrent = 0x0100, + ExpansionLegacy = 0x0200, }; DEFINE_ENUM_FLAG(BagSlotFlags); @@ -939,7 +932,6 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, - PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE, PLAYER_LOGIN_QUERY_LOAD_CURRENCY, PLAYER_LOGIN_QUERY_LOAD_CUF_PROFILES, PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION, @@ -953,6 +945,7 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOAD_TRAIT_CONFIGS, PLAYER_LOGIN_QUERY_LOAD_DATA_ELEMENTS, PLAYER_LOGIN_QUERY_LOAD_DATA_FLAGS, + PLAYER_LOGIN_QUERY_LOAD_BANK_TAB_SETTINGS, MAX_PLAYER_LOGIN_QUERY }; @@ -1084,29 +1077,6 @@ struct BGData bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; } }; -struct VoidStorageItem -{ - VoidStorageItem() : ItemId(0), ItemEntry(0), RandomBonusListId(0), FixedScalingLevel(0), ArtifactKnowledgeLevel(0), Context(ItemContext::NONE) { } - VoidStorageItem(uint64 id, uint32 entry, ObjectGuid const& creator, ItemRandomBonusListId randomBonusListId, - uint32 fixedScalingLevel, uint32 artifactKnowledgeLevel, ItemContext context, std::vector<int32> const& bonuses) - : ItemId(id), ItemEntry(entry), CreatorGuid(creator), RandomBonusListId(randomBonusListId), - FixedScalingLevel(fixedScalingLevel), ArtifactKnowledgeLevel(artifactKnowledgeLevel), Context(context) - { - BonusListIDs.insert(BonusListIDs.end(), bonuses.begin(), bonuses.end()); - } - VoidStorageItem(VoidStorageItem&& vsi) noexcept : ItemId(vsi.ItemId), ItemEntry(vsi.ItemEntry), CreatorGuid(vsi.CreatorGuid), RandomBonusListId(vsi.RandomBonusListId), - FixedScalingLevel(vsi.FixedScalingLevel), ArtifactKnowledgeLevel(vsi.ArtifactKnowledgeLevel), Context(vsi.Context), BonusListIDs(std::move(vsi.BonusListIDs)) { } - - uint64 ItemId; - uint32 ItemEntry; - ObjectGuid CreatorGuid; - ItemRandomBonusListId RandomBonusListId; - uint32 FixedScalingLevel; - uint32 ArtifactKnowledgeLevel; - ItemContext Context; - std::vector<int32> BonusListIDs; -}; - struct ResurrectionData { ObjectGuid GUID; @@ -1391,11 +1361,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> if (flag.HasFlag(ItemSearchLocation::Bank)) { - for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i) - if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - if (callback(pItem) == ItemSearchCallbackResult::Stop) - return false; - for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) if (Bag* pBag = GetBagByPos(i)) for (uint32 j = 0; j < GetBagSize(pBag); ++j) @@ -1412,11 +1377,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> if (Item* pItem = GetItemInBag(bag, j)) if (callback(pItem) == ItemSearchCallbackResult::Stop) return false; - - for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i) - if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) - if (callback(pItem) == ItemSearchCallbackResult::Stop) - return false; } return true; @@ -1450,16 +1410,37 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> static bool IsBagPos(uint16 pos); static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); } static bool IsBankPos(uint8 bag, uint8 slot); - static bool IsReagentBankPos(uint16 pos) { return IsReagentBankPos(pos >> 8, pos & 255); } - static bool IsReagentBankPos(uint8 bag, uint8 slot); static bool IsChildEquipmentPos(uint16 pos) { return IsChildEquipmentPos(pos >> 8, pos & 255); } static bool IsChildEquipmentPos(uint8 bag, uint8 slot); + static bool IsAccountBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); } + static bool IsAccountBankPos(uint8 bag, uint8 slot); bool IsValidPos(uint16 pos, bool explicit_pos) const { return IsValidPos(pos >> 8, pos & 255, explicit_pos); } bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const; uint8 GetInventorySlotCount() const { return m_activePlayerData->NumBackpackSlots; } void SetInventorySlotCount(uint8 slots); uint8 GetBankBagSlotCount() const { return m_activePlayerData->NumBankSlots; } void SetBankBagSlotCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumBankSlots), count); } + uint8 GetCharacterBankTabCount() const { return m_activePlayerData->NumCharacterBankTabs; } + void SetCharacterBankTabCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumCharacterBankTabs), count); } + uint8 GetAccountBankTabCount() const { return m_activePlayerData->NumAccountBankTabs; } + void SetAccountBankTabCount(uint8 count) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::NumAccountBankTabs), count); } + void SetCharacterBankTabSettings(uint32 tabId, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + { + auto setter = m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::CharacterBankTabSettings, tabId); + SetBankTabSettings(setter, name, icon, description, depositFlags); + } + void SetAccountBankTabSettings(uint32 tabId, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + { + auto setter = m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::AccountBankTabSettings, tabId); + SetBankTabSettings(setter, name, icon, description, depositFlags); + } + void SetBankTabSettings(UF::MutableFieldReferenceWithChangesMask<UF::BankTabSettings, false> setter, std::string const& name, std::string const& icon, std::string const& description, BagSlotFlags depositFlags) + { + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Name), name); + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Icon), icon); + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::Description), description); + SetUpdateFieldValue(setter.ModifyValue(&UF::BankTabSettings::DepositFlags), int32(depositFlags)); + } bool IsBackpackAutoSortDisabled() const { return m_activePlayerData->BackpackAutoSortDisabled; } void SetBackpackAutoSortDisabled(bool disabled) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BackpackAutoSortDisabled), disabled); } bool IsBackpackSellJunkDisabled() const { return m_activePlayerData->BackpackSellJunkDisabled; } @@ -1470,10 +1451,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } void RemoveBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } void ReplaceAllBagSlotFlags(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BagSlotFlags, bagIndex), flags.AsUnderlyingType()); } - EnumFlag<BagSlotFlags> GetBankBagSlotFlags(uint32 bagIndex) const { return static_cast<BagSlotFlags>(m_activePlayerData->BankBagSlotFlags[bagIndex]); } - void SetBankBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } - void RemoveBankBagSlotFlag(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } - void ReplaceAllBankBagSlotFlags(uint32 bagIndex, EnumFlag<BagSlotFlags> flags) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::BankBagSlotFlags, bagIndex), flags.AsUnderlyingType()); } bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const; bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const; bool CanNoReagentCast(SpellInfo const* spellInfo) const; @@ -1998,6 +1975,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void ApplyTraitConfig(int32 configId, bool apply); void ApplyTraitEntry(int32 traitNodeEntryId, int32 rank, int32 grantedRanks, bool apply); void SetActiveCombatTraitConfigID(int32 traitConfigId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ActiveCombatTraitConfigID), traitConfigId); } + void SetCurrentCombatTraitConfigSubTreeID(int32 traitSubTreeId) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::CurrentCombatTraitConfigSubTreeID), traitSubTreeId); } void SetTraitConfigUseStarterBuild(int32 traitConfigId, bool useStarterBuild); void SetTraitConfigUseSharedActionBars(int32 traitConfigId, bool usesSharedActionBars, bool isLastSelectedSavedConfig); Optional<PlayerSpellTrait> GetTraitInfoForSpell(uint32 spellId) const; @@ -2807,18 +2785,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> std::string GetMapAreaAndZoneString() const; std::string GetCoordsMapAreaAndZoneString() const; - // Void Storage - bool IsVoidStorageUnlocked() const { return HasPlayerFlag(PLAYER_FLAGS_VOID_UNLOCKED); } - void UnlockVoidStorage() { SetPlayerFlag(PLAYER_FLAGS_VOID_UNLOCKED); } - void LockVoidStorage() { RemovePlayerFlag(PLAYER_FLAGS_VOID_UNLOCKED); } - uint8 GetNextVoidStorageFreeSlot() const; - uint8 GetNumOfVoidStorageFreeSlots() const; - uint8 AddVoidStorageItem(VoidStorageItem&& item); - void DeleteVoidStorageItem(uint8 slot); - bool SwapVoidStorageItem(uint8 oldSlot, uint8 newSlot); - VoidStorageItem* GetVoidStorageItem(uint8 slot) const; - VoidStorageItem* GetVoidStorageItem(uint64 id, uint8& slot) const; - // Reagent Bank bool IsReagentBankUnlocked() const { return HasPlayerFlagEx(PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED); } void UnlockReagentBank() { SetPlayerFlagEx(PLAYER_FLAGS_EX_REAGENT_BANK_UNLOCKED); } @@ -3058,7 +3024,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _LoadInventory(PreparedQueryResult result, PreparedQueryResult artifactsResult, PreparedQueryResult azeriteResult, PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult, uint32 timeDiff); - void _LoadVoidStorage(PreparedQueryResult result); void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult, PreparedQueryResult artifactResult, PreparedQueryResult azeriteItemResult, PreparedQueryResult azeriteItemMilestonePowersResult, PreparedQueryResult azeriteItemUnlockedEssencesResult, PreparedQueryResult azeriteEmpoweredItemResult); static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint64 mailId, Mail* mail, Field* fields, ItemAdditionalLoadInfo* addionalData); @@ -3090,6 +3055,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _LoadCurrency(PreparedQueryResult result); void _LoadCUFProfiles(PreparedQueryResult result); void _LoadPlayerData(PreparedQueryResult elementsResult, PreparedQueryResult flagsResult); + void _LoadCharacterBankTabSettings(PreparedQueryResult result); /*********************************************************/ /*** SAVE SYSTEM ***/ @@ -3099,7 +3065,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _SaveActions(CharacterDatabaseTransaction trans); void _SaveAuras(CharacterDatabaseTransaction trans); void _SaveInventory(CharacterDatabaseTransaction trans); - void _SaveVoidStorage(CharacterDatabaseTransaction trans); void _SaveMail(CharacterDatabaseTransaction trans); void _SaveQuestStatus(CharacterDatabaseTransaction trans); void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans); @@ -3119,6 +3084,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void _SaveCurrency(CharacterDatabaseTransaction trans); void _SaveCUFProfiles(CharacterDatabaseTransaction trans); void _SavePlayerData(CharacterDatabaseTransaction trans); + void _SaveCharacterBankTabSettings(CharacterDatabaseTransaction trans) const; /*********************************************************/ /*** ENVIRONMENTAL SYSTEM ***/ @@ -3151,8 +3117,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> PlayerCurrenciesMap _currencyStorage; - VoidStorageItem* _voidStorageItems[VOID_STORAGE_MAX_SLOT]; - std::vector<Item*> m_itemUpdateQueue; bool m_itemUpdateQueueBlocked; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f6917ee88f7..ab91bf1f62b 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1433,6 +1433,12 @@ class TC_GAME_API Unit : public WorldObject void SetChannelObject(uint32 slot, ObjectGuid guid); void RemoveChannelObject(ObjectGuid guid); void ClearChannelObjects(); + void SetChannelSpellData(uint32 startTimeMs, uint32 durationMs) + { + auto channelData = m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ChannelData); + SetUpdateFieldValue(channelData.ModifyValue(&UF::UnitChannel::StartTimeMs), startTimeMs); + SetUpdateFieldValue(channelData.ModifyValue(&UF::UnitChannel::Duration), durationMs); + } int8 GetSpellEmpowerStage() const { return m_unitData->SpellEmpowerStage; } void SetSpellEmpowerStage(int8 stage) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::SpellEmpowerStage), stage); } diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp index 9b67fef4467..a9ed6d056f9 100644 --- a/src/server/game/Globals/AreaTriggerDataStore.cpp +++ b/src/server/game/Globals/AreaTriggerDataStore.cpp @@ -272,8 +272,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() TC_LOG_INFO("server.loading", ">> Loaded 0 AreaTrigger create properties. DB table `areatrigger_create_properties` is empty."); } - // 0 1 2 3 4 5 6 7 8 - if (QueryResult circularMovementInfos = WorldDatabase.Query("SELECT AreaTriggerCreatePropertiesId, IsCustom, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit`")) + // 0 1 2 3 4 5 6 7 8 + if (QueryResult circularMovementInfos = WorldDatabase.Query("SELECT AreaTriggerCreatePropertiesId, IsCustom, ExtraTimeForBlending, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit`")) { do { @@ -289,7 +289,7 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() createProperties->OrbitInfo.emplace(); - createProperties->OrbitInfo->StartDelay = circularMovementInfoFields[2].GetUInt32(); + createProperties->OrbitInfo->ExtraTimeForBlending = circularMovementInfoFields[2].GetInt32(); #define VALIDATE_AND_SET_FLOAT(Float, Value) \ createProperties->OrbitInfo->Float = Value; \ diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6d24e727a39..f75382bc474 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -226,7 +226,6 @@ ObjectMgr::ObjectMgr(): _hiPetNumber(1), _creatureSpawnId(1), _gameObjectSpawnId(1), - _voidItemId(1), DBCLocaleIndex(LOCALE_enUS) { } @@ -923,11 +922,11 @@ void ObjectMgr::LoadCreatureTemplateDifficulty() // 0 1 2 3 4 5 QueryResult result = WorldDatabase.Query("SELECT Entry, DifficultyID, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID, HealthScalingExpansion, " - // 6 7 8 9 10 11 12 - "HealthModifier, ManaModifier, ArmorModifier, DamageModifier, CreatureDifficultyID, TypeFlags, TypeFlags2, " - // 13 14 15 16 17 + // 6 7 8 9 10 11 12 13 + "HealthModifier, ManaModifier, ArmorModifier, DamageModifier, CreatureDifficultyID, TypeFlags, TypeFlags2, TypeFlags3, " + // 14 15 16 17 18 "LootID, PickPocketLootID, SkinLootID, GoldMin, GoldMax," - // 18 19 20 21 22 23 24 25 + // 19 20 21 22 23 24 25 26 "StaticFlags1, StaticFlags2, StaticFlags3, StaticFlags4, StaticFlags5, StaticFlags6, StaticFlags7, StaticFlags8 " "FROM creature_template_difficulty ORDER BY Entry"); @@ -964,14 +963,15 @@ void ObjectMgr::LoadCreatureTemplateDifficulty() creatureDifficulty.CreatureDifficultyID = fields[10].GetInt32(); creatureDifficulty.TypeFlags = fields[11].GetUInt32(); creatureDifficulty.TypeFlags2 = fields[12].GetUInt32(); - creatureDifficulty.LootID = fields[13].GetUInt32(); - creatureDifficulty.PickPocketLootID = fields[14].GetUInt32(); - creatureDifficulty.SkinLootID = fields[15].GetUInt32(); - creatureDifficulty.GoldMin = fields[16].GetUInt32(); - creatureDifficulty.GoldMax = fields[17].GetUInt32(); - creatureDifficulty.StaticFlags = CreatureStaticFlagsHolder(CreatureStaticFlags(fields[18].GetUInt32()), CreatureStaticFlags2(fields[19].GetUInt32()), - CreatureStaticFlags3(fields[20].GetUInt32()), CreatureStaticFlags4(fields[21].GetUInt32()), CreatureStaticFlags5(fields[22].GetUInt32()), - CreatureStaticFlags6(fields[23].GetUInt32()), CreatureStaticFlags7(fields[24].GetUInt32()), CreatureStaticFlags8(fields[25].GetUInt32())); + creatureDifficulty.TypeFlags3 = fields[13].GetUInt32(); + creatureDifficulty.LootID = fields[14].GetUInt32(); + creatureDifficulty.PickPocketLootID = fields[15].GetUInt32(); + creatureDifficulty.SkinLootID = fields[16].GetUInt32(); + creatureDifficulty.GoldMin = fields[17].GetUInt32(); + creatureDifficulty.GoldMax = fields[18].GetUInt32(); + creatureDifficulty.StaticFlags = CreatureStaticFlagsHolder(CreatureStaticFlags(fields[19].GetUInt32()), CreatureStaticFlags2(fields[20].GetUInt32()), + CreatureStaticFlags3(fields[21].GetUInt32()), CreatureStaticFlags4(fields[22].GetUInt32()), CreatureStaticFlags5(fields[23].GetUInt32()), + CreatureStaticFlags6(fields[24].GetUInt32()), CreatureStaticFlags7(fields[25].GetUInt32()), CreatureStaticFlags8(fields[26].GetUInt32())); // TODO: Check if this still applies creatureDifficulty.DamageModifier *= Creature::GetDamageMod(itr->second.Classification); @@ -7448,10 +7448,6 @@ void ObjectMgr::SetHighestGuids() if (result) sGroupMgr->SetGroupDbStoreSize((*result)[0].GetUInt32()+1); - result = CharacterDatabase.Query("SELECT MAX(itemId) from character_void_storage"); - if (result) - _voidItemId = (*result)[0].GetUInt64()+1; - result = WorldDatabase.Query("SELECT MAX(guid) FROM creature"); if (result) _creatureSpawnId = (*result)[0].GetUInt64() + 1; @@ -7506,16 +7502,6 @@ uint32 ObjectMgr::GeneratePetNumber() return _hiPetNumber++; } -uint64 ObjectMgr::GenerateVoidStorageItemId() -{ - if (_voidItemId >= uint64(0xFFFFFFFFFFFFFFFELL)) - { - TC_LOG_ERROR("misc", "_voidItemId overflow!! Can't continue, shutting down server. "); - World::StopNow(ERROR_EXIT_CODE); - } - return _voidItemId++; -} - uint64 ObjectMgr::GenerateCreatureSpawnId() { if (_creatureSpawnId >= uint64(0xFFFFFFFFFFFFFFFELL)) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index a5684df7b94..b8c4cc292ff 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1366,7 +1366,6 @@ class TC_GAME_API ObjectMgr uint64 GenerateEquipmentSetGuid(); uint64 GenerateMailID(); uint32 GeneratePetNumber(); - uint64 GenerateVoidStorageItemId(); ObjectGuid::LowType GenerateCreatureSpawnId(); ObjectGuid::LowType GenerateGameObjectSpawnId(); @@ -1701,7 +1700,6 @@ class TC_GAME_API ObjectMgr std::atomic<uint32> _hiPetNumber; ObjectGuid::LowType _creatureSpawnId; ObjectGuid::LowType _gameObjectSpawnId; - uint64 _voidItemId; // first free low guid for selected guid type ObjectGuidGenerator& GetGuidSequenceGenerator(HighGuid high); diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 4a270a005f9..28230a309b0 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -52,11 +52,13 @@ uint32 const EMBLEM_PRICE = 10 * GOLD; inline uint64 GetGuildBankTabPrice(uint8 tabId) { - // these prices are in gold units, not copper - static uint64 const tabPrices[GUILD_BANK_MAX_TABS] = { 100, 250, 500, 1000, 2500, 5000, 0, 0 }; - ASSERT(tabId < GUILD_BANK_MAX_TABS); + auto bankTab = std::ranges::find(sBankTabStore, std::pair(BankType::Guild, int8(tabId)), + [](BankTabEntry const* bankTab) { return std::pair(BankType(bankTab->BankType), bankTab->OrderIndex); }); - return tabPrices[tabId]; + if (bankTab != sBankTabStore.end()) + return bankTab->Cost; + + return 0; } void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string_view param) @@ -1659,7 +1661,7 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); // Remove money from bank - uint64 tabCost = GetGuildBankTabPrice(tabId) * GOLD; + uint64 tabCost = GetGuildBankTabPrice(tabId); if (tabCost && !_ModifyBankMoney(trans, tabCost, false)) // Should not happen, this is checked by client return; diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp index 91a65dfb58b..db3a34e0403 100644 --- a/src/server/game/Handlers/BankHandler.cpp +++ b/src/server/game/Handlers/BankHandler.cpp @@ -31,7 +31,7 @@ void WorldSession::HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& pa if (!CanUseBank()) { - TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); + TC_LOG_ERROR("network", "WORLD: HandleAutoBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid); return; } @@ -106,7 +106,7 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa if (!CanUseBank()) { - TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); + TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit ({}) not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid); return; } @@ -144,67 +144,129 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBa } } -void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet) +void WorldSession::HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBankTab) { - if (!CanUseBank(packet.Guid)) + if (!CanUseBank(buyBankTab.Banker)) { - TC_LOG_ERROR("network", "WORLD: HandleBuyBankSlotOpcode - {} not found or you can't interact with him.", packet.Guid.ToString()); + TC_LOG_ERROR("network", "WorldSession::HandleBuyBankTab {} - Banker {} not found or can't interact with him.", + _player->GetGUID(), buyBankTab.Banker); return; } - uint32 slot = _player->GetBankBagSlotCount(); + if (buyBankTab.BankType != BankType::Character) + { + TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.", + _player->GetGUID(), buyBankTab.BankType); + return; + } + + uint32 itemId = 0; + uint8 slot = 0; + uint8 inventorySlot = 0; + + switch (buyBankTab.BankType) + { + case BankType::Character: + itemId = ITEM_CHARACTER_BANK_TAB_BAG; + slot = _player->GetCharacterBankTabCount(); + inventorySlot = BANK_SLOT_BAG_START; + break; + case BankType::Account: + itemId = ITEM_ACCOUNT_BANK_TAB_BAG; + slot = _player->GetAccountBankTabCount(); + inventorySlot = ACCOUNT_BANK_SLOT_BAG_START; + break; + default: + TC_LOG_DEBUG("network", "WorldSession::HandleBuyBankTab {} - Bank type {} is not supported.", + _player->GetGUID(), buyBankTab.BankType); + return; + } // next slot ++slot; - TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = {}", slot); + auto bankTab = std::ranges::find(sBankTabStore, std::pair(buyBankTab.BankType, int8(slot)), + [](BankTabEntry const* bankTab) { return std::pair(BankType(bankTab->BankType), bankTab->OrderIndex); }); - BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot); - if (!slotEntry) + if (bankTab == sBankTabStore.end()) return; - uint32 price = slotEntry->Cost; - - if (!_player->HasEnoughMoney(uint64(price))) + uint64 price = bankTab->Cost; + if (!_player->HasEnoughMoney(price)) return; - _player->SetBankBagSlotCount(slot); - _player->ModifyMoney(-int64(price)); - - _player->UpdateCriteria(CriteriaType::BankSlotsPurchased); -} - -void WorldSession::HandleBuyReagentBankOpcode(WorldPackets::Bank::ReagentBank& reagentBank) -{ - if (!CanUseBank(reagentBank.Banker)) + uint16 inventoryPos = 0; + InventoryResult msg = _player->CanEquipNewItem(inventorySlot, inventoryPos, itemId, false); + if (msg != EQUIP_ERR_OK) { - TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - {} not found or you can't interact with him.", reagentBank.Banker.ToString()); + _player->SendEquipError(msg, nullptr, nullptr, itemId); return; } - if (_player->IsReagentBankUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - Player ({}, name: {}) tried to unlock reagent bank a 2nd time.", _player->GetGUID().ToString(), _player->GetName()); + Item* bag = _player->EquipNewItem(inventoryPos, itemId, ItemContext::NONE, true); + if (!bag) return; + + switch (buyBankTab.BankType) + { + case BankType::Character: + _player->SetCharacterBankTabCount(slot); + break; + case BankType::Account: + _player->SetAccountBankTabCount(slot); + break; + default: + break; } - constexpr int64 price = 100 * GOLD; + _player->ModifyMoney(-int64(price)); - if (!_player->HasEnoughMoney(price)) + _player->UpdateCriteria(CriteriaType::BankTabPurchased, uint64(buyBankTab.BankType)); +} + +void WorldSession::HandleUpdateBankTabSettings(WorldPackets::Bank::UpdateBankTabSettings const& updateBankTabSettings) +{ + if (!CanUseBank(updateBankTabSettings.Banker)) { - TC_LOG_DEBUG("network", "WORLD: HandleBuyReagentBankOpcode - Player ({}, name: {}) without enough gold.", _player->GetGUID().ToString(), _player->GetName()); + TC_LOG_ERROR("network", "WorldSession::HandleUpdateBankTabSettings {} - Banker {} not found or can't interact with him.", + _player->GetGUID(), updateBankTabSettings.Banker); return; } - _player->ModifyMoney(-price); - _player->UnlockReagentBank(); + switch (updateBankTabSettings.BankType) + { + case BankType::Character: + if (updateBankTabSettings.Tab >= _player->m_activePlayerData->CharacterBankTabSettings.size()) + { + TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} doesn't have bank tab {} in bank type {}.", + _player->GetGUID(), updateBankTabSettings.Tab, updateBankTabSettings.BankType); + return; + } + _player->SetCharacterBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name, + updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags); + break; + case BankType::Account: + if (updateBankTabSettings.Tab >= _player->m_activePlayerData->AccountBankTabSettings.size()) + { + TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} doesn't have bank tab {} in bank type {}.", + _player->GetGUID(), updateBankTabSettings.Tab, updateBankTabSettings.BankType); + return; + } + _player->SetAccountBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name, + updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags); + break; + default: + TC_LOG_DEBUG("network", "WorldSession::HandleUpdateBankTabSettings {} - Bank type {} is not supported.", + _player->GetGUID(), updateBankTabSettings.BankType); + break; + } } -void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBank& reagentBank) +void WorldSession::HandleAutoDepositCharacterBank(WorldPackets::Bank::AutoDepositCharacterBank const& autoDepositCharacterBank) { - if (!CanUseBank(reagentBank.Banker)) + if (!CanUseBank(autoDepositCharacterBank.Banker)) { - TC_LOG_DEBUG("network", "WORLD: HandleReagentBankDepositOpcode - {} not found or you can't interact with him.", reagentBank.Banker.ToString()); + TC_LOG_DEBUG("network", "WORLD: HandleReagentBankDepositOpcode - {} not found or you can't interact with him.", autoDepositCharacterBank.Banker); return; } @@ -240,88 +302,6 @@ void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBan } } -void WorldSession::HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReagent& autoBankReagent) -{ - if (!CanUseBank()) - { - TC_LOG_DEBUG("network", "WORLD: HandleAutoBankReagentOpcode - {} not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); - return; - } - - if (!_player->IsReagentBankUnlocked()) - { - _player->SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED); - return; - } - - Item* item = _player->GetItemByPos(autoBankReagent.PackSlot, autoBankReagent.Slot); - if (!item) - return; - - ItemPosCountVec dest; - InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true, true); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, item, nullptr); - return; - } - - if (dest.size() == 1 && dest[0].pos == item->GetPos()) - { - _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, nullptr); - return; - } - - _player->RemoveItem(autoBankReagent.PackSlot, autoBankReagent.Slot, true); - _player->BankItem(dest, item, true); -} - -void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStoreBankReagent& autoStoreBankReagent) -{ - if (!CanUseBank()) - { - TC_LOG_DEBUG("network", "WORLD: HandleAutoBankReagentOpcode - {} not found or you can't interact with him.", _player->PlayerTalkClass->GetInteractionData().SourceGuid.ToString()); - return; - } - - if (!_player->IsReagentBankUnlocked()) - { - _player->SendEquipError(EQUIP_ERR_REAGENT_BANK_LOCKED); - return; - } - - Item* pItem = _player->GetItemByPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot); - if (!pItem) - return; - - if (_player->IsReagentBankPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot)) - { - ItemPosCountVec dest; - InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, pItem, false); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, nullptr); - return; - } - - _player->RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true); - _player->StoreItem(dest, pItem, true); - } - else - { - ItemPosCountVec dest; - InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false, true, true); - if (msg != EQUIP_ERR_OK) - { - _player->SendEquipError(msg, pItem, nullptr); - return; - } - - _player->RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true); - _player->BankItem(dest, pItem, true); - } -} - void WorldSession::SendShowBank(ObjectGuid guid, PlayerInteractionType interactionType) { _player->PlayerTalkClass->GetInteractionData().StartInteraction(guid, interactionType); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 116390128d2..f0f60870bf1 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -182,10 +182,6 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AZERITE_EMPOWERED, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_VOID_STORAGE); - stmt->setUInt64(0, lowGuid); - res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_VOID_STORAGE, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL); stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAILS, stmt); @@ -353,6 +349,10 @@ bool LoginQueryHolder::Initialize() stmt->setUInt64(0, lowGuid); res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_DATA_FLAGS, stmt); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_BANK_TAB_SETTINGS); + stmt->setUInt64(0, lowGuid); + res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_BANK_TAB_SETTINGS, stmt); + return res; } @@ -1504,7 +1504,6 @@ void WorldSession::SendFeatureSystemStatus() features.CfgRealmRecID = 0; features.CommercePricePollTimeSeconds = 300; features.VoiceEnabled = false; - features.BrowserEnabled = false; // Has to be false, otherwise client will crash if "Customer Support" is opened // Enable guilds only. // This is required to restore old guild channel behavior for GMs. diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index e63ed58e7e4..a8602605c7d 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -1251,13 +1251,6 @@ void WorldSession::HandleSortBankBags(WorldPackets::Item::SortBankBags& /*sortBa SendPacket(WorldPackets::Item::BagCleanupFinished().Write()); } -void WorldSession::HandleSortReagentBankBags(WorldPackets::Item::SortReagentBankBags& /*sortReagentBankBags*/) -{ - // TODO: Implement sorting - // Placeholder to prevent completely locking out bags clientside - SendPacket(WorldPackets::Item::BagCleanupFinished().Write()); -} - void WorldSession::HandleRemoveNewItem(WorldPackets::Item::RemoveNewItem& removeNewItem) { Item* item = _player->GetItemByGuid(removeNewItem.ItemGuid); @@ -1285,17 +1278,6 @@ void WorldSession::HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag _player->RemoveBagSlotFlag(changeBagSlotFlag.BagIndex, changeBagSlotFlag.FlagToChange); } -void WorldSession::HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag) -{ - if (changeBankBagSlotFlag.BagIndex >= _player->m_activePlayerData->BankBagSlotFlags.size()) - return; - - if (changeBankBagSlotFlag.On) - _player->SetBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); - else - _player->RemoveBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); -} - void WorldSession::HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled) { _player->SetBackpackAutoSortDisabled(setBackpackAutosortDisabled.Disable); diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 4012ccff590..37fda27000e 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -322,6 +322,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc SendTradeStatus(info); return; } + + if (Player::IsAccountBankPos(item->GetSlot(), item->GetBagSlot())) + { + info.Status = TRADE_STATUS_FAILED; + info.BagResult = EQUIP_ERR_CANT_TRADE_ACCOUNT_ITEM; + SendTradeStatus(info); + return; + } } if (Item* item = his_trade->GetItem(TradeSlots(i))) @@ -338,6 +346,14 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc // his_trade->SetAccepted(false, true); // return; //} + + if (Player::IsAccountBankPos(item->GetSlot(), item->GetBagSlot())) + { + info.Status = TRADE_STATUS_FAILED; + info.BagResult = EQUIP_ERR_CANT_TRADE_ACCOUNT_ITEM; + SendTradeStatus(info); + return; + } } } diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp deleted file mode 100644 index 2ab4ee8fb8f..00000000000 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "WorldSession.h" -#include "Bag.h" -#include "CollectionMgr.h" -#include "Common.h" -#include "Log.h" -#include "ObjectAccessor.h" -#include "ObjectMgr.h" -#include "Player.h" -#include "VoidStoragePackets.h" - -void WorldSession::SendVoidStorageTransferResult(VoidTransferError result) -{ - SendPacket(WorldPackets::VoidStorage::VoidTransferResult(result).Write()); -} - -void WorldSession::HandleVoidStorageUnlock(WorldPackets::VoidStorage::UnlockVoidStorage& unlockVoidStorage) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(unlockVoidStorage.Npc, UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageUnlock - {} not found or player can't interact with it.", unlockVoidStorage.Npc.ToString()); - return; - } - - if (_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageUnlock - Player ({}, name: {}) tried to unlock void storage a 2nd time.", _player->GetGUID().ToString(), _player->GetName()); - return; - } - - _player->ModifyMoney(-int64(VOID_STORAGE_UNLOCK_COST)); - _player->UnlockVoidStorage(); -} - -void WorldSession::HandleVoidStorageQuery(WorldPackets::VoidStorage::QueryVoidStorage& queryVoidStorage) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(queryVoidStorage.Npc, UNIT_NPC_FLAG_TRANSMOGRIFIER | UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageQuery - {} not found or player can't interact with it.", queryVoidStorage.Npc.ToString()); - SendPacket(WorldPackets::VoidStorage::VoidStorageFailed().Write()); - return; - } - - if (!_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageQuery - Player ({}, name: {}) queried void storage without unlocking it.", _player->GetGUID().ToString(), _player->GetName()); - SendPacket(WorldPackets::VoidStorage::VoidStorageFailed().Write()); - return; - } - - WorldPackets::VoidStorage::VoidStorageContents voidStorageContents; - voidStorageContents.Items.reserve(VOID_STORAGE_MAX_SLOT); - - for (uint8 i = 0; i < VOID_STORAGE_MAX_SLOT; ++i) - { - VoidStorageItem* item = _player->GetVoidStorageItem(i); - if (!item) - continue; - - WorldPackets::VoidStorage::VoidItem voidItem; - voidItem.Guid = ObjectGuid::Create<HighGuid::Item>(item->ItemId); - voidItem.Creator = item->CreatorGuid; - voidItem.Slot = i; - voidItem.Item.Initialize(item); - - voidStorageContents.Items.push_back(voidItem); - } - - SendPacket(voidStorageContents.Write()); -} - -void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStorageTransfer& voidStorageTransfer) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(voidStorageTransfer.Npc, UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} not found or player can't interact with it.", voidStorageTransfer.Npc.ToString()); - return; - } - - if (!_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - Player ({}, name: {}) queried void storage without unlocking it.", _player->GetGUID().ToString(), _player->GetName()); - return; - } - - if (voidStorageTransfer.Deposits.size() > _player->GetNumOfVoidStorageFreeSlots()) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); - return; - } - - if (!voidStorageTransfer.Withdrawals.empty() && voidStorageTransfer.Withdrawals.size() > _player->GetFreeInventorySlotCount(ItemSearchLocation::Inventory)) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); - return; - } - - if (!_player->HasEnoughMoney(uint64(voidStorageTransfer.Deposits.size() * VOID_STORAGE_STORE_ITEM_COST))) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_NOT_ENOUGH_MONEY); - return; - } - - WorldPackets::VoidStorage::VoidStorageTransferChanges voidStorageTransferChanges; - voidStorageTransferChanges.AddedItems.reserve(VOID_STORAGE_MAX_DEPOSIT); - voidStorageTransferChanges.RemovedItems.reserve(VOID_STORAGE_MAX_DEPOSIT); - - uint8 depositCount = 0; - for (uint32 i = 0; i < voidStorageTransfer.Deposits.size(); ++i) - { - Item* item = _player->GetItemByGuid(voidStorageTransfer.Deposits[i]); - if (!item) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} {} wants to deposit an invalid item ({}).", _player->GetGUID().ToString(), _player->GetName(), voidStorageTransfer.Deposits[i].ToString()); - continue; - } - - VoidStorageItem itemVS(sObjectMgr->GenerateVoidStorageItemId(), item->GetEntry(), item->GetCreator(), - item->GetItemRandomBonusListId(), item->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), item->GetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL), - item->GetContext(), item->GetBonusListIDs()); - - WorldPackets::VoidStorage::VoidItem voidItem; - voidItem.Guid = ObjectGuid::Create<HighGuid::Item>(itemVS.ItemId); - voidItem.Creator = item->GetCreator(); - voidItem.Item.Initialize(&itemVS); - voidItem.Slot = _player->AddVoidStorageItem(std::move(itemVS)); - - voidStorageTransferChanges.AddedItems.push_back(voidItem); - - _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); - ++depositCount; - } - - int64 cost = depositCount * VOID_STORAGE_STORE_ITEM_COST; - - _player->ModifyMoney(-cost); - - for (uint32 i = 0; i < voidStorageTransfer.Withdrawals.size(); ++i) - { - uint8 slot = 0; - VoidStorageItem* itemVS = _player->GetVoidStorageItem(voidStorageTransfer.Withdrawals[i].GetCounter(), slot); - if (!itemVS) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} {} tried to withdraw an invalid item (id: {})", _player->GetGUID().ToString(), _player->GetName(), voidStorageTransfer.Withdrawals[i].ToString()); - continue; - } - - ItemPosCountVec dest; - InventoryResult msg = _player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemVS->ItemEntry, 1); - if (msg != EQUIP_ERR_OK) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - {} {} couldn't withdraw item id {} because inventory was full.", _player->GetGUID().ToString(), _player->GetName(), voidStorageTransfer.Withdrawals[i].ToString()); - return; - } - - if (Item* item = _player->StoreNewItem(dest, itemVS->ItemEntry, true, itemVS->RandomBonusListId, GuidSet(), itemVS->Context, &itemVS->BonusListIDs)) - { - item->SetCreator(itemVS->CreatorGuid); - item->SetBinding(true); - GetCollectionMgr()->AddItemAppearance(item); - } - - voidStorageTransferChanges.RemovedItems.push_back(ObjectGuid::Create<HighGuid::Item>(itemVS->ItemId)); - - _player->DeleteVoidStorageItem(slot); - } - - SendPacket(voidStorageTransferChanges.Write()); - - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_NO_ERROR); -} - -void WorldSession::HandleVoidSwapItem(WorldPackets::VoidStorage::SwapVoidItem& swapVoidItem) -{ - Creature* unit = _player->GetNPCIfCanInteractWith(swapVoidItem.Npc, UNIT_NPC_FLAG_VAULTKEEPER, UNIT_NPC_FLAG_2_NONE); - if (!unit) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidSwapItem - {} not found or player can't interact with it.", swapVoidItem.Npc.ToString()); - return; - } - - if (!_player->IsVoidStorageUnlocked()) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidSwapItem - Player ({}, name: {}) queried void storage without unlocking it.", _player->GetGUID().ToString(), _player->GetName()); - return; - } - - uint8 oldSlot; - if (!_player->GetVoidStorageItem(swapVoidItem.VoidItemGuid.GetCounter(), oldSlot)) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidSwapItem - {} {} requested swapping an invalid item (slot: {}, itemid: {}).", _player->GetGUID().ToString(), _player->GetName(), swapVoidItem.DstSlot, swapVoidItem.VoidItemGuid.ToString()); - return; - } - - bool usedDestSlot = _player->GetVoidStorageItem(swapVoidItem.DstSlot) != nullptr; - ObjectGuid itemIdDest; - if (usedDestSlot) - itemIdDest = ObjectGuid::Create<HighGuid::Item>(_player->GetVoidStorageItem(swapVoidItem.DstSlot)->ItemId); - - if (!_player->SwapVoidStorageItem(oldSlot, swapVoidItem.DstSlot)) - { - SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INTERNAL_ERROR_1); - return; - } - - WorldPackets::VoidStorage::VoidItemSwapResponse voidItemSwapResponse; - voidItemSwapResponse.VoidItemA = swapVoidItem.VoidItemGuid; - voidItemSwapResponse.VoidItemSlotA = swapVoidItem.DstSlot; - if (usedDestSlot) - { - voidItemSwapResponse.VoidItemB = itemIdDest; - voidItemSwapResponse.VoidItemSlotB = oldSlot; - } - - SendPacket(voidItemSwapResponse.Write()); -} diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 8afe51bbdf9..8664db8e3bb 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -1635,6 +1635,10 @@ enum SpellEffectName SPELL_EFFECT_UI_ACTION = 339, SPELL_EFFECT_340 = 340, SPELL_EFFECT_LEARN_WARBAND_SCENE = 341, + SPELL_EFFECT_342 = 342, + SPELL_EFFECT_343 = 343, + SPELL_EFFECT_344 = 344, // some kind of teleport + SPELL_EFFECT_ASSIST_ACTION = 345, // MiscValue[0] = AssistActionType, MiscValue[1] = ID, depends on type TOTAL_SPELL_EFFECTS }; @@ -3151,9 +3155,11 @@ enum GameobjectTypes : uint8 GAMEOBJECT_TYPE_CLIENT_MODEL = 60, GAMEOBJECT_TYPE_CRAFTING_TABLE = 61, GAMEOBJECT_TYPE_PERKS_PROGRAM_CHEST = 62, + GAMEOBJECT_TYPE_FUTURE_PATCH = 63, + GAMEOBJECT_TYPE_ASSIST_ACTION = 64, }; -#define MAX_GAMEOBJECT_TYPE 63 // sending to client this or greater value can crash client. +#define MAX_GAMEOBJECT_TYPE 65 // sending to client this or greater value can crash client. #define MAX_GAMEOBJECT_DATA 35 // Max number of uint32 vars in gameobject_template data field enum GameObjectFlags @@ -6952,29 +6958,6 @@ enum DungeonStatusFlag RAID_STATUSFLAG_25MAN_HEROIC = 0x08 }; -enum VoidStorageConstants -{ - VOID_STORAGE_UNLOCK_COST = 100 * GOLD, - VOID_STORAGE_STORE_ITEM_COST = 10 * GOLD, - VOID_STORAGE_MAX_DEPOSIT = 9, - VOID_STORAGE_MAX_WITHDRAW = 9, - VOID_STORAGE_MAX_SLOT = 160 -}; - -enum VoidTransferError -{ - VOID_TRANSFER_ERROR_NO_ERROR = 0, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_1 = 1, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_2 = 2, - VOID_TRANSFER_ERROR_FULL = 3, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_3 = 4, - VOID_TRANSFER_ERROR_INTERNAL_ERROR_4 = 5, - VOID_TRANSFER_ERROR_NOT_ENOUGH_MONEY = 6, - VOID_TRANSFER_ERROR_INVENTORY_FULL = 7, - VOID_TRANSFER_ERROR_ITEM_INVALID = 8, - VOID_TRANSFER_ERROR_TRANSFER_UNKNOWN = 9 -}; - enum class CurrencyDbFlags : uint8 { None = 0x00, @@ -7516,903 +7499,910 @@ enum class GameError : uint32 ERR_SET_LOOT_ROUNDROBIN = 294, ERR_SET_LOOT_MASTER = 295, ERR_SET_LOOT_GROUP = 296, - ERR_SET_LOOT_THRESHOLD_S = 297, - ERR_NEW_LOOT_MASTER_S = 298, - ERR_SPECIFY_MASTER_LOOTER = 299, - ERR_LOOT_SPEC_CHANGED_S = 300, - ERR_TAME_FAILED = 301, - ERR_CHAT_WHILE_DEAD = 302, - ERR_CHAT_PLAYER_NOT_FOUND_S = 303, - ERR_NEWTAXIPATH = 304, - ERR_NO_PET = 305, - ERR_NOTYOURPET = 306, - ERR_PET_NOT_RENAMEABLE = 307, - ERR_QUEST_OBJECTIVE_COMPLETE_S = 308, - ERR_QUEST_UNKNOWN_COMPLETE = 309, - ERR_QUEST_ADD_KILL_SII = 310, - ERR_QUEST_ADD_FOUND_SII = 311, - ERR_QUEST_ADD_ITEM_SII = 312, - ERR_QUEST_ADD_PLAYER_KILL_SII = 313, - ERR_CANNOTCREATEDIRECTORY = 314, - ERR_CANNOTCREATEFILE = 315, - ERR_PLAYER_WRONG_FACTION = 316, - ERR_PLAYER_IS_NEUTRAL = 317, - ERR_BANKSLOT_FAILED_TOO_MANY = 318, - ERR_BANKSLOT_INSUFFICIENT_FUNDS = 319, - ERR_BANKSLOT_NOTBANKER = 320, - ERR_FRIEND_DB_ERROR = 321, - ERR_FRIEND_LIST_FULL = 322, - ERR_FRIEND_ADDED_S = 323, - ERR_BATTLETAG_FRIEND_ADDED_S = 324, - ERR_FRIEND_ONLINE_SS = 325, - ERR_FRIEND_OFFLINE_S = 326, - ERR_FRIEND_NOT_FOUND = 327, - ERR_FRIEND_WRONG_FACTION = 328, - ERR_FRIEND_REMOVED_S = 329, - ERR_BATTLETAG_FRIEND_REMOVED_S = 330, - ERR_FRIEND_ERROR = 331, - ERR_FRIEND_ALREADY_S = 332, - ERR_FRIEND_SELF = 333, - ERR_FRIEND_DELETED = 334, - ERR_IGNORE_FULL = 335, - ERR_IGNORE_SELF = 336, - ERR_IGNORE_NOT_FOUND = 337, - ERR_IGNORE_ALREADY_S = 338, - ERR_IGNORE_ADDED_S = 339, - ERR_IGNORE_REMOVED_S = 340, - ERR_IGNORE_AMBIGUOUS = 341, - ERR_IGNORE_DELETED = 342, - ERR_ONLY_ONE_BOLT = 343, - ERR_ONLY_ONE_AMMO = 344, - ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM = 345, - ERR_WRONG_BAG_TYPE_SUBCLASS = 346, - ERR_CANT_WRAP_STACKABLE = 347, - ERR_CANT_WRAP_EQUIPPED = 348, - ERR_CANT_WRAP_WRAPPED = 349, - ERR_CANT_WRAP_BOUND = 350, - ERR_CANT_WRAP_UNIQUE = 351, - ERR_CANT_WRAP_BAGS = 352, - ERR_OUT_OF_MANA = 353, - ERR_OUT_OF_RAGE = 354, - ERR_OUT_OF_FOCUS = 355, - ERR_OUT_OF_ENERGY = 356, - ERR_OUT_OF_CHI = 357, - ERR_OUT_OF_HEALTH = 358, - ERR_OUT_OF_RUNES = 359, - ERR_OUT_OF_RUNIC_POWER = 360, - ERR_OUT_OF_SOUL_SHARDS = 361, - ERR_OUT_OF_LUNAR_POWER = 362, - ERR_OUT_OF_HOLY_POWER = 363, - ERR_OUT_OF_MAELSTROM = 364, - ERR_OUT_OF_COMBO_POINTS = 365, - ERR_OUT_OF_INSANITY = 366, - ERR_OUT_OF_ESSENCE = 367, - ERR_OUT_OF_ARCANE_CHARGES = 368, - ERR_OUT_OF_FURY = 369, - ERR_OUT_OF_PAIN = 370, - ERR_OUT_OF_POWER_DISPLAY = 371, - ERR_OUT_OF_RUNE_BLOOD = 372, - ERR_OUT_OF_RUNE_FROST = 373, - ERR_OUT_OF_RUNE_UNHOLY = 374, - ERR_OUT_OF_ALTERNATE_QUEST = 375, - ERR_OUT_OF_ALTERNATE_ENCOUNTER = 376, - ERR_OUT_OF_ALTERNATE_MOUNT = 377, - ERR_OUT_OF_BALANCE = 378, - ERR_OUT_OF_HAPPINESS = 379, - ERR_OUT_OF_SHADOW_ORBS = 380, - ERR_OUT_OF_RUNE_CHROMATIC = 381, - ERR_LOOT_GONE = 382, - ERR_MOUNT_FORCEDDISMOUNT = 383, - ERR_AUTOFOLLOW_TOO_FAR = 384, - ERR_UNIT_NOT_FOUND = 385, - ERR_INVALID_FOLLOW_TARGET = 386, - ERR_INVALID_FOLLOW_PVP_COMBAT = 387, - ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT = 388, - ERR_INVALID_INSPECT_TARGET = 389, - ERR_GUILDEMBLEM_SUCCESS = 390, - ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 391, - ERR_GUILDEMBLEM_NOGUILD = 392, - ERR_GUILDEMBLEM_NOTGUILDMASTER = 393, - ERR_GUILDEMBLEM_NOTENOUGHMONEY = 394, - ERR_GUILDEMBLEM_INVALIDVENDOR = 395, - ERR_EMBLEMERROR_NOTABARDGEOSET = 396, - ERR_SPELL_OUT_OF_RANGE = 397, - ERR_COMMAND_NEEDS_TARGET = 398, - ERR_NOAMMO_S = 399, - ERR_TOOBUSYTOFOLLOW = 400, - ERR_DUEL_REQUESTED = 401, - ERR_DUEL_CANCELLED = 402, - ERR_DEATHBINDALREADYBOUND = 403, - ERR_DEATHBIND_SUCCESS_S = 404, - ERR_NOEMOTEWHILERUNNING = 405, - ERR_ZONE_EXPLORED = 406, - ERR_ZONE_EXPLORED_XP = 407, - ERR_INVALID_ITEM_TARGET = 408, - ERR_INVALID_QUEST_TARGET = 409, - ERR_IGNORING_YOU_S = 410, - ERR_FISH_NOT_HOOKED = 411, - ERR_FISH_ESCAPED = 412, - ERR_SPELL_FAILED_NOTUNSHEATHED = 413, - ERR_PETITION_OFFERED_S = 414, - ERR_PETITION_SIGNED = 415, - ERR_PETITION_SIGNED_S = 416, - ERR_PETITION_DECLINED_S = 417, - ERR_PETITION_ALREADY_SIGNED = 418, - ERR_PETITION_RESTRICTED_ACCOUNT_TRIAL = 419, - ERR_PETITION_ALREADY_SIGNED_OTHER = 420, - ERR_PETITION_IN_GUILD = 421, - ERR_PETITION_CREATOR = 422, - ERR_PETITION_NOT_ENOUGH_SIGNATURES = 423, - ERR_PETITION_NOT_SAME_SERVER = 424, - ERR_PETITION_FULL = 425, - ERR_PETITION_ALREADY_SIGNED_BY_S = 426, - ERR_GUILD_NAME_INVALID = 427, - ERR_SPELL_UNLEARNED_S = 428, - ERR_PET_SPELL_ROOTED = 429, - ERR_PET_SPELL_AFFECTING_COMBAT = 430, - ERR_PET_SPELL_OUT_OF_RANGE = 431, - ERR_PET_SPELL_NOT_BEHIND = 432, - ERR_PET_SPELL_TARGETS_DEAD = 433, - ERR_PET_SPELL_DEAD = 434, - ERR_PET_SPELL_NOPATH = 435, - ERR_ITEM_CANT_BE_DESTROYED = 436, - ERR_TICKET_ALREADY_EXISTS = 437, - ERR_TICKET_CREATE_ERROR = 438, - ERR_TICKET_UPDATE_ERROR = 439, - ERR_TICKET_DB_ERROR = 440, - ERR_TICKET_NO_TEXT = 441, - ERR_TICKET_TEXT_TOO_LONG = 442, - ERR_OBJECT_IS_BUSY = 443, - ERR_EXHAUSTION_WELLRESTED = 444, - ERR_EXHAUSTION_RESTED = 445, - ERR_EXHAUSTION_NORMAL = 446, - ERR_EXHAUSTION_TIRED = 447, - ERR_EXHAUSTION_EXHAUSTED = 448, - ERR_NO_ITEMS_WHILE_SHAPESHIFTED = 449, - ERR_CANT_INTERACT_SHAPESHIFTED = 450, - ERR_REALM_NOT_FOUND = 451, - ERR_MAIL_QUEST_ITEM = 452, - ERR_MAIL_BOUND_ITEM = 453, - ERR_MAIL_CONJURED_ITEM = 454, - ERR_MAIL_BAG = 455, - ERR_MAIL_TO_SELF = 456, - ERR_MAIL_TARGET_NOT_FOUND = 457, - ERR_MAIL_DATABASE_ERROR = 458, - ERR_MAIL_DELETE_ITEM_ERROR = 459, - ERR_MAIL_WRAPPED_COD = 460, - ERR_MAIL_CANT_SEND_REALM = 461, - ERR_MAIL_TEMP_RETURN_OUTAGE = 462, - ERR_MAIL_RECEPIENT_CANT_RECEIVE_MAIL = 463, - ERR_MAIL_SENT = 464, - ERR_MAIL_TARGET_IS_TRIAL = 465, - ERR_NOT_HAPPY_ENOUGH = 466, - ERR_USE_CANT_IMMUNE = 467, - ERR_CANT_BE_DISENCHANTED = 468, - ERR_CANT_USE_DISARMED = 469, - ERR_AUCTION_DATABASE_ERROR = 470, - ERR_AUCTION_HIGHER_BID = 471, - ERR_AUCTION_ALREADY_BID = 472, - ERR_AUCTION_OUTBID_S = 473, - ERR_AUCTION_WON_S = 474, - ERR_AUCTION_REMOVED_S = 475, - ERR_AUCTION_BID_PLACED = 476, - ERR_LOGOUT_FAILED = 477, - ERR_QUEST_PUSH_SUCCESS_S = 478, - ERR_QUEST_PUSH_INVALID_S = 479, - ERR_QUEST_PUSH_INVALID_TO_RECIPIENT_S = 480, - ERR_QUEST_PUSH_ACCEPTED_S = 481, - ERR_QUEST_PUSH_DECLINED_S = 482, - ERR_QUEST_PUSH_BUSY_S = 483, - ERR_QUEST_PUSH_DEAD_S = 484, - ERR_QUEST_PUSH_DEAD_TO_RECIPIENT_S = 485, - ERR_QUEST_PUSH_LOG_FULL_S = 486, - ERR_QUEST_PUSH_LOG_FULL_TO_RECIPIENT_S = 487, - ERR_QUEST_PUSH_ONQUEST_S = 488, - ERR_QUEST_PUSH_ONQUEST_TO_RECIPIENT_S = 489, - ERR_QUEST_PUSH_ALREADY_DONE_S = 490, - ERR_QUEST_PUSH_ALREADY_DONE_TO_RECIPIENT_S = 491, - ERR_QUEST_PUSH_NOT_DAILY_S = 492, - ERR_QUEST_PUSH_TIMER_EXPIRED_S = 493, - ERR_QUEST_PUSH_NOT_IN_PARTY_S = 494, - ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_S = 495, - ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_TO_RECIPIENT_S = 496, - ERR_QUEST_PUSH_NOT_ALLOWED_S = 497, - ERR_QUEST_PUSH_PREREQUISITE_S = 498, - ERR_QUEST_PUSH_PREREQUISITE_TO_RECIPIENT_S = 499, - ERR_QUEST_PUSH_LOW_LEVEL_S = 500, - ERR_QUEST_PUSH_LOW_LEVEL_TO_RECIPIENT_S = 501, - ERR_QUEST_PUSH_HIGH_LEVEL_S = 502, - ERR_QUEST_PUSH_HIGH_LEVEL_TO_RECIPIENT_S = 503, - ERR_QUEST_PUSH_CLASS_S = 504, - ERR_QUEST_PUSH_CLASS_TO_RECIPIENT_S = 505, - ERR_QUEST_PUSH_RACE_S = 506, - ERR_QUEST_PUSH_RACE_TO_RECIPIENT_S = 507, - ERR_QUEST_PUSH_LOW_FACTION_S = 508, - ERR_QUEST_PUSH_LOW_FACTION_TO_RECIPIENT_S = 509, - ERR_QUEST_PUSH_HIGH_FACTION_S = 510, - ERR_QUEST_PUSH_HIGH_FACTION_TO_RECIPIENT_S = 511, - ERR_QUEST_PUSH_EXPANSION_S = 512, - ERR_QUEST_PUSH_EXPANSION_TO_RECIPIENT_S = 513, - ERR_QUEST_PUSH_NOT_GARRISON_OWNER_S = 514, - ERR_QUEST_PUSH_NOT_GARRISON_OWNER_TO_RECIPIENT_S = 515, - ERR_QUEST_PUSH_WRONG_COVENANT_S = 516, - ERR_QUEST_PUSH_WRONG_COVENANT_TO_RECIPIENT_S = 517, - ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_S = 518, - ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_TO_RECIPIENT_S = 519, - ERR_QUEST_PUSH_WRONG_FACTION_S = 520, - ERR_QUEST_PUSH_WRONG_FACTION_TO_RECIPIENT_S = 521, - ERR_QUEST_PUSH_CROSS_FACTION_RESTRICTED_S = 522, - ERR_RAID_GROUP_LOWLEVEL = 523, - ERR_RAID_GROUP_ONLY = 524, - ERR_RAID_GROUP_FULL = 525, - ERR_RAID_GROUP_REQUIREMENTS_UNMATCH = 526, - ERR_CORPSE_IS_NOT_IN_INSTANCE = 527, - ERR_PVP_KILL_HONORABLE = 528, - ERR_PVP_KILL_DISHONORABLE = 529, - ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 530, - ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA = 531, - ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S = 532, - ERR_AUTOLOOT_MONEY_S = 533, - ERR_GENERIC_STUNNED = 534, - ERR_GENERIC_THROTTLE = 535, - ERR_CLUB_FINDER_SEARCHING_TOO_FAST = 536, - ERR_TARGET_STUNNED = 537, - ERR_MUST_REPAIR_DURABILITY = 538, - ERR_RAID_YOU_JOINED = 539, - ERR_RAID_YOU_LEFT = 540, - ERR_INSTANCE_GROUP_JOINED_WITH_PARTY = 541, - ERR_INSTANCE_GROUP_JOINED_WITH_RAID = 542, - ERR_RAID_MEMBER_ADDED_S = 543, - ERR_RAID_MEMBER_REMOVED_S = 544, - ERR_INSTANCE_GROUP_ADDED_S = 545, - ERR_INSTANCE_GROUP_REMOVED_S = 546, - ERR_CLICK_ON_ITEM_TO_FEED = 547, - ERR_TOO_MANY_CHAT_CHANNELS = 548, - ERR_LOOT_ROLL_PENDING = 549, - ERR_LOOT_PLAYER_NOT_FOUND = 550, - ERR_NOT_IN_RAID = 551, - ERR_LOGGING_OUT = 552, - ERR_TARGET_LOGGING_OUT = 553, - ERR_NOT_WHILE_MOUNTED = 554, - ERR_NOT_WHILE_SHAPESHIFTED = 555, - ERR_NOT_IN_COMBAT = 556, - ERR_NOT_WHILE_DISARMED = 557, - ERR_PET_BROKEN = 558, - ERR_TALENT_WIPE_ERROR = 559, - ERR_SPEC_WIPE_ERROR = 560, - ERR_GLYPH_WIPE_ERROR = 561, - ERR_PET_SPEC_WIPE_ERROR = 562, - ERR_FEIGN_DEATH_RESISTED = 563, - ERR_MEETING_STONE_IN_QUEUE_S = 564, - ERR_MEETING_STONE_LEFT_QUEUE_S = 565, - ERR_MEETING_STONE_OTHER_MEMBER_LEFT = 566, - ERR_MEETING_STONE_PARTY_KICKED_FROM_QUEUE = 567, - ERR_MEETING_STONE_MEMBER_STILL_IN_QUEUE = 568, - ERR_MEETING_STONE_SUCCESS = 569, - ERR_MEETING_STONE_IN_PROGRESS = 570, - ERR_MEETING_STONE_MEMBER_ADDED_S = 571, - ERR_MEETING_STONE_GROUP_FULL = 572, - ERR_MEETING_STONE_NOT_LEADER = 573, - ERR_MEETING_STONE_INVALID_LEVEL = 574, - ERR_MEETING_STONE_TARGET_NOT_IN_PARTY = 575, - ERR_MEETING_STONE_TARGET_INVALID_LEVEL = 576, - ERR_MEETING_STONE_MUST_BE_LEADER = 577, - ERR_MEETING_STONE_NO_RAID_GROUP = 578, - ERR_MEETING_STONE_NEED_PARTY = 579, - ERR_MEETING_STONE_NOT_FOUND = 580, - ERR_MEETING_STONE_TARGET_IN_VEHICLE = 581, - ERR_GUILDEMBLEM_SAME = 582, - ERR_EQUIP_TRADE_ITEM = 583, - ERR_PVP_TOGGLE_ON = 584, - ERR_PVP_TOGGLE_OFF = 585, - ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS = 586, - ERR_GROUP_JOIN_BATTLEGROUND_DEAD = 587, - ERR_GROUP_JOIN_BATTLEGROUND_S = 588, - ERR_GROUP_JOIN_BATTLEGROUND_FAIL = 589, - ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY = 590, - ERR_SOLO_JOIN_BATTLEGROUND_S = 591, - ERR_JOIN_SINGLE_SCENARIO_S = 592, - ERR_BATTLEGROUND_TOO_MANY_QUEUES = 593, - ERR_BATTLEGROUND_CANNOT_QUEUE_FOR_RATED = 594, - ERR_BATTLEDGROUND_QUEUED_FOR_RATED = 595, - ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 596, - ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 597, - ERR_ALREADY_IN_ARENA_TEAM_S = 598, - ERR_INVALID_PROMOTION_CODE = 599, - ERR_BG_PLAYER_JOINED_SS = 600, - ERR_BG_PLAYER_LEFT_S = 601, - ERR_RESTRICTED_ACCOUNT = 602, - ERR_RESTRICTED_ACCOUNT_TRIAL = 603, - ERR_NOT_ENOUGH_PURCHASED_GAME_TIME = 604, - ERR_PLAY_TIME_EXCEEDED = 605, - ERR_APPROACHING_PARTIAL_PLAY_TIME = 606, - ERR_APPROACHING_PARTIAL_PLAY_TIME_2 = 607, - ERR_APPROACHING_NO_PLAY_TIME = 608, - ERR_APPROACHING_NO_PLAY_TIME_2 = 609, - ERR_UNHEALTHY_TIME = 610, - ERR_CHAT_RESTRICTED_TRIAL = 611, - ERR_CHAT_THROTTLED = 612, - ERR_MAIL_REACHED_CAP = 613, - ERR_INVALID_RAID_TARGET = 614, - ERR_RAID_LEADER_READY_CHECK_START_S = 615, - ERR_READY_CHECK_IN_PROGRESS = 616, - ERR_READY_CHECK_THROTTLED = 617, - ERR_DUNGEON_DIFFICULTY_FAILED = 618, - ERR_DUNGEON_DIFFICULTY_CHANGED_S = 619, - ERR_TRADE_WRONG_REALM = 620, - ERR_TRADE_NOT_ON_TAPLIST = 621, - ERR_CHAT_PLAYER_AMBIGUOUS_S = 622, - ERR_LOOT_CANT_LOOT_THAT_NOW = 623, - ERR_LOOT_MASTER_INV_FULL = 624, - ERR_LOOT_MASTER_UNIQUE_ITEM = 625, - ERR_LOOT_MASTER_OTHER = 626, - ERR_FILTERING_YOU_S = 627, - ERR_USE_PREVENTED_BY_MECHANIC_S = 628, - ERR_ITEM_UNIQUE_EQUIPPABLE = 629, - ERR_LFG_LEADER_IS_LFM_S = 630, - ERR_LFG_PENDING = 631, - ERR_CANT_SPEAK_LANGAGE = 632, - ERR_VENDOR_MISSING_TURNINS = 633, - ERR_BATTLEGROUND_NOT_IN_TEAM = 634, - ERR_NOT_IN_BATTLEGROUND = 635, - ERR_NOT_ENOUGH_HONOR_POINTS = 636, - ERR_NOT_ENOUGH_ARENA_POINTS = 637, - ERR_SOCKETING_REQUIRES_META_GEM = 638, - ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT = 639, - ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM = 640, - ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT = 641, - ERR_SOCKETING_REQUIRES_COGWHEEL_GEM = 642, - ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT = 643, - ERR_SOCKETING_ITEM_TOO_LOW_LEVEL = 644, - ERR_ITEM_MAX_COUNT_SOCKETED = 645, - ERR_SYSTEM_DISABLED = 646, - ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I = 647, - ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 648, - ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 649, - ERR_USER_SQUELCHED = 650, - ERR_ACCOUNT_SILENCED = 651, - ERR_PARTY_MEMBER_SILENCED = 652, - ERR_PARTY_MEMBER_SILENCED_LFG_DELIST = 653, - ERR_TOO_MUCH_GOLD = 654, - ERR_NOT_BARBER_SITTING = 655, - ERR_QUEST_FAILED_CAIS = 656, - ERR_INVITE_RESTRICTED_TRIAL = 657, - ERR_VOICE_IGNORE_FULL = 658, - ERR_VOICE_IGNORE_SELF = 659, - ERR_VOICE_IGNORE_NOT_FOUND = 660, - ERR_VOICE_IGNORE_ALREADY_S = 661, - ERR_VOICE_IGNORE_ADDED_S = 662, - ERR_VOICE_IGNORE_REMOVED_S = 663, - ERR_VOICE_IGNORE_AMBIGUOUS = 664, - ERR_VOICE_IGNORE_DELETED = 665, - ERR_UNKNOWN_MACRO_OPTION_S = 666, - ERR_NOT_DURING_ARENA_MATCH = 667, - ERR_NOT_IN_RATED_BATTLEGROUND = 668, - ERR_PLAYER_SILENCED = 669, - ERR_PLAYER_UNSILENCED = 670, - ERR_COMSAT_DISCONNECT = 671, - ERR_COMSAT_RECONNECT_ATTEMPT = 672, - ERR_COMSAT_CONNECT_FAIL = 673, - ERR_MAIL_INVALID_ATTACHMENT_SLOT = 674, - ERR_MAIL_TOO_MANY_ATTACHMENTS = 675, - ERR_MAIL_INVALID_ATTACHMENT = 676, - ERR_MAIL_ATTACHMENT_EXPIRED = 677, - ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC = 678, - ERR_PROFANE_CHAT_NAME = 679, - ERR_PLAYER_SILENCED_ECHO = 680, - ERR_PLAYER_UNSILENCED_ECHO = 681, - ERR_LOOT_CANT_LOOT_THAT = 682, - ERR_ARENA_EXPIRED_CAIS = 683, - ERR_GROUP_ACTION_THROTTLED = 684, - ERR_ALREADY_PICKPOCKETED = 685, - ERR_NAME_INVALID = 686, - ERR_NAME_NO_NAME = 687, - ERR_NAME_TOO_SHORT = 688, - ERR_NAME_TOO_LONG = 689, - ERR_NAME_MIXED_LANGUAGES = 690, - ERR_NAME_PROFANE = 691, - ERR_NAME_RESERVED = 692, - ERR_NAME_THREE_CONSECUTIVE = 693, - ERR_NAME_INVALID_SPACE = 694, - ERR_NAME_CONSECUTIVE_SPACES = 695, - ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 696, - ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 697, - ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 698, - ERR_RECRUIT_A_FRIEND_NOT_LINKED = 699, - ERR_RECRUIT_A_FRIEND_NOT_NOW = 700, - ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX = 701, - ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN = 702, - ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE = 703, - ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL = 704, - ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 705, - ERR_NOT_SAME_ACCOUNT = 706, - ERR_BAD_ON_USE_ENCHANT = 707, - ERR_TRADE_SELF = 708, - ERR_TOO_MANY_SOCKETS = 709, - ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 710, - ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 711, - ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 712, - ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 713, - ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 714, - ERR_ITEM_INVENTORY_FULL_SATCHEL = 715, - ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 716, - ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 717, - ERR_PURCHASE_LEVEL_TOO_LOW = 718, - ERR_GROUP_SWAP_FAILED = 719, - ERR_INVITE_IN_COMBAT = 720, - ERR_INVALID_GLYPH_SLOT = 721, - ERR_GENERIC_NO_VALID_TARGETS = 722, - ERR_CALENDAR_EVENT_ALERT_S = 723, - ERR_PET_LEARN_SPELL_S = 724, - ERR_PET_LEARN_ABILITY_S = 725, - ERR_PET_SPELL_UNLEARNED_S = 726, - ERR_INVITE_UNKNOWN_REALM = 727, - ERR_INVITE_NO_PARTY_SERVER = 728, - ERR_INVITE_PARTY_BUSY = 729, - ERR_INVITE_PARTY_BUSY_PENDING_REQUEST = 730, - ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST = 731, - ERR_PARTY_TARGET_AMBIGUOUS = 732, - ERR_PARTY_LFG_INVITE_RAID_LOCKED = 733, - ERR_PARTY_LFG_BOOT_LIMIT = 734, - ERR_PARTY_LFG_BOOT_COOLDOWN_S = 735, - ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 736, - ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S = 737, - ERR_PARTY_LFG_BOOT_IN_PROGRESS = 738, - ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 739, - ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED = 740, - ERR_PARTY_LFG_BOOT_VOTE_FAILED = 741, - ERR_PARTY_LFG_BOOT_DISALLOWED_BY_MAP = 742, - ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 743, - ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 744, - ERR_PARTY_LFG_BOOT_VOTE_REGISTERED = 745, - ERR_PARTY_PRIVATE_GROUP_ONLY = 746, - ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 747, - ERR_PARTY_TIME_RUNNING_SEASON_ID_MUST_MATCH = 748, - ERR_RAID_DISALLOWED_BY_LEVEL = 749, - ERR_RAID_DISALLOWED_BY_CROSS_REALM = 750, - ERR_PARTY_ROLE_NOT_AVAILABLE = 751, - ERR_JOIN_LFG_OBJECT_FAILED = 752, - ERR_LFG_REMOVED_LEVELUP = 753, - ERR_LFG_REMOVED_XP_TOGGLE = 754, - ERR_LFG_REMOVED_FACTION_CHANGE = 755, - ERR_BATTLEGROUND_INFO_THROTTLED = 756, - ERR_BATTLEGROUND_ALREADY_IN = 757, - ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED = 758, - ERR_ARENA_TEAM_PERMISSIONS = 759, - ERR_NOT_WHILE_FALLING = 760, - ERR_NOT_WHILE_MOVING = 761, - ERR_NOT_WHILE_FATIGUED = 762, - ERR_MAX_SOCKETS = 763, - ERR_MULTI_CAST_ACTION_TOTEM_S = 764, - ERR_BATTLEGROUND_JOIN_LEVELUP = 765, - ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN = 766, - ERR_BATTLEGROUND_JOIN_XP_GAIN = 767, - ERR_BATTLEGROUND_JOIN_MERCENARY = 768, - ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS = 769, - ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS = 770, - ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS = 771, - ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE = 772, - ERR_RAID_DIFFICULTY_FAILED = 773, - ERR_RAID_DIFFICULTY_CHANGED_S = 774, - ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S = 775, - ERR_RAID_LOCKOUT_CHANGED_S = 776, - ERR_RAID_CONVERTED_TO_PARTY = 777, - ERR_PARTY_CONVERTED_TO_RAID = 778, - ERR_PLAYER_DIFFICULTY_CHANGED_S = 779, - ERR_GMRESPONSE_DB_ERROR = 780, - ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 781, - ERR_ARENA_JOIN_RANGE_INDEX = 782, - ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 783, - ERR_BATTLEGROUND_JOIN_FAILED = 784, - ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 785, - ERR_BATTLEGROUND_JOIN_RESPEC = 786, - ERR_BATTLEGROUND_INVITATION_DECLINED = 787, - ERR_BATTLEGROUND_INVITATION_DECLINED_BY = 788, - ERR_BATTLEGROUND_JOIN_TIMED_OUT = 789, - ERR_BATTLEGROUND_DUPE_QUEUE = 790, - ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 791, - ERR_IN_BATTLEGROUND_RESPEC = 792, - ERR_MAIL_LIMITED_DURATION_ITEM = 793, - ERR_YELL_RESTRICTED_TRIAL = 794, - ERR_CHAT_RAID_RESTRICTED_TRIAL = 795, - ERR_LFG_ROLE_CHECK_FAILED = 796, - ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT = 797, - ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE = 798, - ERR_LFG_READY_CHECK_FAILED = 799, - ERR_LFG_READY_CHECK_FAILED_TIMEOUT = 800, - ERR_LFG_GROUP_FULL = 801, - ERR_LFG_NO_LFG_OBJECT = 802, - ERR_LFG_NO_SLOTS_PLAYER = 803, - ERR_LFG_NO_SLOTS_PARTY = 804, - ERR_LFG_NO_SPEC = 805, - ERR_LFG_MISMATCHED_SLOTS = 806, - ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM = 807, - ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 808, - ERR_LFG_MEMBERS_NOT_PRESENT = 809, - ERR_LFG_GET_INFO_TIMEOUT = 810, - ERR_LFG_INVALID_SLOT = 811, - ERR_LFG_DESERTER_PLAYER = 812, - ERR_LFG_DESERTER_PARTY = 813, - ERR_LFG_DEAD = 814, - ERR_LFG_RANDOM_COOLDOWN_PLAYER = 815, - ERR_LFG_RANDOM_COOLDOWN_PARTY = 816, - ERR_LFG_TOO_MANY_MEMBERS = 817, - ERR_LFG_TOO_FEW_MEMBERS = 818, - ERR_LFG_PROPOSAL_FAILED = 819, - ERR_LFG_PROPOSAL_DECLINED_SELF = 820, - ERR_LFG_PROPOSAL_DECLINED_PARTY = 821, - ERR_LFG_NO_SLOTS_SELECTED = 822, - ERR_LFG_NO_ROLES_SELECTED = 823, - ERR_LFG_ROLE_CHECK_INITIATED = 824, - ERR_LFG_READY_CHECK_INITIATED = 825, - ERR_LFG_PLAYER_DECLINED_ROLE_CHECK = 826, - ERR_LFG_PLAYER_DECLINED_READY_CHECK = 827, - ERR_LFG_LOREWALKING = 828, - ERR_LFG_JOINED_QUEUE = 829, - ERR_LFG_JOINED_FLEX_QUEUE = 830, - ERR_LFG_JOINED_RF_QUEUE = 831, - ERR_LFG_JOINED_SCENARIO_QUEUE = 832, - ERR_LFG_JOINED_WORLD_PVP_QUEUE = 833, - ERR_LFG_JOINED_BATTLEFIELD_QUEUE = 834, - ERR_LFG_JOINED_LIST = 835, - ERR_QUEUED_PLUNDERSTORM = 836, - ERR_LFG_LEFT_QUEUE = 837, - ERR_LFG_LEFT_LIST = 838, - ERR_LFG_ROLE_CHECK_ABORTED = 839, - ERR_LFG_READY_CHECK_ABORTED = 840, - ERR_LFG_CANT_USE_BATTLEGROUND = 841, - ERR_LFG_CANT_USE_DUNGEONS = 842, - ERR_LFG_REASON_TOO_MANY_LFG = 843, - ERR_LFG_FARM_LIMIT = 844, - ERR_LFG_NO_CROSS_FACTION_PARTIES = 845, - ERR_INVALID_TELEPORT_LOCATION = 846, - ERR_TOO_FAR_TO_INTERACT = 847, - ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS = 848, - ERR_DIFFICULTY_CHANGE_COOLDOWN_S = 849, - ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S = 850, - ERR_DIFFICULTY_CHANGE_WORLDSTATE = 851, - ERR_DIFFICULTY_CHANGE_ENCOUNTER = 852, - ERR_DIFFICULTY_CHANGE_COMBAT = 853, - ERR_DIFFICULTY_CHANGE_PLAYER_BUSY = 854, - ERR_DIFFICULTY_CHANGE_PLAYER_ON_VEHICLE = 855, - ERR_DIFFICULTY_CHANGE_ALREADY_STARTED = 856, - ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S = 857, - ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING = 858, - ERR_ARENA_TEAM_PARTY_SIZE = 859, - ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 860, - ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 861, - ERR_SOLO_RBG_WARGAME_GROUP_SIZE = 862, - ERR_SOLO_RBG_WARGAME_GROUP_COMP = 863, - ERR_SOLO_MIN_ITEM_LEVEL = 864, - ERR_PVP_PLAYER_ABANDONED = 865, - ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER = 866, - ERR_QUEST_FORCE_REMOVED_S = 867, - ERR_ATTACK_NO_ACTIONS = 868, - ERR_IN_RANDOM_BG = 869, - ERR_IN_NON_RANDOM_BG = 870, - ERR_BN_FRIEND_SELF = 871, - ERR_BN_FRIEND_ALREADY = 872, - ERR_BN_FRIEND_BLOCKED = 873, - ERR_BN_FRIEND_LIST_FULL = 874, - ERR_BN_FRIEND_REQUEST_SENT = 875, - ERR_BN_BROADCAST_THROTTLE = 876, - ERR_BG_DEVELOPER_ONLY = 877, - ERR_CURRENCY_SPELL_SLOT_MISMATCH = 878, - ERR_CURRENCY_NOT_TRADABLE = 879, - ERR_REQUIRES_EXPANSION_S = 880, - ERR_QUEST_FAILED_SPELL = 881, - ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 882, - ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 883, - ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 884, - ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 885, - ERR_TALENT_FAILED_UNKNOWN = 886, - ERR_TALENT_FAILED_IN_COMBAT = 887, - ERR_TALENT_FAILED_IN_PVP_MATCH = 888, - ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 889, - ERR_WARGAME_REQUEST_FAILURE = 890, - ERR_RANK_REQUIRES_AUTHENTICATOR = 891, - ERR_GUILD_BANK_VOUCHER_FAILED = 892, - ERR_WARGAME_REQUEST_SENT = 893, - ERR_REQUIRES_ACHIEVEMENT_I = 894, - ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 895, - ERR_CANT_BUY_QUANTITY = 896, - ERR_ITEM_IS_BATTLE_PAY_LOCKED = 897, - ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 898, - ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 899, - ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 900, - ERR_INSUFF_TRACKED_CURRENCY_IS = 901, - ERR_NOT_ON_TOURNAMENT_REALM = 902, - ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 903, - ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 904, - ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 905, - ERR_CANT_DO_THAT_IN_A_GROUP = 906, - ERR_GUILD_LEADER_REPLACED = 907, - ERR_TRANSMOGRIFY_CANT_EQUIP = 908, - ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 909, - ERR_TRANSMOGRIFY_NOT_SOULBOUND = 910, - ERR_TRANSMOGRIFY_INVALID_SOURCE = 911, - ERR_TRANSMOGRIFY_INVALID_DESTINATION = 912, - ERR_TRANSMOGRIFY_MISMATCH = 913, - ERR_TRANSMOGRIFY_LEGENDARY = 914, - ERR_TRANSMOGRIFY_SAME_ITEM = 915, - ERR_TRANSMOGRIFY_SAME_APPEARANCE = 916, - ERR_TRANSMOGRIFY_NOT_EQUIPPED = 917, - ERR_VOID_DEPOSIT_FULL = 918, - ERR_VOID_WITHDRAW_FULL = 919, - ERR_VOID_STORAGE_WRAPPED = 920, - ERR_VOID_STORAGE_STACKABLE = 921, - ERR_VOID_STORAGE_UNBOUND = 922, - ERR_VOID_STORAGE_REPAIR = 923, - ERR_VOID_STORAGE_CHARGES = 924, - ERR_VOID_STORAGE_QUEST = 925, - ERR_VOID_STORAGE_CONJURED = 926, - ERR_VOID_STORAGE_MAIL = 927, - ERR_VOID_STORAGE_BAG = 928, - ERR_VOID_TRANSFER_STORAGE_FULL = 929, - ERR_VOID_TRANSFER_INV_FULL = 930, - ERR_VOID_TRANSFER_INTERNAL_ERROR = 931, - ERR_VOID_TRANSFER_ITEM_INVALID = 932, - ERR_DIFFICULTY_DISABLED_IN_LFG = 933, - ERR_VOID_STORAGE_UNIQUE = 934, - ERR_VOID_STORAGE_LOOT = 935, - ERR_VOID_STORAGE_HOLIDAY = 936, - ERR_VOID_STORAGE_DURATION = 937, - ERR_VOID_STORAGE_LOAD_FAILED = 938, - ERR_VOID_STORAGE_INVALID_ITEM = 939, - ERR_VOID_STORAGE_ACCOUNT_ITEM = 940, - ERR_PARENTAL_CONTROLS_CHAT_MUTED = 941, - ERR_SOR_START_EXPERIENCE_INCOMPLETE = 942, - ERR_SOR_INVALID_EMAIL = 943, - ERR_SOR_INVALID_COMMENT = 944, - ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 945, - ERR_CHALLENGE_MODE_RESET_KEYSTONE = 946, - ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 947, - ERR_REPORT_SUBMITTED_SUCCESSFULLY = 948, - ERR_REPORT_SUBMISSION_FAILED = 949, - ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 950, - ERR_BUG_SUBMITTED_SUCCESSFULLY = 951, - ERR_CHALLENGE_MODE_ENABLED = 952, - ERR_CHALLENGE_MODE_DISABLED = 953, - ERR_PETBATTLE_CREATE_FAILED = 954, - ERR_PETBATTLE_NOT_HERE = 955, - ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 956, - ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 957, - ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 958, - ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 959, - ERR_PETBATTLE_NOT_WHILE_DEAD = 960, - ERR_PETBATTLE_NOT_WHILE_FLYING = 961, - ERR_PETBATTLE_TARGET_INVALID = 962, - ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 963, - ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 964, - ERR_PETBATTLE_NOT_A_TRAINER = 965, - ERR_PETBATTLE_DECLINED = 966, - ERR_PETBATTLE_IN_BATTLE = 967, - ERR_PETBATTLE_INVALID_LOADOUT = 968, - ERR_PETBATTLE_ALL_PETS_DEAD = 969, - ERR_PETBATTLE_NO_PETS_IN_SLOTS = 970, - ERR_PETBATTLE_NO_ACCOUNT_LOCK = 971, - ERR_PETBATTLE_WILD_PET_TAPPED = 972, - ERR_PETBATTLE_RESTRICTED_ACCOUNT = 973, - ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 974, - ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 975, - ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 976, - ERR_CANT_HAVE_MORE_PETS = 977, - ERR_PVP_MAP_NOT_FOUND = 978, - ERR_PVP_MAP_NOT_SET = 979, - ERR_PETBATTLE_QUEUE_QUEUED = 980, - ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 981, - ERR_PETBATTLE_QUEUE_JOIN_FAILED = 982, - ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 983, - ERR_PETBATTLE_QUEUE_REMOVED = 984, - ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 985, - ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 986, - ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 987, - ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 988, - ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 989, - ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 990, - ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 991, - ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 992, - ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 993, - ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 994, - ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 995, - ERR_PETBATTLE_QUEUE_SLOT_DEAD = 996, - ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 997, - ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 998, - ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 999, - ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 1000, - ERR_HAS_RESTRICTION = 1001, - ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 1002, - ERR_ITEM_UPGRADE_NO_PATH = 1003, - ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 1004, - ERR_BONUS_ROLL_EMPTY = 1005, - ERR_CHALLENGE_MODE_FULL = 1006, - ERR_CHALLENGE_MODE_IN_PROGRESS = 1007, - ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 1008, - ERR_BATTLETAG_FRIEND_NOT_FOUND = 1009, - ERR_BATTLETAG_FRIEND_NOT_VALID = 1010, - ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 1011, - ERR_BATTLETAG_FRIEND_THROTTLED = 1012, - ERR_BATTLETAG_FRIEND_SUCCESS = 1013, - ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 1014, - ERR_PETBATTLE_INTERNAL = 1015, - ERR_CANT_CAGE_PET_YET = 1016, - ERR_NO_LOOT_IN_CHALLENGE_MODE = 1017, - ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 1018, - ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 1019, - ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 1020, - ERR_RECRUIT_A_FRIEND_FAILED = 1021, - ERR_SET_LOOT_PERSONAL = 1022, - ERR_SET_LOOT_METHOD_FAILED_COMBAT = 1023, - ERR_REAGENT_BANK_FULL = 1024, - ERR_REAGENT_BANK_LOCKED = 1025, - ERR_GARRISON_BUILDING_EXISTS = 1026, - ERR_GARRISON_INVALID_PLOT = 1027, - ERR_GARRISON_INVALID_BUILDINGID = 1028, - ERR_GARRISON_INVALID_PLOT_BUILDING = 1029, - ERR_GARRISON_REQUIRES_BLUEPRINT = 1030, - ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1031, - ERR_GARRISON_NOT_ENOUGH_GOLD = 1032, - ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1033, - ERR_ALREADY_USING_LFG_LIST = 1034, - ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1035, - ERR_TOY_USE_LIMIT_REACHED = 1036, - ERR_TOY_ALREADY_KNOWN = 1037, - ERR_TRANSMOG_SET_ALREADY_KNOWN = 1038, - ERR_NOT_ENOUGH_CURRENCY = 1039, - ERR_SPEC_IS_DISABLED = 1040, - ERR_FEATURE_RESTRICTED_TRIAL = 1041, - ERR_CANT_BE_OBLITERATED = 1042, - ERR_CANT_BE_SCRAPPED = 1043, - ERR_CANT_BE_RECRAFTED = 1044, - ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1045, - ERR_MUST_EQUIP_ARTIFACT = 1046, - ERR_CANT_DO_THAT_RIGHT_NOW = 1047, - ERR_AFFECTING_COMBAT = 1048, - ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1049, - ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1050, - ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1051, - ERR_MOVIE_RECORDING_WARNING_PERF = 1052, - ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1053, - ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1054, - ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1055, - ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1056, - ERR_NO_CHALLENGE_MODE_REWARD = 1057, - ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1058, - ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1059, - ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1060, - ERR_TALENT_FAILED_REST_AREA = 1061, - ERR_CANNOT_ABANDON_LAST_PET = 1062, - ERR_TEST_CVAR_SET_SSS = 1063, - ERR_QUEST_TURN_IN_FAIL_REASON = 1064, - ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1065, - ERR_TALENT_GRANTED_BY_AURA = 1066, - ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1067, - ERR_GLYPH_TARGET_NOT_AVAILABLE = 1068, - ERR_PVP_WARMODE_TOGGLE_ON = 1069, - ERR_PVP_WARMODE_TOGGLE_OFF = 1070, - ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1071, - ERR_SPELL_FAILED_CANT_FLY_HERE = 1072, - ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1073, - ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1074, - ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1075, - ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1076, - ERR_VOICE_CHAT_SERVICE_LOST = 1077, - ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1078, - ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1079, - ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1080, - ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1081, - ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1082, - ERR_VOICE_CHAT_PLAYER_SILENCED = 1083, - ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1084, - ERR_VOICE_CHAT_DISABLED = 1085, - ERR_NO_PVP_REWARD = 1086, - ERR_CLAIMED_PVP_REWARD = 1087, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1088, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1089, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1090, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1091, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1092, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1093, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1094, - ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1095, - ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1096, - ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1097, - ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1098, - ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1099, - ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1100, - ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1101, - ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1102, - ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1103, - ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1104, - ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1105, - ERR_SOCKETING_REQUIRES_TINKER_GEM = 1106, - ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1107, - ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM = 1108, - ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT = 1109, - ERR_SOCKETING_REQUIRES_FRAGRANCE_GEM = 1110, - ERR_SOCKETING_FRAGRANCE_GEM_ONLY_IN_FRAGRANCESLOT = 1111, - ERR_SOCKETING_REQUIRES_SINGING_THUNDER_GEM = 1112, - ERR_SOCKETING_SINGINGTHUNDER_GEM_ONLY_IN_SINGINGTHUNDERSLOT = 1113, - ERR_SOCKETING_REQUIRES_SINGING_SEA_GEM = 1114, - ERR_SOCKETING_SINGINGSEA_GEM_ONLY_IN_SINGINGSEASLOT = 1115, - ERR_SOCKETING_REQUIRES_SINGING_WIND_GEM = 1116, - ERR_SOCKETING_SINGINGWIND_GEM_ONLY_IN_SINGINGWINDSLOT = 1117, - ERR_LEVEL_LINKING_RESULT_LINKED = 1118, - ERR_LEVEL_LINKING_RESULT_UNLINKED = 1119, - ERR_CLUB_FINDER_ERROR_POST_CLUB = 1120, - ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1121, - ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1122, - ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1123, - ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1124, - ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1125, - ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1126, - ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1127, - ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1128, - ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1129, - ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1130, - ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1131, - ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1132, - ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1133, - ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1134, - ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1135, - ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1136, - ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT = 1137, - ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1138, - ERR_SOULBIND_INVALID_CONDUIT = 1139, - ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1140, - ERR_SOULBIND_INVALID_TALENT = 1141, - ERR_SOULBIND_DUPLICATE_CONDUIT = 1142, - ERR_ACTIVATE_SOULBIND_S = 1143, - ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1144, - ERR_CANT_USE_PROFANITY = 1145, - ERR_NOT_IN_PET_BATTLE = 1146, - ERR_NOT_IN_NPE = 1147, - ERR_NO_SPEC = 1148, - ERR_NO_DOMINATIONSHARD_OVERWRITE = 1149, - ERR_USE_WEEKLY_REWARDS_DISABLED = 1150, - ERR_CROSS_FACTION_GROUP_JOINED = 1151, - ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1152, - ERR_EQUIPABLESPELLS_SLOTS_FULL = 1153, - ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN = 1154, - ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 1155, - ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK = 1156, - ERR_NO_REFUNDABLE_ITEM_IN_ACCOUNT_BANK = 1157, - ERR_CANT_DELETE_IN_ACCOUNT_BANK = 1158, - ERR_NO_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1159, - ERR_NO_OPEN_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1160, - ERR_CANT_TRADE_ACCOUNT_ITEM = 1161, - ERR_NO_ACCOUNT_INVENTORY_LOCK = 1162, - ERR_BANK_NOT_ACCESSIBLE = 1163, - ERR_TOO_MANY_ACCOUNT_BANK_TABS = 1164, - ERR_ACCOUNT_BANK_TAB_NOT_UNLOCKED = 1165, - ERR_ACCOUNT_MONEY_LOCKED = 1166, - ERR_BANK_TAB_INVALID_NAME = 1167, - ERR_BANK_TAB_INVALID_TEXT = 1168, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL = 1169, - ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT = 1170, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED = 1171, - ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID = 1172, - ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED = 1173, - ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED = 1174, - ERR_WOW_LABS_SET_WOW_LABS_AREA_ID_FAILED = 1175, - ERR_PLUNDERSTORM_CANNOT_QUEUE = 1176, - ERR_TARGET_IS_SELF_FOUND_CANNOT_TRADE = 1177, - ERR_PLAYER_IS_SELF_FOUND_CANNOT_TRADE = 1178, - ERR_MAIL_RECEPIENT_IS_SELF_FOUND_CANNOT_RECEIVE_MAIL = 1179, - ERR_PLAYER_IS_SELF_FOUND_CANNOT_SEND_MAIL = 1180, - ERR_PLAYER_IS_SELF_FOUND_CANNOT_USE_AUCTION_HOUSE = 1181, - ERR_MAIL_TARGET_CANNOT_RECEIVE_MAIL = 1182, - ERR_REMIX_INVALID_TRANSFER_REQUEST = 1183, - ERR_CURRENCY_TRANSFER_INVALID_CHARACTER = 1184, - ERR_CURRENCY_TRANSFER_INVALID_CURRENCY = 1185, - ERR_CURRENCY_TRANSFER_INSUFFICIENT_CURRENCY = 1186, - ERR_CURRENCY_TRANSFER_MAX_QUANTITY = 1187, - ERR_CURRENCY_TRANSFER_NO_VALID_SOURCE = 1188, - ERR_CURRENCY_TRANSFER_CHARACTER_LOGGED_IN = 1189, - ERR_CURRENCY_TRANSFER_SERVER_ERROR = 1190, - ERR_CURRENCY_TRANSFER_UNMET_REQUIREMENTS = 1191, - ERR_CURRENCY_TRANSFER_TRANSACTION_IN_PROGRESS = 1192, - ERR_CURRENCY_TRANSFER_DISABLED = 1193, + ERR_SET_LOOT_NBG = 297, + ERR_SET_LOOT_THRESHOLD_S = 298, + ERR_NEW_LOOT_MASTER_S = 299, + ERR_SPECIFY_MASTER_LOOTER = 300, + ERR_LOOT_SPEC_CHANGED_S = 301, + ERR_TAME_FAILED = 302, + ERR_CHAT_WHILE_DEAD = 303, + ERR_CHAT_PLAYER_NOT_FOUND_S = 304, + ERR_NEWTAXIPATH = 305, + ERR_NO_PET = 306, + ERR_NOTYOURPET = 307, + ERR_PET_NOT_RENAMEABLE = 308, + ERR_QUEST_OBJECTIVE_COMPLETE_S = 309, + ERR_QUEST_UNKNOWN_COMPLETE = 310, + ERR_QUEST_ADD_KILL_SII = 311, + ERR_QUEST_ADD_FOUND_SII = 312, + ERR_QUEST_ADD_ITEM_SII = 313, + ERR_QUEST_ADD_PLAYER_KILL_SII = 314, + ERR_CANNOTCREATEDIRECTORY = 315, + ERR_CANNOTCREATEFILE = 316, + ERR_PLAYER_WRONG_FACTION = 317, + ERR_PLAYER_IS_NEUTRAL = 318, + ERR_BANKSLOT_FAILED_TOO_MANY = 319, + ERR_BANKSLOT_INSUFFICIENT_FUNDS = 320, + ERR_BANKSLOT_NOTBANKER = 321, + ERR_FRIEND_DB_ERROR = 322, + ERR_FRIEND_LIST_FULL = 323, + ERR_FRIEND_ADDED_S = 324, + ERR_BATTLETAG_FRIEND_ADDED_S = 325, + ERR_FRIEND_ONLINE_SS = 326, + ERR_FRIEND_OFFLINE_S = 327, + ERR_FRIEND_NOT_FOUND = 328, + ERR_FRIEND_WRONG_FACTION = 329, + ERR_FRIEND_REMOVED_S = 330, + ERR_BATTLETAG_FRIEND_REMOVED_S = 331, + ERR_FRIEND_ERROR = 332, + ERR_FRIEND_ALREADY_S = 333, + ERR_FRIEND_SELF = 334, + ERR_FRIEND_DELETED = 335, + ERR_IGNORE_FULL = 336, + ERR_IGNORE_SELF = 337, + ERR_IGNORE_NOT_FOUND = 338, + ERR_IGNORE_ALREADY_S = 339, + ERR_IGNORE_ADDED_S = 340, + ERR_IGNORE_REMOVED_S = 341, + ERR_IGNORE_AMBIGUOUS = 342, + ERR_IGNORE_DELETED = 343, + ERR_ONLY_ONE_BOLT = 344, + ERR_ONLY_ONE_AMMO = 345, + ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM = 346, + ERR_WRONG_BAG_TYPE_SUBCLASS = 347, + ERR_CANT_WRAP_STACKABLE = 348, + ERR_CANT_WRAP_EQUIPPED = 349, + ERR_CANT_WRAP_WRAPPED = 350, + ERR_CANT_WRAP_BOUND = 351, + ERR_CANT_WRAP_UNIQUE = 352, + ERR_CANT_WRAP_BAGS = 353, + ERR_OUT_OF_MANA = 354, + ERR_OUT_OF_RAGE = 355, + ERR_OUT_OF_FOCUS = 356, + ERR_OUT_OF_ENERGY = 357, + ERR_OUT_OF_CHI = 358, + ERR_OUT_OF_HEALTH = 359, + ERR_OUT_OF_RUNES = 360, + ERR_OUT_OF_RUNIC_POWER = 361, + ERR_OUT_OF_SOUL_SHARDS = 362, + ERR_OUT_OF_LUNAR_POWER = 363, + ERR_OUT_OF_HOLY_POWER = 364, + ERR_OUT_OF_MAELSTROM = 365, + ERR_OUT_OF_COMBO_POINTS = 366, + ERR_OUT_OF_INSANITY = 367, + ERR_OUT_OF_ESSENCE = 368, + ERR_OUT_OF_ARCANE_CHARGES = 369, + ERR_OUT_OF_FURY = 370, + ERR_OUT_OF_PAIN = 371, + ERR_OUT_OF_POWER_DISPLAY = 372, + ERR_OUT_OF_RUNE_BLOOD = 373, + ERR_OUT_OF_RUNE_FROST = 374, + ERR_OUT_OF_RUNE_UNHOLY = 375, + ERR_OUT_OF_ALTERNATE_QUEST = 376, + ERR_OUT_OF_ALTERNATE_ENCOUNTER = 377, + ERR_OUT_OF_ALTERNATE_MOUNT = 378, + ERR_OUT_OF_BALANCE = 379, + ERR_OUT_OF_HAPPINESS = 380, + ERR_OUT_OF_SHADOW_ORBS = 381, + ERR_OUT_OF_RUNE_CHROMATIC = 382, + ERR_LOOT_GONE = 383, + ERR_MOUNT_FORCEDDISMOUNT = 384, + ERR_AUTOFOLLOW_TOO_FAR = 385, + ERR_UNIT_NOT_FOUND = 386, + ERR_INVALID_FOLLOW_TARGET = 387, + ERR_INVALID_FOLLOW_PVP_COMBAT = 388, + ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT = 389, + ERR_INVALID_INSPECT_TARGET = 390, + ERR_GUILDEMBLEM_SUCCESS = 391, + ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 392, + ERR_GUILDEMBLEM_NOGUILD = 393, + ERR_GUILDEMBLEM_NOTGUILDMASTER = 394, + ERR_GUILDEMBLEM_NOTENOUGHMONEY = 395, + ERR_GUILDEMBLEM_INVALIDVENDOR = 396, + ERR_EMBLEMERROR_NOTABARDGEOSET = 397, + ERR_SPELL_OUT_OF_RANGE = 398, + ERR_COMMAND_NEEDS_TARGET = 399, + ERR_NOAMMO_S = 400, + ERR_TOOBUSYTOFOLLOW = 401, + ERR_DUEL_REQUESTED = 402, + ERR_DUEL_CANCELLED = 403, + ERR_DEATHBINDALREADYBOUND = 404, + ERR_DEATHBIND_SUCCESS_S = 405, + ERR_NOEMOTEWHILERUNNING = 406, + ERR_ZONE_EXPLORED = 407, + ERR_ZONE_EXPLORED_XP = 408, + ERR_INVALID_ITEM_TARGET = 409, + ERR_INVALID_QUEST_TARGET = 410, + ERR_IGNORING_YOU_S = 411, + ERR_FISH_NOT_HOOKED = 412, + ERR_FISH_ESCAPED = 413, + ERR_SPELL_FAILED_NOTUNSHEATHED = 414, + ERR_PETITION_OFFERED_S = 415, + ERR_PETITION_SIGNED = 416, + ERR_PETITION_SIGNED_S = 417, + ERR_PETITION_DECLINED_S = 418, + ERR_PETITION_ALREADY_SIGNED = 419, + ERR_PETITION_RESTRICTED_ACCOUNT_TRIAL = 420, + ERR_PETITION_ALREADY_SIGNED_OTHER = 421, + ERR_PETITION_IN_GUILD = 422, + ERR_PETITION_CREATOR = 423, + ERR_PETITION_NOT_ENOUGH_SIGNATURES = 424, + ERR_PETITION_NOT_SAME_SERVER = 425, + ERR_PETITION_FULL = 426, + ERR_PETITION_ALREADY_SIGNED_BY_S = 427, + ERR_GUILD_NAME_INVALID = 428, + ERR_SPELL_UNLEARNED_S = 429, + ERR_PET_SPELL_ROOTED = 430, + ERR_PET_SPELL_AFFECTING_COMBAT = 431, + ERR_PET_SPELL_OUT_OF_RANGE = 432, + ERR_PET_SPELL_NOT_BEHIND = 433, + ERR_PET_SPELL_TARGETS_DEAD = 434, + ERR_PET_SPELL_DEAD = 435, + ERR_PET_SPELL_NOPATH = 436, + ERR_ITEM_CANT_BE_DESTROYED = 437, + ERR_TICKET_ALREADY_EXISTS = 438, + ERR_TICKET_CREATE_ERROR = 439, + ERR_TICKET_UPDATE_ERROR = 440, + ERR_TICKET_DB_ERROR = 441, + ERR_TICKET_NO_TEXT = 442, + ERR_TICKET_TEXT_TOO_LONG = 443, + ERR_OBJECT_IS_BUSY = 444, + ERR_EXHAUSTION_WELLRESTED = 445, + ERR_EXHAUSTION_RESTED = 446, + ERR_EXHAUSTION_NORMAL = 447, + ERR_EXHAUSTION_TIRED = 448, + ERR_EXHAUSTION_EXHAUSTED = 449, + ERR_NO_ITEMS_WHILE_SHAPESHIFTED = 450, + ERR_CANT_INTERACT_SHAPESHIFTED = 451, + ERR_REALM_NOT_FOUND = 452, + ERR_MAIL_QUEST_ITEM = 453, + ERR_MAIL_BOUND_ITEM = 454, + ERR_MAIL_CONJURED_ITEM = 455, + ERR_MAIL_BAG = 456, + ERR_MAIL_TO_SELF = 457, + ERR_MAIL_TARGET_NOT_FOUND = 458, + ERR_MAIL_DATABASE_ERROR = 459, + ERR_MAIL_DELETE_ITEM_ERROR = 460, + ERR_MAIL_WRAPPED_COD = 461, + ERR_MAIL_CANT_SEND_REALM = 462, + ERR_MAIL_TEMP_RETURN_OUTAGE = 463, + ERR_MAIL_RECEPIENT_CANT_RECEIVE_MAIL = 464, + ERR_MAIL_SENT = 465, + ERR_MAIL_TARGET_IS_TRIAL = 466, + ERR_NOT_HAPPY_ENOUGH = 467, + ERR_USE_CANT_IMMUNE = 468, + ERR_CANT_BE_DISENCHANTED = 469, + ERR_CANT_USE_DISARMED = 470, + ERR_AUCTION_DATABASE_ERROR = 471, + ERR_AUCTION_HIGHER_BID = 472, + ERR_AUCTION_ALREADY_BID = 473, + ERR_AUCTION_OUTBID_S = 474, + ERR_AUCTION_WON_S = 475, + ERR_AUCTION_REMOVED_S = 476, + ERR_AUCTION_BID_PLACED = 477, + ERR_LOGOUT_FAILED = 478, + ERR_QUEST_PUSH_SUCCESS_S = 479, + ERR_QUEST_PUSH_INVALID_S = 480, + ERR_QUEST_PUSH_INVALID_TO_RECIPIENT_S = 481, + ERR_QUEST_PUSH_ACCEPTED_S = 482, + ERR_QUEST_PUSH_DECLINED_S = 483, + ERR_QUEST_PUSH_BUSY_S = 484, + ERR_QUEST_PUSH_DEAD_S = 485, + ERR_QUEST_PUSH_DEAD_TO_RECIPIENT_S = 486, + ERR_QUEST_PUSH_LOG_FULL_S = 487, + ERR_QUEST_PUSH_LOG_FULL_TO_RECIPIENT_S = 488, + ERR_QUEST_PUSH_ONQUEST_S = 489, + ERR_QUEST_PUSH_ONQUEST_TO_RECIPIENT_S = 490, + ERR_QUEST_PUSH_ALREADY_DONE_S = 491, + ERR_QUEST_PUSH_ALREADY_DONE_TO_RECIPIENT_S = 492, + ERR_QUEST_PUSH_NOT_DAILY_S = 493, + ERR_QUEST_PUSH_TIMER_EXPIRED_S = 494, + ERR_QUEST_PUSH_NOT_IN_PARTY_S = 495, + ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_S = 496, + ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_TO_RECIPIENT_S = 497, + ERR_QUEST_PUSH_NOT_ALLOWED_S = 498, + ERR_QUEST_PUSH_PREREQUISITE_S = 499, + ERR_QUEST_PUSH_PREREQUISITE_TO_RECIPIENT_S = 500, + ERR_QUEST_PUSH_LOW_LEVEL_S = 501, + ERR_QUEST_PUSH_LOW_LEVEL_TO_RECIPIENT_S = 502, + ERR_QUEST_PUSH_HIGH_LEVEL_S = 503, + ERR_QUEST_PUSH_HIGH_LEVEL_TO_RECIPIENT_S = 504, + ERR_QUEST_PUSH_CLASS_S = 505, + ERR_QUEST_PUSH_CLASS_TO_RECIPIENT_S = 506, + ERR_QUEST_PUSH_RACE_S = 507, + ERR_QUEST_PUSH_RACE_TO_RECIPIENT_S = 508, + ERR_QUEST_PUSH_LOW_FACTION_S = 509, + ERR_QUEST_PUSH_LOW_FACTION_TO_RECIPIENT_S = 510, + ERR_QUEST_PUSH_HIGH_FACTION_S = 511, + ERR_QUEST_PUSH_HIGH_FACTION_TO_RECIPIENT_S = 512, + ERR_QUEST_PUSH_EXPANSION_S = 513, + ERR_QUEST_PUSH_EXPANSION_TO_RECIPIENT_S = 514, + ERR_QUEST_PUSH_NOT_GARRISON_OWNER_S = 515, + ERR_QUEST_PUSH_NOT_GARRISON_OWNER_TO_RECIPIENT_S = 516, + ERR_QUEST_PUSH_WRONG_COVENANT_S = 517, + ERR_QUEST_PUSH_WRONG_COVENANT_TO_RECIPIENT_S = 518, + ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_S = 519, + ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_TO_RECIPIENT_S = 520, + ERR_QUEST_PUSH_WRONG_FACTION_S = 521, + ERR_QUEST_PUSH_WRONG_FACTION_TO_RECIPIENT_S = 522, + ERR_QUEST_PUSH_CROSS_FACTION_RESTRICTED_S = 523, + ERR_RAID_GROUP_LOWLEVEL = 524, + ERR_RAID_GROUP_ONLY = 525, + ERR_RAID_GROUP_FULL = 526, + ERR_RAID_GROUP_REQUIREMENTS_UNMATCH = 527, + ERR_CORPSE_IS_NOT_IN_INSTANCE = 528, + ERR_PVP_KILL_HONORABLE = 529, + ERR_PVP_KILL_DISHONORABLE = 530, + ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 531, + ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA = 532, + ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S = 533, + ERR_AUTOLOOT_MONEY_S = 534, + ERR_GENERIC_STUNNED = 535, + ERR_GENERIC_THROTTLE = 536, + ERR_CLUB_FINDER_SEARCHING_TOO_FAST = 537, + ERR_TARGET_STUNNED = 538, + ERR_MUST_REPAIR_DURABILITY = 539, + ERR_RAID_YOU_JOINED = 540, + ERR_RAID_YOU_LEFT = 541, + ERR_INSTANCE_GROUP_JOINED_WITH_PARTY = 542, + ERR_INSTANCE_GROUP_JOINED_WITH_RAID = 543, + ERR_RAID_MEMBER_ADDED_S = 544, + ERR_RAID_MEMBER_REMOVED_S = 545, + ERR_INSTANCE_GROUP_ADDED_S = 546, + ERR_INSTANCE_GROUP_REMOVED_S = 547, + ERR_CLICK_ON_ITEM_TO_FEED = 548, + ERR_TOO_MANY_CHAT_CHANNELS = 549, + ERR_LOOT_ROLL_PENDING = 550, + ERR_LOOT_PLAYER_NOT_FOUND = 551, + ERR_NOT_IN_RAID = 552, + ERR_LOGGING_OUT = 553, + ERR_TARGET_LOGGING_OUT = 554, + ERR_NOT_WHILE_MOUNTED = 555, + ERR_NOT_WHILE_SHAPESHIFTED = 556, + ERR_NOT_IN_COMBAT = 557, + ERR_NOT_WHILE_DISARMED = 558, + ERR_PET_BROKEN = 559, + ERR_TALENT_WIPE_ERROR = 560, + ERR_SPEC_WIPE_ERROR = 561, + ERR_GLYPH_WIPE_ERROR = 562, + ERR_PET_SPEC_WIPE_ERROR = 563, + ERR_FEIGN_DEATH_RESISTED = 564, + ERR_MEETING_STONE_IN_QUEUE_S = 565, + ERR_MEETING_STONE_LEFT_QUEUE_S = 566, + ERR_MEETING_STONE_OTHER_MEMBER_LEFT = 567, + ERR_MEETING_STONE_PARTY_KICKED_FROM_QUEUE = 568, + ERR_MEETING_STONE_MEMBER_STILL_IN_QUEUE = 569, + ERR_MEETING_STONE_SUCCESS = 570, + ERR_MEETING_STONE_IN_PROGRESS = 571, + ERR_MEETING_STONE_MEMBER_ADDED_S = 572, + ERR_MEETING_STONE_GROUP_FULL = 573, + ERR_MEETING_STONE_NOT_LEADER = 574, + ERR_MEETING_STONE_INVALID_LEVEL = 575, + ERR_MEETING_STONE_TARGET_NOT_IN_PARTY = 576, + ERR_MEETING_STONE_TARGET_INVALID_LEVEL = 577, + ERR_MEETING_STONE_MUST_BE_LEADER = 578, + ERR_MEETING_STONE_NO_RAID_GROUP = 579, + ERR_MEETING_STONE_NEED_PARTY = 580, + ERR_MEETING_STONE_NOT_FOUND = 581, + ERR_MEETING_STONE_TARGET_IN_VEHICLE = 582, + ERR_GUILDEMBLEM_SAME = 583, + ERR_EQUIP_TRADE_ITEM = 584, + ERR_PVP_TOGGLE_ON = 585, + ERR_PVP_TOGGLE_OFF = 586, + ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS = 587, + ERR_GROUP_JOIN_BATTLEGROUND_DEAD = 588, + ERR_GROUP_JOIN_BATTLEGROUND_S = 589, + ERR_GROUP_JOIN_BATTLEGROUND_FAIL = 590, + ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY = 591, + ERR_SOLO_JOIN_BATTLEGROUND_S = 592, + ERR_JOIN_SINGLE_SCENARIO_S = 593, + ERR_BATTLEGROUND_TOO_MANY_QUEUES = 594, + ERR_BATTLEGROUND_CANNOT_QUEUE_FOR_RATED = 595, + ERR_BATTLEDGROUND_QUEUED_FOR_RATED = 596, + ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 597, + ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 598, + ERR_ALREADY_IN_ARENA_TEAM_S = 599, + ERR_INVALID_PROMOTION_CODE = 600, + ERR_BG_PLAYER_JOINED_SS = 601, + ERR_BG_PLAYER_LEFT_S = 602, + ERR_RESTRICTED_ACCOUNT = 603, + ERR_RESTRICTED_ACCOUNT_TRIAL = 604, + ERR_NOT_ENOUGH_PURCHASED_GAME_TIME = 605, + ERR_PLAY_TIME_EXCEEDED = 606, + ERR_APPROACHING_PARTIAL_PLAY_TIME = 607, + ERR_APPROACHING_PARTIAL_PLAY_TIME_2 = 608, + ERR_APPROACHING_NO_PLAY_TIME = 609, + ERR_APPROACHING_NO_PLAY_TIME_2 = 610, + ERR_UNHEALTHY_TIME = 611, + ERR_CHAT_RESTRICTED_TRIAL = 612, + ERR_CHAT_THROTTLED = 613, + ERR_MAIL_REACHED_CAP = 614, + ERR_INVALID_RAID_TARGET = 615, + ERR_RAID_LEADER_READY_CHECK_START_S = 616, + ERR_READY_CHECK_IN_PROGRESS = 617, + ERR_READY_CHECK_THROTTLED = 618, + ERR_VOTE_TO_ABANDON_NOT_YET = 619, + ERR_DUNGEON_DIFFICULTY_FAILED = 620, + ERR_DUNGEON_DIFFICULTY_CHANGED_S = 621, + ERR_TRADE_WRONG_REALM = 622, + ERR_TRADE_NOT_ON_TAPLIST = 623, + ERR_CHAT_PLAYER_AMBIGUOUS_S = 624, + ERR_LOOT_CANT_LOOT_THAT_NOW = 625, + ERR_LOOT_MASTER_INV_FULL = 626, + ERR_LOOT_MASTER_UNIQUE_ITEM = 627, + ERR_LOOT_MASTER_OTHER = 628, + ERR_FILTERING_YOU_S = 629, + ERR_USE_PREVENTED_BY_MECHANIC_S = 630, + ERR_ITEM_UNIQUE_EQUIPPABLE = 631, + ERR_LFG_LEADER_IS_LFM_S = 632, + ERR_LFG_PENDING = 633, + ERR_CANT_SPEAK_LANGAGE = 634, + ERR_VENDOR_MISSING_TURNINS = 635, + ERR_BATTLEGROUND_NOT_IN_TEAM = 636, + ERR_NOT_IN_BATTLEGROUND = 637, + ERR_NOT_ENOUGH_HONOR_POINTS = 638, + ERR_NOT_ENOUGH_ARENA_POINTS = 639, + ERR_SOCKETING_REQUIRES_META_GEM = 640, + ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT = 641, + ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM = 642, + ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT = 643, + ERR_SOCKETING_REQUIRES_COGWHEEL_GEM = 644, + ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT = 645, + ERR_SOCKETING_ITEM_TOO_LOW_LEVEL = 646, + ERR_ITEM_MAX_COUNT_SOCKETED = 647, + ERR_SYSTEM_DISABLED = 648, + ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I = 649, + ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 650, + ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 651, + ERR_USER_SQUELCHED = 652, + ERR_ACCOUNT_SILENCED = 653, + ERR_PARTY_MEMBER_SILENCED = 654, + ERR_PARTY_MEMBER_SILENCED_LFG_DELIST = 655, + ERR_TOO_MUCH_GOLD = 656, + ERR_NOT_BARBER_SITTING = 657, + ERR_QUEST_FAILED_CAIS = 658, + ERR_INVITE_RESTRICTED_TRIAL = 659, + ERR_VOICE_IGNORE_FULL = 660, + ERR_VOICE_IGNORE_SELF = 661, + ERR_VOICE_IGNORE_NOT_FOUND = 662, + ERR_VOICE_IGNORE_ALREADY_S = 663, + ERR_VOICE_IGNORE_ADDED_S = 664, + ERR_VOICE_IGNORE_REMOVED_S = 665, + ERR_VOICE_IGNORE_AMBIGUOUS = 666, + ERR_VOICE_IGNORE_DELETED = 667, + ERR_UNKNOWN_MACRO_OPTION_S = 668, + ERR_NOT_DURING_ARENA_MATCH = 669, + ERR_NOT_IN_RATED_BATTLEGROUND = 670, + ERR_PLAYER_SILENCED = 671, + ERR_PLAYER_UNSILENCED = 672, + ERR_COMSAT_DISCONNECT = 673, + ERR_COMSAT_RECONNECT_ATTEMPT = 674, + ERR_COMSAT_CONNECT_FAIL = 675, + ERR_MAIL_INVALID_ATTACHMENT_SLOT = 676, + ERR_MAIL_TOO_MANY_ATTACHMENTS = 677, + ERR_MAIL_INVALID_ATTACHMENT = 678, + ERR_MAIL_ATTACHMENT_EXPIRED = 679, + ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC = 680, + ERR_PROFANE_CHAT_NAME = 681, + ERR_PLAYER_SILENCED_ECHO = 682, + ERR_PLAYER_UNSILENCED_ECHO = 683, + ERR_LOOT_CANT_LOOT_THAT = 684, + ERR_ARENA_EXPIRED_CAIS = 685, + ERR_GROUP_ACTION_THROTTLED = 686, + ERR_ALREADY_PICKPOCKETED = 687, + ERR_NAME_INVALID = 688, + ERR_NAME_NO_NAME = 689, + ERR_NAME_TOO_SHORT = 690, + ERR_NAME_TOO_LONG = 691, + ERR_NAME_MIXED_LANGUAGES = 692, + ERR_NAME_PROFANE = 693, + ERR_NAME_RESERVED = 694, + ERR_NAME_THREE_CONSECUTIVE = 695, + ERR_NAME_INVALID_SPACE = 696, + ERR_NAME_CONSECUTIVE_SPACES = 697, + ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 698, + ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 699, + ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 700, + ERR_RECRUIT_A_FRIEND_NOT_LINKED = 701, + ERR_RECRUIT_A_FRIEND_NOT_NOW = 702, + ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX = 703, + ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN = 704, + ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE = 705, + ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL = 706, + ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 707, + ERR_NOT_SAME_ACCOUNT = 708, + ERR_BAD_ON_USE_ENCHANT = 709, + ERR_TRADE_SELF = 710, + ERR_TOO_MANY_SOCKETS = 711, + ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 712, + ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 713, + ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 714, + ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 715, + ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 716, + ERR_ITEM_INVENTORY_FULL_SATCHEL = 717, + ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 718, + ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 719, + ERR_PURCHASE_LEVEL_TOO_LOW = 720, + ERR_GROUP_SWAP_FAILED = 721, + ERR_INVITE_IN_COMBAT = 722, + ERR_INVALID_GLYPH_SLOT = 723, + ERR_GENERIC_NO_VALID_TARGETS = 724, + ERR_CALENDAR_EVENT_ALERT_S = 725, + ERR_PET_LEARN_SPELL_S = 726, + ERR_PET_LEARN_ABILITY_S = 727, + ERR_PET_SPELL_UNLEARNED_S = 728, + ERR_INVITE_UNKNOWN_REALM = 729, + ERR_INVITE_NO_PARTY_SERVER = 730, + ERR_INVITE_PARTY_BUSY = 731, + ERR_INVITE_PARTY_BUSY_PENDING_REQUEST = 732, + ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST = 733, + ERR_PARTY_TARGET_AMBIGUOUS = 734, + ERR_PARTY_LFG_INVITE_RAID_LOCKED = 735, + ERR_PARTY_LFG_BOOT_LIMIT = 736, + ERR_PARTY_LFG_BOOT_COOLDOWN_S = 737, + ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 738, + ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S = 739, + ERR_PARTY_LFG_BOOT_IN_PROGRESS = 740, + ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 741, + ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED = 742, + ERR_PARTY_LFG_BOOT_VOTE_FAILED = 743, + ERR_PARTY_LFG_BOOT_DISALLOWED_BY_MAP = 744, + ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 745, + ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 746, + ERR_PARTY_LFG_BOOT_VOTE_REGISTERED = 747, + ERR_PARTY_PRIVATE_GROUP_ONLY = 748, + ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 749, + ERR_PARTY_TIME_RUNNING_SEASON_ID_MUST_MATCH = 750, + ERR_RAID_DISALLOWED_BY_LEVEL = 751, + ERR_RAID_DISALLOWED_BY_CROSS_REALM = 752, + ERR_PARTY_ROLE_NOT_AVAILABLE = 753, + ERR_JOIN_LFG_OBJECT_FAILED = 754, + ERR_LFG_REMOVED_LEVELUP = 755, + ERR_LFG_REMOVED_XP_TOGGLE = 756, + ERR_LFG_REMOVED_FACTION_CHANGE = 757, + ERR_BATTLEGROUND_INFO_THROTTLED = 758, + ERR_BATTLEGROUND_ALREADY_IN = 759, + ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED = 760, + ERR_ARENA_TEAM_PERMISSIONS = 761, + ERR_NOT_WHILE_FALLING = 762, + ERR_NOT_WHILE_MOVING = 763, + ERR_NOT_WHILE_FATIGUED = 764, + ERR_MAX_SOCKETS = 765, + ERR_MULTI_CAST_ACTION_TOTEM_S = 766, + ERR_BATTLEGROUND_JOIN_LEVELUP = 767, + ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN = 768, + ERR_BATTLEGROUND_JOIN_XP_GAIN = 769, + ERR_BATTLEGROUND_JOIN_MERCENARY = 770, + ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS = 771, + ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS = 772, + ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS = 773, + ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE = 774, + ERR_RAID_DIFFICULTY_FAILED = 775, + ERR_RAID_DIFFICULTY_CHANGED_S = 776, + ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S = 777, + ERR_RAID_LOCKOUT_CHANGED_S = 778, + ERR_RAID_CONVERTED_TO_PARTY = 779, + ERR_PARTY_CONVERTED_TO_RAID = 780, + ERR_PLAYER_DIFFICULTY_CHANGED_S = 781, + ERR_GMRESPONSE_DB_ERROR = 782, + ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 783, + ERR_ARENA_JOIN_RANGE_INDEX = 784, + ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 785, + ERR_BATTLEGROUND_JOIN_FAILED = 786, + ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 787, + ERR_BATTLEGROUND_JOIN_RESPEC = 788, + ERR_BATTLEGROUND_INVITATION_DECLINED = 789, + ERR_BATTLEGROUND_INVITATION_DECLINED_BY = 790, + ERR_BATTLEGROUND_JOIN_TIMED_OUT = 791, + ERR_BATTLEGROUND_DUPE_QUEUE = 792, + ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 793, + ERR_IN_BATTLEGROUND_RESPEC = 794, + ERR_MAIL_LIMITED_DURATION_ITEM = 795, + ERR_YELL_RESTRICTED_TRIAL = 796, + ERR_CHAT_RAID_RESTRICTED_TRIAL = 797, + ERR_LFG_ROLE_CHECK_FAILED = 798, + ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT = 799, + ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE = 800, + ERR_LFG_READY_CHECK_FAILED = 801, + ERR_LFG_READY_CHECK_FAILED_TIMEOUT = 802, + ERR_LFG_GROUP_FULL = 803, + ERR_LFG_NO_LFG_OBJECT = 804, + ERR_LFG_NO_SLOTS_PLAYER = 805, + ERR_LFG_NO_SLOTS_PARTY = 806, + ERR_LFG_NO_SPEC = 807, + ERR_LFG_MISMATCHED_SLOTS = 808, + ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM = 809, + ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 810, + ERR_LFG_MEMBERS_NOT_PRESENT = 811, + ERR_LFG_GET_INFO_TIMEOUT = 812, + ERR_LFG_INVALID_SLOT = 813, + ERR_LFG_DESERTER_PLAYER = 814, + ERR_LFG_DESERTER_PARTY = 815, + ERR_LFG_DEAD = 816, + ERR_LFG_RANDOM_COOLDOWN_PLAYER = 817, + ERR_LFG_RANDOM_COOLDOWN_PARTY = 818, + ERR_LFG_TOO_MANY_MEMBERS = 819, + ERR_LFG_TOO_FEW_MEMBERS = 820, + ERR_LFG_PROPOSAL_FAILED = 821, + ERR_LFG_PROPOSAL_DECLINED_SELF = 822, + ERR_LFG_PROPOSAL_DECLINED_PARTY = 823, + ERR_LFG_NO_SLOTS_SELECTED = 824, + ERR_LFG_NO_ROLES_SELECTED = 825, + ERR_LFG_ROLE_CHECK_INITIATED = 826, + ERR_LFG_READY_CHECK_INITIATED = 827, + ERR_LFG_PLAYER_DECLINED_ROLE_CHECK = 828, + ERR_LFG_PLAYER_DECLINED_READY_CHECK = 829, + ERR_LFG_LOREWALKING = 830, + ERR_LFG_JOINED_QUEUE = 831, + ERR_LFG_JOINED_FLEX_QUEUE = 832, + ERR_LFG_JOINED_RF_QUEUE = 833, + ERR_LFG_JOINED_SCENARIO_QUEUE = 834, + ERR_LFG_JOINED_WORLD_PVP_QUEUE = 835, + ERR_LFG_JOINED_BATTLEFIELD_QUEUE = 836, + ERR_LFG_JOINED_LIST = 837, + ERR_QUEUED_PLUNDERSTORM = 838, + ERR_LFG_LEFT_QUEUE = 839, + ERR_LFG_LEFT_LIST = 840, + ERR_LFG_ROLE_CHECK_ABORTED = 841, + ERR_LFG_READY_CHECK_ABORTED = 842, + ERR_LFG_CANT_USE_BATTLEGROUND = 843, + ERR_LFG_CANT_USE_DUNGEONS = 844, + ERR_LFG_REASON_TOO_MANY_LFG = 845, + ERR_LFG_FARM_LIMIT = 846, + ERR_LFG_NO_CROSS_FACTION_PARTIES = 847, + ERR_INVALID_TELEPORT_LOCATION = 848, + ERR_TOO_FAR_TO_INTERACT = 849, + ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS = 850, + ERR_DIFFICULTY_CHANGE_COOLDOWN_S = 851, + ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S = 852, + ERR_DIFFICULTY_CHANGE_WORLDSTATE = 853, + ERR_DIFFICULTY_CHANGE_ENCOUNTER = 854, + ERR_DIFFICULTY_CHANGE_COMBAT = 855, + ERR_DIFFICULTY_CHANGE_PLAYER_BUSY = 856, + ERR_DIFFICULTY_CHANGE_PLAYER_ON_VEHICLE = 857, + ERR_DIFFICULTY_CHANGE_ALREADY_STARTED = 858, + ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S = 859, + ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING = 860, + ERR_ARENA_TEAM_PARTY_SIZE = 861, + ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 862, + ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 863, + ERR_SOLO_RBG_WARGAME_GROUP_SIZE = 864, + ERR_SOLO_RBG_WARGAME_GROUP_COMP = 865, + ERR_SOLO_MIN_ITEM_LEVEL = 866, + ERR_PVP_PLAYER_ABANDONED = 867, + ERR_BATTLEGROUND_JOIN_GROUP_QUEUE_WITHOUT_HEALER = 868, + ERR_QUEST_FORCE_REMOVED_S = 869, + ERR_ATTACK_NO_ACTIONS = 870, + ERR_IN_RANDOM_BG = 871, + ERR_IN_NON_RANDOM_BG = 872, + ERR_BN_FRIEND_SELF = 873, + ERR_BN_FRIEND_ALREADY = 874, + ERR_BN_FRIEND_BLOCKED = 875, + ERR_BN_FRIEND_LIST_FULL = 876, + ERR_BN_FRIEND_REQUEST_SENT = 877, + ERR_BN_BROADCAST_THROTTLE = 878, + ERR_BG_DEVELOPER_ONLY = 879, + ERR_CURRENCY_SPELL_SLOT_MISMATCH = 880, + ERR_CURRENCY_NOT_TRADABLE = 881, + ERR_REQUIRES_EXPANSION_S = 882, + ERR_QUEST_FAILED_SPELL = 883, + ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 884, + ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 885, + ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 886, + ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 887, + ERR_TALENT_FAILED_UNKNOWN = 888, + ERR_TALENT_FAILED_IN_COMBAT = 889, + ERR_TALENT_FAILED_IN_PVP_MATCH = 890, + ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 891, + ERR_WARGAME_REQUEST_FAILURE = 892, + ERR_RANK_REQUIRES_AUTHENTICATOR = 893, + ERR_GUILD_BANK_VOUCHER_FAILED = 894, + ERR_WARGAME_REQUEST_SENT = 895, + ERR_REQUIRES_ACHIEVEMENT_I = 896, + ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 897, + ERR_CANT_BUY_QUANTITY = 898, + ERR_ITEM_IS_BATTLE_PAY_LOCKED = 899, + ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 900, + ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 901, + ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 902, + ERR_INSUFF_TRACKED_CURRENCY_IS = 903, + ERR_NOT_ON_TOURNAMENT_REALM = 904, + ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 905, + ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 906, + ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 907, + ERR_CANT_DO_THAT_IN_A_GROUP = 908, + ERR_GUILD_LEADER_REPLACED = 909, + ERR_TRANSMOGRIFY_CANT_EQUIP = 910, + ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 911, + ERR_TRANSMOGRIFY_NOT_SOULBOUND = 912, + ERR_TRANSMOGRIFY_INVALID_SOURCE = 913, + ERR_TRANSMOGRIFY_INVALID_DESTINATION = 914, + ERR_TRANSMOGRIFY_MISMATCH = 915, + ERR_TRANSMOGRIFY_LEGENDARY = 916, + ERR_TRANSMOGRIFY_SAME_ITEM = 917, + ERR_TRANSMOGRIFY_SAME_APPEARANCE = 918, + ERR_TRANSMOGRIFY_NOT_EQUIPPED = 919, + ERR_VOID_DEPOSIT_FULL = 920, + ERR_VOID_WITHDRAW_FULL = 921, + ERR_VOID_STORAGE_WRAPPED = 922, + ERR_VOID_STORAGE_STACKABLE = 923, + ERR_VOID_STORAGE_UNBOUND = 924, + ERR_VOID_STORAGE_REPAIR = 925, + ERR_VOID_STORAGE_CHARGES = 926, + ERR_VOID_STORAGE_QUEST = 927, + ERR_VOID_STORAGE_CONJURED = 928, + ERR_VOID_STORAGE_MAIL = 929, + ERR_VOID_STORAGE_BAG = 930, + ERR_VOID_TRANSFER_STORAGE_FULL = 931, + ERR_VOID_TRANSFER_INV_FULL = 932, + ERR_VOID_TRANSFER_INTERNAL_ERROR = 933, + ERR_VOID_TRANSFER_ITEM_INVALID = 934, + ERR_DIFFICULTY_DISABLED_IN_LFG = 935, + ERR_VOID_STORAGE_UNIQUE = 936, + ERR_VOID_STORAGE_LOOT = 937, + ERR_VOID_STORAGE_HOLIDAY = 938, + ERR_VOID_STORAGE_DURATION = 939, + ERR_VOID_STORAGE_LOAD_FAILED = 940, + ERR_VOID_STORAGE_INVALID_ITEM = 941, + ERR_VOID_STORAGE_ACCOUNT_ITEM = 942, + ERR_PARENTAL_CONTROLS_CHAT_MUTED = 943, + ERR_SOR_START_EXPERIENCE_INCOMPLETE = 944, + ERR_SOR_INVALID_EMAIL = 945, + ERR_SOR_INVALID_COMMENT = 946, + ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 947, + ERR_CHALLENGE_MODE_RESET_KEYSTONE = 948, + ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 949, + ERR_REPORT_SUBMITTED_SUCCESSFULLY = 950, + ERR_REPORT_SUBMISSION_FAILED = 951, + ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 952, + ERR_BUG_SUBMITTED_SUCCESSFULLY = 953, + ERR_CHALLENGE_MODE_ENABLED = 954, + ERR_CHALLENGE_MODE_DISABLED = 955, + ERR_PETBATTLE_CREATE_FAILED = 956, + ERR_PETBATTLE_NOT_HERE = 957, + ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 958, + ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 959, + ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 960, + ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 961, + ERR_PETBATTLE_NOT_WHILE_DEAD = 962, + ERR_PETBATTLE_NOT_WHILE_FLYING = 963, + ERR_PETBATTLE_TARGET_INVALID = 964, + ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 965, + ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 966, + ERR_PETBATTLE_NOT_A_TRAINER = 967, + ERR_PETBATTLE_DECLINED = 968, + ERR_PETBATTLE_IN_BATTLE = 969, + ERR_PETBATTLE_INVALID_LOADOUT = 970, + ERR_PETBATTLE_ALL_PETS_DEAD = 971, + ERR_PETBATTLE_NO_PETS_IN_SLOTS = 972, + ERR_PETBATTLE_NO_ACCOUNT_LOCK = 973, + ERR_PETBATTLE_WILD_PET_TAPPED = 974, + ERR_PETBATTLE_RESTRICTED_ACCOUNT = 975, + ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 976, + ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 977, + ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 978, + ERR_CANT_HAVE_MORE_PETS = 979, + ERR_PVP_MAP_NOT_FOUND = 980, + ERR_PVP_MAP_NOT_SET = 981, + ERR_PETBATTLE_QUEUE_QUEUED = 982, + ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 983, + ERR_PETBATTLE_QUEUE_JOIN_FAILED = 984, + ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 985, + ERR_PETBATTLE_QUEUE_REMOVED = 986, + ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 987, + ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 988, + ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 989, + ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 990, + ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 991, + ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 992, + ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 993, + ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 994, + ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 995, + ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 996, + ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 997, + ERR_PETBATTLE_QUEUE_SLOT_DEAD = 998, + ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 999, + ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 1000, + ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 1001, + ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 1002, + ERR_HAS_RESTRICTION = 1003, + ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 1004, + ERR_ITEM_UPGRADE_NO_PATH = 1005, + ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 1006, + ERR_BONUS_ROLL_EMPTY = 1007, + ERR_CHALLENGE_MODE_FULL = 1008, + ERR_CHALLENGE_MODE_IN_PROGRESS = 1009, + ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 1010, + ERR_START_RESTRICTED_CHALLENGE_MODE = 1011, + ERR_BATTLETAG_FRIEND_NOT_FOUND = 1012, + ERR_BATTLETAG_FRIEND_NOT_VALID = 1013, + ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 1014, + ERR_BATTLETAG_FRIEND_THROTTLED = 1015, + ERR_BATTLETAG_FRIEND_SUCCESS = 1016, + ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 1017, + ERR_PETBATTLE_INTERNAL = 1018, + ERR_CANT_CAGE_PET_YET = 1019, + ERR_NO_LOOT_IN_CHALLENGE_MODE = 1020, + ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 1021, + ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 1022, + ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 1023, + ERR_RECRUIT_A_FRIEND_FAILED = 1024, + ERR_SET_LOOT_PERSONAL = 1025, + ERR_SET_LOOT_METHOD_FAILED_COMBAT = 1026, + ERR_REAGENT_BANK_FULL = 1027, + ERR_REAGENT_BANK_LOCKED = 1028, + ERR_GARRISON_BUILDING_EXISTS = 1029, + ERR_GARRISON_INVALID_PLOT = 1030, + ERR_GARRISON_INVALID_BUILDINGID = 1031, + ERR_GARRISON_INVALID_PLOT_BUILDING = 1032, + ERR_GARRISON_REQUIRES_BLUEPRINT = 1033, + ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1034, + ERR_GARRISON_NOT_ENOUGH_GOLD = 1035, + ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1036, + ERR_ALREADY_USING_LFG_LIST = 1037, + ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1038, + ERR_TOY_USE_LIMIT_REACHED = 1039, + ERR_TOY_ALREADY_KNOWN = 1040, + ERR_TRANSMOG_SET_ALREADY_KNOWN = 1041, + ERR_NOT_ENOUGH_CURRENCY = 1042, + ERR_SPEC_IS_DISABLED = 1043, + ERR_FEATURE_RESTRICTED_TRIAL = 1044, + ERR_CANT_BE_OBLITERATED = 1045, + ERR_CANT_BE_SCRAPPED = 1046, + ERR_CANT_BE_RECRAFTED = 1047, + ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1048, + ERR_MUST_EQUIP_ARTIFACT = 1049, + ERR_CANT_DO_THAT_RIGHT_NOW = 1050, + ERR_AFFECTING_COMBAT = 1051, + ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1052, + ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1053, + ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1054, + ERR_MOVIE_RECORDING_WARNING_PERF = 1055, + ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1056, + ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1057, + ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1058, + ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1059, + ERR_NO_CHALLENGE_MODE_REWARD = 1060, + ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1061, + ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1062, + ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1063, + ERR_TALENT_FAILED_REST_AREA = 1064, + ERR_CANNOT_ABANDON_LAST_PET = 1065, + ERR_TEST_CVAR_SET_SSS = 1066, + ERR_QUEST_TURN_IN_FAIL_REASON = 1067, + ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1068, + ERR_TALENT_GRANTED_BY_AURA = 1069, + ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1070, + ERR_GLYPH_TARGET_NOT_AVAILABLE = 1071, + ERR_PVP_WARMODE_TOGGLE_ON = 1072, + ERR_PVP_WARMODE_TOGGLE_OFF = 1073, + ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1074, + ERR_SPELL_FAILED_CANT_FLY_HERE = 1075, + ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1076, + ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1077, + ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1078, + ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1079, + ERR_VOICE_CHAT_SERVICE_LOST = 1080, + ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1081, + ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1082, + ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1083, + ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1084, + ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1085, + ERR_VOICE_CHAT_PLAYER_SILENCED = 1086, + ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1087, + ERR_VOICE_CHAT_DISABLED = 1088, + ERR_NO_PVP_REWARD = 1089, + ERR_CLAIMED_PVP_REWARD = 1090, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1091, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1092, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1093, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1094, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1095, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1096, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1097, + ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1098, + ERR_SOCKETING_GENERIC_FAILURE = 1099, + ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1100, + ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1101, + ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1102, + ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1103, + ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1104, + ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1105, + ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1106, + ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1107, + ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1108, + ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1109, + ERR_SOCKETING_REQUIRES_TINKER_GEM = 1110, + ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1111, + ERR_SOCKETING_REQUIRES_PRIMORDIAL_GEM = 1112, + ERR_SOCKETING_PRIMORDIAL_GEM_ONLY_IN_PRIMORDIALSLOT = 1113, + ERR_SOCKETING_REQUIRES_FRAGRANCE_GEM = 1114, + ERR_SOCKETING_FRAGRANCE_GEM_ONLY_IN_FRAGRANCESLOT = 1115, + ERR_SOCKETING_REQUIRES_SINGING_THUNDER_GEM = 1116, + ERR_SOCKETING_SINGINGTHUNDER_GEM_ONLY_IN_SINGINGTHUNDERSLOT = 1117, + ERR_SOCKETING_REQUIRES_SINGING_SEA_GEM = 1118, + ERR_SOCKETING_SINGINGSEA_GEM_ONLY_IN_SINGINGSEASLOT = 1119, + ERR_SOCKETING_REQUIRES_SINGING_WIND_GEM = 1120, + ERR_SOCKETING_SINGINGWIND_GEM_ONLY_IN_SINGINGWINDSLOT = 1121, + ERR_SOCKETING_REQUIRES_FIBER_GEM = 1122, + ERR_SOCKETING_FIBER_GEM_ONLY_IN_FIBERSLOT = 1123, + ERR_LEVEL_LINKING_RESULT_LINKED = 1124, + ERR_LEVEL_LINKING_RESULT_UNLINKED = 1125, + ERR_CLUB_FINDER_ERROR_POST_CLUB = 1126, + ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1127, + ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1128, + ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1129, + ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1130, + ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1131, + ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1132, + ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1133, + ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1134, + ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1135, + ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1136, + ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1137, + ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1138, + ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1139, + ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1140, + ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1141, + ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1142, + ERR_ITEM_INTERACTION_NO_CONVERSION_OUTPUT = 1143, + ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1144, + ERR_SOULBIND_INVALID_CONDUIT = 1145, + ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1146, + ERR_SOULBIND_INVALID_TALENT = 1147, + ERR_SOULBIND_DUPLICATE_CONDUIT = 1148, + ERR_ACTIVATE_SOULBIND_S = 1149, + ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1150, + ERR_CANT_USE_PROFANITY = 1151, + ERR_NOT_IN_PET_BATTLE = 1152, + ERR_NOT_IN_NPE = 1153, + ERR_NO_SPEC = 1154, + ERR_NO_DOMINATIONSHARD_OVERWRITE = 1155, + ERR_USE_WEEKLY_REWARDS_DISABLED = 1156, + ERR_CROSS_FACTION_GROUP_JOINED = 1157, + ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1158, + ERR_EQUIPABLESPELLS_SLOTS_FULL = 1159, + ERR_ITEM_MOD_APPEARANCE_GROUP_ALREADY_KNOWN = 1160, + ERR_CANT_BULK_SELL_ITEM_WITH_REFUND = 1161, + ERR_NO_SOULBOUND_ITEM_IN_ACCOUNT_BANK = 1162, + ERR_NO_REFUNDABLE_ITEM_IN_ACCOUNT_BANK = 1163, + ERR_CANT_DELETE_IN_ACCOUNT_BANK = 1164, + ERR_NO_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1165, + ERR_NO_OPEN_IMMEDIATE_CONTAINER_IN_ACCOUNT_BANK = 1166, + ERR_CANT_TRADE_ACCOUNT_ITEM = 1167, + ERR_NO_ACCOUNT_INVENTORY_LOCK = 1168, + ERR_BANK_NOT_ACCESSIBLE = 1169, + ERR_TOO_MANY_ACCOUNT_BANK_TABS = 1170, + ERR_BANK_TAB_NOT_UNLOCKED = 1171, + ERR_ACCOUNT_MONEY_LOCKED = 1172, + ERR_BANK_TAB_INVALID_NAME = 1173, + ERR_BANK_TAB_INVALID_TEXT = 1174, + ERR_CHARACTER_BANK_NOT_CONVERTED = 1175, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_IS_FULL = 1176, + ERR_WOW_LABS_PARTY_ERROR_TYPE_MAX_INVITE_SENT = 1177, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PLAYER_ALREADY_INVITED = 1178, + ERR_WOW_LABS_PARTY_ERROR_TYPE_PARTY_INVITE_INVALID = 1179, + ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_ENTER_QUEUE_FAILED = 1180, + ERR_WOW_LABS_LOBBY_MATCHMAKER_ERROR_LEAVE_QUEUE_FAILED = 1181, + ERR_WOW_LABS_SET_WOW_LABS_AREA_ID_FAILED = 1182, + ERR_PLUNDERSTORM_CANNOT_QUEUE = 1183, + ERR_TARGET_IS_SELF_FOUND_CANNOT_TRADE = 1184, + ERR_PLAYER_IS_SELF_FOUND_CANNOT_TRADE = 1185, + ERR_MAIL_RECEPIENT_IS_SELF_FOUND_CANNOT_RECEIVE_MAIL = 1186, + ERR_PLAYER_IS_SELF_FOUND_CANNOT_SEND_MAIL = 1187, + ERR_PLAYER_IS_SELF_FOUND_CANNOT_USE_AUCTION_HOUSE = 1188, + ERR_MAIL_TARGET_CANNOT_RECEIVE_MAIL = 1189, + ERR_REMIX_INVALID_TRANSFER_REQUEST = 1190, + ERR_CURRENCY_TRANSFER_INVALID_CHARACTER = 1191, + ERR_CURRENCY_TRANSFER_INVALID_CURRENCY = 1192, + ERR_CURRENCY_TRANSFER_INSUFFICIENT_CURRENCY = 1193, + ERR_CURRENCY_TRANSFER_MAX_QUANTITY = 1194, + ERR_CURRENCY_TRANSFER_NO_VALID_SOURCE = 1195, + ERR_CURRENCY_TRANSFER_CHARACTER_LOGGED_IN = 1196, + ERR_CURRENCY_TRANSFER_SERVER_ERROR = 1197, + ERR_CURRENCY_TRANSFER_UNMET_REQUIREMENTS = 1198, + ERR_CURRENCY_TRANSFER_TRANSACTION_IN_PROGRESS = 1199, + ERR_CURRENCY_TRANSFER_DISABLED = 1200, }; enum class MountResult : uint32 diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 211c1bcb38b..1450dab14dd 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -79,7 +79,6 @@ #include "TransmogrificationPackets.h" #include "VehiclePackets.h" #include "VignettePackets.h" -#include "VoidStoragePackets.h" #include "WardenPackets.h" #include "WhoPackets.h" #include "WorldStatePackets.h" diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp index c063b19305e..34c98aabcf4 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.cpp +++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp @@ -17,57 +17,9 @@ #include "AreaTriggerPackets.h" #include "PacketOperators.h" -#include "Spline.h" namespace WorldPackets::AreaTrigger { -void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline) -{ - data << uint32(timeToTarget); - data << uint32(elapsedTimeForMovement); - - data << BitsSize<16>(areaTriggerSpline.getPoints()); - data.append(reinterpret_cast<float const*>(areaTriggerSpline.getPoints().data()), areaTriggerSpline.getPoints().size() * 3); -} - -ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerSplineInfo const& areaTriggerSpline) -{ - WriteAreaTriggerSpline(data, areaTriggerSpline.TimeToTarget, areaTriggerSpline.ElapsedTimeForMovement, *areaTriggerSpline.Points); - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerOrbitInfo const& areaTriggerCircularMovement) -{ - data << OptionalInit(areaTriggerCircularMovement.PathTarget); - data << OptionalInit(areaTriggerCircularMovement.Center); - data << Bits<1>(areaTriggerCircularMovement.CounterClockwise); - data << Bits<1>(areaTriggerCircularMovement.CanLoop); - - data << uint32(areaTriggerCircularMovement.TimeToTarget); - data << int32(areaTriggerCircularMovement.ElapsedTimeForMovement); - data << uint32(areaTriggerCircularMovement.StartDelay); - data << float(areaTriggerCircularMovement.Radius); - data << float(areaTriggerCircularMovement.BlendFromRadius); - data << float(areaTriggerCircularMovement.InitialAngle); - data << float(areaTriggerCircularMovement.ZOffset); - - if (areaTriggerCircularMovement.PathTarget) - data << *areaTriggerCircularMovement.PathTarget; - - if (areaTriggerCircularMovement.Center) - data << *areaTriggerCircularMovement.Center; - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerMovementScriptInfo const& areaTriggerMovementScript) -{ - data << int32(areaTriggerMovementScript.SpellScriptID); - data << areaTriggerMovementScript.Center; - - return data; -} - void AreaTrigger::Read() { _worldPacket >> AreaTriggerID; @@ -84,28 +36,6 @@ WorldPacket const* AreaTriggerDenied::Write() return &_worldPacket; } -WorldPacket const* AreaTriggerRePath::Write() -{ - _worldPacket << TriggerGUID; - _worldPacket << Unused_1100; - - _worldPacket << OptionalInit(AreaTriggerSpline); - _worldPacket << OptionalInit(AreaTriggerOrbit); - _worldPacket << OptionalInit(AreaTriggerMovementScript); - _worldPacket.FlushBits(); - - if (AreaTriggerSpline) - _worldPacket << *AreaTriggerSpline; - - if (AreaTriggerMovementScript) - _worldPacket << *AreaTriggerMovementScript; - - if (AreaTriggerOrbit) - _worldPacket << *AreaTriggerOrbit; - - return &_worldPacket; -} - WorldPacket const* AreaTriggerPlaySpellVisual::Write() { _worldPacket << AreaTriggerGUID; diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h index b0742733857..ac1defafc8f 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.h +++ b/src/server/game/Server/Packets/AreaTriggerPackets.h @@ -19,34 +19,13 @@ #define TRINITYCORE_AREA_TRIGGER_PACKETS_H #include "Packet.h" -#include "AreaTriggerTemplate.h" #include "CombatLogPacketsCommon.h" #include "ObjectGuid.h" -#include "Optional.h" - -namespace Movement -{ -template<class index_type> -class Spline; -} namespace WorldPackets { namespace AreaTrigger { - struct AreaTriggerSplineInfo - { - uint32 TimeToTarget = 0; - uint32 ElapsedTimeForMovement = 0; - ::Movement::Spline<float>* Points = nullptr; - }; - - struct AreaTriggerMovementScriptInfo - { - uint32 SpellScriptID = 0; - TaggedPosition<Position::XYZ> Center; - }; - class AreaTrigger final : public ClientPacket { public: @@ -78,20 +57,6 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; - class AreaTriggerRePath final : public ServerPacket - { - public: - explicit AreaTriggerRePath() : ServerPacket(SMSG_AREA_TRIGGER_RE_PATH, 17) { } - - WorldPacket const* Write() override; - - Optional<AreaTriggerSplineInfo> AreaTriggerSpline; - Optional<AreaTriggerOrbitInfo> AreaTriggerOrbit; - Optional<AreaTriggerMovementScriptInfo> AreaTriggerMovementScript; - ObjectGuid TriggerGUID; - ObjectGuid Unused_1100; - }; - class AreaTriggerPlaySpellVisual final : public ServerPacket { public: @@ -114,9 +79,6 @@ namespace WorldPackets Spells::SpellCastVisual Visual; ObjectGuid TargetGUID; }; - - void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline); - ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerOrbitInfo const& areaTriggerCircularMovement); } } diff --git a/src/server/game/Server/Packets/BankPackets.cpp b/src/server/game/Server/Packets/BankPackets.cpp index c30fed72584..59ddb9be346 100644 --- a/src/server/game/Server/Packets/BankPackets.cpp +++ b/src/server/game/Server/Packets/BankPackets.cpp @@ -18,47 +18,60 @@ #include "BankPackets.h" #include "PacketOperators.h" -void WorldPackets::Bank::AutoBankItem::Read() +namespace WorldPackets::Bank { - _worldPacket >> Inv - >> As<int8>(BankType) - >> Bag - >> Slot; +void AutoBankItem::Read() +{ + _worldPacket >> Inv; + _worldPacket >> As<uint8>(BankType); + _worldPacket >> Bag; + _worldPacket >> Slot; } -void WorldPackets::Bank::AutoStoreBankItem::Read() +void AutoStoreBankItem::Read() { - _worldPacket >> Inv - >> Bag - >> Slot; + _worldPacket >> Inv; + _worldPacket >> Bag; + _worldPacket >> Slot; } -void WorldPackets::Bank::BuyBankSlot::Read() +void BuyBankTab::Read() { - _worldPacket >> Guid; + _worldPacket >> Banker; + _worldPacket >> As<uint8>(BankType); } -void WorldPackets::Bank::AutoBankReagent::Read() +void AutoDepositCharacterBank::Read() { - _worldPacket >> Inv; - _worldPacket >> PackSlot; - _worldPacket >> Slot; + _worldPacket >> Banker; } -void WorldPackets::Bank::AutoStoreBankReagent::Read() +void BankerActivate::Read() { - _worldPacket >> Inv; - _worldPacket >> Slot; - _worldPacket >> PackSlot; + _worldPacket >> Banker; + _worldPacket >> As<int32>(InteractionType); } -void WorldPackets::Bank::ReagentBank::Read() +ByteBuffer& operator>>(ByteBuffer& data, BankTabSettings& settings) { - _worldPacket >> Banker; + data.ResetBitPos(); + data >> SizedString::BitsSize<7>(settings.Name); + data >> SizedString::BitsSize<9>(settings.Icon); + data >> SizedString::BitsSize<14>(settings.Description); + data >> As<int32>(settings.DepositFlags); + + data >> SizedString::Data(settings.Name); + data >> SizedString::Data(settings.Icon); + data >> SizedString::Data(settings.Description); + + return data; } -void WorldPackets::Bank::BankerActivate::Read() +void UpdateBankTabSettings::Read() { _worldPacket >> Banker; - _worldPacket >> As<int32>(InteractionType); + _worldPacket >> As<uint8>(BankType); + _worldPacket >> Tab; + _worldPacket >> Settings; +} } diff --git a/src/server/game/Server/Packets/BankPackets.h b/src/server/game/Server/Packets/BankPackets.h index 047b5085c2d..04a0f694bd3 100644 --- a/src/server/game/Server/Packets/BankPackets.h +++ b/src/server/game/Server/Packets/BankPackets.h @@ -22,6 +22,7 @@ #include "ItemPacketsCommon.h" #include "ObjectGuid.h" +enum class BagSlotFlags : uint32; enum class PlayerInteractionType : int32; namespace WorldPackets @@ -53,61 +54,57 @@ namespace WorldPackets uint8 Slot = 0; }; - class BuyBankSlot final : public ClientPacket + class BuyBankTab final : public ClientPacket { public: - explicit BuyBankSlot(WorldPacket&& packet) : ClientPacket(CMSG_BUY_BANK_SLOT, std::move(packet)) { } + explicit BuyBankTab(WorldPacket&& packet) : ClientPacket(CMSG_BUY_ACCOUNT_BANK_TAB, std::move(packet)) { } void Read() override; - ObjectGuid Guid; + ObjectGuid Banker; + ::BankType BankType = ::BankType::Character; }; - class AutoBankReagent final : public ClientPacket + class AutoDepositCharacterBank final : public ClientPacket { public: - explicit AutoBankReagent(WorldPacket&& packet) : ClientPacket(CMSG_AUTOBANK_REAGENT, std::move(packet)) { } + explicit AutoDepositCharacterBank(WorldPacket&& packet) : ClientPacket(CMSG_AUTO_DEPOSIT_CHARACTER_BANK, std::move(packet)) { } void Read() override; - WorldPackets::Item::InvUpdate Inv; - uint8 Slot = 0; - uint8 PackSlot = 0; + ObjectGuid Banker; }; - class AutoStoreBankReagent final : public ClientPacket + class BankerActivate final : public ClientPacket { public: - explicit AutoStoreBankReagent(WorldPacket&& packet) : ClientPacket(CMSG_AUTOSTORE_BANK_REAGENT, std::move(packet)) { } + explicit BankerActivate(WorldPacket&& packet) : ClientPacket(CMSG_BANKER_ACTIVATE, std::move(packet)) { } void Read() override; - WorldPackets::Item::InvUpdate Inv; - uint8 Slot = 0; - uint8 PackSlot = 0; + ObjectGuid Banker; + PlayerInteractionType InteractionType = { }; }; - // CMSG_BUY_REAGENT_BANK - // CMSG_REAGENT_BANK_DEPOSIT - class ReagentBank final : public ClientPacket + struct BankTabSettings { - public: - explicit ReagentBank(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } - - void Read() override; - - ObjectGuid Banker; + std::string Name; + std::string Icon; + std::string Description; + BagSlotFlags DepositFlags = { }; }; - class BankerActivate final : public ClientPacket + class UpdateBankTabSettings final : public ClientPacket { public: - explicit BankerActivate(WorldPacket&& packet) : ClientPacket(CMSG_BANKER_ACTIVATE, std::move(packet)) { } + explicit UpdateBankTabSettings(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, std::move(packet)) { } void Read() override; ObjectGuid Banker; - PlayerInteractionType InteractionType = { }; + ::BankType BankType = ::BankType::Character; + uint8 Tab = 0; + BankTabSettings Settings; }; } } diff --git a/src/server/game/Server/Packets/DuelPackets.h b/src/server/game/Server/Packets/DuelPackets.h index efa8b970d11..f2ec5c9fff4 100644 --- a/src/server/game/Server/Packets/DuelPackets.h +++ b/src/server/game/Server/Packets/DuelPackets.h @@ -96,7 +96,7 @@ namespace WorldPackets bool ToTheDeath = false; }; - class DuelResponse : public ClientPacket + class DuelResponse final : public ClientPacket { public: explicit DuelResponse(WorldPacket&& packet) : ClientPacket(CMSG_DUEL_RESPONSE, std::move(packet)) { } diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 3841fffd092..566830dfa7c 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -605,7 +605,7 @@ namespace WorldPackets ObjectGuid Promotee; }; - class GuildOfficerRemoveMember : public ClientPacket + class GuildOfficerRemoveMember final : public ClientPacket { public: explicit GuildOfficerRemoveMember(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_OFFICER_REMOVE_MEMBER, std::move(packet)) { } diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index ddebb53d225..75d3b6d784a 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -225,6 +225,8 @@ WorldPacket const* InspectResult::Write() if (!PvpTalents.empty()) _worldPacket.append(PvpTalents.data(), PvpTalents.size()); + _worldPacket << TalentInfo; + _worldPacket << OptionalInit(GuildData); _worldPacket << OptionalInit(AzeriteLevel); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index d78ffbe78da..de9d4c61ae7 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -25,6 +25,7 @@ #include "ObjectGuid.h" #include "RaceMask.h" #include "SharedDefines.h" +#include "TalentPackets.h" #include "TraitPacketsCommon.h" class Item; @@ -145,6 +146,7 @@ namespace WorldPackets uint16 TodayHK = 0; uint16 YesterdayHK = 0; uint8 LifetimeMaxRank = 0; + Talent::ClassicTalentInfoUpdate TalentInfo; TraitInspectInfo TraitsInfo; }; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 637b1ae8755..0dcf8eacb17 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -385,13 +385,6 @@ void ChangeBagSlotFlag::Read() _worldPacket >> Bits<1>(On); } -void ChangeBankBagSlotFlag::Read() -{ - _worldPacket >> BagIndex; - _worldPacket >> As<uint32>(FlagToChange); - _worldPacket >> Bits<1>(On); -} - void SetBackpackAutosortDisabled::Read() { _worldPacket >> Bits<1>(Disable); diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index 825e452f5cd..b783d6cc5a9 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -513,14 +513,6 @@ namespace WorldPackets void Read() override { } }; - class SortReagentBankBags final : public ClientPacket - { - public: - explicit SortReagentBankBags(WorldPacket&& packet) : ClientPacket(CMSG_SORT_REAGENT_BANK_BAGS, std::move(packet)) { } - - void Read() override { } - }; - class BagCleanupFinished final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp index 08edcc0bc0c..d1dae8ae299 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -19,7 +19,6 @@ #include "Item.h" #include "Loot.h" #include "PacketOperators.h" -#include "Player.h" namespace WorldPackets::Item { @@ -79,24 +78,6 @@ void ItemInstance::Initialize(::LootItem const& lootItem) } } -void ItemInstance::Initialize(::VoidStorageItem const* voidItem) -{ - ItemID = voidItem->ItemEntry; - - if (voidItem->FixedScalingLevel) - Modifications.Values.push_back({ .Value = int32(voidItem->FixedScalingLevel), .Type = ITEM_MODIFIER_TIMEWALKER_LEVEL }); - - if (voidItem->ArtifactKnowledgeLevel) - Modifications.Values.push_back({ .Value = int32(voidItem->ArtifactKnowledgeLevel), .Type = ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL }); - - if (!voidItem->BonusListIDs.empty()) - { - ItemBonus.emplace(); - ItemBonus->Context = voidItem->Context; - ItemBonus->BonusListIDs = voidItem->BonusListIDs; - } -} - bool ItemInstance::operator==(ItemInstance const& r) const { if (ItemID != r.ItemID) diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h index 552d25623e3..e54353fcbaf 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.h +++ b/src/server/game/Server/Packets/ItemPacketsCommon.h @@ -66,7 +66,6 @@ namespace WorldPackets void Initialize(::Item const* item); void Initialize(UF::SocketedGem const* gem); void Initialize(::LootItem const& lootItem); - void Initialize(::VoidStorageItem const* voidItem); uint32 ItemID = 0; Optional<ItemBonuses> ItemBonus; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index f6351382dd5..4f2a5bd132f 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -182,6 +182,7 @@ WorldPacket const* TriggerMovie::Write() return &_worldPacket; } + WorldPacket const* TriggerCinematic::Write() { _worldPacket << uint32(CinematicID); diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index b9796743e6c..629544a68de 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -318,9 +318,9 @@ ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineTurnData const& turnData) ByteBuffer& operator<<(ByteBuffer& data, MonsterSplineAnimTierTransition const& animTierTransition) { data << int32(animTierTransition.TierTransitionID); + data << uint8(animTierTransition.AnimTier); data << uint32(animTierTransition.StartTime); data << uint32(animTierTransition.EndTime); - data << uint8(animTierTransition.AnimTier); return data; } @@ -518,9 +518,9 @@ void CommonMovement::WriteCreateObjectSplineDataBlock(::Movement::MoveSpline con if (moveSpline.anim_tier) { data << int32(moveSpline.anim_tier->TierTransitionId); + data << uint8(moveSpline.anim_tier->AnimTier); data << uint32(moveSpline.effect_start_time); data << uint32(0); - data << uint8(moveSpline.anim_tier->AnimTier); } //if (HasUnknown901) diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index fa559dbef04..1c329d41239 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -458,6 +458,23 @@ WorldPacket const* GroupNewLeader::Write() return &_worldPacket; } +ByteBuffer& operator<<(ByteBuffer& data, LeaverInfo const& leaverInfo) +{ + data << leaverInfo.BnetAccountGUID; + data << float(leaverInfo.LeaveScore); + data << uint32(leaverInfo.SeasonID); + data << uint32(leaverInfo.TotalLeaves); + data << uint32(leaverInfo.TotalSuccesses); + data << int32(leaverInfo.ConsecutiveSuccesses); + data << leaverInfo.LastPenaltyTime; + data << leaverInfo.LeaverExpirationTime; + data << int32(leaverInfo.Unknown_1120); + data << Bits<1>(leaverInfo.LeaverStatus); + data.FlushBits(); + + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, PartyPlayerInfo const& playerInfo) { data << SizedString::BitsSize<6>(playerInfo.Name); @@ -465,6 +482,7 @@ ByteBuffer& operator<<(ByteBuffer& data, PartyPlayerInfo const& playerInfo) data << Bits<1>(playerInfo.Connected); data << Bits<1>(playerInfo.VoiceChatSilenced); data << Bits<1>(playerInfo.FromSocialQueue); + data << playerInfo.Leaver; data << playerInfo.GUID; data << uint8(playerInfo.Subgroup); data << uint8(playerInfo.Flags); @@ -477,6 +495,22 @@ ByteBuffer& operator<<(ByteBuffer& data, PartyPlayerInfo const& playerInfo) return data; } +ByteBuffer& operator<<(ByteBuffer& data, ChallengeModeData const& challengeMode) +{ + data << int32(challengeMode.Unknown_1120_1); + data << int32(challengeMode.Unknown_1120_2); + data << uint64(challengeMode.Unknown_1120_3); + data << int64(challengeMode.Unknown_1120_4); + data << challengeMode.KeystoneOwnerGUID; + data << challengeMode.LeaverGUID; + data << Bits<1>(challengeMode.IsActive); + data << Bits<1>(challengeMode.HasRestrictions); + data << Bits<1>(challengeMode.CanVoteAbandon); + data.FlushBits(); + + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, PartyLFGInfo const& lfgInfos) { data << uint32(lfgInfos.Slot); @@ -524,6 +558,7 @@ WorldPacket const* PartyUpdate::Write() _worldPacket << uint8(LeaderFactionGroup); _worldPacket << int32(PingRestriction); _worldPacket << Size<uint32>(PlayerList); + _worldPacket << OptionalInit(ChallengeMode); _worldPacket << OptionalInit(LfgInfos); _worldPacket << OptionalInit(LootSettings); _worldPacket << OptionalInit(DifficultySettings); @@ -538,6 +573,9 @@ WorldPacket const* PartyUpdate::Write() if (DifficultySettings) _worldPacket << *DifficultySettings; + if (ChallengeMode) + _worldPacket << *ChallengeMode; + if (LfgInfos) _worldPacket << *LfgInfos; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 8c287fe8b12..5b8e4c2ca1e 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -508,11 +508,26 @@ namespace WorldPackets std::string Name; }; + struct LeaverInfo + { + ObjectGuid BnetAccountGUID; + float LeaveScore = 0.0f; + uint32 SeasonID = 0; + uint32 TotalLeaves = 0; + uint32 TotalSuccesses = 0; + int32 ConsecutiveSuccesses = 0; + Timestamp<> LastPenaltyTime; + Timestamp<> LeaverExpirationTime; + int32 Unknown_1120 = 0; + bool LeaverStatus = false; + }; + struct PartyPlayerInfo { ObjectGuid GUID; std::string Name; std::string VoiceStateID; // same as bgs.protocol.club.v1.MemberVoiceState.id + LeaverInfo Leaver; uint8 Class = 0u; uint8 Subgroup = 0u; uint8 Flags = 0u; @@ -551,6 +566,19 @@ namespace WorldPackets uint32 LegacyRaidDifficultyID = 0u; }; + struct ChallengeModeData + { + int32 Unknown_1120_1 = 0; + int32 Unknown_1120_2 = 0; + uint64 Unknown_1120_3 = 0; + int64 Unknown_1120_4 = 0; + ObjectGuid KeystoneOwnerGUID; + ObjectGuid LeaverGUID; + bool IsActive = false; + bool HasRestrictions = false; + bool CanVoteAbandon = false; + }; + class PartyUpdate final : public ServerPacket { public: @@ -573,6 +601,7 @@ namespace WorldPackets std::vector<PartyPlayerInfo> PlayerList; + Optional<ChallengeModeData> ChallengeMode; Optional<PartyLFGInfo> LfgInfos; Optional<PartyLootSettings> LootSettings; Optional<PartyDifficultySettings> DifficultySettings; diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 633cae4f340..4d30b3b6fdc 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -83,7 +83,7 @@ namespace WorldPackets int32 CreatureDifficultyID = 0; int32 WidgetSetID = 0; int32 WidgetSetUnitConditionID = 0; - std::array<uint32, 2> Flags = { }; + std::array<uint32, 3> Flags = { }; std::array<uint32, 2> ProxyCreatureID = { }; std::array<std::string, 4> Name = { }; std::array<std::string, 4> NameAlt = { }; diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index d3414c11436..ee5c38e7b2f 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -127,8 +127,6 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket << uint32(KioskSessionDurationMinutes); _worldPacket << int64(RedeemForBalanceAmount); - _worldPacket << uint32(BpayStorePurchaseTimeout); - _worldPacket << uint32(ClubsPresenceDelay); _worldPacket << uint32(ClubPresenceUnsubscribeDelay); @@ -156,60 +154,58 @@ WorldPacket const* FeatureSystemStatus::Write() _worldPacket << Bits<1>(VoiceEnabled); _worldPacket << OptionalInit(EuropaTicketSystemStatus); - _worldPacket << Bits<1>(BpayStoreEnabled); _worldPacket << Bits<1>(BpayStoreAvailable); _worldPacket << Bits<1>(BpayStoreDisabledByParentalControls); _worldPacket << Bits<1>(ItemRestorationButtonEnabled); - _worldPacket << Bits<1>(BrowserEnabled); _worldPacket << OptionalInit(SessionAlert); - _worldPacket << Bits<1>(RAFSystem.Enabled); _worldPacket << Bits<1>(RAFSystem.RecruitingEnabled); + _worldPacket << Bits<1>(CharUndeleteEnabled); _worldPacket << Bits<1>(RestrictedAccount); _worldPacket << Bits<1>(CommerceServerEnabled); _worldPacket << Bits<1>(TutorialEnabled); _worldPacket << Bits<1>(VeteranTokenRedeemWillKick); _worldPacket << Bits<1>(WorldTokenRedeemWillKick); - _worldPacket << Bits<1>(KioskModeEnabled); _worldPacket << Bits<1>(CompetitiveModeEnabled); + _worldPacket << Bits<1>(RedeemForBalanceAvailable); _worldPacket << Bits<1>(WarModeEnabled); _worldPacket << Bits<1>(CommunitiesEnabled); _worldPacket << Bits<1>(BnetGroupsEnabled); _worldPacket << Bits<1>(CharacterCommunitiesEnabled); _worldPacket << Bits<1>(ClubPresenceAllowSubscribeAll); - _worldPacket << Bits<1>(VoiceChatParentalDisabled); _worldPacket << Bits<1>(VoiceChatParentalMuted); + _worldPacket << Bits<1>(QuestSessionEnabled); _worldPacket << Bits<1>(IsChatMuted); _worldPacket << Bits<1>(ClubFinderEnabled); _worldPacket << Bits<1>(CommunityFinderEnabled); _worldPacket << Bits<1>(BrowserCrashReporterEnabled); _worldPacket << Bits<1>(SpeakForMeAllowed); - _worldPacket << Bits<1>(DoesAccountNeedAADCPrompt); _worldPacket << Bits<1>(IsAccountOptedInToAADC); + _worldPacket << Bits<1>(LfgRequireAuthenticatorEnabled); _worldPacket << Bits<1>(ScriptsDisallowedForBeta); _worldPacket << Bits<1>(TimerunningEnabled); _worldPacket << Bits<1>(WarGamesEnabled); _worldPacket << Bits<1>(IsPlayerContentTrackingEnabled); _worldPacket << Bits<1>(SellAllJunkEnabled); - _worldPacket << Bits<1>(GroupFinderEnabled); _worldPacket << Bits<1>(IsPremadeGroupEnabled); + _worldPacket << Bits<1>(false); // unused 10.2.7 _worldPacket << Bits<1>(GuildEventsEditsEnabled); _worldPacket << Bits<1>(GuildTradeSkillsEnabled); - _worldPacket << SizedString::BitsSize<7>(Unknown1027); + _worldPacket << SizedString::BitsSize<10>(Unknown1027); _worldPacket << Bits<1>(BNSendWhisperUseV2Services); _worldPacket << Bits<1>(BNSendGameDataUseV2Services); _worldPacket << Bits<1>(IsAccountCurrencyTransferEnabled); - _worldPacket << Bits<1>(false); // unused 11.0.7 + _worldPacket << Bits<1>(false); // unused 11.0.7 _worldPacket << Bits<1>(LobbyMatchmakerQueueFromMainlineEnabled); _worldPacket << Bits<1>(CanSendLobbyMatchmakerPartyCustomizations); _worldPacket << Bits<1>(AddonProfilerEnabled); @@ -235,7 +231,6 @@ WorldPacket const* FeatureSystemStatus::Write() WorldPacket const* FeatureSystemStatusGlueScreen::Write() { - _worldPacket << Bits<1>(BpayStoreEnabled); _worldPacket << Bits<1>(BpayStoreAvailable); _worldPacket << Bits<1>(BpayStoreDisabledByParentalControls); _worldPacket << Bits<1>(CharUndeleteEnabled); @@ -243,8 +238,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << Bits<1>(VeteranTokenRedeemWillKick); _worldPacket << Bits<1>(WorldTokenRedeemWillKick); _worldPacket << Bits<1>(ExpansionPreorderInStore); - _worldPacket << Bits<1>(KioskModeEnabled); + _worldPacket << Bits<1>(CompetitiveModeEnabled); _worldPacket << Bits<1>(BoostEnabled); _worldPacket << Bits<1>(TrialBoostEnabled); @@ -252,8 +247,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << Bits<1>(PaidCharacterTransfersBetweenBnetAccountsEnabled); _worldPacket << Bits<1>(LiveRegionCharacterListEnabled); _worldPacket << Bits<1>(LiveRegionCharacterCopyEnabled); - _worldPacket << Bits<1>(LiveRegionAccountCopyEnabled); + _worldPacket << Bits<1>(LiveRegionKeyBindingsCopyEnabled); _worldPacket << Bits<1>(BrowserCrashReporterEnabled); _worldPacket << Bits<1>(IsEmployeeAccount); @@ -261,8 +256,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << Bits<1>(NameReservationOnly); _worldPacket << OptionalInit(LaunchDurationETA); _worldPacket << Bits<1>(TimerunningEnabled); - _worldPacket << Bits<1>(ScriptsDisallowedForBeta); + _worldPacket << Bits<1>(PlayerIdentityOptionsEnabled); _worldPacket << Bits<1>(AccountExportEnabled); _worldPacket << Bits<1>(AccountLockedPostExport); @@ -270,8 +265,8 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << SizedCString::BitsSize<11>(RealmHiddenAlert); _worldPacket << Bits<1>(BNSendWhisperUseV2Services); - _worldPacket << Bits<1>(BNSendGameDataUseV2Services); + _worldPacket << Bits<1>(CharacterSelectListModeRealmless); _worldPacket << Bits<1>(WowTokenLimitedMode); _worldPacket << Bits<1>(false); // unused 11.1.7 @@ -288,7 +283,6 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write() _worldPacket << int64(RedeemForBalanceAmount); _worldPacket << int32(MaxCharactersOnThisRealm); _worldPacket << Size<uint32>(LiveRegionCharacterCopySourceRegions); - _worldPacket << uint32(BpayStorePurchaseTimeout); _worldPacket << int32(ActiveBoostType); _worldPacket << int32(TrialBoostType); _worldPacket << int32(MinimumExpansionLevel); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 9a3cd43350d..b74adbc0fca 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -119,9 +119,7 @@ namespace WorldPackets WorldPacket const* Write() override; bool VoiceEnabled = false; - bool BrowserEnabled = false; bool BpayStoreAvailable = false; - bool BpayStoreEnabled = false; Optional<SessionAlertConfig> SessionAlert; Optional<EuropaTicketConfig> EuropaTicketSystemStatus; uint32 CfgRealmID = 0; @@ -211,7 +209,6 @@ namespace WorldPackets bool BpayStoreAvailable = false; // NYI bool BpayStoreDisabledByParentalControls = false; // NYI bool CharUndeleteEnabled = false; - bool BpayStoreEnabled = false; bool CommerceServerEnabled = false; // NYI bool VeteranTokenRedeemWillKick = false; // NYI bool WorldTokenRedeemWillKick = false; // NYI @@ -244,7 +241,6 @@ namespace WorldPackets uint32 CommercePricePollTimeSeconds = 0; // NYI int64 RedeemForBalanceAmount = 0; // NYI int32 MaxCharactersOnThisRealm = 0; - uint32 BpayStorePurchaseTimeout = 0; // NYI int32 ActiveBoostType = 0; // NYI int32 TrialBoostType = 0; // NYI int32 MinimumExpansionLevel = 0; diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp index 6fd35cc00c0..63487076b02 100644 --- a/src/server/game/Server/Packets/TalentPackets.cpp +++ b/src/server/game/Server/Packets/TalentPackets.cpp @@ -36,6 +36,49 @@ ByteBuffer& operator<<(ByteBuffer& data, PvPTalent const& pvpTalent) return data; } +ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentEntry const& talentEntry) +{ + data << int32(talentEntry.TalentID); + data << int32(talentEntry.Rank); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentGroupInfo const& talentGroupInfo) +{ + data << uint8(talentGroupInfo.NumTalents); + data << Size<uint32>(talentGroupInfo.Talents); + + data << uint8(talentGroupInfo.NumGlyphs); + data << Size<uint32>(talentGroupInfo.GlyphIDs); + + data << int8(talentGroupInfo.Role); + data << int32(talentGroupInfo.PrimarySpecialization); + + for (ClassicTalentEntry const& talentEntry : talentGroupInfo.Talents) + data << talentEntry; + + if (!talentGroupInfo.GlyphIDs.empty()) + data.append(talentGroupInfo.GlyphIDs.data(), talentGroupInfo.GlyphIDs.size()); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentInfoUpdate const& talentInfoUpdate) +{ + data << int32(talentInfoUpdate.UnspentTalentPoints); + data << uint8(talentInfoUpdate.ActiveGroup); + data << Size<uint32>(talentInfoUpdate.Talents); + + for (ClassicTalentGroupInfo const& talents : talentInfoUpdate.Talents) + data << talents; + + data << Bits<1>(talentInfoUpdate.IsPetTalents); + data.FlushBits(); + + return data; +} + WorldPacket const* UpdateTalentData::Write() { _worldPacket << uint8(Info.ActiveGroup); @@ -47,12 +90,16 @@ WorldPacket const* UpdateTalentData::Write() _worldPacket << uint32(talentGroupInfo.SpecID); _worldPacket << Size<uint32>(talentGroupInfo.TalentIDs); _worldPacket << Size<uint32>(talentGroupInfo.PvPTalents); + _worldPacket << Size<uint32>(talentGroupInfo.GlyphIDs); for (uint16 talent : talentGroupInfo.TalentIDs) _worldPacket << uint16(talent); for (PvPTalent talent : talentGroupInfo.PvPTalents) _worldPacket << talent; + + for (uint32 talent : talentGroupInfo.GlyphIDs) + _worldPacket << uint16(talent); } return &_worldPacket; diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h index 8b342345109..5b9566e83c2 100644 --- a/src/server/game/Server/Packets/TalentPackets.h +++ b/src/server/game/Server/Packets/TalentPackets.h @@ -38,6 +38,7 @@ namespace WorldPackets uint32 SpecID = 0; std::vector<uint16> TalentIDs; std::vector<PvPTalent> PvPTalents; + std::vector<uint32> GlyphIDs; }; struct TalentInfoUpdate @@ -47,6 +48,30 @@ namespace WorldPackets std::vector<TalentGroupInfo> TalentGroups; }; + struct ClassicTalentEntry + { + int32 TalentID = 0; + int32 Rank = 0; + }; + + struct ClassicTalentGroupInfo + { + uint8 NumTalents = 0; + std::vector<ClassicTalentEntry> Talents; + uint8 NumGlyphs = 0; + std::vector<uint16> GlyphIDs; + int8 Role = 0; + int32 PrimarySpecialization = 0; + }; + + struct ClassicTalentInfoUpdate + { + int32 UnspentTalentPoints = 0; + uint8 ActiveGroup = 0; + bool IsPetTalents = false; + std::vector<ClassicTalentGroupInfo> Talents; + }; + class UpdateTalentData final : public ServerPacket { public: @@ -141,6 +166,8 @@ namespace WorldPackets int32 SpellID = 0; std::vector<PvPTalent> Talents; }; + + ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentInfoUpdate const& talentInfoInfo); } } diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.cpp b/src/server/game/Server/Packets/TraitPacketsCommon.cpp index 704d6bc6bf8..692ed9cb330 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.cpp +++ b/src/server/game/Server/Packets/TraitPacketsCommon.cpp @@ -66,6 +66,7 @@ ByteBuffer& operator>>(ByteBuffer& data, TraitEntry& traitEntry) data >> traitEntry.TraitNodeEntryID; data >> traitEntry.Rank; data >> traitEntry.GrantedRanks; + data >> traitEntry.BonusRanks; return data; } @@ -76,6 +77,7 @@ ByteBuffer& operator<<(ByteBuffer& data, TraitEntry const& traitEntry) data << int32(traitEntry.TraitNodeEntryID); data << int32(traitEntry.Rank); data << int32(traitEntry.GrantedRanks); + data << int32(traitEntry.BonusRanks); return data; } diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.h b/src/server/game/Server/Packets/TraitPacketsCommon.h index 8cf075bc7a8..94b88e29746 100644 --- a/src/server/game/Server/Packets/TraitPacketsCommon.h +++ b/src/server/game/Server/Packets/TraitPacketsCommon.h @@ -41,6 +41,7 @@ struct TraitEntry int32 TraitNodeEntryID = 0; int32 Rank = 0; int32 GrantedRanks = 0; + int32 BonusRanks = 0; }; struct TraitSubTreeCache diff --git a/src/server/game/Server/Packets/VoidStoragePackets.cpp b/src/server/game/Server/Packets/VoidStoragePackets.cpp deleted file mode 100644 index 0b7cef0f6be..00000000000 --- a/src/server/game/Server/Packets/VoidStoragePackets.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "VoidStoragePackets.h" -#include "PacketOperators.h" - -namespace WorldPackets::VoidStorage -{ -WorldPacket const* VoidTransferResult::Write() -{ - _worldPacket << int32(Result); - - return &_worldPacket; -} - -void UnlockVoidStorage::Read() -{ - _worldPacket >> Npc; -} - -void QueryVoidStorage::Read() -{ - _worldPacket >> Npc; -} - -WorldPacket const* VoidStorageFailed::Write() -{ - _worldPacket << uint8(Reason); - - return &_worldPacket; -} - -ByteBuffer& operator<<(ByteBuffer& data, VoidItem const& voidItem) -{ - data << voidItem.Guid; - data << voidItem.Creator; - data << uint32(voidItem.Slot); - data << voidItem.Item; - - return data; -} - -WorldPacket const* VoidStorageContents::Write() -{ - _worldPacket.reserve(1 + Items.size() * sizeof(VoidItem)); - - _worldPacket << BitsSize<8>(Items); - _worldPacket.FlushBits(); - - for (VoidItem const& voidItem : Items) - _worldPacket << voidItem; - - return &_worldPacket; -} - -void VoidStorageTransfer::Read() -{ - _worldPacket >> Npc; - _worldPacket >> Size<uint32>(Deposits); - _worldPacket >> Size<uint32>(Withdrawals); - - for (ObjectGuid& deposit : Deposits) - _worldPacket >> deposit; - - for (ObjectGuid& withdrawal : Withdrawals) - _worldPacket >> withdrawal; -} - -WorldPacket const* VoidStorageTransferChanges::Write() -{ - _worldPacket.reserve(1 + AddedItems.size() * sizeof(VoidItem) + RemovedItems.size() * 16); - - _worldPacket << BitsSize<4>(AddedItems); - _worldPacket << BitsSize<4>(RemovedItems); - _worldPacket.FlushBits(); - - for (VoidItem const& addedItem : AddedItems) - _worldPacket << addedItem; - - for (ObjectGuid const& removedItem : RemovedItems) - _worldPacket << removedItem; - - return &_worldPacket; -} - -void SwapVoidItem::Read() -{ - _worldPacket >> Npc; - _worldPacket >> VoidItemGuid; - _worldPacket >> DstSlot; -} - -WorldPacket const* VoidItemSwapResponse::Write() -{ - _worldPacket << VoidItemA << uint32(VoidItemSlotA); - _worldPacket << VoidItemB << uint32(VoidItemSlotB); - - return &_worldPacket; -} -} diff --git a/src/server/game/Server/Packets/VoidStoragePackets.h b/src/server/game/Server/Packets/VoidStoragePackets.h deleted file mode 100644 index c7a9793cd0b..00000000000 --- a/src/server/game/Server/Packets/VoidStoragePackets.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef TRINITYCORE_VOID_STORAGE_PACKETS_H -#define TRINITYCORE_VOID_STORAGE_PACKETS_H - -#include "Packet.h" -#include "ItemPacketsCommon.h" -#include "ObjectGuid.h" -#include "SharedDefines.h" - -namespace WorldPackets -{ - namespace VoidStorage - { - class VoidTransferResult final : public ServerPacket - { - public: - explicit VoidTransferResult(int32 result) : ServerPacket(SMSG_VOID_TRANSFER_RESULT, 4), Result(result) { } - - WorldPacket const* Write() override; - - int32 Result; - }; - - class UnlockVoidStorage final : public ClientPacket - { - public: - explicit UnlockVoidStorage(WorldPacket&& packet) : ClientPacket(CMSG_UNLOCK_VOID_STORAGE, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - }; - - class QueryVoidStorage final : public ClientPacket - { - public: - explicit QueryVoidStorage(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_VOID_STORAGE, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - }; - - class VoidStorageFailed final : public ServerPacket - { - public: - explicit VoidStorageFailed() : ServerPacket(SMSG_VOID_STORAGE_FAILED, 1) { } - - WorldPacket const* Write() override; - - uint8 Reason = 0; - }; - - struct VoidItem - { - ObjectGuid Guid; - ObjectGuid Creator; - uint32 Slot = 0; - WorldPackets::Item::ItemInstance Item; - }; - - class VoidStorageContents final : public ServerPacket - { - public: - explicit VoidStorageContents() : ServerPacket(SMSG_VOID_STORAGE_CONTENTS, 0) { } - - WorldPacket const* Write() override; - - std::vector<VoidItem> Items; - }; - - class VoidStorageTransfer final : public ClientPacket - { - public: - explicit VoidStorageTransfer(WorldPacket&& packet) : ClientPacket(CMSG_VOID_STORAGE_TRANSFER, std::move(packet)) { } - - void Read() override; - - Array<ObjectGuid, VOID_STORAGE_MAX_WITHDRAW> Withdrawals; - Array<ObjectGuid, VOID_STORAGE_MAX_DEPOSIT> Deposits; - ObjectGuid Npc; - }; - - class VoidStorageTransferChanges final : public ServerPacket - { - public: - explicit VoidStorageTransferChanges() : ServerPacket(SMSG_VOID_STORAGE_TRANSFER_CHANGES, 0) { } - - WorldPacket const* Write() override; - - std::vector<ObjectGuid> RemovedItems; - std::vector<VoidItem> AddedItems; - }; - - class SwapVoidItem final : public ClientPacket - { - public: - explicit SwapVoidItem(WorldPacket&& packet) : ClientPacket(CMSG_SWAP_VOID_ITEM, std::move(packet)) { } - - void Read() override; - - ObjectGuid Npc; - ObjectGuid VoidItemGuid; - uint32 DstSlot = 0; - }; - - class VoidItemSwapResponse final : public ServerPacket - { - public: - explicit VoidItemSwapResponse() : ServerPacket(SMSG_VOID_ITEM_SWAP_RESPONSE, 16 + 16 + 4 + 4) { } - - WorldPacket const* Write() override; - - ObjectGuid VoidItemA; - ObjectGuid VoidItemB; - uint32 VoidItemSlotA = 0; - uint32 VoidItemSlotB = 0; - }; - } -} - -#endif // TRINITYCORE_VOID_STORAGE_PACKETS_H diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ec6d0792dbc..23add3e1448 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -195,10 +195,9 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoBankItemOpcode); - DEFINE_HANDLER(CMSG_AUTOBANK_REAGENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankReagentOpcode); DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoStoreBankItemOpcode); - DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_REAGENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankReagentOpcode); DEFINE_HANDLER(CMSG_AUTO_DEPOSIT_ACCOUNT_BANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_AUTO_DEPOSIT_CHARACTER_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoDepositCharacterBank); DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoEquipItemOpcode); DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAutoEquipItemSlotOpcode); DEFINE_HANDLER(CMSG_AUTO_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoGuildBankItem); @@ -251,11 +250,9 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_BONUS_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBugReportOpcode); DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode); - DEFINE_HANDLER(CMSG_BUY_ACCOUNT_BANK_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BUY_ACCOUNT_BANK_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankTab); DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuybackItem); - DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyBankSlotOpcode); DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBuyItemOpcode); - DEFINE_HANDLER(CMSG_BUY_REAGENT_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyReagentBankOpcode); DEFINE_HANDLER(CMSG_CAGE_BATTLE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCageBattlePet); DEFINE_HANDLER(CMSG_CALENDAR_ADD_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent); DEFINE_HANDLER(CMSG_CALENDAR_COMMUNITY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCommunityInvite); @@ -288,7 +285,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode); DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeBagSlotFlag); - DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChangeBankBagSlotFlag); + DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_REALM_TICKET, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlenetChangeRealmTicket); DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSubGroupOpcode); @@ -426,7 +423,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_DELVE_TELEPORT_OUT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode); DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode); - DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReagentBankDepositOpcode); DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleDestroyItemOpcode); DEFINE_HANDLER(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode); DEFINE_HANDLER(CMSG_DF_CONFIRM_EXPAND_SEARCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -557,6 +553,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateRolePoll); DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode); DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleInspectOpcode); + DEFINE_HANDLER(CMSG_INSTANCE_ABANDON_VOTE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse); DEFINE_HANDLER(CMSG_ISLAND_QUEUE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ITEM_PURCHASE_REFUND, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefund); @@ -795,7 +792,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_QUERY_SELECTED_WOW_LABS_AREA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTimeOpcode); DEFINE_HANDLER(CMSG_QUERY_TREASURE_PICKER, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTreasurePicker); - DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageQuery); DEFINE_HANDLER(CMSG_QUERY_WOW_LABS_AREA_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept); DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); @@ -951,7 +947,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SORT_ACCOUNT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortAccountBankBags); DEFINE_HANDLER(CMSG_SORT_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortBags); DEFINE_HANDLER(CMSG_SORT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortBankBags); - DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortReagentBankBags); DEFINE_HANDLER(CMSG_SPECTATE_CHANGE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SPAWN_TRACKING_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSpawnTrackingUpdate); DEFINE_HANDLER(CMSG_SPELL_CLICK, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSpellClick); @@ -964,6 +959,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SPLIT_ITEM_TO_GUILD_BANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitItemToGuildBank); DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleStandStateChangeOpcode); DEFINE_HANDLER(CMSG_START_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_START_INSTANCE_ABANDON_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_STORE_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleStoreGuildBankItem); @@ -979,7 +975,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSwapItem); DEFINE_HANDLER(CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapItemWithGuildBankItem); DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSwapSubGroupsOpcode); - DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidSwapItem); DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTabardVendorActivateOpcode); DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGossipHelloOpcode); DEFINE_HANDLER(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode); @@ -1007,9 +1002,8 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUnlearnSkillOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageUnlock); DEFINE_HANDLER(CMSG_UPDATE_AADC_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleChatUpdateAADCStatus); - DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateBankTabSettings); DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData); DEFINE_HANDLER(CMSG_UPDATE_AREA_TRIGGER_VISUAL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateAreaTriggerVisual); DEFINE_HANDLER(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -1032,7 +1026,6 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_CHAT_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_CHAT_LOGIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleVoidStorageTransfer); DEFINE_HANDLER(CMSG_WARDEN3_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenData); DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoIsOpcode); @@ -1096,12 +1089,8 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_POI_UPDATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_UNATTACH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CLEAR_OPPONENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1246,6 +1235,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_SET_LEAVER_PENALTY_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1415,7 +1405,6 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIMATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_OBJECT_RELINK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_RANDOM_TRANSMOG_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_SPAWN_TRACKING_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1599,6 +1588,10 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ABANDON_VOTE_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_END, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1712,6 +1705,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_VARS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -2097,6 +2091,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_INSTANCE_LEAVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LOOT_METHOD_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -2210,6 +2205,7 @@ void OpcodeTable::InitializeServerOpcodes() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLOAD_CHILD_MAP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNSET_INSTANCE_LEAVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_AADC_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 475bf20ab3e..65ea46c0c86 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -36,2191 +36,2188 @@ constexpr uint32 UNKNOWN_OPCODE = 0xBADD; // special marker value for uninitia enum OpcodeClient : uint32 { - CMSG_ABANDON_NPE_RESPONSE = 0x31029A, - CMSG_ACCEPT_GUILD_INVITE = 0x360029, - CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x31025B, - CMSG_ACCEPT_SOCIAL_CONTRACT = 0x360172, - CMSG_ACCEPT_TRADE = 0x310004, - CMSG_ACCEPT_WARGAME_INVITE = 0x36000C, - CMSG_ACCOUNT_BANK_DEPOSIT_MONEY = 0x3102DD, - CMSG_ACCOUNT_BANK_WITHDRAW_MONEY = 0x3102DE, - CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x36015E, - CMSG_ACCOUNT_STORE_BEGIN_PURCHASE_OR_REFUND = 0x3600BE, - CMSG_ACTIVATE_SOULBIND = 0x310289, - CMSG_ACTIVATE_TAXI = 0x32003E, - CMSG_ADDON_LIST = 0x360004, - CMSG_ADD_ACCOUNT_COSMETIC = 0x310170, - CMSG_ADD_BATTLENET_FRIEND = 0x360084, - CMSG_ADD_FRIEND = 0x3600FC, - CMSG_ADD_IGNORE = 0x360100, - CMSG_ADD_TOY = 0x31016F, - CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3100B3, - CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x31028C, - CMSG_ADVENTURE_MAP_START_QUEST = 0x31022C, - CMSG_ALTER_APPEARANCE = 0x32008F, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x320043, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x320044, - CMSG_AREA_TRIGGER = 0x310086, - CMSG_ARTIFACT_ADD_POWER = 0x310056, - CMSG_ARTIFACT_SET_APPEARANCE = 0x310058, - CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x3100BF, - CMSG_ATTACK_STOP = 0x31011D, - CMSG_ATTACK_SWING = 0x31011C, - CMSG_AUCTIONABLE_TOKEN_SELL = 0x360112, - CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x360113, - CMSG_AUCTION_BROWSE_QUERY = 0x320063, - CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x32006B, - CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x32006A, - CMSG_AUCTION_GET_COMMODITY_QUOTE = 0x320069, - CMSG_AUCTION_HELLO_REQUEST = 0x32005E, - CMSG_AUCTION_LIST_BIDDED_ITEMS = 0x320067, - CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0x320068, - CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0x320064, - CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0x320065, - CMSG_AUCTION_LIST_OWNED_ITEMS = 0x320066, - CMSG_AUCTION_PLACE_BID = 0x320062, - CMSG_AUCTION_REMOVE_ITEM = 0x320060, - CMSG_AUCTION_REPLICATE_ITEMS = 0x320061, - CMSG_AUCTION_SELL_COMMODITY = 0x32006C, - CMSG_AUCTION_SELL_ITEM = 0x32005F, - CMSG_AUCTION_SET_FAVORITE_ITEM = 0x36015F, - CMSG_AUTH_CONTINUED_SESSION = 0x370002, - CMSG_AUTH_SESSION = 0x370001, - CMSG_AUTOBANK_ITEM = 0x330003, - CMSG_AUTOBANK_REAGENT = 0x330005, - CMSG_AUTOSTORE_BANK_ITEM = 0x330002, - CMSG_AUTOSTORE_BANK_REAGENT = 0x330004, - CMSG_AUTO_DEPOSIT_ACCOUNT_BANK = 0x3102E7, - CMSG_AUTO_EQUIP_ITEM = 0x330006, - CMSG_AUTO_EQUIP_ITEM_SLOT = 0x33000B, - CMSG_AUTO_GUILD_BANK_ITEM = 0x32004A, - CMSG_AUTO_STORE_BAG_ITEM = 0x330007, - CMSG_AUTO_STORE_GUILD_BANK_ITEM = 0x320053, - CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x310257, - CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x310238, - CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x310259, - CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x310258, - CMSG_BANKER_ACTIVATE = 0x320046, - CMSG_BATTLEFIELD_LEAVE = 0x31001F, - CMSG_BATTLEFIELD_LIST = 0x31002A, - CMSG_BATTLEFIELD_PORT = 0x3200C5, - CMSG_BATTLEMASTER_HELLO = 0x31018E, - CMSG_BATTLEMASTER_JOIN = 0x3200BC, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x3200BD, - CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3200C3, - CMSG_BATTLEMASTER_JOIN_RATED_BG_BLITZ = 0x3200BF, - CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = 0x3200BE, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3200C0, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x3600FF, - CMSG_BATTLENET_REQUEST = 0x360120, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x3600F9, - CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x36013C, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x3600F8, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x3600EF, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS = 0x360162, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x3600E6, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x3600E7, - CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x360135, - CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x360131, - CMSG_BATTLE_PAY_START_PURCHASE = 0x3600F7, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36011E, - CMSG_BATTLE_PET_CLEAR_FANFARE = 0x2B0002, - CMSG_BATTLE_PET_DELETE_PET = 0x36004F, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x360050, - CMSG_BATTLE_PET_MODIFY_NAME = 0x360052, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x36004E, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x36004D, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x360057, - CMSG_BATTLE_PET_SET_FLAGS = 0x36005A, - CMSG_BATTLE_PET_SUMMON = 0x360053, - CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x310090, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31008F, - CMSG_BEGIN_TRADE = 0x310001, - CMSG_BINDER_ACTIVATE = 0x320045, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3200CD, - CMSG_BLACK_MARKET_OPEN = 0x3200CB, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3200CC, - CMSG_BONUS_ROLL = 0x31025A, - CMSG_BUG_REPORT = 0x3600AF, - CMSG_BUSY_TRADE = 0x310002, - CMSG_BUY_ACCOUNT_BANK_TAB = 0x320122, - CMSG_BUY_BACK_ITEM = 0x320037, - CMSG_BUY_BANK_SLOT = 0x320047, - CMSG_BUY_ITEM = 0x320036, - CMSG_BUY_REAGENT_BANK = 0x320048, - CMSG_CAGE_BATTLE_PET = 0x3100A3, - CMSG_CALENDAR_ADD_EVENT = 0x3600A7, - CMSG_CALENDAR_COMMUNITY_INVITE = 0x36009B, - CMSG_CALENDAR_COMPLAIN = 0x3600A3, - CMSG_CALENDAR_COPY_EVENT = 0x3600A2, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x3600A5, - CMSG_CALENDAR_GET = 0x360099, - CMSG_CALENDAR_GET_EVENT = 0x36009A, - CMSG_CALENDAR_GET_NUM_PENDING = 0x3600A4, - CMSG_CALENDAR_INVITE = 0x36009C, - CMSG_CALENDAR_MODERATOR_STATUS = 0x3600A0, - CMSG_CALENDAR_REMOVE_EVENT = 0x3600A1, - CMSG_CALENDAR_REMOVE_INVITE = 0x36009D, - CMSG_CALENDAR_RSVP = 0x36009E, - CMSG_CALENDAR_STATUS = 0x36009F, - CMSG_CALENDAR_UPDATE_EVENT = 0x3600A8, - CMSG_CANCEL_AURA = 0x31005A, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x320081, - CMSG_CANCEL_CAST = 0x310176, - CMSG_CANCEL_CHANNELLING = 0x310137, - CMSG_CANCEL_GROWTH_AURA = 0x31013F, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3100CC, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x310059, - CMSG_CANCEL_MOUNT_AURA = 0x310152, - CMSG_CANCEL_QUEUED_SPELL = 0x31002B, - CMSG_CANCEL_TEMP_ENCHANTMENT = 0x32008C, - CMSG_CANCEL_TRADE = 0x310006, - CMSG_CAN_DUEL = 0x36008C, - CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x360130, - CMSG_CAST_SPELL = 0x310173, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x2E0002, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x310210, - CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x310211, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3101F1, - CMSG_CHANGE_REALM_TICKET = 0x360125, - CMSG_CHANGE_SUB_GROUP = 0x360076, - CMSG_CHARACTER_CHECK_UPGRADE = 0x3600F2, - CMSG_CHARACTER_RENAME_REQUEST = 0x3600ED, - CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x3600F0, - CMSG_CHARACTER_UPGRADE_START = 0x3600F1, - CMSG_CHAR_CUSTOMIZE = 0x3600B6, - CMSG_CHAR_DELETE = 0x3600C8, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3600BC, - CMSG_CHAT_ADDON_MESSAGE = 0x2D002A, - CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x2D002B, - CMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_REQUEST = 0x2D0032, - CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x2D001F, - CMSG_CHAT_CHANNEL_BAN = 0x2D001D, - CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x2D0022, - CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x2D0012, - CMSG_CHAT_CHANNEL_INVITE = 0x2D001B, - CMSG_CHAT_CHANNEL_KICK = 0x2D001C, - CMSG_CHAT_CHANNEL_LIST = 0x2D0011, - CMSG_CHAT_CHANNEL_MODERATE = 0x2D0016, - CMSG_CHAT_CHANNEL_MODERATOR = 0x2D0017, - CMSG_CHAT_CHANNEL_OWNER = 0x2D0015, - CMSG_CHAT_CHANNEL_PASSWORD = 0x2D0013, - CMSG_CHAT_CHANNEL_SET_OWNER = 0x2D0014, - CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x2D0020, - CMSG_CHAT_CHANNEL_UNBAN = 0x2D001E, - CMSG_CHAT_CHANNEL_UNMODERATOR = 0x2D0018, - CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x2D0021, - CMSG_CHAT_DROP_CAUTIONARY_CHAT_MESSAGE = 0x2D000A, - CMSG_CHAT_JOIN_CHANNEL = 0x2D0000, - CMSG_CHAT_LEAVE_CHANNEL = 0x2D0001, - CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_INSTANCE_CHAT = 0x2D0031, - CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_PARTY = 0x2D0030, - CMSG_CHAT_MESSAGE_AFK = 0x2D000F, - CMSG_CHAT_MESSAGE_CHANNEL = 0x2D0007, - CMSG_CHAT_MESSAGE_DND = 0x2D0010, - CMSG_CHAT_MESSAGE_EMOTE = 0x2D0024, - CMSG_CHAT_MESSAGE_GUILD = 0x2D000D, - CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x2D0028, - CMSG_CHAT_MESSAGE_OFFICER = 0x2D000E, - CMSG_CHAT_MESSAGE_PARTY = 0x2D0026, - CMSG_CHAT_MESSAGE_RAID = 0x2D0027, - CMSG_CHAT_MESSAGE_RAID_WARNING = 0x2D0029, - CMSG_CHAT_MESSAGE_SAY = 0x2D0023, - CMSG_CHAT_MESSAGE_WHISPER = 0x2D0008, - CMSG_CHAT_MESSAGE_YELL = 0x2D0025, - CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x2D0005, - CMSG_CHAT_REPORT_FILTERED = 0x2D0004, - CMSG_CHAT_REPORT_IGNORED = 0x2D0003, - CMSG_CHAT_SEND_CAUTIONARY_CHANNEL_MESSAGE = 0x2D000B, - CMSG_CHAT_SEND_CAUTIONARY_CHAT_MESSAGE = 0x2D0009, - CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x2D0006, - CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x36006F, - CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x31010E, - CMSG_CHOICE_RESPONSE = 0x31017B, - CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x310288, - CMSG_CLAIM_WEEKLY_REWARD = 0x310265, - CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x3102C2, - CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0x3100C3, - CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x3102C4, - CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x3102C1, - CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x3102C0, - CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x3102C5, - CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0x3100C2, - CMSG_CLEAR_NEW_APPEARANCE = 0x2B0005, - CMSG_CLEAR_RAID_MARKER = 0x310052, - CMSG_CLEAR_TRADE_ITEM = 0x310008, - CMSG_CLIENT_PORT_GRAVEYARD = 0x3200C7, - CMSG_CLOSE_INTERACTION = 0x320025, - CMSG_CLOSE_QUEST_CHOICE = 0x31017C, - CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x310290, - CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x3102C6, - CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x360147, - CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x360145, - CMSG_CLUB_FINDER_POST = 0x360142, - CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x360149, - CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x360143, - CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x360144, - CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x360148, - CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x36014A, - CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x360146, - CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST = 0x360165, - CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x360122, - CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x36005D, - CMSG_COMMENTATOR_ENABLE = 0x36001C, - CMSG_COMMENTATOR_ENTER_INSTANCE = 0x360020, - CMSG_COMMENTATOR_EXIT_INSTANCE = 0x360021, - CMSG_COMMENTATOR_GET_MAP_INFO = 0x36001D, - CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x36001F, - CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x36001E, - CMSG_COMMENTATOR_SPECTATE = 0x360163, - CMSG_COMMENTATOR_START_WARGAME = 0x36001B, - CMSG_COMMERCE_TOKEN_GET_COUNT = 0x360110, - CMSG_COMMERCE_TOKEN_GET_LOG = 0x36011A, - CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x360111, - CMSG_COMPLAINT = 0x360096, - CMSG_COMPLETE_CINEMATIC = 0x3200E5, - CMSG_COMPLETE_MOVIE = 0x320077, - CMSG_CONFIRM_ARTIFACT_RESPEC = 0x310057, - CMSG_CONFIRM_PROFESSION_RESPEC = 0x3100C6, - CMSG_CONFIRM_RESPEC_WIPE = 0x3100C5, - CMSG_CONNECT_TO_FAILED = 0x360000, - CMSG_CONSUMABLE_TOKEN_BUY = 0x360115, - CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x360116, - CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x360114, - CMSG_CONSUMABLE_TOKEN_REDEEM = 0x360118, - CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x360119, - CMSG_CONTENT_TRACKING_START_TRACKING = 0x3102D6, - CMSG_CONTENT_TRACKING_STOP_TRACKING = 0x3102D7, - CMSG_CONTRIBUTION_CONTRIBUTE = 0x3200FA, - CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x3200FB, - CMSG_CONVERSATION_CINEMATIC_READY = 0x3200E7, - CMSG_CONVERSATION_LINE_STARTED = 0x3200E6, - CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT = 0x3102E6, - CMSG_CONVERT_RAID = 0x360078, - CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x32010E, - CMSG_CRAFTING_ORDER_CANCEL = 0x32011A, - CMSG_CRAFTING_ORDER_CLAIM = 0x320117, - CMSG_CRAFTING_ORDER_CREATE = 0x320113, - CMSG_CRAFTING_ORDER_FULFILL = 0x320119, - CMSG_CRAFTING_ORDER_GET_NPC_REWARD_INFO = 0x320116, - CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x320115, - CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x320114, - CMSG_CRAFTING_ORDER_REJECT = 0x32011B, - CMSG_CRAFTING_ORDER_RELEASE = 0x320118, - CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0x32011C, - CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x32011D, - CMSG_CREATE_CHARACTER = 0x36006E, - CMSG_CREATE_SHIPMENT = 0x3101DA, - CMSG_DB_QUERY_BULK = 0x360010, - CMSG_DECLINE_GUILD_INVITES = 0x3200B9, - CMSG_DECLINE_PETITION = 0x3200D4, - CMSG_DELETE_EQUIPMENT_SET = 0x3200A5, - CMSG_DELVE_TELEPORT_OUT = 0x320129, - CMSG_DEL_FRIEND = 0x3600FD, - CMSG_DEL_IGNORE = 0x360101, - CMSG_DEPOSIT_REAGENT_BANK = 0x31021A, - CMSG_DESTROY_ITEM = 0x310169, - CMSG_DF_BOOT_PLAYER_VOTE = 0x360044, - CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x360036, - CMSG_DF_GET_JOIN_STATUS = 0x360042, - CMSG_DF_GET_SYSTEM_INFO = 0x360041, - CMSG_DF_JOIN = 0x360037, - CMSG_DF_LEAVE = 0x360040, - CMSG_DF_PROPOSAL_RESPONSE = 0x360035, - CMSG_DF_READY_CHECK_RESPONSE = 0x360048, - CMSG_DF_SET_ROLES = 0x360043, - CMSG_DF_TELEPORT = 0x360045, - CMSG_DISCARDED_TIME_SYNC_ACKS = 0x34005E, - CMSG_DISMISS_CRITTER = 0x320093, - CMSG_DO_COUNTDOWN = 0x360141, - CMSG_DO_MASTER_LOOT_ROLL = 0x3100CB, - CMSG_DO_READY_CHECK = 0x36005E, - CMSG_DUEL_RESPONSE = 0x32007C, - CMSG_EJECT_PASSENGER = 0x310103, - CMSG_EMOTE = 0x3200E1, - CMSG_ENABLE_NAGLE = 0x370007, - CMSG_ENABLE_TAXI_NODE = 0x32003C, - CMSG_ENGINE_SURVEY = 0x36010F, - CMSG_ENTER_ENCRYPTED_MODE_ACK = 0x370003, - CMSG_ENUM_CHARACTERS = 0x360014, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x360109, - CMSG_FAR_SIGHT = 0x320082, - CMSG_GAME_EVENT_DEBUG_DISABLE = 0x31005E, - CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31005D, - CMSG_GAME_OBJ_REPORT_USE = 0x320089, - CMSG_GAME_OBJ_USE = 0x320088, - CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x3101D5, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x3101BB, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x3101A8, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x31020C, - CMSG_GARRISON_COMPLETE_MISSION = 0x3101FE, - CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x3101D6, - CMSG_GARRISON_GENERATE_RECRUITS = 0x3101BE, - CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x3101CD, - CMSG_GARRISON_GET_MAP_DATA = 0x3101D4, - CMSG_GARRISON_GET_MISSION_REWARD = 0x310230, - CMSG_GARRISON_LEARN_TALENT = 0x3101C9, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x310200, - CMSG_GARRISON_PURCHASE_BUILDING = 0x3101A4, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x3101C0, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x3101F5, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x3101BC, - CMSG_GARRISON_RENAME_FOLLOWER = 0x3101BD, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x3101A3, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x3101D8, - CMSG_GARRISON_RESEARCH_TALENT = 0x3101C1, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x3101A5, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x3101B9, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x3101B1, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x3101BF, - CMSG_GARRISON_SOCKET_TALENT = 0x31029D, - CMSG_GARRISON_START_MISSION = 0x3101FD, - CMSG_GARRISON_SWAP_BUILDINGS = 0x3101A9, - CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x360013, - CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x3600E1, - CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x36015D, - CMSG_GET_GARRISON_INFO = 0x31019E, - CMSG_GET_ITEM_PURCHASE_DATA = 0x3200CF, - CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x3101D9, - CMSG_GET_MIRROR_IMAGE_DATA = 0x31016D, - CMSG_GET_PVP_OPTIONS_ENABLED = 0x36001A, - CMSG_GET_RAF_ACCOUNT_INFO = 0x36014B, - CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA = 0x36018E, - CMSG_GET_REMAINING_GAME_TIME = 0x360117, - CMSG_GET_TROPHY_LIST = 0x3101EE, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36010B, - CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36011C, - CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36011D, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3600BA, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x3600B9, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3600B8, - CMSG_GOSSIP_REFRESH_OPTIONS = 0x32010D, - CMSG_GOSSIP_SELECT_OPTION = 0x320026, - CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x2F0020, - CMSG_GUILD_ADD_RANK = 0x2F0005, - CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x2F0002, - CMSG_GUILD_BANK_ACTIVATE = 0x320049, - CMSG_GUILD_BANK_BUY_TAB = 0x320057, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x320059, - CMSG_GUILD_BANK_LOG_QUERY = 0x2F0019, - CMSG_GUILD_BANK_QUERY_TAB = 0x320056, - CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x2F001A, - CMSG_GUILD_BANK_SET_TAB_TEXT = 0x2F001D, - CMSG_GUILD_BANK_TEXT_QUERY = 0x2F001E, - CMSG_GUILD_BANK_UPDATE_TAB = 0x320058, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x32005A, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x2F0017, - CMSG_GUILD_CHANGE_NAME_REQUEST = 0x2F0018, - CMSG_GUILD_DECLINE_INVITATION = 0x36002A, - CMSG_GUILD_DELETE = 0x2F0009, - CMSG_GUILD_DELETE_RANK = 0x2F0006, - CMSG_GUILD_DEMOTE_MEMBER = 0x2F0001, - CMSG_GUILD_EVENT_LOG_QUERY = 0x2F001C, - CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x2F0012, - CMSG_GUILD_GET_RANKS = 0x2F000E, - CMSG_GUILD_GET_ROSTER = 0x2F0014, - CMSG_GUILD_INVITE_BY_NAME = 0x360034, - CMSG_GUILD_LEAVE = 0x2F0003, - CMSG_GUILD_NEWS_UPDATE_STICKY = 0x2F000F, - CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x2F0004, - CMSG_GUILD_PERMISSIONS_QUERY = 0x2F001B, - CMSG_GUILD_PROMOTE_MEMBER = 0x2F0000, - CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x2F000C, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x2F000A, - CMSG_GUILD_QUERY_NEWS = 0x2F000D, - CMSG_GUILD_QUERY_RECIPES = 0x2F000B, - CMSG_GUILD_REPLACE_GUILD_MASTER = 0x2F001F, - CMSG_GUILD_REQUEST_RENAME = 0x2F0023, - CMSG_GUILD_REQUEST_RENAME_NAME_CHECK = 0x2F0022, - CMSG_GUILD_REQUEST_RENAME_REFUND = 0x2F0024, - CMSG_GUILD_REQUEST_RENAME_STATUS = 0x2F0021, - CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x2F0010, - CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x2F0011, - CMSG_GUILD_SET_GUILD_MASTER = 0x3600F4, - CMSG_GUILD_SET_MEMBER_NOTE = 0x2F0013, - CMSG_GUILD_SET_RANK_PERMISSIONS = 0x2F0008, - CMSG_GUILD_SHIFT_RANK = 0x2F0007, - CMSG_GUILD_UPDATE_INFO_TEXT = 0x2F0016, - CMSG_GUILD_UPDATE_MOTD_TEXT = 0x2F0015, - CMSG_HEARTH_AND_RESURRECT = 0x3200A1, - CMSG_HIDE_QUEST_CHOICE = 0x31017D, - CMSG_HOTFIX_REQUEST = 0x360011, - CMSG_IGNORE_TRADE = 0x310003, - CMSG_INITIATE_ROLE_POLL = 0x360006, - CMSG_INITIATE_TRADE = 0x310000, - CMSG_INSPECT = 0x3200C9, - CMSG_INSTANCE_LOCK_RESPONSE = 0x3200A6, - CMSG_ISLAND_QUEUE = 0x310261, - CMSG_ITEM_PURCHASE_REFUND = 0x3200D0, - CMSG_ITEM_TEXT_QUERY = 0x31020D, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x31008D, - CMSG_JOIN_RATED_BATTLEGROUND = 0x310025, - CMSG_KEEP_ALIVE = 0x3600A9, - CMSG_KEYBOUND_OVERRIDE = 0x3100E1, - CMSG_LATENCY_REPORT = 0x37000D, - CMSG_LEARN_PVP_TALENTS = 0x3200F9, - CMSG_LEARN_TALENTS = 0x3200F7, - CMSG_LEAVE_GROUP = 0x360073, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31008E, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x36003B, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x36003C, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x36003D, - CMSG_LFG_LIST_GET_STATUS = 0x360039, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x36003E, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x36003F, - CMSG_LFG_LIST_JOIN = 0x310255, - CMSG_LFG_LIST_LEAVE = 0x360038, - CMSG_LFG_LIST_SEARCH = 0x36003A, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x310256, - CMSG_LIST_INVENTORY = 0x320033, - CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x3600E4, - CMSG_LIVE_REGION_CHARACTER_COPY = 0x3600E3, - CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x3600E2, - CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x3600E5, - CMSG_LOADING_SCREEN_NOTIFY = 0x360024, - CMSG_LOAD_SELECTED_TROPHY = 0x3101EF, - CMSG_LOBBY_MATCHMAKER_ABANDON_QUEUE = 0x360170, - CMSG_LOBBY_MATCHMAKER_ACCEPT_PARTY_INVITE = 0x360167, - CMSG_LOBBY_MATCHMAKER_CREATE_CHARACTER = 0x360179, - CMSG_LOBBY_MATCHMAKER_ENTER_QUEUE = 0x36016E, - CMSG_LOBBY_MATCHMAKER_LEAVE_PARTY = 0x36016A, - CMSG_LOBBY_MATCHMAKER_PARTY_INVITE = 0x360166, - CMSG_LOBBY_MATCHMAKER_PARTY_UNINVITE = 0x360169, - CMSG_LOBBY_MATCHMAKER_QUEUE_PROPSAL_RESPONSE = 0x36016F, - CMSG_LOBBY_MATCHMAKER_REJECT_PARTY_INVITE = 0x360168, - CMSG_LOBBY_MATCHMAKER_SET_PARTY_PLAYLIST_ENTRY = 0x36016B, - CMSG_LOBBY_MATCHMAKER_SET_PLAYER_READY = 0x36016C, - CMSG_LOGOUT_CANCEL = 0x320072, - CMSG_LOGOUT_INSTANT = 0x320073, - CMSG_LOGOUT_LOBBY_MATCHMAKER = 0x320121, - CMSG_LOGOUT_REQUEST = 0x320071, - CMSG_LOG_DISCONNECT = 0x370005, - CMSG_LOG_STREAMING_ERROR = 0x370009, - CMSG_LOOT_ITEM = 0x3100C9, - CMSG_LOOT_MONEY = 0x3100C8, - CMSG_LOOT_RELEASE = 0x3100CD, - CMSG_LOOT_ROLL = 0x3100CE, - CMSG_LOOT_UNIT = 0x3100C7, - CMSG_LOW_LEVEL_RAID1 = 0x3600CC, - CMSG_LOW_LEVEL_RAID2 = 0x3200AD, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x3200DB, - CMSG_MAIL_DELETE = 0x3100E3, - CMSG_MAIL_GET_LIST = 0x3200D6, - CMSG_MAIL_MARK_AS_READ = 0x3200DA, - CMSG_MAIL_RETURN_TO_SENDER = 0x36007F, - CMSG_MAIL_TAKE_ITEM = 0x3200D8, - CMSG_MAIL_TAKE_MONEY = 0x3200D7, - CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x3100E4, - CMSG_MASTER_LOOT_ITEM = 0x3100CA, - CMSG_MERGE_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x320054, - CMSG_MERGE_GUILD_BANK_ITEM_WITH_ITEM = 0x320051, - CMSG_MERGE_ITEM_WITH_GUILD_BANK_ITEM = 0x32004F, - CMSG_MINIMAP_PING = 0x360075, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0x310036, - CMSG_MOUNT_CLEAR_FANFARE = 0x2B0003, - CMSG_MOUNT_SET_FAVORITE = 0x36005C, - CMSG_MOUNT_SPECIAL_ANIM = 0x310153, - CMSG_MOVE_ADD_IMPULSE_ACK = 0x34006D, - CMSG_MOVE_APPLY_INERTIA_ACK = 0x34006B, - CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x340031, - CMSG_MOVE_CHANGE_TRANSPORT = 0x34004C, - CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x340051, - CMSG_MOVE_COLLISION_DISABLE_ACK = 0x340056, - CMSG_MOVE_COLLISION_ENABLE_ACK = 0x340057, - CMSG_MOVE_DISMISS_VEHICLE = 0x340050, - CMSG_MOVE_DOUBLE_JUMP = 0x340007, - CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x34003A, - CMSG_MOVE_ENABLE_FULL_SPEED_TURNING_ACK = 0x340083, - CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x340040, - CMSG_MOVE_FALL_LAND = 0x340017, - CMSG_MOVE_FALL_RESET = 0x340035, - CMSG_MOVE_FEATHER_FALL_ACK = 0x340038, - CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x34004B, - CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x34004A, - CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x34004F, - CMSG_MOVE_FORCE_ROOT_ACK = 0x34002A, - CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x340028, - CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x340027, - CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x34003E, - CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x340029, - CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x34003F, - CMSG_MOVE_FORCE_UNROOT_ACK = 0x34002B, - CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x34003D, - CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x340052, - CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x340053, - CMSG_MOVE_GUILD_BANK_ITEM = 0x32004E, - CMSG_MOVE_HEARTBEAT = 0x34002C, - CMSG_MOVE_HOVER_ACK = 0x34002F, - CMSG_MOVE_INERTIA_DISABLE_ACK = 0x340054, - CMSG_MOVE_INERTIA_ENABLE_ACK = 0x340055, - CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE = 0x340063, - CMSG_MOVE_JUMP = 0x340006, - CMSG_MOVE_KNOCK_BACK_ACK = 0x34002E, - CMSG_MOVE_REMOVE_INERTIA_ACK = 0x34006C, - CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x340033, - CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x340032, - CMSG_MOVE_SET_ADV_FLY = 0x34006F, - CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK = 0x340077, - CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK = 0x340072, - CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK = 0x340078, - CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK = 0x340075, - CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK = 0x340076, - CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK = 0x34007F, - CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK = 0x340074, - CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK = 0x340073, - CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK = 0x34007D, - CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK = 0x340079, - CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK = 0x34007A, - CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK = 0x34007C, - CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK = 0x34007B, - CMSG_MOVE_SET_CAN_ADV_FLY_ACK = 0x34006E, - CMSG_MOVE_SET_CAN_DRIVE_ACK = 0x340070, - CMSG_MOVE_SET_CAN_FLY_ACK = 0x340043, - CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x340041, - CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x340058, - CMSG_MOVE_SET_FACING = 0x340025, - CMSG_MOVE_SET_FACING_HEARTBEAT = 0x34007E, - CMSG_MOVE_SET_FLY = 0x340045, - CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x340042, - CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x34005F, - CMSG_MOVE_SET_PITCH = 0x340026, - CMSG_MOVE_SET_RUN_MODE = 0x34000E, - CMSG_MOVE_SET_TURN_RATE_CHEAT = 0x340022, - CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x340030, - CMSG_MOVE_SET_WALK_MODE = 0x34000F, - CMSG_MOVE_SPLINE_DONE = 0x340034, - CMSG_MOVE_START_ASCEND = 0x340046, - CMSG_MOVE_START_BACKWARD = 0x340001, - CMSG_MOVE_START_DESCEND = 0x34004D, - CMSG_MOVE_START_DRIVE_FORWARD = 0x340071, - CMSG_MOVE_START_FORWARD = 0x340000, - CMSG_MOVE_START_PITCH_DOWN = 0x34000C, - CMSG_MOVE_START_PITCH_UP = 0x34000B, - CMSG_MOVE_START_STRAFE_LEFT = 0x340003, - CMSG_MOVE_START_STRAFE_RIGHT = 0x340004, - CMSG_MOVE_START_SWIM = 0x340018, - CMSG_MOVE_START_TURN_LEFT = 0x340008, - CMSG_MOVE_START_TURN_RIGHT = 0x340009, - CMSG_MOVE_STOP = 0x340002, - CMSG_MOVE_STOP_ASCEND = 0x340047, - CMSG_MOVE_STOP_PITCH = 0x34000D, - CMSG_MOVE_STOP_STRAFE = 0x340005, - CMSG_MOVE_STOP_SWIM = 0x340019, - CMSG_MOVE_STOP_TURN = 0x34000A, - CMSG_MOVE_TELEPORT_ACK = 0x340016, - CMSG_MOVE_TIME_SKIPPED = 0x340037, - CMSG_MOVE_UPDATE_FALL_SPEED = 0x340036, - CMSG_MOVE_WATER_WALK_ACK = 0x340039, - CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0x2E0001, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x310083, - CMSG_NEXT_CINEMATIC_CAMERA = 0x3200E4, - CMSG_OBJECT_UPDATE_FAILED = 0x31002C, - CMSG_OBJECT_UPDATE_RESCUED = 0x31002D, - CMSG_OFFER_PETITION = 0x310287, - CMSG_OPENING_CINEMATIC = 0x3200E3, - CMSG_OPEN_ITEM = 0x31020E, - CMSG_OPEN_MISSION_NPC = 0x3101CF, - CMSG_OPEN_SHIPMENT_NPC = 0x3101D7, - CMSG_OPEN_TRADESKILL_NPC = 0x3101E2, - CMSG_OPT_OUT_OF_LOOT = 0x320090, - CMSG_OVERRIDE_SCREEN_FLASH = 0x3200BA, - CMSG_PARTY_INVITE = 0x360030, - CMSG_PARTY_INVITE_RESPONSE = 0x360032, - CMSG_PARTY_UNINVITE = 0x360071, - CMSG_PERFORM_ITEM_INTERACTION = 0x3100EC, - CMSG_PERKS_PROGRAM_ITEMS_REFRESHED = 0x3102AF, - CMSG_PERKS_PROGRAM_REQUEST_CART_CHECKOUT = 0x3102B2, - CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = 0x2B0012, - CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0x3102B1, - CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0x3102B3, - CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0x3102B4, - CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0x3102B0, - CMSG_PETITION_BUY = 0x32005C, - CMSG_PETITION_RENAME_GUILD = 0x3600F5, - CMSG_PETITION_SHOW_LIST = 0x32005B, - CMSG_PETITION_SHOW_SIGNATURES = 0x32005D, - CMSG_PET_ABANDON = 0x32001E, - CMSG_PET_ABANDON_BY_NUMBER = 0x32001F, - CMSG_PET_ACTION = 0x32001C, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x310092, - CMSG_PET_BATTLE_INPUT = 0x36006B, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3100E2, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x310091, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x36006C, - CMSG_PET_BATTLE_REQUEST_PVP = 0x31008B, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31008C, - CMSG_PET_BATTLE_REQUEST_WILD = 0x310089, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x310093, - CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31008A, - CMSG_PET_CANCEL_AURA = 0x320020, - CMSG_PET_CAST_SPELL = 0x310172, - CMSG_PET_RENAME = 0x3600AE, - CMSG_PET_SET_ACTION = 0x32001B, - CMSG_PET_SPELL_AUTOCAST = 0x320021, - CMSG_PET_STOP_ATTACK = 0x32001D, - CMSG_PING = 0x370004, - CMSG_PLAYER_LOGIN = 0x360016, - CMSG_PUSH_QUEST_TO_PARTY = 0x320031, - CMSG_PVP_LOG_DATA = 0x310028, - CMSG_QUERY_BATTLE_PET_NAME = 0x310146, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x36008A, - CMSG_QUERY_CORPSE_TRANSPORT = 0x36008B, - CMSG_QUERY_COUNTDOWN_TIMER = 0x310055, - CMSG_QUERY_CREATURE = 0x310140, - CMSG_QUERY_GAME_OBJECT = 0x310141, - CMSG_QUERY_GARRISON_PET_NAME = 0x310147, - CMSG_QUERY_GUILD_INFO = 0x3600B4, - CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x32009A, - CMSG_QUERY_NEXT_MAIL_TIME = 0x3200D9, - CMSG_QUERY_NPC_TEXT = 0x310142, - CMSG_QUERY_PAGE_TEXT = 0x310144, - CMSG_QUERY_PETITION = 0x310148, - CMSG_QUERY_PET_NAME = 0x310145, - CMSG_QUERY_PLAYER_NAMES = 0x37000E, - CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY = 0x37000C, - CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID = 0x37000B, - CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x310021, - CMSG_QUERY_QUEST_INFO = 0x310143, - CMSG_QUERY_QUEST_ITEM_USABILITY = 0x310022, - CMSG_QUERY_REALM_NAME = 0x3600B3, - CMSG_QUERY_SCENARIO_POI = 0x360080, - CMSG_QUERY_SELECTED_WOW_LABS_AREA = 0x3102EB, - CMSG_QUERY_TIME = 0x320070, - CMSG_QUERY_TREASURE_PICKER = 0x310233, - CMSG_QUERY_VOID_STORAGE = 0x31004E, - CMSG_QUERY_WOW_LABS_AREA_INFO = 0x3102EC, - CMSG_QUEST_CONFIRM_ACCEPT = 0x320030, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x32002A, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x32002C, - CMSG_QUEST_GIVER_CLOSE_QUEST = 0x3200EA, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x32002B, - CMSG_QUEST_GIVER_HELLO = 0x320028, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x320029, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x32002D, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x32002F, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x32002E, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x3200CE, - CMSG_QUEST_POI_QUERY = 0x3600DB, - CMSG_QUEST_PUSH_RESULT = 0x320032, - CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x310279, - CMSG_QUEST_SESSION_REQUEST_START = 0x310278, - CMSG_QUEST_SESSION_REQUEST_STOP = 0x360156, - CMSG_QUEUED_MESSAGES_END = 0x370008, - CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x36012E, - CMSG_QUICK_JOIN_REQUEST_INVITE = 0x36012D, - CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x36015B, - CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x36012C, - CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x36012B, - CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x32009E, - CMSG_RAF_CLAIM_NEXT_REWARD = 0x36014C, - CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x36014E, - CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x36014D, - CMSG_RANDOM_ROLL = 0x36007E, - CMSG_READY_CHECK_RESPONSE = 0x36005F, - CMSG_READ_ITEM = 0x31020F, - CMSG_RECLAIM_CORPSE = 0x320075, - CMSG_REMOVE_NEW_ITEM = 0x310237, - CMSG_REMOVE_RAF_RECRUIT = 0x36014F, - CMSG_REORDER_CHARACTERS = 0x360015, - CMSG_REPAIR_ITEM = 0x320086, - CMSG_REPLACE_TROPHY = 0x3101F0, - CMSG_REPOP_REQUEST = 0x3200C6, - CMSG_REPORT_PVP_PLAYER_AFK = 0x32008E, - CMSG_REPORT_SERVER_LAG = 0x310271, - CMSG_REPORT_STUCK_IN_COMBAT = 0x310272, - CMSG_REQUEST_ACCOUNT_DATA = 0x3600C0, - CMSG_REQUEST_AREA_POI_UPDATE = 0x310235, - CMSG_REQUEST_BATTLEFIELD_STATUS = 0x360008, - CMSG_REQUEST_CEMETERY_LIST = 0x310023, - CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x3600B5, - CMSG_REQUEST_COVENANT_CALLINGS = 0x310263, - CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x3200CA, - CMSG_REQUEST_CURRENCY_DATA_FOR_ACCOUNT_CHARACTERS = 0x2B0019, - CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x31029C, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x310054, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x310053, - CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x310273, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x31017E, - CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x3100B7, - CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x3100B8, - CMSG_REQUEST_PARTY_ELIGIBILITY_FOR_DELVE_TIERS = 0x3102EA, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x360023, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x36007D, - CMSG_REQUEST_PET_INFO = 0x320022, - CMSG_REQUEST_PLAYED_TIME = 0x31014B, - CMSG_REQUEST_PVP_REWARDS = 0x310041, - CMSG_REQUEST_RAID_INFO = 0x3600F6, - CMSG_REQUEST_RATED_PVP_INFO = 0x36000F, - CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x360191, - CMSG_REQUEST_SCHEDULED_AREA_POI_UPDATE = 0x310236, - CMSG_REQUEST_SCHEDULED_PVP_INFO = 0x310042, - CMSG_REQUEST_STABLED_PETS = 0x320023, - CMSG_REQUEST_STORE_FRONT_INFO_UPDATE = 0x2B001E, - CMSG_REQUEST_VEHICLE_EXIT = 0x3100FE, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x310100, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3100FF, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x310101, - CMSG_REQUEST_WEEKLY_REWARDS = 0x310266, - CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x310234, - CMSG_RESET_CHALLENGE_MODE = 0x3100B5, - CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3100B6, - CMSG_RESET_INSTANCES = 0x360092, - CMSG_RESURRECT_RESPONSE = 0x3600AD, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x3101F2, - CMSG_RIDE_VEHICLE_INTERACT = 0x310102, - CMSG_RPE_RESET_CHARACTER = 0x36017C, - CMSG_SAVE_ACCOUNT_DATA_EXPORT = 0x360176, - CMSG_SAVE_CUF_PROFILES = 0x310037, - CMSG_SAVE_EQUIPMENT_SET = 0x3200A4, - CMSG_SAVE_GUILD_EMBLEM = 0x310183, - CMSG_SAVE_PERSONAL_EMBLEM = 0x310184, - CMSG_SCENE_PLAYBACK_CANCELED = 0x3100DE, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x3100DD, - CMSG_SCENE_TRIGGER_EVENT = 0x3100DF, - CMSG_SEAMLESS_TRANSFER_COMPLETE = 0x3102D9, - CMSG_SELECT_WOW_LABS_AREA = 0x3102ED, - CMSG_SELF_RES = 0x3200D1, - CMSG_SELL_ALL_JUNK_ITEMS = 0x320035, - CMSG_SELL_ITEM = 0x320034, - CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x360124, - CMSG_SEND_CONTACT_LIST = 0x3600FB, - CMSG_SEND_MAIL = 0x360026, - CMSG_SEND_PING_UNIT = 0x3102DB, - CMSG_SEND_PING_WORLD_POINT = 0x3102DC, - CMSG_SEND_TEXT_EMOTE = 0x320019, - CMSG_SERVER_TIME_OFFSET_REQUEST = 0x3600C7, - CMSG_SETUP_WARBAND_GROUPS = 0x36018A, - CMSG_SET_ACTION_BAR_TOGGLES = 0x3200D2, - CMSG_SET_ACTION_BUTTON = 0x360060, - CMSG_SET_ACTIVE_MOVER = 0x340059, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x310191, - CMSG_SET_ASSISTANT_LEADER = 0x360079, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x310212, - CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0x310213, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x310214, - CMSG_SET_CONTACT_NOTES = 0x3600FE, - CMSG_SET_CURRENCY_FLAGS = 0x310015, - CMSG_SET_DIFFICULTY_ID = 0x3100E0, - CMSG_SET_DUNGEON_DIFFICULTY = 0x3600AC, - CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = 0x31013A, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x360046, - CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES = 0x36012F, - CMSG_SET_FACTION_AT_WAR = 0x320078, - CMSG_SET_FACTION_INACTIVE = 0x32007A, - CMSG_SET_FACTION_NOT_AT_WAR = 0x320079, - CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x310065, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x310216, - CMSG_SET_LOOT_METHOD = 0x360072, - CMSG_SET_LOOT_SPECIALIZATION = 0x3200DF, - CMSG_SET_PARTY_ASSIGNMENT = 0x36007B, - CMSG_SET_PARTY_LEADER = 0x360074, - CMSG_SET_PET_FAVORITE = 0x310012, - CMSG_SET_PET_SLOT = 0x310011, - CMSG_SET_PET_SPECIALIZATION = 0x310013, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x3600B2, - CMSG_SET_PREFERRED_CEMETERY = 0x310024, - CMSG_SET_PVP = 0x310188, - CMSG_SET_RAID_DIFFICULTY = 0x360107, - CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = 0x360047, - CMSG_SET_ROLE = 0x360005, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3600B0, - CMSG_SET_SELECTION = 0x3200C8, - CMSG_SET_SHEATHED = 0x32001A, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x310215, - CMSG_SET_TAXI_BENCHMARK_MODE = 0x32008D, - CMSG_SET_TITLE = 0x310151, - CMSG_SET_TRADE_CURRENCY = 0x31000A, - CMSG_SET_TRADE_GOLD = 0x310009, - CMSG_SET_TRADE_ITEM = 0x310007, - CMSG_SET_USING_PARTY_GARRISON = 0x3101D1, - CMSG_SET_WAR_MODE = 0x310189, - CMSG_SET_WATCHED_FACTION = 0x32007B, - CMSG_SHOW_TRADE_SKILL = 0x3600EE, - CMSG_SIGN_PETITION = 0x3200D3, - CMSG_SILENCE_PARTY_TALKER = 0x36007C, - CMSG_SOCIAL_CONTRACT_REQUEST = 0x360171, - CMSG_SOCKET_GEMS = 0x320085, - CMSG_SORT_ACCOUNT_BANK_BAGS = 0x3102DF, - CMSG_SORT_BAGS = 0x310217, - CMSG_SORT_BANK_BAGS = 0x310218, - CMSG_SORT_REAGENT_BANK_BAGS = 0x310219, - CMSG_SPAWN_TRACKING_UPDATE = 0x310166, - CMSG_SPECTATE_CHANGE = 0x3102D2, - CMSG_SPELL_CLICK = 0x320027, - CMSG_SPELL_EMPOWER_RELEASE = 0x310138, - CMSG_SPELL_EMPOWER_RESTART = 0x310139, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x320042, - CMSG_SPLIT_GUILD_BANK_ITEM = 0x320055, - CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY = 0x320052, - CMSG_SPLIT_ITEM = 0x33000A, - CMSG_SPLIT_ITEM_TO_GUILD_BANK = 0x320050, - CMSG_STAND_STATE_CHANGE = 0x310035, - CMSG_START_CHALLENGE_MODE = 0x3200EB, - CMSG_START_SPECTATOR_WAR_GAME = 0x36000B, - CMSG_START_WAR_GAME = 0x36000A, - CMSG_STORE_GUILD_BANK_ITEM = 0x32004B, - CMSG_SUBMIT_USER_FEEDBACK = 0x3600BF, - CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x310291, - CMSG_SUMMON_RESPONSE = 0x360094, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x360070, - CMSG_SURRENDER_ARENA = 0x310020, - CMSG_SUSPEND_COMMS_ACK = 0x370000, - CMSG_SUSPEND_TOKEN_RESPONSE = 0x370006, - CMSG_SWAP_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x32004D, - CMSG_SWAP_INV_ITEM = 0x330009, - CMSG_SWAP_ITEM = 0x330008, - CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM = 0x32004C, - CMSG_SWAP_SUB_GROUPS = 0x360077, - CMSG_SWAP_VOID_ITEM = 0x310050, - CMSG_TABARD_VENDOR_ACTIVATE = 0x310185, - CMSG_TALK_TO_GOSSIP = 0x320024, - CMSG_TAXI_NODE_STATUS_QUERY = 0x32003B, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x32003D, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x32003F, - CMSG_TIME_ADJUSTMENT_RESPONSE = 0x34005D, - CMSG_TIME_SYNC_RESPONSE = 0x34005A, - CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x34005C, - CMSG_TIME_SYNC_RESPONSE_FAILED = 0x34005B, - CMSG_TOGGLE_DIFFICULTY = 0x360081, - CMSG_TOGGLE_PVP = 0x310187, - CMSG_TOTEM_DESTROYED = 0x320092, - CMSG_TOY_CLEAR_FANFARE = 0x2B0004, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x310232, - CMSG_TRAINER_BUY_SPELL = 0x320041, - CMSG_TRAINER_LIST = 0x320040, - CMSG_TRAITS_COMMIT_CONFIG = 0x3102BA, - CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x3102B8, - CMSG_TRANSFER_CURRENCY_FROM_ACCOUNT_CHARACTER = 0x3102E8, - CMSG_TRANSMOGRIFY_ITEMS = 0x310043, - CMSG_TURN_IN_PETITION = 0x3200D5, - CMSG_TUTORIAL = 0x360108, - CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x310262, - CMSG_UNACCEPT_TRADE = 0x310005, - CMSG_UNDELETE_CHARACTER = 0x36010A, - CMSG_UNLEARN_SKILL = 0x32007F, - CMSG_UNLEARN_SPECIALIZATION = 0x310051, - CMSG_UNLOCK_VOID_STORAGE = 0x31004D, - CMSG_UPDATE_AADC_STATUS = 0x360161, - CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS = 0x320128, - CMSG_UPDATE_ACCOUNT_DATA = 0x3600C1, - CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x310175, - CMSG_UPDATE_CLIENT_SETTINGS = 0x36008E, - CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x3101E3, - CMSG_UPDATE_MISSILE_TRAJECTORY = 0x340060, - CMSG_UPDATE_RAID_TARGET = 0x36007A, - CMSG_UPDATE_SPELL_VISUAL = 0x310174, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36011F, - CMSG_UPGRADE_GARRISON = 0x310199, - CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x31028F, - CMSG_USED_FOLLOW = 0x310032, - CMSG_USE_CRITTER_ITEM = 0x310108, - CMSG_USE_EQUIPMENT_SET = 0x330001, - CMSG_USE_ITEM = 0x31016E, - CMSG_USE_TOY = 0x310171, - CMSG_VAS_CHECK_TRANSFER_OK = 0x360134, - CMSG_VAS_GET_QUEUE_MINUTES = 0x360133, - CMSG_VAS_GET_SERVICE_STATUS = 0x360132, - CMSG_VIOLENCE_LEVEL = 0x310030, - CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST = 0x360138, - CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x360139, - CMSG_VOICE_CHAT_LOGIN = 0x360137, - CMSG_VOID_STORAGE_TRANSFER = 0x31004F, - CMSG_WARDEN3_DATA = 0x360018, - CMSG_WHO = 0x3600AB, - CMSG_WHO_IS = 0x3600AA, - CMSG_WORLD_LOOT_OBJECT_CLICK = 0x3102D5, - CMSG_WORLD_PORT_RESPONSE = 0x360025, - CMSG_WRAP_ITEM = 0x330000, + CMSG_ABANDON_NPE_RESPONSE = 0x2F0299, + CMSG_ACCEPT_GUILD_INVITE = 0x340029, + CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x2F025A, + CMSG_ACCEPT_SOCIAL_CONTRACT = 0x340174, + CMSG_ACCEPT_TRADE = 0x2F0004, + CMSG_ACCEPT_WARGAME_INVITE = 0x34000C, + CMSG_ACCOUNT_BANK_DEPOSIT_MONEY = 0x2F02DC, + CMSG_ACCOUNT_BANK_WITHDRAW_MONEY = 0x2F02DD, + CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x340160, + CMSG_ACCOUNT_STORE_BEGIN_PURCHASE_OR_REFUND = 0x3400C0, + CMSG_ACTIVATE_SOULBIND = 0x2F0288, + CMSG_ACTIVATE_TAXI = 0x30003E, + CMSG_ADDON_LIST = 0x340004, + CMSG_ADD_ACCOUNT_COSMETIC = 0x2F0171, + CMSG_ADD_BATTLENET_FRIEND = 0x340086, + CMSG_ADD_FRIEND = 0x3400FE, + CMSG_ADD_IGNORE = 0x340102, + CMSG_ADD_TOY = 0x2F0170, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x2F00B3, + CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x2F028B, + CMSG_ADVENTURE_MAP_START_QUEST = 0x2F022B, + CMSG_ALTER_APPEARANCE = 0x30008D, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x300043, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x300044, + CMSG_AREA_TRIGGER = 0x2F0086, + CMSG_ARTIFACT_ADD_POWER = 0x2F0056, + CMSG_ARTIFACT_SET_APPEARANCE = 0x2F0058, + CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x2F00BF, + CMSG_ATTACK_STOP = 0x2F011D, + CMSG_ATTACK_SWING = 0x2F011C, + CMSG_AUCTIONABLE_TOKEN_SELL = 0x340114, + CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x340115, + CMSG_AUCTION_BROWSE_QUERY = 0x300061, + CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x300069, + CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x300068, + CMSG_AUCTION_GET_COMMODITY_QUOTE = 0x300067, + CMSG_AUCTION_HELLO_REQUEST = 0x30005C, + CMSG_AUCTION_LIST_BIDDED_ITEMS = 0x300065, + CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0x300066, + CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0x300062, + CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0x300063, + CMSG_AUCTION_LIST_OWNED_ITEMS = 0x300064, + CMSG_AUCTION_PLACE_BID = 0x300060, + CMSG_AUCTION_REMOVE_ITEM = 0x30005E, + CMSG_AUCTION_REPLICATE_ITEMS = 0x30005F, + CMSG_AUCTION_SELL_COMMODITY = 0x30006A, + CMSG_AUCTION_SELL_ITEM = 0x30005D, + CMSG_AUCTION_SET_FAVORITE_ITEM = 0x340161, + CMSG_AUTH_CONTINUED_SESSION = 0x350002, + CMSG_AUTH_SESSION = 0x350001, + CMSG_AUTOBANK_ITEM = 0x310003, + CMSG_AUTOSTORE_BANK_ITEM = 0x310002, + CMSG_AUTO_DEPOSIT_ACCOUNT_BANK = 0x2F02E6, + CMSG_AUTO_DEPOSIT_CHARACTER_BANK = 0x2F02EE, + CMSG_AUTO_EQUIP_ITEM = 0x310004, + CMSG_AUTO_EQUIP_ITEM_SLOT = 0x310009, + CMSG_AUTO_GUILD_BANK_ITEM = 0x300048, + CMSG_AUTO_STORE_BAG_ITEM = 0x310005, + CMSG_AUTO_STORE_GUILD_BANK_ITEM = 0x300051, + CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x2F0256, + CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x2F0237, + CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x2F0258, + CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x2F0257, + CMSG_BANKER_ACTIVATE = 0x300046, + CMSG_BATTLEFIELD_LEAVE = 0x2F001F, + CMSG_BATTLEFIELD_LIST = 0x2F002A, + CMSG_BATTLEFIELD_PORT = 0x3000C3, + CMSG_BATTLEMASTER_HELLO = 0x2F018F, + CMSG_BATTLEMASTER_JOIN = 0x3000BA, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x3000BB, + CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3000C1, + CMSG_BATTLEMASTER_JOIN_RATED_BG_BLITZ = 0x3000BD, + CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = 0x3000BC, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3000BE, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x340101, + CMSG_BATTLENET_REQUEST = 0x340122, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x3400FB, + CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x34013E, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x3400FA, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x3400F1, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS = 0x340164, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x3400E8, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x3400E9, + CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x340137, + CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x340133, + CMSG_BATTLE_PAY_START_PURCHASE = 0x3400F9, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x340120, + CMSG_BATTLE_PET_CLEAR_FANFARE = 0x290002, + CMSG_BATTLE_PET_DELETE_PET = 0x34004F, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x340050, + CMSG_BATTLE_PET_MODIFY_NAME = 0x340052, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x34004E, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x34004D, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x340057, + CMSG_BATTLE_PET_SET_FLAGS = 0x34005A, + CMSG_BATTLE_PET_SUMMON = 0x340053, + CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x2F0090, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x2F008F, + CMSG_BEGIN_TRADE = 0x2F0001, + CMSG_BINDER_ACTIVATE = 0x300045, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3000CB, + CMSG_BLACK_MARKET_OPEN = 0x3000C9, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3000CA, + CMSG_BONUS_ROLL = 0x2F0259, + CMSG_BUG_REPORT = 0x3400B1, + CMSG_BUSY_TRADE = 0x2F0002, + CMSG_BUY_ACCOUNT_BANK_TAB = 0x300123, + CMSG_BUY_BACK_ITEM = 0x300037, + CMSG_BUY_ITEM = 0x300036, + CMSG_CAGE_BATTLE_PET = 0x2F00A3, + CMSG_CALENDAR_ADD_EVENT = 0x3400A9, + CMSG_CALENDAR_COMMUNITY_INVITE = 0x34009D, + CMSG_CALENDAR_COMPLAIN = 0x3400A5, + CMSG_CALENDAR_COPY_EVENT = 0x3400A4, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x3400A7, + CMSG_CALENDAR_GET = 0x34009B, + CMSG_CALENDAR_GET_EVENT = 0x34009C, + CMSG_CALENDAR_GET_NUM_PENDING = 0x3400A6, + CMSG_CALENDAR_INVITE = 0x34009E, + CMSG_CALENDAR_MODERATOR_STATUS = 0x3400A2, + CMSG_CALENDAR_REMOVE_EVENT = 0x3400A3, + CMSG_CALENDAR_REMOVE_INVITE = 0x34009F, + CMSG_CALENDAR_RSVP = 0x3400A0, + CMSG_CALENDAR_STATUS = 0x3400A1, + CMSG_CALENDAR_UPDATE_EVENT = 0x3400AA, + CMSG_CANCEL_AURA = 0x2F005A, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x30007F, + CMSG_CANCEL_CAST = 0x2F0177, + CMSG_CANCEL_CHANNELLING = 0x2F0138, + CMSG_CANCEL_GROWTH_AURA = 0x2F0140, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x2F00CC, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x2F0059, + CMSG_CANCEL_MOUNT_AURA = 0x2F0153, + CMSG_CANCEL_QUEUED_SPELL = 0x2F002B, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x30008A, + CMSG_CANCEL_TRADE = 0x2F0006, + CMSG_CAN_DUEL = 0x34008E, + CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x340132, + CMSG_CAST_SPELL = 0x2F0174, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x2C0002, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x2F0211, + CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x2F0212, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x2F01F2, + CMSG_CHANGE_REALM_TICKET = 0x340127, + CMSG_CHANGE_SUB_GROUP = 0x340078, + CMSG_CHARACTER_CHECK_UPGRADE = 0x3400F4, + CMSG_CHARACTER_RENAME_REQUEST = 0x3400EF, + CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x3400F2, + CMSG_CHARACTER_UPGRADE_START = 0x3400F3, + CMSG_CHAR_CUSTOMIZE = 0x3400B8, + CMSG_CHAR_DELETE = 0x3400CA, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3400BE, + CMSG_CHAT_ADDON_MESSAGE = 0x2B002A, + CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x2B002B, + CMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_REQUEST = 0x2B0032, + CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x2B001F, + CMSG_CHAT_CHANNEL_BAN = 0x2B001D, + CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x2B0022, + CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x2B0012, + CMSG_CHAT_CHANNEL_INVITE = 0x2B001B, + CMSG_CHAT_CHANNEL_KICK = 0x2B001C, + CMSG_CHAT_CHANNEL_LIST = 0x2B0011, + CMSG_CHAT_CHANNEL_MODERATE = 0x2B0016, + CMSG_CHAT_CHANNEL_MODERATOR = 0x2B0017, + CMSG_CHAT_CHANNEL_OWNER = 0x2B0015, + CMSG_CHAT_CHANNEL_PASSWORD = 0x2B0013, + CMSG_CHAT_CHANNEL_SET_OWNER = 0x2B0014, + CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x2B0020, + CMSG_CHAT_CHANNEL_UNBAN = 0x2B001E, + CMSG_CHAT_CHANNEL_UNMODERATOR = 0x2B0018, + CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x2B0021, + CMSG_CHAT_DROP_CAUTIONARY_CHAT_MESSAGE = 0x2B000A, + CMSG_CHAT_JOIN_CHANNEL = 0x2B0000, + CMSG_CHAT_LEAVE_CHANNEL = 0x2B0001, + CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_INSTANCE_CHAT = 0x2B0031, + CMSG_CHAT_LOBBY_MATCHMAKER_MESSAGE_PARTY = 0x2B0030, + CMSG_CHAT_MESSAGE_AFK = 0x2B000F, + CMSG_CHAT_MESSAGE_CHANNEL = 0x2B0007, + CMSG_CHAT_MESSAGE_DND = 0x2B0010, + CMSG_CHAT_MESSAGE_EMOTE = 0x2B0024, + CMSG_CHAT_MESSAGE_GUILD = 0x2B000D, + CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x2B0028, + CMSG_CHAT_MESSAGE_OFFICER = 0x2B000E, + CMSG_CHAT_MESSAGE_PARTY = 0x2B0026, + CMSG_CHAT_MESSAGE_RAID = 0x2B0027, + CMSG_CHAT_MESSAGE_RAID_WARNING = 0x2B0029, + CMSG_CHAT_MESSAGE_SAY = 0x2B0023, + CMSG_CHAT_MESSAGE_WHISPER = 0x2B0008, + CMSG_CHAT_MESSAGE_YELL = 0x2B0025, + CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x2B0005, + CMSG_CHAT_REPORT_FILTERED = 0x2B0004, + CMSG_CHAT_REPORT_IGNORED = 0x2B0003, + CMSG_CHAT_SEND_CAUTIONARY_CHANNEL_MESSAGE = 0x2B000B, + CMSG_CHAT_SEND_CAUTIONARY_CHAT_MESSAGE = 0x2B0009, + CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x2B0006, + CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x340071, + CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x2F010E, + CMSG_CHOICE_RESPONSE = 0x2F017C, + CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x2F0287, + CMSG_CLAIM_WEEKLY_REWARD = 0x2F0264, + CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x2F02C1, + CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0x2F00C3, + CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x2F02C3, + CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x2F02C0, + CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x2F02BF, + CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x2F02C4, + CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0x2F00C2, + CMSG_CLEAR_NEW_APPEARANCE = 0x290005, + CMSG_CLEAR_RAID_MARKER = 0x2F0052, + CMSG_CLEAR_TRADE_ITEM = 0x2F0008, + CMSG_CLIENT_PORT_GRAVEYARD = 0x3000C5, + CMSG_CLOSE_INTERACTION = 0x300025, + CMSG_CLOSE_QUEST_CHOICE = 0x2F017D, + CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x2F028F, + CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x2F02C5, + CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x340149, + CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x340147, + CMSG_CLUB_FINDER_POST = 0x340144, + CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x34014B, + CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x340145, + CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x340146, + CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x34014A, + CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x34014C, + CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x340148, + CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST = 0x340167, + CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x340124, + CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x34005D, + CMSG_COMMENTATOR_ENABLE = 0x34001C, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x340020, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x340021, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x34001D, + CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x34001F, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x34001E, + CMSG_COMMENTATOR_SPECTATE = 0x340165, + CMSG_COMMENTATOR_START_WARGAME = 0x34001B, + CMSG_COMMERCE_TOKEN_GET_COUNT = 0x340112, + CMSG_COMMERCE_TOKEN_GET_LOG = 0x34011C, + CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x340113, + CMSG_COMPLAINT = 0x340098, + CMSG_COMPLETE_CINEMATIC = 0x3000E3, + CMSG_COMPLETE_MOVIE = 0x300075, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x2F0057, + CMSG_CONFIRM_PROFESSION_RESPEC = 0x2F00C6, + CMSG_CONFIRM_RESPEC_WIPE = 0x2F00C5, + CMSG_CONNECT_TO_FAILED = 0x340000, + CMSG_CONSUMABLE_TOKEN_BUY = 0x340117, + CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x340118, + CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x340116, + CMSG_CONSUMABLE_TOKEN_REDEEM = 0x34011A, + CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x34011B, + CMSG_CONTENT_TRACKING_START_TRACKING = 0x2F02D5, + CMSG_CONTENT_TRACKING_STOP_TRACKING = 0x2F02D6, + CMSG_CONTRIBUTION_CONTRIBUTE = 0x3000FB, + CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x3000FC, + CMSG_CONVERSATION_CINEMATIC_READY = 0x3000E5, + CMSG_CONVERSATION_LINE_STARTED = 0x3000E4, + CMSG_CONVERT_ITEM_TO_BIND_TO_ACCOUNT = 0x2F02E5, + CMSG_CONVERT_RAID = 0x34007A, + CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x30010F, + CMSG_CRAFTING_ORDER_CANCEL = 0x30011B, + CMSG_CRAFTING_ORDER_CLAIM = 0x300118, + CMSG_CRAFTING_ORDER_CREATE = 0x300114, + CMSG_CRAFTING_ORDER_FULFILL = 0x30011A, + CMSG_CRAFTING_ORDER_GET_NPC_REWARD_INFO = 0x300117, + CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x300116, + CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x300115, + CMSG_CRAFTING_ORDER_REJECT = 0x30011C, + CMSG_CRAFTING_ORDER_RELEASE = 0x300119, + CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0x30011D, + CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x30011E, + CMSG_CREATE_CHARACTER = 0x340070, + CMSG_CREATE_SHIPMENT = 0x2F01DB, + CMSG_DB_QUERY_BULK = 0x340010, + CMSG_DECLINE_GUILD_INVITES = 0x3000B7, + CMSG_DECLINE_PETITION = 0x3000D2, + CMSG_DELETE_EQUIPMENT_SET = 0x3000A3, + CMSG_DELVE_TELEPORT_OUT = 0x30012B, + CMSG_DEL_FRIEND = 0x3400FF, + CMSG_DEL_IGNORE = 0x340103, + CMSG_DESTROY_ITEM = 0x2F016A, + CMSG_DF_BOOT_PLAYER_VOTE = 0x340044, + CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x340036, + CMSG_DF_GET_JOIN_STATUS = 0x340042, + CMSG_DF_GET_SYSTEM_INFO = 0x340041, + CMSG_DF_JOIN = 0x340037, + CMSG_DF_LEAVE = 0x340040, + CMSG_DF_PROPOSAL_RESPONSE = 0x340035, + CMSG_DF_READY_CHECK_RESPONSE = 0x340048, + CMSG_DF_SET_ROLES = 0x340043, + CMSG_DF_TELEPORT = 0x340045, + CMSG_DISCARDED_TIME_SYNC_ACKS = 0x32005E, + CMSG_DISMISS_CRITTER = 0x300091, + CMSG_DO_COUNTDOWN = 0x340143, + CMSG_DO_MASTER_LOOT_ROLL = 0x2F00CB, + CMSG_DO_READY_CHECK = 0x34005E, + CMSG_DUEL_RESPONSE = 0x30007A, + CMSG_EJECT_PASSENGER = 0x2F0103, + CMSG_EMOTE = 0x3000DF, + CMSG_ENABLE_NAGLE = 0x350007, + CMSG_ENABLE_TAXI_NODE = 0x30003C, + CMSG_ENGINE_SURVEY = 0x340111, + CMSG_ENTER_ENCRYPTED_MODE_ACK = 0x350003, + CMSG_ENUM_CHARACTERS = 0x340014, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x34010B, + CMSG_FAR_SIGHT = 0x300080, + CMSG_GAME_EVENT_DEBUG_DISABLE = 0x2F005E, + CMSG_GAME_EVENT_DEBUG_ENABLE = 0x2F005D, + CMSG_GAME_OBJ_REPORT_USE = 0x300087, + CMSG_GAME_OBJ_USE = 0x300086, + CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x2F01D6, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x2F01BC, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x2F01A9, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x2F020D, + CMSG_GARRISON_COMPLETE_MISSION = 0x2F01FF, + CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x2F01D7, + CMSG_GARRISON_GENERATE_RECRUITS = 0x2F01BF, + CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x2F01CE, + CMSG_GARRISON_GET_MAP_DATA = 0x2F01D5, + CMSG_GARRISON_GET_MISSION_REWARD = 0x2F022F, + CMSG_GARRISON_LEARN_TALENT = 0x2F01CA, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x2F0201, + CMSG_GARRISON_PURCHASE_BUILDING = 0x2F01A5, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x2F01C1, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x2F01F6, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x2F01BD, + CMSG_GARRISON_RENAME_FOLLOWER = 0x2F01BE, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x2F01A4, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x2F01D9, + CMSG_GARRISON_RESEARCH_TALENT = 0x2F01C2, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x2F01A6, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x2F01BA, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x2F01B2, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x2F01C0, + CMSG_GARRISON_SOCKET_TALENT = 0x2F029C, + CMSG_GARRISON_START_MISSION = 0x2F01FE, + CMSG_GARRISON_SWAP_BUILDINGS = 0x2F01AA, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x340013, + CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x3400E3, + CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x34015F, + CMSG_GET_GARRISON_INFO = 0x2F019F, + CMSG_GET_ITEM_PURCHASE_DATA = 0x3000CD, + CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x2F01DA, + CMSG_GET_MIRROR_IMAGE_DATA = 0x2F016E, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x34001A, + CMSG_GET_RAF_ACCOUNT_INFO = 0x34014D, + CMSG_GET_REGIONWIDE_CHARACTER_RESTRICTION_AND_MAIL_DATA = 0x340190, + CMSG_GET_REMAINING_GAME_TIME = 0x340119, + CMSG_GET_TROPHY_LIST = 0x2F01EF, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x34010D, + CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x34011E, + CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x34011F, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3400BC, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x3400BB, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3400BA, + CMSG_GOSSIP_REFRESH_OPTIONS = 0x30010E, + CMSG_GOSSIP_SELECT_OPTION = 0x300026, + CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x2D0020, + CMSG_GUILD_ADD_RANK = 0x2D0005, + CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x2D0002, + CMSG_GUILD_BANK_ACTIVATE = 0x300047, + CMSG_GUILD_BANK_BUY_TAB = 0x300055, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x300057, + CMSG_GUILD_BANK_LOG_QUERY = 0x2D0019, + CMSG_GUILD_BANK_QUERY_TAB = 0x300054, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x2D001A, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x2D001D, + CMSG_GUILD_BANK_TEXT_QUERY = 0x2D001E, + CMSG_GUILD_BANK_UPDATE_TAB = 0x300056, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x300058, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x2D0017, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x2D0018, + CMSG_GUILD_DECLINE_INVITATION = 0x34002A, + CMSG_GUILD_DELETE = 0x2D0009, + CMSG_GUILD_DELETE_RANK = 0x2D0006, + CMSG_GUILD_DEMOTE_MEMBER = 0x2D0001, + CMSG_GUILD_EVENT_LOG_QUERY = 0x2D001C, + CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x2D0012, + CMSG_GUILD_GET_RANKS = 0x2D000E, + CMSG_GUILD_GET_ROSTER = 0x2D0014, + CMSG_GUILD_INVITE_BY_NAME = 0x340034, + CMSG_GUILD_LEAVE = 0x2D0003, + CMSG_GUILD_NEWS_UPDATE_STICKY = 0x2D000F, + CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x2D0004, + CMSG_GUILD_PERMISSIONS_QUERY = 0x2D001B, + CMSG_GUILD_PROMOTE_MEMBER = 0x2D0000, + CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x2D000C, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x2D000A, + CMSG_GUILD_QUERY_NEWS = 0x2D000D, + CMSG_GUILD_QUERY_RECIPES = 0x2D000B, + CMSG_GUILD_REPLACE_GUILD_MASTER = 0x2D001F, + CMSG_GUILD_REQUEST_RENAME = 0x2D0023, + CMSG_GUILD_REQUEST_RENAME_NAME_CHECK = 0x2D0022, + CMSG_GUILD_REQUEST_RENAME_REFUND = 0x2D0024, + CMSG_GUILD_REQUEST_RENAME_STATUS = 0x2D0021, + CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x2D0010, + CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x2D0011, + CMSG_GUILD_SET_GUILD_MASTER = 0x3400F6, + CMSG_GUILD_SET_MEMBER_NOTE = 0x2D0013, + CMSG_GUILD_SET_RANK_PERMISSIONS = 0x2D0008, + CMSG_GUILD_SHIFT_RANK = 0x2D0007, + CMSG_GUILD_UPDATE_INFO_TEXT = 0x2D0016, + CMSG_GUILD_UPDATE_MOTD_TEXT = 0x2D0015, + CMSG_HEARTH_AND_RESURRECT = 0x30009F, + CMSG_HIDE_QUEST_CHOICE = 0x2F017E, + CMSG_HOTFIX_REQUEST = 0x340011, + CMSG_IGNORE_TRADE = 0x2F0003, + CMSG_INITIATE_ROLE_POLL = 0x340006, + CMSG_INITIATE_TRADE = 0x2F0000, + CMSG_INSPECT = 0x3000C7, + CMSG_INSTANCE_ABANDON_VOTE_RESPONSE = 0x340061, + CMSG_INSTANCE_LOCK_RESPONSE = 0x3000A4, + CMSG_ISLAND_QUEUE = 0x2F0260, + CMSG_ITEM_PURCHASE_REFUND = 0x3000CE, + CMSG_ITEM_TEXT_QUERY = 0x2F020E, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x2F008D, + CMSG_JOIN_RATED_BATTLEGROUND = 0x2F0025, + CMSG_KEEP_ALIVE = 0x3400AB, + CMSG_KEYBOUND_OVERRIDE = 0x2F00E1, + CMSG_LATENCY_REPORT = 0x35000D, + CMSG_LEARN_PVP_TALENTS = 0x3000FA, + CMSG_LEARN_TALENTS = 0x3000F8, + CMSG_LEAVE_GROUP = 0x340075, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x2F008E, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x34003B, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x34003C, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x34003D, + CMSG_LFG_LIST_GET_STATUS = 0x340039, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x34003E, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x34003F, + CMSG_LFG_LIST_JOIN = 0x2F0254, + CMSG_LFG_LIST_LEAVE = 0x340038, + CMSG_LFG_LIST_SEARCH = 0x34003A, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x2F0255, + CMSG_LIST_INVENTORY = 0x300033, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x3400E6, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x3400E5, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x3400E4, + CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x3400E7, + CMSG_LOADING_SCREEN_NOTIFY = 0x340024, + CMSG_LOAD_SELECTED_TROPHY = 0x2F01F0, + CMSG_LOBBY_MATCHMAKER_ABANDON_QUEUE = 0x340172, + CMSG_LOBBY_MATCHMAKER_ACCEPT_PARTY_INVITE = 0x340169, + CMSG_LOBBY_MATCHMAKER_CREATE_CHARACTER = 0x34017B, + CMSG_LOBBY_MATCHMAKER_ENTER_QUEUE = 0x340170, + CMSG_LOBBY_MATCHMAKER_LEAVE_PARTY = 0x34016C, + CMSG_LOBBY_MATCHMAKER_PARTY_INVITE = 0x340168, + CMSG_LOBBY_MATCHMAKER_PARTY_UNINVITE = 0x34016B, + CMSG_LOBBY_MATCHMAKER_QUEUE_PROPSAL_RESPONSE = 0x340171, + CMSG_LOBBY_MATCHMAKER_REJECT_PARTY_INVITE = 0x34016A, + CMSG_LOBBY_MATCHMAKER_SET_PARTY_PLAYLIST_ENTRY = 0x34016D, + CMSG_LOBBY_MATCHMAKER_SET_PLAYER_READY = 0x34016E, + CMSG_LOGOUT_CANCEL = 0x300070, + CMSG_LOGOUT_INSTANT = 0x300071, + CMSG_LOGOUT_LOBBY_MATCHMAKER = 0x300122, + CMSG_LOGOUT_REQUEST = 0x30006F, + CMSG_LOG_DISCONNECT = 0x350005, + CMSG_LOG_STREAMING_ERROR = 0x350009, + CMSG_LOOT_ITEM = 0x2F00C9, + CMSG_LOOT_MONEY = 0x2F00C8, + CMSG_LOOT_RELEASE = 0x2F00CD, + CMSG_LOOT_ROLL = 0x2F00CE, + CMSG_LOOT_UNIT = 0x2F00C7, + CMSG_LOW_LEVEL_RAID1 = 0x3400CE, + CMSG_LOW_LEVEL_RAID2 = 0x3000AB, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x3000D9, + CMSG_MAIL_DELETE = 0x2F00E3, + CMSG_MAIL_GET_LIST = 0x3000D4, + CMSG_MAIL_MARK_AS_READ = 0x3000D8, + CMSG_MAIL_RETURN_TO_SENDER = 0x340081, + CMSG_MAIL_TAKE_ITEM = 0x3000D6, + CMSG_MAIL_TAKE_MONEY = 0x3000D5, + CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x2F00E4, + CMSG_MASTER_LOOT_ITEM = 0x2F00CA, + CMSG_MERGE_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x300052, + CMSG_MERGE_GUILD_BANK_ITEM_WITH_ITEM = 0x30004F, + CMSG_MERGE_ITEM_WITH_GUILD_BANK_ITEM = 0x30004D, + CMSG_MINIMAP_PING = 0x340077, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x2F0036, + CMSG_MOUNT_CLEAR_FANFARE = 0x290003, + CMSG_MOUNT_SET_FAVORITE = 0x34005C, + CMSG_MOUNT_SPECIAL_ANIM = 0x2F0154, + CMSG_MOVE_ADD_IMPULSE_ACK = 0x32006D, + CMSG_MOVE_APPLY_INERTIA_ACK = 0x32006B, + CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x320031, + CMSG_MOVE_CHANGE_TRANSPORT = 0x32004C, + CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x320051, + CMSG_MOVE_COLLISION_DISABLE_ACK = 0x320056, + CMSG_MOVE_COLLISION_ENABLE_ACK = 0x320057, + CMSG_MOVE_DISMISS_VEHICLE = 0x320050, + CMSG_MOVE_DOUBLE_JUMP = 0x320007, + CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x32003A, + CMSG_MOVE_ENABLE_FULL_SPEED_TURNING_ACK = 0x320083, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x320040, + CMSG_MOVE_FALL_LAND = 0x320017, + CMSG_MOVE_FALL_RESET = 0x320035, + CMSG_MOVE_FEATHER_FALL_ACK = 0x320038, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x32004B, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x32004A, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x32004F, + CMSG_MOVE_FORCE_ROOT_ACK = 0x32002A, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x320028, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x320027, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x32003E, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x320029, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x32003F, + CMSG_MOVE_FORCE_UNROOT_ACK = 0x32002B, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x32003D, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x320052, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x320053, + CMSG_MOVE_GUILD_BANK_ITEM = 0x30004C, + CMSG_MOVE_HEARTBEAT = 0x32002C, + CMSG_MOVE_HOVER_ACK = 0x32002F, + CMSG_MOVE_INERTIA_DISABLE_ACK = 0x320054, + CMSG_MOVE_INERTIA_ENABLE_ACK = 0x320055, + CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE = 0x320063, + CMSG_MOVE_JUMP = 0x320006, + CMSG_MOVE_KNOCK_BACK_ACK = 0x32002E, + CMSG_MOVE_REMOVE_INERTIA_ACK = 0x32006C, + CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x320033, + CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x320032, + CMSG_MOVE_SET_ADV_FLY = 0x32006F, + CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK = 0x320077, + CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK = 0x320072, + CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK = 0x320078, + CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK = 0x320075, + CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK = 0x320076, + CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK = 0x32007F, + CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK = 0x320074, + CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK = 0x320073, + CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK = 0x32007D, + CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK = 0x320079, + CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK = 0x32007A, + CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK = 0x32007C, + CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK = 0x32007B, + CMSG_MOVE_SET_CAN_ADV_FLY_ACK = 0x32006E, + CMSG_MOVE_SET_CAN_DRIVE_ACK = 0x320070, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x320043, + CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x320041, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x320058, + CMSG_MOVE_SET_FACING = 0x320025, + CMSG_MOVE_SET_FACING_HEARTBEAT = 0x32007E, + CMSG_MOVE_SET_FLY = 0x320045, + CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x320042, + CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x32005F, + CMSG_MOVE_SET_PITCH = 0x320026, + CMSG_MOVE_SET_RUN_MODE = 0x32000E, + CMSG_MOVE_SET_TURN_RATE_CHEAT = 0x320022, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x320030, + CMSG_MOVE_SET_WALK_MODE = 0x32000F, + CMSG_MOVE_SPLINE_DONE = 0x320034, + CMSG_MOVE_START_ASCEND = 0x320046, + CMSG_MOVE_START_BACKWARD = 0x320001, + CMSG_MOVE_START_DESCEND = 0x32004D, + CMSG_MOVE_START_DRIVE_FORWARD = 0x320071, + CMSG_MOVE_START_FORWARD = 0x320000, + CMSG_MOVE_START_PITCH_DOWN = 0x32000C, + CMSG_MOVE_START_PITCH_UP = 0x32000B, + CMSG_MOVE_START_STRAFE_LEFT = 0x320003, + CMSG_MOVE_START_STRAFE_RIGHT = 0x320004, + CMSG_MOVE_START_SWIM = 0x320018, + CMSG_MOVE_START_TURN_LEFT = 0x320008, + CMSG_MOVE_START_TURN_RIGHT = 0x320009, + CMSG_MOVE_STOP = 0x320002, + CMSG_MOVE_STOP_ASCEND = 0x320047, + CMSG_MOVE_STOP_PITCH = 0x32000D, + CMSG_MOVE_STOP_STRAFE = 0x320005, + CMSG_MOVE_STOP_SWIM = 0x320019, + CMSG_MOVE_STOP_TURN = 0x32000A, + CMSG_MOVE_TELEPORT_ACK = 0x320016, + CMSG_MOVE_TIME_SKIPPED = 0x320037, + CMSG_MOVE_UPDATE_FALL_SPEED = 0x320036, + CMSG_MOVE_WATER_WALK_ACK = 0x320039, + CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0x2C0001, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x2F0083, + CMSG_NEXT_CINEMATIC_CAMERA = 0x3000E2, + CMSG_OBJECT_UPDATE_FAILED = 0x2F002C, + CMSG_OBJECT_UPDATE_RESCUED = 0x2F002D, + CMSG_OFFER_PETITION = 0x2F0286, + CMSG_OPENING_CINEMATIC = 0x3000E1, + CMSG_OPEN_ITEM = 0x2F020F, + CMSG_OPEN_MISSION_NPC = 0x2F01D0, + CMSG_OPEN_SHIPMENT_NPC = 0x2F01D8, + CMSG_OPEN_TRADESKILL_NPC = 0x2F01E3, + CMSG_OPT_OUT_OF_LOOT = 0x30008E, + CMSG_OVERRIDE_SCREEN_FLASH = 0x3000B8, + CMSG_PARTY_INVITE = 0x340030, + CMSG_PARTY_INVITE_RESPONSE = 0x340032, + CMSG_PARTY_UNINVITE = 0x340073, + CMSG_PERFORM_ITEM_INTERACTION = 0x2F00EC, + CMSG_PERKS_PROGRAM_ITEMS_REFRESHED = 0x2F02AE, + CMSG_PERKS_PROGRAM_REQUEST_CART_CHECKOUT = 0x2F02B1, + CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = 0x290012, + CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0x2F02B0, + CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0x2F02B2, + CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0x2F02B3, + CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0x2F02AF, + CMSG_PETITION_BUY = 0x30005A, + CMSG_PETITION_RENAME_GUILD = 0x3400F7, + CMSG_PETITION_SHOW_LIST = 0x300059, + CMSG_PETITION_SHOW_SIGNATURES = 0x30005B, + CMSG_PET_ABANDON = 0x30001E, + CMSG_PET_ABANDON_BY_NUMBER = 0x30001F, + CMSG_PET_ACTION = 0x30001C, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x2F0092, + CMSG_PET_BATTLE_INPUT = 0x34006D, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x2F00E2, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x2F0091, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x34006E, + CMSG_PET_BATTLE_REQUEST_PVP = 0x2F008B, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x2F008C, + CMSG_PET_BATTLE_REQUEST_WILD = 0x2F0089, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x2F0093, + CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x3D008A, + CMSG_PET_CANCEL_AURA = 0x300020, + CMSG_PET_CAST_SPELL = 0x2F0173, + CMSG_PET_RENAME = 0x3400B0, + CMSG_PET_SET_ACTION = 0x30001B, + CMSG_PET_SPELL_AUTOCAST = 0x300021, + CMSG_PET_STOP_ATTACK = 0x30001D, + CMSG_PING = 0x350004, + CMSG_PLAYER_LOGIN = 0x340016, + CMSG_PUSH_QUEST_TO_PARTY = 0x300031, + CMSG_PVP_LOG_DATA = 0x2F0028, + CMSG_QUERY_BATTLE_PET_NAME = 0x2F0147, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x34008C, + CMSG_QUERY_CORPSE_TRANSPORT = 0x34008D, + CMSG_QUERY_COUNTDOWN_TIMER = 0x2F0055, + CMSG_QUERY_CREATURE = 0x2F0141, + CMSG_QUERY_GAME_OBJECT = 0x2F0142, + CMSG_QUERY_GARRISON_PET_NAME = 0x2F0148, + CMSG_QUERY_GUILD_INFO = 0x3400B6, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x300098, + CMSG_QUERY_NEXT_MAIL_TIME = 0x3000D7, + CMSG_QUERY_NPC_TEXT = 0x2F0143, + CMSG_QUERY_PAGE_TEXT = 0x2F0145, + CMSG_QUERY_PETITION = 0x2F0149, + CMSG_QUERY_PET_NAME = 0x2F0146, + CMSG_QUERY_PLAYER_NAMES = 0x35000E, + CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY = 0x35000C, + CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID = 0x35000B, + CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x2F0021, + CMSG_QUERY_QUEST_INFO = 0x2F0144, + CMSG_QUERY_QUEST_ITEM_USABILITY = 0x2F0022, + CMSG_QUERY_REALM_NAME = 0x3400B5, + CMSG_QUERY_SCENARIO_POI = 0x340082, + CMSG_QUERY_SELECTED_WOW_LABS_AREA = 0x2F02EA, + CMSG_QUERY_TIME = 0x30006E, + CMSG_QUERY_TREASURE_PICKER = 0x2F0232, + CMSG_QUERY_WOW_LABS_AREA_INFO = 0x2F02EB, + CMSG_QUEST_CONFIRM_ACCEPT = 0x300030, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x30002A, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x30002C, + CMSG_QUEST_GIVER_CLOSE_QUEST = 0x3000E8, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x30002B, + CMSG_QUEST_GIVER_HELLO = 0x300028, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x300029, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x30002D, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x30002F, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x30002E, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x3000CC, + CMSG_QUEST_POI_QUERY = 0x3400DD, + CMSG_QUEST_PUSH_RESULT = 0x300032, + CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x2F0278, + CMSG_QUEST_SESSION_REQUEST_START = 0x2F0277, + CMSG_QUEST_SESSION_REQUEST_STOP = 0x340158, + CMSG_QUEUED_MESSAGES_END = 0x350008, + CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x340130, + CMSG_QUICK_JOIN_REQUEST_INVITE = 0x34012F, + CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x34015D, + CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x34012E, + CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x34012D, + CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x30009C, + CMSG_RAF_CLAIM_NEXT_REWARD = 0x34014E, + CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x340150, + CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x34014F, + CMSG_RANDOM_ROLL = 0x340080, + CMSG_READY_CHECK_RESPONSE = 0x34005F, + CMSG_READ_ITEM = 0x2F0210, + CMSG_RECLAIM_CORPSE = 0x300073, + CMSG_REMOVE_NEW_ITEM = 0x2F0236, + CMSG_REMOVE_RAF_RECRUIT = 0x340151, + CMSG_REORDER_CHARACTERS = 0x340015, + CMSG_REPAIR_ITEM = 0x300084, + CMSG_REPLACE_TROPHY = 0x2F01F1, + CMSG_REPOP_REQUEST = 0x3000C4, + CMSG_REPORT_PVP_PLAYER_AFK = 0x30008C, + CMSG_REPORT_SERVER_LAG = 0x2F0270, + CMSG_REPORT_STUCK_IN_COMBAT = 0x2F0271, + CMSG_REQUEST_ACCOUNT_DATA = 0x3400C2, + CMSG_REQUEST_AREA_POI_UPDATE = 0x2F0234, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x340008, + CMSG_REQUEST_CEMETERY_LIST = 0x2F0023, + CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x3400B7, + CMSG_REQUEST_COVENANT_CALLINGS = 0x2F0262, + CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x3000C8, + CMSG_REQUEST_CURRENCY_DATA_FOR_ACCOUNT_CHARACTERS = 0x290019, + CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x2F029B, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x2F0054, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x2F0053, + CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x2F0272, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x2F017F, + CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x2F00B7, + CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x2F00B8, + CMSG_REQUEST_PARTY_ELIGIBILITY_FOR_DELVE_TIERS = 0x2F02E9, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x340023, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x34007F, + CMSG_REQUEST_PET_INFO = 0x300022, + CMSG_REQUEST_PLAYED_TIME = 0x2F014C, + CMSG_REQUEST_PVP_REWARDS = 0x2F0041, + CMSG_REQUEST_RAID_INFO = 0x3400F8, + CMSG_REQUEST_RATED_PVP_INFO = 0x34000F, + CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x340193, + CMSG_REQUEST_SCHEDULED_AREA_POI_UPDATE = 0x2F0235, + CMSG_REQUEST_SCHEDULED_PVP_INFO = 0x2F0042, + CMSG_REQUEST_STABLED_PETS = 0x300023, + CMSG_REQUEST_STORE_FRONT_INFO_UPDATE = 0x29001E, + CMSG_REQUEST_VEHICLE_EXIT = 0x2F00FE, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x2F0100, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x2F00FF, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x2F0101, + CMSG_REQUEST_WEEKLY_REWARDS = 0x2F0265, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x2F0233, + CMSG_RESET_CHALLENGE_MODE = 0x2F00B5, + CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x2F00B6, + CMSG_RESET_INSTANCES = 0x340094, + CMSG_RESURRECT_RESPONSE = 0x3400AF, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x2F01F3, + CMSG_RIDE_VEHICLE_INTERACT = 0x2F0102, + CMSG_RPE_RESET_CHARACTER = 0x34017E, + CMSG_SAVE_ACCOUNT_DATA_EXPORT = 0x340178, + CMSG_SAVE_CUF_PROFILES = 0x2F0037, + CMSG_SAVE_EQUIPMENT_SET = 0x3000A2, + CMSG_SAVE_GUILD_EMBLEM = 0x2F0184, + CMSG_SAVE_PERSONAL_EMBLEM = 0x2F0185, + CMSG_SCENE_PLAYBACK_CANCELED = 0x2F00DE, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x2F00DD, + CMSG_SCENE_TRIGGER_EVENT = 0x2F00DF, + CMSG_SEAMLESS_TRANSFER_COMPLETE = 0x2F02D8, + CMSG_SELECT_WOW_LABS_AREA = 0x2F02EC, + CMSG_SELF_RES = 0x3000CF, + CMSG_SELL_ALL_JUNK_ITEMS = 0x300035, + CMSG_SELL_ITEM = 0x300034, + CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x340126, + CMSG_SEND_CONTACT_LIST = 0x3400FD, + CMSG_SEND_MAIL = 0x340026, + CMSG_SEND_PING_UNIT = 0x2F02DA, + CMSG_SEND_PING_WORLD_POINT = 0x2F02DB, + CMSG_SEND_TEXT_EMOTE = 0x300019, + CMSG_SERVER_TIME_OFFSET_REQUEST = 0x3400C9, + CMSG_SETUP_WARBAND_GROUPS = 0x34018C, + CMSG_SET_ACTION_BAR_TOGGLES = 0x3000D0, + CMSG_SET_ACTION_BUTTON = 0x340062, + CMSG_SET_ACTIVE_MOVER = 0x320059, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x2F0192, + CMSG_SET_ASSISTANT_LEADER = 0x34007B, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x2F0213, + CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0x2F0214, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x2F0215, + CMSG_SET_CONTACT_NOTES = 0x340100, + CMSG_SET_CURRENCY_FLAGS = 0x2F0015, + CMSG_SET_DIFFICULTY_ID = 0x2F00E0, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3400AE, + CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = 0x2F013B, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x340046, + CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES = 0x340131, + CMSG_SET_FACTION_AT_WAR = 0x300076, + CMSG_SET_FACTION_INACTIVE = 0x300078, + CMSG_SET_FACTION_NOT_AT_WAR = 0x300077, + CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x2F0065, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x2F0217, + CMSG_SET_LOOT_METHOD = 0x340074, + CMSG_SET_LOOT_SPECIALIZATION = 0x3000DD, + CMSG_SET_PARTY_ASSIGNMENT = 0x34007D, + CMSG_SET_PARTY_LEADER = 0x340076, + CMSG_SET_PET_FAVORITE = 0x2F0012, + CMSG_SET_PET_SLOT = 0x2F0011, + CMSG_SET_PET_SPECIALIZATION = 0x2F0013, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x3400B4, + CMSG_SET_PREFERRED_CEMETERY = 0x2F0024, + CMSG_SET_PVP = 0x2F0189, + CMSG_SET_RAID_DIFFICULTY = 0x340109, + CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = 0x340047, + CMSG_SET_ROLE = 0x340005, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3400B2, + CMSG_SET_SELECTION = 0x3000C6, + CMSG_SET_SHEATHED = 0x30001A, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x2F0216, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x30008B, + CMSG_SET_TITLE = 0x2F0152, + CMSG_SET_TRADE_CURRENCY = 0x2F000A, + CMSG_SET_TRADE_GOLD = 0x2F0009, + CMSG_SET_TRADE_ITEM = 0x2F0007, + CMSG_SET_USING_PARTY_GARRISON = 0x2F01D2, + CMSG_SET_WAR_MODE = 0x2F018A, + CMSG_SET_WATCHED_FACTION = 0x300079, + CMSG_SHOW_TRADE_SKILL = 0x3400F0, + CMSG_SIGN_PETITION = 0x3000D1, + CMSG_SILENCE_PARTY_TALKER = 0x34007E, + CMSG_SOCIAL_CONTRACT_REQUEST = 0x340173, + CMSG_SOCKET_GEMS = 0x300083, + CMSG_SORT_ACCOUNT_BANK_BAGS = 0x2F02DE, + CMSG_SORT_BAGS = 0x2F0218, + CMSG_SORT_BANK_BAGS = 0x2F0219, + CMSG_SPAWN_TRACKING_UPDATE = 0x2F0167, + CMSG_SPECTATE_CHANGE = 0x2F02D1, + CMSG_SPELL_CLICK = 0x300027, + CMSG_SPELL_EMPOWER_RELEASE = 0x2F0139, + CMSG_SPELL_EMPOWER_RESTART = 0x2F013A, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x300042, + CMSG_SPLIT_GUILD_BANK_ITEM = 0x300053, + CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY = 0x300050, + CMSG_SPLIT_ITEM = 0x310008, + CMSG_SPLIT_ITEM_TO_GUILD_BANK = 0x30004E, + CMSG_STAND_STATE_CHANGE = 0x2F0035, + CMSG_START_CHALLENGE_MODE = 0x3000E9, + CMSG_START_INSTANCE_ABANDON_VOTE = 0x340060, + CMSG_START_SPECTATOR_WAR_GAME = 0x34000B, + CMSG_START_WAR_GAME = 0x34000A, + CMSG_STORE_GUILD_BANK_ITEM = 0x300049, + CMSG_SUBMIT_USER_FEEDBACK = 0x3400C1, + CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x2F0290, + CMSG_SUMMON_RESPONSE = 0x340096, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x340072, + CMSG_SURRENDER_ARENA = 0x2F0020, + CMSG_SUSPEND_COMMS_ACK = 0x350000, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x350006, + CMSG_SWAP_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x30004B, + CMSG_SWAP_INV_ITEM = 0x310007, + CMSG_SWAP_ITEM = 0x310006, + CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM = 0x30004A, + CMSG_SWAP_SUB_GROUPS = 0x340079, + CMSG_TABARD_VENDOR_ACTIVATE = 0x2F0186, + CMSG_TALK_TO_GOSSIP = 0x300024, + CMSG_TAXI_NODE_STATUS_QUERY = 0x30003B, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x30003D, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x30003F, + CMSG_TIME_ADJUSTMENT_RESPONSE = 0x32005D, + CMSG_TIME_SYNC_RESPONSE = 0x32005A, + CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x32005C, + CMSG_TIME_SYNC_RESPONSE_FAILED = 0x32005B, + CMSG_TOGGLE_DIFFICULTY = 0x340083, + CMSG_TOGGLE_PVP = 0x2F0188, + CMSG_TOTEM_DESTROYED = 0x300090, + CMSG_TOY_CLEAR_FANFARE = 0x290004, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x2F0231, + CMSG_TRAINER_BUY_SPELL = 0x300041, + CMSG_TRAINER_LIST = 0x300040, + CMSG_TRAITS_COMMIT_CONFIG = 0x2F02B9, + CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x2F02B7, + CMSG_TRANSFER_CURRENCY_FROM_ACCOUNT_CHARACTER = 0x2F02E7, + CMSG_TRANSMOGRIFY_ITEMS = 0x2F0043, + CMSG_TURN_IN_PETITION = 0x3000D3, + CMSG_TUTORIAL = 0x34010A, + CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x2F0261, + CMSG_UNACCEPT_TRADE = 0x2F0005, + CMSG_UNDELETE_CHARACTER = 0x34010C, + CMSG_UNLEARN_SKILL = 0x30007D, + CMSG_UNLEARN_SPECIALIZATION = 0x2F0051, + CMSG_UPDATE_AADC_STATUS = 0x340163, + CMSG_UPDATE_ACCOUNT_BANK_TAB_SETTINGS = 0x30012A, + CMSG_UPDATE_ACCOUNT_DATA = 0x3400C3, + CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x2F0176, + CMSG_UPDATE_CLIENT_SETTINGS = 0x340090, + CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x2F01E4, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x320060, + CMSG_UPDATE_RAID_TARGET = 0x34007C, + CMSG_UPDATE_SPELL_VISUAL = 0x2F0175, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x340121, + CMSG_UPGRADE_GARRISON = 0x2F019A, + CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x2F028E, + CMSG_USED_FOLLOW = 0x2F0032, + CMSG_USE_CRITTER_ITEM = 0x2F0108, + CMSG_USE_EQUIPMENT_SET = 0x310001, + CMSG_USE_ITEM = 0x2F016F, + CMSG_USE_TOY = 0x2F0172, + CMSG_VAS_CHECK_TRANSFER_OK = 0x340136, + CMSG_VAS_GET_QUEUE_MINUTES = 0x340135, + CMSG_VAS_GET_SERVICE_STATUS = 0x340134, + CMSG_VIOLENCE_LEVEL = 0x2F0030, + CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST = 0x34013A, + CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x34013B, + CMSG_VOICE_CHAT_LOGIN = 0x340139, + CMSG_WARDEN3_DATA = 0x340018, + CMSG_WHO = 0x3400AD, + CMSG_WHO_IS = 0x3400AC, + CMSG_WORLD_LOOT_OBJECT_CLICK = 0x2F02D4, + CMSG_WORLD_PORT_RESPONSE = 0x340025, + CMSG_WRAP_ITEM = 0x310000, }; -inline constexpr std::size_t NUM_CMSG_OPCODES = 1732; +inline constexpr std::size_t NUM_CMSG_OPCODES = 1735; inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeClient opcode) { uint32 idInGroup = opcode & 0xFFFF; switch (opcode >> 16) { - case 0x2B: return idInGroup < 31 ? idInGroup + 0 : -1; - case 0x2D: return idInGroup < 51 ? idInGroup + 31 : -1; - case 0x2E: return idInGroup < 3 ? idInGroup + 82 : -1; - case 0x2F: return idInGroup < 37 ? idInGroup + 85 : -1; - case 0x31: return idInGroup < 750 ? idInGroup + 122 : -1; - case 0x32: return idInGroup < 299 ? idInGroup + 872 : -1; - case 0x33: return idInGroup < 12 ? idInGroup + 1171 : -1; - case 0x34: return idInGroup < 132 ? idInGroup + 1183 : -1; - case 0x36: return idInGroup < 402 ? idInGroup + 1315 : -1; - case 0x37: return idInGroup < 15 ? idInGroup + 1717 : -1; + case 0x29: return idInGroup < 31 ? idInGroup + 0 : -1; + case 0x2B: return idInGroup < 51 ? idInGroup + 31 : -1; + case 0x2C: return idInGroup < 3 ? idInGroup + 82 : -1; + case 0x2D: return idInGroup < 37 ? idInGroup + 85 : -1; + case 0x2F: return idInGroup < 751 ? idInGroup + 122 : -1; + case 0x30: return idInGroup < 301 ? idInGroup + 873 : -1; + case 0x31: return idInGroup < 10 ? idInGroup + 1174 : -1; + case 0x32: return idInGroup < 132 ? idInGroup + 1184 : -1; + case 0x34: return idInGroup < 404 ? idInGroup + 1316 : -1; + case 0x35: return idInGroup < 15 ? idInGroup + 1720 : -1; default: return -1; } } enum OpcodeServer : uint32 { - SMSG_ABORT_NEW_WORLD = 0x380030, - SMSG_ACCOUNT_CHARACTER_CURRENCY_LISTS = 0x380342, - SMSG_ACCOUNT_CONVERSION_STATE_UPDATE = 0x380347, - SMSG_ACCOUNT_COSMETIC_ADDED = 0x3802FB, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x3802E3, - SMSG_ACCOUNT_DATA_TIMES = 0x3801A4, - SMSG_ACCOUNT_EXPORT_RESPONSE = 0x380333, - SMSG_ACCOUNT_ITEM_COLLECTION_DATA = 0x38034D, - SMSG_ACCOUNT_MOUNT_REMOVED = 0x380047, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x380046, - SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x3802FA, - SMSG_ACCOUNT_STORE_CURRENCY_UPDATE = 0x38031C, - SMSG_ACCOUNT_STORE_FRONT_UPDATE = 0x38031D, - SMSG_ACCOUNT_STORE_ITEM_STATE_CHANGED = 0x38031E, - SMSG_ACCOUNT_STORE_RESULT = 0x38031F, - SMSG_ACCOUNT_TOY_UPDATE = 0x380048, - SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x38004C, - SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x38004B, - SMSG_ACCOUNT_WARBAND_SCENE_UPDATE = 0x38004E, - SMSG_ACHIEVEMENT_DELETED = 0x380181, - SMSG_ACHIEVEMENT_EARNED = 0x3800DB, - SMSG_ACTIVATE_ESSENCE_FAILED = 0x4B0020, - SMSG_ACTIVATE_SOULBIND_FAILED = 0x4B0022, - SMSG_ACTIVATE_TAXI_REPLY = 0x380118, - SMSG_ACTIVE_GLYPHS = 0x4E0045, - SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0x3801DF, - SMSG_ADDON_LIST_REQUEST = 0x3800DA, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x3800D5, - SMSG_ADD_ITEM_PASSIVE = 0x380042, - SMSG_ADD_LOSS_OF_CONTROL = 0x38010B, - SMSG_ADD_RUNE_POWER = 0x380152, - SMSG_ADJUST_SPLINE_DURATION = 0x380069, - SMSG_ADVANCED_COMBAT_LOG = 0x3802F8, - SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x3802F3, - SMSG_AE_LOOT_TARGETS = 0x3800B0, - SMSG_AE_LOOT_TARGET_ACK = 0x3800B1, - SMSG_AI_REACTION = 0x38014F, - SMSG_ALLIED_RACE_DETAILS = 0x38028D, - SMSG_ALL_ACCOUNT_CRITERIA = 0x380005, - SMSG_ALL_ACHIEVEMENT_DATA = 0x380004, - SMSG_ALL_GUILD_ACHIEVEMENTS = 0x440000, - SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x3802D0, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x38001D, - SMSG_AREA_POI_UPDATE_RESPONSE = 0x4B0018, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x3801D8, - SMSG_AREA_TRIGGER_DENIED = 0x390009, - SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING = 0x390006, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x3801B0, - SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x390004, - SMSG_AREA_TRIGGER_RE_PATH = 0x390003, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x390008, - SMSG_AREA_TRIGGER_UNATTACH = 0x390007, - SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = 0x390005, - SMSG_ARENA_CLEAR_OPPONENTS = 0x3800E1, - SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x3800CA, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x3800E0, - SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x38023A, - SMSG_ARTIFACT_FORGE_ERROR = 0x380238, - SMSG_ARTIFACT_RESPEC_PROMPT = 0x380239, - SMSG_ARTIFACT_XP_GAIN = 0x380280, - SMSG_ATTACKER_STATE_UPDATE = 0x3E002C, - SMSG_ATTACK_START = 0x3E0017, - SMSG_ATTACK_STOP = 0x3E0018, - SMSG_ATTACK_SWING_ERROR = 0x3E0026, - SMSG_ATTACK_SWING_LANDED_LOG = 0x3E0027, - SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x380269, - SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x380268, - SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x380267, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x38018C, - SMSG_AUCTION_COMMAND_RESULT = 0x380189, - SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x380320, - SMSG_AUCTION_FAVORITE_LIST = 0x3802EA, - SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x3802E2, - SMSG_AUCTION_HELLO_RESPONSE = 0x380187, - SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x3802E1, - SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x3802DD, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x3802DE, - SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x3802E0, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x38018B, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x38018D, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x380188, - SMSG_AUCTION_WON_NOTIFICATION = 0x38018A, - SMSG_AURA_POINTS_DEPLETED = 0x4E0012, - SMSG_AURA_UPDATE = 0x4E0011, - SMSG_AUTH_CHALLENGE = 0x3F0000, - SMSG_AUTH_FAILED = 0x380000, - SMSG_AUTH_RESPONSE = 0x380001, - SMSG_AVAILABLE_HOTFIXES = 0x3C0001, - SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0x380321, - SMSG_BAG_CLEANUP_FINISHED = 0x4F0007, - SMSG_BARBER_SHOP_RESULT = 0x380157, - SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x3802C1, - SMSG_BATTLEFIELD_LIST = 0x3E0005, - SMSG_BATTLEFIELD_PORT_DENIED = 0x3E000B, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x3E0001, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x3E0004, - SMSG_BATTLEFIELD_STATUS_GROUP_PROPOSAL_FAILED = 0x3E000E, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x3E0000, - SMSG_BATTLEFIELD_STATUS_NONE = 0x3E0003, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x3E0002, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x3E000D, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x3E000C, - SMSG_BATTLEGROUND_INIT = 0x3E0029, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x3E0009, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x3E000A, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x3E0006, - SMSG_BATTLEGROUND_POINTS = 0x3E0028, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x380222, - SMSG_BATTLENET_CHALLENGE_START = 0x380221, - SMSG_BATTLENET_NOTIFICATION = 0x380299, - SMSG_BATTLENET_RESPONSE = 0x380298, - SMSG_BATTLE_NET_CONNECTION_STATUS = 0x38029A, - SMSG_BATTLE_PAY_ACK_FAILED = 0x38021D, - SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x380212, - SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x380213, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x38021C, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x380210, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x38020F, - SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x380300, - SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x38020D, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x38020E, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x38020C, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x38020A, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x38020B, - SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x380211, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x38021B, - SMSG_BATTLE_PAY_START_CHECKOUT = 0x3802B5, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x380219, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x380218, - SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x3802A9, - SMSG_BATTLE_PETS_HEALED = 0x38008B, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x380113, - SMSG_BATTLE_PET_DELETED = 0x380088, - SMSG_BATTLE_PET_ERROR = 0x3800D0, - SMSG_BATTLE_PET_JOURNAL = 0x380087, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x380085, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x380086, - SMSG_BATTLE_PET_RESTORED = 0x38008A, - SMSG_BATTLE_PET_REVOKED = 0x380089, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x380083, - SMSG_BATTLE_PET_UPDATES = 0x380082, - SMSG_BIND_POINT_UPDATE = 0x380011, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x3800C0, - SMSG_BLACK_MARKET_OUTBID = 0x3800C1, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x3800BF, - SMSG_BLACK_MARKET_WON = 0x3800C2, - SMSG_BONUS_ROLL_EMPTY = 0x3800DD, - SMSG_BOSS_KILL = 0x3E002B, - SMSG_BREAK_TARGET = 0x3E0016, - SMSG_BROADCAST_ACHIEVEMENT = 0x3D0012, - SMSG_BROADCAST_SUMMON_CAST = 0x3802C3, - SMSG_BROADCAST_SUMMON_RESPONSE = 0x3802C4, - SMSG_BUY_FAILED = 0x380160, - SMSG_BUY_SUCCEEDED = 0x38015F, - SMSG_CACHE_INFO = 0x3C000F, - SMSG_CACHE_VERSION = 0x3C000E, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x380138, - SMSG_CALENDAR_COMMAND_RESULT = 0x380139, - SMSG_CALENDAR_COMMUNITY_INVITE = 0x380128, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x380130, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x380131, - SMSG_CALENDAR_INVITE_ADDED = 0x380129, - SMSG_CALENDAR_INVITE_ALERT = 0x38012D, - SMSG_CALENDAR_INVITE_NOTES = 0x380132, - SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x380133, - SMSG_CALENDAR_INVITE_REMOVED = 0x38012A, - SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x38012F, - SMSG_CALENDAR_INVITE_STATUS = 0x38012B, - SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x38012E, - SMSG_CALENDAR_MODERATOR_STATUS = 0x38012C, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x380134, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x380135, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x380136, - SMSG_CALENDAR_SEND_CALENDAR = 0x380126, - SMSG_CALENDAR_SEND_EVENT = 0x380127, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x380137, - SMSG_CAMERA_EFFECT = 0x3801BE, - SMSG_CANCEL_AUTO_REPEAT = 0x380177, - SMSG_CANCEL_COMBAT = 0x3E0025, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x4E0037, - SMSG_CANCEL_PING_PIN = 0x38003B, - SMSG_CANCEL_PRELOAD_WORLD = 0x38002E, - SMSG_CANCEL_SCENE = 0x3800CF, - SMSG_CANCEL_SPELL_VISUAL = 0x4E0035, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x4E0039, - SMSG_CAN_DUEL_RESULT = 0x3E0021, - SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x3802A8, - SMSG_CAPTURE_POINT_REMOVED = 0x3E0008, - SMSG_CAST_FAILED = 0x4E0048, - SMSG_CAS_REFRESH_REMOTE_DATA = 0x380111, - SMSG_CAUTIONARY_CHANNEL_MESSAGE = 0x3D0009, - SMSG_CAUTIONARY_CHAT_MESSAGE = 0x3D0008, - SMSG_CHAIN_MISSILE_BOUNCE = 0x380061, - SMSG_CHALLENGE_MODE_COMPLETE = 0x3800A2, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x3800A8, - SMSG_CHALLENGE_MODE_RESET = 0x3800A1, - SMSG_CHALLENGE_MODE_START = 0x38009F, - SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x3800A0, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x4B000C, - SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x38029B, - SMSG_CHANNEL_LIST = 0x3D001B, - SMSG_CHANNEL_NOTIFY = 0x3D0017, - SMSG_CHANNEL_NOTIFY_JOINED = 0x3D0019, - SMSG_CHANNEL_NOTIFY_LEFT = 0x3D001A, - SMSG_CHANNEL_NOTIFY_NPE_JOINED_BATCH = 0x3D0018, - SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x380255, - SMSG_CHARACTER_LOGIN_FAILED = 0x38019E, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x380220, - SMSG_CHARACTER_RENAME_RESULT = 0x3801FB, - SMSG_CHARACTER_UPGRADE_ABORTED = 0x380254, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x380253, - SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x380256, - SMSG_CHARACTER_UPGRADE_STARTED = 0x380252, - SMSG_CHAR_CUSTOMIZE_FAILURE = 0x38017B, - SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x38017C, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x38023F, - SMSG_CHAT = 0x3D0001, - SMSG_CHAT_AUTO_RESPONDED = 0x3D000E, - SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = 0x3D0022, - SMSG_CHAT_DOWN = 0x3D0014, - SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x3D0000, - SMSG_CHAT_IS_DOWN = 0x3D0015, - SMSG_CHAT_NOT_IN_GUILD = 0x3D0023, - SMSG_CHAT_NOT_IN_PARTY = 0x3D0006, - SMSG_CHAT_PLAYER_AMBIGUOUS = 0x3D0004, - SMSG_CHAT_PLAYER_NOTFOUND = 0x3D000D, - SMSG_CHAT_RECONNECT = 0x3D0016, - SMSG_CHAT_REGIONAL_SERVICE_STATUS = 0x3D001D, - SMSG_CHAT_RESTRICTED = 0x3D0007, - SMSG_CHAT_SERVER_MESSAGE = 0x3D001C, - SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x4E0002, - SMSG_CHECK_ABANDON_NPE = 0x4B0023, - SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0x38001B, - SMSG_CHECK_WARGAME_ENTRY = 0x380027, - SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x3802ED, - SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x3802D4, - SMSG_CLEAR_ALL_SPELL_CHARGES = 0x4E0016, - SMSG_CLEAR_BOSS_EMOTES = 0x380054, - SMSG_CLEAR_COOLDOWN = 0x380154, - SMSG_CLEAR_COOLDOWNS = 0x4E0015, - SMSG_CLEAR_RESURRECT = 0x380013, - SMSG_CLEAR_SPELL_CHARGES = 0x4E0017, - SMSG_CLEAR_TARGET = 0x3E0022, - SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x4C0022, - SMSG_CLOSE_ARTIFACT_FORGE = 0x380237, - SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x3802CC, - SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x3802CF, - SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x3802CD, - SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x3802CA, - SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x3802CE, - SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x3802CB, - SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x38030C, - SMSG_COIN_REMOVED = 0x3800AF, - SMSG_COMBAT_EVENT_FAILED = 0x3E0019, - SMSG_COMMENTATOR_MAP_INFO = 0x3801A0, - SMSG_COMMENTATOR_PLAYER_INFO = 0x3801A1, - SMSG_COMMENTATOR_STATE_CHANGED = 0x38019F, - SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x380264, - SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x380270, - SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x380266, - SMSG_COMMERCE_TOKEN_UPDATE = 0x380265, - SMSG_COMPLAINT_RESULT = 0x380146, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x380230, - SMSG_CONFIRM_PARTY_INVITE = 0x3802A7, - SMSG_CONNECT_TO = 0x3F0005, - SMSG_CONSOLE_WRITE = 0x3800CD, - SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x38026C, - SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x38026B, - SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x38026A, - SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x38026E, - SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x38026F, - SMSG_CONTACT_LIST = 0x38021E, - SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x3802AE, - SMSG_CONTROL_UPDATE = 0x3800DF, - SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x3802F6, - SMSG_COOLDOWN_CHEAT = 0x3801D1, - SMSG_COOLDOWN_EVENT = 0x380153, - SMSG_CORPSE_LOCATION = 0x3800E7, - SMSG_CORPSE_RECLAIM_DELAY = 0x3801E2, - SMSG_CORPSE_TRANSPORT_QUERY = 0x3801AC, - SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0x4C0024, - SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x380290, - SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x3802F7, - SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x38032D, - SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x380329, - SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x380325, - SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x380327, - SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x380323, - SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x380328, - SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x380324, - SMSG_CRAFTING_ORDER_NPC_REWARD_INFO = 0x38032F, - SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x38032B, - SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x380326, - SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x38032E, - SMSG_CRAFT_ENCHANT_RESULT = 0x38032C, - SMSG_CREATE_CHAR = 0x38019A, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x38022F, - SMSG_CREATOR_VISUALS_OVERRIDE = 0x380332, - SMSG_CRITERIA_DELETED = 0x380180, - SMSG_CRITERIA_UPDATE = 0x38017A, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x38015B, - SMSG_CURRENCY_TRANSFER_LOG = 0x380344, - SMSG_CURRENCY_TRANSFER_RESULT = 0x380343, - SMSG_CUSTOM_LOAD_SCREEN = 0x380064, - SMSG_DAILY_QUESTS_RESET = 0x4C0000, - SMSG_DAMAGE_CALC_LOG = 0x4E0054, - SMSG_DB_REPLY = 0x3C0000, - SMSG_DEATH_RELEASE_LOC = 0x38016D, - SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x3800EF, - SMSG_DEFENSE_MESSAGE = 0x3D000C, - SMSG_DELETE_CHAR = 0x38019B, - SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x420022, - SMSG_DELVES_ACCOUNT_DATA_ELEMENT_CHANGED = 0x380349, - SMSG_DESTROY_ARENA_UNIT = 0x3801DA, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x380192, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x380020, - SMSG_DISENCHANT_CREDIT = 0x38003F, - SMSG_DISMOUNT_RESULT = 0x380010, - SMSG_DISPEL_FAILED = 0x4E001E, - SMSG_DISPLAY_GAME_ERROR = 0x380035, - SMSG_DISPLAY_PLAYER_CHOICE = 0x4B0004, - SMSG_DISPLAY_PROMOTION = 0x3800E4, - SMSG_DISPLAY_QUEST_POPUP = 0x4C001E, - SMSG_DISPLAY_TOAST = 0x3800BC, - SMSG_DISPLAY_WORLD_TEXT = 0x380281, - SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x4E0053, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x380079, - SMSG_DROP_NEW_CONNECTION = 0x3F0004, - SMSG_DUEL_ARRANGED = 0x3E001B, - SMSG_DUEL_COMPLETE = 0x3E001F, - SMSG_DUEL_COUNTDOWN = 0x3E001E, - SMSG_DUEL_IN_BOUNDS = 0x3E001D, - SMSG_DUEL_OUT_OF_BOUNDS = 0x3E001C, - SMSG_DUEL_REQUESTED = 0x3E001A, - SMSG_DUEL_WINNER = 0x3E0020, - SMSG_DURABILITY_DAMAGE_DEATH = 0x3801DD, - SMSG_EMOTE = 0x38025C, - SMSG_ENABLE_BARBER_SHOP = 0x380156, - SMSG_ENCHANTMENT_LOG = 0x3801AD, - SMSG_ENCOUNTER_END = 0x380217, - SMSG_ENCOUNTER_START = 0x380216, - SMSG_END_LIGHTNING_STORM = 0x380143, - SMSG_ENTER_ENCRYPTED_MODE = 0x3F0001, - SMSG_ENUM_CHARACTERS_RESULT = 0x380018, - SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x380286, - SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x4E000E, - SMSG_EQUIPMENT_SET_ID = 0x38014C, - SMSG_EXPECTED_SPAM_RECORDS = 0x3D0005, - SMSG_EXPLORATION_EXPERIENCE = 0x3801F7, - SMSG_EXPORT_ACCOUNT_PROFILE = 0x3800EC, - SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x3802F4, - SMSG_FACTION_BONUS_INFO = 0x3801BD, - SMSG_FAILED_PLAYER_CONDITION = 0x4B0002, - SMSG_FAILED_QUEST_TURN_IN = 0x3802A4, - SMSG_FEATURE_SYSTEM_STATUS = 0x380058, - SMSG_FEATURE_SYSTEM_STATUS2 = 0x380341, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x380059, - SMSG_FEIGN_DEATH_RESISTED = 0x3801DC, - SMSG_FISH_ESCAPED = 0x38016A, - SMSG_FISH_NOT_HOOKED = 0x380169, - SMSG_FLIGHT_SPLINE_SYNC = 0x49005B, - SMSG_FLUSH_COMBAT_LOG_FILE = 0x4E0010, - SMSG_FORCED_DEATH_UPDATE = 0x38016E, - SMSG_FORCE_ANIM = 0x3801E9, - SMSG_FORCE_ANIMATIONS = 0x3801EA, - SMSG_FORCE_OBJECT_RELINK = 0x3800E3, - SMSG_FORCE_RANDOM_TRANSMOG_TOAST = 0x38004A, - SMSG_FORCE_SPAWN_TRACKING_UPDATE = 0x4C0021, - SMSG_FRIEND_STATUS = 0x38021F, - SMSG_GAIN_MAW_POWER = 0x380275, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x38005C, - SMSG_GAME_OBJECT_BASE = 0x3802BB, - SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x38030B, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x38005D, - SMSG_GAME_OBJECT_DESPAWN = 0x38005E, - SMSG_GAME_OBJECT_INTERACTION = 0x38030A, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x4E003C, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x4E003B, - SMSG_GAME_OBJECT_RESET_STATE = 0x3801B7, - SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x380297, - SMSG_GAME_SPEED_SET = 0x38011C, - SMSG_GAME_TIME_SET = 0x3801A6, - SMSG_GAME_TIME_UPDATE = 0x3801A5, - SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x420024, - SMSG_GARRISON_ADD_EVENT = 0x420048, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x420016, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x42001A, - SMSG_GARRISON_ADD_SPEC_GROUPS = 0x42004B, - SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0x42004F, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x42002C, - SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0x420051, - SMSG_GARRISON_BUILDING_ACTIVATED = 0x42000B, - SMSG_GARRISON_BUILDING_REMOVED = 0x420004, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x420006, - SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0x42001D, - SMSG_GARRISON_CLEAR_COLLECTION = 0x420047, - SMSG_GARRISON_CLEAR_EVENT_LIST = 0x42004A, - SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0x42004C, - SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x420046, - SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x420045, - SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x42003D, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x42001C, - SMSG_GARRISON_CREATE_RESULT = 0x42000C, - SMSG_GARRISON_DELETE_MISSION_RESULT = 0x420023, - SMSG_GARRISON_DELETE_RESULT = 0x420035, - SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = 0x42002B, - SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = 0x420029, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x420027, - SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = 0x420028, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x420026, - SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = 0x42002A, - SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0x420033, - SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0x420015, - SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0x42001E, - SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x42003F, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x420007, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x420005, - SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x420040, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x420019, - SMSG_GARRISON_MAP_DATA_RESPONSE = 0x420042, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x420020, - SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x420043, - SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0x420025, - SMSG_GARRISON_OPEN_CRAFTER = 0x420037, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x420030, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x420003, - SMSG_GARRISON_PLOT_PLACED = 0x420001, - SMSG_GARRISON_PLOT_REMOVED = 0x420002, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x420034, - SMSG_GARRISON_REMOTE_INFO = 0x42000A, - SMSG_GARRISON_REMOVE_EVENT = 0x420049, - SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0x42002F, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x42002D, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x420017, - SMSG_GARRISON_RENAME_FOLLOWER_RESULT = 0x42002E, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x420009, - SMSG_GARRISON_RESEARCH_TALENT_RESULT = 0x42000E, - SMSG_GARRISON_RESET_TALENT_TREE = 0x420013, - SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0x420014, - SMSG_GARRISON_START_MISSION_RESULT = 0x42001B, - SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x42003C, - SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x42004D, - SMSG_GARRISON_TALENT_COMPLETED = 0x42000F, - SMSG_GARRISON_TALENT_REMOVED = 0x420010, - SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0x420012, - SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0x420011, - SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0x42004E, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x420008, - SMSG_GARRISON_UPDATE_FOLLOWER = 0x420018, - SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x42003E, - SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0x420050, - SMSG_GARRISON_UPGRADE_RESULT = 0x42000D, - SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x42001F, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x38001C, - SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x3802AF, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3801F9, - SMSG_GET_GARRISON_INFO_RESULT = 0x420000, - SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x380232, - SMSG_GET_REALM_HIDDEN_RESULT = 0x380338, - SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x38026D, - SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x38025A, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x380231, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x38022D, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x380259, - SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x380282, - SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x380283, - SMSG_GM_PLAYER_INFO = 0x4B000D, - SMSG_GM_REQUEST_PLAYER_INFO = 0x4B0003, - SMSG_GM_TICKET_CASE_STATUS = 0x38013E, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x38013D, - SMSG_GOD_MODE = 0x380195, - SMSG_GOSSIP_COMPLETE = 0x4C0017, - SMSG_GOSSIP_MESSAGE = 0x4C0018, - SMSG_GOSSIP_OPTION_NPC_INTERACTION = 0x4C0028, - SMSG_GOSSIP_POI = 0x38022A, - SMSG_GOSSIP_QUEST_UPDATE = 0x4C0019, - SMSG_GOSSIP_REFRESH_OPTIONS = 0x4C0027, - SMSG_GROUP_ACTION_THROTTLED = 0x380024, - SMSG_GROUP_AUTO_KICK = 0x380227, - SMSG_GROUP_DECLINE = 0x380223, - SMSG_GROUP_DESTROYED = 0x380226, - SMSG_GROUP_NEW_LEADER = 0x3800C5, - SMSG_GROUP_REQUEST_DECLINE = 0x380224, - SMSG_GROUP_UNINVITE = 0x380225, - SMSG_GUILD_ACHIEVEMENT_DELETED = 0x44000D, - SMSG_GUILD_ACHIEVEMENT_EARNED = 0x44000C, - SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x44000F, - SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x440027, - SMSG_GUILD_BANK_QUERY_RESULTS = 0x440026, - SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x440028, - SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x44002B, - SMSG_GUILD_CHALLENGE_COMPLETED = 0x44001B, - SMSG_GUILD_CHALLENGE_UPDATE = 0x44001A, - SMSG_GUILD_CHANGE_NAME_RESULT = 0x440025, - SMSG_GUILD_COMMAND_RESULT = 0x440002, - SMSG_GUILD_CRITERIA_DELETED = 0x44000E, - SMSG_GUILD_CRITERIA_UPDATE = 0x44000B, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x440040, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x44003F, - SMSG_GUILD_EVENT_DISBANDED = 0x440035, - SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x44002A, - SMSG_GUILD_EVENT_MOTD = 0x440036, - SMSG_GUILD_EVENT_NEW_LEADER = 0x440034, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x440032, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x440033, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x440037, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x440039, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x44003A, - SMSG_GUILD_EVENT_STATUS_CHANGE = 0x440038, - SMSG_GUILD_EVENT_TAB_ADDED = 0x44003B, - SMSG_GUILD_EVENT_TAB_DELETED = 0x44003C, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x44003D, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x44003E, - SMSG_GUILD_FLAGGED_FOR_RENAME = 0x440024, - SMSG_GUILD_HARDCORE_MEMBER_DEATH = 0x440004, - SMSG_GUILD_INVITE = 0x440012, - SMSG_GUILD_INVITE_DECLINED = 0x440030, - SMSG_GUILD_INVITE_EXPIRED = 0x440031, - SMSG_GUILD_ITEM_LOOTED_NOTIFY = 0x44001C, - SMSG_GUILD_KNOWN_RECIPES = 0x440006, - SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x440007, - SMSG_GUILD_MEMBER_DAILY_RESET = 0x44002C, - SMSG_GUILD_MEMBER_RECIPES = 0x440005, - SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x440011, - SMSG_GUILD_MOVED = 0x440022, - SMSG_GUILD_MOVE_STARTING = 0x440021, - SMSG_GUILD_NAME_CHANGED = 0x440023, - SMSG_GUILD_NEWS = 0x440009, - SMSG_GUILD_NEWS_DELETED = 0x44000A, - SMSG_GUILD_PARTY_STATE = 0x440013, - SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x440029, - SMSG_GUILD_RANKS = 0x440010, - SMSG_GUILD_RENAME_NAME_CHECK = 0x440044, - SMSG_GUILD_RENAME_REFUND_RESULT = 0x440046, - SMSG_GUILD_RENAME_REQUESTED_RESULT = 0x440045, - SMSG_GUILD_RENAME_STATUS_UPDATE = 0x440043, - SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x440014, - SMSG_GUILD_RESET = 0x440020, - SMSG_GUILD_REWARD_LIST = 0x440008, - SMSG_GUILD_ROSTER = 0x440003, - SMSG_GUILD_SEND_RANK_CHANGE = 0x440001, - SMSG_HARDCORE_DEATH_ALERT = 0x380340, - SMSG_HEALTH_UPDATE = 0x38016B, - SMSG_HIGHEST_THREAT_UPDATE = 0x380173, - SMSG_HOTFIX_CONNECT = 0x3C0003, - SMSG_HOTFIX_MESSAGE = 0x3C0002, - SMSG_INITIALIZE_FACTIONS = 0x3801BC, - SMSG_INITIAL_SETUP = 0x380014, - SMSG_INIT_WORLD_STATES = 0x3801DE, - SMSG_INSPECT_RESULT = 0x3800C9, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x380245, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x380244, - SMSG_INSTANCE_ENCOUNTER_END = 0x38024D, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x380243, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x38024F, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x38024E, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x380248, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x380247, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x38024C, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x380250, - SMSG_INSTANCE_ENCOUNTER_START = 0x380249, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x380246, - SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x38024B, - SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x38024A, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x380193, - SMSG_INSTANCE_INFO = 0x3800CC, - SMSG_INSTANCE_RESET = 0x380121, - SMSG_INSTANCE_RESET_FAILED = 0x380122, - SMSG_INSTANCE_SAVE_CREATED = 0x380215, - SMSG_INTERRUPT_POWER_REGEN = 0x4E004A, - SMSG_INVALIDATE_PAGE_TEXT = 0x3C000A, - SMSG_INVALIDATE_PLAYER = 0x4B0007, - SMSG_INVALID_PROMOTION_CODE = 0x3801EB, - SMSG_INVENTORY_CHANGE_FAILURE = 0x4F0005, - SMSG_INVENTORY_FIXUP_COMPLETE = 0x3802A6, - SMSG_INVENTORY_FULL_OVERFLOW = 0x3802B7, - SMSG_ISLAND_AZERITE_GAIN = 0x3801F4, - SMSG_ISLAND_COMPLETE = 0x3801F5, - SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x4C0004, - SMSG_ITEM_CHANGED = 0x380184, - SMSG_ITEM_COOLDOWN = 0x38025B, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x3801ED, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x380034, - SMSG_ITEM_INTERACTION_COMPLETE = 0x3802EC, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x380032, - SMSG_ITEM_PUSH_RESULT = 0x3800BB, - SMSG_ITEM_TIME_UPDATE = 0x3801EC, - SMSG_KICK_REASON = 0x380124, - SMSG_LATENCY_REPORT_PING = 0x3802FC, - SMSG_LEARNED_SPELLS = 0x4E003E, - SMSG_LEARN_PVP_TALENT_FAILED = 0x38006D, - SMSG_LEARN_TALENT_FAILED = 0x38006C, - SMSG_LEGACY_LOOT_RULES = 0x3802BC, - SMSG_LEVEL_LINKING_RESULT = 0x3802D2, - SMSG_LEVEL_UP_INFO = 0x380182, - SMSG_LFG_BOOT_PLAYER = 0x460019, - SMSG_LFG_DISABLED = 0x460017, - SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x46001F, - SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x460009, - SMSG_LFG_JOIN_LOBBY_MATCHMAKER_QUEUE = 0x460020, - SMSG_LFG_JOIN_RESULT = 0x460000, - SMSG_LFG_LIST_APPLICANT_LIST_UPDATE = 0x46000F, - SMSG_LFG_LIST_APPLICATION_STATUS_UPDATE = 0x46000C, - SMSG_LFG_LIST_APPLY_TO_GROUP_RESULT = 0x46000D, - SMSG_LFG_LIST_JOIN_RESULT = 0x460001, - SMSG_LFG_LIST_SEARCH_RESULTS = 0x460002, - SMSG_LFG_LIST_SEARCH_RESULTS_UPDATE = 0x460010, - SMSG_LFG_LIST_SEARCH_STATUS = 0x460003, - SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x46000E, - SMSG_LFG_LIST_UPDATE_EXPIRATION = 0x46000B, - SMSG_LFG_LIST_UPDATE_STATUS = 0x46000A, - SMSG_LFG_OFFER_CONTINUE = 0x460018, - SMSG_LFG_PARTY_INFO = 0x46001A, - SMSG_LFG_PLAYER_INFO = 0x46001B, - SMSG_LFG_PLAYER_REWARD = 0x46001C, - SMSG_LFG_PROPOSAL_UPDATE = 0x460011, - SMSG_LFG_QUEUE_STATUS = 0x460004, - SMSG_LFG_READY_CHECK_RESULT = 0x46001E, - SMSG_LFG_READY_CHECK_UPDATE = 0x460006, - SMSG_LFG_ROLE_CHECK_UPDATE = 0x460005, - SMSG_LFG_SLOT_INVALID = 0x460014, - SMSG_LFG_TELEPORT_DENIED = 0x460016, - SMSG_LFG_UPDATE_STATUS = 0x460008, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x380207, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x380206, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3801FA, - SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x380208, - SMSG_LOAD_CUF_PROFILES = 0x380055, - SMSG_LOAD_EQUIPMENT_SET = 0x3801A8, - SMSG_LOBBY_MATCHMAKER_LOBBY_ACQUIRED_SERVER = 0x38030D, - SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x38030E, - SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED = 0x38030F, - SMSG_LOBBY_MATCHMAKER_QUEUE_PROPOSED = 0x380311, - SMSG_LOBBY_MATCHMAKER_QUEUE_RESULT = 0x380312, - SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE = 0x380310, - SMSG_LOGIN_SET_TIME_SPEED = 0x3801A7, - SMSG_LOGIN_VERIFY_WORLD = 0x38002F, - SMSG_LOGOUT_CANCEL_ACK = 0x380120, - SMSG_LOGOUT_COMPLETE = 0x38011F, - SMSG_LOGOUT_RESPONSE = 0x38011E, - SMSG_LOG_XP_GAIN = 0x38017E, - SMSG_LOOT_ALL_PASSED = 0x3800B9, - SMSG_LOOT_LIST = 0x3801D9, - SMSG_LOOT_MONEY_NOTIFY = 0x3800B4, - SMSG_LOOT_RELEASE = 0x3800B3, - SMSG_LOOT_RELEASE_ALL = 0x3800B2, - SMSG_LOOT_REMOVED = 0x3800AE, - SMSG_LOOT_RESPONSE = 0x3800AD, - SMSG_LOOT_ROLL = 0x3800B6, - SMSG_LOOT_ROLLS_COMPLETE = 0x3800B8, - SMSG_LOOT_ROLL_WON = 0x3800BA, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x38010A, - SMSG_MAIL_COMMAND_RESULT = 0x3800D3, - SMSG_MAIL_LIST_RESULT = 0x3801EE, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x3801EF, - SMSG_MAP_OBJECTIVES_INIT = 0x3E002A, - SMSG_MAP_OBJ_EVENTS = 0x38005F, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x3800B7, - SMSG_MEETING_STONE_FAILED = 0x380313, - SMSG_MESSAGE_BOX = 0x38000A, - SMSG_MINIMAP_PING = 0x380168, - SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x4E0004, - SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x4E0003, - SMSG_MISSILE_CANCEL = 0x380060, - SMSG_MODIFY_COOLDOWN = 0x3801FC, - SMSG_MOTD = 0x3D0003, - SMSG_MOUNT_RESULT = 0x38000F, - SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x3802C2, - SMSG_MOVE_ADD_IMPULSE = 0x490062, - SMSG_MOVE_APPLY_INERTIA = 0x49005E, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x490045, - SMSG_MOVE_DISABLE_COLLISION = 0x490041, - SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x49002B, - SMSG_MOVE_DISABLE_FULL_SPEED_TURNING = 0x490075, - SMSG_MOVE_DISABLE_GRAVITY = 0x49003D, - SMSG_MOVE_DISABLE_INERTIA = 0x49003F, - SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x49003C, - SMSG_MOVE_ENABLE_COLLISION = 0x490042, - SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x49002A, - SMSG_MOVE_ENABLE_FULL_SPEED_TURNING = 0x490074, - SMSG_MOVE_ENABLE_GRAVITY = 0x49003E, - SMSG_MOVE_ENABLE_INERTIA = 0x490040, - SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x49003B, - SMSG_MOVE_KNOCK_BACK = 0x490031, - SMSG_MOVE_REMOVE_INERTIA = 0x49005F, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x490046, - SMSG_MOVE_ROOT = 0x490027, - SMSG_MOVE_SET_ACTIVE_MOVER = 0x490003, - SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 0x49006B, - SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = 0x490066, - SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = 0x49006C, - SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 0x490069, - SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = 0x49006A, - SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 0x490072, - SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = 0x490068, - SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = 0x490067, - SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = 0x490071, - SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = 0x49006D, - SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0x49006E, - SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0x490070, - SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0x49006F, - SMSG_MOVE_SET_CANT_SWIM = 0x490035, - SMSG_MOVE_SET_CAN_ADV_FLY = 0x490064, - SMSG_MOVE_SET_CAN_DRIVE = 0x490076, - SMSG_MOVE_SET_CAN_FLY = 0x490033, - SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x490037, - SMSG_MOVE_SET_COLLISION_HEIGHT = 0x490043, - SMSG_MOVE_SET_COMPOUND_STATE = 0x490047, - SMSG_MOVE_SET_FEATHER_FALL = 0x49002D, - SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x490023, - SMSG_MOVE_SET_FLIGHT_SPEED = 0x490022, - SMSG_MOVE_SET_HOVERING = 0x49002F, - SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x490039, - SMSG_MOVE_SET_LAND_WALK = 0x49002C, - SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x490014, - SMSG_MOVE_SET_NORMAL_FALL = 0x49002E, - SMSG_MOVE_SET_PITCH_RATE = 0x490026, - SMSG_MOVE_SET_RUN_BACK_SPEED = 0x49001F, - SMSG_MOVE_SET_RUN_SPEED = 0x49001E, - SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x490021, - SMSG_MOVE_SET_SWIM_SPEED = 0x490020, - SMSG_MOVE_SET_TURN_RATE = 0x490025, - SMSG_MOVE_SET_VEHICLE_REC_ID = 0x490044, - SMSG_MOVE_SET_WALK_SPEED = 0x490024, - SMSG_MOVE_SET_WATER_WALK = 0x490029, - SMSG_MOVE_SKIP_TIME = 0x490048, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x49004D, - SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x49004B, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x49004E, - SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x49004C, - SMSG_MOVE_SPLINE_ROOT = 0x490049, - SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x49004F, - SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x49001A, - SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x490019, - SMSG_MOVE_SPLINE_SET_FLYING = 0x490059, - SMSG_MOVE_SPLINE_SET_HOVER = 0x490051, - SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x490054, - SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x490050, - SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x49001D, - SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x490016, - SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x490057, - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x490015, - SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x490018, - SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x490017, - SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x49001C, - SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x490058, - SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x49001B, - SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x490053, - SMSG_MOVE_SPLINE_START_SWIM = 0x490055, - SMSG_MOVE_SPLINE_STOP_SWIM = 0x490056, - SMSG_MOVE_SPLINE_UNROOT = 0x49004A, - SMSG_MOVE_SPLINE_UNSET_FLYING = 0x49005A, - SMSG_MOVE_SPLINE_UNSET_HOVER = 0x490052, - SMSG_MOVE_TELEPORT = 0x490032, - SMSG_MOVE_UNROOT = 0x490028, - SMSG_MOVE_UNSET_CANT_SWIM = 0x490036, - SMSG_MOVE_UNSET_CAN_ADV_FLY = 0x490065, - SMSG_MOVE_UNSET_CAN_DRIVE = 0x490077, - SMSG_MOVE_UNSET_CAN_FLY = 0x490034, - SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x490038, - SMSG_MOVE_UNSET_HOVERING = 0x490030, - SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x49003A, - SMSG_MOVE_UPDATE = 0x49000E, - SMSG_MOVE_UPDATE_ADD_IMPULSE = 0x490063, - SMSG_MOVE_UPDATE_APPLY_INERTIA = 0x490060, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x490012, - SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x49000D, - SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x49000A, - SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x490009, - SMSG_MOVE_UPDATE_KNOCK_BACK = 0x490010, - SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x490011, - SMSG_MOVE_UPDATE_PITCH_RATE = 0x49000C, - SMSG_MOVE_UPDATE_REMOVE_INERTIA = 0x490061, - SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x490013, - SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x490005, - SMSG_MOVE_UPDATE_RUN_SPEED = 0x490004, - SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x490008, - SMSG_MOVE_UPDATE_SWIM_SPEED = 0x490007, - SMSG_MOVE_UPDATE_TELEPORT = 0x49000F, - SMSG_MOVE_UPDATE_TURN_RATE = 0x49000B, - SMSG_MOVE_UPDATE_WALK_SPEED = 0x490006, - SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x380272, - SMSG_MULTI_FLOOR_NEW_FLOOR = 0x380271, - SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x3800A3, - SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x3800A5, - SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x3800AA, - SMSG_MYTHIC_PLUS_SEASON_DATA = 0x3800A4, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x380074, - SMSG_NEW_DATA_BUILD = 0x380337, - SMSG_NEW_TAXI_PATH = 0x380119, - SMSG_NEW_WORLD = 0x38002B, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x4E0034, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x380145, - SMSG_NOTIFY_MONEY = 0x380031, - SMSG_NOTIFY_RECEIVED_MAIL = 0x3800D4, - SMSG_NPC_INTERACTION_OPEN_RESULT = 0x380309, - SMSG_OFFER_PETITION_ERROR = 0x380150, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x38017F, - SMSG_ON_MONSTER_MOVE = 0x490002, - SMSG_OPEN_ARTIFACT_FORGE = 0x380236, - SMSG_OPEN_CONTAINER = 0x4F0006, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x460015, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x38022E, - SMSG_OVERRIDE_LIGHT = 0x380155, - SMSG_PAGE_TEXT = 0x3801B3, - SMSG_PARTY_COMMAND_RESULT = 0x380228, - SMSG_PARTY_ELIGIBILITY_FOR_DELVE_TIERS_RESPONSE = 0x38034C, - SMSG_PARTY_INVITE = 0x380056, - SMSG_PARTY_KILL_LOG = 0x3801F2, - SMSG_PARTY_MEMBER_FULL_STATE = 0x3801F1, - SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x3801F0, - SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x3802F2, - SMSG_PARTY_UPDATE = 0x38008C, - SMSG_PAST_TIME_EVENTS = 0x38005B, - SMSG_PAUSE_MIRROR_TIMER = 0x3801AA, - SMSG_PENDING_RAID_LOCK = 0x380191, - SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0x380306, - SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = 0x380302, - SMSG_PERKS_PROGRAM_DISABLED = 0x380307, - SMSG_PERKS_PROGRAM_RESULT = 0x380303, - SMSG_PERKS_PROGRAM_VENDOR_UPDATE = 0x380301, - SMSG_PETITION_ALREADY_SIGNED = 0x380037, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x440042, - SMSG_PETITION_SHOW_LIST = 0x380158, - SMSG_PETITION_SHOW_SIGNATURES = 0x380159, - SMSG_PETITION_SIGN_RESULTS = 0x3801E4, - SMSG_PET_ACTION_FEEDBACK = 0x3801E1, - SMSG_PET_ACTION_SOUND = 0x38013B, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x38009A, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x38010F, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x380093, - SMSG_PET_BATTLE_FINAL_ROUND = 0x380098, - SMSG_PET_BATTLE_FINISHED = 0x380099, - SMSG_PET_BATTLE_FIRST_ROUND = 0x380095, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x380094, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x38009B, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x380092, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x3800D1, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x3800D2, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x380097, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x380091, - SMSG_PET_BATTLE_ROUND_RESULT = 0x380096, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x380084, - SMSG_PET_CAST_FAILED = 0x4E0049, - SMSG_PET_CLEAR_SPELLS = 0x4E0013, - SMSG_PET_DISMISS_SOUND = 0x38013C, - SMSG_PET_GOD_MODE = 0x380116, - SMSG_PET_GUIDS = 0x38019D, - SMSG_PET_LEARNED_SPELLS = 0x4E0040, - SMSG_PET_MODE = 0x38001F, - SMSG_PET_NAME_INVALID = 0x38015D, - SMSG_PET_NEWLY_TAMED = 0x38001E, - SMSG_PET_SPELLS_MESSAGE = 0x4E0014, - SMSG_PET_STABLE_RESULT = 0x38002A, - SMSG_PET_TAME_FAILURE = 0x38014D, - SMSG_PET_UNLEARNED_SPELLS = 0x4E0041, - SMSG_PHASE_SHIFT_CHANGE = 0x38000C, - SMSG_PLAYED_TIME = 0x38016F, - SMSG_PLAYER_ACKOWLEDGE_ARROW_CALLOUT = 0x4B002D, - SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x4B001F, - SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x4B001E, - SMSG_PLAYER_BONUS_ROLL_FAILED = 0x4B0021, - SMSG_PLAYER_BOUND = 0x4B0000, - SMSG_PLAYER_CHOICE_CLEAR = 0x4B0006, - SMSG_PLAYER_CHOICE_DISPLAY_ERROR = 0x4B0005, - SMSG_PLAYER_CONDITION_RESULT = 0x4B0012, - SMSG_PLAYER_END_OF_MATCH_DETAILS = 0x4B002F, - SMSG_PLAYER_HIDE_ARROW_CALLOUT = 0x4B002C, - SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x4B0011, - SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x4B0016, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x440041, - SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = 0x4B002E, - SMSG_PLAYER_SHOW_ARROW_CALLOUT = 0x4B002B, - SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY = 0x4B0029, - SMSG_PLAYER_SHOW_PARTY_POSE_UI = 0x4B002A, - SMSG_PLAYER_SHOW_UI_EVENT_TOAST = 0x4B0024, - SMSG_PLAYER_SKINNED = 0x4B000E, - SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x4B0015, - SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x4B0014, - SMSG_PLAY_MUSIC = 0x380201, - SMSG_PLAY_OBJECT_SOUND = 0x380203, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x3801C9, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x4E0038, - SMSG_PLAY_SCENE = 0x3800CE, - SMSG_PLAY_SOUND = 0x380200, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x380204, - SMSG_PLAY_SPELL_VISUAL = 0x4E0036, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x4E003A, - SMSG_PLAY_TIME_WARNING = 0x380197, - SMSG_PONG = 0x3F0006, - SMSG_POWER_UPDATE = 0x38016C, - SMSG_PRELOAD_CHILD_MAP = 0x38000D, - SMSG_PRELOAD_WORLD = 0x38002C, - SMSG_PREPOPULATE_NAME_CACHE = 0x3802C5, - SMSG_PRE_RESSURECT = 0x3801FF, - SMSG_PRINT_NOTIFICATION = 0x380063, - SMSG_PROC_RESIST = 0x3801F3, - SMSG_PROFESSION_GOSSIP = 0x380292, - SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x4E0042, - SMSG_PVP_CREDIT = 0x3E0024, - SMSG_PVP_MATCH_COMPLETE = 0x3E002F, - SMSG_PVP_MATCH_INITIALIZE = 0x3E0030, - SMSG_PVP_MATCH_SET_STATE = 0x3E002E, - SMSG_PVP_MATCH_START = 0x3E002D, - SMSG_PVP_MATCH_STATISTICS = 0x3E0010, - SMSG_PVP_OPTIONS_ENABLED = 0x3E0013, - SMSG_PVP_TIER_RECORD = 0x3802FD, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x3C000C, - SMSG_QUERY_CREATURE_RESPONSE = 0x3C0006, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x3C0007, - SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x420041, - SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = 0x44002F, - SMSG_QUERY_GUILD_INFO_RESPONSE = 0x44002D, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x3C0010, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x3C0008, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x3C0009, - SMSG_QUERY_PETITION_RESPONSE = 0x3C000D, - SMSG_QUERY_PET_NAME_RESPONSE = 0x3C000B, - SMSG_QUERY_PLAYER_NAMES_RESPONSE = 0x4B0026, - SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x4B000A, - SMSG_QUERY_QUEST_INFO_RESPONSE = 0x4C0016, - SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0x44002E, - SMSG_QUERY_TIME_RESPONSE = 0x38017D, - SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x4C0001, - SMSG_QUEST_CONFIRM_ACCEPT = 0x4C000F, - SMSG_QUEST_FORCE_REMOVED = 0x4C001C, - SMSG_QUEST_GIVER_INVALID_QUEST = 0x4C0005, - SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x4C0014, - SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x4C0003, - SMSG_QUEST_GIVER_QUEST_DETAILS = 0x4C0012, - SMSG_QUEST_GIVER_QUEST_FAILED = 0x4C0006, - SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x4C001A, - SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x4C0013, - SMSG_QUEST_GIVER_STATUS = 0x4C001B, - SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x4C0011, - SMSG_QUEST_ITEM_USABILITY_RESPONSE = 0x4C0002, - SMSG_QUEST_LOG_FULL = 0x4C0007, - SMSG_QUEST_NON_LOG_UPDATE_COMPLETE = 0x4C0008, - SMSG_QUEST_POI_QUERY_RESPONSE = 0x4C001D, - SMSG_QUEST_POI_UPDATE_RESPONSE = 0x4C001F, - SMSG_QUEST_PUSH_RESULT = 0x4C0010, - SMSG_QUEST_SESSION_INFO_RESPONSE = 0x3802E8, - SMSG_QUEST_SESSION_READY_CHECK = 0x3802D6, - SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x3802D7, - SMSG_QUEST_SESSION_RESULT = 0x3802D5, - SMSG_QUEST_UPDATE_ADD_CREDIT = 0x4C000C, - SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x4C000D, - SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x4C000E, - SMSG_QUEST_UPDATE_COMPLETE = 0x4C0009, - SMSG_QUEST_UPDATE_FAILED = 0x4C000A, - SMSG_QUEST_UPDATE_FAILED_TIMER = 0x4C000B, - SMSG_QUEUE_SUMMARY_UPDATE = 0x3802A5, - SMSG_RAF_ACCOUNT_INFO = 0x3802D3, - SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x3802E4, - SMSG_RAF_DEBUG_FRIEND_MONTHS = 0x380334, - SMSG_RAID_DIFFICULTY_SET = 0x380240, - SMSG_RAID_GROUP_ONLY = 0x380242, - SMSG_RAID_INSTANCE_MESSAGE = 0x3D000A, - SMSG_RAID_MARKERS_CHANGED = 0x380038, - SMSG_RANDOM_ROLL = 0x3800C8, - SMSG_RATED_PVP_INFO = 0x3E000F, - SMSG_READY_CHECK_COMPLETED = 0x380090, - SMSG_READY_CHECK_RESPONSE = 0x38008F, - SMSG_READY_CHECK_STARTED = 0x38008E, - SMSG_READ_ITEM_RESULT_FAILED = 0x38023C, - SMSG_READ_ITEM_RESULT_OK = 0x380233, - SMSG_REALM_QUERY_RESPONSE = 0x3C0005, - SMSG_REATTACH_RESURRECT = 0x3801E3, - SMSG_RECEIVE_PING_UNIT = 0x380039, - SMSG_RECEIVE_PING_WORLD_POINT = 0x38003A, - SMSG_RECRAFT_ITEM_RESULT = 0x38032A, - SMSG_RECRUIT_A_FRIEND_FAILURE = 0x38015A, - SMSG_REFRESH_COMPONENT = 0x3800E9, - SMSG_REGIONWIDE_CHARACTER_MAIL_DATA = 0x38001A, - SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA = 0x380019, - SMSG_REMOVE_ITEM_PASSIVE = 0x380043, - SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x4E0043, - SMSG_REPLACE_TROPHY_RESPONSE = 0x380258, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x4B0009, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x380025, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x3E0014, - SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x3E0015, - SMSG_RESET_COMPRESSION_CONTEXT = 0x3F0007, - SMSG_RESET_FAILED_NOTIFY = 0x380151, - SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x380331, - SMSG_RESET_QUEST_POI = 0x4C0020, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x3E0023, - SMSG_RESET_WEEKLY_CURRENCY = 0x380009, - SMSG_RESPEC_WIPE_CONFIRM = 0x3800AB, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x380006, - SMSG_RESPONSE_PERK_PENDING_REWARDS = 0x380304, - SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0x380305, - SMSG_RESTART_GLOBAL_COOLDOWN = 0x4E0052, - SMSG_RESTRICTED_ACCOUNT_WARNING = 0x380052, - SMSG_RESUME_CAST = 0x4E002C, - SMSG_RESUME_CAST_BAR = 0x4E002F, - SMSG_RESUME_COMMS = 0x3F0003, - SMSG_RESUME_TOKEN = 0x380041, - SMSG_RESURRECT_REQUEST = 0x380012, - SMSG_RESYNC_RUNES = 0x4E0050, - SMSG_RETURNING_PLAYER_PROMPT = 0x38023B, - SMSG_RETURN_APPLICANT_LIST = 0x3802C9, - SMSG_RETURN_RECRUITING_CLUBS = 0x3802C8, - SMSG_ROLE_CHANGED_INFORM = 0x380021, - SMSG_ROLE_CHOSEN = 0x46001D, - SMSG_ROLE_POLL_INFORM = 0x380022, - SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x380291, - SMSG_RUNE_REGEN_DEBUG = 0x38004F, - SMSG_SCENARIO_COMPLETED = 0x38027F, - SMSG_SCENARIO_POIS = 0x3800CB, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x3800C4, - SMSG_SCENARIO_SHOW_CRITERIA = 0x380295, - SMSG_SCENARIO_STATE = 0x3800C3, - SMSG_SCENARIO_UI_UPDATE = 0x380294, - SMSG_SCENARIO_VACATE = 0x38023D, - SMSG_SCENE_OBJECT_EVENT = 0x38007A, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x38007F, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x380080, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x38007C, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x38007B, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x38007E, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x38007D, - SMSG_SCHEDULED_AREA_POI_UPDATE_RESPONSE = 0x4B0019, - SMSG_SCRIPT_CAST = 0x4E0047, - SMSG_SEASON_INFO = 0x38005A, - SMSG_SELL_RESPONSE = 0x38015E, - SMSG_SEND_ITEM_PASSIVES = 0x380044, - SMSG_SEND_KNOWN_SPELLS = 0x4E0019, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x3800C6, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x3800C7, - SMSG_SEND_SPELL_CHARGES = 0x4E001B, - SMSG_SEND_SPELL_HISTORY = 0x4E001A, - SMSG_SEND_UNLEARN_SPELLS = 0x4E001C, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x3800E6, - SMSG_SERVER_TIME = 0x38011D, - SMSG_SERVER_TIME_OFFSET = 0x3801AE, - SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = 0x4E000F, - SMSG_SETUP_CURRENCY = 0x380007, - SMSG_SET_AI_ANIM_KIT = 0x3801C8, - SMSG_SET_ANIM_TIER = 0x3801CC, - SMSG_SET_CHR_UPGRADE_TIER = 0x380077, - SMSG_SET_CURRENCY = 0x380008, - SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x460012, - SMSG_SET_DUNGEON_DIFFICULTY = 0x38013F, - SMSG_SET_FACTION_AT_WAR = 0x380199, - SMSG_SET_FACTION_NOT_VISIBLE = 0x3801C3, - SMSG_SET_FACTION_STANDING = 0x3801C4, - SMSG_SET_FACTION_VISIBLE = 0x3801C2, - SMSG_SET_FLAT_SPELL_MODIFIER = 0x4E0027, - SMSG_SET_ITEM_PURCHASE_DATA = 0x380033, - SMSG_SET_LOOT_METHOD_FAILED = 0x380263, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x380036, - SMSG_SET_MELEE_ANIM_KIT = 0x3801CB, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x3801CA, - SMSG_SET_PCT_SPELL_MODIFIER = 0x4E0028, - SMSG_SET_PET_SPECIALIZATION = 0x3800BD, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x4B000B, - SMSG_SET_PLAY_HOVER_ANIM = 0x380053, - SMSG_SET_PROFICIENCY = 0x3801CD, - SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x3802DC, - SMSG_SET_SHIPMENT_READY_RESPONSE = 0x42003A, - SMSG_SET_SPELL_CHARGES = 0x4E0018, - SMSG_SET_TIME_ZONE_INFORMATION = 0x380112, - SMSG_SET_VEHICLE_REC_ID = 0x380190, - SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x380308, - SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x42003B, - SMSG_SHOW_DELVES_COMPANION_CONFIGURATION_UI = 0x38034A, - SMSG_SHOW_DELVES_DISPLAY_UI = 0x380348, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x380073, - SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x4C0015, - SMSG_SHOW_TAXI_NODES = 0x380167, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x380209, - SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x380314, - SMSG_SOCKET_GEMS_FAILURE = 0x3801C0, - SMSG_SOCKET_GEMS_SUCCESS = 0x3801BF, - SMSG_SPECIAL_MOUNT_ANIM = 0x38013A, - SMSG_SPECTATE_END = 0x380336, - SMSG_SPECTATE_PLAYER = 0x380335, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x3801B2, - SMSG_SPELL_ABSORB_LOG = 0x4E000C, - SMSG_SPELL_CATEGORY_COOLDOWN = 0x4E0006, - SMSG_SPELL_CHANNEL_START = 0x4E0022, - SMSG_SPELL_CHANNEL_UPDATE = 0x4E0023, - SMSG_SPELL_COOLDOWN = 0x4E0005, - SMSG_SPELL_DAMAGE_SHIELD = 0x4E001F, - SMSG_SPELL_DELAYED = 0x4E0030, - SMSG_SPELL_DISPELL_LOG = 0x4E0007, - SMSG_SPELL_EMPOWER_SET_STAGE = 0x4E0026, - SMSG_SPELL_EMPOWER_START = 0x4E0024, - SMSG_SPELL_EMPOWER_UPDATE = 0x4E0025, - SMSG_SPELL_ENERGIZE_LOG = 0x4E0009, - SMSG_SPELL_EXECUTE_LOG = 0x4E0031, - SMSG_SPELL_FAILED_OTHER = 0x4E0046, - SMSG_SPELL_FAILURE = 0x4E0044, - SMSG_SPELL_FAILURE_MESSAGE = 0x4E004B, - SMSG_SPELL_GO = 0x4E002A, - SMSG_SPELL_HEAL_ABSORB_LOG = 0x4E000B, - SMSG_SPELL_HEAL_LOG = 0x4E000A, - SMSG_SPELL_INSTAKILL_LOG = 0x4E0021, - SMSG_SPELL_INTERRUPT_LOG = 0x4E000D, - SMSG_SPELL_MISS_LOG = 0x4E0032, - SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x4E0020, - SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x4E001D, - SMSG_SPELL_PERIODIC_AURA_LOG = 0x4E0008, - SMSG_SPELL_PREPARE = 0x4E0029, - SMSG_SPELL_START = 0x4E002B, - SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x380065, - SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x3802EE, - SMSG_STAND_STATE_UPDATE = 0x3801B6, - SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0x38006B, - SMSG_START_ELAPSED_TIMER = 0x38009C, - SMSG_START_ELAPSED_TIMERS = 0x38009E, - SMSG_START_LIGHTNING_STORM = 0x380142, - SMSG_START_LOOT_ROLL = 0x3800B5, - SMSG_START_MIRROR_TIMER = 0x3801A9, - SMSG_START_TIMER = 0x38003D, - SMSG_STOP_ELAPSED_TIMER = 0x38009D, - SMSG_STOP_MIRROR_TIMER = 0x3801AB, - SMSG_STOP_SPEAKERBOT_SOUND = 0x380205, - SMSG_STOP_TIMER = 0x38003E, - SMSG_STREAMING_MOVIES = 0x38003C, - SMSG_SUGGEST_INVITE_INFORM = 0x380229, - SMSG_SUMMON_CANCEL = 0x38014B, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x380023, - SMSG_SUMMON_REQUEST = 0x3801BA, - SMSG_SUPERCEDED_SPELLS = 0x4E003D, - SMSG_SUSPEND_COMMS = 0x3F0002, - SMSG_SUSPEND_TOKEN = 0x380040, - SMSG_SYNC_WOW_ENTITLEMENTS = 0x3802E6, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x3801B1, - SMSG_TAXI_NODE_STATUS = 0x380117, - SMSG_TEXT_EMOTE = 0x380115, - SMSG_THREAT_CLEAR = 0x380176, - SMSG_THREAT_REMOVE = 0x380175, - SMSG_THREAT_UPDATE = 0x380174, - SMSG_TIMERUNNING_SEASON_ENDED = 0x38034B, - SMSG_TIME_ADJUSTMENT = 0x490001, - SMSG_TIME_SYNC_REQUEST = 0x490000, - SMSG_TITLE_EARNED = 0x380171, - SMSG_TITLE_LOST = 0x380172, - SMSG_TOTEM_CREATED = 0x380161, - SMSG_TOTEM_DURATION_CHANGED = 0x380163, - SMSG_TOTEM_MOVED = 0x380164, - SMSG_TOTEM_REMOVED = 0x380162, - SMSG_TRADE_STATUS = 0x380017, - SMSG_TRADE_UPDATED = 0x380016, - SMSG_TRAINER_BUY_FAILED = 0x380179, - SMSG_TRAINER_LIST = 0x380178, - SMSG_TRAIT_CONFIG_COMMIT_FAILED = 0x38006A, - SMSG_TRANSFER_ABORTED = 0x38019C, - SMSG_TRANSFER_PENDING = 0x380066, - SMSG_TREASURE_PICKER_RESPONSE = 0x3C0011, - SMSG_TRIGGER_CINEMATIC = 0x38025D, - SMSG_TRIGGER_MOVIE = 0x380165, - SMSG_TURN_IN_PETITION_RESULT = 0x3801E6, - SMSG_TUTORIAL_FLAGS = 0x380251, - SMSG_UI_ACTION = 0x380202, - SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x4C0023, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x38025E, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x38025F, - SMSG_UNLEARNED_SPELLS = 0x4E003F, - SMSG_UNLOAD_CHILD_MAP = 0x38000E, - SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x3802FE, - SMSG_UPDATE_ACCOUNT_DATA = 0x3801A2, - SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x3801A3, - SMSG_UPDATE_ACTION_BUTTONS = 0x380078, - SMSG_UPDATE_BNET_SESSION_KEY = 0x3802B6, - SMSG_UPDATE_CAPTURE_POINT = 0x3E0007, - SMSG_UPDATE_CELESTIAL_BODY = 0x3802B2, - SMSG_UPDATE_CHARACTER_FLAGS = 0x380257, - SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x3801FE, - SMSG_UPDATE_COOLDOWN = 0x3801FD, - SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x420038, - SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x420021, - SMSG_UPDATE_EXPANSION_LEVEL = 0x3800DE, - SMSG_UPDATE_GAME_TIME_STATE = 0x3802B9, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x380144, - SMSG_UPDATE_LAST_INSTANCE = 0x380123, - SMSG_UPDATE_OBJECT = 0x480000, - SMSG_UPDATE_PRIMARY_SPEC = 0x380070, - SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x38008D, - SMSG_UPDATE_TALENT_DATA = 0x38006F, - SMSG_UPDATE_WORLD_STATE = 0x3801E0, - SMSG_USERLIST_ADD = 0x3D000F, - SMSG_USERLIST_REMOVE = 0x3D0010, - SMSG_USERLIST_UPDATE = 0x3D0011, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x3801E7, - SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x3802AD, - SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x3802AB, - SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x3802AA, - SMSG_VAS_PURCHASE_COMPLETE = 0x380285, - SMSG_VAS_PURCHASE_STATE_UPDATE = 0x380284, - SMSG_VENDOR_INVENTORY = 0x380051, - SMSG_VIGNETTE_UPDATE = 0x4B0010, - SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x3802B1, - SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE = 0x3802F9, - SMSG_VOICE_LOGIN_RESPONSE = 0x3802B0, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x4F0004, - SMSG_VOID_STORAGE_CONTENTS = 0x4F0001, - SMSG_VOID_STORAGE_FAILED = 0x4F0000, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x4F0002, - SMSG_VOID_TRANSFER_RESULT = 0x4F0003, - SMSG_WAIT_QUEUE_FINISH = 0x380003, - SMSG_WAIT_QUEUE_UPDATE = 0x380002, - SMSG_WARDEN3_DATA = 0x38000B, - SMSG_WARDEN3_DISABLED = 0x3802B4, - SMSG_WARDEN3_ENABLED = 0x3802B3, - SMSG_WARFRONT_COMPLETE = 0x3801F6, - SMSG_WARGAME_REQUEST_OPPONENT_RESPONSE = 0x3E0012, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x3E0011, - SMSG_WEATHER = 0x380141, - SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x3802F1, - SMSG_WEEKLY_REWARDS_RESULT = 0x3802EF, - SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x3802F0, - SMSG_WHO = 0x3D0002, - SMSG_WHO_IS = 0x380140, - SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x3802B8, - SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x4B0017, - SMSG_WORLD_SERVER_INFO = 0x380045, - SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x3802E7, - SMSG_WOW_LABS_AREA_INFO = 0x380319, - SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_END = 0x380315, - SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_STATE_CHANGED = 0x380316, - SMSG_WOW_LABS_PARTY_ERROR = 0x380322, - SMSG_WOW_LABS_SET_AREA_ID_RESULT = 0x380317, - SMSG_WOW_LABS_SET_PREDICTION_CIRCLE = 0x38031B, - SMSG_WOW_LABS_SET_SELECTED_AREA_ID = 0x380318, - SMSG_XP_AWARDED_FROM_CURRENCY = 0x380330, - SMSG_XP_GAIN_ABORTED = 0x380062, - SMSG_XP_GAIN_ENABLED = 0x380241, - SMSG_ZONE_UNDER_ATTACK = 0x3D000B, + SMSG_ABORT_NEW_WORLD = 0x360030, + SMSG_ACCOUNT_CHARACTER_CURRENCY_LISTS = 0x360346, + SMSG_ACCOUNT_CONVERSION_STATE_UPDATE = 0x36034B, + SMSG_ACCOUNT_COSMETIC_ADDED = 0x3602FF, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x3602E7, + SMSG_ACCOUNT_DATA_TIMES = 0x3601A8, + SMSG_ACCOUNT_EXPORT_RESPONSE = 0x360337, + SMSG_ACCOUNT_ITEM_COLLECTION_DATA = 0x360351, + SMSG_ACCOUNT_MOUNT_REMOVED = 0x360047, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x360046, + SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x3602FE, + SMSG_ACCOUNT_STORE_CURRENCY_UPDATE = 0x360320, + SMSG_ACCOUNT_STORE_FRONT_UPDATE = 0x360321, + SMSG_ACCOUNT_STORE_ITEM_STATE_CHANGED = 0x360322, + SMSG_ACCOUNT_STORE_RESULT = 0x360323, + SMSG_ACCOUNT_TOY_UPDATE = 0x360048, + SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x36004C, + SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x36004B, + SMSG_ACCOUNT_WARBAND_SCENE_UPDATE = 0x36004E, + SMSG_ACHIEVEMENT_DELETED = 0x360185, + SMSG_ACHIEVEMENT_EARNED = 0x3600E0, + SMSG_ACTIVATE_ESSENCE_FAILED = 0x4A0020, + SMSG_ACTIVATE_SOULBIND_FAILED = 0x4A0022, + SMSG_ACTIVATE_TAXI_REPLY = 0x36011C, + SMSG_ACTIVE_GLYPHS = 0x4D0045, + SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0x3601E3, + SMSG_ADDON_LIST_REQUEST = 0x3600DF, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x3600DA, + SMSG_ADD_ITEM_PASSIVE = 0x360042, + SMSG_ADD_LOSS_OF_CONTROL = 0x36010F, + SMSG_ADD_RUNE_POWER = 0x360156, + SMSG_ADJUST_SPLINE_DURATION = 0x360069, + SMSG_ADVANCED_COMBAT_LOG = 0x3602FC, + SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x3602F7, + SMSG_AE_LOOT_TARGETS = 0x3600B5, + SMSG_AE_LOOT_TARGET_ACK = 0x3600B6, + SMSG_AI_REACTION = 0x360153, + SMSG_ALLIED_RACE_DETAILS = 0x360291, + SMSG_ALL_ACCOUNT_CRITERIA = 0x360005, + SMSG_ALL_ACHIEVEMENT_DATA = 0x360004, + SMSG_ALL_GUILD_ACHIEVEMENTS = 0x420000, + SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x3602D4, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x36001D, + SMSG_AREA_POI_UPDATE_RESPONSE = 0x4A0018, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x3601DC, + SMSG_AREA_TRIGGER_DENIED = 0x370004, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x3601B4, + SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x370002, + SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = 0x370003, + SMSG_ARENA_CLEAR_OPPONENTS = 0x3600E6, + SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x3600CF, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x3600E5, + SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x36023E, + SMSG_ARTIFACT_FORGE_ERROR = 0x36023C, + SMSG_ARTIFACT_RESPEC_PROMPT = 0x36023D, + SMSG_ARTIFACT_XP_GAIN = 0x360284, + SMSG_ATTACKER_STATE_UPDATE = 0x3C002C, + SMSG_ATTACK_START = 0x3C0017, + SMSG_ATTACK_STOP = 0x3C0018, + SMSG_ATTACK_SWING_ERROR = 0x3C0026, + SMSG_ATTACK_SWING_LANDED_LOG = 0x3C0027, + SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x36026D, + SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x36026C, + SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x36026B, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x360190, + SMSG_AUCTION_COMMAND_RESULT = 0x36018D, + SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x360324, + SMSG_AUCTION_FAVORITE_LIST = 0x3602EE, + SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x3602E6, + SMSG_AUCTION_HELLO_RESPONSE = 0x36018B, + SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x3602E5, + SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x3602E1, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x3602E2, + SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x3602E4, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x36018F, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x360191, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x36018C, + SMSG_AUCTION_WON_NOTIFICATION = 0x36018E, + SMSG_AURA_POINTS_DEPLETED = 0x4D0012, + SMSG_AURA_UPDATE = 0x4D0011, + SMSG_AUTH_CHALLENGE = 0x3D0000, + SMSG_AUTH_FAILED = 0x360000, + SMSG_AUTH_RESPONSE = 0x360001, + SMSG_AVAILABLE_HOTFIXES = 0x3A0001, + SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0x360325, + SMSG_BAG_CLEANUP_FINISHED = 0x4E0007, + SMSG_BARBER_SHOP_RESULT = 0x36015B, + SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x3602C5, + SMSG_BATTLEFIELD_LIST = 0x3C0005, + SMSG_BATTLEFIELD_PORT_DENIED = 0x3C000B, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x3C0001, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x3C0004, + SMSG_BATTLEFIELD_STATUS_GROUP_PROPOSAL_FAILED = 0x3C000E, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x3C0000, + SMSG_BATTLEFIELD_STATUS_NONE = 0x3C0003, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x3C0002, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x3C000D, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x3C000C, + SMSG_BATTLEGROUND_INIT = 0x3C0029, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x3C0009, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x3C000A, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x3C0006, + SMSG_BATTLEGROUND_POINTS = 0x3C0028, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x360226, + SMSG_BATTLENET_CHALLENGE_START = 0x360225, + SMSG_BATTLENET_NOTIFICATION = 0x36029D, + SMSG_BATTLENET_RESPONSE = 0x36029C, + SMSG_BATTLE_NET_CONNECTION_STATUS = 0x36029E, + SMSG_BATTLE_PAY_ACK_FAILED = 0x360221, + SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x360216, + SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x360217, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x360220, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x360214, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x360213, + SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x360304, + SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x360211, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x360212, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x360210, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x36020E, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x36020F, + SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x360215, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x36021F, + SMSG_BATTLE_PAY_START_CHECKOUT = 0x3602B9, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x36021D, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x36021C, + SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x3602AD, + SMSG_BATTLE_PETS_HEALED = 0x36008B, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x360117, + SMSG_BATTLE_PET_DELETED = 0x360088, + SMSG_BATTLE_PET_ERROR = 0x3600D5, + SMSG_BATTLE_PET_JOURNAL = 0x360087, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x360085, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x360086, + SMSG_BATTLE_PET_RESTORED = 0x36008A, + SMSG_BATTLE_PET_REVOKED = 0x360089, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x360083, + SMSG_BATTLE_PET_UPDATES = 0x360082, + SMSG_BIND_POINT_UPDATE = 0x360011, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x3600C5, + SMSG_BLACK_MARKET_OUTBID = 0x3600C6, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x3600C4, + SMSG_BLACK_MARKET_WON = 0x3600C7, + SMSG_BONUS_ROLL_EMPTY = 0x3600E2, + SMSG_BOSS_KILL = 0x3C002B, + SMSG_BREAK_TARGET = 0x3C0016, + SMSG_BROADCAST_ACHIEVEMENT = 0x3B0012, + SMSG_BROADCAST_SUMMON_CAST = 0x3602C7, + SMSG_BROADCAST_SUMMON_RESPONSE = 0x3602C8, + SMSG_BUY_FAILED = 0x360164, + SMSG_BUY_SUCCEEDED = 0x360163, + SMSG_CACHE_INFO = 0x3A000F, + SMSG_CACHE_VERSION = 0x3A000E, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x36013C, + SMSG_CALENDAR_COMMAND_RESULT = 0x36013D, + SMSG_CALENDAR_COMMUNITY_INVITE = 0x36012C, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x360134, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x360135, + SMSG_CALENDAR_INVITE_ADDED = 0x36012D, + SMSG_CALENDAR_INVITE_ALERT = 0x360131, + SMSG_CALENDAR_INVITE_NOTES = 0x360136, + SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x360137, + SMSG_CALENDAR_INVITE_REMOVED = 0x36012E, + SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x360133, + SMSG_CALENDAR_INVITE_STATUS = 0x36012F, + SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x360132, + SMSG_CALENDAR_MODERATOR_STATUS = 0x360130, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x360138, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x360139, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x36013A, + SMSG_CALENDAR_SEND_CALENDAR = 0x36012A, + SMSG_CALENDAR_SEND_EVENT = 0x36012B, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x36013B, + SMSG_CAMERA_EFFECT = 0x3601C2, + SMSG_CANCEL_AUTO_REPEAT = 0x36017B, + SMSG_CANCEL_COMBAT = 0x3C0025, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x4D0037, + SMSG_CANCEL_PING_PIN = 0x36003B, + SMSG_CANCEL_PRELOAD_WORLD = 0x36002E, + SMSG_CANCEL_SCENE = 0x3600D4, + SMSG_CANCEL_SPELL_VISUAL = 0x4D0035, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x4D0039, + SMSG_CAN_DUEL_RESULT = 0x3C0021, + SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x3602AC, + SMSG_CAPTURE_POINT_REMOVED = 0x3C0008, + SMSG_CAST_FAILED = 0x4D0048, + SMSG_CAS_REFRESH_REMOTE_DATA = 0x360115, + SMSG_CAUTIONARY_CHANNEL_MESSAGE = 0x3B0009, + SMSG_CAUTIONARY_CHAT_MESSAGE = 0x3B0008, + SMSG_CHAIN_MISSILE_BOUNCE = 0x360061, + SMSG_CHALLENGE_MODE_COMPLETE = 0x3600A6, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x3600A7, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x3600AD, + SMSG_CHALLENGE_MODE_RESET = 0x3600A5, + SMSG_CHALLENGE_MODE_SET_LEAVER_PENALTY_TIMER = 0x4A0030, + SMSG_CHALLENGE_MODE_START = 0x3600A3, + SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x3600A4, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x4A000C, + SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x36029F, + SMSG_CHANNEL_LIST = 0x3B001B, + SMSG_CHANNEL_NOTIFY = 0x3B0017, + SMSG_CHANNEL_NOTIFY_JOINED = 0x3B0019, + SMSG_CHANNEL_NOTIFY_LEFT = 0x3B001A, + SMSG_CHANNEL_NOTIFY_NPE_JOINED_BATCH = 0x3B0018, + SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x360259, + SMSG_CHARACTER_LOGIN_FAILED = 0x3601A2, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x360224, + SMSG_CHARACTER_RENAME_RESULT = 0x3601FF, + SMSG_CHARACTER_UPGRADE_ABORTED = 0x360258, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x360257, + SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x36025A, + SMSG_CHARACTER_UPGRADE_STARTED = 0x360256, + SMSG_CHAR_CUSTOMIZE_FAILURE = 0x36017F, + SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x360180, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x360243, + SMSG_CHAT = 0x3B0001, + SMSG_CHAT_AUTO_RESPONDED = 0x3B000E, + SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = 0x3B0022, + SMSG_CHAT_DOWN = 0x3B0014, + SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x3B0000, + SMSG_CHAT_IS_DOWN = 0x3B0015, + SMSG_CHAT_NOT_IN_GUILD = 0x3B0023, + SMSG_CHAT_NOT_IN_PARTY = 0x3B0006, + SMSG_CHAT_PLAYER_AMBIGUOUS = 0x3B0004, + SMSG_CHAT_PLAYER_NOTFOUND = 0x3B000D, + SMSG_CHAT_RECONNECT = 0x3B0016, + SMSG_CHAT_REGIONAL_SERVICE_STATUS = 0x3B001D, + SMSG_CHAT_RESTRICTED = 0x3B0007, + SMSG_CHAT_SERVER_MESSAGE = 0x3B001C, + SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x4D0002, + SMSG_CHECK_ABANDON_NPE = 0x4A0023, + SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0x36001B, + SMSG_CHECK_WARGAME_ENTRY = 0x360027, + SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x3602F1, + SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x3602D8, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x4D0016, + SMSG_CLEAR_BOSS_EMOTES = 0x360054, + SMSG_CLEAR_COOLDOWN = 0x360158, + SMSG_CLEAR_COOLDOWNS = 0x4D0015, + SMSG_CLEAR_RESURRECT = 0x360013, + SMSG_CLEAR_SPELL_CHARGES = 0x4D0017, + SMSG_CLEAR_TARGET = 0x3C0022, + SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x4B0022, + SMSG_CLOSE_ARTIFACT_FORGE = 0x36023B, + SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x3602D0, + SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x3602D3, + SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x3602D1, + SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x3602CE, + SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x3602D2, + SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x3602CF, + SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x360310, + SMSG_COIN_REMOVED = 0x3600B4, + SMSG_COMBAT_EVENT_FAILED = 0x3C0019, + SMSG_COMMENTATOR_MAP_INFO = 0x3601A4, + SMSG_COMMENTATOR_PLAYER_INFO = 0x3601A5, + SMSG_COMMENTATOR_STATE_CHANGED = 0x3601A3, + SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x360268, + SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x360274, + SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x36026A, + SMSG_COMMERCE_TOKEN_UPDATE = 0x360269, + SMSG_COMPLAINT_RESULT = 0x36014A, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x360234, + SMSG_CONFIRM_PARTY_INVITE = 0x3602AB, + SMSG_CONNECT_TO = 0x3D0005, + SMSG_CONSOLE_WRITE = 0x3600D2, + SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x360270, + SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x36026F, + SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x36026E, + SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x360272, + SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x360273, + SMSG_CONTACT_LIST = 0x360222, + SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x3602B2, + SMSG_CONTROL_UPDATE = 0x3600E4, + SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x3602FA, + SMSG_COOLDOWN_CHEAT = 0x3601D5, + SMSG_COOLDOWN_EVENT = 0x360157, + SMSG_CORPSE_LOCATION = 0x3600EB, + SMSG_CORPSE_RECLAIM_DELAY = 0x3601E6, + SMSG_CORPSE_TRANSPORT_QUERY = 0x3601B0, + SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0x4B0024, + SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x360294, + SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x3602FB, + SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x360331, + SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x36032D, + SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x360329, + SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x36032B, + SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x360327, + SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x36032C, + SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x360328, + SMSG_CRAFTING_ORDER_NPC_REWARD_INFO = 0x360333, + SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x36032F, + SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x36032A, + SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x360332, + SMSG_CRAFT_ENCHANT_RESULT = 0x360330, + SMSG_CREATE_CHAR = 0x36019E, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x360233, + SMSG_CREATOR_VISUALS_OVERRIDE = 0x360336, + SMSG_CRITERIA_DELETED = 0x360184, + SMSG_CRITERIA_UPDATE = 0x36017E, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x36015F, + SMSG_CURRENCY_TRANSFER_LOG = 0x360348, + SMSG_CURRENCY_TRANSFER_RESULT = 0x360347, + SMSG_CUSTOM_LOAD_SCREEN = 0x360064, + SMSG_DAILY_QUESTS_RESET = 0x4B0000, + SMSG_DAMAGE_CALC_LOG = 0x4D0054, + SMSG_DB_REPLY = 0x3A0000, + SMSG_DEATH_RELEASE_LOC = 0x360171, + SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x3600F3, + SMSG_DEFENSE_MESSAGE = 0x3B000C, + SMSG_DELETE_CHAR = 0x36019F, + SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x400022, + SMSG_DELVES_ACCOUNT_DATA_ELEMENT_CHANGED = 0x36034D, + SMSG_DESTROY_ARENA_UNIT = 0x3601DE, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x360196, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x360020, + SMSG_DISENCHANT_CREDIT = 0x36003F, + SMSG_DISMOUNT_RESULT = 0x360010, + SMSG_DISPEL_FAILED = 0x4D001E, + SMSG_DISPLAY_GAME_ERROR = 0x360035, + SMSG_DISPLAY_PLAYER_CHOICE = 0x4A0004, + SMSG_DISPLAY_PROMOTION = 0x3600E8, + SMSG_DISPLAY_QUEST_POPUP = 0x4B001E, + SMSG_DISPLAY_TOAST = 0x3600C1, + SMSG_DISPLAY_WORLD_TEXT = 0x360285, + SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0x4D0053, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x360079, + SMSG_DROP_NEW_CONNECTION = 0x3D0004, + SMSG_DUEL_ARRANGED = 0x3C001B, + SMSG_DUEL_COMPLETE = 0x3C001F, + SMSG_DUEL_COUNTDOWN = 0x3C001E, + SMSG_DUEL_IN_BOUNDS = 0x3C001D, + SMSG_DUEL_OUT_OF_BOUNDS = 0x3C001C, + SMSG_DUEL_REQUESTED = 0x3C001A, + SMSG_DUEL_WINNER = 0x3C0020, + SMSG_DURABILITY_DAMAGE_DEATH = 0x3601E1, + SMSG_EMOTE = 0x360260, + SMSG_ENABLE_BARBER_SHOP = 0x36015A, + SMSG_ENCHANTMENT_LOG = 0x3601B1, + SMSG_ENCOUNTER_END = 0x36021B, + SMSG_ENCOUNTER_START = 0x36021A, + SMSG_END_LIGHTNING_STORM = 0x360147, + SMSG_ENTER_ENCRYPTED_MODE = 0x3D0001, + SMSG_ENUM_CHARACTERS_RESULT = 0x360018, + SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x36028A, + SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x4D000E, + SMSG_EQUIPMENT_SET_ID = 0x360150, + SMSG_EXPECTED_SPAM_RECORDS = 0x3B0005, + SMSG_EXPLORATION_EXPERIENCE = 0x3601FB, + SMSG_EXPORT_ACCOUNT_PROFILE = 0x3600F0, + SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x3602F8, + SMSG_FACTION_BONUS_INFO = 0x3601C1, + SMSG_FAILED_PLAYER_CONDITION = 0x4A0002, + SMSG_FAILED_QUEST_TURN_IN = 0x3602A8, + SMSG_FEATURE_SYSTEM_STATUS = 0x360058, + SMSG_FEATURE_SYSTEM_STATUS2 = 0x360345, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x360059, + SMSG_FEIGN_DEATH_RESISTED = 0x3601E0, + SMSG_FISH_ESCAPED = 0x36016E, + SMSG_FISH_NOT_HOOKED = 0x36016D, + SMSG_FLIGHT_SPLINE_SYNC = 0x48005B, + SMSG_FLUSH_COMBAT_LOG_FILE = 0x4D0010, + SMSG_FORCED_DEATH_UPDATE = 0x360172, + SMSG_FORCE_ANIM = 0x3601ED, + SMSG_FORCE_ANIMATIONS = 0x3601EE, + SMSG_FORCE_RANDOM_TRANSMOG_TOAST = 0x36004A, + SMSG_FORCE_SPAWN_TRACKING_UPDATE = 0x4B0021, + SMSG_FRIEND_STATUS = 0x360223, + SMSG_GAIN_MAW_POWER = 0x360279, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x36005C, + SMSG_GAME_OBJECT_BASE = 0x3602BF, + SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x36030F, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x36005D, + SMSG_GAME_OBJECT_DESPAWN = 0x36005E, + SMSG_GAME_OBJECT_INTERACTION = 0x36030E, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x4D003C, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x4D003B, + SMSG_GAME_OBJECT_RESET_STATE = 0x3601BB, + SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x36029B, + SMSG_GAME_SPEED_SET = 0x360120, + SMSG_GAME_TIME_SET = 0x3601AA, + SMSG_GAME_TIME_UPDATE = 0x3601A9, + SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x400024, + SMSG_GARRISON_ADD_EVENT = 0x400048, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x400016, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x40001A, + SMSG_GARRISON_ADD_SPEC_GROUPS = 0x40004B, + SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0x40004F, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x40002C, + SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0x400051, + SMSG_GARRISON_BUILDING_ACTIVATED = 0x40000B, + SMSG_GARRISON_BUILDING_REMOVED = 0x400004, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x400006, + SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0x40001D, + SMSG_GARRISON_CLEAR_COLLECTION = 0x400047, + SMSG_GARRISON_CLEAR_EVENT_LIST = 0x40004A, + SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0x40004C, + SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x400046, + SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x400045, + SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x40003D, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x40001C, + SMSG_GARRISON_CREATE_RESULT = 0x40000C, + SMSG_GARRISON_DELETE_MISSION_RESULT = 0x400023, + SMSG_GARRISON_DELETE_RESULT = 0x400035, + SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = 0x40002B, + SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = 0x400029, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x400027, + SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = 0x400028, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x400026, + SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = 0x40002A, + SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0x400033, + SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0x400015, + SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0x40001E, + SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x40003F, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x400007, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x400005, + SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x400040, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x400019, + SMSG_GARRISON_MAP_DATA_RESPONSE = 0x400042, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x400020, + SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x400043, + SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0x400025, + SMSG_GARRISON_OPEN_CRAFTER = 0x400037, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x400030, + SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x400003, + SMSG_GARRISON_PLOT_PLACED = 0x400001, + SMSG_GARRISON_PLOT_REMOVED = 0x400002, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x400034, + SMSG_GARRISON_REMOTE_INFO = 0x40000A, + SMSG_GARRISON_REMOVE_EVENT = 0x400049, + SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0x40002F, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x40002D, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x400017, + SMSG_GARRISON_RENAME_FOLLOWER_RESULT = 0x40002E, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x400009, + SMSG_GARRISON_RESEARCH_TALENT_RESULT = 0x40000E, + SMSG_GARRISON_RESET_TALENT_TREE = 0x400013, + SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0x400014, + SMSG_GARRISON_START_MISSION_RESULT = 0x40001B, + SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x40003C, + SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x40004D, + SMSG_GARRISON_TALENT_COMPLETED = 0x40000F, + SMSG_GARRISON_TALENT_REMOVED = 0x400010, + SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0x400012, + SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0x400011, + SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0x40004E, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x400008, + SMSG_GARRISON_UPDATE_FOLLOWER = 0x400018, + SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x40003E, + SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0x400050, + SMSG_GARRISON_UPGRADE_RESULT = 0x40000D, + SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x40001F, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x36001C, + SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x3602B3, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3601FD, + SMSG_GET_GARRISON_INFO_RESULT = 0x400000, + SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x360236, + SMSG_GET_REALM_HIDDEN_RESULT = 0x36033C, + SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x360271, + SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x36025E, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x360235, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x360231, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x36025D, + SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x360286, + SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x360287, + SMSG_GM_PLAYER_INFO = 0x4A000D, + SMSG_GM_REQUEST_PLAYER_INFO = 0x4A0003, + SMSG_GM_TICKET_CASE_STATUS = 0x360142, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x360141, + SMSG_GOD_MODE = 0x360199, + SMSG_GOSSIP_COMPLETE = 0x4B0017, + SMSG_GOSSIP_MESSAGE = 0x4B0018, + SMSG_GOSSIP_OPTION_NPC_INTERACTION = 0x4B0028, + SMSG_GOSSIP_POI = 0x36022E, + SMSG_GOSSIP_QUEST_UPDATE = 0x4B0019, + SMSG_GOSSIP_REFRESH_OPTIONS = 0x4B0027, + SMSG_GROUP_ACTION_THROTTLED = 0x360024, + SMSG_GROUP_AUTO_KICK = 0x36022B, + SMSG_GROUP_DECLINE = 0x360227, + SMSG_GROUP_DESTROYED = 0x36022A, + SMSG_GROUP_NEW_LEADER = 0x3600CA, + SMSG_GROUP_REQUEST_DECLINE = 0x360228, + SMSG_GROUP_UNINVITE = 0x360229, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x42000D, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x42000C, + SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x42000F, + SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x420027, + SMSG_GUILD_BANK_QUERY_RESULTS = 0x420026, + SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x420028, + SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x42002B, + SMSG_GUILD_CHALLENGE_COMPLETED = 0x42001B, + SMSG_GUILD_CHALLENGE_UPDATE = 0x42001A, + SMSG_GUILD_CHANGE_NAME_RESULT = 0x420025, + SMSG_GUILD_COMMAND_RESULT = 0x420002, + SMSG_GUILD_CRITERIA_DELETED = 0x42000E, + SMSG_GUILD_CRITERIA_UPDATE = 0x42000B, + SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x420040, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x42003F, + SMSG_GUILD_EVENT_DISBANDED = 0x420035, + SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x42002A, + SMSG_GUILD_EVENT_MOTD = 0x420036, + SMSG_GUILD_EVENT_NEW_LEADER = 0x420034, + SMSG_GUILD_EVENT_PLAYER_JOINED = 0x420032, + SMSG_GUILD_EVENT_PLAYER_LEFT = 0x420033, + SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x420037, + SMSG_GUILD_EVENT_RANKS_UPDATED = 0x420039, + SMSG_GUILD_EVENT_RANK_CHANGED = 0x42003A, + SMSG_GUILD_EVENT_STATUS_CHANGE = 0x420038, + SMSG_GUILD_EVENT_TAB_ADDED = 0x42003B, + SMSG_GUILD_EVENT_TAB_DELETED = 0x42003C, + SMSG_GUILD_EVENT_TAB_MODIFIED = 0x42003D, + SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x42003E, + SMSG_GUILD_FLAGGED_FOR_RENAME = 0x420024, + SMSG_GUILD_HARDCORE_MEMBER_DEATH = 0x420004, + SMSG_GUILD_INVITE = 0x420012, + SMSG_GUILD_INVITE_DECLINED = 0x420030, + SMSG_GUILD_INVITE_EXPIRED = 0x420031, + SMSG_GUILD_ITEM_LOOTED_NOTIFY = 0x42001C, + SMSG_GUILD_KNOWN_RECIPES = 0x420006, + SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x420007, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x42002C, + SMSG_GUILD_MEMBER_RECIPES = 0x420005, + SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x420011, + SMSG_GUILD_MOVED = 0x420022, + SMSG_GUILD_MOVE_STARTING = 0x420021, + SMSG_GUILD_NAME_CHANGED = 0x420023, + SMSG_GUILD_NEWS = 0x420009, + SMSG_GUILD_NEWS_DELETED = 0x42000A, + SMSG_GUILD_PARTY_STATE = 0x420013, + SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x420029, + SMSG_GUILD_RANKS = 0x420010, + SMSG_GUILD_RENAME_NAME_CHECK = 0x420044, + SMSG_GUILD_RENAME_REFUND_RESULT = 0x420046, + SMSG_GUILD_RENAME_REQUESTED_RESULT = 0x420045, + SMSG_GUILD_RENAME_STATUS_UPDATE = 0x420043, + SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x420014, + SMSG_GUILD_RESET = 0x420020, + SMSG_GUILD_REWARD_LIST = 0x420008, + SMSG_GUILD_ROSTER = 0x420003, + SMSG_GUILD_SEND_RANK_CHANGE = 0x420001, + SMSG_HARDCORE_DEATH_ALERT = 0x360344, + SMSG_HEALTH_UPDATE = 0x36016F, + SMSG_HIGHEST_THREAT_UPDATE = 0x360177, + SMSG_HOTFIX_CONNECT = 0x3A0003, + SMSG_HOTFIX_MESSAGE = 0x3A0002, + SMSG_INITIALIZE_FACTIONS = 0x3601C0, + SMSG_INITIAL_SETUP = 0x360014, + SMSG_INIT_WORLD_STATES = 0x3601E2, + SMSG_INSPECT_RESULT = 0x3600CE, + SMSG_INSTANCE_ABANDON_VOTE_COMPLETED = 0x360093, + SMSG_INSTANCE_ABANDON_VOTE_PLAYER_LEFT = 0x360094, + SMSG_INSTANCE_ABANDON_VOTE_RESPONSE = 0x360092, + SMSG_INSTANCE_ABANDON_VOTE_STARTED = 0x360091, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x360249, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x360248, + SMSG_INSTANCE_ENCOUNTER_END = 0x360251, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x360247, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x360253, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x360252, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x36024C, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x36024B, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x360250, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x360254, + SMSG_INSTANCE_ENCOUNTER_START = 0x36024D, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x36024A, + SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x36024F, + SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x36024E, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x360197, + SMSG_INSTANCE_INFO = 0x3600D1, + SMSG_INSTANCE_RESET = 0x360125, + SMSG_INSTANCE_RESET_FAILED = 0x360126, + SMSG_INSTANCE_SAVE_CREATED = 0x360219, + SMSG_INTERRUPT_POWER_REGEN = 0x4D004A, + SMSG_INVALIDATE_PAGE_TEXT = 0x3A000A, + SMSG_INVALIDATE_PLAYER = 0x4A0007, + SMSG_INVALID_PROMOTION_CODE = 0x3601EF, + SMSG_INVENTORY_CHANGE_FAILURE = 0x4E0005, + SMSG_INVENTORY_FIXUP_COMPLETE = 0x3602AA, + SMSG_INVENTORY_FULL_OVERFLOW = 0x3602BB, + SMSG_ISLAND_AZERITE_GAIN = 0x3601F8, + SMSG_ISLAND_COMPLETE = 0x3601F9, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x4B0004, + SMSG_ITEM_CHANGED = 0x360188, + SMSG_ITEM_COOLDOWN = 0x36025F, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x3601F1, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x360034, + SMSG_ITEM_INTERACTION_COMPLETE = 0x3602F0, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x360032, + SMSG_ITEM_PUSH_RESULT = 0x3600C0, + SMSG_ITEM_TIME_UPDATE = 0x3601F0, + SMSG_KICK_REASON = 0x360128, + SMSG_LATENCY_REPORT_PING = 0x360300, + SMSG_LEARNED_SPELLS = 0x4D003E, + SMSG_LEARN_PVP_TALENT_FAILED = 0x36006D, + SMSG_LEARN_TALENT_FAILED = 0x36006C, + SMSG_LEGACY_LOOT_RULES = 0x3602C0, + SMSG_LEVEL_LINKING_RESULT = 0x3602D6, + SMSG_LEVEL_UP_INFO = 0x360186, + SMSG_LFG_BOOT_PLAYER = 0x440019, + SMSG_LFG_DISABLED = 0x440017, + SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x44001F, + SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x440009, + SMSG_LFG_JOIN_LOBBY_MATCHMAKER_QUEUE = 0x440020, + SMSG_LFG_JOIN_RESULT = 0x440000, + SMSG_LFG_LIST_APPLICANT_LIST_UPDATE = 0x44000F, + SMSG_LFG_LIST_APPLICATION_STATUS_UPDATE = 0x44000C, + SMSG_LFG_LIST_APPLY_TO_GROUP_RESULT = 0x44000D, + SMSG_LFG_LIST_JOIN_RESULT = 0x440001, + SMSG_LFG_LIST_SEARCH_RESULTS = 0x440002, + SMSG_LFG_LIST_SEARCH_RESULTS_UPDATE = 0x440010, + SMSG_LFG_LIST_SEARCH_STATUS = 0x440003, + SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x44000E, + SMSG_LFG_LIST_UPDATE_EXPIRATION = 0x44000B, + SMSG_LFG_LIST_UPDATE_STATUS = 0x44000A, + SMSG_LFG_OFFER_CONTINUE = 0x440018, + SMSG_LFG_PARTY_INFO = 0x44001A, + SMSG_LFG_PLAYER_INFO = 0x44001B, + SMSG_LFG_PLAYER_REWARD = 0x44001C, + SMSG_LFG_PROPOSAL_UPDATE = 0x440011, + SMSG_LFG_QUEUE_STATUS = 0x440004, + SMSG_LFG_READY_CHECK_RESULT = 0x44001E, + SMSG_LFG_READY_CHECK_UPDATE = 0x440006, + SMSG_LFG_ROLE_CHECK_UPDATE = 0x440005, + SMSG_LFG_SLOT_INVALID = 0x440014, + SMSG_LFG_TELEPORT_DENIED = 0x440016, + SMSG_LFG_UPDATE_STATUS = 0x440008, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x36020B, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x36020A, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x3601FE, + SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x36020C, + SMSG_LOAD_CUF_PROFILES = 0x360055, + SMSG_LOAD_EQUIPMENT_SET = 0x3601AC, + SMSG_LOBBY_MATCHMAKER_LOBBY_ACQUIRED_SERVER = 0x360311, + SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x360312, + SMSG_LOBBY_MATCHMAKER_PARTY_INVITE_REJECTED = 0x360313, + SMSG_LOBBY_MATCHMAKER_QUEUE_PROPOSED = 0x360315, + SMSG_LOBBY_MATCHMAKER_QUEUE_RESULT = 0x360316, + SMSG_LOBBY_MATCHMAKER_RECEIVE_INVITE = 0x360314, + SMSG_LOGIN_SET_TIME_SPEED = 0x3601AB, + SMSG_LOGIN_VERIFY_WORLD = 0x36002F, + SMSG_LOGOUT_CANCEL_ACK = 0x360124, + SMSG_LOGOUT_COMPLETE = 0x360123, + SMSG_LOGOUT_RESPONSE = 0x360122, + SMSG_LOG_XP_GAIN = 0x360182, + SMSG_LOOT_ALL_PASSED = 0x3600BE, + SMSG_LOOT_LIST = 0x3601DD, + SMSG_LOOT_MONEY_NOTIFY = 0x3600B9, + SMSG_LOOT_RELEASE = 0x3600B8, + SMSG_LOOT_RELEASE_ALL = 0x3600B7, + SMSG_LOOT_REMOVED = 0x3600B3, + SMSG_LOOT_RESPONSE = 0x3600B2, + SMSG_LOOT_ROLL = 0x3600BB, + SMSG_LOOT_ROLLS_COMPLETE = 0x3600BD, + SMSG_LOOT_ROLL_WON = 0x3600BF, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x36010E, + SMSG_MAIL_COMMAND_RESULT = 0x3600D8, + SMSG_MAIL_LIST_RESULT = 0x3601F2, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x3601F3, + SMSG_MAP_OBJECTIVES_INIT = 0x3C002A, + SMSG_MAP_OBJ_EVENTS = 0x36005F, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x3600BC, + SMSG_MEETING_STONE_FAILED = 0x360317, + SMSG_MESSAGE_BOX = 0x36000A, + SMSG_MINIMAP_PING = 0x36016C, + SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x4D0004, + SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x4D0003, + SMSG_MIRROR_VARS = 0x360355, + SMSG_MISSILE_CANCEL = 0x360060, + SMSG_MODIFY_COOLDOWN = 0x360200, + SMSG_MOTD = 0x3B0003, + SMSG_MOUNT_RESULT = 0x36000F, + SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x3602C6, + SMSG_MOVE_ADD_IMPULSE = 0x480062, + SMSG_MOVE_APPLY_INERTIA = 0x48005E, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x480045, + SMSG_MOVE_DISABLE_COLLISION = 0x480041, + SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x48002B, + SMSG_MOVE_DISABLE_FULL_SPEED_TURNING = 0x480075, + SMSG_MOVE_DISABLE_GRAVITY = 0x48003D, + SMSG_MOVE_DISABLE_INERTIA = 0x48003F, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x48003C, + SMSG_MOVE_ENABLE_COLLISION = 0x480042, + SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x48002A, + SMSG_MOVE_ENABLE_FULL_SPEED_TURNING = 0x480074, + SMSG_MOVE_ENABLE_GRAVITY = 0x48003E, + SMSG_MOVE_ENABLE_INERTIA = 0x480040, + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x48003B, + SMSG_MOVE_KNOCK_BACK = 0x480031, + SMSG_MOVE_REMOVE_INERTIA = 0x48005F, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x480046, + SMSG_MOVE_ROOT = 0x480027, + SMSG_MOVE_SET_ACTIVE_MOVER = 0x480003, + SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 0x48006B, + SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = 0x480066, + SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = 0x48006C, + SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 0x480069, + SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = 0x48006A, + SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 0x480072, + SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = 0x480068, + SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = 0x480067, + SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = 0x480071, + SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = 0x48006D, + SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0x48006E, + SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0x480070, + SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0x48006F, + SMSG_MOVE_SET_CANT_SWIM = 0x480035, + SMSG_MOVE_SET_CAN_ADV_FLY = 0x480064, + SMSG_MOVE_SET_CAN_DRIVE = 0x480076, + SMSG_MOVE_SET_CAN_FLY = 0x480033, + SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x480037, + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x480043, + SMSG_MOVE_SET_COMPOUND_STATE = 0x480047, + SMSG_MOVE_SET_FEATHER_FALL = 0x48002D, + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x480023, + SMSG_MOVE_SET_FLIGHT_SPEED = 0x480022, + SMSG_MOVE_SET_HOVERING = 0x48002F, + SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x480039, + SMSG_MOVE_SET_LAND_WALK = 0x48002C, + SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x480014, + SMSG_MOVE_SET_NORMAL_FALL = 0x48002E, + SMSG_MOVE_SET_PITCH_RATE = 0x480026, + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x48001F, + SMSG_MOVE_SET_RUN_SPEED = 0x48001E, + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x480021, + SMSG_MOVE_SET_SWIM_SPEED = 0x480020, + SMSG_MOVE_SET_TURN_RATE = 0x480025, + SMSG_MOVE_SET_VEHICLE_REC_ID = 0x480044, + SMSG_MOVE_SET_WALK_SPEED = 0x480024, + SMSG_MOVE_SET_WATER_WALK = 0x480029, + SMSG_MOVE_SKIP_TIME = 0x480048, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x48004D, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x48004B, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x48004E, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x48004C, + SMSG_MOVE_SPLINE_ROOT = 0x480049, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x48004F, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x48001A, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x480019, + SMSG_MOVE_SPLINE_SET_FLYING = 0x480059, + SMSG_MOVE_SPLINE_SET_HOVER = 0x480051, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x480054, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x480050, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x48001D, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x480016, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x480057, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x480015, + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x480018, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x480017, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x48001C, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x480058, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x48001B, + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x480053, + SMSG_MOVE_SPLINE_START_SWIM = 0x480055, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x480056, + SMSG_MOVE_SPLINE_UNROOT = 0x48004A, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0x48005A, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0x480052, + SMSG_MOVE_TELEPORT = 0x480032, + SMSG_MOVE_UNROOT = 0x480028, + SMSG_MOVE_UNSET_CANT_SWIM = 0x480036, + SMSG_MOVE_UNSET_CAN_ADV_FLY = 0x480065, + SMSG_MOVE_UNSET_CAN_DRIVE = 0x480077, + SMSG_MOVE_UNSET_CAN_FLY = 0x480034, + SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x480038, + SMSG_MOVE_UNSET_HOVERING = 0x480030, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x48003A, + SMSG_MOVE_UPDATE = 0x48000E, + SMSG_MOVE_UPDATE_ADD_IMPULSE = 0x480063, + SMSG_MOVE_UPDATE_APPLY_INERTIA = 0x480060, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x480012, + SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x48000D, + SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x48000A, + SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x480009, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x480010, + SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x480011, + SMSG_MOVE_UPDATE_PITCH_RATE = 0x48000C, + SMSG_MOVE_UPDATE_REMOVE_INERTIA = 0x480061, + SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x480013, + SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x480005, + SMSG_MOVE_UPDATE_RUN_SPEED = 0x480004, + SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x480008, + SMSG_MOVE_UPDATE_SWIM_SPEED = 0x480007, + SMSG_MOVE_UPDATE_TELEPORT = 0x48000F, + SMSG_MOVE_UPDATE_TURN_RATE = 0x48000B, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x480006, + SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x360276, + SMSG_MULTI_FLOOR_NEW_FLOOR = 0x360275, + SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x3600A8, + SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x3600AA, + SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x3600AF, + SMSG_MYTHIC_PLUS_SEASON_DATA = 0x3600A9, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x360074, + SMSG_NEW_DATA_BUILD = 0x36033B, + SMSG_NEW_TAXI_PATH = 0x36011D, + SMSG_NEW_WORLD = 0x36002B, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x4D0034, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x360149, + SMSG_NOTIFY_MONEY = 0x360031, + SMSG_NOTIFY_RECEIVED_MAIL = 0x3600D9, + SMSG_NPC_INTERACTION_OPEN_RESULT = 0x36030D, + SMSG_OFFER_PETITION_ERROR = 0x360154, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x360183, + SMSG_ON_MONSTER_MOVE = 0x480002, + SMSG_OPEN_ARTIFACT_FORGE = 0x36023A, + SMSG_OPEN_CONTAINER = 0x4E0006, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x440015, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x360232, + SMSG_OVERRIDE_LIGHT = 0x360159, + SMSG_PAGE_TEXT = 0x3601B7, + SMSG_PARTY_COMMAND_RESULT = 0x36022C, + SMSG_PARTY_ELIGIBILITY_FOR_DELVE_TIERS_RESPONSE = 0x360350, + SMSG_PARTY_INVITE = 0x360056, + SMSG_PARTY_KILL_LOG = 0x3601F6, + SMSG_PARTY_MEMBER_FULL_STATE = 0x3601F5, + SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x3601F4, + SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x3602F6, + SMSG_PARTY_UPDATE = 0x36008C, + SMSG_PAST_TIME_EVENTS = 0x36005B, + SMSG_PAUSE_MIRROR_TIMER = 0x3601AE, + SMSG_PENDING_RAID_LOCK = 0x360195, + SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0x36030A, + SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = 0x360306, + SMSG_PERKS_PROGRAM_DISABLED = 0x36030B, + SMSG_PERKS_PROGRAM_RESULT = 0x360307, + SMSG_PERKS_PROGRAM_VENDOR_UPDATE = 0x360305, + SMSG_PETITION_ALREADY_SIGNED = 0x360037, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x420042, + SMSG_PETITION_SHOW_LIST = 0x36015C, + SMSG_PETITION_SHOW_SIGNATURES = 0x36015D, + SMSG_PETITION_SIGN_RESULTS = 0x3601E8, + SMSG_PET_ACTION_FEEDBACK = 0x3601E5, + SMSG_PET_ACTION_SOUND = 0x36013F, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x36009E, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x360113, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x360097, + SMSG_PET_BATTLE_FINAL_ROUND = 0x36009C, + SMSG_PET_BATTLE_FINISHED = 0x36009D, + SMSG_PET_BATTLE_FIRST_ROUND = 0x360099, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x360098, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x36009F, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x360096, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x3600D6, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x3600D7, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x36009B, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x360095, + SMSG_PET_BATTLE_ROUND_RESULT = 0x36009A, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x360084, + SMSG_PET_CAST_FAILED = 0x4D0049, + SMSG_PET_CLEAR_SPELLS = 0x4D0013, + SMSG_PET_DISMISS_SOUND = 0x360140, + SMSG_PET_GOD_MODE = 0x36011A, + SMSG_PET_GUIDS = 0x3601A1, + SMSG_PET_LEARNED_SPELLS = 0x4D0040, + SMSG_PET_MODE = 0x36001F, + SMSG_PET_NAME_INVALID = 0x360161, + SMSG_PET_NEWLY_TAMED = 0x36001E, + SMSG_PET_SPELLS_MESSAGE = 0x4D0014, + SMSG_PET_STABLE_RESULT = 0x36002A, + SMSG_PET_TAME_FAILURE = 0x360151, + SMSG_PET_UNLEARNED_SPELLS = 0x4D0041, + SMSG_PHASE_SHIFT_CHANGE = 0x36000C, + SMSG_PLAYED_TIME = 0x360173, + SMSG_PLAYER_ACKOWLEDGE_ARROW_CALLOUT = 0x4A002D, + SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x4A001F, + SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x4A001E, + SMSG_PLAYER_BONUS_ROLL_FAILED = 0x4A0021, + SMSG_PLAYER_BOUND = 0x4A0000, + SMSG_PLAYER_CHOICE_CLEAR = 0x4A0006, + SMSG_PLAYER_CHOICE_DISPLAY_ERROR = 0x4A0005, + SMSG_PLAYER_CONDITION_RESULT = 0x4A0012, + SMSG_PLAYER_END_OF_MATCH_DETAILS = 0x4A002F, + SMSG_PLAYER_HIDE_ARROW_CALLOUT = 0x4A002C, + SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x4A0011, + SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x4A0016, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x420041, + SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = 0x4A002E, + SMSG_PLAYER_SHOW_ARROW_CALLOUT = 0x4A002B, + SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY = 0x4A0029, + SMSG_PLAYER_SHOW_PARTY_POSE_UI = 0x4A002A, + SMSG_PLAYER_SHOW_UI_EVENT_TOAST = 0x4A0024, + SMSG_PLAYER_SKINNED = 0x4A000E, + SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x4A0015, + SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x4A0014, + SMSG_PLAY_MUSIC = 0x360205, + SMSG_PLAY_OBJECT_SOUND = 0x360207, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x3601CD, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x4D0038, + SMSG_PLAY_SCENE = 0x3600D3, + SMSG_PLAY_SOUND = 0x360204, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x360208, + SMSG_PLAY_SPELL_VISUAL = 0x4D0036, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x4D003A, + SMSG_PLAY_TIME_WARNING = 0x36019B, + SMSG_PONG = 0x3D0006, + SMSG_POWER_UPDATE = 0x360170, + SMSG_PRELOAD_CHILD_MAP = 0x36000D, + SMSG_PRELOAD_WORLD = 0x36002C, + SMSG_PREPOPULATE_NAME_CACHE = 0x3602C9, + SMSG_PRE_RESSURECT = 0x360203, + SMSG_PRINT_NOTIFICATION = 0x360063, + SMSG_PROC_RESIST = 0x3601F7, + SMSG_PROFESSION_GOSSIP = 0x360296, + SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x4D0042, + SMSG_PVP_CREDIT = 0x3C0024, + SMSG_PVP_MATCH_COMPLETE = 0x3C002F, + SMSG_PVP_MATCH_INITIALIZE = 0x3C0030, + SMSG_PVP_MATCH_SET_STATE = 0x3C002E, + SMSG_PVP_MATCH_START = 0x3C002D, + SMSG_PVP_MATCH_STATISTICS = 0x3C0010, + SMSG_PVP_OPTIONS_ENABLED = 0x3C0013, + SMSG_PVP_TIER_RECORD = 0x360301, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x3A000C, + SMSG_QUERY_CREATURE_RESPONSE = 0x3A0006, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x3A0007, + SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x400041, + SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = 0x42002F, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x42002D, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x3A0010, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x3A0008, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x3A0009, + SMSG_QUERY_PETITION_RESPONSE = 0x3A000D, + SMSG_QUERY_PET_NAME_RESPONSE = 0x3A000B, + SMSG_QUERY_PLAYER_NAMES_RESPONSE = 0x4A0026, + SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x4A000A, + SMSG_QUERY_QUEST_INFO_RESPONSE = 0x4B0016, + SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0x42002E, + SMSG_QUERY_TIME_RESPONSE = 0x360181, + SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x4B0001, + SMSG_QUEST_CONFIRM_ACCEPT = 0x4B000F, + SMSG_QUEST_FORCE_REMOVED = 0x4B001C, + SMSG_QUEST_GIVER_INVALID_QUEST = 0x4B0005, + SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x4B0014, + SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x4B0003, + SMSG_QUEST_GIVER_QUEST_DETAILS = 0x4B0012, + SMSG_QUEST_GIVER_QUEST_FAILED = 0x4B0006, + SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x4B001A, + SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x4B0013, + SMSG_QUEST_GIVER_STATUS = 0x4B001B, + SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x4B0011, + SMSG_QUEST_ITEM_USABILITY_RESPONSE = 0x4B0002, + SMSG_QUEST_LOG_FULL = 0x4B0007, + SMSG_QUEST_NON_LOG_UPDATE_COMPLETE = 0x4B0008, + SMSG_QUEST_POI_QUERY_RESPONSE = 0x4B001D, + SMSG_QUEST_POI_UPDATE_RESPONSE = 0x4B001F, + SMSG_QUEST_PUSH_RESULT = 0x4B0010, + SMSG_QUEST_SESSION_INFO_RESPONSE = 0x3602EC, + SMSG_QUEST_SESSION_READY_CHECK = 0x3602DA, + SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x3602DB, + SMSG_QUEST_SESSION_RESULT = 0x3602D9, + SMSG_QUEST_UPDATE_ADD_CREDIT = 0x4B000C, + SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x4B000D, + SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x4B000E, + SMSG_QUEST_UPDATE_COMPLETE = 0x4B0009, + SMSG_QUEST_UPDATE_FAILED = 0x4B000A, + SMSG_QUEST_UPDATE_FAILED_TIMER = 0x4B000B, + SMSG_QUEUE_SUMMARY_UPDATE = 0x3602A9, + SMSG_RAF_ACCOUNT_INFO = 0x3602D7, + SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x3602E8, + SMSG_RAF_DEBUG_FRIEND_MONTHS = 0x360338, + SMSG_RAID_DIFFICULTY_SET = 0x360244, + SMSG_RAID_GROUP_ONLY = 0x360246, + SMSG_RAID_INSTANCE_MESSAGE = 0x3B000A, + SMSG_RAID_MARKERS_CHANGED = 0x360038, + SMSG_RANDOM_ROLL = 0x3600CD, + SMSG_RATED_PVP_INFO = 0x3C000F, + SMSG_READY_CHECK_COMPLETED = 0x360090, + SMSG_READY_CHECK_RESPONSE = 0x36008F, + SMSG_READY_CHECK_STARTED = 0x36008E, + SMSG_READ_ITEM_RESULT_FAILED = 0x360240, + SMSG_READ_ITEM_RESULT_OK = 0x360237, + SMSG_REALM_QUERY_RESPONSE = 0x3A0005, + SMSG_REATTACH_RESURRECT = 0x3601E7, + SMSG_RECEIVE_PING_UNIT = 0x360039, + SMSG_RECEIVE_PING_WORLD_POINT = 0x36003A, + SMSG_RECRAFT_ITEM_RESULT = 0x36032E, + SMSG_RECRUIT_A_FRIEND_FAILURE = 0x36015E, + SMSG_REFRESH_COMPONENT = 0x3600ED, + SMSG_REGIONWIDE_CHARACTER_MAIL_DATA = 0x36001A, + SMSG_REGIONWIDE_CHARACTER_RESTRICTIONS_DATA = 0x360019, + SMSG_REMOVE_ITEM_PASSIVE = 0x360043, + SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x4D0043, + SMSG_REPLACE_TROPHY_RESPONSE = 0x36025C, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x4A0009, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x360025, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x3C0014, + SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x3C0015, + SMSG_RESET_COMPRESSION_CONTEXT = 0x3D0007, + SMSG_RESET_FAILED_NOTIFY = 0x360155, + SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0x360335, + SMSG_RESET_QUEST_POI = 0x4B0020, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x3C0023, + SMSG_RESET_WEEKLY_CURRENCY = 0x360009, + SMSG_RESPEC_WIPE_CONFIRM = 0x3600B0, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x360006, + SMSG_RESPONSE_PERK_PENDING_REWARDS = 0x360308, + SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0x360309, + SMSG_RESTART_GLOBAL_COOLDOWN = 0x4D0052, + SMSG_RESTRICTED_ACCOUNT_WARNING = 0x360052, + SMSG_RESUME_CAST = 0x4D002C, + SMSG_RESUME_CAST_BAR = 0x4D002F, + SMSG_RESUME_COMMS = 0x3D0003, + SMSG_RESUME_TOKEN = 0x360041, + SMSG_RESURRECT_REQUEST = 0x360012, + SMSG_RESYNC_RUNES = 0x4D0050, + SMSG_RETURNING_PLAYER_PROMPT = 0x36023F, + SMSG_RETURN_APPLICANT_LIST = 0x3602CD, + SMSG_RETURN_RECRUITING_CLUBS = 0x3602CC, + SMSG_ROLE_CHANGED_INFORM = 0x360021, + SMSG_ROLE_CHOSEN = 0x44001D, + SMSG_ROLE_POLL_INFORM = 0x360022, + SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x360295, + SMSG_RUNE_REGEN_DEBUG = 0x36004F, + SMSG_SCENARIO_COMPLETED = 0x360283, + SMSG_SCENARIO_POIS = 0x3600D0, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x3600C9, + SMSG_SCENARIO_SHOW_CRITERIA = 0x360299, + SMSG_SCENARIO_STATE = 0x3600C8, + SMSG_SCENARIO_UI_UPDATE = 0x360298, + SMSG_SCENARIO_VACATE = 0x360241, + SMSG_SCENE_OBJECT_EVENT = 0x36007A, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x36007F, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x360080, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x36007C, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x36007B, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x36007E, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x36007D, + SMSG_SCHEDULED_AREA_POI_UPDATE_RESPONSE = 0x4A0019, + SMSG_SCRIPT_CAST = 0x4D0047, + SMSG_SEASON_INFO = 0x36005A, + SMSG_SELL_RESPONSE = 0x360162, + SMSG_SEND_ITEM_PASSIVES = 0x360044, + SMSG_SEND_KNOWN_SPELLS = 0x4D0019, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x3600CB, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x3600CC, + SMSG_SEND_SPELL_CHARGES = 0x4D001B, + SMSG_SEND_SPELL_HISTORY = 0x4D001A, + SMSG_SEND_UNLEARN_SPELLS = 0x4D001C, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x3600EA, + SMSG_SERVER_TIME = 0x360121, + SMSG_SERVER_TIME_OFFSET = 0x3601B2, + SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = 0x4D000F, + SMSG_SETUP_CURRENCY = 0x360007, + SMSG_SET_AI_ANIM_KIT = 0x3601CC, + SMSG_SET_ANIM_TIER = 0x3601D0, + SMSG_SET_CHR_UPGRADE_TIER = 0x360077, + SMSG_SET_CURRENCY = 0x360008, + SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x440012, + SMSG_SET_DUNGEON_DIFFICULTY = 0x360143, + SMSG_SET_FACTION_AT_WAR = 0x36019D, + SMSG_SET_FACTION_NOT_VISIBLE = 0x3601C7, + SMSG_SET_FACTION_STANDING = 0x3601C8, + SMSG_SET_FACTION_VISIBLE = 0x3601C6, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x4D0027, + SMSG_SET_INSTANCE_LEAVER = 0x360356, + SMSG_SET_ITEM_PURCHASE_DATA = 0x360033, + SMSG_SET_LOOT_METHOD_FAILED = 0x360267, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x360036, + SMSG_SET_MELEE_ANIM_KIT = 0x3601CF, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x3601CE, + SMSG_SET_PCT_SPELL_MODIFIER = 0x4D0028, + SMSG_SET_PET_SPECIALIZATION = 0x3600C2, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x4A000B, + SMSG_SET_PLAY_HOVER_ANIM = 0x360053, + SMSG_SET_PROFICIENCY = 0x3601D1, + SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x3602E0, + SMSG_SET_SHIPMENT_READY_RESPONSE = 0x40003A, + SMSG_SET_SPELL_CHARGES = 0x4D0018, + SMSG_SET_TIME_ZONE_INFORMATION = 0x360116, + SMSG_SET_VEHICLE_REC_ID = 0x360194, + SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x36030C, + SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x40003B, + SMSG_SHOW_DELVES_COMPANION_CONFIGURATION_UI = 0x36034E, + SMSG_SHOW_DELVES_DISPLAY_UI = 0x36034C, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x360073, + SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x4B0015, + SMSG_SHOW_TAXI_NODES = 0x36016B, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x36020D, + SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x360318, + SMSG_SOCKET_GEMS_FAILURE = 0x3601C4, + SMSG_SOCKET_GEMS_SUCCESS = 0x3601C3, + SMSG_SPECIAL_MOUNT_ANIM = 0x36013E, + SMSG_SPECTATE_END = 0x36033A, + SMSG_SPECTATE_PLAYER = 0x360339, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x3601B6, + SMSG_SPELL_ABSORB_LOG = 0x4D000C, + SMSG_SPELL_CATEGORY_COOLDOWN = 0x4D0006, + SMSG_SPELL_CHANNEL_START = 0x4D0022, + SMSG_SPELL_CHANNEL_UPDATE = 0x4D0023, + SMSG_SPELL_COOLDOWN = 0x4D0005, + SMSG_SPELL_DAMAGE_SHIELD = 0x4D001F, + SMSG_SPELL_DELAYED = 0x4D0030, + SMSG_SPELL_DISPELL_LOG = 0x4D0007, + SMSG_SPELL_EMPOWER_SET_STAGE = 0x4D0026, + SMSG_SPELL_EMPOWER_START = 0x4D0024, + SMSG_SPELL_EMPOWER_UPDATE = 0x4D0025, + SMSG_SPELL_ENERGIZE_LOG = 0x4D0009, + SMSG_SPELL_EXECUTE_LOG = 0x4D0031, + SMSG_SPELL_FAILED_OTHER = 0x4D0046, + SMSG_SPELL_FAILURE = 0x4D0044, + SMSG_SPELL_FAILURE_MESSAGE = 0x4D004B, + SMSG_SPELL_GO = 0x4D002A, + SMSG_SPELL_HEAL_ABSORB_LOG = 0x4D000B, + SMSG_SPELL_HEAL_LOG = 0x4D000A, + SMSG_SPELL_INSTAKILL_LOG = 0x4D0021, + SMSG_SPELL_INTERRUPT_LOG = 0x4D000D, + SMSG_SPELL_MISS_LOG = 0x4D0032, + SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x4D0020, + SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x4D001D, + SMSG_SPELL_PERIODIC_AURA_LOG = 0x4D0008, + SMSG_SPELL_PREPARE = 0x4D0029, + SMSG_SPELL_START = 0x4D002B, + SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x360065, + SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x3602F2, + SMSG_STAND_STATE_UPDATE = 0x3601BA, + SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0x36006B, + SMSG_START_ELAPSED_TIMER = 0x3600A0, + SMSG_START_ELAPSED_TIMERS = 0x3600A2, + SMSG_START_LIGHTNING_STORM = 0x360146, + SMSG_START_LOOT_ROLL = 0x3600BA, + SMSG_START_MIRROR_TIMER = 0x3601AD, + SMSG_START_TIMER = 0x36003D, + SMSG_STOP_ELAPSED_TIMER = 0x3600A1, + SMSG_STOP_MIRROR_TIMER = 0x3601AF, + SMSG_STOP_SPEAKERBOT_SOUND = 0x360209, + SMSG_STOP_TIMER = 0x36003E, + SMSG_STREAMING_MOVIES = 0x36003C, + SMSG_SUGGEST_INVITE_INFORM = 0x36022D, + SMSG_SUMMON_CANCEL = 0x36014F, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x360023, + SMSG_SUMMON_REQUEST = 0x3601BE, + SMSG_SUPERCEDED_SPELLS = 0x4D003D, + SMSG_SUSPEND_COMMS = 0x3D0002, + SMSG_SUSPEND_TOKEN = 0x360040, + SMSG_SYNC_WOW_ENTITLEMENTS = 0x3602EA, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x3601B5, + SMSG_TAXI_NODE_STATUS = 0x36011B, + SMSG_TEXT_EMOTE = 0x360119, + SMSG_THREAT_CLEAR = 0x36017A, + SMSG_THREAT_REMOVE = 0x360179, + SMSG_THREAT_UPDATE = 0x360178, + SMSG_TIMERUNNING_SEASON_ENDED = 0x36034F, + SMSG_TIME_ADJUSTMENT = 0x480001, + SMSG_TIME_SYNC_REQUEST = 0x480000, + SMSG_TITLE_EARNED = 0x360175, + SMSG_TITLE_LOST = 0x360176, + SMSG_TOTEM_CREATED = 0x360165, + SMSG_TOTEM_DURATION_CHANGED = 0x360167, + SMSG_TOTEM_MOVED = 0x360168, + SMSG_TOTEM_REMOVED = 0x360166, + SMSG_TRADE_STATUS = 0x360017, + SMSG_TRADE_UPDATED = 0x360016, + SMSG_TRAINER_BUY_FAILED = 0x36017D, + SMSG_TRAINER_LIST = 0x36017C, + SMSG_TRAIT_CONFIG_COMMIT_FAILED = 0x36006A, + SMSG_TRANSFER_ABORTED = 0x3601A0, + SMSG_TRANSFER_PENDING = 0x360066, + SMSG_TREASURE_PICKER_RESPONSE = 0x3A0011, + SMSG_TRIGGER_CINEMATIC = 0x360261, + SMSG_TRIGGER_MOVIE = 0x360169, + SMSG_TURN_IN_PETITION_RESULT = 0x3601EA, + SMSG_TUTORIAL_FLAGS = 0x360255, + SMSG_UI_ACTION = 0x360206, + SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x4B0023, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x360262, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x360263, + SMSG_UNLEARNED_SPELLS = 0x4D003F, + SMSG_UNLOAD_CHILD_MAP = 0x36000E, + SMSG_UNSET_INSTANCE_LEAVER = 0x360357, + SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x360302, + SMSG_UPDATE_ACCOUNT_DATA = 0x3601A6, + SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x3601A7, + SMSG_UPDATE_ACTION_BUTTONS = 0x360078, + SMSG_UPDATE_BNET_SESSION_KEY = 0x3602BA, + SMSG_UPDATE_CAPTURE_POINT = 0x3C0007, + SMSG_UPDATE_CELESTIAL_BODY = 0x3602B6, + SMSG_UPDATE_CHARACTER_FLAGS = 0x36025B, + SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x360202, + SMSG_UPDATE_COOLDOWN = 0x360201, + SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x400038, + SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x400021, + SMSG_UPDATE_EXPANSION_LEVEL = 0x3600E3, + SMSG_UPDATE_GAME_TIME_STATE = 0x3602BD, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x360148, + SMSG_UPDATE_LAST_INSTANCE = 0x360127, + SMSG_UPDATE_OBJECT = 0x460000, + SMSG_UPDATE_PRIMARY_SPEC = 0x360070, + SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x36008D, + SMSG_UPDATE_TALENT_DATA = 0x36006F, + SMSG_UPDATE_WORLD_STATE = 0x3601E4, + SMSG_USERLIST_ADD = 0x3B000F, + SMSG_USERLIST_REMOVE = 0x3B0010, + SMSG_USERLIST_UPDATE = 0x3B0011, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x3601EB, + SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x3602B1, + SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x3602AF, + SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x3602AE, + SMSG_VAS_PURCHASE_COMPLETE = 0x360289, + SMSG_VAS_PURCHASE_STATE_UPDATE = 0x360288, + SMSG_VENDOR_INVENTORY = 0x360051, + SMSG_VIGNETTE_UPDATE = 0x4A0010, + SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x3602B5, + SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE = 0x3602FD, + SMSG_VOICE_LOGIN_RESPONSE = 0x3602B4, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x4E0004, + SMSG_VOID_STORAGE_CONTENTS = 0x4E0001, + SMSG_VOID_STORAGE_FAILED = 0x4E0000, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x4E0002, + SMSG_VOID_TRANSFER_RESULT = 0x4E0003, + SMSG_WAIT_QUEUE_FINISH = 0x360003, + SMSG_WAIT_QUEUE_UPDATE = 0x360002, + SMSG_WARDEN3_DATA = 0x36000B, + SMSG_WARDEN3_DISABLED = 0x3602B8, + SMSG_WARDEN3_ENABLED = 0x3602B7, + SMSG_WARFRONT_COMPLETE = 0x3601FA, + SMSG_WARGAME_REQUEST_OPPONENT_RESPONSE = 0x3C0012, + SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x3C0011, + SMSG_WEATHER = 0x360145, + SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x3602F5, + SMSG_WEEKLY_REWARDS_RESULT = 0x3602F3, + SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x3602F4, + SMSG_WHO = 0x3B0002, + SMSG_WHO_IS = 0x360144, + SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x3602BC, + SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x4A0017, + SMSG_WORLD_SERVER_INFO = 0x360045, + SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x3602EB, + SMSG_WOW_LABS_AREA_INFO = 0x36031D, + SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_END = 0x360319, + SMSG_WOW_LABS_NOTIFY_PLAYERS_MATCH_STATE_CHANGED = 0x36031A, + SMSG_WOW_LABS_PARTY_ERROR = 0x360326, + SMSG_WOW_LABS_SET_AREA_ID_RESULT = 0x36031B, + SMSG_WOW_LABS_SET_PREDICTION_CIRCLE = 0x36031F, + SMSG_WOW_LABS_SET_SELECTED_AREA_ID = 0x36031C, + SMSG_XP_AWARDED_FROM_CURRENCY = 0x360334, + SMSG_XP_GAIN_ABORTED = 0x360062, + SMSG_XP_GAIN_ENABLED = 0x360245, + SMSG_ZONE_UNDER_ATTACK = 0x3B000B, // Opcodes that are not generated automatically SMSG_ACCOUNT_HEIRLOOM_UPDATE = SMSG_ACCOUNT_TOY_UPDATE + 1, // no client handler - SMSG_COMPRESSED_PACKET = 0x3F000A, - SMSG_MULTIPLE_PACKETS = 0x3F0009, + SMSG_COMPRESSED_PACKET = SMSG_AUTH_CHALLENGE + 0xA, + SMSG_MULTIPLE_PACKETS = SMSG_AUTH_CHALLENGE + 0x9, // Deleted opcodes, here only to allow compile SMSG_ARENA_TEAM_STATS = UNKNOWN_OPCODE, }; -inline constexpr std::size_t NUM_SMSG_OPCODES = 1473; +inline constexpr std::size_t NUM_SMSG_OPCODES = 1479; inline constexpr std::ptrdiff_t GetOpcodeArrayIndex(OpcodeServer opcode) { uint32 idInGroup = opcode & 0xFFFF; switch (opcode >> 16) { - case 0x38: return idInGroup < 848 ? idInGroup + 0 : -1; - case 0x39: return idInGroup < 10 ? idInGroup + 848 : -1; - case 0x3C: return idInGroup < 18 ? idInGroup + 858 : -1; - case 0x3D: return idInGroup < 36 ? idInGroup + 876 : -1; - case 0x3E: return idInGroup < 49 ? idInGroup + 912 : -1; - case 0x3F: return idInGroup < 11 ? idInGroup + 961 : -1; - case 0x40: return idInGroup < 12 ? idInGroup + 972 : -1; - case 0x42: return idInGroup < 82 ? idInGroup + 984 : -1; - case 0x44: return idInGroup < 71 ? idInGroup + 1066 : -1; - case 0x46: return idInGroup < 33 ? idInGroup + 1137 : -1; - case 0x48: return idInGroup < 1 ? idInGroup + 1170 : -1; - case 0x49: return idInGroup < 120 ? idInGroup + 1171 : -1; - case 0x4B: return idInGroup < 48 ? idInGroup + 1291 : -1; - case 0x4C: return idInGroup < 41 ? idInGroup + 1339 : -1; - case 0x4E: return idInGroup < 85 ? idInGroup + 1380 : -1; - case 0x4F: return idInGroup < 8 ? idInGroup + 1465 : -1; - case 0x51: return idInGroup < 1 ? idInGroup + 1473 : -1; + case 0x36: return idInGroup < 857 ? idInGroup + 0 : -1; + case 0x37: return idInGroup < 5 ? idInGroup + 857 : -1; + case 0x3A: return idInGroup < 18 ? idInGroup + 862 : -1; + case 0x3B: return idInGroup < 36 ? idInGroup + 880 : -1; + case 0x3C: return idInGroup < 49 ? idInGroup + 916 : -1; + case 0x3D: return idInGroup < 11 ? idInGroup + 965 : -1; + case 0x3E: return idInGroup < 12 ? idInGroup + 976 : -1; + case 0x40: return idInGroup < 82 ? idInGroup + 988 : -1; + case 0x42: return idInGroup < 71 ? idInGroup + 1070 : -1; + case 0x44: return idInGroup < 33 ? idInGroup + 1141 : -1; + case 0x46: return idInGroup < 1 ? idInGroup + 1174 : -1; + case 0x48: return idInGroup < 120 ? idInGroup + 1175 : -1; + case 0x4A: return idInGroup < 49 ? idInGroup + 1295 : -1; + case 0x4B: return idInGroup < 41 ? idInGroup + 1344 : -1; + case 0x4D: return idInGroup < 85 ? idInGroup + 1385 : -1; + case 0x4E: return idInGroup < 8 ? idInGroup + 1470 : -1; + case 0x50: return idInGroup < 1 ? idInGroup + 1478 : -1; default: return -1; } } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 88a6cc1d815..b62697bce23 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -22,6 +22,7 @@ #include "WorldSession.h" #include "AccountMgr.h" #include "AuthenticationPackets.h" +#include "Bag.h" #include "BattlePetMgr.h" #include "BattlegroundMgr.h" #include "BattlenetPackets.h" @@ -1525,7 +1526,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint32 opcode) co case CMSG_QUEST_GIVER_REQUEST_REWARD: // 0 1 case CMSG_COMPLETE_CINEMATIC: // 0 1 case CMSG_BANKER_ACTIVATE: // 0 1 - case CMSG_BUY_BANK_SLOT: // 0 1 + case CMSG_BUY_ACCOUNT_BANK_TAB: // 0 1 case CMSG_OPT_OUT_OF_LOOT: // 0 1 case CMSG_DUEL_RESPONSE: // 0 1 case CMSG_CALENDAR_COMPLAIN: // 0 1 @@ -1722,7 +1723,11 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint32 opcode) co case CMSG_GET_ITEM_PURCHASE_DATA: // not profiled { - maxPacketCounterAllowed = PLAYER_SLOTS_COUNT; + maxPacketCounterAllowed = PLAYER_SLOTS_COUNT + MAX_BAG_SIZE * ( + (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) + + (REAGENT_BAG_SLOT_END - REAGENT_BAG_SLOT_START) + + (BANK_SLOT_BAG_END - BANK_SLOT_BAG_START) + + (ACCOUNT_BANK_SLOT_BAG_END - ACCOUNT_BANK_SLOT_BAG_START)); break; } case CMSG_HOTFIX_REQUEST: // not profiled diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 01299cc9f7c..442e1495da3 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -169,10 +169,9 @@ namespace WorldPackets { class AutoBankItem; class AutoStoreBankItem; - class BuyBankSlot; - class AutoBankReagent; - class AutoStoreBankReagent; - class ReagentBank; + class BuyBankTab; + class UpdateBankTabSettings; + class AutoDepositCharacterBank; class BankerActivate; } @@ -454,11 +453,9 @@ namespace WorldPackets class SortAccountBankBags; class SortBags; class SortBankBags; - class SortReagentBankBags; struct ItemInstance; class RemoveNewItem; class ChangeBagSlotFlag; - class ChangeBankBagSlotFlag; class SetBackpackAutosortDisabled; class SetBackpackSellJunkDisabled; class SetBankAutosortDisabled; @@ -830,14 +827,6 @@ namespace WorldPackets class MoveSetVehicleRecIdAck; } - namespace VoidStorage - { - class UnlockVoidStorage; - class QueryVoidStorage; - class VoidStorageTransfer; - class SwapVoidItem; - } - namespace Warden { class WardenData; @@ -1518,11 +1507,9 @@ class TC_GAME_API WorldSession // Bank void HandleAutoBankItemOpcode(WorldPackets::Bank::AutoBankItem& packet); void HandleAutoStoreBankItemOpcode(WorldPackets::Bank::AutoStoreBankItem& packet); - void HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& packet); - void HandleBuyReagentBankOpcode(WorldPackets::Bank::ReagentBank& reagentBank); - void HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReagent& autoBankRegent); - void HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStoreBankReagent& autoStoreBankReagent); - void HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBank& reagentBank); + void HandleBuyBankTab(WorldPackets::Bank::BuyBankTab const& buyBankTab); + void HandleUpdateBankTabSettings(WorldPackets::Bank::UpdateBankTabSettings const& updateBankTabSettings); + void HandleAutoDepositCharacterBank(WorldPackets::Bank::AutoDepositCharacterBank const& autoDepositCharacterBank); // Black Market void HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& blackMarketOpen); @@ -1555,7 +1542,6 @@ class TC_GAME_API WorldSession void HandleWrapItem(WorldPackets::Item::WrapItem& packet); void HandleUseCritterItem(WorldPackets::Item::UseCritterItem& packet); void HandleChangeBagSlotFlag(WorldPackets::Item::ChangeBagSlotFlag const& changeBagSlotFlag); - void HandleChangeBankBagSlotFlag(WorldPackets::Item::ChangeBankBagSlotFlag const& changeBankBagSlotFlag); void HandleSetBackpackAutosortDisabled(WorldPackets::Item::SetBackpackAutosortDisabled const& setBackpackAutosortDisabled); void HandleSetBackpackSellJunkDisabled(WorldPackets::Item::SetBackpackSellJunkDisabled const& setBackpackSellJunkDisabled); void HandleSetBankAutosortDisabled(WorldPackets::Item::SetBankAutosortDisabled const& setBankAutosortDisabled); @@ -1737,7 +1723,6 @@ class TC_GAME_API WorldSession void HandleSortAccountBankBags(WorldPackets::Item::SortAccountBankBags& sortBankBags); void HandleSortBags(WorldPackets::Item::SortBags& sortBags); void HandleSortBankBags(WorldPackets::Item::SortBankBags& sortBankBags); - void HandleSortReagentBankBags(WorldPackets::Item::SortReagentBankBags& sortReagentBankBags); void HandleRemoveNewItem(WorldPackets::Item::RemoveNewItem& removeNewItem); void HandleCancelTempEnchantmentOpcode(WorldPackets::Item::CancelTempEnchantment& cancelTempEnchantment); @@ -1794,13 +1779,6 @@ class TC_GAME_API WorldSession void SendCalendarRaidLockoutRemoved(InstanceLock const* lock); void HandleSetSavedInstanceExtend(WorldPackets::Calendar::SetSavedInstanceExtend& setSavedInstanceExtend); - // Void Storage - void HandleVoidStorageUnlock(WorldPackets::VoidStorage::UnlockVoidStorage& unlockVoidStorage); - void HandleVoidStorageQuery(WorldPackets::VoidStorage::QueryVoidStorage& queryVoidStorage); - void HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStorageTransfer& voidStorageTransfer); - void HandleVoidSwapItem(WorldPackets::VoidStorage::SwapVoidItem& swapVoidItem); - void SendVoidStorageTransferResult(VoidTransferError result); - // Collections void HandleCollectionItemSetFavorite(WorldPackets::Collections::CollectionItemSetFavorite& collectionItemSetFavorite); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index e9db7862247..0bd91797019 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -728,6 +728,8 @@ enum AuraType : uint32 SPELL_AURA_641 = 641, SPELL_AURA_642 = 642, SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT = 643, // NYI + SPELL_AURA_644 = 644, + SPELL_AURA_645 = 645, TOTAL_AURAS }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 6d138b02b10..ed0e87ddc8f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -712,7 +712,9 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //640 &AuraEffect::HandleNULL, //641 &AuraEffect::HandleNULL, //642 - &AuraEffect::HandleNULL, //642 SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT + &AuraEffect::HandleNULL, //643 SPELL_AURA_MOD_RANGED_ATTACK_SPEED_FLAT + &AuraEffect::HandleNULL, //644 + &AuraEffect::HandleNULL, //645 }; AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster) : diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 07f0bf1c20a..58996ebb379 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5284,6 +5284,7 @@ void Spell::SendChannelUpdate(uint32 time, Optional<SpellCastResult> result) unitCaster->ClearChannelObjects(); unitCaster->SetChannelSpellId(0); unitCaster->SetChannelVisual({}); + unitCaster->SetChannelSpellData(0, 0); unitCaster->SetSpellEmpowerStage(-1); } @@ -5365,6 +5366,7 @@ void Spell::SendChannelStart(uint32 duration) unitCaster->SetChannelSpellId(m_spellInfo->Id); unitCaster->SetChannelVisual(m_SpellVisual); + unitCaster->SetChannelSpellData(GameTime::GetGameTimeMS(), duration); auto setImmunitiesAndHealPrediction = [&](Optional<WorldPackets::Spells::SpellChannelStartInterruptImmunities>& interruptImmunities, Optional<WorldPackets::Spells::SpellTargetedHealPrediction>& healPrediction) { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ef3394e367e..da0fd7be46c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -430,6 +430,10 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectNULL, //339 SPELL_EFFECT_UI_ACTION &Spell::EffectNULL, //340 SPELL_EFFECT_340 &Spell::EffectLearnWarbandScene, //341 SPELL_EFFECT_LEARN_WARBAND_SCENE + &Spell::EffectNULL, //342 SPELL_EFFECT_342 + &Spell::EffectNULL, //343 SPELL_EFFECT_343 + &Spell::EffectNULL, //344 SPELL_EFFECT_344 + &Spell::EffectNULL, //345 SPELL_EFFECT_ASSIST_ACTION }; void Spell::EffectNULL() diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 4cfd315baad..3c6d3f6504e 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1256,6 +1256,10 @@ std::array<SpellEffectInfo::StaticData, TOTAL_SPELL_EFFECTS> SpellEffectInfo::_d {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 339 SPELL_EFFECT_UI_ACTION {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 340 SPELL_EFFECT_340 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 341 SPELL_EFFECT_LEARN_WARBAND_SCENE + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 342 SPELL_EFFECT_342 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 343 SPELL_EFFECT_343 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 344 SPELL_EFFECT_344 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 345 SPELL_EFFECT_ASSIST_ACTION } }; SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, SpellInfoLoadHelper const& data) diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index 1bfa3d50fe9..c15833f90d9 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -127,7 +127,6 @@ DumpTable const DumpTables[] = { "character_spell_cooldown", DTT_CHAR_TABLE }, { "character_talent", DTT_CHAR_TABLE }, { "character_transmog_outfits", DTT_CHAR_TRANSMOG }, - /// @todo: character_void_storage { "mail", DTT_MAIL }, { "mail_items", DTT_MAIL_ITEM }, // must be after mail { "pet_aura", DTT_PET_TABLE }, // must be after character_pet |
