diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index c8bc08124..b7d4890f8 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -19,11 +19,11 @@ namespace Framework.Constants public enum HeaderFlags : short { None = 0x0, - OffsetMap = 0x1, - SecondIndex = 0x2, - IndexMap = 0x4, - Unknown = 0x8, - Compressed = 0x10, + Sparse = 0x1, + SecondaryKey = 0x2, + Index = 0x4, + Unknown1 = 0x8, + BitPacked = 0x10, } [Flags] @@ -2380,7 +2380,7 @@ namespace Framework.Constants Max } - public enum UiMapType : uint + public enum UiMapType : byte { Cosmic = 0, World = 1, diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index 3e92cb512..9ddd20e33 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -152,8 +152,17 @@ namespace Framework.Constants OffensiveSlot3 = 213, OffensiveSlot4 = 214, UtilitySlot1 = 215, - DefensiveSlot1 = 216, - MobilitySlot1 = 217 + UtilitySlot2 = 216, + UtilitySlot3 = 217, + UtilitySlot4 = 218, + DefensiveSlot1 = 219, + DefensiveSlot2 = 220, + DefensiveSlot3 = 221, + DefensiveSlot4 = 222, + WeaponSlot1 = 223, + WeaponSlot2 = 224, + WeaponSlot3 = 225, + WeaponSlot4 = 226, } public struct EquipmentSlot @@ -387,6 +396,12 @@ namespace Framework.Constants CraftingReagentSlot7 = 50, CraftingReagentSlot8 = 51, CraftingReagentSlot9 = 52, + CraftingReagentSlot10 = 53, + CraftingReagentSlot11 = 54, + CraftingReagentSlot12 = 55, + CraftingReagentSlot13 = 56, + CraftingReagentSlot14 = 57, + Max } diff --git a/Source/Framework/Constants/LootConst.cs b/Source/Framework/Constants/LootConst.cs index a2f791aa4..f029a2d4e 100644 --- a/Source/Framework/Constants/LootConst.cs +++ b/Source/Framework/Constants/LootConst.cs @@ -19,6 +19,7 @@ namespace Framework.Constants Need = 0x02, Greed = 0x04, Disenchant = 0x08, + Transmog = 0x10, AllNoDisenchant = 0x07, AllMask = 0x0f diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index 67d42d3eb..4b6246c52 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -5,35 +5,35 @@ namespace Framework.Constants { public enum ClientOpcodes : uint { - AbandonNpeResponse = 0x33ea, - AcceptGuildInvite = 0x35fc, - AcceptReturningPlayerPrompt = 0x3395, - AcceptSocialContract = 0x373d, + AbandonNpeResponse = 0x33eb, + AcceptGuildInvite = 0x35fd, + AcceptReturningPlayerPrompt = 0x3396, + AcceptSocialContract = 0x3744, AcceptTrade = 0x315a, AcceptWargameInvite = 0x35e0, - AccountNotificationAcknowledged = 0x3732, - ActivateSoulbind = 0x33d9, + AccountNotificationAcknowledged = 0x3733, + ActivateSoulbind = 0x33da, ActivateTaxi = 0x34b1, AddonList = 0x35d8, - AddAccountCosmetic = 0x32b1, - AddBattlenetFriend = 0x3658, - AddFriend = 0x36cc, - AddIgnore = 0x36d0, - AddToy = 0x32b0, - AdventureJournalOpenQuest = 0x3204, - AdventureJournalUpdateSuggestions = 0x33dc, + AddAccountCosmetic = 0x32b0, + AddBattlenetFriend = 0x3659, + AddFriend = 0x36cd, + AddIgnore = 0x36d1, + AddToy = 0x32af, + AdventureJournalOpenQuest = 0x3203, + AdventureJournalUpdateSuggestions = 0x33dd, AdventureMapStartQuest = 0x3369, AlterAppearance = 0x3503, AreaSpiritHealerQuery = 0x34b6, AreaSpiritHealerQueue = 0x34b7, - AreaTrigger = 0x31d8, - ArtifactAddPower = 0x31ab, - ArtifactSetAppearance = 0x31ad, - AssignEquipmentSetSpec = 0x3210, - AttackStop = 0x3263, - AttackSwing = 0x3262, - AuctionableTokenSell = 0x36e2, - AuctionableTokenSellAtMarketPrice = 0x36e3, + AreaTrigger = 0x31d7, + ArtifactAddPower = 0x31aa, + ArtifactSetAppearance = 0x31ac, + AssignEquipmentSetSpec = 0x320f, + AttackStop = 0x3262, + AttackSwing = 0x3261, + AuctionableTokenSell = 0x36e3, + AuctionableTokenSellAtMarketPrice = 0x36e4, AuctionBrowseQuery = 0x34d6, AuctionCancelCommoditiesPurchase = 0x34de, AuctionConfirmCommoditiesPurchase = 0x34dd, @@ -47,10 +47,10 @@ namespace Framework.Constants AuctionPlaceBid = 0x34d5, AuctionRemoveItem = 0x34d3, AuctionReplicateItems = 0x34d4, - AuctionRequestFavoriteList = 0x3734, + AuctionRequestFavoriteList = 0x3735, AuctionSellCommodity = 0x34df, AuctionSellItem = 0x34d2, - AuctionSetFavoriteItem = 0x3733, + AuctionSetFavoriteItem = 0x3734, AuthContinuedSession = 0x3766, AuthSession = 0x3765, AutobankItem = 0x3997, @@ -62,102 +62,102 @@ namespace Framework.Constants AutoGuildBankItem = 0x34bd, AutoStoreBagItem = 0x399b, AutoStoreGuildBankItem = 0x34c6, - AzeriteEmpoweredItemSelectPower = 0x3391, + AzeriteEmpoweredItemSelectPower = 0x3392, AzeriteEmpoweredItemViewed = 0x3374, - AzeriteEssenceActivateEssence = 0x3393, - AzeriteEssenceUnlockMilestone = 0x3392, + AzeriteEssenceActivateEssence = 0x3394, + AzeriteEssenceUnlockMilestone = 0x3393, BankerActivate = 0x34b9, BattlefieldLeave = 0x3173, - BattlefieldList = 0x317f, + BattlefieldList = 0x317e, BattlefieldPort = 0x3538, - BattlemasterHello = 0x32cd, + BattlemasterHello = 0x32cc, BattlemasterJoin = 0x3530, BattlemasterJoinArena = 0x3531, BattlemasterJoinBrawl = 0x3536, BattlemasterJoinRatedSoloShuffle = 0x3532, BattlemasterJoinSkirmish = 0x3533, - BattlenetChallengeResponse = 0x36cf, - BattlenetRequest = 0x36f1, - BattlePayAckFailedResponse = 0x36c9, - BattlePayCancelOpenCheckout = 0x3710, - BattlePayConfirmPurchaseResponse = 0x36c8, - BattlePayDistributionAssignToTarget = 0x36bf, - BattlePayDistributionAssignVas = 0x3737, - BattlePayGetProductList = 0x36b7, - BattlePayGetPurchaseList = 0x36b8, - BattlePayOpenCheckout = 0x3709, - BattlePayRequestPriceInfo = 0x3705, - BattlePayStartPurchase = 0x36c7, - BattlePayStartVasPurchase = 0x36ee, + BattlenetChallengeResponse = 0x36d0, + BattlenetRequest = 0x36f2, + BattlePayAckFailedResponse = 0x36ca, + BattlePayCancelOpenCheckout = 0x3711, + BattlePayConfirmPurchaseResponse = 0x36c9, + BattlePayDistributionAssignToTarget = 0x36c0, + BattlePayDistributionAssignVas = 0x3738, + BattlePayGetProductList = 0x36b8, + BattlePayGetPurchaseList = 0x36b9, + BattlePayOpenCheckout = 0x370a, + BattlePayRequestPriceInfo = 0x3706, + BattlePayStartPurchase = 0x36c8, + BattlePayStartVasPurchase = 0x36ef, BattlePetClearFanfare = 0x3126, - BattlePetDeletePet = 0x3623, - BattlePetDeletePetCheat = 0x3624, - BattlePetModifyName = 0x3626, - BattlePetRequestJournal = 0x3622, - BattlePetRequestJournalLock = 0x3621, - BattlePetSetBattleSlot = 0x362b, - BattlePetSetFlags = 0x362e, - BattlePetSummon = 0x3627, - BattlePetUpdateDisplayNotify = 0x31e2, - BattlePetUpdateNotify = 0x31e1, + BattlePetDeletePet = 0x3624, + BattlePetDeletePetCheat = 0x3625, + BattlePetModifyName = 0x3627, + BattlePetRequestJournal = 0x3623, + BattlePetRequestJournalLock = 0x3622, + BattlePetSetBattleSlot = 0x362c, + BattlePetSetFlags = 0x362f, + BattlePetSummon = 0x3628, + BattlePetUpdateDisplayNotify = 0x31e1, + BattlePetUpdateNotify = 0x31e0, BeginTrade = 0x3157, BinderActivate = 0x34b8, BlackMarketBidOnItem = 0x3540, BlackMarketOpen = 0x353e, BlackMarketRequestItems = 0x353f, - BonusRoll = 0x3394, - BugReport = 0x3683, + BonusRoll = 0x3395, + BugReport = 0x3684, BusyTrade = 0x3158, BuyBackItem = 0x34aa, BuyBankSlot = 0x34ba, BuyItem = 0x34a9, BuyReagentBank = 0x34bb, - CageBattlePet = 0x31f4, - CalendarAddEvent = 0x367b, - CalendarCommunityInvite = 0x366f, - CalendarComplain = 0x3677, - CalendarCopyEvent = 0x3676, - CalendarEventSignUp = 0x3679, - CalendarGet = 0x366d, - CalendarGetEvent = 0x366e, - CalendarGetNumPending = 0x3678, - CalendarInvite = 0x3670, - CalendarModeratorStatus = 0x3674, - CalendarRemoveEvent = 0x3675, - CalendarRemoveInvite = 0x3671, - CalendarRsvp = 0x3672, - CalendarStatus = 0x3673, - CalendarUpdateEvent = 0x367c, - CancelAura = 0x31af, + CageBattlePet = 0x31f3, + CalendarAddEvent = 0x367c, + CalendarCommunityInvite = 0x3670, + CalendarComplain = 0x3678, + CalendarCopyEvent = 0x3677, + CalendarEventSignUp = 0x367a, + CalendarGet = 0x366e, + CalendarGetEvent = 0x366f, + CalendarGetNumPending = 0x3679, + CalendarInvite = 0x3671, + CalendarModeratorStatus = 0x3675, + CalendarRemoveEvent = 0x3676, + CalendarRemoveInvite = 0x3672, + CalendarRsvp = 0x3673, + CalendarStatus = 0x3674, + CalendarUpdateEvent = 0x367d, + CancelAura = 0x31ae, CancelAutoRepeatSpell = 0x34f5, - CancelCast = 0x32b7, - CancelChannelling = 0x327b, - CancelGrowthAura = 0x3283, - CancelMasterLootRoll = 0x321c, - CancelModSpeedNoControlAuras = 0x31ae, - CancelMountAura = 0x3296, - CancelQueuedSpell = 0x3180, + CancelCast = 0x32b6, + CancelChannelling = 0x327a, + CancelGrowthAura = 0x3282, + CancelMasterLootRoll = 0x321b, + CancelModSpeedNoControlAuras = 0x31ad, + CancelMountAura = 0x3295, + CancelQueuedSpell = 0x317f, CancelTempEnchantment = 0x3500, CancelTrade = 0x315c, - CanDuel = 0x3660, - CanRedeemTokenForBalance = 0x3704, - CastSpell = 0x32b4, + CanDuel = 0x3661, + CanRedeemTokenForBalance = 0x3705, + CastSpell = 0x32b3, ChallengeModeRequestLeaders = 0x308f, - ChangeBagSlotFlag = 0x334e, - ChangeBankBagSlotFlag = 0x334f, - ChangeMonumentAppearance = 0x332f, - ChangeRealmTicket = 0x36f6, - ChangeSubGroup = 0x364a, - CharacterCheckUpgrade = 0x36c2, - CharacterRenameRequest = 0x36bd, - CharacterUpgradeManualUnrevokeRequest = 0x36c0, - CharacterUpgradeStart = 0x36c1, - CharCustomize = 0x368a, - CharDelete = 0x369a, - CharRaceOrFactionChange = 0x3690, + ChangeBagSlotFlag = 0x334d, + ChangeBankBagSlotFlag = 0x334e, + ChangeMonumentAppearance = 0x332e, + ChangeRealmTicket = 0x36f7, + ChangeSubGroup = 0x364b, + CharacterCheckUpgrade = 0x36c3, + CharacterRenameRequest = 0x36be, + CharacterUpgradeManualUnrevokeRequest = 0x36c1, + CharacterUpgradeStart = 0x36c2, + CharCustomize = 0x368b, + CharDelete = 0x369b, + CharRaceOrFactionChange = 0x3691, ChatAddonMessage = 0x37ee, ChatAddonMessageTargeted = 0x37ef, - ChatCanLocalWhisperTargetRequest = 0x37f4, + ChatCanLocalWhisperTargetRequest = 0x37f6, ChatChannelAnnouncements = 0x37e3, ChatChannelBan = 0x37e1, ChatChannelDeclineInvite = 0x37e6, @@ -192,65 +192,64 @@ namespace Framework.Constants ChatReportFiltered = 0x37cc, ChatReportIgnored = 0x37cb, ChatUnregisterAllAddonPrefixes = 0x37ce, - CheckCharacterNameAvailability = 0x3643, - CheckIsAdventureMapPoiValid = 0x3254, - ChoiceResponse = 0x32bc, - ChromieTimeSelectExpansion = 0x33d8, - ClaimWeeklyReward = 0x33b4, - ClassTalentsDeleteConfig = 0x340f, - ClassTalentsNotifyEmptyConfig = 0x3214, - ClassTalentsNotifyValidationFailed = 0x3411, - ClassTalentsRenameConfig = 0x340e, - ClassTalentsRequestNewConfig = 0x340d, - ClassTalentsSetStarterBuildActive = 0x3412, - ClassTalentsSetUsesSharedActionBars = 0x3213, + CheckCharacterNameAvailability = 0x3644, + CheckIsAdventureMapPoiValid = 0x3253, + ChoiceResponse = 0x32bb, + ChromieTimeSelectExpansion = 0x33d9, + ClaimWeeklyReward = 0x33b5, + ClassTalentsDeleteConfig = 0x3411, + ClassTalentsNotifyEmptyConfig = 0x3213, + ClassTalentsNotifyValidationFailed = 0x3413, + ClassTalentsRenameConfig = 0x3410, + ClassTalentsRequestNewConfig = 0x340f, + ClassTalentsSetStarterBuildActive = 0x3414, + ClassTalentsSetUsesSharedActionBars = 0x3212, ClearNewAppearance = 0x3129, - ClearRaidMarker = 0x31a7, + ClearRaidMarker = 0x31a6, ClearTradeItem = 0x315e, ClientPortGraveyard = 0x353a, CloseInteraction = 0x3499, - CloseQuestChoice = 0x32bd, - CloseRuneforgeInteraction = 0x33e0, - CloseTraitSystemInteraction = 0x3413, - ClubFinderApplicationResponse = 0x371b, - ClubFinderGetApplicantsList = 0x3719, - ClubFinderPost = 0x3716, - ClubFinderRequestClubsData = 0x371d, - ClubFinderRequestClubsList = 0x3717, - ClubFinderRequestMembershipToClub = 0x3718, - ClubFinderRequestPendingClubsList = 0x371c, - ClubFinderRequestSubscribedClubPostingIds = 0x371e, - ClubFinderRespondToApplicant = 0x371a, - ClubFinderWhisperApplicantRequest = 0x373a, - ClubPresenceSubscribe = 0x36f3, - CollectionItemSetFavorite = 0x3631, + CloseRuneforgeInteraction = 0x33e1, + CloseTraitSystemInteraction = 0x3415, + ClubFinderApplicationResponse = 0x371c, + ClubFinderGetApplicantsList = 0x371a, + ClubFinderPost = 0x3717, + ClubFinderRequestClubsData = 0x371e, + ClubFinderRequestClubsList = 0x3718, + ClubFinderRequestMembershipToClub = 0x3719, + ClubFinderRequestPendingClubsList = 0x371d, + ClubFinderRequestSubscribedClubPostingIds = 0x371f, + ClubFinderRespondToApplicant = 0x371b, + ClubFinderWhisperApplicantRequest = 0x373b, + ClubPresenceSubscribe = 0x36f4, + CollectionItemSetFavorite = 0x3632, CommentatorEnable = 0x35f0, CommentatorEnterInstance = 0x35f4, CommentatorExitInstance = 0x35f5, CommentatorGetMapInfo = 0x35f1, CommentatorGetPlayerCooldowns = 0x35f3, CommentatorGetPlayerInfo = 0x35f2, - CommentatorSpectate = 0x3738, + CommentatorSpectate = 0x3739, CommentatorStartWargame = 0x35ef, - CommerceTokenGetCount = 0x36e0, - CommerceTokenGetLog = 0x36ea, - CommerceTokenGetMarketPrice = 0x36e1, - Complaint = 0x366a, + CommerceTokenGetCount = 0x36e1, + CommerceTokenGetLog = 0x36eb, + CommerceTokenGetMarketPrice = 0x36e2, + Complaint = 0x366b, CompleteCinematic = 0x3558, CompleteMovie = 0x34eb, - ConfirmArtifactRespec = 0x31ac, - ConfirmRespecWipe = 0x3216, + ConfirmArtifactRespec = 0x31ab, + ConfirmRespecWipe = 0x3215, ConnectToFailed = 0x35d4, - ConsumableTokenBuy = 0x36e5, - ConsumableTokenBuyAtMarketPrice = 0x36e6, - ConsumableTokenCanVeteranBuy = 0x36e4, - ConsumableTokenRedeem = 0x36e8, - ConsumableTokenRedeemConfirmation = 0x36e9, + ConsumableTokenBuy = 0x36e6, + ConsumableTokenBuyAtMarketPrice = 0x36e7, + ConsumableTokenCanVeteranBuy = 0x36e5, + ConsumableTokenRedeem = 0x36e9, + ConsumableTokenRedeemConfirmation = 0x36ea, ContributionContribute = 0x356c, ContributionLastUpdateRequest = 0x356d, ConversationCinematicReady = 0x355a, ConversationLineStarted = 0x3559, - ConvertRaid = 0x364c, + ConvertRaid = 0x364d, CovenantRenownRequestCatchupState = 0x3580, CraftingOrderCancel = 0x358b, CraftingOrderClaim = 0x3588, @@ -261,89 +260,89 @@ namespace Framework.Constants CraftingOrderReject = 0x358c, CraftingOrderRelease = 0x3589, CraftingOrderUpdateIgnoreList = 0x358d, - CreateCharacter = 0x3642, - CreateShipment = 0x331a, + CreateCharacter = 0x3643, + CreateShipment = 0x3319, DbQueryBulk = 0x35e4, DeclineGuildInvites = 0x352d, DeclinePetition = 0x3547, DeleteEquipmentSet = 0x3519, - DelFriend = 0x36cd, - DelIgnore = 0x36d1, - DepositReagentBank = 0x3357, - DestroyItem = 0x32aa, - DfBootPlayerVote = 0x3616, - DfConfirmExpandSearch = 0x3608, - DfGetJoinStatus = 0x3614, - DfGetSystemInfo = 0x3613, - DfJoin = 0x3609, - DfLeave = 0x3612, - DfProposalResponse = 0x3607, - DfReadyCheckResponse = 0x3619, - DfSetRoles = 0x3615, - DfTeleport = 0x3617, + DelFriend = 0x36ce, + DelIgnore = 0x36d2, + DepositReagentBank = 0x3356, + DestroyItem = 0x32a9, + DfBootPlayerVote = 0x3617, + DfConfirmExpandSearch = 0x3609, + DfGetJoinStatus = 0x3615, + DfGetSystemInfo = 0x3614, + DfJoin = 0x360a, + DfLeave = 0x3613, + DfProposalResponse = 0x3608, + DfReadyCheckResponse = 0x361a, + DfSetRoles = 0x3616, + DfTeleport = 0x3618, DiscardedTimeSyncAcks = 0x3a41, DismissCritter = 0x3507, - DoCountdown = 0x3715, - DoMasterLootRoll = 0x321b, - DoReadyCheck = 0x3632, + DoCountdown = 0x3716, + DoMasterLootRoll = 0x321a, + DoReadyCheck = 0x3633, DuelResponse = 0x34f0, - EjectPassenger = 0x3249, + EjectPassenger = 0x3248, Emote = 0x3554, EnableNagle = 0x376b, EnableTaxiNode = 0x34af, - EngineSurvey = 0x36df, + EngineSurvey = 0x36e0, EnterEncryptedModeAck = 0x3767, EnumCharacters = 0x35e8, - EnumCharactersDeletedByClient = 0x36d9, + EnumCharactersDeletedByClient = 0x36da, FarSight = 0x34f6, - GameEventDebugDisable = 0x31b3, - GameEventDebugEnable = 0x31b2, + GameEventDebugDisable = 0x31b2, + GameEventDebugEnable = 0x31b1, GameObjReportUse = 0x34fd, GameObjUse = 0x34fc, - GarrisonAddFollowerHealth = 0x3315, - GarrisonAssignFollowerToBuilding = 0x32fb, - GarrisonCancelConstruction = 0x32e8, - GarrisonCheckUpgradeable = 0x334a, - GarrisonCompleteMission = 0x333c, - GarrisonFullyHealAllFollowers = 0x3316, - GarrisonGenerateRecruits = 0x32fe, - GarrisonGetClassSpecCategoryInfo = 0x330d, - GarrisonGetMapData = 0x3314, + GarrisonAddFollowerHealth = 0x3314, + GarrisonAssignFollowerToBuilding = 0x32fa, + GarrisonCancelConstruction = 0x32e7, + GarrisonCheckUpgradeable = 0x3349, + GarrisonCompleteMission = 0x333b, + GarrisonFullyHealAllFollowers = 0x3315, + GarrisonGenerateRecruits = 0x32fd, + GarrisonGetClassSpecCategoryInfo = 0x330c, + GarrisonGetMapData = 0x3313, GarrisonGetMissionReward = 0x336d, - GarrisonLearnTalent = 0x3309, - GarrisonMissionBonusRoll = 0x333e, - GarrisonPurchaseBuilding = 0x32e4, - GarrisonRecruitFollower = 0x3300, - GarrisonRemoveFollower = 0x3333, - GarrisonRemoveFollowerFromBuilding = 0x32fc, - GarrisonRenameFollower = 0x32fd, - GarrisonRequestBlueprintAndSpecializationData = 0x32e3, - GarrisonRequestShipmentInfo = 0x3318, - GarrisonResearchTalent = 0x3301, - GarrisonSetBuildingActive = 0x32e5, - GarrisonSetFollowerFavorite = 0x32f9, - GarrisonSetFollowerInactive = 0x32f1, - GarrisonSetRecruitmentPreferences = 0x32ff, - GarrisonSocketTalent = 0x33ed, - GarrisonStartMission = 0x333b, - GarrisonSwapBuildings = 0x32e9, + GarrisonLearnTalent = 0x3308, + GarrisonMissionBonusRoll = 0x333d, + GarrisonPurchaseBuilding = 0x32e3, + GarrisonRecruitFollower = 0x32ff, + GarrisonRemoveFollower = 0x3332, + GarrisonRemoveFollowerFromBuilding = 0x32fb, + GarrisonRenameFollower = 0x32fc, + GarrisonRequestBlueprintAndSpecializationData = 0x32e2, + GarrisonRequestShipmentInfo = 0x3317, + GarrisonResearchTalent = 0x3300, + GarrisonSetBuildingActive = 0x32e4, + GarrisonSetFollowerFavorite = 0x32f8, + GarrisonSetFollowerInactive = 0x32f0, + GarrisonSetRecruitmentPreferences = 0x32fe, + GarrisonSocketTalent = 0x33ee, + GarrisonStartMission = 0x333a, + GarrisonSwapBuildings = 0x32e8, GenerateRandomCharacterName = 0x35e7, - GetAccountCharacterList = 0x36b2, - GetAccountNotifications = 0x3731, - GetGarrisonInfo = 0x32de, + GetAccountCharacterList = 0x36b3, + GetAccountNotifications = 0x3732, + GetGarrisonInfo = 0x32dd, GetItemPurchaseData = 0x3542, - GetLandingPageShipments = 0x3319, - GetMirrorImageData = 0x32ae, + GetLandingPageShipments = 0x3318, + GetMirrorImageData = 0x32ad, GetPvpOptionsEnabled = 0x35ee, - GetRafAccountInfo = 0x371f, - GetRemainingGameTime = 0x36e7, - GetTrophyList = 0x332c, - GetUndeleteCharacterCooldownStatus = 0x36db, - GetVasAccountCharacterList = 0x36ec, - GetVasTransferTargetRealmList = 0x36ed, - GmTicketAcknowledgeSurvey = 0x368e, - GmTicketGetCaseStatus = 0x368d, - GmTicketGetSystemStatus = 0x368c, + GetRafAccountInfo = 0x3720, + GetRemainingGameTime = 0x36e8, + GetTrophyList = 0x332b, + GetUndeleteCharacterCooldownStatus = 0x36dc, + GetVasAccountCharacterList = 0x36ed, + GetVasTransferTargetRealmList = 0x36ee, + GmTicketAcknowledgeSurvey = 0x368f, + GmTicketGetCaseStatus = 0x368e, + GmTicketGetSystemStatus = 0x368d, GossipRefreshOptions = 0x357f, GossipSelectOption = 0x349a, GuildAddBattlenetFriend = 0x308d, @@ -370,7 +369,7 @@ namespace Framework.Constants GuildGetAchievementMembers = 0x3072, GuildGetRanks = 0x306e, GuildGetRoster = 0x3074, - GuildInviteByName = 0x3606, + GuildInviteByName = 0x3607, GuildLeave = 0x3063, GuildNewsUpdateSticky = 0x306f, GuildOfficerRemoveMember = 0x3064, @@ -383,78 +382,78 @@ namespace Framework.Constants GuildReplaceGuildMaster = 0x3089, GuildSetAchievementTracking = 0x3070, GuildSetFocusedAchievement = 0x3071, - GuildSetGuildMaster = 0x36c4, + GuildSetGuildMaster = 0x36c5, GuildSetMemberNote = 0x3073, GuildSetRankPermissions = 0x3068, GuildShiftRank = 0x3067, GuildUpdateInfoText = 0x3076, GuildUpdateMotdText = 0x3075, HearthAndResurrect = 0x3515, - HideQuestChoice = 0x32be, + HideQuestChoice = 0x32bd, HotfixRequest = 0x35e5, IgnoreTrade = 0x3159, InitiateRolePoll = 0x35da, InitiateTrade = 0x3156, Inspect = 0x353c, InstanceLockResponse = 0x351a, - IslandQueue = 0x33b0, + IslandQueue = 0x33b1, ItemPurchaseRefund = 0x3543, - ItemTextQuery = 0x334b, - JoinPetBattleQueue = 0x31df, + ItemTextQuery = 0x334a, + JoinPetBattleQueue = 0x31de, JoinRatedBattleground = 0x3179, - KeepAlive = 0x367d, - KeyboundOverride = 0x322e, + KeepAlive = 0x367e, + KeyboundOverride = 0x322d, LatencyReport = 0x3771, LearnPvpTalents = 0x356b, LearnTalents = 0x3569, - LeaveGroup = 0x3647, - LeavePetBattleQueue = 0x31e0, - LfgListApplyToGroup = 0x360d, - LfgListCancelApplication = 0x360e, - LfgListDeclineApplicant = 0x360f, - LfgListGetStatus = 0x360b, - LfgListInviteApplicant = 0x3610, - LfgListInviteResponse = 0x3611, - LfgListJoin = 0x338f, - LfgListLeave = 0x360a, - LfgListSearch = 0x360c, - LfgListUpdateRequest = 0x3390, + LeaveGroup = 0x3648, + LeavePetBattleQueue = 0x31df, + LfgListApplyToGroup = 0x360e, + LfgListCancelApplication = 0x360f, + LfgListDeclineApplicant = 0x3610, + LfgListGetStatus = 0x360c, + LfgListInviteApplicant = 0x3611, + LfgListInviteResponse = 0x3612, + LfgListJoin = 0x3390, + LfgListLeave = 0x360b, + LfgListSearch = 0x360d, + LfgListUpdateRequest = 0x3391, ListInventory = 0x34a7, - LiveRegionAccountRestore = 0x36b5, - LiveRegionCharacterCopy = 0x36b4, - LiveRegionGetAccountCharacterList = 0x36b3, - LiveRegionKeyBindingsCopy = 0x36b6, + LiveRegionAccountRestore = 0x36b6, + LiveRegionCharacterCopy = 0x36b5, + LiveRegionGetAccountCharacterList = 0x36b4, + LiveRegionKeyBindingsCopy = 0x36b7, LoadingScreenNotify = 0x35f8, - LoadSelectedTrophy = 0x332d, + LoadSelectedTrophy = 0x332c, LogoutCancel = 0x34e6, LogoutInstant = 0x34e7, LogoutRequest = 0x34e4, LogDisconnect = 0x3769, LogStreamingError = 0x376d, - LootItem = 0x3219, - LootMoney = 0x3218, - LootRelease = 0x321d, - LootRoll = 0x321e, - LootUnit = 0x3217, - LowLevelRaid1 = 0x369e, + LootItem = 0x3218, + LootMoney = 0x3217, + LootRelease = 0x321c, + LootRoll = 0x321d, + LootUnit = 0x3216, + LowLevelRaid1 = 0x369f, LowLevelRaid2 = 0x3521, MailCreateTextItem = 0x354e, - MailDelete = 0x3230, + MailDelete = 0x322f, MailGetList = 0x3549, MailMarkAsRead = 0x354d, - MailReturnToSender = 0x3653, + MailReturnToSender = 0x3654, MailTakeItem = 0x354b, MailTakeMoney = 0x354a, - MakeContitionalAppearancePermanent = 0x3232, - MasterLootItem = 0x321a, + MakeContitionalAppearancePermanent = 0x3231, + MasterLootItem = 0x3219, MergeGuildBankItemWithGuildBankItem = 0x34c7, MergeGuildBankItemWithItem = 0x34c4, MergeItemWithGuildBankItem = 0x34c2, - MinimapPing = 0x3649, - MissileTrajectoryCollision = 0x318b, + MinimapPing = 0x364a, + MissileTrajectoryCollision = 0x318a, MountClearFanfare = 0x3127, - MountSetFavorite = 0x3630, - MountSpecialAnim = 0x3297, + MountSetFavorite = 0x3631, + MountSpecialAnim = 0x3296, MoveAddImpulseAck = 0x3a50, MoveApplyInertiaAck = 0x3a4e, MoveApplyMovementForceAck = 0x3a15, @@ -545,46 +544,46 @@ namespace Framework.Constants MoveUpdateFallSpeed = 0x3a1a, MoveWaterWalkAck = 0x3a1d, MythicPlusRequestMapStats = 0x308e, - NeutralPlayerSelectFaction = 0x31d5, + NeutralPlayerSelectFaction = 0x31d4, NextCinematicCamera = 0x3557, - ObjectUpdateFailed = 0x3181, - ObjectUpdateRescued = 0x3182, - OfferPetition = 0x33d7, + ObjectUpdateFailed = 0x3180, + ObjectUpdateRescued = 0x3181, + OfferPetition = 0x33d8, OpeningCinematic = 0x3556, - OpenItem = 0x334c, - OpenMissionNpc = 0x330f, - OpenShipmentNpc = 0x3317, - OpenTradeskillNpc = 0x3322, + OpenItem = 0x334b, + OpenMissionNpc = 0x330e, + OpenShipmentNpc = 0x3316, + OpenTradeskillNpc = 0x3321, OptOutOfLoot = 0x3504, OverrideScreenFlash = 0x352e, - PartyInvite = 0x3602, - PartyInviteResponse = 0x3604, - PartyUninvite = 0x3645, - PerformItemInteraction = 0x323a, + PartyInvite = 0x3603, + PartyInviteResponse = 0x3605, + PartyUninvite = 0x3646, + PerformItemInteraction = 0x3239, PerksProgramRequestPendingRewards = 0x3135, - PerksProgramRequestPurchase = 0x33ff, - PerksProgramRequestRefund = 0x3400, - PerksProgramSetFrozenVendorItem = 0x3401, - PerksProgramStatusRequest = 0x33fe, + PerksProgramRequestPurchase = 0x3401, + PerksProgramRequestRefund = 0x3402, + PerksProgramSetFrozenVendorItem = 0x3403, + PerksProgramStatusRequest = 0x3400, PetitionBuy = 0x34cf, - PetitionRenameGuild = 0x36c5, + PetitionRenameGuild = 0x36c6, PetitionShowList = 0x34ce, PetitionShowSignatures = 0x34d0, PetAbandon = 0x3493, PetAction = 0x3491, - PetBattleFinalNotify = 0x31e4, - PetBattleInput = 0x363f, - PetBattleQueueProposeMatchResult = 0x322f, - PetBattleQuitNotify = 0x31e3, - PetBattleReplaceFrontPet = 0x3640, - PetBattleRequestPvp = 0x31dd, - PetBattleRequestUpdate = 0x31de, - PetBattleRequestWild = 0x31db, - PetBattleScriptErrorNotify = 0x31e5, - PetBattleWildLocationFail = 0x31dc, + PetBattleFinalNotify = 0x31e3, + PetBattleInput = 0x3640, + PetBattleQueueProposeMatchResult = 0x322e, + PetBattleQuitNotify = 0x31e2, + PetBattleReplaceFrontPet = 0x3641, + PetBattleRequestPvp = 0x31dc, + PetBattleRequestUpdate = 0x31dd, + PetBattleRequestWild = 0x31da, + PetBattleScriptErrorNotify = 0x31e4, + PetBattleWildLocationFail = 0x31db, PetCancelAura = 0x3494, - PetCastSpell = 0x32b3, - PetRename = 0x3682, + PetCastSpell = 0x32b2, + PetRename = 0x3683, PetSetAction = 0x3490, PetSpellAutocast = 0x3495, PetStopAttack = 0x3492, @@ -592,31 +591,31 @@ namespace Framework.Constants PlayerLogin = 0x35ea, PushQuestToParty = 0x34a5, PvpLogData = 0x317c, - QueryBattlePetName = 0x328a, - QueryCorpseLocationFromClient = 0x365e, - QueryCorpseTransport = 0x365f, - QueryCountdownTimer = 0x31aa, - QueryCreature = 0x3284, - QueryGameObject = 0x3285, - QueryGarrisonPetName = 0x328b, - QueryGuildInfo = 0x3688, + QueryBattlePetName = 0x3289, + QueryCorpseLocationFromClient = 0x365f, + QueryCorpseTransport = 0x3660, + QueryCountdownTimer = 0x31a9, + QueryCreature = 0x3283, + QueryGameObject = 0x3284, + QueryGarrisonPetName = 0x328a, + QueryGuildInfo = 0x3689, QueryInspectAchievements = 0x350e, QueryNextMailTime = 0x354c, - QueryNpcText = 0x3286, - QueryPageText = 0x3288, - QueryPetition = 0x328c, - QueryPetName = 0x3289, + QueryNpcText = 0x3285, + QueryPageText = 0x3287, + QueryPetition = 0x328b, + QueryPetName = 0x3288, QueryPlayerNames = 0x3772, QueryPlayerNamesForCommunity = 0x3770, QueryPlayerNameByCommunityId = 0x376f, QueryQuestCompletionNpcs = 0x3175, - QueryQuestInfo = 0x3287, + QueryQuestInfo = 0x3286, QueryQuestItemUsability = 0x3176, - QueryRealmName = 0x3687, - QueryScenarioPoi = 0x3654, + QueryRealmName = 0x3688, + QueryScenarioPoi = 0x3655, QueryTime = 0x34e3, QueryTreasurePicker = 0x3370, - QueryVoidStorage = 0x31a3, + QueryVoidStorage = 0x31a2, QuestConfirmAccept = 0x34a4, QuestGiverAcceptQuest = 0x349e, QuestGiverChooseReward = 0x34a0, @@ -629,159 +628,158 @@ namespace Framework.Constants QuestGiverStatusQuery = 0x34a2, QuestGiverStatusTrackedQuery = 0x358f, QuestLogRemoveQuest = 0x3541, - QuestPoiQuery = 0x36ac, + QuestPoiQuery = 0x36ad, QuestPushResult = 0x34a6, - QuestSessionBeginResponse = 0x33c8, - QuestSessionRequestStart = 0x33c7, - QuestSessionRequestStop = 0x372a, + QuestSessionBeginResponse = 0x33c9, + QuestSessionRequestStart = 0x33c8, + QuestSessionRequestStop = 0x372b, QueuedMessagesEnd = 0x376c, - QuickJoinAutoAcceptRequests = 0x3702, - QuickJoinRequestInvite = 0x3701, - QuickJoinRequestInviteWithConfirmation = 0x372f, - QuickJoinRespondToInvite = 0x3700, - QuickJoinSignalToastDisplayed = 0x36ff, + QuickJoinAutoAcceptRequests = 0x3703, + QuickJoinRequestInvite = 0x3702, + QuickJoinRequestInviteWithConfirmation = 0x3730, + QuickJoinRespondToInvite = 0x3701, + QuickJoinSignalToastDisplayed = 0x3700, RafClaimActivityReward = 0x3512, - RafClaimNextReward = 0x3720, - RafGenerateRecruitmentLink = 0x3722, - RafUpdateRecruitmentInfo = 0x3721, - RandomRoll = 0x3652, - ReadyCheckResponse = 0x3633, - ReadItem = 0x334d, + RafClaimNextReward = 0x3721, + RafGenerateRecruitmentLink = 0x3723, + RafUpdateRecruitmentInfo = 0x3722, + RandomRoll = 0x3653, + ReadyCheckResponse = 0x3634, + ReadItem = 0x334c, ReclaimCorpse = 0x34e9, RemoveNewItem = 0x3373, - RemoveRafRecruit = 0x3723, + RemoveRafRecruit = 0x3724, ReorderCharacters = 0x35e9, RepairItem = 0x34fa, - ReplaceTrophy = 0x332e, + ReplaceTrophy = 0x332d, RepopRequest = 0x3539, - ReportClientVariables = 0x36fc, - ReportEnabledAddons = 0x36fb, - ReportFrozenWhileLoadingMap = 0x36a4, - ReportKeybindingExecutionCounts = 0x36fd, + ReportClientVariables = 0x36fd, + ReportEnabledAddons = 0x36fc, + ReportFrozenWhileLoadingMap = 0x36a5, + ReportKeybindingExecutionCounts = 0x36fe, ReportPvpPlayerAfk = 0x3502, - ReportServerLag = 0x33c0, - ReportStuckInCombat = 0x33c1, - RequestAccountData = 0x3692, + ReportServerLag = 0x33c1, + ReportStuckInCombat = 0x33c2, + RequestAccountData = 0x3693, RequestAreaPoiUpdate = 0x3372, RequestBattlefieldStatus = 0x35dc, - RequestCategoryCooldowns = 0x317e, RequestCemeteryList = 0x3177, - RequestCharacterGuildFollowInfo = 0x3689, - RequestConquestFormulaConstants = 0x32d0, - RequestCovenantCallings = 0x33b2, + RequestCharacterGuildFollowInfo = 0x368a, + RequestConquestFormulaConstants = 0x32cf, + RequestCovenantCallings = 0x33b3, RequestCrowdControlSpell = 0x353d, - RequestForcedReactions = 0x320e, - RequestGarrisonTalentWorldQuestUnlocks = 0x33ec, - RequestGuildPartyState = 0x31a9, - RequestGuildRewardsList = 0x31a8, - RequestLatestSplashScreen = 0x33c2, - RequestLfgListBlacklist = 0x32bf, - RequestMythicPlusAffixes = 0x3208, - RequestMythicPlusSeasonData = 0x3209, + RequestForcedReactions = 0x320d, + RequestGarrisonTalentWorldQuestUnlocks = 0x33ed, + RequestGuildPartyState = 0x31a8, + RequestGuildRewardsList = 0x31a7, + RequestLatestSplashScreen = 0x33c3, + RequestLfgListBlacklist = 0x32be, + RequestMythicPlusAffixes = 0x3207, + RequestMythicPlusSeasonData = 0x3208, RequestPartyJoinUpdates = 0x35f7, - RequestPartyMemberStats = 0x3651, + RequestPartyMemberStats = 0x3652, RequestPetInfo = 0x3496, - RequestPlayedTime = 0x328f, - RequestPvpRewards = 0x3196, - RequestRaidInfo = 0x36c6, + RequestPlayedTime = 0x328e, + RequestPvpRewards = 0x3195, + RequestRaidInfo = 0x36c7, RequestRatedPvpInfo = 0x35e3, RequestRealmGuildMasterInfo = 0x309a, RequestResearchHistory = 0x3167, - RequestScheduledPvpInfo = 0x3197, + RequestScheduledPvpInfo = 0x3196, RequestStabledPets = 0x3497, - RequestVehicleExit = 0x3244, - RequestVehicleNextSeat = 0x3246, - RequestVehiclePrevSeat = 0x3245, - RequestVehicleSwitchSeat = 0x3247, - RequestWeeklyRewards = 0x33b5, + RequestVehicleExit = 0x3243, + RequestVehicleNextSeat = 0x3245, + RequestVehiclePrevSeat = 0x3244, + RequestVehicleSwitchSeat = 0x3246, + RequestWeeklyRewards = 0x33b6, RequestWorldQuestUpdate = 0x3371, - ResetChallengeMode = 0x3206, - ResetChallengeModeCheat = 0x3207, - ResetInstances = 0x3666, - ResurrectResponse = 0x3681, - RevertMonumentAppearance = 0x3330, - RideVehicleInteract = 0x3248, - SaveAccountDataExport = 0x3741, - SaveCufProfiles = 0x318c, + ResetChallengeMode = 0x3205, + ResetChallengeModeCheat = 0x3206, + ResetInstances = 0x3667, + ResurrectResponse = 0x3682, + RevertMonumentAppearance = 0x332f, + RideVehicleInteract = 0x3247, + SaveAccountDataExport = 0x3748, + SaveCufProfiles = 0x318b, SaveEquipmentSet = 0x3518, - SaveGuildEmblem = 0x32c3, - ScenePlaybackCanceled = 0x322b, - ScenePlaybackComplete = 0x322a, - SceneTriggerEvent = 0x322c, + SaveGuildEmblem = 0x32c2, + ScenePlaybackCanceled = 0x322a, + ScenePlaybackComplete = 0x3229, + SceneTriggerEvent = 0x322b, SelfRes = 0x3544, SellItem = 0x34a8, - SendCharacterClubInvitation = 0x36f5, - SendContactList = 0x36cb, + SendCharacterClubInvitation = 0x36f6, + SendContactList = 0x36cc, SendMail = 0x35fa, SendTextEmote = 0x348e, - ServerTimeOffsetRequest = 0x3699, - SetAchievementsHidden = 0x3231, + ServerTimeOffsetRequest = 0x369a, + SetAchievementsHidden = 0x3230, SetActionBarToggles = 0x3545, - SetActionButton = 0x3634, + SetActionButton = 0x3635, SetActiveMover = 0x3a3c, - SetAdvancedCombatLogging = 0x32d1, - SetAssistantLeader = 0x364d, - SetBackpackAutosortDisabled = 0x3350, - SetBankAutosortDisabled = 0x3351, - SetContactNotes = 0x36ce, + SetAdvancedCombatLogging = 0x32d0, + SetAssistantLeader = 0x364e, + SetBackpackAutosortDisabled = 0x334f, + SetBankAutosortDisabled = 0x3350, + SetContactNotes = 0x36cf, SetCurrencyFlags = 0x3169, - SetDifficultyId = 0x322d, - SetDungeonDifficulty = 0x3680, - SetEmpowerMinHoldStagePercent = 0x327e, - SetEveryoneIsAssistant = 0x3618, - SetExcludedChatCensorSources = 0x3703, + SetDifficultyId = 0x322c, + SetDungeonDifficulty = 0x3681, + SetEmpowerMinHoldStagePercent = 0x327d, + SetEveryoneIsAssistant = 0x3619, + SetExcludedChatCensorSources = 0x3704, SetFactionAtWar = 0x34ec, SetFactionInactive = 0x34ee, SetFactionNotAtWar = 0x34ed, - SetGameEventDebugViewState = 0x31ba, - SetInsertItemsLeftToRight = 0x3353, - SetLootMethod = 0x3646, + SetGameEventDebugViewState = 0x31b9, + SetInsertItemsLeftToRight = 0x3352, + SetLootMethod = 0x3647, SetLootSpecialization = 0x3552, - SetPartyAssignment = 0x364f, - SetPartyLeader = 0x3648, + SetPartyAssignment = 0x3650, + SetPartyLeader = 0x3649, SetPetSlot = 0x3168, - SetPlayerDeclinedNames = 0x3686, + SetPlayerDeclinedNames = 0x3687, SetPreferredCemetery = 0x3178, - SetPvp = 0x32c7, - SetRaidDifficulty = 0x36d7, + SetPvp = 0x32c6, + SetRaidDifficulty = 0x36d8, SetRole = 0x35d9, - SetSavedInstanceExtend = 0x3684, + SetSavedInstanceExtend = 0x3685, SetSelection = 0x353b, SetSheathed = 0x348f, - SetSortBagsRightToLeft = 0x3352, + SetSortBagsRightToLeft = 0x3351, SetTaxiBenchmarkMode = 0x3501, - SetTitle = 0x3295, + SetTitle = 0x3294, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x3311, - SetWarMode = 0x32c8, + SetUsingPartyGarrison = 0x3310, + SetWarMode = 0x32c7, SetWatchedFaction = 0x34ef, - ShowTradeSkill = 0x36be, + ShowTradeSkill = 0x36bf, SignPetition = 0x3546, - SilencePartyTalker = 0x3650, - SocialContractRequest = 0x373c, + SilencePartyTalker = 0x3651, + SocialContractRequest = 0x3743, SocketGems = 0x34f9, - SortBags = 0x3354, - SortBankBags = 0x3355, - SortReagentBankBags = 0x3356, + SortBags = 0x3353, + SortBankBags = 0x3354, + SortReagentBankBags = 0x3355, SpellClick = 0x349b, - SpellEmpowerRelease = 0x327c, - SpellEmpowerRestart = 0x327d, + SpellEmpowerRelease = 0x327b, + SpellEmpowerRestart = 0x327c, SpiritHealerActivate = 0x34b5, SplitGuildBankItem = 0x34c8, SplitGuildBankItemToInventory = 0x34c5, SplitItem = 0x399e, SplitItemToGuildBank = 0x34c3, - StandStateChange = 0x318a, + StandStateChange = 0x3189, StartChallengeMode = 0x355e, StartSpectatorWarGame = 0x35df, StartWarGame = 0x35de, StoreGuildBankItem = 0x34be, - SubmitUserFeedback = 0x3691, - SubscriptionInterstitialResponse = 0x33e1, - SummonResponse = 0x3668, - SupportTicketSubmitComplaint = 0x3644, + SubmitUserFeedback = 0x3692, + SubscriptionInterstitialResponse = 0x33e2, + SummonResponse = 0x3669, + SupportTicketSubmitComplaint = 0x3645, SurrenderArena = 0x3174, SuspendCommsAck = 0x3764, SuspendTokenResponse = 0x376a, @@ -789,9 +787,9 @@ namespace Framework.Constants SwapInvItem = 0x399d, SwapItem = 0x399c, SwapItemWithGuildBankItem = 0x34bf, - SwapSubGroups = 0x364b, - SwapVoidItem = 0x31a5, - TabardVendorActivate = 0x32c4, + SwapSubGroups = 0x364c, + SwapVoidItem = 0x31a4, + TabardVendorActivate = 0x32c3, TalkToGossip = 0x3498, TaxiNodeStatusQuery = 0x34ae, TaxiQueryAvailableNodes = 0x34b0, @@ -800,51 +798,51 @@ namespace Framework.Constants TimeSyncResponse = 0x3a3d, TimeSyncResponseDropped = 0x3a3f, TimeSyncResponseFailed = 0x3a3e, - ToggleDifficulty = 0x3655, - TogglePvp = 0x32c6, + ToggleDifficulty = 0x3656, + TogglePvp = 0x32c5, TotemDestroyed = 0x3506, ToyClearFanfare = 0x3128, TradeSkillSetFavorite = 0x336f, TrainerBuySpell = 0x34b4, TrainerList = 0x34b3, - TraitsCommitConfig = 0x3407, - TraitsTalentTestUnlearnSpells = 0x3405, - TransmogrifyItems = 0x3198, + TraitsCommitConfig = 0x3409, + TraitsTalentTestUnlearnSpells = 0x3407, + TransmogrifyItems = 0x3197, TurnInPetition = 0x3548, - Tutorial = 0x36d8, - UiMapQuestLinesRequest = 0x33b1, + Tutorial = 0x36d9, + UiMapQuestLinesRequest = 0x33b2, UnacceptTrade = 0x315b, - UndeleteCharacter = 0x36da, + UndeleteCharacter = 0x36db, UnlearnSkill = 0x34f3, - UnlearnSpecialization = 0x31a6, - UnlockVoidStorage = 0x31a2, - UpdateAadcStatus = 0x3736, - UpdateAccountData = 0x3693, - UpdateAreaTriggerVisual = 0x32b6, - UpdateClientSettings = 0x3662, - UpdateCraftingNpcRecipes = 0x3323, + UnlearnSpecialization = 0x31a5, + UnlockVoidStorage = 0x31a1, + UpdateAadcStatus = 0x3737, + UpdateAccountData = 0x3694, + UpdateAreaTriggerVisual = 0x32b5, + UpdateClientSettings = 0x3663, + UpdateCraftingNpcRecipes = 0x3322, UpdateMissileTrajectory = 0x3a43, - UpdateRaidTarget = 0x364e, - UpdateSpellVisual = 0x32b5, - UpdateVasPurchaseStates = 0x36ef, - UpgradeGarrison = 0x32d9, - UpgradeRuneforgeLegendary = 0x33df, - UsedFollow = 0x3187, - UseCritterItem = 0x324e, + UpdateRaidTarget = 0x364f, + UpdateSpellVisual = 0x32b4, + UpdateVasPurchaseStates = 0x36f0, + UpgradeGarrison = 0x32d8, + UpgradeRuneforgeLegendary = 0x33e0, + UsedFollow = 0x3186, + UseCritterItem = 0x324d, UseEquipmentSet = 0x3995, - UseItem = 0x32af, - UseToy = 0x32b2, - VasCheckTransferOk = 0x3708, - VasGetQueueMinutes = 0x3707, - VasGetServiceStatus = 0x3706, - ViolenceLevel = 0x3185, - VoiceChannelSttTokenRequest = 0x370c, - VoiceChatJoinChannel = 0x370d, - VoiceChatLogin = 0x370b, - VoidStorageTransfer = 0x31a4, + UseItem = 0x32ae, + UseToy = 0x32b1, + VasCheckTransferOk = 0x3709, + VasGetQueueMinutes = 0x3708, + VasGetServiceStatus = 0x3707, + ViolenceLevel = 0x3184, + VoiceChannelSttTokenRequest = 0x370d, + VoiceChatJoinChannel = 0x370e, + VoiceChatLogin = 0x370c, + VoidStorageTransfer = 0x31a3, Warden3Data = 0x35ec, - Who = 0x367f, - WhoIs = 0x367e, + Who = 0x3680, + WhoIs = 0x367f, WorldPortResponse = 0x35f9, WrapItem = 0x3994, @@ -855,85 +853,89 @@ namespace Framework.Constants public enum ServerOpcodes : uint { AbortNewWorld = 0x259c, - AccountCosmeticAdded = 0x287c, - AccountCriteriaUpdate = 0x2862, - AccountDataTimes = 0x2705, + AccountCosmeticAdded = 0x287a, + AccountCriteriaUpdate = 0x2860, + AccountDataTimes = 0x2704, + AccountExportResponse = 0x28b6, AccountMountRemoved = 0x25b0, AccountMountUpdate = 0x25af, - AccountNotificationsResponse = 0x287b, + AccountNotificationsResponse = 0x2879, AccountToyUpdate = 0x25b1, AccountTransmogSetFavoritesUpdate = 0x25b4, AccountTransmogUpdate = 0x25b3, - AchievementDeleted = 0x26e3, - AchievementEarned = 0x2641, + AchievementDeleted = 0x26e2, + AchievementEarned = 0x2640, ActivateEssenceFailed = 0x3015, ActivateSoulbindFailed = 0x3017, - ActivateTaxiReply = 0x267b, - ActiveGlyphs = 0x2c57, - AddonListRequest = 0x2640, - AddBattlenetFriendResponse = 0x263b, + ActivateTaxiReply = 0x267a, + ActiveGlyphs = 0x2c54, + ActiveScheduledWorldStateInfo = 0x2740, + AddonListRequest = 0x263f, + AddBattlenetFriendResponse = 0x263a, AddItemPassive = 0x25ab, - AddLossOfControl = 0x266f, - AddRunePower = 0x26b5, + AddLossOfControl = 0x266e, + AddRunePower = 0x26b4, AdjustSplineDuration = 0x25d0, - AdvancedCombatLog = 0x2878, - AdventureJournalDataResponse = 0x2872, - AeLootTargets = 0x2616, - AeLootTargetAck = 0x2617, - AiReaction = 0x26b2, - AlliedRaceDetails = 0x27f6, + AdvancedCombatLog = 0x2876, + AdventureJournalDataResponse = 0x2870, + AeLootTargets = 0x2615, + AeLootTargetAck = 0x2616, + AiReaction = 0x26b1, + AlliedRaceDetails = 0x27f4, AllAccountCriteria = 0x2571, AllAchievementData = 0x2570, AllGuildAchievements = 0x29b8, - ApplyMountEquipmentResult = 0x284f, + ApplyMountEquipmentResult = 0x284d, ArchaeologySurveryCast = 0x2588, AreaPoiUpdateResponse = 0x3010, - AreaSpiritHealerTime = 0x273a, - AreaTriggerDenied = 0x2902, - AreaTriggerForceSetPositionAndFacing = 0x28ff, - AreaTriggerNoCorpse = 0x2711, + AreaSpiritHealerTime = 0x2739, + AreaTriggerDenied = 0x2903, + AreaTriggerForceSetPositionAndFacing = 0x2900, + AreaTriggerNoCorpse = 0x2710, AreaTriggerPlaySpellVisual = 0x28fe, AreaTriggerRePath = 0x28fd, - AreaTriggerReShape = 0x2901, - AreaTriggerUnattach = 0x2900, - ArenaClearOpponents = 0x2647, - ArenaCrowdControlSpellResult = 0x2630, - ArenaPrepOpponentSpecializations = 0x2646, - ArtifactEndgamePowersRefunded = 0x27a0, - ArtifactForgeError = 0x279e, - ArtifactRespecPrompt = 0x279f, - ArtifactXpGain = 0x27e9, + AreaTriggerReShape = 0x2902, + AreaTriggerUnattach = 0x2901, + AreaTriggerUpdateDecalProperties = 0x28ff, + ArenaClearOpponents = 0x2646, + ArenaCrowdControlSpellResult = 0x262f, + ArenaPrepOpponentSpecializations = 0x2645, + ArtifactEndgamePowersRefunded = 0x279e, + ArtifactForgeError = 0x279c, + ArtifactRespecPrompt = 0x279d, + ArtifactXpGain = 0x27e7, AttackerStateUpdate = 0x294d, AttackStart = 0x2938, AttackStop = 0x2939, AttackSwingError = 0x2947, AttackSwingLandedLog = 0x2948, - AuctionableTokenAuctionSold = 0x27d2, - AuctionableTokenSellAtMarketPriceResponse = 0x27d1, - AuctionableTokenSellConfirmRequired = 0x27d0, - AuctionClosedNotification = 0x26ee, - AuctionCommandResult = 0x26eb, - AuctionDisableNewPostings = 0x2895, - AuctionFavoriteList = 0x2869, - AuctionGetCommodityQuoteResult = 0x2860, - AuctionHelloResponse = 0x26e9, - AuctionListBiddedItemsResult = 0x285f, - AuctionListBucketsResult = 0x285c, - AuctionListItemsResult = 0x285d, - AuctionListOwnedItemsResult = 0x285e, - AuctionOutbidNotification = 0x26ed, - AuctionOwnerBidNotification = 0x26ef, - AuctionReplicateResponse = 0x26ea, - AuctionWonNotification = 0x26ec, - AuraPointsDepleted = 0x2c23, - AuraUpdate = 0x2c22, + AuctionableTokenAuctionSold = 0x27d0, + AuctionableTokenSellAtMarketPriceResponse = 0x27cf, + AuctionableTokenSellConfirmRequired = 0x27ce, + AuctionClosedNotification = 0x26ed, + AuctionCommandResult = 0x26ea, + AuctionDisableNewPostings = 0x2896, + AuctionFavoriteList = 0x2867, + AuctionGetCommodityQuoteResult = 0x285e, + AuctionHelloResponse = 0x26e8, + AuctionListBiddedItemsResult = 0x285d, + AuctionListBucketsResult = 0x285a, + AuctionListItemsResult = 0x285b, + AuctionListOwnedItemsResult = 0x285c, + AuctionOutbidNotification = 0x26ec, + AuctionOwnerBidNotification = 0x26ee, + AuctionReplicateResponse = 0x26e9, + AuctionWonNotification = 0x26eb, + AuraPointsDepleted = 0x2c20, + AuraUpdate = 0x2c1f, AuthChallenge = 0x3048, AuthFailed = 0x256c, AuthResponse = 0x256d, AvailableHotfixes = 0x290f, + BackpackDefaultSizeChanged = 0x289b, BagCleanupFinished = 0x2da7, - BarberShopResult = 0x26ba, - BatchPresenceSubscription = 0x2840, + BarberShopResult = 0x26b9, + BatchPresenceSubscription = 0x283e, BattlefieldList = 0x2927, BattlefieldPortDenied = 0x292d, BattlefieldStatusActive = 0x2923, @@ -949,112 +951,110 @@ namespace Framework.Constants BattlegroundPlayerLeft = 0x292c, BattlegroundPlayerPositions = 0x2928, BattlegroundPoints = 0x2949, - BattlenetChallengeAbort = 0x2785, - BattlenetChallengeStart = 0x2784, - BattlenetNotification = 0x2802, - BattlenetResponse = 0x2801, - BattleNetConnectionStatus = 0x2803, - BattlePayAckFailed = 0x277f, - BattlePayBattlePetDelivered = 0x2774, - BattlePayCollectionItemDelivered = 0x2775, - BattlePayConfirmPurchase = 0x277e, - BattlePayDeliveryEnded = 0x2772, - BattlePayDeliveryStarted = 0x2771, - BattlePayDistributionAssignVasResponse = 0x2881, - BattlePayDistributionUnrevoked = 0x276f, - BattlePayDistributionUpdate = 0x2770, - BattlePayGetDistributionListResponse = 0x276e, - BattlePayGetProductListResponse = 0x276c, - BattlePayGetPurchaseListResponse = 0x276d, - BattlePayMountDelivered = 0x2773, - BattlePayPurchaseUpdate = 0x277d, - BattlePayStartCheckout = 0x281e, - BattlePayStartDistributionAssignToTargetResponse = 0x277b, - BattlePayStartPurchaseResponse = 0x277a, - BattlePayValidatePurchaseResponse = 0x2812, + BattlenetChallengeAbort = 0x2783, + BattlenetChallengeStart = 0x2782, + BattlenetNotification = 0x2800, + BattlenetResponse = 0x27ff, + BattleNetConnectionStatus = 0x2801, + BattlePayAckFailed = 0x277d, + BattlePayBattlePetDelivered = 0x2772, + BattlePayCollectionItemDelivered = 0x2773, + BattlePayConfirmPurchase = 0x277c, + BattlePayDeliveryEnded = 0x2770, + BattlePayDeliveryStarted = 0x276f, + BattlePayDistributionAssignVasResponse = 0x287f, + BattlePayDistributionUnrevoked = 0x276d, + BattlePayDistributionUpdate = 0x276e, + BattlePayGetDistributionListResponse = 0x276c, + BattlePayGetProductListResponse = 0x276a, + BattlePayGetPurchaseListResponse = 0x276b, + BattlePayMountDelivered = 0x2771, + BattlePayPurchaseUpdate = 0x277b, + BattlePayStartCheckout = 0x281c, + BattlePayStartDistributionAssignToTargetResponse = 0x2779, + BattlePayStartPurchaseResponse = 0x2778, + BattlePayValidatePurchaseResponse = 0x2810, BattlePetsHealed = 0x25f2, - BattlePetCageDateError = 0x2676, + BattlePetCageDateError = 0x2675, BattlePetDeleted = 0x25ef, - BattlePetError = 0x2636, + BattlePetError = 0x2635, BattlePetJournal = 0x25ee, BattlePetJournalLockAcquired = 0x25ec, BattlePetJournalLockDenied = 0x25ed, - BattlePetLicenseChanged = 0x25f3, BattlePetRestored = 0x25f1, BattlePetRevoked = 0x25f0, BattlePetTrapLevel = 0x25ea, BattlePetUpdates = 0x25e9, BindPointUpdate = 0x257d, - BlackMarketBidOnItemResult = 0x2626, - BlackMarketOutbid = 0x2627, - BlackMarketRequestItemsResult = 0x2625, - BlackMarketWon = 0x2628, - BonusRollEmpty = 0x2643, + BlackMarketBidOnItemResult = 0x2625, + BlackMarketOutbid = 0x2626, + BlackMarketRequestItemsResult = 0x2624, + BlackMarketWon = 0x2627, + BonusRollEmpty = 0x2642, BossKill = 0x294c, BreakTarget = 0x2937, BroadcastAchievement = 0x2bbc, - BroadcastSummonCast = 0x2842, - BroadcastSummonResponse = 0x2843, - BuyFailed = 0x26c3, - BuySucceeded = 0x26c2, + BroadcastSummonCast = 0x2840, + BroadcastSummonResponse = 0x2841, + BuyFailed = 0x26c2, + BuySucceeded = 0x26c1, CacheInfo = 0x291d, CacheVersion = 0x291c, - CalendarClearPendingAction = 0x269b, - CalendarCommandResult = 0x269c, - CalendarCommunityInvite = 0x268b, - CalendarEventRemovedAlert = 0x2693, - CalendarEventUpdatedAlert = 0x2694, - CalendarInviteAdded = 0x268c, - CalendarInviteAlert = 0x2690, - CalendarInviteNotes = 0x2695, - CalendarInviteNotesAlert = 0x2696, - CalendarInviteRemoved = 0x268d, - CalendarInviteRemovedAlert = 0x2692, - CalendarInviteStatus = 0x268e, - CalendarInviteStatusAlert = 0x2691, - CalendarModeratorStatus = 0x268f, - CalendarRaidLockoutAdded = 0x2697, - CalendarRaidLockoutRemoved = 0x2698, - CalendarRaidLockoutUpdated = 0x2699, - CalendarSendCalendar = 0x2689, - CalendarSendEvent = 0x268a, - CalendarSendNumPending = 0x269a, - CameraEffect = 0x2720, - CancelAutoRepeat = 0x26d9, + CalendarClearPendingAction = 0x269a, + CalendarCommandResult = 0x269b, + CalendarCommunityInvite = 0x268a, + CalendarEventRemovedAlert = 0x2692, + CalendarEventUpdatedAlert = 0x2693, + CalendarInviteAdded = 0x268b, + CalendarInviteAlert = 0x268f, + CalendarInviteNotes = 0x2694, + CalendarInviteNotesAlert = 0x2695, + CalendarInviteRemoved = 0x268c, + CalendarInviteRemovedAlert = 0x2691, + CalendarInviteStatus = 0x268d, + CalendarInviteStatusAlert = 0x2690, + CalendarModeratorStatus = 0x268e, + CalendarRaidLockoutAdded = 0x2696, + CalendarRaidLockoutRemoved = 0x2697, + CalendarRaidLockoutUpdated = 0x2698, + CalendarSendCalendar = 0x2688, + CalendarSendEvent = 0x2689, + CalendarSendNumPending = 0x2699, + CameraEffect = 0x271f, + CancelAutoRepeat = 0x26d8, CancelCombat = 0x2946, - CancelOrphanSpellVisual = 0x2c49, + CancelOrphanSpellVisual = 0x2c46, CancelPreloadWorld = 0x259a, - CancelScene = 0x2635, - CancelSpellVisual = 0x2c47, - CancelSpellVisualKit = 0x2c4b, + CancelScene = 0x2634, + CancelSpellVisual = 0x2c44, + CancelSpellVisualKit = 0x2c48, CanDuelResult = 0x2942, - CanRedeemTokenForBalanceResponse = 0x2811, + CanRedeemTokenForBalanceResponse = 0x280f, CapturePointRemoved = 0x292a, - CastFailed = 0x2c5a, - CategoryCooldown = 0x2c16, + CastFailed = 0x2c57, ChainMissileBounce = 0x25c8, - ChallengeModeComplete = 0x260a, - ChallengeModeRequestLeadersResult = 0x260e, - ChallengeModeReset = 0x2609, - ChallengeModeStart = 0x2607, - ChallengeModeUpdateDeathCount = 0x2608, + ChallengeModeComplete = 0x2609, + ChallengeModeRequestLeadersResult = 0x260d, + ChallengeModeReset = 0x2608, + ChallengeModeStart = 0x2606, + ChallengeModeUpdateDeathCount = 0x2607, ChangePlayerDifficultyResult = 0x3004, - ChangeRealmTicketResponse = 0x2804, + ChangeRealmTicketResponse = 0x2802, ChannelList = 0x2bc3, ChannelNotify = 0x2bc0, ChannelNotifyJoined = 0x2bc1, ChannelNotifyLeft = 0x2bc2, - CharacterCheckUpgradeResult = 0x27bb, - CharacterLoginFailed = 0x2700, - CharacterObjectTestResponse = 0x2783, - CharacterRenameResult = 0x275e, - CharacterUpgradeAborted = 0x27ba, - CharacterUpgradeComplete = 0x27b9, - CharacterUpgradeManualUnrevokeResult = 0x27bc, - CharacterUpgradeStarted = 0x27b8, - CharCustomizeFailure = 0x26dd, - CharCustomizeSuccess = 0x26de, - CharFactionChangeResult = 0x27a5, + CharacterCheckUpgradeResult = 0x27b9, + CharacterLoginFailed = 0x26ff, + CharacterObjectTestResponse = 0x2781, + CharacterRenameResult = 0x275c, + CharacterUpgradeAborted = 0x27b8, + CharacterUpgradeComplete = 0x27b7, + CharacterUpgradeManualUnrevokeResult = 0x27ba, + CharacterUpgradeStarted = 0x27b6, + CharCustomizeFailure = 0x26dc, + CharCustomizeSuccess = 0x26dd, + CharFactionChangeResult = 0x27a3, Chat = 0x2bad, ChatAutoResponded = 0x2bb8, ChatCanLocalWhisperTargetResponse = 0x2bca, @@ -1072,95 +1072,95 @@ namespace Framework.Constants CheckAbandonNpe = 0x3018, CheckCharacterNameAvailabilityResult = 0x2584, CheckWargameEntry = 0x2592, - ChromieTimeSelectExpansionSuccess = 0x286c, - ClaimRafRewardResponse = 0x2853, - ClearAllSpellCharges = 0x2c27, + ChromieTimeSelectExpansionSuccess = 0x286a, + ClaimRafRewardResponse = 0x2851, + ClearAllSpellCharges = 0x2c24, ClearBossEmotes = 0x25bb, - ClearCooldown = 0x26b7, - ClearCooldowns = 0x2c26, + ClearCooldown = 0x26b6, + ClearCooldowns = 0x2c23, ClearResurrect = 0x257f, - ClearSpellCharges = 0x2c28, + ClearSpellCharges = 0x2c25, ClearTarget = 0x2943, ClearTreasurePickerCache = 0x2aa1, - CloseArtifactForge = 0x279d, - ClubFinderErrorMessage = 0x284b, - ClubFinderGetClubPostingIdsResponse = 0x284e, - ClubFinderLookupClubPostingsList = 0x284c, - ClubFinderResponseCharacterApplicationList = 0x2849, - ClubFinderResponsePostRecruitmentMessage = 0x284d, - ClubFinderUpdateApplications = 0x284a, - ClubFinderWhisperApplicantResponse = 0x288f, - CoinRemoved = 0x2615, + CloseArtifactForge = 0x279b, + ClubFinderErrorMessage = 0x2849, + ClubFinderGetClubPostingIdsResponse = 0x284c, + ClubFinderLookupClubPostingsList = 0x284a, + ClubFinderResponseCharacterApplicationList = 0x2847, + ClubFinderResponsePostRecruitmentMessage = 0x284b, + ClubFinderUpdateApplications = 0x2848, + ClubFinderWhisperApplicantResponse = 0x288d, + CoinRemoved = 0x2614, CombatEventFailed = 0x293a, - CommentatorMapInfo = 0x2702, - CommentatorPlayerInfo = 0x2703, - CommentatorStateChanged = 0x2701, - CommerceTokenGetCountResponse = 0x27cd, - CommerceTokenGetLogResponse = 0x27d9, - CommerceTokenGetMarketPriceResponse = 0x27cf, - CommerceTokenUpdate = 0x27ce, - ComplaintResult = 0x26a9, - CompleteShipmentResponse = 0x2796, - ConfirmPartyInvite = 0x2810, + CommentatorMapInfo = 0x2701, + CommentatorPlayerInfo = 0x2702, + CommentatorStateChanged = 0x2700, + CommerceTokenGetCountResponse = 0x27cb, + CommerceTokenGetLogResponse = 0x27d7, + CommerceTokenGetMarketPriceResponse = 0x27cd, + CommerceTokenUpdate = 0x27cc, + ComplaintResult = 0x26a8, + CompleteShipmentResponse = 0x2794, + ConfirmPartyInvite = 0x280e, ConnectTo = 0x304d, - ConquestFormulaConstants = 0x2780, - ConsoleWrite = 0x2633, - ConsumableTokenBuyAtMarketPriceResponse = 0x27d5, - ConsumableTokenBuyChoiceRequired = 0x27d4, - ConsumableTokenCanVeteranBuyResponse = 0x27d3, - ConsumableTokenRedeemConfirmRequired = 0x27d7, - ConsumableTokenRedeemResponse = 0x27d8, - ContactList = 0x2781, - ContributionLastUpdateResponse = 0x2817, - ControlUpdate = 0x2645, - ConvertItemsToCurrencyValue = 0x2875, - CooldownCheat = 0x2733, - CooldownEvent = 0x26b6, - CorpseLocation = 0x264d, - CorpseReclaimDelay = 0x2745, - CorpseTransportQuery = 0x270d, + ConquestFormulaConstants = 0x277e, + ConsoleWrite = 0x2632, + ConsumableTokenBuyAtMarketPriceResponse = 0x27d3, + ConsumableTokenBuyChoiceRequired = 0x27d2, + ConsumableTokenCanVeteranBuyResponse = 0x27d1, + ConsumableTokenRedeemConfirmRequired = 0x27d5, + ConsumableTokenRedeemResponse = 0x27d6, + ContactList = 0x277f, + ContributionLastUpdateResponse = 0x2815, + ControlUpdate = 0x2644, + ConvertItemsToCurrencyValue = 0x2873, + CooldownCheat = 0x2732, + CooldownEvent = 0x26b5, + CorpseLocation = 0x264c, + CorpseReclaimDelay = 0x2743, + CorpseTransportQuery = 0x270c, CovenantCallingsAvailabilityResponse = 0x2aa3, - CovenantPreviewOpenNpc = 0x27f9, - CovenantRenownSendCatchupState = 0x2876, - CraftingHouseHelloResponse = 0x28a6, - CraftingOrderCancelResult = 0x28a2, - CraftingOrderClaimResult = 0x289e, - CraftingOrderCraftResult = 0x28a0, - CraftingOrderCreateResult = 0x289c, - CraftingOrderFulfillResult = 0x28a1, - CraftingOrderListOrdersResponse = 0x289d, - CraftingOrderRejectResult = 0x28a4, - CraftingOrderReleaseResult = 0x289f, - CraftingOrderUpdateState = 0x28a7, - CraftEnchantResult = 0x28a5, - CreateChar = 0x26fc, - CreateShipmentResponse = 0x2795, - CreatorVisualsOverride = 0x28aa, - CriteriaDeleted = 0x26e2, - CriteriaUpdate = 0x26dc, - CrossedInebriationThreshold = 0x26be, + CovenantPreviewOpenNpc = 0x27f7, + CovenantRenownSendCatchupState = 0x2874, + CraftingHouseHelloResponse = 0x28a9, + CraftingOrderCancelResult = 0x28a5, + CraftingOrderClaimResult = 0x28a1, + CraftingOrderCraftResult = 0x28a3, + CraftingOrderCreateResult = 0x289f, + CraftingOrderFulfillResult = 0x28a4, + CraftingOrderListOrdersResponse = 0x28a0, + CraftingOrderRejectResult = 0x28a7, + CraftingOrderReleaseResult = 0x28a2, + CraftingOrderUpdateState = 0x28aa, + CraftEnchantResult = 0x28a8, + CreateChar = 0x26fb, + CreateShipmentResponse = 0x2793, + CreatorVisualsOverride = 0x28ad, + CriteriaDeleted = 0x26e1, + CriteriaUpdate = 0x26db, + CrossedInebriationThreshold = 0x26bd, CustomLoadScreen = 0x25cb, DailyQuestsReset = 0x2a80, - DamageCalcLog = 0x27c2, + DamageCalcLog = 0x27c0, DbReply = 0x290e, - DeathReleaseLoc = 0x26cf, - DebugMenuManagerFullUpdate = 0x2653, + DeathReleaseLoc = 0x26ce, + DebugMenuManagerFullUpdate = 0x2652, DefenseMessage = 0x2bb6, - DeleteChar = 0x26fd, + DeleteChar = 0x26fc, DeleteExpiredMissionsResult = 0x2980, - DestroyArenaUnit = 0x273c, - DestructibleBuildingDamage = 0x26f4, + DestroyArenaUnit = 0x273b, + DestructibleBuildingDamage = 0x26f3, DifferentInstanceFromParty = 0x258c, DisenchantCredit = 0x25a8, DismountResult = 0x257c, - DispelFailed = 0x2c30, + DispelFailed = 0x2c2d, DisplayGameError = 0x25a1, DisplayPlayerChoice = 0x2ffc, - DisplayPromotion = 0x264a, + DisplayPromotion = 0x2649, DisplayQuestPopup = 0x2a9e, - DisplaySoulbindUpdateMessage = 0x287a, - DisplayToast = 0x2622, - DisplayWorldText = 0x27ea, + DisplaySoulbindUpdateMessage = 0x2878, + DisplayToast = 0x2621, + DisplayWorldText = 0x27e8, DontAutoPushSpellsToActionBar = 0x25e0, DropNewConnection = 0x304c, DuelArranged = 0x293c, @@ -1170,50 +1170,50 @@ namespace Framework.Constants DuelOutOfBounds = 0x293d, DuelRequested = 0x293b, DuelWinner = 0x2941, - DurabilityDamageDeath = 0x2740, - Emote = 0x27c3, - EnableBarberShop = 0x26b9, - EnchantmentLog = 0x270e, - EncounterEnd = 0x2779, - EncounterStart = 0x2778, - EndLightningStorm = 0x26a6, - EnsureWorldLoaded = 0x2889, + DurabilityDamageDeath = 0x273e, + Emote = 0x27c1, + EnableBarberShop = 0x26b8, + EnchantmentLog = 0x270d, + EncounterEnd = 0x2777, + EncounterStart = 0x2776, + EndLightningStorm = 0x26a5, + EnsureWorldLoaded = 0x2887, EnterEncryptedMode = 0x3049, EnumCharactersResult = 0x2583, - EnumVasPurchaseStatesResponse = 0x27ef, - EnvironmentalDamageLog = 0x2c21, - EquipmentSetId = 0x26af, + EnumVasPurchaseStatesResponse = 0x27ed, + EnvironmentalDamageLog = 0x2c1e, + EquipmentSetId = 0x26ae, ExpectedSpamRecords = 0x2bb1, - ExplorationExperience = 0x275a, - ExternalTransactionIdGenerated = 0x2873, - FactionBonusInfo = 0x271f, + ExplorationExperience = 0x2758, + ExternalTransactionIdGenerated = 0x2871, + FactionBonusInfo = 0x271e, FailedPlayerCondition = 0x2ffa, - FailedQuestTurnIn = 0x280d, + FailedQuestTurnIn = 0x280b, FeatureSystemStatus = 0x25bf, FeatureSystemStatusGlueScreen = 0x25c0, - FeignDeathResisted = 0x273f, - FishEscaped = 0x26cc, - FishNotHooked = 0x26cb, + FeignDeathResisted = 0x273d, + FishEscaped = 0x26cb, + FishNotHooked = 0x26ca, FlightSplineSync = 0x2e2b, - ForcedDeathUpdate = 0x26d0, - ForceAnim = 0x274c, - ForceAnimations = 0x274d, - ForceObjectRelink = 0x2649, - FriendStatus = 0x2782, - GainMawPower = 0x27de, + ForcedDeathUpdate = 0x26cf, + ForceAnim = 0x274a, + ForceAnimations = 0x274b, + ForceObjectRelink = 0x2648, + FriendStatus = 0x2780, + GainMawPower = 0x27dc, GameObjectActivateAnimKit = 0x25c3, - GameObjectBase = 0x2824, - GameObjectCloseInteraction = 0x288d, + GameObjectBase = 0x2822, + GameObjectCloseInteraction = 0x288b, GameObjectCustomAnim = 0x25c4, GameObjectDespawn = 0x25c5, - GameObjectInteraction = 0x288c, - GameObjectPlaySpellVisual = 0x2c4e, - GameObjectPlaySpellVisualKit = 0x2c4d, - GameObjectResetState = 0x2719, - GameObjectSetStateLocal = 0x2800, - GameSpeedSet = 0x267f, - GameTimeSet = 0x2707, - GameTimeUpdate = 0x2706, + GameObjectInteraction = 0x288a, + GameObjectPlaySpellVisual = 0x2c4b, + GameObjectPlaySpellVisualKit = 0x2c4a, + GameObjectResetState = 0x2718, + GameObjectSetStateLocal = 0x27fe, + GameSpeedSet = 0x267e, + GameTimeSet = 0x2706, + GameTimeUpdate = 0x2705, GarrisonActivateMissionBonusAbility = 0x2982, GarrisonAddEvent = 0x29a6, GarrisonAddFollowerResult = 0x2974, @@ -1285,35 +1285,35 @@ namespace Framework.Constants GarrisonUpgradeResult = 0x296b, GarrisonUseRecallPortalResult = 0x297d, GenerateRandomCharacterNameResult = 0x2585, - GenerateSsoTokenResponse = 0x2818, - GetAccountCharacterListResult = 0x275c, + GenerateSsoTokenResponse = 0x2816, + GetAccountCharacterListResult = 0x275a, GetGarrisonInfoResult = 0x295e, - GetLandingPageShipmentsResponse = 0x2798, - GetRemainingGameTimeResponse = 0x27d6, - GetSelectedTrophyIdResponse = 0x27c0, - GetShipmentsOfTypeResponse = 0x2797, - GetShipmentInfoResponse = 0x2793, - GetTrophyListResponse = 0x27bf, - GetVasAccountCharacterListResult = 0x27eb, - GetVasTransferTargetRealmListResult = 0x27ec, + GetLandingPageShipmentsResponse = 0x2796, + GetRemainingGameTimeResponse = 0x27d4, + GetSelectedTrophyIdResponse = 0x27be, + GetShipmentsOfTypeResponse = 0x2795, + GetShipmentInfoResponse = 0x2791, + GetTrophyListResponse = 0x27bd, + GetVasAccountCharacterListResult = 0x27e9, + GetVasTransferTargetRealmListResult = 0x27ea, GmPlayerInfo = 0x3005, GmRequestPlayerInfo = 0x2ffb, - GmTicketCaseStatus = 0x26a1, - GmTicketSystemStatus = 0x26a0, - GodMode = 0x26f7, + GmTicketCaseStatus = 0x26a0, + GmTicketSystemStatus = 0x269f, + GodMode = 0x26f6, GossipComplete = 0x2a97, GossipMessage = 0x2a98, GossipOptionNpcInteraction = 0x2aa7, - GossipPoi = 0x2790, + GossipPoi = 0x278e, GossipQuestUpdate = 0x2a99, GossipRefreshOptions = 0x2aa6, GroupActionThrottled = 0x2590, - GroupAutoKick = 0x278d, - GroupDecline = 0x2789, - GroupDestroyed = 0x278c, - GroupNewLeader = 0x262b, - GroupRequestDecline = 0x278a, - GroupUninvite = 0x278b, + GroupAutoKick = 0x278b, + GroupDecline = 0x2787, + GroupDestroyed = 0x278a, + GroupNewLeader = 0x262a, + GroupRequestDecline = 0x2788, + GroupUninvite = 0x2789, GuildAchievementDeleted = 0x29c5, GuildAchievementEarned = 0x29c4, GuildAchievementMembers = 0x29c7, @@ -1367,59 +1367,59 @@ namespace Framework.Constants GuildRoster = 0x29bb, GuildRosterUpdate = 0x29bc, GuildSendRankChange = 0x29b9, - HealthUpdate = 0x26cd, - HighestThreatUpdate = 0x26d5, + HealthUpdate = 0x26cc, + HighestThreatUpdate = 0x26d4, HotfixConnect = 0x2911, HotfixMessage = 0x2910, - InitializeFactions = 0x271e, + InitializeFactions = 0x271d, InitialSetup = 0x2580, - InitWorldStates = 0x2741, - InspectResult = 0x262f, - InstanceEncounterChangePriority = 0x27ab, - InstanceEncounterDisengageUnit = 0x27aa, - InstanceEncounterEnd = 0x27b3, - InstanceEncounterEngageUnit = 0x27a9, - InstanceEncounterGainCombatResurrectionCharge = 0x27b5, - InstanceEncounterInCombatResurrection = 0x27b4, - InstanceEncounterObjectiveComplete = 0x27ae, - InstanceEncounterObjectiveStart = 0x27ad, - InstanceEncounterObjectiveUpdate = 0x27b2, - InstanceEncounterPhaseShiftChanged = 0x27b6, - InstanceEncounterStart = 0x27af, - InstanceEncounterTimerStart = 0x27ac, - InstanceEncounterUpdateAllowReleaseInProgress = 0x27b1, - InstanceEncounterUpdateSuppressRelease = 0x27b0, - InstanceGroupSizeChanged = 0x26f5, - InstanceInfo = 0x2632, - InstanceReset = 0x2684, - InstanceResetFailed = 0x2685, - InstanceSaveCreated = 0x2777, - InterruptPowerRegen = 0x2c5c, + InitWorldStates = 0x273f, + InspectResult = 0x262e, + InstanceEncounterChangePriority = 0x27a9, + InstanceEncounterDisengageUnit = 0x27a8, + InstanceEncounterEnd = 0x27b1, + InstanceEncounterEngageUnit = 0x27a7, + InstanceEncounterGainCombatResurrectionCharge = 0x27b3, + InstanceEncounterInCombatResurrection = 0x27b2, + InstanceEncounterObjectiveComplete = 0x27ac, + InstanceEncounterObjectiveStart = 0x27ab, + InstanceEncounterObjectiveUpdate = 0x27b0, + InstanceEncounterPhaseShiftChanged = 0x27b4, + InstanceEncounterStart = 0x27ad, + InstanceEncounterTimerStart = 0x27aa, + InstanceEncounterUpdateAllowReleaseInProgress = 0x27af, + InstanceEncounterUpdateSuppressRelease = 0x27ae, + InstanceGroupSizeChanged = 0x26f4, + InstanceInfo = 0x2631, + InstanceReset = 0x2683, + InstanceResetFailed = 0x2684, + InstanceSaveCreated = 0x2775, + InterruptPowerRegen = 0x2c59, InvalidatePageText = 0x2918, InvalidatePlayer = 0x2fff, - InvalidPromotionCode = 0x274e, + InvalidPromotionCode = 0x274c, InventoryChangeFailure = 0x2da5, - InventoryFixupComplete = 0x280f, - InventoryFullOverflow = 0x2820, - IslandAzeriteGain = 0x2757, - IslandComplete = 0x2758, + InventoryFixupComplete = 0x280d, + InventoryFullOverflow = 0x281e, + IslandAzeriteGain = 0x2755, + IslandComplete = 0x2756, IsQuestCompleteResponse = 0x2a84, - ItemChanged = 0x26e6, - ItemCooldown = 0x27c1, - ItemEnchantTimeUpdate = 0x2750, + ItemChanged = 0x26e5, + ItemCooldown = 0x27bf, + ItemEnchantTimeUpdate = 0x274e, ItemExpirePurchaseRefund = 0x25a0, - ItemInteractionComplete = 0x286b, + ItemInteractionComplete = 0x2869, ItemPurchaseRefundResult = 0x259e, - ItemPushResult = 0x2621, - ItemTimeUpdate = 0x274f, - KickReason = 0x2687, - LatencyReportPing = 0x287d, - LearnedSpells = 0x2c50, + ItemPushResult = 0x2620, + ItemTimeUpdate = 0x274d, + KickReason = 0x2686, + LatencyReportPing = 0x287b, + LearnedSpells = 0x2c4d, LearnPvpTalentFailed = 0x25d4, LearnTalentFailed = 0x25d3, - LegacyLootRules = 0x2825, - LevelLinkingResult = 0x2851, - LevelUpInfo = 0x26e4, + LegacyLootRules = 0x2823, + LevelLinkingResult = 0x284f, + LevelUpInfo = 0x26e3, LfgBootPlayer = 0x2a35, LfgDisabled = 0x2a33, LfgExpandSearchPrompt = 0x2a3b, @@ -1447,46 +1447,48 @@ namespace Framework.Constants LfgSlotInvalid = 0x2a30, LfgTeleportDenied = 0x2a32, LfgUpdateStatus = 0x2a24, - LiveRegionAccountRestoreResult = 0x2769, - LiveRegionCharacterCopyResult = 0x2768, - LiveRegionGetAccountCharacterListResult = 0x275d, - LiveRegionKeyBindingsCopyResult = 0x276a, + LiveRegionAccountRestoreResult = 0x2767, + LiveRegionCharacterCopyResult = 0x2766, + LiveRegionGetAccountCharacterListResult = 0x275b, + LiveRegionKeyBindingsCopyResult = 0x2768, LoadCufProfiles = 0x25bc, - LoadEquipmentSet = 0x2709, - LobbyMatchmakerPartyInfo = 0x2891, - LoginSetTimeSpeed = 0x2708, + LoadEquipmentSet = 0x2708, + LobbyMatchmakerPartyInfo = 0x288f, + LobbyMatchmakerPartyInviteRejected = 0x2890, + LobbyMatchmakerReceiveInvite = 0x2891, + LoginSetTimeSpeed = 0x2707, LoginVerifyWorld = 0x259b, - LogoutCancelAck = 0x2683, - LogoutComplete = 0x2682, - LogoutResponse = 0x2681, - LogXpGain = 0x26e0, - LootAllPassed = 0x261f, - LootList = 0x273b, - LootMoneyNotify = 0x261a, - LootRelease = 0x2619, - LootReleaseAll = 0x2618, - LootRemoved = 0x2614, - LootResponse = 0x2613, - LootRoll = 0x261c, - LootRollsComplete = 0x261e, - LootRollWon = 0x2620, - LossOfControlAuraUpdate = 0x266e, - MailCommandResult = 0x2639, - MailListResult = 0x2751, - MailQueryNextTimeResult = 0x2752, + LogoutCancelAck = 0x2682, + LogoutComplete = 0x2681, + LogoutResponse = 0x2680, + LogXpGain = 0x26df, + LootAllPassed = 0x261e, + LootList = 0x273a, + LootMoneyNotify = 0x2619, + LootRelease = 0x2618, + LootReleaseAll = 0x2617, + LootRemoved = 0x2613, + LootResponse = 0x2612, + LootRoll = 0x261b, + LootRollsComplete = 0x261d, + LootRollWon = 0x261f, + LossOfControlAuraUpdate = 0x266d, + MailCommandResult = 0x2638, + MailListResult = 0x274f, + MailQueryNextTimeResult = 0x2750, MapObjectivesInit = 0x294b, MapObjEvents = 0x25c6, - MasterLootCandidateList = 0x261d, + MasterLootCandidateList = 0x261c, MeetingStoneFailed = 0x2892, MessageBox = 0x2576, - MinimapPing = 0x26ca, + MinimapPing = 0x26c9, MirrorImageComponentedData = 0x2c14, MirrorImageCreatureData = 0x2c13, MissileCancel = 0x25c7, - ModifyCooldown = 0x275f, + ModifyCooldown = 0x275d, Motd = 0x2baf, MountResult = 0x257b, - MovementEnforcementAlert = 0x2841, + MovementEnforcementAlert = 0x283f, MoveAddImpulse = 0x2e32, MoveApplyInertia = 0x2e2e, MoveApplyMovementForce = 0x2e15, @@ -1594,84 +1596,85 @@ namespace Framework.Constants MoveUpdateTeleport = 0x2de1, MoveUpdateTurnRate = 0x2ddd, MoveUpdateWalkSpeed = 0x2dd8, - MultiFloorLeaveFloor = 0x27db, - MultiFloorNewFloor = 0x27da, - MythicPlusAllMapStats = 0x260b, - MythicPlusCurrentAffixes = 0x260d, - MythicPlusNewWeekRecord = 0x2610, - MythicPlusSeasonData = 0x260c, + MultiFloorLeaveFloor = 0x27d9, + MultiFloorNewFloor = 0x27d8, + MythicPlusAllMapStats = 0x260a, + MythicPlusCurrentAffixes = 0x260c, + MythicPlusNewWeekRecord = 0x260f, + MythicPlusSeasonData = 0x260b, NeutralPlayerFactionSelectResult = 0x25db, - NewTaxiPath = 0x267c, + NewTaxiPath = 0x267b, NewWorld = 0x2598, - NotifyDestLocSpellCast = 0x2c46, - NotifyMissileTrajectoryCollision = 0x26a8, + NotifyDestLocSpellCast = 0x2c43, + NotifyMissileTrajectoryCollision = 0x26a7, NotifyMoney = 0x259d, - NotifyReceivedMail = 0x263a, - NpcInteractionOpenResult = 0x288b, - OfferPetitionError = 0x26b3, - OnCancelExpectedRideVehicleAura = 0x26e1, + NotifyReceivedMail = 0x2639, + NpcInteractionOpenResult = 0x2889, + OfferPetitionError = 0x26b2, + OnCancelExpectedRideVehicleAura = 0x26e0, OnMonsterMove = 0x2dd4, - OpenArtifactForge = 0x279c, + OpenArtifactForge = 0x279a, OpenContainer = 0x2da6, OpenLfgDungeonFinder = 0x2a31, - OpenShipmentNpcResult = 0x2794, - OverrideLight = 0x26b8, - PageText = 0x2714, - PartyCommandResult = 0x278e, + OpenShipmentNpcResult = 0x2792, + OverrideLight = 0x26b7, + PageText = 0x2713, + PartyCommandResult = 0x278c, PartyInvite = 0x25bd, - PartyKillLog = 0x2755, - PartyMemberFullState = 0x2754, - PartyMemberPartialState = 0x2753, - PartyNotifyLfgLeaderChange = 0x2871, - PartyUpdate = 0x25f4, + PartyKillLog = 0x2753, + PartyMemberFullState = 0x2752, + PartyMemberPartialState = 0x2751, + PartyNotifyLfgLeaderChange = 0x286f, + PartyUpdate = 0x25f3, PastTimeEvents = 0x25c2, - PauseMirrorTimer = 0x270b, - PendingRaidLock = 0x26f3, - PerksProgramActivityComplete = 0x2887, - PerksProgramActivityUpdate = 0x2883, - PerksProgramDisabled = 0x2888, - PerksProgramResult = 0x2884, - PerksProgramVendorUpdate = 0x2882, + PauseMirrorTimer = 0x270a, + PendingRaidLock = 0x26f2, + PerksProgramActivityComplete = 0x2885, + PerksProgramActivityUpdate = 0x2881, + PerksProgramDisabled = 0x2886, + PerksProgramResult = 0x2882, + PerksProgramVendorUpdate = 0x2880, PetitionAlreadySigned = 0x25a3, PetitionRenameGuildResponse = 0x29fa, - PetitionShowList = 0x26bb, - PetitionShowSignatures = 0x26bc, - PetitionSignResults = 0x2747, - PetActionFeedback = 0x2744, - PetActionSound = 0x269e, + PetitionShowList = 0x26ba, + PetitionShowSignatures = 0x26bb, + PetitionSignResults = 0x2745, + PetActionFeedback = 0x2742, + PetActionSound = 0x269d, PetAdded = 0x2595, - PetBattleChatRestricted = 0x2602, - PetBattleDebugQueueDumpResponse = 0x2673, - PetBattleFinalizeLocation = 0x25fb, - PetBattleFinalRound = 0x2600, - PetBattleFinished = 0x2601, - PetBattleFirstRound = 0x25fd, - PetBattleInitialUpdate = 0x25fc, - PetBattleMaxGameLengthWarning = 0x2603, - PetBattlePvpChallenge = 0x25fa, - PetBattleQueueProposeMatch = 0x2637, - PetBattleQueueStatus = 0x2638, - PetBattleReplacementsMade = 0x25ff, - PetBattleRequestFailed = 0x25f9, - PetBattleRoundResult = 0x25fe, + PetBattleChatRestricted = 0x2601, + PetBattleDebugQueueDumpResponse = 0x2672, + PetBattleFinalizeLocation = 0x25fa, + PetBattleFinalRound = 0x25ff, + PetBattleFinished = 0x2600, + PetBattleFirstRound = 0x25fc, + PetBattleInitialUpdate = 0x25fb, + PetBattleMaxGameLengthWarning = 0x2602, + PetBattlePvpChallenge = 0x25f9, + PetBattleQueueProposeMatch = 0x2636, + PetBattleQueueStatus = 0x2637, + PetBattleReplacementsMade = 0x25fe, + PetBattleRequestFailed = 0x25f8, + PetBattleRoundResult = 0x25fd, PetBattleSlotUpdates = 0x25eb, - PetCastFailed = 0x2c5b, - PetClearSpells = 0x2c24, - PetDismissSound = 0x269f, - PetGodMode = 0x2679, - PetGuids = 0x26ff, - PetLearnedSpells = 0x2c52, + PetCastFailed = 0x2c58, + PetClearSpells = 0x2c21, + PetDismissSound = 0x269e, + PetGodMode = 0x2678, + PetGuids = 0x26fe, + PetLearnedSpells = 0x2c4f, PetMode = 0x258b, - PetNameInvalid = 0x26c0, + PetNameInvalid = 0x26bf, PetNewlyTamed = 0x2589, PetSlotUpdated = 0x258a, - PetSpellsMessage = 0x2c25, + PetSpellsMessage = 0x2c22, PetStableList = 0x2596, PetStableResult = 0x2597, - PetTameFailure = 0x26b0, - PetUnlearnedSpells = 0x2c53, + PetTameFailure = 0x26af, + PetUnlearnedSpells = 0x2c50, PhaseShiftChange = 0x2578, - PlayedTime = 0x26d1, + PlayedTime = 0x26d0, + PlayerAckowledgeArrowCallout = 0x3022, PlayerAzeriteItemEquippedStatusChanged = 0x3014, PlayerAzeriteItemGains = 0x3013, PlayerBonusRollFailed = 0x3016, @@ -1679,41 +1682,44 @@ namespace Framework.Constants PlayerChoiceClear = 0x2ffe, PlayerChoiceDisplayError = 0x2ffd, PlayerConditionResult = 0x300a, + PlayerHideArrowCallout = 0x3021, PlayerIsAdventureMapPoiValid = 0x3009, PlayerOpenSubscriptionInterstitial = 0x300e, PlayerSaveGuildEmblem = 0x29f9, + PlayerShowArrowCallout = 0x3020, PlayerShowGenericWidgetDisplay = 0x301e, + PlayerShowPartyPoseUi = 0x301f, PlayerShowUiEventToast = 0x3019, PlayerSkinned = 0x3006, PlayerTutorialHighlightSpell = 0x300d, PlayerTutorialUnhighlightSpell = 0x300c, - PlayMusic = 0x2764, - PlayObjectSound = 0x2765, - PlayOneShotAnimKit = 0x272b, - PlayOrphanSpellVisual = 0x2c4a, - PlayScene = 0x2634, - PlaySound = 0x2763, - PlaySpeakerbotSound = 0x2766, - PlaySpellVisual = 0x2c48, - PlaySpellVisualKit = 0x2c4c, - PlayTimeWarning = 0x26f9, + PlayMusic = 0x2762, + PlayObjectSound = 0x2763, + PlayOneShotAnimKit = 0x272a, + PlayOrphanSpellVisual = 0x2c47, + PlayScene = 0x2633, + PlaySound = 0x2761, + PlaySpeakerbotSound = 0x2764, + PlaySpellVisual = 0x2c45, + PlaySpellVisualKit = 0x2c49, + PlayTimeWarning = 0x26f8, Pong = 0x304e, - PowerUpdate = 0x26ce, + PowerUpdate = 0x26cd, PreloadChildMap = 0x2579, PreloadWorld = 0x2599, - PrepopulateNameCache = 0x2844, - PreRessurect = 0x2762, + PrepopulateNameCache = 0x2842, + PreRessurect = 0x2760, PrintNotification = 0x25ca, - ProcResist = 0x2756, - ProfessionGossip = 0x27fb, - PushSpellToActionBar = 0x2c54, + ProcResist = 0x2754, + ProfessionGossip = 0x27f9, + PushSpellToActionBar = 0x2c51, PvpCredit = 0x2945, PvpMatchComplete = 0x294f, PvpMatchInitialize = 0x2950, PvpMatchStart = 0x294e, PvpMatchStatistics = 0x2932, PvpOptionsEnabled = 0x2934, - PvpTierRecord = 0x287e, + PvpTierRecord = 0x287c, QueryBattlePetNameResponse = 0x291a, QueryCreatureResponse = 0x2914, QueryGameObjectResponse = 0x2915, @@ -1729,7 +1735,7 @@ namespace Framework.Constants QueryPlayerNameByCommunityIdResponse = 0x3002, QueryQuestInfoResponse = 0x2a96, QueryRealmGuildMasterInfoResponse = 0x29e6, - QueryTimeResponse = 0x26df, + QueryTimeResponse = 0x26de, QuestCompletionNpcResponse = 0x2a81, QuestConfirmAccept = 0x2a8f, QuestForceRemoved = 0x2a9c, @@ -1748,78 +1754,79 @@ namespace Framework.Constants QuestPoiQueryResponse = 0x2a9d, QuestPoiUpdateResponse = 0x2a9f, QuestPushResult = 0x2a90, - QuestSessionInfoResponse = 0x2867, - QuestSessionReadyCheck = 0x2855, - QuestSessionReadyCheckResponse = 0x2856, - QuestSessionResult = 0x2854, + QuestSessionInfoResponse = 0x2865, + QuestSessionReadyCheck = 0x2853, + QuestSessionReadyCheckResponse = 0x2854, + QuestSessionResult = 0x2852, QuestUpdateAddCredit = 0x2a8c, QuestUpdateAddCreditSimple = 0x2a8d, QuestUpdateAddPvpCredit = 0x2a8e, QuestUpdateComplete = 0x2a89, QuestUpdateFailed = 0x2a8a, QuestUpdateFailedTimer = 0x2a8b, - QueueSummaryUpdate = 0x280e, - RafAccountInfo = 0x2852, - RafActivityStateChanged = 0x2863, - RaidDifficultySet = 0x27a6, - RaidGroupOnly = 0x27a8, + QueueSummaryUpdate = 0x280c, + RafAccountInfo = 0x2850, + RafActivityStateChanged = 0x2861, + RafDebugFriendMonths = 0x28b7, + RaidDifficultySet = 0x27a4, + RaidGroupOnly = 0x27a6, RaidInstanceMessage = 0x2bb4, RaidMarkersChanged = 0x25a4, - RandomRoll = 0x262e, + RandomRoll = 0x262d, RatedPvpInfo = 0x2931, - ReadyCheckCompleted = 0x25f8, - ReadyCheckResponse = 0x25f7, - ReadyCheckStarted = 0x25f6, - ReadItemResultFailed = 0x27a2, - ReadItemResultOk = 0x2799, - RealmLookupInfo = 0x27c6, + ReadyCheckCompleted = 0x25f7, + ReadyCheckResponse = 0x25f6, + ReadyCheckStarted = 0x25f5, + ReadItemResultFailed = 0x27a0, + ReadItemResultOk = 0x2797, + RealmLookupInfo = 0x27c4, RealmQueryResponse = 0x2913, - ReattachResurrect = 0x2746, - RecraftItemResult = 0x28a3, - RecruitAFriendFailure = 0x26bd, - RefreshComponent = 0x264f, - RefreshSpellHistory = 0x2c2c, + ReattachResurrect = 0x2744, + RecraftItemResult = 0x28a6, + RecruitAFriendFailure = 0x26bc, + RefreshComponent = 0x264e, + RefreshSpellHistory = 0x2c29, RemoveItemPassive = 0x25ac, - RemoveSpellFromActionBar = 0x2c55, - ReplaceTrophyResponse = 0x27be, + RemoveSpellFromActionBar = 0x2c52, + ReplaceTrophyResponse = 0x27bc, ReportPvpPlayerAfkResult = 0x3001, RequestCemeteryListResponse = 0x2591, RequestPvpRewardsResponse = 0x2935, RequestScheduledPvpInfoResponse = 0x2936, ResearchComplete = 0x2587, ResetCompressionContext = 0x304f, - ResetFailedNotify = 0x26b4, - ResetLastLoadedConfigCvars = 0x28a9, + ResetFailedNotify = 0x26b3, + ResetLastLoadedConfigCvars = 0x28ac, ResetQuestPoi = 0x2aa0, ResetRangedCombatTimer = 0x2944, ResetWeeklyCurrency = 0x2575, - RespecWipeConfirm = 0x2611, + RespecWipeConfirm = 0x2610, RespondInspectAchievements = 0x2572, - ResponsePerkPendingRewards = 0x2885, - ResponsePerkRecentPurchases = 0x2886, - RestartGlobalCooldown = 0x2c64, + ResponsePerkPendingRewards = 0x2883, + ResponsePerkRecentPurchases = 0x2884, + RestartGlobalCooldown = 0x2c61, RestrictedAccountWarning = 0x25b9, - ResumeCast = 0x2c3e, - ResumeCastBar = 0x2c41, + ResumeCast = 0x2c3b, + ResumeCastBar = 0x2c3e, ResumeComms = 0x304b, ResumeToken = 0x25aa, ResurrectRequest = 0x257e, - ResyncRunes = 0x2c62, - ReturningPlayerPrompt = 0x27a1, - ReturnApplicantList = 0x2848, - ReturnRecruitingClubs = 0x2847, + ResyncRunes = 0x2c5f, + ReturningPlayerPrompt = 0x279f, + ReturnApplicantList = 0x2846, + ReturnRecruitingClubs = 0x2845, RoleChangedInform = 0x258d, RoleChosen = 0x2a39, RolePollInform = 0x258e, - RuneforgeLegendaryCraftingOpenNpc = 0x27fa, + RuneforgeLegendaryCraftingOpenNpc = 0x27f8, RuneRegenDebug = 0x25b6, - ScenarioCompleted = 0x27e8, - ScenarioPois = 0x2631, - ScenarioProgressUpdate = 0x262a, - ScenarioShowCriteria = 0x27fe, - ScenarioState = 0x2629, - ScenarioUiUpdate = 0x27fd, - ScenarioVacate = 0x27a3, + ScenarioCompleted = 0x27e6, + ScenarioPois = 0x2630, + ScenarioProgressUpdate = 0x2629, + ScenarioShowCriteria = 0x27fc, + ScenarioState = 0x2628, + ScenarioUiUpdate = 0x27fb, + ScenarioVacate = 0x27a1, SceneObjectEvent = 0x25e1, SceneObjectPetBattleFinalRound = 0x25e6, SceneObjectPetBattleFinished = 0x25e7, @@ -1827,178 +1834,176 @@ namespace Framework.Constants SceneObjectPetBattleInitialUpdate = 0x25e2, SceneObjectPetBattleReplacementsMade = 0x25e5, SceneObjectPetBattleRoundResult = 0x25e4, - ScriptCast = 0x2c59, + ScriptCast = 0x2c56, SeasonInfo = 0x25c1, - SellResponse = 0x26c1, + SellResponse = 0x26c0, SendItemPassives = 0x25ad, - SendKnownSpells = 0x2c2a, - SendRaidTargetUpdateAll = 0x262c, - SendRaidTargetUpdateSingle = 0x262d, - SendSpellCharges = 0x2c2d, - SendSpellHistory = 0x2c2b, - SendUnlearnSpells = 0x2c2e, - ServerFirstAchievements = 0x264c, - ServerTime = 0x2680, - ServerTimeOffset = 0x270f, + SendKnownSpells = 0x2c27, + SendRaidTargetUpdateAll = 0x262b, + SendRaidTargetUpdateSingle = 0x262c, + SendSpellCharges = 0x2c2a, + SendSpellHistory = 0x2c28, + SendUnlearnSpells = 0x2c2b, + ServerFirstAchievements = 0x264b, + ServerTime = 0x267f, + ServerTimeOffset = 0x270e, SetupCurrency = 0x2573, SetupResearchHistory = 0x2586, - SetAiAnimKit = 0x272a, - SetAllTaskProgress = 0x2787, - SetAnimTier = 0x272e, + SetAiAnimKit = 0x2729, + SetAllTaskProgress = 0x2785, + SetAnimTier = 0x272d, SetChrUpgradeTier = 0x25de, SetCurrency = 0x2574, SetDfFastLaunchResult = 0x2a2e, - SetDungeonDifficulty = 0x26a2, - SetFactionAtWar = 0x26fb, - SetFactionNotVisible = 0x2725, - SetFactionStanding = 0x2726, - SetFactionVisible = 0x2724, - SetFlatSpellModifier = 0x2c39, - SetForcedReactions = 0x2718, + SetDungeonDifficulty = 0x26a1, + SetFactionAtWar = 0x26fa, + SetFactionNotVisible = 0x2724, + SetFactionStanding = 0x2725, + SetFactionVisible = 0x2723, + SetFlatSpellModifier = 0x2c36, + SetForcedReactions = 0x2717, SetItemPurchaseData = 0x259f, - SetLootMethodFailed = 0x27cc, + SetLootMethodFailed = 0x27ca, SetMaxWeeklyQuantity = 0x25a2, - SetMeleeAnimKit = 0x272d, - SetMovementAnimKit = 0x272c, - SetPctSpellModifier = 0x2c3a, - SetPetSpecialization = 0x2623, + SetMeleeAnimKit = 0x272c, + SetMovementAnimKit = 0x272b, + SetPctSpellModifier = 0x2c37, + SetPetSpecialization = 0x2622, SetPlayerDeclinedNamesResult = 0x3003, SetPlayHoverAnim = 0x25ba, - SetProficiency = 0x272f, - SetQuestReplayCooldownOverride = 0x285b, + SetProficiency = 0x272e, + SetQuestReplayCooldownOverride = 0x2859, SetShipmentReadyResponse = 0x2998, - SetSpellCharges = 0x2c29, - SetTaskComplete = 0x2788, - SetTimeZoneInformation = 0x2675, - SetVehicleRecId = 0x26f2, - ShadowlandsCapacitanceUpdate = 0x288a, + SetSpellCharges = 0x2c26, + SetTaskComplete = 0x2786, + SetTimeZoneInformation = 0x2674, + SetVehicleRecId = 0x26f1, + ShadowlandsCapacitanceUpdate = 0x2888, ShipmentFactionUpdateResult = 0x2999, ShowNeutralPlayerFactionSelectUi = 0x25da, ShowQuestCompletionText = 0x2a95, - ShowTaxiNodes = 0x26c9, - ShowTradeSkillResponse = 0x276b, + ShowTaxiNodes = 0x26c8, + ShowTradeSkillResponse = 0x2769, SocialContractRequestResponse = 0x2893, - SocketGemsFailure = 0x2722, - SocketGemsSuccess = 0x2721, - SpecialMountAnim = 0x269d, - SpecInvoluntarilyChanged = 0x2713, - SpellAbsorbLog = 0x2c1f, - SpellCategoryCooldown = 0x2c17, - SpellChannelStart = 0x2c34, - SpellChannelUpdate = 0x2c35, + SocketGemsFailure = 0x2721, + SocketGemsSuccess = 0x2720, + SpecialMountAnim = 0x269c, + SpecInvoluntarilyChanged = 0x2712, + SpellAbsorbLog = 0x2c1c, + SpellCategoryCooldown = 0x2c16, + SpellChannelStart = 0x2c31, + SpellChannelUpdate = 0x2c32, SpellCooldown = 0x2c15, - SpellDamageShield = 0x2c31, - SpellDelayed = 0x2c42, - SpellDispellLog = 0x2c1a, - SpellEmpowerSetStage = 0x2c38, - SpellEmpowerStart = 0x2c36, - SpellEmpowerUpdate = 0x2c37, - SpellEnergizeLog = 0x2c1c, - SpellExecuteLog = 0x2c43, - SpellFailedOther = 0x2c58, - SpellFailure = 0x2c56, - SpellFailureMessage = 0x2c5d, - SpellGo = 0x2c3c, - SpellHealAbsorbLog = 0x2c1e, - SpellHealLog = 0x2c1d, - SpellInstakillLog = 0x2c33, - SpellInterruptLog = 0x2c20, - SpellMissLog = 0x2c44, - SpellNonMeleeDamageLog = 0x2c32, - SpellOrDamageImmune = 0x2c2f, - SpellPeriodicAuraLog = 0x2c1b, - SpellPrepare = 0x2c3b, - SpellStart = 0x2c3d, + SpellDamageShield = 0x2c2e, + SpellDelayed = 0x2c3f, + SpellDispellLog = 0x2c17, + SpellEmpowerSetStage = 0x2c35, + SpellEmpowerStart = 0x2c33, + SpellEmpowerUpdate = 0x2c34, + SpellEnergizeLog = 0x2c19, + SpellExecuteLog = 0x2c40, + SpellFailedOther = 0x2c55, + SpellFailure = 0x2c53, + SpellFailureMessage = 0x2c5a, + SpellGo = 0x2c39, + SpellHealAbsorbLog = 0x2c1b, + SpellHealLog = 0x2c1a, + SpellInstakillLog = 0x2c30, + SpellInterruptLog = 0x2c1d, + SpellMissLog = 0x2c41, + SpellNonMeleeDamageLog = 0x2c2f, + SpellOrDamageImmune = 0x2c2c, + SpellPeriodicAuraLog = 0x2c18, + SpellPrepare = 0x2c38, + SpellStart = 0x2c3a, SpellVisualLoadScreen = 0x25cc, - SplashScreenShowLatest = 0x286d, - StandStateUpdate = 0x2717, + SplashScreenShowLatest = 0x286b, + StandStateUpdate = 0x2716, StarterBuildActivateFailed = 0x25d2, - StartElapsedTimer = 0x2604, - StartElapsedTimers = 0x2606, - StartLightningStorm = 0x26a5, - StartLootRoll = 0x261b, - StartMirrorTimer = 0x270a, + StartElapsedTimer = 0x2603, + StartElapsedTimers = 0x2605, + StartLightningStorm = 0x26a4, + StartLootRoll = 0x261a, + StartMirrorTimer = 0x2709, StartTimer = 0x25a6, - StopElapsedTimer = 0x2605, - StopMirrorTimer = 0x270c, - StopSpeakerbotSound = 0x2767, + StopElapsedTimer = 0x2604, + StopMirrorTimer = 0x270b, + StopSpeakerbotSound = 0x2765, StopTimer = 0x25a7, StreamingMovies = 0x25a5, - SuggestInviteInform = 0x278f, - SummonCancel = 0x26ae, + SuggestInviteInform = 0x278d, + SummonCancel = 0x26ad, SummonRaidMemberValidateFailed = 0x258f, - SummonRequest = 0x271c, - SupercededSpells = 0x2c4f, + SummonRequest = 0x271b, + SupercededSpells = 0x2c4c, SuspendComms = 0x304a, SuspendToken = 0x25a9, - SyncWowEntitlements = 0x2865, - TalentsInvoluntarilyReset = 0x2712, - TaxiNodeStatus = 0x267a, - TextEmote = 0x2678, - ThreatClear = 0x26d8, - ThreatRemove = 0x26d7, - ThreatUpdate = 0x26d6, + SyncWowEntitlements = 0x2863, + TalentsInvoluntarilyReset = 0x2711, + TaxiNodeStatus = 0x2679, + TextEmote = 0x2677, + ThreatClear = 0x26d7, + ThreatRemove = 0x26d6, + ThreatUpdate = 0x26d5, TimeAdjustment = 0x2dd3, TimeSyncRequest = 0x2dd2, - TitleEarned = 0x26d3, - TitleLost = 0x26d4, - TotemCreated = 0x26c4, - TotemDurationChanged = 0x26c5, - TotemMoved = 0x26c6, + TitleEarned = 0x26d2, + TitleLost = 0x26d3, + TotemCreated = 0x26c3, + TotemDurationChanged = 0x26c4, + TotemMoved = 0x26c5, TradeStatus = 0x2582, TradeUpdated = 0x2581, - TrainerBuyFailed = 0x26db, - TrainerList = 0x26da, + TrainerBuyFailed = 0x26da, + TrainerList = 0x26d9, TraitConfigCommitFailed = 0x25d1, - TransferAborted = 0x26fe, + TransferAborted = 0x26fd, TransferPending = 0x25cd, TreasurePickerResponse = 0x291f, - TriggerCinematic = 0x27c4, - TriggerMovie = 0x26c7, - TurnInPetitionResult = 0x2749, - TutorialFlags = 0x27b7, - UiHealingRangeModified = 0x273e, + TriggerCinematic = 0x27c2, + TriggerMovie = 0x26c6, + TurnInPetitionResult = 0x2747, + TutorialFlags = 0x27b5, UiMapQuestLinesResponse = 0x2aa2, - UndeleteCharacterResponse = 0x27c7, - UndeleteCooldownStatusResponse = 0x27c8, - UnlearnedSpells = 0x2c51, + UndeleteCharacterResponse = 0x27c5, + UndeleteCooldownStatusResponse = 0x27c6, + UnlearnedSpells = 0x2c4e, UnloadChildMap = 0x257a, - UpdateAadcStatusResponse = 0x287f, - UpdateAccountData = 0x2704, + UpdateAadcStatusResponse = 0x287d, + UpdateAccountData = 0x2703, UpdateActionButtons = 0x25df, - UpdateBnetSessionKey = 0x281f, + UpdateBnetSessionKey = 0x281d, UpdateCapturePoint = 0x2929, - UpdateCelestialBody = 0x281b, - UpdateCharacterFlags = 0x27bd, - UpdateChargeCategoryCooldown = 0x2761, - UpdateCooldown = 0x2760, + UpdateCelestialBody = 0x2819, + UpdateCharacterFlags = 0x27bb, + UpdateChargeCategoryCooldown = 0x275f, + UpdateCooldown = 0x275e, UpdateCraftingNpcRecipes = 0x2996, UpdateDailyMissionCounter = 0x297f, - UpdateExpansionLevel = 0x2644, - UpdateGameTimeState = 0x2822, - UpdateInstanceOwnership = 0x26a7, - UpdateLastInstance = 0x2686, - UpdateObject = 0x27c5, + UpdateExpansionLevel = 0x2643, + UpdateGameTimeState = 0x2820, + UpdateInstanceOwnership = 0x26a6, + UpdateLastInstance = 0x2685, + UpdateObject = 0x27c3, UpdatePrimarySpec = 0x25d7, - UpdateRecentPlayerGuids = 0x25f5, + UpdateRecentPlayerGuids = 0x25f4, UpdateTalentData = 0x25d6, - UpdateTaskProgress = 0x2786, - UpdateWeeklySpellUsage = 0x2c19, - UpdateWorldState = 0x2743, + UpdateTaskProgress = 0x2784, + UpdateWorldState = 0x2741, UserlistAdd = 0x2bb9, UserlistRemove = 0x2bba, UserlistUpdate = 0x2bbb, - UseEquipmentSetResult = 0x274a, - VasCheckTransferOkResponse = 0x2816, - VasGetQueueMinutesResponse = 0x2814, - VasGetServiceStatusResponse = 0x2813, - VasPurchaseComplete = 0x27ee, - VasPurchaseStateUpdate = 0x27ed, + UseEquipmentSetResult = 0x2748, + VasCheckTransferOkResponse = 0x2814, + VasGetQueueMinutesResponse = 0x2812, + VasGetServiceStatusResponse = 0x2811, + VasPurchaseComplete = 0x27ec, + VasPurchaseStateUpdate = 0x27eb, VendorInventory = 0x25b8, VignetteUpdate = 0x3008, - VoiceChannelInfoResponse = 0x281a, - VoiceChannelSttTokenResponse = 0x2879, - VoiceLoginResponse = 0x2819, + VoiceChannelInfoResponse = 0x2818, + VoiceChannelSttTokenResponse = 0x2877, + VoiceLoginResponse = 0x2817, VoidItemSwapResponse = 0x2da4, VoidStorageContents = 0x2da1, VoidStorageFailed = 0x2da0, @@ -2007,24 +2012,23 @@ namespace Framework.Constants WaitQueueFinish = 0x256f, WaitQueueUpdate = 0x256e, Warden3Data = 0x2577, - Warden3Disabled = 0x281d, - Warden3Enabled = 0x281c, - WarfrontComplete = 0x2759, + Warden3Disabled = 0x281b, + Warden3Enabled = 0x281a, + WarfrontComplete = 0x2757, WargameRequestSuccessfullySentToOpponent = 0x2933, - Weather = 0x26a4, - WeeklyRewardsProgressResult = 0x2870, - WeeklyRewardsResult = 0x286e, - WeeklyRewardClaimResult = 0x286f, - WeeklySpellUsage = 0x2c18, + Weather = 0x26a3, + WeeklyRewardsProgressResult = 0x286e, + WeeklyRewardsResult = 0x286c, + WeeklyRewardClaimResult = 0x286d, Who = 0x2bae, - WhoIs = 0x26a3, - WillBeKickedForAddedSubscriptionTime = 0x2821, + WhoIs = 0x26a2, + WillBeKickedForAddedSubscriptionTime = 0x281f, WorldQuestUpdateResponse = 0x300f, WorldServerInfo = 0x25ae, - WowEntitlementNotification = 0x2866, - XpAwardedFromCurrency = 0x28a8, + WowEntitlementNotification = 0x2864, + XpAwardedFromCurrency = 0x28ab, XpGainAborted = 0x25c9, - XpGainEnabled = 0x27a7, + XpGainEnabled = 0x27a5, ZoneUnderAttack = 0x2bb5, // Opcodes That Are Not Generated Automatically diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 39115fcb9..ab840d10f 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -140,7 +140,8 @@ namespace Framework.Constants BossSound = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper Mobile = 0x40, Guide = 0x1000, - Newcomer = 0x2000 + Newcomer = 0x2000, + Censored = 0x4000 } public enum DrunkenState @@ -546,7 +547,7 @@ namespace Framework.Constants // first slot for item stored (in any way in player items data) Start = 0, // last+1 slot for item stored (in any way in player items data) - End = 218, + End = 227, Count = (End - Start) } diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 04078ac6e..b732840cb 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -814,11 +814,17 @@ namespace Framework.Constants Fury = 17, Pain = 18, Essence = 19, - Max = 20, + RuneBlood = 20, + RuneFrost = 21, + RuneUnholy = 22, + AlternateQuest = 23, + AlternateEncounter = 24, + AlternateMount = 25, + Max = 26, All = 127, // default for class? Health = -2, // (-2 as signed value) - MaxPerClass = 7 + MaxPerClass = 10 } public enum Stats @@ -3046,7 +3052,13 @@ namespace Framework.Constants UseWeeklyRewardsDisabled = 1113, CrossFactionGroupJoined = 1114, CantTargetUnfriendlyInOverworld = 1115, - EquipablespellsSlotsFull = 1116 + EquipablespellsSlotsFull = 1116, + WowLabsPartyErrorTypePartyIsFull = 1117, + WowLabsPartyErrorTypeMaxInviteSent = 1118, + WowLabsPartyErrorTypePlayerAlreadyInvited = 1119, + WowLabsPartyErrorTypePartyInviteInvalid = 1120, + WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1121, + WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1122, } public enum SceneFlags diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 0795f4722..eb5bc36c0 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -543,6 +543,7 @@ namespace Framework.Constants DisableNavigation = 533, // Disables Map Pins Unk534 = 534, Unk535 = 535, + IgnoreSpellCreatureTypeRequirements = 536, Total } diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs index f5239ad6d..854ad3556 100644 --- a/Source/Framework/Constants/Spells/SpellConst.cs +++ b/Source/Framework/Constants/Spells/SpellConst.cs @@ -1350,6 +1350,7 @@ namespace Framework.Constants YouCanOnlyDoThisWhileMidair = 638, // You Can Only Do This While Midair. YouCannotDoThatWhileAirborne = 639, // You Cannot Do That While Airborne. PocopocIsUnavailableOnQuestline = 640, // Pocopoc Is Unavailable To Summon During The Questline A Means To An End. + CannontCastThatWithAuraOfReckoningTalent = 650, // You cannot cast that while Aura of Reckoning is talented. RequiresSulfuronSlammer = 711, // Requires Sulfuron Slammer NotReadyYet = 788, // Not Ready Yet. QualityOfTieredMedallionSettingIsTooLow = 789, // The Quality Of Your Tiered Medallion Setting Is Too Low To Add Another Socket To This Item. @@ -1386,6 +1387,23 @@ namespace Framework.Constants ThereIsNoMoreRoomOnThatHandhold = 820, // There Is No More Room On That Handhold. YouMustUnblockThisSpotByCompletingADailyQuest = 821, // You Must Unblock This Spot By Completing A Daily Quest. YouMustBeCloserToAnIceHoleToDoThat = 822, // You Must Be Closer To An Ice Hole To Do That. + ShadowflameIsTooStrongToBear = 823, // The Shadowflame Is Too Strong To Bear. + SomeoneHasAlreadyOverloadedThis = 824, // Someone Has Already Overloaded This. + RequiresNokhudTrainingCourse = 825, // Requires Nokhud Training Course. + ThisRecipeIsCurrentlyDisabled = 826, // This Recipe Is Currently Disabled. Please Try Again Later. + YouDoNotHaveTheCorrectBattlePetSummoned = 827, // You Do Not Have The Correct Battle Pet Summoned. + YouAlreadyHaveAtLeastOneConjuredPhial = 828, // You Already Have At Least One Conjured Phial. + MarkedTooManyTreasuresInTheForbiddenReach = 830, // You Have Already Marked Too Many Treasures In The Forbidden Reach. Collect A Few Before Unsealing More Forbidden Reach Treasure Scrolls. + RequiresADjaradinPillarShard = 831, // Requires A Djaradin Pillar Shard. + RequiresAResilientStone = 832, // Requires A Resilient Stone. + MyrritCannotCarryAnyMoreMaps = 835, // Myrrit Cannot Carry Any More Maps. Go On A Dig With Him! + RequiresNiffenCaveDiveKeyandShieldDisabled = 850, // Requires Niffen Cave Dive Key And Shield Disabled. + ElusiveCreatureBaitWasRecentlyUsed = 851, // You Cannot Lure Anything In This Area For A Few Minutes. Elusive Creature Bait Was Recently Used. + YouDontHaveTheSwirlingMojoStone = 999, // You Don'T Have The Swirling Mojo Stone Equipped. + YouMustBeNearADragonflightOathstone = 1000, // You Must Be Near One Of The Five Dragonflight Oathstones In The Dragon Isles. + CanOnlyUseThisItemWhileAirborne = 1001, // You Can Only Use This Item While Airborne. + YouMustBeInVisageForm = 2222, // You Must Be In Visage Form To Do This. + TooCloseToAnotherMoltenRitual = 2424, // You Can'T Begin A Molten Ritual This Close To Another One. } public enum SpellMissInfo @@ -2483,6 +2501,14 @@ namespace Framework.Constants ChangeActiveCombatTraitConfig = 304, Unk305 = 305, Unk306 = 306, + Unk307 = 307, + CancelPreloadWorld = 308, + PreloadWorld = 309, + Unk310 = 310, + EnsureWorldLoaded = 311, + Unk312 = 312, + ChangeItemBonuses2 = 313, // MiscValue[0] = ItemBonusTreeID to preserve + AddSocketBonus = 314, // MiscValue[0] = required ItemBonusTreeID TotalSpellEffects } diff --git a/Source/Framework/Constants/UnitConst.cs b/Source/Framework/Constants/UnitConst.cs index 228e201c1..b1472f22a 100644 --- a/Source/Framework/Constants/UnitConst.cs +++ b/Source/Framework/Constants/UnitConst.cs @@ -154,6 +154,12 @@ namespace Framework.Constants Fury, Pain, Essence, + RuneBlood, + RuneFrost, + RuneUnholy, + AlternateQuest, + AlternateEncounter, + AlternateMount, Armor, // ARMOR..RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum. ResistanceHoly, ResistanceFire, @@ -173,8 +179,9 @@ namespace Framework.Constants ResistanceStart = Armor, ResistanceEnd = ResistanceArcane + 1, PowerStart = Mana, - PowerEnd = Essence + 1 + PowerEnd = AlternateMount + 1 } + public enum UnitModifierFlatType { Base = 0, @@ -182,12 +189,14 @@ namespace Framework.Constants Total = 2, End = 3 } + public enum UnitModifierPctType { Base = 0, Total = 1, End = 2 } + public enum VictimState { Intact = 0, // set when attacker misses diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index a4e1627ca..13257ba39 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -69,8 +69,9 @@ namespace Framework.Database PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, 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, health, power1, power2, power3, power4, power5, power6, power7, instance_id, activeTalentGroup, lootSpecId, exploredZones, " + - "knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + + "health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, " + + "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID"); @@ -444,13 +445,13 @@ namespace Framework.Database "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " + "taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " + "extra_flags, summonedPetNumber, at_login, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " + - "power4, power5, power6, power7, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " + - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "power4, power5, power6, power7, power8, power9, power10, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " + + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," + "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,summonedPetNumber=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," + - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,power8=?,power9=?,power10=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + "equipmentCache=?,knownTitles=?,actionBars=?,online=?,honor=?,honorLevel=?,honorRestState=?,honorRestBonus=?,lastLoginBuild=? WHERE guid=?"); PrepareStatement(CharStatements.UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?"); @@ -618,9 +619,9 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHAR_SPELL_FAVORITE_BY_CHAR, "DELETE FROM character_spell_favorite WHERE guid = ?"); PrepareStatement(CharStatements.INS_CHAR_SPELL_FAVORITE, "INSERT INTO character_spell_favorite (guid, spell) VALUES (?, ?)"); PrepareStatement(CharStatements.DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?"); - PrepareStatement(CharStatements.INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, " + - "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, " + - "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, maxpower8, maxpower9, maxpower10, " + + "strength, agility, stamina, intellect, armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, " + + "attackPower, rangedAttackPower, spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?"); PrepareStatement(CharStatements.DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?"); PrepareStatement(CharStatements.INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?)"); diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index a6f147900..0d9b57af3 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -254,7 +254,7 @@ namespace Framework.Database // ChrCustomizationChoice.db2 PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, " + - "ChrCustomizationVisReqID, SortOrder, UiOrderIndex, Flags, AddedInPatch, SwatchColor1, SwatchColor2 FROM chr_customization_choice" + + "ChrCustomizationVisReqID, SortOrder, UiOrderIndex, Flags, AddedInPatch, SoundKitID, SwatchColor1, SwatchColor2 FROM chr_customization_choice" + " WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE, "SELECT ID, Name_lang FROM chr_customization_choice_locale" + " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); @@ -266,8 +266,8 @@ namespace Framework.Database // ChrCustomizationElement.db2 PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " + "ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " + - "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID FROM chr_customization_element" + - " WHERE (`VerifiedBuild` > 0) = ?"); + "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID" + + " FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?"); // ChrCustomizationOption.db2 PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " + @@ -329,7 +329,7 @@ namespace Framework.Database // ContentTuning.db2 PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, Flags, ExpansionID, MinLevel, MaxLevel, MinLevelType, MaxLevelType, TargetLevelDelta, " + - "TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?"); + "TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel, QuestXpMultiplier FROM content_tuning WHERE (`VerifiedBuild` > 0) = ?"); // ContentTuningXExpected.db2 PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " + @@ -659,7 +659,8 @@ namespace Framework.Database // ItemBonusTreeNode.db2 PrepareStatement(HotfixStatements.SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, ItemContext, ChildItemBonusTreeID, ChildItemBonusListID, ChildItemLevelSelectorID, " + - "ChildItemBonusListGroupID, IblGroupPointsModSetID, ParentItemBonusTreeID FROM item_bonus_tree_node WHERE (`VerifiedBuild` > 0) = ?"); + "ChildItemBonusListGroupID, IblGroupPointsModSetID, Unknown1010_1, Unknown1010_2, ParentItemBonusTreeID FROM item_bonus_tree_node" + + " WHERE (`VerifiedBuild` > 0) = ?"); // ItemChildEquipment.db2 PrepareStatement(HotfixStatements.SEL_ITEM_CHILD_EQUIPMENT, "SELECT ID, ParentItemID, ChildItemID, ChildItemEquipSlot FROM item_child_equipment" + @@ -914,7 +915,8 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ?"); // Movie.db2 - PrepareStatement(HotfixStatements.SEL_MOVIE, "SELECT ID, Volume, KeyID, AudioFileDataID, SubtitleFileDataID FROM movie WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_MOVIE, "SELECT ID, Volume, KeyID, AudioFileDataID, SubtitleFileDataID, SubtitleFileFormat FROM movie" + + " WHERE (`VerifiedBuild` > 0) = ?"); // NameGen.db2 PrepareStatement(HotfixStatements.SEL_NAME_GEN, "SELECT ID, Name, RaceID, Sex FROM name_gen WHERE (`VerifiedBuild` > 0) = ?"); diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 01329aae5..d0a028d07 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -389,7 +389,7 @@ namespace Game.DataStorage foreach (var entry in TaxiPathNodeStorage.Values) TaxiPathNodesByPath[entry.PathID][entry.NodeIndex] = entry; - var taxiMaskSize = ((TaxiNodesStorage.GetNumRows() - 1) / 8) + 1; + var taxiMaskSize = ((TaxiNodesStorage.GetNumRows() - 1) / (8 * 64) + 1) * 8; TaxiNodesMask = new byte[taxiMaskSize]; OldContinentsNodesMask = new byte[taxiMaskSize]; HordeTaxiNodesMask = new byte[taxiMaskSize]; diff --git a/Source/Game/DataStorage/ClientReader/DBReader.cs b/Source/Game/DataStorage/ClientReader/DBReader.cs index e28fc1fcd..50b64e6c1 100644 --- a/Source/Game/DataStorage/ClientReader/DBReader.cs +++ b/Source/Game/DataStorage/ClientReader/DBReader.cs @@ -19,15 +19,16 @@ namespace Game.DataStorage { class DBReader { - private const uint WDC3FmtSig = 0x33434457; // WDC3 + private const uint WDC3FmtSig = 0x34434457; // WDC3 public WDCHeader Header; public FieldMetaData[] FieldMeta; public ColumnMetaData[] ColumnMeta; public Value32[][] PalletData; public Dictionary[] CommonData; + Dictionary _encryptedIDs; - public Dictionary Records = new(); + public Dictionary Records = new(); public bool Load(Stream stream) { @@ -77,7 +78,6 @@ namespace Game.DataStorage // common data CommonData = new Dictionary[ColumnMeta.Length]; - for (int i = 0; i < ColumnMeta.Length; i++) { if (ColumnMeta[i].CompressionType == DB2ColumnCompression.Common) @@ -90,17 +90,23 @@ namespace Game.DataStorage } } - long previousRecordCount = 0; - for (int sectionIndex = 0; sectionIndex < Header.SectionsCount; sectionIndex++) + // encrypted IDs + _encryptedIDs = new(); + for (int i = 1; i < Header.SectionsCount; i++) { - if (sections[sectionIndex].TactKeyLookup != 0)// && !hasTactKeyFunc(sections[sectionIndex].TactKeyLookup)) - { - previousRecordCount += sections[sectionIndex].NumRecords; - //Console.WriteLine("Detected db2 with encrypted section! HasKey {0}", CASC.HasKey(Sections[sectionIndex].TactKeyLookup)); - continue; - } + var encryptedIDCount = reader.ReadUInt32(); - reader.BaseStream.Position = sections[sectionIndex].FileOffset; + // If tactkey in section header is 0'd out, skip these IDs + if (sections[i].TactKeyLookup == 0 || sections[i].TactKeyLookup == 0x5452494E49545900) + reader.BaseStream.Position += encryptedIDCount * 4; + else + _encryptedIDs.Add(i, reader.ReadArray(encryptedIDCount)); + } + + long previousRecordCount = 0; + foreach (var section in sections) + { + reader.BaseStream.Position = section.FileOffset; byte[] recordsData; Dictionary stringsTable = null; @@ -109,12 +115,12 @@ namespace Game.DataStorage if (!Header.HasOffsetTable()) { // records data - recordsData = reader.ReadBytes((int)(sections[sectionIndex].NumRecords * Header.RecordSize)); + recordsData = reader.ReadBytes((int)(section.NumRecords * Header.RecordSize)); // string data stringsTable = new Dictionary(); - for (int i = 0; i < sections[sectionIndex].StringTableSize;) + for (int i = 0; i < section.StringTableSize;) { long oldPos = reader.BaseStream.Position; @@ -126,31 +132,63 @@ namespace Game.DataStorage else { // sparse data with inlined strings - recordsData = reader.ReadBytes(sections[sectionIndex].SparseTableOffset - sections[sectionIndex].FileOffset); + recordsData = reader.ReadBytes(section.OffsetRecordsEndOffset - section.FileOffset); - if (reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset) + if (reader.BaseStream.Position != section.OffsetRecordsEndOffset) throw new Exception("reader.BaseStream.Position != sections[sectionIndex].SparseTableOffset"); } + // skip encrypted sections => has tact key + record data is zero filled + if (section.TactKeyLookup != 0 && Array.TrueForAll(recordsData, x => x == 0)) + { + bool completelyZero = false; + if (section.IndexDataSize > 0 || section.CopyTableCount > 0) + { + // this will be the record id from m_indexData or m_copyData + // if this is zero then the id for this record will be zero which is invalid + completelyZero = reader.ReadInt32() == 0; + reader.BaseStream.Position -= 4; + } + else if (section.OffsetMapIDCount > 0) + { + // this will be the first m_sparseEntries entry + // confirm it's size is not zero otherwise it is invalid + completelyZero = reader.Read().Size == 0; + reader.BaseStream.Position -= 6; + } + else + { + // there is no additional data and recordsData is already known to be zeroed + // therefore the record will have an id of zero which is invalid + completelyZero = true; + } + + if (completelyZero) + { + previousRecordCount += section.NumRecords; + continue; + } + } + Array.Resize(ref recordsData, recordsData.Length + 8); // pad with extra zeros so we don't crash when reading // index data - int[] indexData = reader.ReadArray((uint)(sections[sectionIndex].IndexDataSize / 4)); - bool isIndexEmpty = Header.HasIndexTable() && indexData.Count(i => i == 0) == sections[sectionIndex].NumRecords; + int[] indexData = reader.ReadArray((uint)(section.IndexDataSize / 4)); + bool isIndexEmpty = Header.HasIndexTable() && indexData.Count(i => i == 0) == section.NumRecords; // duplicate rows data Dictionary copyData = new(); - for (int i = 0; i < sections[sectionIndex].NumCopyRecords; i++) + for (int i = 0; i < section.CopyTableCount; i++) copyData[reader.ReadInt32()] = reader.ReadInt32(); - if (sections[sectionIndex].NumSparseRecords > 0) - sparseEntries = reader.ReadArray((uint)sections[sectionIndex].NumSparseRecords); + if (section.OffsetMapIDCount > 0) + sparseEntries = reader.ReadArray((uint)section.OffsetMapIDCount); // reference data ReferenceData refData = null; - if (sections[sectionIndex].ParentLookupDataSize > 0) + if (section.ParentLookupDataSize > 0) { refData = new ReferenceData { @@ -172,10 +210,9 @@ namespace Game.DataStorage }; } - if (sections[sectionIndex].NumSparseRecords > 0) + if (section.OffsetMapIDCount > 0) { - // TODO: use this shit - int[] sparseIndexData = reader.ReadArray((uint)sections[sectionIndex].NumSparseRecords); + int[] sparseIndexData = reader.ReadArray((uint)section.OffsetMapIDCount); if (Header.HasIndexTable() && indexData.Length != sparseIndexData.Length) throw new Exception("indexData.Length != sparseIndexData.Length"); @@ -185,11 +222,11 @@ namespace Game.DataStorage BitReader bitReader = new(recordsData); - for (int i = 0; i < sections[sectionIndex].NumRecords; ++i) + for (int i = 0; i < section.NumRecords; ++i) { bitReader.Position = 0; if (Header.HasOffsetTable()) - bitReader.Offset = sparseEntries[i].Offset - sections[sectionIndex].FileOffset; + bitReader.Offset = sparseEntries[i].Offset - section.FileOffset; else bitReader.Offset = i * (int)Header.RecordSize; @@ -198,7 +235,7 @@ namespace Game.DataStorage long recordIndex = i + previousRecordCount; long recordOffset = (recordIndex * Header.RecordSize) - (Header.RecordCount * Header.RecordSize); - var rec = new WDC3Row(this, bitReader, (int)recordOffset, Header.HasIndexTable() ? (isIndexEmpty ? i : indexData[i]) : -1, hasRef ? refId : -1, stringsTable); + var rec = new WDC4Row(this, bitReader, (int)recordOffset, Header.HasIndexTable() ? (isIndexEmpty ? i : indexData[i]) : -1, hasRef ? refId : -1, stringsTable); Records.Add(rec.Id, rec); } @@ -212,7 +249,7 @@ namespace Game.DataStorage } } - previousRecordCount += sections[sectionIndex].NumRecords; + previousRecordCount += section.NumRecords; } } @@ -220,7 +257,7 @@ namespace Game.DataStorage } } - class WDC3Row + class WDC4Row { private BitReader _data; private int _dataOffset; @@ -236,7 +273,7 @@ namespace Game.DataStorage private Dictionary[] _commonData; private Dictionary _stringsTable; - public WDC3Row(DBReader reader, BitReader data, int recordsOffset, int id, int refId, Dictionary stringsTable) + public WDC4Row(DBReader reader, BitReader data, int recordsOffset, int id, int refId, Dictionary stringsTable) { _data = data; _recordsOffset = recordsOffset; @@ -527,9 +564,9 @@ namespace Game.DataStorage return obj; } - public WDC3Row Clone() + public WDC4Row Clone() { - return (WDC3Row)MemberwiseClone(); + return (WDC4Row)MemberwiseClone(); } } @@ -537,12 +574,12 @@ namespace Game.DataStorage { public bool HasIndexTable() { - return Convert.ToBoolean(Flags & HeaderFlags.IndexMap); + return Convert.ToBoolean(Flags & HeaderFlags.Index); } public bool HasOffsetTable() { - return Convert.ToBoolean(Flags & HeaderFlags.OffsetMap); + return Convert.ToBoolean(Flags & HeaderFlags.Sparse); } public uint Signature; @@ -647,11 +684,11 @@ namespace Game.DataStorage public int FileOffset; public int NumRecords; public int StringTableSize; - public int SparseTableOffset; // CatalogDataOffset, absolute value, {uint offset, ushort size}[MaxId - MinId + 1] + public int OffsetRecordsEndOffset; // CatalogDataOffset, absolute value, {uint offset, ushort size}[MaxId - MinId + 1] public int IndexDataSize; // int indexData[IndexDataSize / 4] public int ParentLookupDataSize; // uint NumRecords, uint minId, uint maxId, {uint id, uint index}[NumRecords], questionable usefulness... - public int NumSparseRecords; - public int NumCopyRecords; + public int OffsetMapIDCount; + public int CopyTableCount; } [StructLayout(LayoutKind.Sequential, Pack = 1)] diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index 05e385fb4..892c6c757 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -122,6 +122,7 @@ namespace Game.DataStorage public ushort UiOrderIndex; public int Flags; public int AddedInPatch; + public int SoundKitID; public int[] SwatchColor = new int[2]; } @@ -147,6 +148,7 @@ namespace Game.DataStorage public int ChrCustomizationDisplayInfoID; public int ChrCustItemGeoModifyID; public int ChrCustomizationVoiceID; + public int AnimKitID; } public sealed class ChrCustomizationOptionRecord @@ -329,6 +331,7 @@ namespace Game.DataStorage public int TargetLevelMin; public int TargetLevelMax; public int MinItemLevel; + public float QuestXpMultiplier; public ContentTuningFlag GetFlags() { return (ContentTuningFlag)Flags; } @@ -606,7 +609,7 @@ namespace Game.DataStorage public Vector2 Pos; public Vector2 PreSLSquishPos; public uint Id; - public ushort CurveID; + public uint CurveID; public byte OrderIndex; } } diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs index 7e418cdfc..55aaeb88e 100644 --- a/Source/Game/DataStorage/Structs/I_Records.cs +++ b/Source/Game/DataStorage/Structs/I_Records.cs @@ -129,6 +129,8 @@ namespace Game.DataStorage public ushort ChildItemLevelSelectorID; public uint ChildItemBonusListGroupID; public uint IblGroupPointsModSetID; + public int Unknown1010_1; + public int Unknown1010_2; public uint ParentItemBonusTreeID; } diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs index 3347a5cf9..1ce01f27a 100644 --- a/Source/Game/DataStorage/Structs/M_Records.cs +++ b/Source/Game/DataStorage/Structs/M_Records.cs @@ -227,5 +227,6 @@ namespace Game.DataStorage public byte KeyID; public uint AudioFileDataID; public uint SubtitleFileDataID; + public int SubtitleFileFormat; } } diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs index f3c322690..d25f8df14 100644 --- a/Source/Game/DataStorage/Structs/U_Records.cs +++ b/Source/Game/DataStorage/Structs/U_Records.cs @@ -12,7 +12,7 @@ namespace Game.DataStorage public uint Id; public int ParentUiMapID; public int Flags; - public uint System; + public byte System; public UiMapType Type; public int BountySetID; public uint BountyDisplayLocation; diff --git a/Source/Game/DataStorage/Structs/V_Records.cs b/Source/Game/DataStorage/Structs/V_Records.cs index 1b818bed4..2b7ae1bd0 100644 --- a/Source/Game/DataStorage/Structs/V_Records.cs +++ b/Source/Game/DataStorage/Structs/V_Records.cs @@ -11,7 +11,7 @@ namespace Game.DataStorage { public uint Id; public VehicleFlags Flags; - public byte FlagsB; + public int FlagsB; public float TurnSpeed; public float PitchSpeed; public float PitchMin; diff --git a/Source/Game/Entities/GameObject/GameObjectData.cs b/Source/Game/Entities/GameObject/GameObjectData.cs index ce5ce8fc4..6bc334bd5 100644 --- a/Source/Game/Entities/GameObject/GameObjectData.cs +++ b/Source/Game/Entities/GameObject/GameObjectData.cs @@ -1430,6 +1430,7 @@ namespace Game.Entities public uint turnpersonallootsecurityoff; // 22 turn personal loot security off, enum { false, true, }; Default: false public uint ClearObjectVignetteonOpening; // 23 Clear Object Vignette on Opening, enum { false, true, }; Default: false public uint InteractRadiusOverride; // 24 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0 + public uint Overrideminimaptrackingicon; // 25 Override minimap tracking icon, References: UiTextureAtlasMember, NoValue = 0 } public struct challengemodereward diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index 651bfd08a..9cd18a445 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -1246,20 +1246,20 @@ namespace Game.Entities public UpdateField SilencedSchoolMask = new(96, 121); public UpdateField NameplateAttachToGUID = new(96, 122); // When set, nameplate of this unit will instead appear on that object public UpdateFieldArray NpcFlags = new(2, 123, 124); - public UpdateFieldArray Power = new(7, 126, 127); - public UpdateFieldArray MaxPower = new(7, 126, 134); - public UpdateFieldArray PowerRegenFlatModifier = new(7, 126, 141); - public UpdateFieldArray PowerRegenInterruptedFlatModifier = new(7, 126, 148); - public UpdateFieldArray VirtualItems = new(3, 155, 156); - public UpdateFieldArray AttackRoundBaseTime = new(2, 159, 160); - public UpdateFieldArray Stats = new(4, 162, 163); - public UpdateFieldArray StatPosBuff = new(4, 162, 167); - public UpdateFieldArray StatNegBuff = new(4, 162, 171); - public UpdateFieldArray Resistances = new(7, 175, 176); - public UpdateFieldArray BonusResistanceMods = new(7, 175, 183); - public UpdateFieldArray ManaCostModifier = new(7, 175, 190); + public UpdateFieldArray Power = new(10, 126, 127); + public UpdateFieldArray MaxPower = new(10, 126, 137); + public UpdateFieldArray PowerRegenFlatModifier = new(10, 126, 147); + public UpdateFieldArray PowerRegenInterruptedFlatModifier = new(10, 126, 157); + public UpdateFieldArray VirtualItems = new(3, 167, 168); + public UpdateFieldArray AttackRoundBaseTime = new(2, 171, 172); + public UpdateFieldArray Stats = new(4, 174, 175); + public UpdateFieldArray StatPosBuff = new(4, 174, 179); + public UpdateFieldArray StatNegBuff = new(4, 174, 183); + public UpdateFieldArray Resistances = new(7, 187, 188); + public UpdateFieldArray BonusResistanceMods = new(7, 187, 195); + public UpdateFieldArray ManaCostModifier = new(7, 187, 202); - public UnitData() : base(0, TypeId.Unit, 197) { } + public UnitData() : base(0, TypeId.Unit, 209) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { @@ -1299,14 +1299,14 @@ namespace Game.Entities data.WriteUInt8(DisplayPower); data.WriteUInt32(OverrideDisplayPowerID); data.WriteUInt64(Health); - for (int i = 0; i < 7; ++i) + for (int i = 0; i < 10; ++i) { data.WriteInt32(Power[i]); data.WriteUInt32(MaxPower[i]); } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner) || fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) { - for (int i = 0; i < 7; ++i) + for (int i = 0; i < 10; ++i) { data.WriteFloat(PowerRegenFlatModifier[i]); data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); @@ -1456,7 +1456,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { - UpdateMask allowedMaskForTarget = new(197, new uint[] { 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xF8001FFFu, 0x00000003u, 0x00000000u }); + UpdateMask allowedMaskForTarget = new(209, new uint[] { 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0x0007FFFFu, 0x00003F80u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1464,16 +1464,16 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget.OR(new UpdateMask(197, new uint[] { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x400000FEu, 0x03FFF000u, 0xFFFFFFFEu, 0x0000000Fu })); + allowedMaskForTarget.OR(new UpdateMask(209, new uint[] { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x400000FEu, 0xFFF80000u, 0xFFFFC07Fu, 0x0001FFFFu })); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) - allowedMaskForTarget.OR(new UpdateMask(197, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x40000000u, 0x07FFE000u, 0x00000000u, 0x00000000u })); + allowedMaskForTarget.OR(new UpdateMask(209, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x40000000u, 0xFFF80000u, 0x0000007Fu, 0x00000000u })); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) - allowedMaskForTarget.OR(new UpdateMask(197, new uint[] { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x007F8000u, 0x00000000u })); + allowedMaskForTarget.OR(new UpdateMask(209, new uint[] { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF8000000u, 0x00000007u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(197, new[] { 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xF8001FFFu, 0x00000003u, 0x00000000u }); + UpdateMask allowedMaskForTarget = new(209, new[] { 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0x0007FFFFu, 0x00003F80u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask.AND(allowedMaskForTarget); } @@ -2036,77 +2036,77 @@ namespace Game.Entities } if (changesMask[126]) { - for (int i = 0; i < 7; ++i) + for (int i = 0; i < 10; ++i) { if (changesMask[127 + i]) { data.WriteInt32(Power[i]); } - if (changesMask[134 + i]) + if (changesMask[137 + i]) { data.WriteUInt32(MaxPower[i]); } - if (changesMask[141 + i]) + if (changesMask[147 + i]) { data.WriteFloat(PowerRegenFlatModifier[i]); } - if (changesMask[148 + i]) + if (changesMask[157 + i]) { data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[155]) + if (changesMask[167]) { for (int i = 0; i < 3; ++i) { - if (changesMask[156 + i]) + if (changesMask[168 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[159]) + if (changesMask[171]) { for (int i = 0; i < 2; ++i) { - if (changesMask[160 + i]) + if (changesMask[172 + i]) { data.WriteUInt32(AttackRoundBaseTime[i]); } } } - if (changesMask[162]) + if (changesMask[174]) { for (int i = 0; i < 4; ++i) { - if (changesMask[163 + i]) + if (changesMask[175 + i]) { data.WriteInt32(Stats[i]); } - if (changesMask[167 + i]) + if (changesMask[179 + i]) { data.WriteInt32(StatPosBuff[i]); } - if (changesMask[171 + i]) + if (changesMask[183 + i]) { data.WriteInt32(StatNegBuff[i]); } } } - if (changesMask[175]) + if (changesMask[187]) { for (int i = 0; i < 7; ++i) { - if (changesMask[176 + i]) + if (changesMask[188 + i]) { data.WriteInt32(Resistances[i]); } - if (changesMask[183 + i]) + if (changesMask[195 + i]) { data.WriteInt32(BonusResistanceMods[i]); } - if (changesMask[190 + i]) + if (changesMask[202 + i]) { data.WriteInt32(ManaCostModifier[i]); } @@ -2592,15 +2592,17 @@ namespace Game.Entities public UpdateField LogoutTime = new(0, 29); public UpdateField Field_B0 = new(0, 30); public UpdateField Field_B4 = new(0, 31); - public UpdateField CtrOptions = new(32, 33); - public UpdateField CovenantID = new(32, 34); - public UpdateField SoulbindID = new(32, 35); - public UpdateField DungeonScore = new(32, 36); - public UpdateFieldArray QuestLog = new(175, 37, 38); - public UpdateFieldArray VisibleItems = new(19, 213, 214); - public UpdateFieldArray AvgItemLevel = new(6, 233, 234); + public UpdateField CurrentBattlePetSpeciesID = new(32, 33); + public UpdateField CtrOptions = new(32, 34); + public UpdateField CovenantID = new(32, 35); + public UpdateField SoulbindID = new(32, 36); + public UpdateField DungeonScore = new(32, 37); + public UpdateFieldArray QuestLog = new(175, 38, 39); + public UpdateFieldArray VisibleItems = new(19, 214, 215); + public UpdateFieldArray AvgItemLevel = new(6, 234, 235); + public UpdateFieldArray Field_3120 = new(19, 241, 242); - public PlayerData() : base(0, TypeId.Player, 240) { } + public PlayerData() : base(0, TypeId.Player, 261) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { @@ -2646,10 +2648,15 @@ namespace Game.Entities data.WriteInt32(ArenaCooldowns.Size()); data.WriteInt32(Field_B0); data.WriteInt32(Field_B4); + data.WriteInt32(CurrentBattlePetSpeciesID); ((CTROptions)CtrOptions).WriteCreate(data, owner, receiver); data.WriteInt32(CovenantID); data.WriteInt32(SoulbindID); data.WriteInt32(VisualItemReplacements.Size()); + for (int i = 0; i < 19; ++i) + { + data.WriteUInt32(Field_3120[i]); + } for (int i = 0; i < Customizations.Size(); ++i) { Customizations[i].WriteCreate(data, owner, receiver); @@ -2680,7 +2687,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { - UpdateMask allowedMaskForTarget = new(240, new[] { 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFE00000u, 0x0000FFFFu }); + UpdateMask allowedMaskForTarget = new(261, new[] { 0xFFFFFFEDu, 0x0000003Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFC00000u, 0xFFFFFFFFu, 0x0000001Fu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2688,20 +2695,20 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - allowedMaskForTarget.OR(new UpdateMask(240, new[] { 0x00000012u, 0xFFFFFFE0u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x001FFFFFu, 0x00000000u })); + allowedMaskForTarget.OR(new UpdateMask(261, new[] { 0x00000012u, 0xFFFFFFC0u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x003FFFFFu, 0x00000000u, 0x00000000u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(240, new[] { 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFE00000u, 0x0000FFFFu }); + UpdateMask allowedMaskForTarget = new(261, new[] { 0xFFFFFFEDu, 0x0000003Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFC00000u, 0xFFFFFFFFu, 0x0000001Fu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask.AND(allowedMaskForTarget); } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Player owner, Player receiver) { - data.WriteBits(changesMask.GetBlocksMask(0), 8); - for (uint i = 0; i < 8; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 9); + for (uint i = 0; i < 9; ++i) if (changesMask.GetBlock(i) != 0) data.WriteBits(changesMask.GetBlock(i), 32); @@ -2896,26 +2903,30 @@ namespace Game.Entities { if (changesMask[33]) { - CtrOptions.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data.WriteInt32(CurrentBattlePetSpeciesID); } if (changesMask[34]) { - data.WriteInt32(CovenantID); + ((CTROptions)CtrOptions).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[35]) { - data.WriteInt32(SoulbindID); + data.WriteInt32(CovenantID); } if (changesMask[36]) + { + data.WriteInt32(SoulbindID); + } + if (changesMask[37]) { DungeonScore.GetValue().Write(data); } } - if (changesMask[37]) + if (changesMask[38]) { for (int i = 0; i < 175; ++i) { - if (changesMask[38 + i]) + if (changesMask[39 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2928,22 +2939,32 @@ namespace Game.Entities { for (int i = 0; i < 19; ++i) { - if (changesMask[164 + i]) + if (changesMask[215 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[233]) + if (changesMask[234]) { for (int i = 0; i < 6; ++i) { - if (changesMask[234 + i]) + if (changesMask[235 + i]) { data.WriteFloat(AvgItemLevel[i]); } } } + if (changesMask[241]) + { + for (int i = 0; i < 19; ++i) + { + if (changesMask[242 + i]) + { + data.WriteUInt32(Field_3120[i]); + } + } + } data.FlushBits(); } @@ -2980,6 +3001,7 @@ namespace Game.Entities ClearChangesMask(LogoutTime); ClearChangesMask(Field_B0); ClearChangesMask(Field_B4); + ClearChangesMask(CurrentBattlePetSpeciesID); ClearChangesMask(CtrOptions); ClearChangesMask(CovenantID); ClearChangesMask(SoulbindID); @@ -2987,6 +3009,7 @@ namespace Game.Entities ClearChangesMask(QuestLog); ClearChangesMask(VisibleItems); ClearChangesMask(AvgItemLevel); + ClearChangesMask(Field_3120); _changesMask.ResetAll(); } @@ -4174,6 +4197,42 @@ namespace Game.Entities } } + public struct CategoryCooldownMod + { + public int SpellCategoryID; + public int ModCooldown; + + public void WriteCreate(WorldPacket data, Player owner, Player receiver) + { + data.WriteInt32(SpellCategoryID); + data.WriteInt32(ModCooldown); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) + { + data.WriteInt32(SpellCategoryID); + data.WriteInt32(ModCooldown); + } + } + + public struct WeeklySpellUse + { + public int SpellCategoryID; + public byte Uses; + + public void WriteCreate(WorldPacket data, Player owner, Player receiver) + { + data.WriteInt32(SpellCategoryID); + data.WriteUInt8(Uses); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) + { + data.WriteInt32(SpellCategoryID); + data.WriteUInt8(Uses); + } + } + public class ActivePlayerData : BaseUpdateData { public static int ExploredZonesSize; @@ -4186,7 +4245,7 @@ namespace Game.Entities public UpdateField SortBagsRightToLeft = new(0, 3); public UpdateField InsertItemsLeftToRight = new(0, 4); public UpdateField HasPerksProgramPendingReward = new(0, 5); - public UpdateFieldArray> Research = new(1, 32, 33); + public UpdateFieldArray> Research = new(1, 35, 36); public DynamicUpdateField KnownTitles = new(0, 6); public DynamicUpdateField ResearchSites = new(0, 8); public DynamicUpdateField ResearchSiteProgress = new(0, 9); @@ -4209,112 +4268,116 @@ namespace Game.Entities public DynamicUpdateField ReplayedQuests = new(0, 27); public DynamicUpdateField DisabledSpells = new(0, 28); public DynamicUpdateField PersonalCraftingOrderCounts = new(0, 31); + public DynamicUpdateField CategoryCooldownMods = new(32, 33); + public DynamicUpdateField WeeklySpellUses = new(32, 34); public DynamicUpdateField PvpInfo = new(0, 7); public DynamicUpdateField CharacterRestrictions = new(0, 21); public DynamicUpdateField TraitConfigs = new(0, 29); public DynamicUpdateField CraftingOrders = new(0, 30); - public UpdateField FarsightObject = new(34, 35); - public UpdateField SummonedBattlePetGUID = new(34, 36); - public UpdateField Coinage = new(34, 37); - public UpdateField XP = new(34, 38); - public UpdateField NextLevelXP = new(34, 39); - public UpdateField TrialXP = new(34, 40); - public UpdateField Skill = new(34, 41); - public UpdateField CharacterPoints = new(34, 42); - public UpdateField MaxTalentTiers = new(34, 43); - public UpdateField TrackCreatureMask = new(34, 44); - public UpdateField MainhandExpertise = new(34, 45); - public UpdateField OffhandExpertise = new(34, 46); - public UpdateField RangedExpertise = new(34, 47); - public UpdateField CombatRatingExpertise = new(34, 48); - public UpdateField BlockPercentage = new(34, 49); - public UpdateField DodgePercentage = new(34, 50); - public UpdateField DodgePercentageFromAttribute = new(34, 51); - public UpdateField ParryPercentage = new(34, 52); - public UpdateField ParryPercentageFromAttribute = new(34, 53); - public UpdateField CritPercentage = new(34, 54); - public UpdateField RangedCritPercentage = new(34, 55); - public UpdateField OffhandCritPercentage = new(34, 56); - public UpdateField SpellCritPercentage = new(34, 57); - public UpdateField ShieldBlock = new(34, 58); - public UpdateField ShieldBlockCritPercentage = new(34, 59); - public UpdateField Mastery = new(34, 60); - public UpdateField Speed = new(34, 61); - public UpdateField Avoidance = new(34, 62); - public UpdateField Sturdiness = new(34, 63); - public UpdateField Versatility = new(34, 64); - public UpdateField VersatilityBonus = new(34, 65); - public UpdateField PvpPowerDamage = new(66, 67); - public UpdateField PvpPowerHealing = new(66, 68); - public UpdateField ModHealingDonePos = new(66, 69); - public UpdateField ModHealingPercent = new(66, 70); - public UpdateField ModPeriodicHealingDonePercent = new(66, 71); - public UpdateField ModSpellPowerPercent = new(66, 72); - public UpdateField ModResiliencePercent = new(66, 73); - public UpdateField OverrideSpellPowerByAPPercent = new(66, 74); - public UpdateField OverrideAPBySpellPowerPercent = new(66, 75); - public UpdateField ModTargetResistance = new(66, 76); - public UpdateField ModTargetPhysicalResistance = new(66, 77); - public UpdateField LocalFlags = new(66, 78); - public UpdateField GrantableLevels = new(66, 79); - public UpdateField MultiActionBars = new(66, 80); - public UpdateField LifetimeMaxRank = new(66, 81); - public UpdateField NumRespecs = new(66, 82); - public UpdateField PvpMedals = new(66, 83); - public UpdateField TodayHonorableKills = new(66, 84); - public UpdateField YesterdayHonorableKills = new(66, 85); - public UpdateField LifetimeHonorableKills = new(66, 86); - public UpdateField WatchedFactionIndex = new(66, 87); - public UpdateField MaxLevel = new(66, 88); - public UpdateField ScalingPlayerLevelDelta = new(66, 89); - public UpdateField MaxCreatureScalingLevel = new(66, 90); - public UpdateField PetSpellPower = new(66, 91); - public UpdateField UiHitModifier = new(66, 92); - public UpdateField UiSpellHitModifier = new(66, 93); - public UpdateField HomeRealmTimeOffset = new(66, 94); - public UpdateField ModPetHaste = new(66, 95); - public UpdateField JailersTowerLevelMax = new(66, 96); - public UpdateField JailersTowerLevel = new(66, 97); - public UpdateField LocalRegenFlags = new(98, 99); - public UpdateField AuraVision = new(98, 100); - public UpdateField NumBackpackSlots = new(98, 101); - public UpdateField OverrideSpellsID = new(98, 102); - public UpdateField LootSpecID = new(98, 103); - public UpdateField OverrideZonePVPType = new(98, 104); - public UpdateField BnetAccount = new(98, 105); - public UpdateField GuildClubMemberID = new(98, 106); - public UpdateField Honor = new(98, 107); - public UpdateField HonorNextLevel = new(98, 108); - public UpdateField PerksProgramCurrency = new(98, 109); - public UpdateField NumBankSlots = new(98, 110); - public UpdateField FrozenPerksVendorItem = new(98, 111); - public UpdateField Field_1410 = new(98, 113); - public OptionalUpdateField QuestSession = new(98, 112); - public UpdateField UiChromieTimeExpansionID = new(98, 114); - public UpdateField TransportServerTime = new(98, 115); - public UpdateField WeeklyRewardsPeriodSinceOrigin = new(98, 116); // week count since Cfg_RegionsEntry::ChallengeOrigin - public UpdateField DEBUGSoulbindConduitRank = new(98, 117); - public UpdateField DungeonScore = new(98, 118); - public UpdateField ActiveCombatTraitConfigID = new(98, 119); - public UpdateFieldArray InvSlots = new(218, 120, 121); - public UpdateFieldArray ExploredZones = new(240, 339, 340); - public UpdateFieldArray RestInfo = new(2, 580, 581); - public UpdateFieldArray ModDamageDonePos = new(7, 583, 584); - public UpdateFieldArray ModDamageDoneNeg = new(7, 583, 591); - public UpdateFieldArray ModDamageDonePercent = new(7, 583, 598); - public UpdateFieldArray ModHealingDonePercent = new(7, 583, 605); - public UpdateFieldArray WeaponDmgMultipliers = new(3, 612, 613); - public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 612, 616); - public UpdateFieldArray BuybackPrice = new(12, 619, 620); - public UpdateFieldArray BuybackTimestamp = new(12, 619, 632); - public UpdateFieldArray CombatRatings = new(32, 644, 645); - public UpdateFieldArray NoReagentCostMask = new(4, 677, 678); - public UpdateFieldArray ProfessionSkillLine = new(2, 682, 683); - public UpdateFieldArray BagSlotFlags = new(5, 685, 686); - public UpdateFieldArray BankBagSlotFlags = new(7, 691, 692); - public UpdateFieldArray QuestCompleted = new(875, 699, 700); + public UpdateField FarsightObject = new(32, 37); + public UpdateField SummonedBattlePetGUID = new(32, 38); + public UpdateField Coinage = new(32, 39); + public UpdateField XP = new(32, 40); + public UpdateField NextLevelXP = new(32, 41); + public UpdateField TrialXP = new(32, 42); + public UpdateField Skill = new(32, 43); + public UpdateField CharacterPoints = new(32, 44); + public UpdateField MaxTalentTiers = new(32, 45); + public UpdateField TrackCreatureMask = new(32, 46); + public UpdateField MainhandExpertise = new(32, 47); + public UpdateField OffhandExpertise = new(32, 48); + public UpdateField RangedExpertise = new(32, 49); + public UpdateField CombatRatingExpertise = new(32, 50); + public UpdateField BlockPercentage = new(32, 51); + public UpdateField DodgePercentage = new(32, 52); + public UpdateField DodgePercentageFromAttribute = new(32, 53); + public UpdateField ParryPercentage = new(32, 54); + public UpdateField ParryPercentageFromAttribute = new(32, 55); + public UpdateField CritPercentage = new(32, 56); + public UpdateField RangedCritPercentage = new(32, 57); + public UpdateField OffhandCritPercentage = new(32, 58); + public UpdateField SpellCritPercentage = new(32, 59); + public UpdateField ShieldBlock = new(32, 60); + public UpdateField ShieldBlockCritPercentage = new(32, 61); + public UpdateField Mastery = new(32, 62); + public UpdateField Speed = new(32, 63); + public UpdateField Avoidance = new(32, 64); + public UpdateField Sturdiness = new(32, 65); + public UpdateField Versatility = new(66, 67); + public UpdateField VersatilityBonus = new(66, 68); + public UpdateField PvpPowerDamage = new(66, 69); + public UpdateField PvpPowerHealing = new(66, 70); + public UpdateField ModHealingDonePos = new(66, 71); + public UpdateField ModHealingPercent = new(66, 72); + public UpdateField ModPeriodicHealingDonePercent = new(66, 73); + public UpdateField ModSpellPowerPercent = new(66, 74); + public UpdateField ModResiliencePercent = new(66, 75); + public UpdateField OverrideSpellPowerByAPPercent = new(66, 76); + public UpdateField OverrideAPBySpellPowerPercent = new(66, 77); + public UpdateField ModTargetResistance = new(66, 78); + public UpdateField ModTargetPhysicalResistance = new(66, 79); + public UpdateField LocalFlags = new(66, 80); + public UpdateField GrantableLevels = new(66, 81); + public UpdateField MultiActionBars = new(66, 82); + public UpdateField LifetimeMaxRank = new(66, 83); + public UpdateField NumRespecs = new(66, 84); + public UpdateField PvpMedals = new(66, 85); + public UpdateField TodayHonorableKills = new(66, 86); + public UpdateField YesterdayHonorableKills = new(66, 87); + public UpdateField LifetimeHonorableKills = new(66, 88); + public UpdateField WatchedFactionIndex = new(66, 89); + public UpdateField MaxLevel = new(66, 90); + public UpdateField ScalingPlayerLevelDelta = new(66, 91); + public UpdateField MaxCreatureScalingLevel = new(66, 92); + public UpdateField PetSpellPower = new(66, 93); + public UpdateField UiHitModifier = new(66, 94); + public UpdateField UiSpellHitModifier = new(66, 95); + public UpdateField HomeRealmTimeOffset = new(66, 96); + public UpdateField ModPetHaste = new(66, 97); + public UpdateField JailersTowerLevelMax = new(98, 99); + public UpdateField JailersTowerLevel = new(98, 100); + public UpdateField LocalRegenFlags = new(98, 101); + public UpdateField AuraVision = new(98, 102); + public UpdateField NumBackpackSlots = new(98, 103); + public UpdateField OverrideSpellsID = new(98, 104); + public UpdateField LootSpecID = new(98, 105); + public UpdateField OverrideZonePVPType = new(98, 106); + public UpdateField BnetAccount = new(98, 107); + public UpdateField GuildClubMemberID = new(98, 108); + public UpdateField Honor = new(98, 109); + public UpdateField HonorNextLevel = new(98, 110); + public UpdateField PerksProgramCurrency = new(98, 111); + public UpdateField NumBankSlots = new(98, 112); + public UpdateField FrozenPerksVendorItem = new(98, 113); + public UpdateField Field_1410 = new(98, 115); + public OptionalUpdateField QuestSession = new(98, 114); + public UpdateField UiChromieTimeExpansionID = new(98, 116); + public UpdateField TransportServerTime = new(98, 117); + public UpdateField WeeklyRewardsPeriodSinceOrigin = new(98, 118); // week count since Cfg_RegionsEntry::ChallengeOrigin + public UpdateField DEBUGSoulbindConduitRank = new(98, 119); + public UpdateField DungeonScore = new(98, 120); + public UpdateField ActiveCombatTraitConfigID = new(98, 121); + public UpdateField LootHistoryInstanceID = new(98, 122); + public UpdateFieldArray InvSlots = new(227, 123, 124); + public UpdateFieldArray ExploredZones = new(240, 351, 352); + public UpdateFieldArray RestInfo = new(2, 592, 593); + public UpdateFieldArray ModDamageDonePos = new(7, 595, 596); + public UpdateFieldArray ModDamageDoneNeg = new(7, 595, 603); + public UpdateFieldArray ModDamageDonePercent = new(7, 595, 610); + public UpdateFieldArray ModHealingDonePercent = new(7, 595, 617); + public UpdateFieldArray WeaponDmgMultipliers = new(3, 624, 625); + public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 624, 628); + public UpdateFieldArray BuybackPrice = new(12, 631, 632); + public UpdateFieldArray BuybackTimestamp = new(12, 631, 644); + public UpdateFieldArray CombatRatings = new(32, 656, 657); + public UpdateFieldArray NoReagentCostMask = new(4, 689, 690); + public UpdateFieldArray ProfessionSkillLine = new(2, 694, 695); + public UpdateFieldArray BagSlotFlags = new(5, 697, 698); + public UpdateFieldArray BankBagSlotFlags = new(7, 703, 704); + public UpdateFieldArray QuestCompleted = new(875, 711, 712); + public UpdateFieldArray ItemUpgradeHighWatermark = new(17, 1587, 1588); - public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1575) + public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1605) { ExploredZonesSize = ExploredZones.GetSize(); ExploredZonesBits = sizeof(ulong) * 8; @@ -4325,7 +4388,7 @@ namespace Game.Entities public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { - for (int i = 0; i < 218; ++i) + for (int i = 0; i < 227; ++i) { data.WritePackedGuid(InvSlots[i]); } @@ -4491,6 +4554,13 @@ namespace Game.Entities data.WriteUInt32(ActiveCombatTraitConfigID); data.WriteInt32(CraftingOrders.Size()); data.WriteInt32(PersonalCraftingOrderCounts.Size()); + data.WriteInt32(CategoryCooldownMods.Size()); + data.WriteInt32(WeeklySpellUses.Size()); + for (int i = 0; i < 17; ++i) + { + data.WriteFloat(ItemUpgradeHighWatermark[i]); + } + data.WriteUInt64(LootHistoryInstanceID); for (int i = 0; i < KnownTitles.Size(); ++i) { data.WriteUInt64(KnownTitles[i]); @@ -4579,6 +4649,14 @@ namespace Game.Entities { PersonalCraftingOrderCounts[i].WriteCreate(data, owner, receiver); } + for (int i = 0; i < CategoryCooldownMods.Size(); ++i) + { + CategoryCooldownMods[i].WriteCreate(data, owner, receiver); + } + for (int i = 0; i < WeeklySpellUses.Size(); ++i) + { + WeeklySpellUses[i].WriteCreate(data, owner, receiver); + } data.FlushBits(); data.WriteBit(BackpackAutoSortDisabled); data.WriteBit(BankAutoSortDisabled); @@ -4621,8 +4699,8 @@ namespace Game.Entities { for (uint i = 0; i < 1; ++i) data.WriteUInt32(changesMask.GetBlocksMask(i)); - data.WriteBits(changesMask.GetBlocksMask(1), 18); - for (uint i = 0; i < 50; ++i) + data.WriteBits(changesMask.GetBlocksMask(1), 19); + for (uint i = 0; i < 51; ++i) if (changesMask.GetBlock(i) != 0) data.WriteBits(changesMask.GetBlock(i), 32); @@ -4775,11 +4853,11 @@ namespace Game.Entities WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.Size(), data); } } - if (changesMask[32]) + if (changesMask[35]) { for (int i = 0; i < 1; ++i) { - if (changesMask[33 + i]) + if (changesMask[36 + i]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -4855,6 +4933,23 @@ namespace Game.Entities WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.Size(), data); } } + if (changesMask[32]) + { + if (changesMask[33]) + { + if (!ignoreNestedChangesMask) + CategoryCooldownMods.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.Size(), data); + } + if (changesMask[34]) + { + if (!ignoreNestedChangesMask) + WeeklySpellUses.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.Size(), data); + } + } data.FlushBits(); if (changesMask[0]) { @@ -5078,6 +5173,32 @@ namespace Game.Entities } } } + } + if (changesMask[32]) + { + if (changesMask[33]) + { + for (int i = 0; i < CategoryCooldownMods.Size(); ++i) + { + if (CategoryCooldownMods.HasChanged(i) || ignoreNestedChangesMask) + { + CategoryCooldownMods[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[34]) + { + for (int i = 0; i < WeeklySpellUses.Size(); ++i) + { + if (WeeklySpellUses.HasChanged(i) || ignoreNestedChangesMask) + { + WeeklySpellUses[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + } + if (changesMask[0]) + { if (changesMask[7]) { for (int i = 0; i < PvpInfo.Size(); ++i) @@ -5119,494 +5240,508 @@ namespace Game.Entities } } } - if (changesMask[34]) + if (changesMask[32]) { - if (changesMask[35]) + if (changesMask[37]) { data.WritePackedGuid(FarsightObject); } - if (changesMask[36]) + if (changesMask[38]) { data.WritePackedGuid(SummonedBattlePetGUID); } - if (changesMask[37]) + if (changesMask[39]) { data.WriteUInt64(Coinage); } - if (changesMask[38]) + if (changesMask[40]) { data.WriteUInt32(XP); } - if (changesMask[39]) + if (changesMask[41]) { data.WriteUInt32(NextLevelXP); } - if (changesMask[40]) + if (changesMask[42]) { data.WriteInt32(TrialXP); } - if (changesMask[41]) + if (changesMask[43]) { ((SkillInfo)Skill).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[42]) + if (changesMask[44]) { data.WriteUInt32(CharacterPoints); } - if (changesMask[43]) + if (changesMask[45]) { data.WriteUInt32(MaxTalentTiers); } - if (changesMask[44]) + if (changesMask[46]) { data.WriteUInt32(TrackCreatureMask); } - if (changesMask[45]) + if (changesMask[47]) { data.WriteFloat(MainhandExpertise); } - if (changesMask[46]) + if (changesMask[48]) { data.WriteFloat(OffhandExpertise); } - if (changesMask[47]) + if (changesMask[49]) { data.WriteFloat(RangedExpertise); } - if (changesMask[48]) + if (changesMask[50]) { data.WriteFloat(CombatRatingExpertise); } - if (changesMask[49]) + if (changesMask[51]) { data.WriteFloat(BlockPercentage); } - if (changesMask[50]) + if (changesMask[52]) { data.WriteFloat(DodgePercentage); } - if (changesMask[51]) + if (changesMask[53]) { data.WriteFloat(DodgePercentageFromAttribute); } - if (changesMask[52]) + if (changesMask[54]) { data.WriteFloat(ParryPercentage); } - if (changesMask[53]) + if (changesMask[55]) { data.WriteFloat(ParryPercentageFromAttribute); } - if (changesMask[54]) + if (changesMask[56]) { data.WriteFloat(CritPercentage); } - if (changesMask[55]) + if (changesMask[57]) { data.WriteFloat(RangedCritPercentage); } - if (changesMask[56]) + if (changesMask[58]) { data.WriteFloat(OffhandCritPercentage); } - if (changesMask[57]) + if (changesMask[59]) { data.WriteFloat(SpellCritPercentage); } - if (changesMask[58]) + if (changesMask[60]) { data.WriteUInt32(ShieldBlock); } - if (changesMask[59]) + if (changesMask[61]) { data.WriteFloat(ShieldBlockCritPercentage); } - if (changesMask[60]) + if (changesMask[62]) { data.WriteFloat(Mastery); } - if (changesMask[61]) + if (changesMask[63]) { data.WriteFloat(Speed); } - if (changesMask[62]) + if (changesMask[64]) { data.WriteFloat(Avoidance); } - if (changesMask[63]) - { - data.WriteFloat(Sturdiness); - } - if (changesMask[64]) - { - data.WriteInt32(Versatility); - } if (changesMask[65]) { - data.WriteFloat(VersatilityBonus); + data.WriteFloat(Sturdiness); } } if (changesMask[66]) { if (changesMask[67]) { - data.WriteFloat(PvpPowerDamage); + data.WriteInt32(Versatility); } if (changesMask[68]) { - data.WriteFloat(PvpPowerHealing); + data.WriteFloat(VersatilityBonus); } if (changesMask[69]) { - data.WriteInt32(ModHealingDonePos); + data.WriteFloat(PvpPowerDamage); } if (changesMask[70]) { - data.WriteFloat(ModHealingPercent); + data.WriteFloat(PvpPowerHealing); } if (changesMask[71]) { - data.WriteFloat(ModPeriodicHealingDonePercent); + data.WriteInt32(ModHealingDonePos); } if (changesMask[72]) { - data.WriteFloat(ModSpellPowerPercent); + data.WriteFloat(ModHealingPercent); } if (changesMask[73]) { - data.WriteFloat(ModResiliencePercent); + data.WriteFloat(ModPeriodicHealingDonePercent); } if (changesMask[74]) { - data.WriteFloat(OverrideSpellPowerByAPPercent); + data.WriteFloat(ModSpellPowerPercent); } if (changesMask[75]) { - data.WriteFloat(OverrideAPBySpellPowerPercent); + data.WriteFloat(ModResiliencePercent); } if (changesMask[76]) { - data.WriteInt32(ModTargetResistance); + data.WriteFloat(OverrideSpellPowerByAPPercent); } if (changesMask[77]) { - data.WriteInt32(ModTargetPhysicalResistance); + data.WriteFloat(OverrideAPBySpellPowerPercent); } if (changesMask[78]) { - data.WriteUInt32(LocalFlags); + data.WriteInt32(ModTargetResistance); } if (changesMask[79]) { - data.WriteUInt8(GrantableLevels); + data.WriteInt32(ModTargetPhysicalResistance); } if (changesMask[80]) { - data.WriteUInt8(MultiActionBars); + data.WriteUInt32(LocalFlags); } if (changesMask[81]) { - data.WriteUInt32(LifetimeMaxRank); + data.WriteUInt8(GrantableLevels); } if (changesMask[82]) { - data.WriteUInt16(NumRespecs); + data.WriteUInt8(MultiActionBars); } if (changesMask[83]) { - data.WriteUInt32(PvpMedals); + data.WriteUInt8(LifetimeMaxRank); } if (changesMask[84]) { - data.WriteUInt32(TodayHonorableKills); + data.WriteUInt8(NumRespecs); } if (changesMask[85]) { - data.WriteUInt32(YesterdayHonorableKills); + data.WriteUInt32(PvpMedals); } if (changesMask[86]) { - data.WriteUInt32(LifetimeHonorableKills); + data.WriteUInt16(TodayHonorableKills); } if (changesMask[87]) { - data.WriteUInt32(WatchedFactionIndex); + data.WriteUInt16(YesterdayHonorableKills); } if (changesMask[88]) { - data.WriteInt32(MaxLevel); + data.WriteUInt32(LifetimeHonorableKills); } if (changesMask[89]) { - data.WriteInt32(ScalingPlayerLevelDelta); + data.WriteUInt32(WatchedFactionIndex); } if (changesMask[90]) { - data.WriteInt32(MaxCreatureScalingLevel); + data.WriteInt32(MaxLevel); } if (changesMask[91]) { - data.WriteUInt32(PetSpellPower); + data.WriteInt32(ScalingPlayerLevelDelta); } if (changesMask[92]) { - data.WriteFloat(UiHitModifier); + data.WriteInt32(MaxCreatureScalingLevel); } if (changesMask[93]) { - data.WriteFloat(UiSpellHitModifier); + data.WriteUInt32(PetSpellPower); } if (changesMask[94]) { - data.WriteInt32(HomeRealmTimeOffset); + data.WriteFloat(UiHitModifier); } if (changesMask[95]) { - data.WriteFloat(ModPetHaste); + data.WriteFloat(UiSpellHitModifier); } if (changesMask[96]) { - data.WriteInt8(JailersTowerLevelMax); + data.WriteInt32(HomeRealmTimeOffset); } if (changesMask[97]) { - data.WriteInt8(JailersTowerLevel); + data.WriteFloat(ModPetHaste); } } if (changesMask[98]) { if (changesMask[99]) { - data.WriteUInt8(LocalRegenFlags); + data.WriteInt8(JailersTowerLevelMax); } if (changesMask[100]) { - data.WriteUInt32(AuraVision); + data.WriteInt8(JailersTowerLevel); } if (changesMask[101]) { - data.WriteUInt16(NumBackpackSlots); + data.WriteUInt8(LocalRegenFlags); } if (changesMask[102]) { - data.WriteUInt32(OverrideSpellsID); + data.WriteUInt8(AuraVision); } if (changesMask[103]) { - data.WriteUInt16(LootSpecID); + data.WriteUInt8(NumBackpackSlots); } if (changesMask[104]) { - data.WriteUInt64(OverrideZonePVPType); + data.WriteUInt32(OverrideSpellsID); } if (changesMask[105]) { - data.WritePackedGuid(BnetAccount); + data.WriteUInt16(LootSpecID); } if (changesMask[106]) { - data.WriteUInt64(GuildClubMemberID); + data.WriteUInt32(OverrideZonePVPType); } if (changesMask[107]) { - data.WriteUInt32(Honor); + data.WritePackedGuid(BnetAccount); } if (changesMask[108]) { - data.WriteUInt32(HonorNextLevel); + data.WriteUInt64(GuildClubMemberID); } if (changesMask[109]) { - data.WriteInt32(PerksProgramCurrency); + data.WriteUInt32(Honor); } if (changesMask[110]) + { + data.WriteUInt32(HonorNextLevel); + } + if (changesMask[111]) + { + data.WriteInt32(PerksProgramCurrency); + } + if (changesMask[112]) { data.WriteInt32(NumBankSlots); } - if (changesMask[114]) - { - data.WriteInt32(UiChromieTimeExpansionID); - } - if (changesMask[115]) - { - data.WriteInt32(TransportServerTime); - } if (changesMask[116]) { - data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); + data.WriteInt32(UiChromieTimeExpansionID); } if (changesMask[117]) { - data.WriteInt16(DEBUGSoulbindConduitRank); + data.WriteInt32(TransportServerTime); + } + if (changesMask[118]) + { + data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); } if (changesMask[119]) + { + data.WriteInt16(DEBUGSoulbindConduitRank); + } + if (changesMask[121]) { data.WriteUInt32(ActiveCombatTraitConfigID); } + if (changesMask[122]) + { + data.WriteUInt64(LootHistoryInstanceID); + } } if (changesMask[98]) { data.WriteBits(QuestSession.HasValue(), 1); - if (changesMask[111]) + if (changesMask[113]) { FrozenPerksVendorItem.GetValue().Write(data); } - if (changesMask[112]) + if (changesMask[114]) { if (QuestSession.HasValue()) { QuestSession.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[113]) + if (changesMask[115]) { ((ActivePlayerUnk901)Field_1410).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[118]) + if (changesMask[120]) { DungeonScore.GetValue().Write(data); } } - if (changesMask[120]) + if (changesMask[123]) { - for (int i = 0; i < 218; ++i) + for (int i = 0; i < 227; ++i) { - if (changesMask[121 + i]) + if (changesMask[124 + i]) { data.WritePackedGuid(InvSlots[i]); } } } - if (changesMask[339]) + if (changesMask[351]) { for (int i = 0; i < 240; ++i) { - if (changesMask[340 + i]) + if (changesMask[352 + i]) { data.WriteUInt64(ExploredZones[i]); } } } - if (changesMask[580]) + if (changesMask[592]) { for (int i = 0; i < 2; ++i) { - if (changesMask[581 + i]) + if (changesMask[593 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[583]) + if (changesMask[595]) { for (int i = 0; i < 7; ++i) { - if (changesMask[584 + i]) + if (changesMask[596 + i]) { data.WriteInt32(ModDamageDonePos[i]); } - if (changesMask[591 + i]) + if (changesMask[603 + i]) { data.WriteInt32(ModDamageDoneNeg[i]); } - if (changesMask[598 + i]) + if (changesMask[610 + i]) { data.WriteFloat(ModDamageDonePercent[i]); } - if (changesMask[605 + i]) + if (changesMask[617 + i]) { data.WriteFloat(ModHealingDonePercent[i]); } } } - if (changesMask[612]) + if (changesMask[624]) { for (int i = 0; i < 3; ++i) { - if (changesMask[613 + i]) + if (changesMask[625 + i]) { data.WriteFloat(WeaponDmgMultipliers[i]); } - if (changesMask[616 + i]) + if (changesMask[628 + i]) { data.WriteFloat(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[619]) + if (changesMask[631]) { for (int i = 0; i < 12; ++i) { - if (changesMask[620 + i]) + if (changesMask[632 + i]) { data.WriteUInt32(BuybackPrice[i]); } - if (changesMask[632 + i]) + if (changesMask[644 + i]) { data.WriteUInt64(BuybackTimestamp[i]); } } } - if (changesMask[644]) + if (changesMask[656]) { for (int i = 0; i < 32; ++i) { - if (changesMask[645 + i]) + if (changesMask[657 + i]) { data.WriteUInt32(CombatRatings[i]); } } } - if (changesMask[677]) + if (changesMask[689]) { for (int i = 0; i < 4; ++i) { - if (changesMask[678 + i]) + if (changesMask[690 + i]) { data.WriteUInt32(NoReagentCostMask[i]); } } } - if (changesMask[682]) + if (changesMask[694]) { for (int i = 0; i < 2; ++i) { - if (changesMask[683 + i]) + if (changesMask[695 + i]) { data.WriteUInt32(ProfessionSkillLine[i]); } } } - if (changesMask[685]) + if (changesMask[697]) { for (int i = 0; i < 5; ++i) { - if (changesMask[686 + i]) + if (changesMask[698 + i]) { data.WriteUInt32(BagSlotFlags[i]); } } } - if (changesMask[691]) + if (changesMask[703]) { for (int i = 0; i < 7; ++i) { - if (changesMask[692 + i]) + if (changesMask[704 + i]) { data.WriteUInt32(BankBagSlotFlags[i]); } } } - if (changesMask[699]) + if (changesMask[711]) { for (int i = 0; i < 875; ++i) { - if (changesMask[700 + i]) + if (changesMask[712 + i]) { data.WriteUInt64(QuestCompleted[i]); } } } + if (changesMask[1587]) + { + for (int i = 0; i < 17; ++i) + { + if (changesMask[1588 + i]) + { + data.WriteFloat(ItemUpgradeHighWatermark[i]); + } + } + } data.FlushBits(); } @@ -5640,6 +5775,8 @@ namespace Game.Entities ClearChangesMask(ReplayedQuests); ClearChangesMask(DisabledSpells); ClearChangesMask(PersonalCraftingOrderCounts); + ClearChangesMask(CategoryCooldownMods); + ClearChangesMask(WeeklySpellUses); ClearChangesMask(PvpInfo); ClearChangesMask(CharacterRestrictions); ClearChangesMask(TraitConfigs); @@ -5727,6 +5864,7 @@ namespace Game.Entities ClearChangesMask(DEBUGSoulbindConduitRank); ClearChangesMask(DungeonScore); ClearChangesMask(ActiveCombatTraitConfigID); + ClearChangesMask(LootHistoryInstanceID); ClearChangesMask(InvSlots); ClearChangesMask(ExploredZones); ClearChangesMask(RestInfo); @@ -5744,6 +5882,7 @@ namespace Game.Entities ClearChangesMask(BagSlotFlags); ClearChangesMask(BankBagSlotFlags); ClearChangesMask(QuestCompleted); + ClearChangesMask(ItemUpgradeHighWatermark); _changesMask.ResetAll(); } } @@ -6378,30 +6517,33 @@ namespace Game.Entities public class AreaTriggerFieldData : BaseUpdateData { - public UpdateField OverrideScaleCurve = new(0, 1); - public UpdateField ExtraScaleCurve = new(0, 2); - public UpdateField Field_C38 = new(0, 3); - public UpdateField Field_C54 = new(0, 4); - public UpdateField Field_C70 = new(0, 5); - public UpdateField Caster = new(0, 6); - public UpdateField Duration = new(0, 7); - public UpdateField TimeToTarget = new(0, 8); - public UpdateField TimeToTargetScale = new(0, 9); - public UpdateField TimeToTargetExtraScale = new(0, 10); - public UpdateField Field_B0 = new(0, 11); - public UpdateField SpellID = new(0, 12); - public UpdateField SpellForVisuals = new(0, 13); - public UpdateField SpellVisual = new(0, 14); - public UpdateField BoundsRadius2D = new(0, 15); - public UpdateField DecalPropertiesID = new(0, 16); - public UpdateField CreatingEffectGUID = new(0, 17); - public UpdateField Field_80 = new(0, 18); - public UpdateField Field_84 = new(0, 19); - public UpdateField Field_88 = new(0, 20); - public UpdateField Field_F8 = new(0, 21); - public UpdateField VisualAnim = new(0, 22); + public UpdateField Field_260 = new(0, 1); + public UpdateField Field_261 = new(0, 2); + public UpdateField OverrideScaleCurve = new(0, 3); + public UpdateField ExtraScaleCurve = new(0, 4); + public UpdateField Field_C38 = new(0, 5); + public UpdateField Field_C54 = new(0, 6); + public UpdateField Field_C70 = new(0, 7); + public UpdateField Caster = new(0, 8); + public UpdateField Duration = new(0, 9); + public UpdateField TimeToTarget = new(0, 10); + public UpdateField TimeToTargetScale = new(0, 11); + public UpdateField TimeToTargetExtraScale = new(0, 12); + public UpdateField Field_B0 = new(0, 13); + public UpdateField SpellID = new(0, 14); + public UpdateField SpellForVisuals = new(0, 15); + public UpdateField SpellVisual = new(0, 16); + public UpdateField BoundsRadius2D = new(0, 17); + public UpdateField DecalPropertiesID = new(0, 18); + public UpdateField CreatingEffectGUID = new(0, 19); + public UpdateField Field_80 = new(0, 20); + public UpdateField Field_84 = new(0, 21); + public UpdateField Field_88 = new(0, 22); + public UpdateField Field_F8 = new(0, 23); + public UpdateField VisualAnim = new(0, 24); - public AreaTriggerFieldData() : base(0, TypeId.AreaTrigger, 23) { } + + public AreaTriggerFieldData() : base(0, TypeId.AreaTrigger, 25) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) { @@ -6425,10 +6567,13 @@ namespace Game.Entities data.WritePackedGuid(Field_88); data.WriteVector3(Field_F8); ExtraScaleCurve.GetValue().WriteCreate(data, owner, receiver); + data.WriteBit(Field_260); + data.WriteBit(Field_261); Field_C38.GetValue().WriteCreate(data, owner, receiver); Field_C54.GetValue().WriteCreate(data, owner, receiver); Field_C70.GetValue().WriteCreate(data, owner, receiver); VisualAnim.GetValue().WriteCreate(data, owner, receiver); + data.FlushBits(); } public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) @@ -6438,104 +6583,118 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, AreaTrigger owner, Player receiver) { - data.WriteBits(_changesMask.GetBlock(0), 23); + data.WriteBits(_changesMask.GetBlock(0), 25); - data.FlushBits(); if (_changesMask[0]) { if (_changesMask[1]) + { + data.WriteBit(Field_260); + } + if (changesMask[2]) + { + data.WriteBit(Field_261); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[3]) { OverrideScaleCurve.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (_changesMask[6]) - { - data.WritePackedGuid(Caster); - } - if (_changesMask[7]) - { - data.WriteUInt32(Duration); - } if (_changesMask[8]) { - data.WriteUInt32(TimeToTarget); + data.WritePackedGuid(Caster); } if (_changesMask[9]) { - data.WriteUInt32(TimeToTargetScale); + data.WriteUInt32(Duration); } if (_changesMask[10]) { - data.WriteUInt32(TimeToTargetExtraScale); + data.WriteUInt32(TimeToTarget); } if (_changesMask[11]) { - data.WriteUInt32(Field_B0); + data.WriteUInt32(TimeToTargetScale); } - if (changesMask[12]) + if (_changesMask[12]) { - data.WriteUInt32(SpellID); + data.WriteUInt32(TimeToTargetExtraScale); } if (_changesMask[13]) { - data.WriteUInt32(SpellForVisuals); + data.WriteUInt32(Field_B0); } - if (_changesMask[14]) + if (changesMask[14]) { - SpellVisual.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data.WriteUInt32(SpellID); } if (_changesMask[15]) { - data.WriteFloat(BoundsRadius2D); + data.WriteUInt32(SpellForVisuals); } if (_changesMask[16]) { - data.WriteUInt32(DecalPropertiesID); + SpellVisual.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (_changesMask[17]) + { + data.WriteFloat(BoundsRadius2D); + } + if (_changesMask[18]) + { + data.WriteUInt32(DecalPropertiesID); + } + if (_changesMask[19]) { data.WritePackedGuid(CreatingEffectGUID); } - if (changesMask[18]) - { - data.WriteUInt32(Field_80); - } - if (changesMask[19]) - { - data.WriteUInt32(Field_84); - } if (changesMask[20]) { - data.WritePackedGuid(Field_88); + data.WriteUInt32(Field_80); } if (changesMask[21]) + { + data.WriteUInt32(Field_84); + } + if (changesMask[22]) + { + data.WritePackedGuid(Field_88); + } + if (changesMask[23]) { data.WriteVector3(Field_F8); } - if (_changesMask[2]) + if (_changesMask[4]) { ExtraScaleCurve.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[3]) + if (changesMask[5]) { Field_C38.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[4]) + if (changesMask[6]) { Field_C54.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[5]) + if (changesMask[7]) { Field_C70.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[22]) + if (changesMask[24]) { VisualAnim.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } + data.FlushBits(); } public override void ClearChangesMask() { + ClearChangesMask(Field_260); + ClearChangesMask(Field_261); ClearChangesMask(OverrideScaleCurve); ClearChangesMask(ExtraScaleCurve); ClearChangesMask(Field_C38); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 6d8392c66..ec00f0653 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -265,6 +265,7 @@ namespace Game.Entities bool HasSpline = unit.IsSplineEnabled(); bool HasInertia = unit.m_movementInfo.inertia.HasValue; bool HasAdvFlying = unit.m_movementInfo.advFlying.HasValue; + bool HasStandingOnGameObjectGUID = unit.m_movementInfo.standingOnGameObjectGUID.HasValue; data.WritePackedGuid(GetGUID()); // MoverGUID @@ -287,6 +288,7 @@ namespace Game.Entities //for (public uint i = 0; i < RemoveForcesIDs.Count; ++i) // *data << ObjectGuid(RemoveForcesIDs); + data.WriteBit(HasStandingOnGameObjectGUID); // HasStandingOnGameObjectGUID data.WriteBit(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport data.WriteBit(HasFall); // HasFall data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement @@ -297,6 +299,9 @@ namespace Game.Entities if (!unit.m_movementInfo.transport.guid.IsEmpty()) MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport); + if (HasStandingOnGameObjectGUID) + data.WritePackedGuid(unit.m_movementInfo.standingOnGameObjectGUID.Value); + if (HasInertia) { data.WriteInt32(unit.m_movementInfo.inertia.Value.id); @@ -3774,6 +3779,7 @@ namespace Game.Entities public JumpInfo jump; public float stepUpStartElevation { get; set; } public AdvFlying? advFlying; + public ObjectGuid? standingOnGameObjectGUID; public MovementInfo() { diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 9c743ed40..01cd8691e 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -3684,19 +3684,8 @@ namespace Game.Entities stmt.AddValue(index++, GetDrunkValue()); stmt.AddValue(index++, GetHealth()); - int storedPowers = 0; - for (PowerType powerType = 0; powerType < PowerType.Max; ++powerType) - { - if (GetPowerIndex(powerType) != (int)PowerType.Max) - { - stmt.AddValue(index++, m_unitData.Power[storedPowers]); - if (++storedPowers >= (int)PowerType.MaxPerClass) - break; - } - } - - for (; storedPowers < (int)PowerType.MaxPerClass; ++storedPowers) - stmt.AddValue(index++, 0); + for (int i = 0; i < (int)PowerType.MaxPerClass; ++i) + stmt.AddValue(index++, m_unitData.Power[i]); stmt.AddValue(index++, GetSession().GetLatency()); stmt.AddValue(index++, GetActiveTalentGroup()); @@ -3830,19 +3819,8 @@ namespace Game.Entities stmt.AddValue(index++, GetDrunkValue()); stmt.AddValue(index++, GetHealth()); - int storedPowers = 0; - for (PowerType powerType = 0; powerType < PowerType.Max; ++powerType) - { - if (GetPowerIndex(powerType) != (int)PowerType.Max) - { - stmt.AddValue(index++, m_unitData.Power[storedPowers]); - if (++storedPowers >= (int)PowerType.MaxPerClass) - break; - } - } - - for (; storedPowers < (int)PowerType.MaxPerClass; ++storedPowers) - stmt.AddValue(index++, 0); + for (int i = 0; i < (int)PowerType.MaxPerClass; ++i) + stmt.AddValue(index++, m_unitData.Power[i]); stmt.AddValue(index++, GetSession().GetLatency()); stmt.AddValue(index++, GetActiveTalentGroup()); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index cb337b1f4..3cc0d9aed 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -5395,6 +5395,43 @@ namespace Game.Entities GetSceneMgr().TriggerDelayedScenes(); } + public void AddSpellCategoryCooldownMod(int spellCategoryId, int mod) + { + int categoryIndex = m_activePlayerData.CategoryCooldownMods.FindIndexIf(mod => mod.SpellCategoryID == spellCategoryId); + + if (categoryIndex < 0) + { + CategoryCooldownMod newMod = new(); + newMod.SpellCategoryID = spellCategoryId; + newMod.ModCooldown = -mod; + + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CategoryCooldownMods), newMod); + } + else + { + CategoryCooldownMod g = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CategoryCooldownMods, categoryIndex); + SetUpdateFieldValue(ref g.ModCooldown, m_activePlayerData.CategoryCooldownMods[categoryIndex].ModCooldown - mod); + } + } + + public void RemoveSpellCategoryCooldownMod(int spellCategoryId, int mod) + { + int categoryIndex = m_activePlayerData.CategoryCooldownMods.FindIndexIf(mod => mod.SpellCategoryID == spellCategoryId); + + if (categoryIndex < 0) + return; + + if (m_activePlayerData.CategoryCooldownMods[categoryIndex].ModCooldown + mod == 0) + { + RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CategoryCooldownMods), categoryIndex); + } + else + { + CategoryCooldownMod g = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CategoryCooldownMods, categoryIndex); + SetUpdateFieldValue(ref g.ModCooldown, m_activePlayerData.CategoryCooldownMods[categoryIndex].ModCooldown + mod); + } + } + public void RemoveSocial() { SocialMgr.RemovePlayerSocial(GetGUID()); diff --git a/Source/Game/Entities/Player/PlayerTaxi.cs b/Source/Game/Entities/Player/PlayerTaxi.cs index 89e89e31e..8300ca267 100644 --- a/Source/Game/Entities/Player/PlayerTaxi.cs +++ b/Source/Game/Entities/Player/PlayerTaxi.cs @@ -19,7 +19,7 @@ namespace Game.Entities public void InitTaxiNodesForLevel(Race race, Class chrClass, uint level) { - m_taximask = new byte[((CliDB.TaxiNodesStorage.GetNumRows() - 1) / 8) + 1]; + m_taximask = new byte[((CliDB.TaxiNodesStorage.GetNumRows() - 1) / (8 * 64) + 1) * 8]; // class specific initial known nodes if (chrClass == Class.Deathknight) @@ -93,7 +93,7 @@ namespace Game.Entities public void LoadTaxiMask(string data) { - m_taximask = new byte[((CliDB.TaxiNodesStorage.GetNumRows() - 1) / 8) + 1]; + m_taximask = new byte[((CliDB.TaxiNodesStorage.GetNumRows() - 1) / (8 * 64) + 1) * 8]; var split = new StringArray(data, ' '); diff --git a/Source/Game/Entities/StatSystem.cs b/Source/Game/Entities/StatSystem.cs index d1da8dcdc..318978c78 100644 --- a/Source/Game/Entities/StatSystem.cs +++ b/Source/Game/Entities/StatSystem.cs @@ -140,6 +140,13 @@ namespace Game.Entities case UnitMods.ArcaneCharges: case UnitMods.Fury: case UnitMods.Pain: + case UnitMods.Essence: + case UnitMods.RuneBlood: + case UnitMods.RuneFrost: + case UnitMods.RuneUnholy: + case UnitMods.AlternateQuest: + case UnitMods.AlternateEncounter: + case UnitMods.AlternateMount: UpdateMaxPower((PowerType)(unitMod - UnitMods.PowerStart)); break; case UnitMods.ResistanceHoly: diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index 7b1852e00..7b97b8b34 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -696,12 +696,6 @@ namespace Game } } - [WorldPacketHandler(ClientOpcodes.RequestCategoryCooldowns, Processing = PacketProcessing.Inplace)] - void HandleRequestCategoryCooldowns(RequestCategoryCooldowns requestCategoryCooldowns) - { - GetPlayer().SendSpellCategoryCooldowns(); - } - [WorldPacketHandler(ClientOpcodes.KeyboundOverride, Processing = PacketProcessing.ThreadSafe)] void HandleKeyboundOverride(KeyboundOverride keyboundOverride) { diff --git a/Source/Game/Loot/Loot.cs b/Source/Game/Loot/Loot.cs index 77477b000..273811405 100644 --- a/Source/Game/Loot/Loot.cs +++ b/Source/Game/Loot/Loot.cs @@ -278,6 +278,7 @@ namespace Game.Loots FillPacket(startLootRoll.Item); startLootRoll.Item.UIType = LootSlotType.RollOngoing; + startLootRoll.DungeonEncounterID = m_loot.GetDungeonEncounterId(); player.SendPacket(startLootRoll); } @@ -299,6 +300,7 @@ namespace Game.Loots lootAllPassed.LootObj = m_loot.GetGUID(); FillPacket(lootAllPassed.Item); lootAllPassed.Item.UIType = LootSlotType.AllowLoot; + lootAllPassed.DungeonEncounterID = m_loot.GetDungeonEncounterId(); lootAllPassed.Write(); foreach (var (playerGuid, roll) in m_rollVoteMap) @@ -325,6 +327,7 @@ namespace Game.Loots lootRoll.Autopassed = false; FillPacket(lootRoll.Item); lootRoll.Item.UIType = LootSlotType.RollOngoing; + lootRoll.DungeonEncounterID = m_loot.GetDungeonEncounterId(); lootRoll.Write(); foreach (var (playerGuid, roll) in m_rollVoteMap) @@ -381,6 +384,7 @@ namespace Game.Loots lootRollWon.RollType = rollType; FillPacket(lootRollWon.Item); lootRollWon.Item.UIType = LootSlotType.Locked; + lootRollWon.DungeonEncounterID = m_loot.GetDungeonEncounterId(); lootRollWon.MainSpec = true; // offspec rolls not implemented lootRollWon.Write(); diff --git a/Source/Game/Networking/Packets/BattleGroundPackets.cs b/Source/Game/Networking/Packets/BattleGroundPackets.cs index 73b257ddf..b74cd8028 100644 --- a/Source/Game/Networking/Packets/BattleGroundPackets.cs +++ b/Source/Game/Networking/Packets/BattleGroundPackets.cs @@ -718,6 +718,9 @@ namespace Game.Networking.Packets if (MmrChange.HasValue) data.WriteInt32(MmrChange.Value); + + if (PostMatchMMR.HasValue) + data.WriteUInt32(PostMatchMMR.Value); } public ObjectGuid PlayerGUID; @@ -731,6 +734,7 @@ namespace Game.Networking.Packets public int? RatingChange; public uint? PreMatchMMR; public int? MmrChange; + public uint? PostMatchMMR; public List Stats = new(); public int PrimaryTalentTree; public int Sex; diff --git a/Source/Game/Networking/Packets/BattlePetPackets.cs b/Source/Game/Networking/Packets/BattlePetPackets.cs index 77cce9671..a408d84c4 100644 --- a/Source/Game/Networking/Packets/BattlePetPackets.cs +++ b/Source/Game/Networking/Packets/BattlePetPackets.cs @@ -216,12 +216,12 @@ namespace Game.Networking.Packets public override void Read() { PetGuid = _worldPacket.ReadPackedGuid(); - Flags = _worldPacket.ReadUInt32(); + Flags = _worldPacket.ReadUInt16(); ControlType = (FlagsControlType)_worldPacket.ReadBits(2); } public ObjectGuid PetGuid; - public uint Flags; + public ushort Flags; public FlagsControlType ControlType; } diff --git a/Source/Game/Networking/Packets/CharacterPackets.cs b/Source/Game/Networking/Packets/CharacterPackets.cs index bbf425a7b..543c0625a 100644 --- a/Source/Game/Networking/Packets/CharacterPackets.cs +++ b/Source/Game/Networking/Packets/CharacterPackets.cs @@ -224,7 +224,7 @@ namespace Game.Networking.Packets public byte RaceId; public Class ClassId; public byte SexId; - public Array Customizations = new(72); + public Array Customizations = new(125); public byte ExperienceLevel; public uint ZoneId; public uint MapId; @@ -566,7 +566,7 @@ namespace Game.Networking.Packets public string Name; public byte SexID; public byte RaceID; - public Array Customizations = new(72); + public Array Customizations = new(125); } } @@ -878,7 +878,7 @@ namespace Game.Networking.Packets } public byte NewSex; - public Array Customizations = new(72); + public Array Customizations = new(125); public int CustomizedRace; } @@ -1028,7 +1028,7 @@ namespace Game.Networking.Packets ObjectGuid CharGUID; string CharName = ""; byte SexID; - Array Customizations = new(72); + Array Customizations = new(125); } class CharCustomizeFailure : ServerPacket @@ -1090,7 +1090,7 @@ namespace Game.Networking.Packets public Race RaceId = Race.None; public Class ClassId = Class.None; public Gender Sex = Gender.None; - public Array Customizations = new(72); + public Array Customizations = new(125); public uint? TemplateSet; public bool IsTrialBoost; public bool UseNPE; @@ -1111,7 +1111,7 @@ namespace Game.Networking.Packets public ObjectGuid CharGUID; public Gender SexID = Gender.None; public string CharName; - public Array Customizations = new(72); + public Array Customizations = new(125); } public class CharRaceOrFactionChangeInfo @@ -1122,7 +1122,7 @@ namespace Game.Networking.Packets public ObjectGuid Guid; public bool FactionChange; public string Name; - public Array Customizations = new(72); + public Array Customizations = new(125); } public class CharacterUndeleteInfo diff --git a/Source/Game/Networking/Packets/ChatPackets.cs b/Source/Game/Networking/Packets/ChatPackets.cs index 68d416c3a..ad65dd083 100644 --- a/Source/Game/Networking/Packets/ChatPackets.cs +++ b/Source/Game/Networking/Packets/ChatPackets.cs @@ -12,17 +12,30 @@ namespace Game.Networking.Packets { public class ChatMessage : ClientPacket { + public string Text; + public Language Language = Language.Universal; + public bool IsSecure = true; + public ChatMessage(WorldPacket packet) : base(packet) { } public override void Read() { Language = (Language)_worldPacket.ReadInt32(); uint len = _worldPacket.ReadBits(11); + switch (GetOpcode()) + { + case ClientOpcodes.ChatMessageSay: + case ClientOpcodes.ChatMessageParty: + case ClientOpcodes.ChatMessageRaid: + case ClientOpcodes.ChatMessageRaidWarning: + case ClientOpcodes.ChatMessageInstanceChat: + IsSecure = _worldPacket.HasBit(); + break; + default: + break; + } Text = _worldPacket.ReadString(len); } - - public string Text; - public Language Language = Language.Universal; } public class ChatMessageWhisper : ClientPacket @@ -45,6 +58,12 @@ namespace Game.Networking.Packets public class ChatMessageChannel : ClientPacket { + public Language Language = Language.Universal; + public ObjectGuid ChannelGUID; + public string Text; + public string Target; + public bool? IsSecure; + public ChatMessageChannel(WorldPacket packet) : base(packet) { } public override void Read() @@ -53,14 +72,12 @@ namespace Game.Networking.Packets ChannelGUID = _worldPacket.ReadPackedGuid(); uint targetLen = _worldPacket.ReadBits(9); uint textLen = _worldPacket.ReadBits(11); + if (_worldPacket.HasBit()) + IsSecure = _worldPacket.HasBit(); + Target = _worldPacket.ReadString(targetLen); Text = _worldPacket.ReadString(textLen); } - - public Language Language = Language.Universal; - public ObjectGuid ChannelGUID; - public string Text; - public string Target; } public class ChatAddonMessage : ClientPacket @@ -143,7 +160,6 @@ namespace Game.Networking.Packets SenderGUID.Clear(); SenderAccountGUID.Clear(); SenderGuildGUID.Clear(); - PartyGUID.Clear(); TargetGUID.Clear(); SenderName = ""; TargetName = ""; @@ -181,10 +197,6 @@ namespace Game.Networking.Packets _ChatFlags = playerSender.GetChatFlags(); SenderGuildGUID = ObjectGuid.Create(HighGuid.Guild, playerSender.GetGuildId()); - - Group group = playerSender.GetGroup(); - if (group) - PartyGUID = group.GetGUID(); } } @@ -207,15 +219,15 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(TargetGUID); _worldPacket.WriteUInt32(TargetVirtualAddress); _worldPacket.WriteUInt32(SenderVirtualAddress); - _worldPacket.WritePackedGuid(PartyGUID); _worldPacket.WriteUInt32(AchievementID); _worldPacket.WriteFloat(DisplayTime); + _worldPacket.WriteUInt32(SpellID); _worldPacket.WriteBits(SenderName.GetByteCount(), 11); _worldPacket.WriteBits(TargetName.GetByteCount(), 11); _worldPacket.WriteBits(Prefix.GetByteCount(), 5); _worldPacket.WriteBits(Channel.GetByteCount(), 7); _worldPacket.WriteBits(ChatText.GetByteCount(), 12); - _worldPacket.WriteBits((byte)_ChatFlags, 15); + _worldPacket.WriteBits((ushort)_ChatFlags, 15); _worldPacket.WriteBit(HideChatLog); _worldPacket.WriteBit(FakeSenderName); _worldPacket.WriteBit(Unused_801.HasValue); @@ -241,7 +253,6 @@ namespace Game.Networking.Packets public ObjectGuid SenderGuildGUID; public ObjectGuid SenderAccountGUID; public ObjectGuid TargetGUID; - public ObjectGuid PartyGUID; public uint SenderVirtualAddress; public uint TargetVirtualAddress; public string SenderName = ""; @@ -252,6 +263,7 @@ namespace Game.Networking.Packets public uint AchievementID; public ChatFlags _ChatFlags; public float DisplayTime; + public uint SpellID; public uint? Unused_801; public bool HideChatLog; public bool FakeSenderName; diff --git a/Source/Game/Networking/Packets/CombatLogPackets.cs b/Source/Game/Networking/Packets/CombatLogPackets.cs index 0b38fee5e..537c006e7 100644 --- a/Source/Game/Networking/Packets/CombatLogPackets.cs +++ b/Source/Game/Networking/Packets/CombatLogPackets.cs @@ -551,7 +551,7 @@ namespace Game.Networking.Packets attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta); attackRoundInfo.WriteFloat(ContentTuning.PlayerItemLevel); attackRoundInfo.WriteFloat(ContentTuning.TargetItemLevel); - attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID); + attackRoundInfo.WriteUInt32(ContentTuning.ScalingHealthItemLevelCurveID); attackRoundInfo.WriteUInt32((uint)ContentTuning.Flags); attackRoundInfo.WriteUInt32(ContentTuning.PlayerContentTuningID); attackRoundInfo.WriteUInt32(ContentTuning.TargetContentTuningID); diff --git a/Source/Game/Networking/Packets/LootPackets.cs b/Source/Game/Networking/Packets/LootPackets.cs index 5ed103a02..55689c57e 100644 --- a/Source/Game/Networking/Packets/LootPackets.cs +++ b/Source/Game/Networking/Packets/LootPackets.cs @@ -259,6 +259,15 @@ namespace Game.Networking.Packets class StartLootRoll : ServerPacket { + public ObjectGuid LootObj; + public int MapID; + public uint RollTime; + public LootMethod Method; + public RollMask ValidRolls; + public Array LootRollIneligibleReason = new Array(4); + public LootItemData Item = new(); + public uint DungeonEncounterID; + public StartLootRoll() : base(ServerOpcodes.StartLootRoll) { } public override void Write() @@ -271,20 +280,22 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32((uint)reason); _worldPacket.WriteUInt8((byte)Method); + _worldPacket.WriteUInt32(DungeonEncounterID); Item.Write(_worldPacket); } - - public ObjectGuid LootObj; - public int MapID; - public uint RollTime; - public LootMethod Method; - public RollMask ValidRolls; - public Array LootRollIneligibleReason = new Array(4); - public LootItemData Item = new(); } class LootRollBroadcast : ServerPacket { + public ObjectGuid LootObj; + public ObjectGuid Player; + public int Roll; // Roll value can be negative, it means that it is an "offspec" roll but only during roll selection broadcast (not when sending the result) + public RollVote RollType; + public LootItemData Item = new(); + public bool Autopassed; // Triggers message |HlootHistory:%d|h[Loot]|h: You automatically passed on: %s because you cannot loot that item. + public bool OffSpec; + public uint DungeonEncounterID; + public LootRollBroadcast() : base(ServerOpcodes.LootRoll) { } public override void Write() @@ -293,21 +304,24 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(Player); _worldPacket.WriteInt32(Roll); _worldPacket.WriteUInt8((byte)RollType); + _worldPacket.WriteUInt32(DungeonEncounterID); Item.Write(_worldPacket); _worldPacket.WriteBit(Autopassed); + _worldPacket.WriteBit(OffSpec); _worldPacket.FlushBits(); } - - public ObjectGuid LootObj; - public ObjectGuid Player; - public int Roll; // Roll value can be negative, it means that it is an "offspec" roll but only during roll selection broadcast (not when sending the result) - public RollVote RollType; - public LootItemData Item = new(); - public bool Autopassed; // Triggers message |HlootHistory:%d|h[Loot]|h: You automatically passed on: %s because you cannot loot that item. } class LootRollWon : ServerPacket { + public ObjectGuid LootObj; + public ObjectGuid Winner; + public int Roll; + public RollVote RollType; + public LootItemData Item = new(); + public bool MainSpec; + public uint DungeonEncounterID; + public LootRollWon() : base(ServerOpcodes.LootRollWon) { } public override void Write() @@ -316,45 +330,43 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(Winner); _worldPacket.WriteInt32(Roll); _worldPacket.WriteUInt8((byte)RollType); + _worldPacket.WriteUInt32(DungeonEncounterID); Item.Write(_worldPacket); _worldPacket.WriteBit(MainSpec); _worldPacket.FlushBits(); } - - public ObjectGuid LootObj; - public ObjectGuid Winner; - public int Roll; - public RollVote RollType; - public LootItemData Item = new(); - public bool MainSpec; } class LootAllPassed : ServerPacket { + public ObjectGuid LootObj; + public LootItemData Item = new(); + public uint DungeonEncounterID; + public LootAllPassed() : base(ServerOpcodes.LootAllPassed) { } public override void Write() { _worldPacket.WritePackedGuid(LootObj); + _worldPacket.WriteUInt32(DungeonEncounterID); Item.Write(_worldPacket); } - - public ObjectGuid LootObj; - public LootItemData Item = new(); } class LootRollsComplete : ServerPacket { + public ObjectGuid LootObj; + public byte LootListID; + public int DungeonEncounterID; + public LootRollsComplete() : base(ServerOpcodes.LootRollsComplete) { } public override void Write() { _worldPacket.WritePackedGuid(LootObj); _worldPacket.WriteUInt8(LootListID); + _worldPacket.WriteInt32(DungeonEncounterID); } - - public ObjectGuid LootObj; - public byte LootListID; } class MasterLootCandidateList : ServerPacket diff --git a/Source/Game/Networking/Packets/MiscPackets.cs b/Source/Game/Networking/Packets/MiscPackets.cs index dc04cc59f..94d9ae311 100644 --- a/Source/Game/Networking/Packets/MiscPackets.cs +++ b/Source/Game/Networking/Packets/MiscPackets.cs @@ -106,7 +106,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(QuantityGainSource.HasValue); _worldPacket.WriteBit(QuantityLostSource.HasValue); _worldPacket.WriteBit(FirstCraftOperationID.HasValue); - _worldPacket.WriteBit(LastSpendTime.HasValue); + _worldPacket.WriteBit(NextRechargeTime.HasValue); + _worldPacket.WriteBit(RechargeCycleStartTime.HasValue); _worldPacket.FlushBits(); if (WeeklyQuantity.HasValue) @@ -133,8 +134,11 @@ namespace Game.Networking.Packets if (FirstCraftOperationID.HasValue) _worldPacket.WriteUInt32(FirstCraftOperationID.Value); - if (LastSpendTime.HasValue) - _worldPacket.WriteInt64(LastSpendTime.Value); + if (NextRechargeTime.HasValue) + _worldPacket.WriteInt64(NextRechargeTime.Value); + + if (RechargeCycleStartTime.HasValue) + _worldPacket.WriteInt64(RechargeCycleStartTime.Value); } public uint Type; @@ -149,7 +153,8 @@ namespace Game.Networking.Packets public CurrencyGainSource? QuantityGainSource; public CurrencyDestroyReason? QuantityLostSource; public uint? FirstCraftOperationID; - public long? LastSpendTime; + public long? NextRechargeTime; + public long? RechargeCycleStartTime; public bool SuppressChatLog; } @@ -197,7 +202,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(data.TrackedQuantity.HasValue); _worldPacket.WriteBit(data.MaxQuantity.HasValue); _worldPacket.WriteBit(data.TotalEarned.HasValue); - _worldPacket.WriteBit(data.LastSpendTime.HasValue); + _worldPacket.WriteBit(data.NextRechargeTime.HasValue); + _worldPacket.WriteBit(data.RechargeCycleStartTime.HasValue); _worldPacket.WriteBits(data.Flags, 5); _worldPacket.FlushBits(); @@ -211,8 +217,10 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(data.MaxQuantity.Value); if (data.TotalEarned.HasValue) _worldPacket.WriteInt32(data.TotalEarned.Value); - if (data.LastSpendTime.HasValue) - _worldPacket.WriteInt64(data.LastSpendTime.Value); + if (data.NextRechargeTime.HasValue) + _worldPacket.WriteInt64(data.NextRechargeTime.Value); + if (data.RechargeCycleStartTime.HasValue) + _worldPacket.WriteInt64(data.RechargeCycleStartTime.Value); } } @@ -227,7 +235,8 @@ namespace Game.Networking.Packets public uint? TrackedQuantity; public int? MaxQuantity; public int? TotalEarned; - public long? LastSpendTime; + public long? NextRechargeTime; + public long? RechargeCycleStartTime; public byte Flags; } } @@ -1387,10 +1396,10 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(IsFullUpdate); _worldPacket.WriteInt32(Mounts.Count); - foreach (var spell in Mounts) + foreach (var (spellId, flags) in Mounts) { - _worldPacket.WriteUInt32(spell.Key); - _worldPacket.WriteBits(spell.Value, 2); + _worldPacket.WriteUInt32(spellId); + _worldPacket.WriteBits(flags, 4); } _worldPacket.FlushBits(); diff --git a/Source/Game/Networking/Packets/MovementPackets.cs b/Source/Game/Networking/Packets/MovementPackets.cs index 474976bd8..f71eb5cef 100644 --- a/Source/Game/Networking/Packets/MovementPackets.cs +++ b/Source/Game/Networking/Packets/MovementPackets.cs @@ -83,8 +83,7 @@ namespace Game.Networking.Packets data.ReadPackedGuid(); } - // ResetBitReader - + bool hasStandingOnGameObjectGUID = data.HasBit(); bool hasTransport = data.HasBit(); bool hasFall = data.HasBit(); bool hasSpline = data.HasBit(); // todo 6.x read this infos @@ -97,6 +96,9 @@ namespace Game.Networking.Packets if (hasTransport) ReadTransportInfo(data, ref movementInfo.transport); + if (hasStandingOnGameObjectGUID) + movementInfo.standingOnGameObjectGUID = data.ReadPackedGuid(); + if (hasInertia) { MovementInfo.Inertia inertia = new(); @@ -143,6 +145,7 @@ namespace Game.Networking.Packets bool hasSpline = false; // todo 6.x send this infos bool hasInertia = movementInfo.inertia.HasValue; bool hasAdvFlying = movementInfo.advFlying.HasValue; + bool hasStandingOnGameObjectGUID = movementInfo.standingOnGameObjectGUID.HasValue; data.WritePackedGuid(movementInfo.Guid); data.WriteUInt32((uint)movementInfo.GetMovementFlags()); @@ -167,6 +170,7 @@ namespace Game.Networking.Packets _worldPacket << ObjectGuid; }*/ + data.WriteBit(hasStandingOnGameObjectGUID); data.WriteBit(hasTransportData); data.WriteBit(hasFallData); data.WriteBit(hasSpline); @@ -179,6 +183,9 @@ namespace Game.Networking.Packets if (hasTransportData) WriteTransportInfo(data, movementInfo.transport); + if (hasStandingOnGameObjectGUID) + data.WritePackedGuid(movementInfo.standingOnGameObjectGUID.Value); + if (hasInertia) { data.WriteInt32(movementInfo.inertia.Value.id); diff --git a/Source/Game/Networking/Packets/SpellPackets.cs b/Source/Game/Networking/Packets/SpellPackets.cs index 6906cb7b0..e23986ec7 100644 --- a/Source/Game/Networking/Packets/SpellPackets.cs +++ b/Source/Game/Networking/Packets/SpellPackets.cs @@ -61,18 +61,11 @@ namespace Game.Networking.Packets public override void Read() { } } - public class RequestCategoryCooldowns : ClientPacket - { - public RequestCategoryCooldowns(WorldPacket packet) : base(packet) { } - - public override void Read() { } - } - public class SpellCategoryCooldown : ServerPacket { public List CategoryCooldowns = new(); - public SpellCategoryCooldown() : base(ServerOpcodes.CategoryCooldown, ConnectionType.Instance) { } + public SpellCategoryCooldown() : base(ServerOpcodes.SpellCategoryCooldown, ConnectionType.Instance) { } public override void Write() { @@ -1337,7 +1330,7 @@ namespace Game.Networking.Packets data.WriteFloat(PlayerItemLevel); data.WriteFloat(TargetItemLevel); data.WriteInt16(PlayerLevelDelta); - data.WriteUInt16(ScalingHealthItemLevelCurveID); + data.WriteUInt32(ScalingHealthItemLevelCurveID); data.WriteUInt8(TargetLevel); data.WriteUInt8(Expansion); data.WriteInt8(TargetScalingLevelDelta); @@ -1353,7 +1346,7 @@ namespace Game.Networking.Packets public short PlayerLevelDelta; public float PlayerItemLevel; public float TargetItemLevel; - public ushort ScalingHealthItemLevelCurveID; + public uint ScalingHealthItemLevelCurveID; public byte TargetLevel; public byte Expansion; public sbyte TargetScalingLevelDelta; @@ -1641,7 +1634,8 @@ namespace Game.Networking.Packets public MissileTrajectoryRequest MissileTrajectory; public MovementInfo MoveUpdate; public List Weight = new(); - public Array OptionalReagents = new(3); + public Array OptionalReagents = new(6); + public Array RemovedModifications = new(6); public Array OptionalCurrencies = new(5 /*MAX_ITEM_EXT_COST_CURRENCIES*/); public ulong? CraftingOrderID; public ObjectGuid CraftingNPC; @@ -1659,10 +1653,11 @@ namespace Game.Networking.Packets MissileTrajectory.Read(data); CraftingNPC = data.ReadPackedGuid(); - var optionalCurrencies = data.ReadUInt32(); - var optionalReagents = data.ReadUInt32(); + var optionalCurrenciesCount = data.ReadUInt32(); + var optionalReagentsCount = data.ReadUInt32(); + var removedModificationsCount = data.ReadUInt32(); - for (var i = 0; i < optionalCurrencies; ++i) + for (var i = 0; i < optionalCurrenciesCount; ++i) OptionalCurrencies[i].Read(data); SendCastFlags = data.ReadBits(5); @@ -1675,9 +1670,12 @@ namespace Game.Networking.Packets if (hasCraftingOrderID) CraftingOrderID = data.ReadUInt64(); - for (var i = 0; i < optionalReagents; ++i) + for (var i = 0; i < optionalReagentsCount; ++i) OptionalReagents[i].Read(data); + for (var i = 0; i < removedModificationsCount; ++i) + RemovedModifications[i].Read(data); + if (hasMoveUpdate) MoveUpdate = MovementExtensions.ReadMovementInfo(data); diff --git a/Source/Game/Networking/Packets/TaxiPackets.cs b/Source/Game/Networking/Packets/TaxiPackets.cs index 4adc30fb9..75ebb764b 100644 --- a/Source/Game/Networking/Packets/TaxiPackets.cs +++ b/Source/Game/Networking/Packets/TaxiPackets.cs @@ -43,8 +43,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(WindowInfo.HasValue); _worldPacket.FlushBits(); - _worldPacket.WriteInt32(CanLandNodes.Length); - _worldPacket.WriteInt32(CanUseNodes.Length); + _worldPacket.WriteInt32(CanLandNodes.Length / 8); // client reads this in uint64 blocks, size is ensured to be divisible by 8 in TaxiMask constructor + _worldPacket.WriteInt32(CanUseNodes.Length / 8); // client reads this in uint64 blocks, size is ensured to be divisible by 8 in TaxiMask constructor if (WindowInfo.HasValue) { diff --git a/Source/Game/Quest/Quest.cs b/Source/Game/Quest/Quest.cs index f93a68d58..314d026fd 100644 --- a/Source/Game/Quest/Quest.cs +++ b/Source/Game/Quest/Quest.cs @@ -366,13 +366,18 @@ namespace Game if (questXp == null || xpDifficulty >= 10) return 0; + uint xp = questXp.Difficulty[xpDifficulty]; + var contentTuning = CliDB.ContentTuningStorage.LookupByKey(contentTuningId); + if (contentTuning != null) + xp = (uint)(xp * contentTuning.QuestXpMultiplier); + int diffFactor = (int)(2 * (questLevel - player.GetLevel()) + 12); if (diffFactor < 1) diffFactor = 1; else if (diffFactor > 10) diffFactor = 10; - uint xp = (uint)(diffFactor * questXp.Difficulty[xpDifficulty] * xpMultiplier / 10); + xp = (uint)(diffFactor * xp * xpMultiplier / 10); if (player.GetLevel() >= Global.ObjectMgr.GetMaxLevelForExpansion(PlayerConst.CurrentExpansion - 1) && player.GetSession().GetExpansion() == PlayerConst.CurrentExpansion && expansion >= 0 && expansion < (int)PlayerConst.CurrentExpansion) xp = (uint)(xp / 9.0f); diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 4b8a1912b..184dd03a5 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -5633,9 +5633,14 @@ namespace Game.Spells if (!mode.HasAnyFlag(AuraEffectHandleModes.Real)) return; - Player player = aurApp.GetTarget().ToPlayer(); - if (player) - player.SendSpellCategoryCooldowns(); + Player target = aurApp.GetTarget().ToPlayer(); + if (target == null) + return; + + if (apply) + target.AddSpellCategoryCooldownMod(GetMiscValue(), GetAmount()); + else + target.RemoveSpellCategoryCooldownMod(GetMiscValue(), GetAmount()); } [AuraEffectHandler(AuraType.ShowConfirmationPrompt)] diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index e5c1b03f6..5d16b4bdd 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -1270,7 +1270,7 @@ namespace Game.Spells uint creatureType = target.GetCreatureTypeMask(); - return TargetCreatureType == 0 || creatureType == 0 || Convert.ToBoolean(creatureType & TargetCreatureType); + return TargetCreatureType == 0 || creatureType == 0 || (creatureType & TargetCreatureType) != 0 || target.HasAuraType(AuraType.IgnoreSpellCreatureTypeRequirements); } public SpellSchoolMask GetSchoolMask() @@ -4824,7 +4824,15 @@ namespace Game.Spells new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 303 SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 304 SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 305 SPELL_EFFECT_305 - new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 306 SPELL_EFFECT_306 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 306 SPELL_EFFECT_306 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 307 SPELL_EFFECT_307 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 308 SPELL_EFFECT_308 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 309 SPELL_EFFECT_309 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 310 SPELL_EFFECT_310 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 311 SPELL_EFFECT_311 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 312 SPELL_EFFECT_312 + new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Item), // 313 SPELL_EFFECT_313 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 314 SPELL_EFFECT_314 }; #region Fields