diff --git a/Source/Framework/Constants/GossipConst.cs b/Source/Framework/Constants/GossipConst.cs index 2c6a342fa..b1fb6f8eb 100644 --- a/Source/Framework/Constants/GossipConst.cs +++ b/Source/Framework/Constants/GossipConst.cs @@ -123,4 +123,18 @@ namespace Framework.Constants public const uint GossipSenderSecMailbox = 9; public const uint GossipSenderSecStablemaster = 10; } + + public enum GossipOptionStatus + { + Available = 0, + Unavailable = 1, + Locked = 2, + AlreadyComplete = 3 + } + + public enum GossipOptionRewardType + { + Item = 0, + Currency = 1 + } } diff --git a/Source/Framework/Constants/LootConst.cs b/Source/Framework/Constants/LootConst.cs index 3f7e23121..4f2be50f0 100644 --- a/Source/Framework/Constants/LootConst.cs +++ b/Source/Framework/Constants/LootConst.cs @@ -85,6 +85,12 @@ namespace Framework.Constants FishingJunk = 22 // unsupported by client, sending LOOT_FISHING instead } + public enum LootItemType + { + Item = 0, + Currency = 1 + } + public enum LootError { DidntKill = 0, // You don't have permission to loot that corpse. diff --git a/Source/Framework/Constants/Movement/SplineConst.cs b/Source/Framework/Constants/Movement/SplineConst.cs index 6dbcbe63c..dff8e2a66 100644 --- a/Source/Framework/Constants/Movement/SplineConst.cs +++ b/Source/Framework/Constants/Movement/SplineConst.cs @@ -32,12 +32,15 @@ namespace Framework.Constants { None = 0x00, // x00-x07 used as animation Ids storage in pair with Animation flag - Unknown0 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation + Unknown_0x1 = 0x00000001, // NOT VERIFIED + Unknown_0x2 = 0x00000002, // NOT VERIFIED + Unknown_0x4 = 0x00000004, // NOT VERIFIED + Unknown_0x8 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation FallingSlow = 0x00000010, Done = 0x00000020, Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag NoSpline = 0x00000080, - Unknown1 = 0x00000100, // NOT VERIFIED + Unknown_0x100 = 0x00000100, // NOT VERIFIED Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation OrientationFixed = 0x00000400, // Model orientation fixed Catmullrom = 0x00000800, // Used Catmullrom interpolation mode @@ -46,27 +49,28 @@ namespace Framework.Constants Frozen = 0x00004000, // Will never arrive TransportEnter = 0x00008000, TransportExit = 0x00010000, - Unknown2 = 0x00020000, // NOT VERIFIED - Unknown3 = 0x00040000, // NOT VERIFIED + Unknown_0x20000 = 0x00020000, // NOT VERIFIED + Unknown_0x40000 = 0x00040000, // NOT VERIFIED Backward = 0x00080000, SmoothGroundPath = 0x00100000, CanSwim = 0x00200000, UncompressedPath = 0x00400000, - Unknown4 = 0x00800000, // NOT VERIFIED - Unknown5 = 0x01000000, // NOT VERIFIED + Unknown_0x800000 = 0x00800000, // NOT VERIFIED + Unknown_0x1000000 = 0x01000000, // NOT VERIFIED Animation = 0x02000000, // Plays animation after some time passed Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag FadeObject = 0x08000000, Steering = 0x10000000, - Unknown8 = 0x20000000, // NOT VERIFIED - Unknown9 = 0x40000000, // NOT VERIFIED - Unknown10 = 0x80000000, // NOT VERIFIED + Unknown_0x20000000 = 0x20000000, // NOT VERIFIED + Unknown_0x40000000 = 0x40000000, // NOT VERIFIED + Unknown_0x80000000 = 0x80000000, // NOT VERIFIED // animation ids stored here, see AnimType enum, used with Animation flag MaskAnimations = 0x7, // flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably - MaskNoMonsterMove = MaskAnimations | Done, + MaskNoMonsterMove = Done, // Unused, not suported flags - MaskUnused = NoSpline | EnterCycle | Frozen | Unknown0 | Unknown1 | Unknown2 | Unknown3 | Unknown4 | FadeObject | Steering | Unknown8 | Unknown9 | Unknown10 + MaskUnused = NoSpline | EnterCycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000 + | Unknown_0x800000 | Unknown_0x1000000 | FadeObject | Steering | Unknown_0x20000000 | Unknown_0x40000000 | Unknown_0x80000000 } } diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index b7fa5b988..32f55e3b1 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -19,45 +19,47 @@ namespace Framework.Constants { public enum ClientOpcodes : uint { + AbandonNpeResponse = 0x33ef, AcceptGuildInvite = 0x35fc, AcceptTrade = 0x315a, AcceptWargameInvite = 0x35e0, - ActivateTaxi = 0x34ab, + ActivateSoulbind = 0x33df, + ActivateTaxi = 0x34b1, AddonList = 0x35d8, AddBattlenetFriend = 0x365a, - AddFriend = 0x36ce, - AddIgnore = 0x36d2, - AddToy = 0x329c, - AdventureJournalOpenQuest = 0x3203, - AdventureJournalStartQuest = 0x3346, - AdventureMapPoiQuery = 0x324a, - AlterAppearance = 0x34fd, - AreaSpiritHealerQuery = 0x34b0, - AreaSpiritHealerQueue = 0x34b1, - AreaTrigger = 0x31d7, - ArtifactAddPower = 0x31a9, - ArtifactSetAppearance = 0x31ab, - AssignEquipmentSetSpec = 0x320b, - AttackStop = 0x3259, - AttackSwing = 0x3258, - AuctionableTokenSell = 0x36e6, - AuctionableTokenSellAtMarketPrice = 0x36e7, - AuctionBrowseQuery = 0x34d0, - AuctionCancelCommoditiesPurchase = 0x34d8, - AuctionConfirmCommoditiesPurchase = 0x34d7, - AuctionGetCommodityQuote = 0x34d6, - AuctionHelloRequest = 0x34cb, - AuctionListBiddedItems = 0x34d4, - AuctionListBucketsByBucketKeys = 0x34d5, - AuctionListItemsByBucketKey = 0x34d1, - AuctionListItemsByItemId = 0x34d2, - AuctionListOwnedItems = 0x34d3, - AuctionPlaceBid = 0x34cf, - AuctionRemoveItem = 0x34cd, - AuctionReplicateItems = 0x34ce, - AuctionSellCommodity = 0x34d9, - AuctionSellItem = 0x34cc, - AuctionSetFavoriteItem = 0x3732, + AddFriend = 0x36d0, + AddIgnore = 0x36d4, + AddToy = 0x32a6, + AdventureJournalOpenQuest = 0x3206, + AdventureJournalStartQuest = 0x335b, + AdventureJournalUpdateSuggestions = 0x33e2, + AlterAppearance = 0x3503, + AreaSpiritHealerQuery = 0x34b6, + AreaSpiritHealerQueue = 0x34b7, + AreaTrigger = 0x31d9, + ArtifactAddPower = 0x31ab, + ArtifactSetAppearance = 0x31ad, + AssignEquipmentSetSpec = 0x320f, + AttackStop = 0x325e, + AttackSwing = 0x325d, + AuctionableTokenSell = 0x36e8, + AuctionableTokenSellAtMarketPrice = 0x36e9, + AuctionBrowseQuery = 0x34d6, + AuctionCancelCommoditiesPurchase = 0x34de, + AuctionConfirmCommoditiesPurchase = 0x34dd, + AuctionGetCommodityQuote = 0x34dc, + AuctionHelloRequest = 0x34d1, + AuctionListBiddedItems = 0x34da, + AuctionListBucketsByBucketKeys = 0x34db, + AuctionListItemsByBucketKey = 0x34d7, + AuctionListItemsByItemId = 0x34d8, + AuctionListOwnedItems = 0x34d9, + AuctionPlaceBid = 0x34d5, + AuctionRemoveItem = 0x34d3, + AuctionReplicateItems = 0x34d4, + AuctionSellCommodity = 0x34df, + AuctionSellItem = 0x34d2, + AuctionSetFavoriteItem = 0x3735, AuthContinuedSession = 0x3766, AuthSession = 0x3765, AutobankItem = 0x3996, @@ -67,97 +69,96 @@ namespace Framework.Constants AutoEquipItem = 0x399a, AutoEquipItemSlot = 0x399f, AutoStoreBagItem = 0x399b, - AzeriteEmpoweredItemSelectPower = 0x3366, - AzeriteEmpoweredItemViewed = 0x3350, - AzeriteEssenceActivateEssence = 0x3368, - AzeriteEssenceUnlockMilestone = 0x3367, - BankerActivate = 0x34b3, + AzeriteEmpoweredItemSelectPower = 0x3384, + AzeriteEmpoweredItemViewed = 0x3366, + AzeriteEssenceActivateEssence = 0x3386, + AzeriteEssenceUnlockMilestone = 0x3385, + BankerActivate = 0x34b9, BattlefieldLeave = 0x3173, BattlefieldList = 0x317e, - BattlefieldPort = 0x352f, - BattlemasterHello = 0x32b4, - BattlemasterJoin = 0x3528, - BattlemasterJoinArena = 0x3529, - BattlemasterJoinBrawl = 0x352d, - BattlemasterJoinSkirmish = 0x352a, - BattlenetChallengeResponse = 0x36d1, - BattlenetRequest = 0x36f5, - BattlePayAckFailedResponse = 0x36cb, - BattlePayCancelOpenCheckout = 0x3712, - BattlePayConfirmPurchaseResponse = 0x36ca, - BattlePayDistributionAssignToTarget = 0x36c1, - BattlePayGetProductList = 0x36b9, - BattlePayGetPurchaseList = 0x36ba, - BattlePayOpenCheckout = 0x370c, - BattlePayQueryClassTrialBoostResult = 0x36c4, - BattlePayRequestCharacterBoostUnrevoke = 0x36c2, - BattlePayRequestPriceInfo = 0x3708, - BattlePayStartPurchase = 0x36c9, - BattlePayStartVasPurchase = 0x36f2, - BattlePayTrialBoostCharacter = 0x36c3, + BattlefieldPort = 0x3537, + BattlemasterHello = 0x32c0, + BattlemasterJoin = 0x3530, + BattlemasterJoinArena = 0x3531, + BattlemasterJoinBrawl = 0x3535, + BattlemasterJoinSkirmish = 0x3532, + BattlenetChallengeResponse = 0x36d3, + BattlenetRequest = 0x36f7, + BattlePayAckFailedResponse = 0x36cd, + BattlePayCancelOpenCheckout = 0x3714, + BattlePayConfirmPurchaseResponse = 0x36cc, + BattlePayDistributionAssignToTarget = 0x36c3, + BattlePayGetProductList = 0x36bb, + BattlePayGetPurchaseList = 0x36bc, + BattlePayOpenCheckout = 0x370e, + BattlePayRequestPriceInfo = 0x370a, + BattlePayStartPurchase = 0x36cb, + BattlePayStartVasPurchase = 0x36f4, BattlePetClearFanfare = 0x312c, - BattlePetDeletePet = 0x3623, - BattlePetDeletePetCheat = 0x3624, - BattlePetModifyName = 0x3626, - BattlePetRequestJournal = 0x3622, - BattlePetRequestJournalLock = 0x3621, - BattlePetSetBattleSlot = 0x362b, - BattlePetSetFlags = 0x362f, - BattlePetSummon = 0x3627, - BattlePetUpdateDisplayNotify = 0x31e1, - BattlePetUpdateNotify = 0x31e0, + BattlePetDeletePet = 0x3624, + BattlePetDeletePetCheat = 0x3625, + BattlePetModifyName = 0x3627, + BattlePetRequestJournal = 0x3623, + BattlePetRequestJournalLock = 0x3622, + BattlePetSetBattleSlot = 0x362c, + BattlePetSetFlags = 0x3630, + BattlePetSummon = 0x3628, + BattlePetUpdateDisplayNotify = 0x31e3, + BattlePetUpdateNotify = 0x31e2, BeginTrade = 0x3157, - BinderActivate = 0x34b2, - BlackMarketBidOnItem = 0x3537, - BlackMarketOpen = 0x3535, - BlackMarketRequestItems = 0x3536, - BonusRoll = 0x3369, + BinderActivate = 0x34b8, + BlackMarketBidOnItem = 0x353f, + BlackMarketOpen = 0x353d, + BlackMarketRequestItems = 0x353e, + BonusRoll = 0x3387, BugReport = 0x3686, BusyTrade = 0x3158, - BuyBackItem = 0x34a4, - BuyBankSlot = 0x34b4, - BuyItem = 0x34a3, - BuyReagentBank = 0x34b5, - CageBattlePet = 0x31f2, + BuyBackItem = 0x34aa, + BuyBankSlot = 0x34ba, + BuyItem = 0x34a9, + BuyReagentBank = 0x34bb, + CageBattlePet = 0x31f5, CalendarAddEvent = 0x367d, - CalendarCommunityFilter = 0x3671, + CalendarCommunityInvite = 0x3671, CalendarComplain = 0x3679, CalendarCopyEvent = 0x3678, - CalendarEventInvite = 0x3672, - CalendarEventModeratorStatus = 0x3676, - CalendarEventRsvp = 0x3674, CalendarEventSignUp = 0x367b, - CalendarEventStatus = 0x3675, CalendarGet = 0x366f, CalendarGetEvent = 0x3670, CalendarGetNumPending = 0x367a, + CalendarInvite = 0x3672, + CalendarModeratorStatus = 0x3676, CalendarRemoveEvent = 0x3677, CalendarRemoveInvite = 0x3673, + CalendarRsvp = 0x3674, + CalendarStatus = 0x3675, CalendarUpdateEvent = 0x367e, - CancelAura = 0x31ad, - CancelAutoRepeatSpell = 0x34ef, - CancelCast = 0x32a2, - CancelChannelling = 0x326e, - CancelGrowthAura = 0x3273, - CancelMasterLootRoll = 0x3213, - CancelModSpeedNoControlAuras = 0x31ac, - CancelMountAura = 0x3284, + CancelAura = 0x31af, + CancelAutoRepeatSpell = 0x34f5, + CancelCast = 0x32ac, + CancelChannelling = 0x3276, + CancelGrowthAura = 0x327b, + CancelMasterLootRoll = 0x3217, + CancelModSpeedNoControlAuras = 0x31ae, + CancelMountAura = 0x328e, CancelQueuedSpell = 0x317f, - CancelTempEnchantment = 0x34fa, + CancelTempEnchantment = 0x3500, CancelTrade = 0x315c, CanDuel = 0x3662, - CanRedeemTokenForBalance = 0x3707, - CastSpell = 0x329f, + CanRedeemTokenForBalance = 0x3709, + CastSpell = 0x32a9, ChallengeModeRequestLeaders = 0x3090, - ChallengeModeRequestMapStats = 0x308f, - ChangeBagSlotFlag = 0x3328, - ChangeBankBagSlotFlag = 0x3329, - ChangeMonumentAppearance = 0x330a, - ChangeRealmTicket = 0x36fa, + ChangeBagSlotFlag = 0x333f, + ChangeBankBagSlotFlag = 0x3340, + ChangeMonumentAppearance = 0x3321, + ChangeRealmTicket = 0x36fc, ChangeSubGroup = 0x364c, - CharacterRenameRequest = 0x36bf, + CharacterCheckUpgrade = 0x36c6, + CharacterRenameRequest = 0x36c1, + CharacterUpgradeManualUnrevokeRequest = 0x36c4, + CharacterUpgradeStart = 0x36c5, CharCustomize = 0x3690, - CharDelete = 0x369d, + CharDelete = 0x369e, CharRaceOrFactionChange = 0x3696, ChatAddonMessage = 0x37ee, ChatAddonMessageTargeted = 0x37ef, @@ -195,24 +196,29 @@ namespace Framework.Constants ChatReportFiltered = 0x37cc, ChatReportIgnored = 0x37cb, ChatUnregisterAllAddonPrefixes = 0x37ce, - ChoiceResponse = 0x32a4, + CheckCharacterNameAvailability = 0x3645, + CheckIsAdventureMapPoiValid = 0x324f, + ChoiceResponse = 0x32b0, + ChromieTimeSelectExpansion = 0x33de, + ClaimWeeklyReward = 0x33b9, ClearNewAppearance = 0x312f, - ClearRaidMarker = 0x31a5, + ClearRaidMarker = 0x31a7, ClearTradeItem = 0x315e, - ClientPortGraveyard = 0x3531, - CloseInteraction = 0x3493, - CloseQuestChoice = 0x32a5, - ClubFinderApplicationResponse = 0x371c, - ClubFinderGetApplicantsList = 0x371a, - ClubFinderPost = 0x3717, - ClubFinderRequestClubsData = 0x371e, - ClubFinderRequestClubsList = 0x3718, - ClubFinderRequestMembershipToClub = 0x3719, - ClubFinderRequestPendingClubsList = 0x371d, - ClubFinderRequestSubscribedClubPostingIds = 0x371f, - ClubFinderRespondToApplicant = 0x371b, - ClubInvite = 0x36f9, - CollectionItemSetFavorite = 0x3632, + ClientPortGraveyard = 0x3539, + CloseInteraction = 0x3499, + CloseQuestChoice = 0x32b1, + CloseRuneforgeInteraction = 0x33e6, + ClubFinderApplicationResponse = 0x371f, + ClubFinderGetApplicantsList = 0x371d, + ClubFinderPost = 0x371a, + ClubFinderRequestClubsData = 0x3721, + ClubFinderRequestClubsList = 0x371b, + ClubFinderRequestMembershipToClub = 0x371c, + ClubFinderRequestPendingClubsList = 0x3720, + ClubFinderRequestSubscribedClubPostingIds = 0x3722, + ClubFinderRespondToApplicant = 0x371e, + ClubPresenceSubscribe = 0x36f9, + CollectionItemSetFavorite = 0x3633, CommentatorEnable = 0x35f0, CommentatorEnterInstance = 0x35f4, CommentatorExitInstance = 0x35f5, @@ -220,116 +226,122 @@ namespace Framework.Constants CommentatorGetPlayerCooldowns = 0x35f3, CommentatorGetPlayerInfo = 0x35f2, CommentatorStartWargame = 0x35ef, - CommerceTokenGetCount = 0x36e4, - CommerceTokenGetLog = 0x36ee, - CommerceTokenGetMarketPrice = 0x36e5, + CommerceTokenGetCount = 0x36e6, + CommerceTokenGetLog = 0x36f0, + CommerceTokenGetMarketPrice = 0x36e7, Complaint = 0x366c, - CompleteCinematic = 0x354f, - CompleteMovie = 0x34e5, - ConfirmArtifactRespec = 0x31aa, - ConfirmRespecWipe = 0x320d, + CompleteCinematic = 0x3557, + CompleteMovie = 0x34eb, + ConfirmArtifactRespec = 0x31ac, + ConfirmRespecWipe = 0x3211, ConnectToFailed = 0x35d4, - ConsumableTokenBuy = 0x36e9, - ConsumableTokenBuyAtMarketPrice = 0x36ea, - ConsumableTokenCanVeteranBuy = 0x36e8, - ConsumableTokenRedeem = 0x36ec, - ConsumableTokenRedeemConfirmation = 0x36ed, - ContributionContribute = 0x355f, - ContributionLastUpdateRequest = 0x3560, - ConversationLineStarted = 0x3550, + ConsumableTokenBuy = 0x36eb, + ConsumableTokenBuyAtMarketPrice = 0x36ec, + ConsumableTokenCanVeteranBuy = 0x36ea, + ConsumableTokenRedeem = 0x36ee, + ConsumableTokenRedeemConfirmation = 0x36ef, + ContributionContribute = 0x3569, + ContributionLastUpdateRequest = 0x356a, + ConversationLineStarted = 0x3558, ConvertRaid = 0x364e, - CreateCharacter = 0x3643, - CreateShipment = 0x32f6, + CreateCharacter = 0x3644, + CreateShipment = 0x330d, DbQueryBulk = 0x35e4, - DeclineGuildInvites = 0x3526, - DeclinePetition = 0x353e, - DeleteEquipmentSet = 0x3513, - DelFriend = 0x36cf, - DelIgnore = 0x36d3, - DepositReagentBank = 0x3331, - DestroyItem = 0x3296, - DfBootPlayerVote = 0x3614, - DfGetJoinStatus = 0x3612, - DfGetSystemInfo = 0x3611, - DfJoin = 0x3607, - DfLeave = 0x3610, + DeclineGuildInvites = 0x352d, + DeclinePetition = 0x3546, + DeleteEquipmentSet = 0x3519, + DelFriend = 0x36d1, + DelIgnore = 0x36d5, + DepositReagentBank = 0x3348, + DestroyItem = 0x32a0, + DfBootPlayerVote = 0x3615, + DfConfirmExpandSearch = 0x3607, + DfGetJoinStatus = 0x3613, + DfGetSystemInfo = 0x3612, + DfJoin = 0x3608, + DfLeave = 0x3611, DfProposalResponse = 0x3606, - DfReadyCheckResponse = 0x3617, - DfSetRoles = 0x3613, - DfTeleport = 0x3615, - DiscardedTimeSyncAcks = 0x3a3d, - DismissCritter = 0x3501, - DoMasterLootRoll = 0x3212, - DoReadyCheck = 0x3633, - DuelResponse = 0x34ea, - EjectPassenger = 0x323f, - Emote = 0x354b, + DfReadyCheckResponse = 0x3618, + DfSetRoles = 0x3614, + DfTeleport = 0x3616, + DiscardedTimeSyncAcks = 0x3a3e, + DismissCritter = 0x3507, + DoCountdown = 0x3719, + DoMasterLootRoll = 0x3216, + DoReadyCheck = 0x3634, + DuelResponse = 0x34f0, + EjectPassenger = 0x3244, + Emote = 0x3553, EnableNagle = 0x376b, - EnableTaxiNode = 0x34a9, - EngineSurvey = 0x36e2, + EnableTaxiNode = 0x34af, + EngineSurvey = 0x36e4, EnterEncryptedModeAck = 0x3767, EnumCharacters = 0x35e8, - EnumCharactersDeletedByClient = 0x36dc, - FarSight = 0x34f0, - GameEventDebugDisable = 0x31b1, - GameEventDebugEnable = 0x31b0, - GameObjReportUse = 0x34f7, - GameObjUse = 0x34f6, - GarrisonAssignFollowerToBuilding = 0x32e1, - GarrisonCancelConstruction = 0x32cf, - GarrisonCheckUpgradeable = 0x3324, - GarrisonCompleteMission = 0x3317, - GarrisonGenerateRecruits = 0x32e4, - GarrisonGetBuildingLandmarks = 0x32f2, - GarrisonGetMissionReward = 0x334a, - GarrisonMissionBonusRoll = 0x3319, - GarrisonPurchaseBuilding = 0x32cb, - GarrisonRecruitFollower = 0x32e6, - GarrisonRemoveFollower = 0x330e, - GarrisonRemoveFollowerFromBuilding = 0x32e2, - GarrisonRenameFollower = 0x32e3, - GarrisonRequestBlueprintAndSpecializationData = 0x32ca, - GarrisonRequestClassSpecCategoryInfo = 0x32eb, - GarrisonRequestLandingPageShipmentInfo = 0x32f5, - GarrisonRequestShipmentInfo = 0x32f4, - GarrisonResearchTalent = 0x32e7, - GarrisonSetBuildingActive = 0x32cc, - GarrisonSetFollowerFavorite = 0x32df, - GarrisonSetFollowerInactive = 0x32d8, - GarrisonSetRecruitmentPreferences = 0x32e5, - GarrisonStartMission = 0x3316, - GarrisonSwapBuildings = 0x32d0, + EnumCharactersDeletedByClient = 0x36de, + FarSight = 0x34f6, + GameEventDebugDisable = 0x31b3, + GameEventDebugEnable = 0x31b2, + GameObjReportUse = 0x34fd, + GameObjUse = 0x34fc, + GarrisonAddFollowerHealth = 0x3308, + GarrisonAssignFollowerToBuilding = 0x32ee, + GarrisonCancelConstruction = 0x32db, + GarrisonCheckUpgradeable = 0x333b, + GarrisonCompleteMission = 0x332e, + GarrisonFullyHealAllFollowers = 0x3309, + GarrisonGenerateRecruits = 0x32f1, + GarrisonGetClassSpecCategoryInfo = 0x3300, + GarrisonGetMapData = 0x3307, + GarrisonGetMissionReward = 0x335f, + GarrisonLearnTalent = 0x32fc, + GarrisonMissionBonusRoll = 0x3330, + GarrisonPurchaseBuilding = 0x32d7, + GarrisonRecruitFollower = 0x32f3, + GarrisonRemoveFollower = 0x3325, + GarrisonRemoveFollowerFromBuilding = 0x32ef, + GarrisonRenameFollower = 0x32f0, + GarrisonRequestBlueprintAndSpecializationData = 0x32d6, + GarrisonRequestShipmentInfo = 0x330b, + GarrisonResearchTalent = 0x32f4, + GarrisonSetBuildingActive = 0x32d8, + GarrisonSetFollowerFavorite = 0x32ec, + GarrisonSetFollowerInactive = 0x32e4, + GarrisonSetRecruitmentPreferences = 0x32f2, + GarrisonSocketTalent = 0x33f2, + GarrisonStartMission = 0x332d, + GarrisonSwapBuildings = 0x32dc, GenerateRandomCharacterName = 0x35e7, - GetAccountCharacterList = 0x36b5, - GetChallengeModeRewards = 0x3683, - GetGarrisonInfo = 0x32c5, - GetItemPurchaseData = 0x3539, - GetMirrorImageData = 0x329a, + GetAccountCharacterList = 0x36b6, + GetGarrisonInfo = 0x32d1, + GetItemPurchaseData = 0x3541, + GetLandingPageShipments = 0x330c, + GetMirrorImageData = 0x32a4, GetPvpOptionsEnabled = 0x35ee, - GetRafAccountInfo = 0x3720, - GetRemainingGameTime = 0x36eb, - GetTrophyList = 0x3307, - GetUndeleteCharacterCooldownStatus = 0x36de, - GetVasAccountCharacterList = 0x36f0, - GetVasTransferTargetRealmList = 0x36f1, + GetRafAccountInfo = 0x3723, + GetRemainingGameTime = 0x36ed, + GetTrophyList = 0x331e, + GetUndeleteCharacterCooldownStatus = 0x36e0, + GetVasAccountCharacterList = 0x36f2, + GetVasTransferTargetRealmList = 0x36f3, GmTicketAcknowledgeSurvey = 0x3694, GmTicketGetCaseStatus = 0x3693, GmTicketGetSystemStatus = 0x3692, - GossipSelectOption = 0x3494, + GossipRefreshOptions = 0x357c, + GossipSelectOption = 0x349a, GuildAddBattlenetFriend = 0x308e, GuildAddRank = 0x3065, GuildAssignMemberRank = 0x3060, GuildAutoDeclineInvitation = 0x3062, - GuildBankActivate = 0x34b6, - GuildBankBuyTab = 0x34c4, - GuildBankDepositMoney = 0x34c6, + GuildBankActivate = 0x34bc, + GuildBankBuyTab = 0x34ca, + GuildBankDepositMoney = 0x34cc, GuildBankLogQuery = 0x3083, - GuildBankQueryTab = 0x34c3, + GuildBankQueryTab = 0x34c9, GuildBankRemainingWithdrawMoneyQuery = 0x3084, GuildBankSetTabText = 0x3087, GuildBankTextQuery = 0x3088, - GuildBankUpdateTab = 0x34c5, - GuildBankWithdrawMoney = 0x34c7, + GuildBankUpdateTab = 0x34cb, + GuildBankWithdrawMoney = 0x34cd, GuildChallengeUpdateRequest = 0x307c, GuildChangeNameRequest = 0x307f, GuildDeclineInvitation = 0x3061, @@ -353,125 +365,131 @@ namespace Framework.Constants GuildReplaceGuildMaster = 0x3089, GuildSetAchievementTracking = 0x3070, GuildSetFocusedAchievement = 0x3071, - GuildSetGuildMaster = 0x36c6, + GuildSetGuildMaster = 0x36c8, GuildSetMemberNote = 0x3073, GuildSetRankPermissions = 0x3068, GuildShiftRank = 0x3067, GuildUpdateInfoText = 0x3076, GuildUpdateMotdText = 0x3075, - HearthAndResurrect = 0x350f, + HearthAndResurrect = 0x3515, + HideQuestChoice = 0x32b2, HotfixRequest = 0x35e5, IgnoreTrade = 0x3159, InitiateRolePoll = 0x35da, InitiateTrade = 0x3156, - Inspect = 0x3533, - InstanceLockResponse = 0x3514, - IslandQueue = 0x3396, - ItemPurchaseRefund = 0x353a, - ItemTextQuery = 0x3325, - JoinPetBattleQueue = 0x31de, + Inspect = 0x353b, + InstanceLockResponse = 0x351a, + IslandQueue = 0x33b5, + ItemPurchaseRefund = 0x3542, + ItemTextQuery = 0x333c, + JoinPetBattleQueue = 0x31e0, JoinRatedBattleground = 0x3178, KeepAlive = 0x367f, - KeyboundOverride = 0x3225, - LearnPvpTalents = 0x355e, - LearnTalents = 0x355c, + KeyboundOverride = 0x3229, + LearnPvpTalents = 0x3568, + LearnTalents = 0x3566, LeaveGroup = 0x3649, - LeavePetBattleQueue = 0x31df, - LfgListApplyToGroup = 0x360b, - LfgListCancelApplication = 0x360c, - LfgListDeclineApplicant = 0x360d, - LfgListGetStatus = 0x3609, - LfgListInviteApplicant = 0x360e, - LfgListInviteResponse = 0x360f, - LfgListJoin = 0x3364, - LfgListLeave = 0x3608, - LfgListSearch = 0x360a, - LfgListUpdateRequest = 0x3365, - LfGuildAddRecruit = 0x361a, - LfGuildBrowse = 0x361c, + LeavePetBattleQueue = 0x31e1, + LfgListApplyToGroup = 0x360c, + LfgListCancelApplication = 0x360d, + LfgListDeclineApplicant = 0x360e, + LfgListGetStatus = 0x360a, + LfgListInviteApplicant = 0x360f, + LfgListInviteResponse = 0x3610, + LfgListJoin = 0x3382, + LfgListLeave = 0x3609, + LfgListSearch = 0x360b, + LfgListUpdateRequest = 0x3383, + LfGuildAddRecruit = 0x361b, + LfGuildBrowse = 0x361d, LfGuildDeclineRecruit = 0x3079, LfGuildGetApplications = 0x307a, LfGuildGetGuildPost = 0x3077, LfGuildGetRecruits = 0x3078, LfGuildRemoveRecruit = 0x307b, - LfGuildSetGuildPost = 0x361b, - ListInventory = 0x34a1, - LiveRegionAccountRestore = 0x36b8, - LiveRegionCharacterCopy = 0x36b7, - LiveRegionGetAccountCharacterList = 0x36b6, + LfGuildSetGuildPost = 0x361c, + ListInventory = 0x34a7, + LiveRegionAccountRestore = 0x36b9, + LiveRegionCharacterCopy = 0x36b8, + LiveRegionGetAccountCharacterList = 0x36b7, + LiveRegionKeyBindingsCopy = 0x36ba, LoadingScreenNotify = 0x35f8, - LoadSelectedTrophy = 0x3308, - LogoutCancel = 0x34e0, - LogoutInstant = 0x34e1, - LogoutRequest = 0x34de, + LoadSelectedTrophy = 0x331f, + LogoutCancel = 0x34e6, + LogoutInstant = 0x34e7, + LogoutRequest = 0x34e4, LogDisconnect = 0x3769, LogStreamingError = 0x376d, - LootItem = 0x3210, - LootMoney = 0x320f, - LootRelease = 0x3214, - LootRoll = 0x3215, - LootUnit = 0x320e, - LowLevelRaid1 = 0x36a1, - LowLevelRaid2 = 0x351b, - MailCreateTextItem = 0x3545, - MailDelete = 0x3227, - MailGetList = 0x3540, - MailMarkAsRead = 0x3544, + LootItem = 0x3214, + LootMoney = 0x3213, + LootRelease = 0x3218, + LootRoll = 0x3219, + LootUnit = 0x3212, + LowLevelRaid1 = 0x36a2, + LowLevelRaid2 = 0x3521, + MailCreateTextItem = 0x354d, + MailDelete = 0x322b, + MailGetList = 0x3548, + MailMarkAsRead = 0x354c, MailReturnToSender = 0x3655, - MailTakeItem = 0x3542, - MailTakeMoney = 0x3541, - MakeContitionalAppearancePermanent = 0x3229, - MasterLootItem = 0x3211, + MailTakeItem = 0x354a, + MailTakeMoney = 0x3549, + MakeContitionalAppearancePermanent = 0x322d, + MasterLootItem = 0x3215, MinimapPing = 0x364b, MissileTrajectoryCollision = 0x318a, MountClearFanfare = 0x312d, - MountSetFavorite = 0x3631, - MountSpecialAnim = 0x3285, - MoveApplyMovementForceAck = 0x3a13, - MoveChangeTransport = 0x3a2d, - MoveChangeVehicleSeats = 0x3a32, - MoveDismissVehicle = 0x3a31, + MountSetFavorite = 0x3632, + MountSpecialAnim = 0x328f, + MoveApplyMovementForceAck = 0x3a14, + MoveChangeTransport = 0x3a2e, + MoveChangeVehicleSeats = 0x3a33, + MoveCollisionDisableAck = 0x3a36, + MoveCollisionEnableAck = 0x3a37, + MoveDismissVehicle = 0x3a32, MoveDoubleJump = 0x39eb, - MoveEnableDoubleJumpAck = 0x3a1c, - MoveEnableSwimToFlyTransAck = 0x3a22, + MoveEnableDoubleJumpAck = 0x3a1d, + MoveEnableSwimToFlyTransAck = 0x3a23, MoveFallLand = 0x39fa, - MoveFallReset = 0x3a17, - MoveFeatherFallAck = 0x3a1a, - MoveForceFlightBackSpeedChangeAck = 0x3a2c, - MoveForceFlightSpeedChangeAck = 0x3a2b, - MoveForcePitchRateChangeAck = 0x3a30, - MoveForceRootAck = 0x3a0c, - MoveForceRunBackSpeedChangeAck = 0x3a0a, - MoveForceRunSpeedChangeAck = 0x3a09, - MoveForceSwimBackSpeedChangeAck = 0x3a20, - MoveForceSwimSpeedChangeAck = 0x3a0b, - MoveForceTurnRateChangeAck = 0x3a21, - MoveForceUnrootAck = 0x3a0d, - MoveForceWalkSpeedChangeAck = 0x3a1f, - MoveGravityDisableAck = 0x3a33, - MoveGravityEnableAck = 0x3a34, - MoveHeartbeat = 0x3a0e, - MoveHoverAck = 0x3a11, + MoveFallReset = 0x3a18, + MoveFeatherFallAck = 0x3a1b, + MoveForceFlightBackSpeedChangeAck = 0x3a2d, + MoveForceFlightSpeedChangeAck = 0x3a2c, + MoveForcePitchRateChangeAck = 0x3a31, + MoveForceRootAck = 0x3a0d, + MoveForceRunBackSpeedChangeAck = 0x3a0b, + MoveForceRunSpeedChangeAck = 0x3a0a, + MoveForceSwimBackSpeedChangeAck = 0x3a21, + MoveForceSwimSpeedChangeAck = 0x3a0c, + MoveForceTurnRateChangeAck = 0x3a22, + MoveForceUnrootAck = 0x3a0e, + MoveForceWalkSpeedChangeAck = 0x3a20, + MoveGravityDisableAck = 0x3a34, + MoveGravityEnableAck = 0x3a35, + MoveHeartbeat = 0x3a0f, + MoveHoverAck = 0x3a12, + MoveInitActiveMoverComplete = 0x3a43, MoveJump = 0x39ea, - MoveKnockBackAck = 0x3a10, - MoveRemoveMovementForces = 0x3a15, - MoveRemoveMovementForceAck = 0x3a14, - MoveSeamlessTransferComplete = 0x3a40, - MoveSetCanFlyAck = 0x3a25, - MoveSetCanTurnWhileFallingAck = 0x3a23, - MoveSetCollisionHeightAck = 0x3a37, - MoveSetFacing = 0x3a07, - MoveSetFly = 0x3a26, - MoveSetIgnoreMovementForcesAck = 0x3a24, - MoveSetModMovementForceMagnitudeAck = 0x3a3e, - MoveSetPitch = 0x3a08, + MoveKnockBackAck = 0x3a11, + MoveRemoveMovementForces = 0x3a16, + MoveRemoveMovementForceAck = 0x3a15, + MoveSeamlessTransferComplete = 0x3a41, + MoveSetCanFlyAck = 0x3a26, + MoveSetCanTurnWhileFallingAck = 0x3a24, + MoveSetCollisionHeightAck = 0x3a38, + MoveSetFacing = 0x3a08, + MoveSetFly = 0x3a27, + MoveSetIgnoreMovementForcesAck = 0x3a25, + MoveSetModMovementForceMagnitudeAck = 0x3a3f, + MoveSetPitch = 0x3a09, MoveSetRunMode = 0x39f2, - MoveSetVehicleRecIdAck = 0x3a12, + MoveSetTurnRateCheat = 0x3a05, + MoveSetVehicleRecIdAck = 0x3a13, MoveSetWalkMode = 0x39f3, - MoveSplineDone = 0x3a16, - MoveStartAscend = 0x3a27, + MoveSplineDone = 0x3a17, + MoveStartAscend = 0x3a28, MoveStartBackward = 0x39e5, - MoveStartDescend = 0x3a2e, + MoveStartDescend = 0x3a2f, MoveStartForward = 0x39e4, MoveStartPitchDown = 0x39f0, MoveStartPitchUp = 0x39ef, @@ -481,284 +499,295 @@ namespace Framework.Constants MoveStartTurnLeft = 0x39ec, MoveStartTurnRight = 0x39ed, MoveStop = 0x39e6, - MoveStopAscend = 0x3a28, + MoveStopAscend = 0x3a29, MoveStopPitch = 0x39f1, MoveStopStrafe = 0x39e9, MoveStopSwim = 0x39fc, MoveStopTurn = 0x39ee, MoveTeleportAck = 0x39f9, - MoveTimeSkipped = 0x3a19, - MoveToggleCollisionCheat = 0x3a06, - MoveUpdateFallSpeed = 0x3a18, - MoveWaterWalkAck = 0x3a1b, - NeutralPlayerSelectFaction = 0x31d4, - NextCinematicCamera = 0x354e, + MoveTimeSkipped = 0x3a1a, + MoveUpdateFallSpeed = 0x3a19, + MoveWaterWalkAck = 0x3a1c, + MythicPlusRequestMapStats = 0x308f, + MythicPlusWeeklyRewardRequest = 0x3683, + NeutralPlayerSelectFaction = 0x31d6, + NextCinematicCamera = 0x3556, ObjectUpdateFailed = 0x3180, ObjectUpdateRescued = 0x3181, - OfferPetition = 0x33b1, - OpeningCinematic = 0x354d, - OpenItem = 0x3326, - OpenMissionNpc = 0x32ed, - OpenShipmentNpc = 0x32f3, - OpenTradeskillNpc = 0x32fe, - OptOutOfLoot = 0x34fe, + OfferPetition = 0x33dd, + OpeningCinematic = 0x3555, + OpenItem = 0x333d, + OpenMissionNpc = 0x3302, + OpenShipmentNpc = 0x330a, + OpenTradeskillNpc = 0x3315, + OptOutOfLoot = 0x3504, + OverrideScreenFlash = 0x352e, PartyInvite = 0x3602, PartyInviteResponse = 0x3603, PartyUninvite = 0x3647, - PerformItemInteraction = 0x3231, - PetitionBuy = 0x34c9, - PetitionRenameGuild = 0x36c7, - PetitionShowList = 0x34c8, - PetitionShowSignatures = 0x34ca, - PetAbandon = 0x348d, - PetAction = 0x348b, - PetBattleFinalNotify = 0x31e3, - PetBattleInput = 0x3640, - PetBattleQueueProposeMatchResult = 0x3226, - PetBattleQuitNotify = 0x31e2, - PetBattleReplaceFrontPet = 0x3641, - PetBattleRequestPvp = 0x31dc, - PetBattleRequestUpdate = 0x31dd, - PetBattleRequestWild = 0x31da, - PetBattleScriptErrorNotify = 0x31e4, - PetBattleWildLocationFail = 0x31db, - PetCancelAura = 0x348e, - PetCastSpell = 0x329e, + PerformItemInteraction = 0x3235, + PetitionBuy = 0x34cf, + PetitionRenameGuild = 0x36c9, + PetitionShowList = 0x34ce, + PetitionShowSignatures = 0x34d0, + PetAbandon = 0x3493, + PetAction = 0x3491, + PetBattleFinalNotify = 0x31e5, + PetBattleInput = 0x3641, + PetBattleQueueProposeMatchResult = 0x322a, + PetBattleQuitNotify = 0x31e4, + PetBattleReplaceFrontPet = 0x3642, + PetBattleRequestPvp = 0x31de, + PetBattleRequestUpdate = 0x31df, + PetBattleRequestWild = 0x31dc, + PetBattleScriptErrorNotify = 0x31e6, + PetBattleWildLocationFail = 0x31dd, + PetCancelAura = 0x3494, + PetCastSpell = 0x32a8, PetRename = 0x3685, - PetSetAction = 0x348a, - PetSpellAutocast = 0x348f, - PetStopAttack = 0x348c, + PetSetAction = 0x3490, + PetSpellAutocast = 0x3495, + PetStopAttack = 0x3492, Ping = 0x3768, PlayerLogin = 0x35ea, - PushQuestToParty = 0x349f, + PushQuestToParty = 0x34a5, PvpLogData = 0x317b, - QueryBattlePetName = 0x327a, - QueryCommunityName = 0x368b, + QueryBattlePetName = 0x3282, QueryCorpseLocationFromClient = 0x3660, QueryCorpseTransport = 0x3661, - QueryCountdownTimer = 0x31a8, - QueryCreature = 0x3274, - QueryGameObject = 0x3275, - QueryGarrisonCreatureName = 0x327b, + QueryCountdownTimer = 0x31aa, + QueryCreature = 0x327c, + QueryGameObject = 0x327d, + QueryGarrisonPetName = 0x3283, QueryGuildInfo = 0x368e, - QueryInspectAchievements = 0x3508, - QueryNextMailTime = 0x3543, - QueryNpcText = 0x3276, - QueryPageText = 0x3278, - QueryPetition = 0x327c, - QueryPetName = 0x3279, + QueryInspectAchievements = 0x350e, + QueryNextMailTime = 0x354b, + QueryNpcText = 0x327e, + QueryPageText = 0x3280, + QueryPetition = 0x3284, + QueryPetName = 0x3281, QueryPlayerName = 0x368a, + QueryPlayerNamesForCommunity = 0x368c, + QueryPlayerNameByCommunityId = 0x368b, QueryQuestCompletionNpcs = 0x3175, - QueryQuestInfo = 0x3277, + QueryQuestInfo = 0x327f, QueryRealmName = 0x368d, QueryScenarioPoi = 0x3656, - QueryTime = 0x34dd, - QueryTreasurePicker = 0x334c, - QueryVoidStorage = 0x31a1, - QuestConfirmAccept = 0x349e, - QuestGiverAcceptQuest = 0x3498, - QuestGiverChooseReward = 0x349a, - QuestGiverCompleteQuest = 0x3499, - QuestGiverHello = 0x3496, - QuestGiverQueryQuest = 0x3497, - QuestGiverRequestReward = 0x349b, - QuestGiverStatusMultipleQuery = 0x349d, - QuestGiverStatusQuery = 0x349c, - QuestLogRemoveQuest = 0x3538, - QuestPoiQuery = 0x36af, - QuestPushResult = 0x34a0, - QuestSessionBeginResponse = 0x33a5, - QuestSessionRequestStart = 0x33a4, - QuestSessionRequestStop = 0x372b, + QueryTime = 0x34e3, + QueryTreasurePicker = 0x3362, + QueryVoidStorage = 0x31a3, + QuestConfirmAccept = 0x34a4, + QuestGiverAcceptQuest = 0x349e, + QuestGiverChooseReward = 0x34a0, + QuestGiverCloseQuest = 0x355b, + QuestGiverCompleteQuest = 0x349f, + QuestGiverHello = 0x349c, + QuestGiverQueryQuest = 0x349d, + QuestGiverRequestReward = 0x34a1, + QuestGiverStatusMultipleQuery = 0x34a3, + QuestGiverStatusQuery = 0x34a2, + QuestLogRemoveQuest = 0x3540, + QuestPoiQuery = 0x36b0, + QuestPushResult = 0x34a6, + QuestSessionBeginResponse = 0x33ce, + QuestSessionRequestStart = 0x33cd, + QuestSessionRequestStop = 0x372e, QueuedMessagesEnd = 0x376c, - QuickJoinAutoAcceptRequests = 0x3706, - QuickJoinRequestInvite = 0x3705, - QuickJoinRequestInviteWithConfirmation = 0x3730, - QuickJoinRespondToInvite = 0x3704, - QuickJoinSignalToastDisplayed = 0x3703, - RafClaimActivityReward = 0x350c, - RafClaimNextReward = 0x3721, - RafGenerateRecruitmentLink = 0x3723, - RafUpdateRecruitmentInfo = 0x3722, - RaidOrBattlegroundEngineSurvey = 0x36e3, + QuickJoinAutoAcceptRequests = 0x3708, + QuickJoinRequestInvite = 0x3707, + QuickJoinRequestInviteWithConfirmation = 0x3733, + QuickJoinRespondToInvite = 0x3706, + QuickJoinSignalToastDisplayed = 0x3705, + RafClaimActivityReward = 0x3512, + RafClaimNextReward = 0x3724, + RafGenerateRecruitmentLink = 0x3726, + RafUpdateRecruitmentInfo = 0x3725, + RaidOrBattlegroundEngineSurvey = 0x36e5, RandomRoll = 0x3654, - ReadyCheckResponse = 0x3634, - ReadItem = 0x3327, - ReclaimCorpse = 0x34e3, - RemoveNewItem = 0x334f, - RemoveRafRecruit = 0x3724, + ReadyCheckResponse = 0x3635, + ReadItem = 0x333e, + ReclaimCorpse = 0x34e9, + RemoveNewItem = 0x3365, + RemoveRafRecruit = 0x3727, ReorderCharacters = 0x35e9, - RepairItem = 0x34f4, - ReplaceTrophy = 0x3309, - RepopRequest = 0x3530, - ReportClientVariables = 0x3700, - ReportEnabledAddons = 0x36ff, - ReportKeybindingExecutionCounts = 0x3701, - ReportPvpPlayerAfk = 0x34fc, - ReportServerLag = 0x339c, - RequestAccountData = 0x3697, - RequestAreaPoiUpdate = 0x334e, + RepairItem = 0x34fa, + ReplaceTrophy = 0x3320, + RepopRequest = 0x3538, + ReportClientVariables = 0x3702, + ReportEnabledAddons = 0x3701, + ReportKeybindingExecutionCounts = 0x3703, + ReportPvpPlayerAfk = 0x3502, + ReportServerLag = 0x33c4, + ReportStuckInCombat = 0x33c5, + RequestAccountData = 0x3698, + RequestAreaPoiUpdate = 0x3364, RequestBattlefieldStatus = 0x35dc, RequestCategoryCooldowns = 0x317d, RequestCemeteryList = 0x3176, - RequestChallengeModeAffixes = 0x3207, RequestCharacterGuildFollowInfo = 0x368f, - RequestConquestFormulaConstants = 0x32b7, - RequestCrowdControlSpell = 0x3534, - RequestForcedReactions = 0x3209, - RequestGuildPartyState = 0x31a7, - RequestGuildRewardsList = 0x31a6, - RequestLfgListBlacklist = 0x32a7, + RequestConquestFormulaConstants = 0x32c3, + RequestCovenantCallings = 0x33b7, + RequestCrowdControlSpell = 0x353c, + RequestForcedReactions = 0x320d, + RequestGarrisonTalentWorldQuestUnlocks = 0x33f1, + RequestGuildPartyState = 0x31a9, + RequestGuildRewardsList = 0x31a8, + RequestLatestSplashScreen = 0x33c6, + RequestLfgListBlacklist = 0x32b3, + RequestMythicPlusAffixes = 0x320a, + RequestMythicPlusSeasonData = 0x320b, RequestPartyJoinUpdates = 0x35f7, RequestPartyMemberStats = 0x3653, - RequestPetInfo = 0x3490, - RequestPlayedTime = 0x327f, - RequestPvpBrawlInfo = 0x3195, - RequestPvpRewards = 0x3194, - RequestQuestLinesForMap = 0x3397, - RequestRaidInfo = 0x36c8, - RequestRatedBattlefieldInfo = 0x35e3, + RequestPetInfo = 0x3496, + RequestPlayedTime = 0x3287, + RequestPvpRewards = 0x3196, + RequestRaidInfo = 0x36ca, + RequestRatedPvpInfo = 0x35e3, RequestRealmGuildMasterInfo = 0x309b, RequestResearchHistory = 0x3167, - RequestStabledPets = 0x3491, - RequestVehicleExit = 0x323a, - RequestVehicleNextSeat = 0x323c, - RequestVehiclePrevSeat = 0x323b, - RequestVehicleSwitchSeat = 0x323d, - RequestWorldQuestUpdate = 0x334d, - ResetChallengeMode = 0x3205, - ResetChallengeModeCheat = 0x3206, + RequestScheduledPvpInfo = 0x3197, + RequestStabledPets = 0x3497, + RequestVehicleExit = 0x323f, + RequestVehicleNextSeat = 0x3241, + RequestVehiclePrevSeat = 0x3240, + RequestVehicleSwitchSeat = 0x3242, + RequestWeeklyRewards = 0x33ba, + RequestWorldQuestUpdate = 0x3363, + ResetChallengeMode = 0x3208, + ResetChallengeModeCheat = 0x3209, ResetInstances = 0x3668, ResurrectResponse = 0x3684, - RevertMonumentAppearance = 0x330b, - RideVehicleInteract = 0x323e, + RevertMonumentAppearance = 0x3322, + RideVehicleInteract = 0x3243, SaveCufProfiles = 0x318b, - SaveEquipmentSet = 0x3512, - SaveGuildEmblem = 0x32ab, - ScenePlaybackCanceled = 0x3222, - ScenePlaybackComplete = 0x3221, - SceneTriggerEvent = 0x3223, - SelfRes = 0x353b, - SellItem = 0x34a2, - SendContactList = 0x36cd, + SaveEquipmentSet = 0x3518, + SaveGuildEmblem = 0x32b7, + ScenePlaybackCanceled = 0x3226, + ScenePlaybackComplete = 0x3225, + SceneTriggerEvent = 0x3227, + SelfRes = 0x3543, + SellItem = 0x34a8, + SendCharacterClubInvitation = 0x36fb, + SendContactList = 0x36cf, SendMail = 0x35fa, - SendTextEmote = 0x3488, - ServerTimeOffsetRequest = 0x369c, - SetAchievementsHidden = 0x3228, - SetActionBarToggles = 0x353c, - SetActionButton = 0x3635, - SetActiveMover = 0x3a38, - SetAdvancedCombatLogging = 0x32b8, + SendTextEmote = 0x348e, + ServerTimeOffsetRequest = 0x369d, + SetAchievementsHidden = 0x322c, + SetActionBarToggles = 0x3544, + SetActionButton = 0x3636, + SetActiveMover = 0x3a39, + SetAdvancedCombatLogging = 0x32c4, SetAssistantLeader = 0x364f, - SetBackpackAutosortDisabled = 0x332a, - SetBankAutosortDisabled = 0x332b, - SetContactNotes = 0x36d0, + SetBackpackAutosortDisabled = 0x3341, + SetBankAutosortDisabled = 0x3342, + SetContactNotes = 0x36d2, SetCurrencyFlags = 0x3169, - SetDifficultyId = 0x3224, + SetDifficultyId = 0x3228, SetDungeonDifficulty = 0x3682, - SetEveryoneIsAssistant = 0x3616, - SetFactionAtWar = 0x34e6, - SetFactionInactive = 0x34e8, - SetFactionNotAtWar = 0x34e7, - SetGameEventDebugViewState = 0x31b8, - SetInsertItemsLeftToRight = 0x332d, - SetLfgBonusFactionId = 0x32a6, + SetEveryoneIsAssistant = 0x3617, + SetFactionAtWar = 0x34ec, + SetFactionInactive = 0x34ee, + SetFactionNotAtWar = 0x34ed, + SetGameEventDebugViewState = 0x31ba, + SetInsertItemsLeftToRight = 0x3344, SetLootMethod = 0x3648, - SetLootSpecialization = 0x3549, + SetLootSpecialization = 0x3551, SetPartyAssignment = 0x3651, SetPartyLeader = 0x364a, SetPetSlot = 0x3168, SetPlayerDeclinedNames = 0x3689, SetPreferredCemetery = 0x3177, - SetPvp = 0x32af, - SetRaidDifficulty = 0x36da, + SetPvp = 0x32bb, + SetRaidDifficulty = 0x36dc, SetRole = 0x35d9, SetSavedInstanceExtend = 0x3687, - SetSelection = 0x3532, - SetSheathed = 0x3489, - SetSortBagsRightToLeft = 0x332c, - SetTaxiBenchmarkMode = 0x34fb, - SetTitle = 0x3283, + SetSelection = 0x353a, + SetSheathed = 0x348f, + SetSortBagsRightToLeft = 0x3343, + SetTaxiBenchmarkMode = 0x3501, + SetTitle = 0x328d, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x32ef, - SetWarMode = 0x32b0, - SetWatchedFaction = 0x34e9, - ShowTradeSkill = 0x36c0, - SignPetition = 0x353d, + SetUsingPartyGarrison = 0x3304, + SetWarMode = 0x32bc, + SetWatchedFaction = 0x34ef, + ShowTradeSkill = 0x36c2, + SignPetition = 0x3545, SilencePartyTalker = 0x3652, - SocketGems = 0x34f3, - SortBags = 0x332e, - SortBankBags = 0x332f, - SortReagentBankBags = 0x3330, - SpellClick = 0x3495, - SpiritHealerActivate = 0x34af, + SocketGems = 0x34f9, + SortBags = 0x3345, + SortBankBags = 0x3346, + SortReagentBankBags = 0x3347, + SpellClick = 0x349b, + SpiritHealerActivate = 0x34b5, SplitItem = 0x399e, StandStateChange = 0x3189, - StartChallengeMode = 0x3554, + StartChallengeMode = 0x355c, StartSpectatorWarGame = 0x35df, StartWarGame = 0x35de, + SubmitUserFeedback = 0x3697, + SubscriptionInterstitialResponse = 0x33e7, SummonResponse = 0x366a, - SupportTicketSubmitBug = 0x3645, - SupportTicketSubmitComplaint = 0x3644, - SupportTicketSubmitSuggestion = 0x3646, + SupportTicketSubmitComplaint = 0x3646, SurrenderArena = 0x3174, SuspendCommsAck = 0x3764, SuspendTokenResponse = 0x376a, SwapInvItem = 0x399d, SwapItem = 0x399c, SwapSubGroups = 0x364d, - SwapVoidItem = 0x31a3, - TabardVendorActivate = 0x32ac, - TalkToGossip = 0x3492, - TaxiNodeStatusQuery = 0x34a8, - TaxiQueryAvailableNodes = 0x34aa, - TaxiRequestEarlyLanding = 0x34ac, - TimeAdjustmentResponse = 0x3a3c, - TimeSyncResponse = 0x3a39, - TimeSyncResponseDropped = 0x3a3b, - TimeSyncResponseFailed = 0x3a3a, + SwapVoidItem = 0x31a5, + TabardVendorActivate = 0x32b8, + TalkToGossip = 0x3498, + TaxiNodeStatusQuery = 0x34ae, + TaxiQueryAvailableNodes = 0x34b0, + TaxiRequestEarlyLanding = 0x34b2, + TimeAdjustmentResponse = 0x3a3d, + TimeSyncResponse = 0x3a3a, + TimeSyncResponseDropped = 0x3a3c, + TimeSyncResponseFailed = 0x3a3b, ToggleDifficulty = 0x3657, - TogglePvp = 0x32ae, - TotemDestroyed = 0x3500, + TogglePvp = 0x32ba, + TotemDestroyed = 0x3506, ToyClearFanfare = 0x312e, - TradeSkillSetFavorite = 0x334b, - TrainerBuySpell = 0x34ae, - TrainerList = 0x34ad, - TransmogrifyItems = 0x3196, - TurnInPetition = 0x353f, - Tutorial = 0x36db, + TradeSkillSetFavorite = 0x3361, + TrainerBuySpell = 0x34b4, + TrainerList = 0x34b3, + TransmogrifyItems = 0x3198, + TurnInPetition = 0x3547, + Tutorial = 0x36dd, TwitterCheckStatus = 0x312a, TwitterConnect = 0x3127, TwitterDisconnect = 0x312b, - TwitterPost = 0x3332, + TwitterPost = 0x3349, + UiMapQuestLinesRequest = 0x33b6, UnacceptTrade = 0x315b, - UndeleteCharacter = 0x36dd, - UnlearnSkill = 0x34ed, - UnlearnSpecialization = 0x31a4, - UnlockVoidStorage = 0x31a0, - UpdateAccountData = 0x3698, - UpdateAreaTriggerVisual = 0x32a1, + UndeleteCharacter = 0x36df, + UnlearnSkill = 0x34f3, + UnlearnSpecialization = 0x31a6, + UnlockVoidStorage = 0x31a2, + UpdateAccountData = 0x3699, + UpdateAreaTriggerVisual = 0x32ab, UpdateClientSettings = 0x3664, - UpdateMissileTrajectory = 0x3a3f, + UpdateMissileTrajectory = 0x3a40, UpdateRaidTarget = 0x3650, - UpdateSpellVisual = 0x32a0, - UpdateVasPurchaseStates = 0x36f3, - UpgradeGarrison = 0x32c0, + UpdateSpellVisual = 0x32aa, + UpdateVasPurchaseStates = 0x36f5, + UpgradeGarrison = 0x32cc, + UpgradeRuneforgeLegendary = 0x33e5, UsedFollow = 0x3186, - UseCritterItem = 0x3244, + UseCritterItem = 0x3249, UseEquipmentSet = 0x3995, - UseItem = 0x329b, - UseToy = 0x329d, - VasCheckTransferOk = 0x370b, - VasGetQueueMinutes = 0x370a, - VasGetServiceStatus = 0x3709, + UseItem = 0x32a5, + UseToy = 0x32a7, + VasCheckTransferOk = 0x370d, + VasGetQueueMinutes = 0x370c, + VasGetServiceStatus = 0x370b, ViolenceLevel = 0x3184, - VoiceChatJoinChannel = 0x370f, - VoiceChatLogin = 0x370e, - VoidStorageTransfer = 0x31a2, - WardenData = 0x35ec, + VoiceChatJoinChannel = 0x3711, + VoiceChatLogin = 0x3710, + VoidStorageTransfer = 0x31a4, + Warden3Data = 0x35ec, Who = 0x3681, WhoIs = 0x3680, WorldPortResponse = 0x35f9, @@ -770,203 +799,205 @@ namespace Framework.Constants public enum ServerOpcodes : uint { - AbortNewWorld = 0x25af, - AccountCriteriaUpdate = 0x28c5, - AccountDataTimes = 0x274f, - AccountMountUpdate = 0x25c4, - AccountToyUpdate = 0x25c5, - AccountTransmogSetFavoritesUpdate = 0x25c8, - AccountTransmogUpdate = 0x25c7, - AchievementDeleted = 0x2727, - AchievementEarned = 0x2663, - ActivateEssenceFailed = 0x2872, - ActivateTaxiReply = 0x26ac, - ActiveGlyphs = 0x2c53, - AddonListRequest = 0x2662, - AddBattlenetFriendResponse = 0x265d, - AddItemPassive = 0x25c0, - AddLossOfControl = 0x269c, - AddRunePower = 0x26eb, - AdjustSplineDuration = 0x25e9, - AdventureMapOpenNpc = 0x2838, - AeLootTargets = 0x262f, - AeLootTargetAck = 0x2630, - AiReaction = 0x26e8, - AlliedRaceDetails = 0x283e, + AbortNewWorld = 0x259f, + AccountCriteriaUpdate = 0x287d, + AccountDataTimes = 0x270f, + AccountMountUpdate = 0x25b1, + AccountToyUpdate = 0x25b2, + AccountTransmogSetFavoritesUpdate = 0x25b5, + AccountTransmogUpdate = 0x25b4, + AchievementDeleted = 0x26ec, + AchievementEarned = 0x2640, + ActivateEssenceFailed = 0x3016, + ActivateSoulbindFailed = 0x3018, + ActivateTaxiReply = 0x267b, + ActiveGlyphs = 0x2c54, + AddonListRequest = 0x263f, + AddBattlenetFriendResponse = 0x263a, + AddItemPassive = 0x25ad, + AddLossOfControl = 0x266d, + AddRunePower = 0x26b5, + AdjustSplineDuration = 0x25cf, + AdventureJournalDataResponse = 0x288d, + AdventureMapOpenNpc = 0x27f7, + AeLootTargets = 0x2615, + AeLootTargetAck = 0x2616, + AiReaction = 0x26b2, + AlliedRaceDetails = 0x27fd, AllAccountCriteria = 0x2571, AllAchievementData = 0x2570, AllGuildAchievements = 0x29b8, - ApplyMountEquipmentResult = 0x28b5, + ApplyMountEquipmentResult = 0x286a, ArchaeologySurveryCast = 0x2588, - AreaPoiUpdateResponse = 0x284f, - AreaSpiritHealerTime = 0x2786, - AreaTriggerDenied = 0x26a3, - AreaTriggerForceSetPositionAndFacing = 0x2642, - AreaTriggerNoCorpse = 0x275b, - AreaTriggerPlaySpellVisual = 0x2641, - AreaTriggerRePath = 0x263f, - AreaTriggerReShape = 0x2644, - AreaTriggerSetVisualAnim = 0x2640, - AreaTriggerUnattach = 0x2643, - ArenaCrowdControlSpellResult = 0x2652, - ArenaPrepOpponentSpecializations = 0x2668, - ArtifactEndgamePowersRefunded = 0x27ec, - ArtifactForgeError = 0x27ea, - ArtifactRespecPrompt = 0x27eb, - ArtifactXpGain = 0x2830, - AttackerStateUpdate = 0x27d5, - AttackStart = 0x2670, - AttackStop = 0x2671, - AttackSwingError = 0x2739, - AttackSwingLandedLog = 0x273a, - AuctionableTokenAuctionSold = 0x281e, - AuctionableTokenSellAtMarketPriceResponse = 0x281d, - AuctionableTokenSellConfirmRequired = 0x281c, - AuctionClosedNotification = 0x2731, - AuctionCommandResult = 0x272e, - AuctionFavoriteList = 0x28cc, - AuctionGetCommodityQuoteResult = 0x28c3, - AuctionHelloResponse = 0x272c, - AuctionListBiddedItemsResult = 0x28c2, - AuctionListBucketsResult = 0x28bf, - AuctionListItemsResult = 0x28c0, - AuctionListOwnedItemsResult = 0x28c1, - AuctionOutbidNotification = 0x2730, - AuctionOwnerBidNotification = 0x2732, - AuctionReplicateResponse = 0x272d, - AuctionWonNotification = 0x272f, + AreaPoiUpdateResponse = 0x3011, + AreaSpiritHealerTime = 0x2744, + AreaTriggerDenied = 0x2917, + AreaTriggerForceSetPositionAndFacing = 0x2914, + AreaTriggerNoCorpse = 0x271b, + AreaTriggerPlaySpellVisual = 0x2913, + AreaTriggerRePath = 0x2911, + AreaTriggerReShape = 0x2916, + AreaTriggerSetVisualAnim = 0x2912, + AreaTriggerUnattach = 0x2915, + ArenaCrowdControlSpellResult = 0x262f, + ArenaPrepOpponentSpecializations = 0x2645, + ArtifactEndgamePowersRefunded = 0x27a6, + ArtifactForgeError = 0x27a4, + ArtifactRespecPrompt = 0x27a5, + ArtifactXpGain = 0x27ef, + AttackerStateUpdate = 0x294c, + AttackStart = 0x2937, + AttackStop = 0x2938, + AttackSwingError = 0x2946, + AttackSwingLandedLog = 0x2947, + AuctionableTokenAuctionSold = 0x27d8, + AuctionableTokenSellAtMarketPriceResponse = 0x27d7, + AuctionableTokenSellConfirmRequired = 0x27d6, + AuctionClosedNotification = 0x26f6, + AuctionCommandResult = 0x26f3, + AuctionFavoriteList = 0x2884, + AuctionGetCommodityQuoteResult = 0x287b, + AuctionHelloResponse = 0x26f1, + AuctionListBiddedItemsResult = 0x287a, + AuctionListBucketsResult = 0x2877, + AuctionListItemsResult = 0x2878, + AuctionListOwnedItemsResult = 0x2879, + AuctionOutbidNotification = 0x26f5, + AuctionOwnerBidNotification = 0x26f7, + AuctionReplicateResponse = 0x26f2, + AuctionWonNotification = 0x26f4, AuraPointsDepleted = 0x2c23, AuraUpdate = 0x2c22, AuthChallenge = 0x3048, AuthFailed = 0x256c, AuthResponse = 0x256d, - AvailableHotfixes = 0x25a3, - AzeriteRespecNpc = 0x283b, - BagCleanupFinished = 0x2826, - BarberShopResult = 0x26f1, - BatchPresenceSubscription = 0x28a4, - BattlefieldList = 0x2596, - BattlefieldPortDenied = 0x259c, - BattlefieldStatusActive = 0x2592, - BattlefieldStatusFailed = 0x2595, - BattlefieldStatusNeedConfirmation = 0x2591, - BattlefieldStatusNone = 0x2594, - BattlefieldStatusQueued = 0x2593, - BattlefieldStatusWaitForGroups = 0x25a7, - BattlegroundInfoThrottled = 0x259d, - BattlegroundInit = 0x27a4, - BattlegroundPlayerJoined = 0x259a, - BattlegroundPlayerLeft = 0x259b, - BattlegroundPlayerPositions = 0x2597, - BattlegroundPoints = 0x27a3, - BattlenetChallengeAbort = 0x27d4, - BattlenetChallengeStart = 0x27d3, - BattlenetNotification = 0x284a, - BattlenetResponse = 0x2849, - BattleNetConnectionStatus = 0x284b, - BattlePayAckFailed = 0x27ce, - BattlePayBattlePetDelivered = 0x27c2, - BattlePayCollectionItemDelivered = 0x27c3, - BattlePayConfirmPurchase = 0x27cd, - BattlePayDeliveryEnded = 0x27c0, - BattlePayDeliveryStarted = 0x27bf, - BattlePayDistributionUnrevoked = 0x27bd, - BattlePayDistributionUpdate = 0x27be, - BattlePayGetDistributionListResponse = 0x27bc, - BattlePayGetProductListResponse = 0x27ba, - BattlePayGetPurchaseListResponse = 0x27bb, - BattlePayMountDelivered = 0x27c1, - BattlePayPurchaseUpdate = 0x27cc, - BattlePayStartCheckout = 0x2869, - BattlePayStartDistributionAssignToTargetResponse = 0x27ca, - BattlePayStartPurchaseResponse = 0x27c9, - BattlePayValidatePurchaseResponse = 0x285d, + AvailableHotfixes = 0x2595, + AzeriteRespecNpc = 0x27fa, + BagCleanupFinished = 0x2da7, + BarberShopResult = 0x26bb, + BatchPresenceSubscription = 0x285b, + BattlefieldList = 0x2927, + BattlefieldPortDenied = 0x292d, + BattlefieldStatusActive = 0x2923, + BattlefieldStatusFailed = 0x2926, + BattlefieldStatusNeedConfirmation = 0x2922, + BattlefieldStatusNone = 0x2925, + BattlefieldStatusQueued = 0x2924, + BattlefieldStatusWaitForGroups = 0x292f, + BattlegroundInfoThrottled = 0x292e, + BattlegroundInit = 0x2949, + BattlegroundPlayerJoined = 0x292b, + BattlegroundPlayerLeft = 0x292c, + BattlegroundPlayerPositions = 0x2928, + BattlegroundPoints = 0x2948, + BattlenetChallengeAbort = 0x278d, + BattlenetChallengeStart = 0x278c, + BattlenetNotification = 0x2808, + BattlenetResponse = 0x2807, + BattleNetConnectionStatus = 0x2809, + BattlePayAckFailed = 0x2787, + BattlePayBattlePetDelivered = 0x277c, + BattlePayCollectionItemDelivered = 0x277d, + BattlePayConfirmPurchase = 0x2786, + BattlePayDeliveryEnded = 0x277a, + BattlePayDeliveryStarted = 0x2779, + BattlePayDistributionUpdate = 0x2778, + BattlePayGetDistributionListResponse = 0x2776, + BattlePayDistributionUnrevoked = 0x2777, + BattlePayGetProductListResponse = 0x2774, + BattlePayGetPurchaseListResponse = 0x2775, + BattlePayMountDelivered = 0x277b, + BattlePayPurchaseUpdate = 0x2785, + BattlePayStartCheckout = 0x2825, + BattlePayStartDistributionAssignToTargetResponse = 0x2783, + BattlePayStartPurchaseResponse = 0x2782, + BattlePayValidatePurchaseResponse = 0x2819, BattlePayVasGuildFollowInfo = 0x29e7, BattlePayVasGuildMasterList = 0x29e6, - BattlePetsHealed = 0x260b, - BattlePetCageDateError = 0x26a6, - BattlePetDeleted = 0x2608, - BattlePetError = 0x2658, - BattlePetJournal = 0x2607, - BattlePetJournalLockAcquired = 0x2605, - BattlePetJournalLockDenied = 0x2606, - BattlePetLicenseChanged = 0x260c, - BattlePetRestored = 0x260a, - BattlePetRevoked = 0x2609, - BattlePetSetMaxPets = 0x2603, - BattlePetTrapLevel = 0x2602, - BattlePetUpdates = 0x2601, - BinderConfirm = 0x273f, + BattlePetsHealed = 0x25f0, + BattlePetCageDateError = 0x2676, + BattlePetDeleted = 0x25ed, + BattlePetError = 0x2635, + BattlePetJournal = 0x25ec, + BattlePetJournalLockAcquired = 0x25ea, + BattlePetJournalLockDenied = 0x25eb, + BattlePetLicenseChanged = 0x25f1, + BattlePetRestored = 0x25ef, + BattlePetRevoked = 0x25ee, + BattlePetSetMaxPets = 0x25e8, + BattlePetTrapLevel = 0x25e7, + BattlePetUpdates = 0x25e6, + BinderConfirm = 0x2700, BindPointUpdate = 0x257d, - BlackMarketBidOnItemResult = 0x2648, - BlackMarketOpenResult = 0x2646, - BlackMarketOutbid = 0x2649, - BlackMarketRequestItemsResult = 0x2647, - BlackMarketWon = 0x264a, - BonusRollEmpty = 0x2665, - BossKill = 0x27c8, - BreakTarget = 0x266f, + BlackMarketBidOnItemResult = 0x2625, + BlackMarketOpenResult = 0x2623, + BlackMarketOutbid = 0x2626, + BlackMarketRequestItemsResult = 0x2624, + BlackMarketWon = 0x2627, + BonusRollEmpty = 0x2642, + BossKill = 0x294b, + BreakTarget = 0x2936, BroadcastAchievement = 0x2bbc, - BroadcastSummonCast = 0x28a8, - BroadcastSummonResponse = 0x28a9, - BuyFailed = 0x26fa, - BuySucceeded = 0x26f9, - CacheInfo = 0x2749, - CacheVersion = 0x2748, - CalendarClearPendingAction = 0x26cc, - CalendarCommandResult = 0x26cd, - CalendarCommunityInvite = 0x26bc, - CalendarEventRemovedAlert = 0x26c4, - CalendarEventUpdatedAlert = 0x26c5, - CalendarInviteAdded = 0x26bd, - CalendarInviteAlert = 0x26c1, - CalendarInviteNotes = 0x26c6, - CalendarInviteNotesAlert = 0x26c7, - CalendarInviteRemoved = 0x26be, - CalendarInviteRemovedAlert = 0x26c3, - CalendarInviteStatus = 0x26bf, - CalendarInviteStatusAlert = 0x26c2, - CalendarModeratorStatus = 0x26c0, - CalendarRaidLockoutAdded = 0x26c8, - CalendarRaidLockoutRemoved = 0x26c9, - CalendarRaidLockoutUpdated = 0x26ca, - CalendarSendCalendar = 0x26ba, - CalendarSendEvent = 0x26bb, - CalendarSendNumPending = 0x26cb, - CameraEffect = 0x276b, - CancelAutoRepeat = 0x271b, - CancelCombat = 0x2737, + BroadcastSummonCast = 0x285d, + BroadcastSummonResponse = 0x285e, + BuyFailed = 0x26c4, + BuySucceeded = 0x26c3, + CacheInfo = 0x2709, + CacheVersion = 0x2708, + 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 = 0x272a, + CancelAutoRepeat = 0x26e2, + CancelCombat = 0x2945, CancelOrphanSpellVisual = 0x2c46, - CancelScene = 0x2657, + CancelScene = 0x2634, CancelSpellVisual = 0x2c44, CancelSpellVisualKit = 0x2c48, - CanDuelResult = 0x267a, - CanRedeemTokenForBalanceResponse = 0x285c, - CapturePointRemoved = 0x2599, - CastFailed = 0x2c56, + CanDuelResult = 0x2941, + CanRedeemTokenForBalanceResponse = 0x2818, + CapturePointRemoved = 0x292a, + CastFailed = 0x2c57, CategoryCooldown = 0x2c16, - ChallengeModeComplete = 0x2622, - ChallengeModeRequestLeadersResult = 0x2626, - ChallengeModeReset = 0x2621, - ChallengeModeStart = 0x261f, - ChallengeModeUpdateDeathCount = 0x2620, - ChangePlayerDifficultyResult = 0x273b, - ChangeRealmTicketResponse = 0x284c, + ChallengeModeComplete = 0x2607, + ChallengeModeRequestLeadersResult = 0x260c, + ChallengeModeReset = 0x2606, + ChallengeModeStart = 0x2604, + ChallengeModeUpdateDeathCount = 0x2605, + ChangePlayerDifficultyResult = 0x3005, + ChangeRealmTicketResponse = 0x280a, ChannelList = 0x2bc3, ChannelNotify = 0x2bc0, ChannelNotifyJoined = 0x2bc1, ChannelNotifyLeft = 0x2bc2, - CharacterCheckUpgradeResult = 0x2806, - CharacterLoginFailed = 0x274a, - CharacterObjectTestResponse = 0x27d2, - CharacterRenameResult = 0x27ac, - CharacterUpgradeAborted = 0x2805, - CharacterUpgradeComplete = 0x2804, - CharacterUpgradeManualUnrevokeResult = 0x2807, - CharacterUpgradeStarted = 0x2803, - CharCustomizeFailure = 0x2721, - CharCustomizeSuccess = 0x2722, - CharFactionChangeResult = 0x27f0, + CharacterCheckUpgradeResult = 0x27c0, + CharacterLoginFailed = 0x270a, + CharacterObjectTestResponse = 0x278b, + CharacterRenameResult = 0x2766, + CharacterUpgradeAborted = 0x27bf, + CharacterUpgradeComplete = 0x27be, + CharacterUpgradeManualUnrevokeResult = 0x27c1, + CharacterUpgradeStarted = 0x27bd, + CharCustomizeFailure = 0x26e6, + CharCustomizeSuccess = 0x26e7, + CharFactionChangeResult = 0x27aa, Chat = 0x2bad, ChatAutoResponded = 0x2bb8, ChatDown = 0x2bbd, @@ -976,205 +1007,241 @@ namespace Framework.Constants ChatPlayerAmbiguous = 0x2bb0, ChatPlayerNotfound = 0x2bb7, ChatReconnect = 0x2bbf, + ChatRegionalServiceStatus = 0x2bc5, ChatRestricted = 0x2bb3, ChatServerMessage = 0x2bc4, CheatIgnoreDimishingReturns = 0x2c12, - CheckWargameEntry = 0x25a0, - ClaimRafRewardResponse = 0x28b9, + CheckAbandonNpe = 0x3019, + CheckCharacterNameAvailabilityResult = 0x2584, + CheckWargameEntry = 0x2592, + ChromieTimeOpenNpc = 0x27ff, + ChromieTimeSelectExpansionSuccess = 0x2887, + ClaimRafRewardResponse = 0x286e, ClearAllSpellCharges = 0x2c27, - ClearBossEmotes = 0x25ce, - ClearCooldown = 0x26ed, + ClearBossEmotes = 0x25bc, + ClearCooldown = 0x26b7, ClearCooldowns = 0x2c26, - ClearLossOfControl = 0x269e, - ClearResurrect = 0x2580, + ClearLossOfControl = 0x266f, + ClearResurrect = 0x257f, ClearSpellCharges = 0x2c28, - ClearTarget = 0x26e4, - CloseArtifactForge = 0x27e9, - CloseHeartForge = 0x2874, - ClubFinderErrorMessage = 0x28b1, - ClubFinderGetClubPostingIdsResponse = 0x28b4, - ClubFinderLookupClubPostingsList = 0x28b2, - ClubFinderResponseCharacterApplicationList = 0x28af, - ClubFinderResponsePostRecruitmentMessage = 0x28b3, - ClubFinderUpdateApplications = 0x28b0, - CoinRemoved = 0x262e, - CombatEventFailed = 0x2672, - CommentatorMapInfo = 0x274c, - CommentatorPlayerInfo = 0x274d, - CommentatorStateChanged = 0x274b, - CommerceTokenGetCountResponse = 0x2819, - CommerceTokenGetLogResponse = 0x2825, - CommerceTokenGetMarketPriceResponse = 0x281b, - CommerceTokenUpdate = 0x281a, - ComplaintResult = 0x26db, - CompleteShipmentResponse = 0x27e4, - ConfirmPartyInvite = 0x285b, + ClearTarget = 0x2942, + ClearTreasurePickerCache = 0x2aa0, + CloseArtifactForge = 0x27a3, + CloseHeartForge = 0x282b, + CloseItemForge = 0x27a1, + ClubFinderErrorMessage = 0x2866, + ClubFinderGetClubPostingIdsResponse = 0x2869, + ClubFinderLookupClubPostingsList = 0x2867, + ClubFinderResponseCharacterApplicationList = 0x2864, + ClubFinderResponsePostRecruitmentMessage = 0x2868, + ClubFinderUpdateApplications = 0x2865, + CoinRemoved = 0x2614, + CombatEventFailed = 0x2939, + CommentatorMapInfo = 0x270c, + CommentatorPlayerInfo = 0x270d, + CommentatorStateChanged = 0x270b, + CommerceTokenGetCountResponse = 0x27d3, + CommerceTokenGetLogResponse = 0x27df, + CommerceTokenGetMarketPriceResponse = 0x27d5, + CommerceTokenUpdate = 0x27d4, + ComplaintResult = 0x26a9, + CompleteShipmentResponse = 0x279c, + ConfirmPartyInvite = 0x2817, ConnectTo = 0x304d, - ConquestFormulaConstants = 0x27cf, - ConsoleWrite = 0x2655, - ConsumableTokenBuyAtMarketPriceResponse = 0x2821, - ConsumableTokenBuyChoiceRequired = 0x2820, - ConsumableTokenCanVeteranBuyResponse = 0x281f, - ConsumableTokenRedeemConfirmRequired = 0x2823, - ConsumableTokenRedeemResponse = 0x2824, - ContactList = 0x27d0, - ContributionLastUpdateResponse = 0x2862, - ControlUpdate = 0x2667, - CooldownCheat = 0x277f, - CooldownEvent = 0x26ec, - CorpseLocation = 0x266e, - CorpseReclaimDelay = 0x2791, - CorpseTransportQuery = 0x2757, - CreateChar = 0x2744, - CreateShipmentResponse = 0x27e3, - CriteriaDeleted = 0x2726, - CriteriaUpdate = 0x2720, - CrossedInebriationThreshold = 0x26f5, - CustomLoadScreen = 0x25e4, + ConquestFormulaConstants = 0x2788, + ConsoleWrite = 0x2632, + ConsumableTokenBuyAtMarketPriceResponse = 0x27db, + ConsumableTokenBuyChoiceRequired = 0x27da, + ConsumableTokenCanVeteranBuyResponse = 0x27d9, + ConsumableTokenRedeemConfirmRequired = 0x27dd, + ConsumableTokenRedeemResponse = 0x27de, + ContactList = 0x2789, + ContributionLastUpdateResponse = 0x281e, + ControlUpdate = 0x2644, + ConvertItemsToCurrencyValue = 0x2890, + CooldownCheat = 0x273d, + CooldownEvent = 0x26b6, + CorpseLocation = 0x264b, + CorpseReclaimDelay = 0x274e, + CorpseTransportQuery = 0x2717, + CovenantCallingsAvailabilityResponse = 0x2aa2, + CovenantPreviewOpenNpc = 0x2800, + CovenantRenownOpenNpc = 0x288f, + CreateChar = 0x2704, + CreateShipmentResponse = 0x279b, + CriteriaDeleted = 0x26eb, + CriteriaUpdate = 0x26e5, + CrossedInebriationThreshold = 0x26bf, + CustomLoadScreen = 0x25ca, DailyQuestsReset = 0x2a80, - DamageCalcLog = 0x280e, - DbReply = 0x25a2, - DeathReleaseLoc = 0x2710, - DebugMenuManagerFullUpdate = 0x2680, + DamageCalcLog = 0x27c8, + DbReply = 0x2594, + DeathReleaseLoc = 0x26d8, + DebugMenuManagerFullUpdate = 0x2651, DefenseMessage = 0x2bb6, - DeleteChar = 0x2745, - DestroyArenaUnit = 0x2788, - DestructibleBuildingDamage = 0x2738, + DeleteChar = 0x2705, + DeleteExpiredMissionsResult = 0x2976, + DestroyArenaUnit = 0x2746, + DestructibleBuildingDamage = 0x26fc, DifferentInstanceFromParty = 0x258c, - DisconnectReason = 0x2832, - DisenchantCredit = 0x25bd, - Dismount = 0x26e3, + DisconnectReason = 0x27f1, + DisenchantCredit = 0x25aa, DismountResult = 0x257c, DispelFailed = 0x2c30, - DisplayGameError = 0x25b6, - DisplayPlayerChoice = 0x26a7, - DisplayPromotion = 0x266b, + DisplayGameError = 0x25a4, + DisplayPlayerChoice = 0x2ffc, + DisplayPromotion = 0x2648, DisplayQuestPopup = 0x2a9d, - DisplayToast = 0x263b, - DisplayWorldText = 0x2831, - DontAutoPushSpellsToActionBar = 0x25f8, + DisplayToast = 0x2621, + DisplayWorldText = 0x27f0, + DontAutoPushSpellsToActionBar = 0x25dd, DropNewConnection = 0x304c, - DuelArranged = 0x2674, - DuelComplete = 0x2678, - DuelCountdown = 0x2677, - DuelInBounds = 0x2676, - DuelOutOfBounds = 0x2675, - DuelRequested = 0x2673, - DuelWinner = 0x2679, - DurabilityDamageDeath = 0x278d, - Emote = 0x280f, - EnableBarberShop = 0x26f0, - EnchantmentLog = 0x2758, - EncounterEnd = 0x27c7, - EncounterStart = 0x27c6, - EndLightningStorm = 0x26d7, + DuelArranged = 0x293b, + DuelComplete = 0x293f, + DuelCountdown = 0x293e, + DuelInBounds = 0x293d, + DuelOutOfBounds = 0x293c, + DuelRequested = 0x293a, + DuelWinner = 0x2940, + DurabilityDamageDeath = 0x274a, + Emote = 0x27c9, + EnableBarberShop = 0x26ba, + EnchantmentLog = 0x2718, + EncounterEnd = 0x2781, + EncounterStart = 0x2780, + EndLightningStorm = 0x26a6, EnterEncryptedMode = 0x3049, - EnumCharactersResult = 0x2584, - EnumVasPurchaseStatesResponse = 0x2837, + EnumCharactersResult = 0x2583, + EnumVasPurchaseStatesResponse = 0x27f6, EnvironmentalDamageLog = 0x2c21, - EquipmentSetId = 0x26e5, + EquipmentSetId = 0x26af, ExpectedSpamRecords = 0x2bb1, - ExplorationExperience = 0x27a9, - FactionBonusInfo = 0x276a, - FailedPlayerCondition = 0x25e3, - FailedQuestTurnIn = 0x2858, - FeatureSystemStatus = 0x25d2, - FeatureSystemStatusGlueScreen = 0x25d3, - FeignDeathResisted = 0x278b, - FishEscaped = 0x2703, - FishNotHooked = 0x2702, - FlightSplineSync = 0x2df7, - ForcedDeathUpdate = 0x2711, - ForceAnim = 0x2798, - ForceObjectRelink = 0x266a, - FriendStatus = 0x27d1, - GameObjectActivateAnimKit = 0x25d7, - GameObjectBase = 0x2875, - GameObjectCustomAnim = 0x25d8, - GameObjectDespawn = 0x25d9, + ExplorationExperience = 0x2763, + ExternalTransactionIdGenerated = 0x288e, + FactionBonusInfo = 0x2729, + FailedPlayerCondition = 0x2ffa, + FailedQuestTurnIn = 0x2814, + FeatureSystemStatus = 0x25c0, + FeatureSystemStatusGlueScreen = 0x25c1, + FeignDeathResisted = 0x2749, + FishEscaped = 0x26cd, + FishNotHooked = 0x26cc, + FlightSplineSync = 0x2e29, + ForcedDeathUpdate = 0x26d9, + ForceAnim = 0x2755, + ForceAnimations = 0x2756, + ForceObjectRelink = 0x2647, + FriendStatus = 0x278a, + GainMawPower = 0x27e4, + GameObjectActivateAnimKit = 0x25c3, + GameObjectBase = 0x282c, + GameObjectCustomAnim = 0x25c4, + GameObjectDespawn = 0x25c5, GameObjectPlaySpellVisual = 0x2c4b, GameObjectPlaySpellVisualKit = 0x2c4a, - GameObjectResetState = 0x2762, - GameObjectSetStateLocal = 0x2848, - GameObjectUILink = 0x275f, - GameSpeedSet = 0x26b0, - GameTimeSet = 0x2751, - GameTimeUpdate = 0x2750, - GarrisonAddFollowerResult = 0x2902, - GarrisonAddMissionResult = 0x2906, - GarrisonAssignFollowerToBuildingResult = 0x2918, - GarrisonBuildingActivated = 0x28fb, - GarrisonBuildingLandmarks = 0x292c, - GarrisonBuildingRemoved = 0x28f4, - GarrisonBuildingSetActiveSpecializationResult = 0x28f6, - GarrisonClearAllFollowersExhaustion = 0x2916, - GarrisonCompleteMissionResult = 0x2908, - GarrisonCreateResult = 0x28fc, - GarrisonDeleteResult = 0x2920, - GarrisonFollowerCategories = 0x2901, - GarrisonFollowerChangedAbilities = 0x2914, - GarrisonFollowerChangedDurability = 0x2904, - GarrisonFollowerChangedItemLevel = 0x2913, - GarrisonFollowerChangedStatus = 0x2915, - GarrisonFollowerChangedXp = 0x2912, - GarrisonIsUpgradeableResult = 0x2929, - GarrisonLearnBlueprintResult = 0x28f7, - GarrisonLearnSpecializationResult = 0x28f5, - GarrisonListFollowersCheatResult = 0x2905, - GarrisonListMissionsCheatResult = 0x292a, - GarrisonMissionAreaBonusAdded = 0x2910, - GarrisonMissionBonusRollResult = 0x290c, - GarrisonMissionListUpdate = 0x290e, - GarrisonMissionRewardResponse = 0x292d, - GarrisonMissionUpdateCanStart = 0x2911, - GarrisonNumFollowerActivationsRemaining = 0x2917, - GarrisonOpenArchitect = 0x2921, - GarrisonOpenMissionNpc = 0x2923, - GarrisonOpenRecruitmentNpc = 0x291c, - GarrisonOpenTalentNpc = 0x291d, - GarrisonOpenTradeskillNpc = 0x2922, - GarrisonPlaceBuildingResult = 0x28f3, - GarrisonPlotPlaced = 0x28f1, - GarrisonPlotRemoved = 0x28f2, - GarrisonRecallPortalLastUsedTime = 0x290a, - GarrisonRecallPortalUsed = 0x290b, - GarrisonRecruitmentFollowersGenerated = 0x291e, - GarrisonRecruitFollowerResult = 0x291f, - GarrisonRemoteInfo = 0x28fa, - GarrisonRemoveFollowerFromBuildingResult = 0x2919, - GarrisonRemoveFollowerResult = 0x2903, - GarrisonRequestBlueprintAndSpecializationDataResult = 0x28f9, - GarrisonStartMissionResult = 0x2907, - GarrisonUnlearnBlueprintResult = 0x28f8, - GarrisonUpgradeResult = 0x28fd, + GameObjectResetState = 0x2723, + GameObjectSetStateLocal = 0x2806, + GameObjectUiLink = 0x271f, + GameSpeedSet = 0x267f, + GameTimeSet = 0x2711, + GameTimeUpdate = 0x2710, + GarrisonActivateMissionBonusAbility = 0x2978, + GarrisonAddEvent = 0x299b, + GarrisonAddFollowerResult = 0x296a, + GarrisonAddMissionResult = 0x296e, + GarrisonApplyTalentSocketDataChanges = 0x29a0, + GarrisonAssignFollowerToBuildingResult = 0x2980, + GarrisonBuildingActivated = 0x295f, + GarrisonBuildingRemoved = 0x2958, + GarrisonBuildingSetActiveSpecializationResult = 0x295a, + GarrisonChangeMissionStartTimeResult = 0x2971, + GarrisonClearCollection = 0x299a, + GarrisonClearEventList = 0x299d, + GarrisonCollectionRemoveEntry = 0x2999, + GarrisonCollectionUpdateEntry = 0x2998, + GarrisonCompleteBuildingConstructionResult = 0x2990, + GarrisonCompleteMissionResult = 0x2970, + GarrisonCreateResult = 0x2960, + GarrisonDeleteMissionResult = 0x2977, + GarrisonDeleteResult = 0x2989, + GarrisonFollowerActivationsSet = 0x297f, + GarrisonFollowerChangedFlags = 0x297d, + GarrisonFollowerChangedItemLevel = 0x297b, + GarrisonFollowerChangedQuality = 0x297c, + GarrisonFollowerChangedXp = 0x297a, + GarrisonFollowerFatigueCleared = 0x297e, + GarrisonGenerateFollowersResult = 0x2987, + GarrisonGetClassSpecCategoryInfoResult = 0x2969, + GarrisonGetRecallPortalLastUsedTimeResult = 0x2972, + GarrisonIsUpgradeableResponse = 0x2992, + GarrisonLearnBlueprintResult = 0x295b, + GarrisonLearnSpecializationResult = 0x2959, + GarrisonListCompletedMissionsCheatResult = 0x2993, + GarrisonListFollowersCheatResult = 0x296d, + GarrisonMapDataResponse = 0x2995, + GarrisonMissionBonusRollResult = 0x2974, + GarrisonMissionRequestRewardInfoResponse = 0x2996, + GarrisonMissionStartConditionUpdate = 0x2979, + GarrisonOpenArchitect = 0x298a, + GarrisonOpenCrafter = 0x298b, + GarrisonOpenMissionNpc = 0x298c, + GarrisonOpenRecruitmentNpc = 0x2984, + GarrisonOpenTalentNpc = 0x2985, + GarrisonPlaceBuildingResult = 0x2957, + GarrisonPlotPlaced = 0x2955, + GarrisonPlotRemoved = 0x2956, + GarrisonRecruitFollowerResult = 0x2988, + GarrisonRemoteInfo = 0x295e, + GarrisonRemoveEvent = 0x299c, + GarrisonRemoveFollowerAbilityResult = 0x2983, + GarrisonRemoveFollowerFromBuildingResult = 0x2981, + GarrisonRemoveFollowerResult = 0x296b, + GarrisonRenameFollowerResult = 0x2982, + GarrisonRequestBlueprintAndSpecializationDataResult = 0x295d, + GarrisonResearchTalentResult = 0x2962, + GarrisonResetTalentTree = 0x2967, + GarrisonResetTalentTreeSocketData = 0x2968, + GarrisonStartMissionResult = 0x296f, + GarrisonSwapBuildingsResponse = 0x298f, + GarrisonSwitchTalentTreeBranch = 0x299e, + GarrisonTalentCompleted = 0x2963, + GarrisonTalentRemoved = 0x2964, + GarrisonTalentRemoveSocketData = 0x2966, + GarrisonTalentUpdateSocketData = 0x2965, + GarrisonTalentWorldQuestUnlocksResponse = 0x299f, + GarrisonUnlearnBlueprintResult = 0x295c, + GarrisonUpdateFollower = 0x296c, + GarrisonUpdateGarrisonMonumentSelections = 0x2991, + GarrisonUpgradeResult = 0x2961, + GarrisonUseRecallPortalResult = 0x2973, GenerateRandomCharacterNameResult = 0x2585, - GenerateSsoTokenResponse = 0x2863, - GetAccountCharacterListResult = 0x27aa, - GetDisplayedTrophyListResponse = 0x2928, - GetGarrisonInfoResult = 0x28f0, - GetLandingPageShipmentsResponse = 0x27e6, - GetRemainingGameTimeResponse = 0x2822, - GetSelectedTrophyIdResponse = 0x280b, - GetShipmentsOfTypeResponse = 0x27e5, - GetShipmentInfoResponse = 0x27e1, - GetTrophyListResponse = 0x280a, - GetVasAccountCharacterListResult = 0x2833, - GetVasTransferTargetRealmListResult = 0x2834, - GmPlayerInfo = 0x277e, - GmRequestPlayerInfo = 0x25ef, - GmTicketCaseStatus = 0x26d2, - GmTicketSystemStatus = 0x26d1, - GodMode = 0x273e, + GenerateSsoTokenResponse = 0x281f, + GetAccountCharacterListResult = 0x2764, + GetGarrisonInfoResult = 0x2954, + GetLandingPageShipmentsResponse = 0x279e, + GetRemainingGameTimeResponse = 0x27dc, + GetSelectedTrophyIdResponse = 0x27c5, + GetShipmentsOfTypeResponse = 0x279d, + GetShipmentInfoResponse = 0x2799, + GetTrophyListResponse = 0x27c4, + GetVasAccountCharacterListResult = 0x27f2, + GetVasTransferTargetRealmListResult = 0x27f3, + GmPlayerInfo = 0x3006, + GmRequestPlayerInfo = 0x2ffb, + GmTicketCaseStatus = 0x26a1, + GmTicketSystemStatus = 0x26a0, + GodMode = 0x26ff, GossipComplete = 0x2a96, GossipMessage = 0x2a97, - GossipPoi = 0x27de, - GossipTextUpdate = 0x2a98, - GroupActionThrottled = 0x259e, - GroupAutoKick = 0x27dc, - GroupDecline = 0x27d9, - GroupDestroyed = 0x27db, - GroupNewLeader = 0x264d, - GroupUninvite = 0x27da, + GossipPoi = 0x2796, + GossipQuestUpdate = 0x2a98, + GossipRefreshOptions = 0x2aa5, + GroupActionThrottled = 0x2590, + GroupAutoKick = 0x2794, + GroupDecline = 0x2791, + GroupDestroyed = 0x2793, + GroupNewLeader = 0x262a, + GroupUninvite = 0x2792, GuildAchievementDeleted = 0x29c5, GuildAchievementEarned = 0x29c4, GuildAchievementMembers = 0x29c7, @@ -1188,7 +1255,6 @@ namespace Framework.Constants GuildCommandResult = 0x29ba, GuildCriteriaDeleted = 0x29c6, GuildCriteriaUpdate = 0x29c3, - GuildEventAwayChange = 0x29f0, GuildEventBankContentsChanged = 0x29f8, GuildEventBankMoneyChanged = 0x29f7, GuildEventDisbanded = 0x29ed, @@ -1200,6 +1266,7 @@ namespace Framework.Constants GuildEventPresenceChange = 0x29ef, GuildEventRanksUpdated = 0x29f1, GuildEventRankChanged = 0x29f2, + GuildEventStatusChange = 0x29f0, GuildEventTabAdded = 0x29f3, GuildEventTabDeleted = 0x29f4, GuildEventTabModified = 0x29f5, @@ -1208,7 +1275,7 @@ namespace Framework.Constants GuildInvite = 0x29ca, GuildInviteDeclined = 0x29e8, GuildInviteExpired = 0x29e9, - GuildItemLooted = 0x29d4, + GuildItemLootedNotify = 0x29d4, GuildKnownRecipes = 0x29be, GuildMembersWithRecipe = 0x29bf, GuildMemberDailyReset = 0x29e4, @@ -1228,60 +1295,62 @@ namespace Framework.Constants GuildRoster = 0x29bb, GuildRosterUpdate = 0x29bc, GuildSendRankChange = 0x29b9, - HealthUpdate = 0x2706, - HighestThreatUpdate = 0x2717, - HotfixConnect = 0x25a5, - HotfixMessage = 0x25a4, - InitializeFactions = 0x2769, - InitialSetup = 0x2581, - InitWorldStates = 0x278e, - InspectResult = 0x2651, - InstanceEncounterChangePriority = 0x27f6, - InstanceEncounterDisengageUnit = 0x27f5, - InstanceEncounterEnd = 0x27fe, - InstanceEncounterEngageUnit = 0x27f4, - InstanceEncounterGainCombatResurrectionCharge = 0x2800, - InstanceEncounterInCombatResurrection = 0x27ff, - InstanceEncounterObjectiveComplete = 0x27f9, - InstanceEncounterObjectiveStart = 0x27f8, - InstanceEncounterObjectiveUpdate = 0x27fd, - InstanceEncounterPhaseShiftChanged = 0x2801, - InstanceEncounterStart = 0x27fa, - InstanceEncounterTimerStart = 0x27f7, - InstanceEncounterUpdateAllowReleaseInProgress = 0x27fc, - InstanceEncounterUpdateSuppressRelease = 0x27fb, - InstanceGroupSizeChanged = 0x273c, - InstanceInfo = 0x2654, - InstanceReset = 0x26b5, - InstanceResetFailed = 0x26b6, - InstanceSaveCreated = 0x27c5, - InvalidatePageText = 0x270c, - InvalidatePlayer = 0x26da, - InvalidPromotionCode = 0x2799, - InventoryChangeFailure = 0x2767, - InventoryFixupComplete = 0x285a, - InventoryFullOverflow = 0x286b, - IslandsMissionNpc = 0x283d, - IslandAzeriteGain = 0x27a6, - IslandComplete = 0x27a7, + HealthUpdate = 0x26d0, + HighestThreatUpdate = 0x26de, + HotfixConnect = 0x2597, + HotfixMessage = 0x2596, + InitializeFactions = 0x2728, + InitialSetup = 0x2580, + InitWorldStates = 0x274b, + InspectResult = 0x262e, + InstanceEncounterChangePriority = 0x27b0, + InstanceEncounterDisengageUnit = 0x27af, + InstanceEncounterEnd = 0x27b8, + InstanceEncounterEngageUnit = 0x27ae, + InstanceEncounterGainCombatResurrectionCharge = 0x27ba, + InstanceEncounterInCombatResurrection = 0x27b9, + InstanceEncounterObjectiveComplete = 0x27b3, + InstanceEncounterObjectiveStart = 0x27b2, + InstanceEncounterObjectiveUpdate = 0x27b7, + InstanceEncounterPhaseShiftChanged = 0x27bb, + InstanceEncounterStart = 0x27b4, + InstanceEncounterTimerStart = 0x27b1, + InstanceEncounterUpdateAllowReleaseInProgress = 0x27b6, + InstanceEncounterUpdateSuppressRelease = 0x27b5, + InstanceGroupSizeChanged = 0x26fd, + InstanceInfo = 0x2631, + InstanceReset = 0x2684, + InstanceResetFailed = 0x2685, + InstanceSaveCreated = 0x277f, + InterruptPowerRegen = 0x2c59, + InvalidatePageText = 0x26d4, + InvalidatePlayer = 0x2fff, + InvalidPromotionCode = 0x2757, + InventoryChangeFailure = 0x2da5, + InventoryFixupComplete = 0x2816, + InventoryFullOverflow = 0x2827, + IslandsMissionNpc = 0x27fc, + IslandAzeriteGain = 0x2760, + IslandComplete = 0x2761, IsQuestCompleteResponse = 0x2a83, - ItemChanged = 0x2729, - ItemCooldown = 0x280d, - ItemEnchantTimeUpdate = 0x279b, - ItemExpirePurchaseRefund = 0x25b3, - ItemInteractionComplete = 0x28ce, - ItemPurchaseRefundResult = 0x25b1, - ItemPushResult = 0x263a, - ItemTimeUpdate = 0x279a, - KickReason = 0x26b8, + ItemChanged = 0x26ee, + ItemCooldown = 0x27c7, + ItemEnchantTimeUpdate = 0x2759, + ItemExpirePurchaseRefund = 0x25a3, + ItemInteractionComplete = 0x2886, + ItemPurchaseRefundResult = 0x25a1, + ItemPushResult = 0x2620, + ItemTimeUpdate = 0x2758, + KickReason = 0x2687, LearnedSpells = 0x2c4d, - LearnPvpTalentFailed = 0x25eb, - LearnTalentFailed = 0x25ea, - LegacyLootRules = 0x2876, - LevelLinkingResult = 0x28b7, - LevelUpInfo = 0x2728, + LearnPvpTalentFailed = 0x25d1, + LearnTalentFailed = 0x25d0, + LegacyLootRules = 0x282d, + LevelLinkingResult = 0x286c, + LevelUpInfo = 0x26ed, LfgBootPlayer = 0x2a35, LfgDisabled = 0x2a33, + LfgExpandSearchPrompt = 0x2a3b, LfgInstanceShutdownCountdown = 0x2a25, LfgJoinResult = 0x2a1c, LfgListApplicantListUpdate = 0x2a2b, @@ -1313,248 +1382,257 @@ namespace Framework.Constants LfGuildCommandResult = 0x29d0, LfGuildPost = 0x29cd, LfGuildRecruits = 0x29cf, - LiveRegionAccountRestoreResult = 0x27b8, - LiveRegionCharacterCopyResult = 0x27b6, - LiveRegionGetAccountCharacterListResult = 0x27ab, - LoadCufProfiles = 0x25cf, - LoadEquipmentSet = 0x2753, - LoginSetTimeSpeed = 0x2752, - LoginVerifyWorld = 0x25ae, - LogoutCancelAck = 0x26b4, - LogoutComplete = 0x26b3, - LogoutResponse = 0x26b2, - LogXpGain = 0x2724, - LootAllPassed = 0x2638, - LootList = 0x2787, - LootMoneyNotify = 0x2633, - LootRelease = 0x2632, - LootReleaseAll = 0x2631, - LootRemoved = 0x262d, - LootResponse = 0x262c, - LootRoll = 0x2635, - LootRollsComplete = 0x2637, - LootRollWon = 0x2639, - LossOfControlAuraUpdate = 0x269b, - MailCommandResult = 0x265b, - MailListResult = 0x279c, - MailQueryNextTimeResult = 0x279d, - MapObjectivesInit = 0x27a5, - MapObjEvents = 0x25da, - MasterLootCandidateList = 0x2636, + LiveRegionAccountRestoreResult = 0x2771, + LiveRegionCharacterCopyResult = 0x2770, + LiveRegionGetAccountCharacterListResult = 0x2765, + LiveRegionKeyBindingsCopyResult = 0x2772, + LoadCufProfiles = 0x25bd, + LoadEquipmentSet = 0x2713, + LoginSetTimeSpeed = 0x2712, + LoginVerifyWorld = 0x259e, + LogoutCancelAck = 0x2683, + LogoutComplete = 0x2682, + LogoutResponse = 0x2681, + LogXpGain = 0x26e9, + LootAllPassed = 0x261e, + LootList = 0x2745, + LootMoneyNotify = 0x2619, + LootRelease = 0x2618, + LootReleaseAll = 0x2617, + LootRemoved = 0x2613, + LootResponse = 0x2612, + LootRoll = 0x261b, + LootRollsComplete = 0x261d, + LootRollWon = 0x261f, + LossOfControlAuraUpdate = 0x266c, + MailCommandResult = 0x2638, + MailListResult = 0x275a, + MailQueryNextTimeResult = 0x275b, + MapObjectivesInit = 0x294a, + MapObjEvents = 0x25c6, + MasterLootCandidateList = 0x261c, MessageBox = 0x2576, - MinimapPing = 0x2701, + MinimapPing = 0x26cb, MirrorImageComponentedData = 0x2c14, MirrorImageCreatureData = 0x2c13, - MissileCancel = 0x25db, - ModifyCooldown = 0x27ad, + MissileCancel = 0x25c7, + ModifyCooldown = 0x2767, Motd = 0x2baf, MountResult = 0x257b, - MovementEnforcementAlert = 0x28a5, - MoveApplyMovementForce = 0x2de1, - MoveDisableCollision = 0x2ddd, - MoveDisableDoubleJump = 0x2dcb, - MoveDisableGravity = 0x2ddb, - MoveDisableTransitionBetweenSwimAndFly = 0x2dda, - MoveEnableCollision = 0x2dde, - MoveEnableDoubleJump = 0x2dca, - MoveEnableGravity = 0x2ddc, - MoveEnableTransitionBetweenSwimAndFly = 0x2dd9, - MoveKnockBack = 0x2dd1, - MoveRemoveMovementForce = 0x2de2, - MoveRoot = 0x2dc7, - MoveSetActiveMover = 0x2da3, - MoveSetCanFly = 0x2dd3, - MoveSetCanTurnWhileFalling = 0x2dd5, - MoveSetCollisionHeight = 0x2ddf, - MoveSetCompoundState = 0x2de3, - MoveSetFeatherFall = 0x2dcd, - MoveSetFlightBackSpeed = 0x2dc3, - MoveSetFlightSpeed = 0x2dc2, - MoveSetHovering = 0x2dcf, - MoveSetIgnoreMovementForces = 0x2dd7, - MoveSetLandWalk = 0x2dcc, - MoveSetModMovementForceMagnitude = 0x2db4, - MoveSetNormalFall = 0x2dce, - MoveSetPitchRate = 0x2dc6, - MoveSetRunBackSpeed = 0x2dbf, - MoveSetRunSpeed = 0x2dbe, - MoveSetSwimBackSpeed = 0x2dc1, - MoveSetSwimSpeed = 0x2dc0, - MoveSetTurnRate = 0x2dc5, - MoveSetVehicleRecId = 0x2de0, - MoveSetWalkSpeed = 0x2dc4, - MoveSetWaterWalk = 0x2dc9, - MoveSkipTime = 0x2de4, - MoveSplineDisableCollision = 0x2de9, - MoveSplineDisableGravity = 0x2de7, - MoveSplineEnableCollision = 0x2dea, - MoveSplineEnableGravity = 0x2de8, - MoveSplineRoot = 0x2de5, - MoveSplineSetFeatherFall = 0x2deb, - MoveSplineSetFlightBackSpeed = 0x2dba, - MoveSplineSetFlightSpeed = 0x2db9, - MoveSplineSetFlying = 0x2df5, - MoveSplineSetHover = 0x2ded, - MoveSplineSetLandWalk = 0x2df0, - MoveSplineSetNormalFall = 0x2dec, - MoveSplineSetPitchRate = 0x2dbd, - MoveSplineSetRunBackSpeed = 0x2db6, - MoveSplineSetRunMode = 0x2df3, - MoveSplineSetRunSpeed = 0x2db5, - MoveSplineSetSwimBackSpeed = 0x2db8, - MoveSplineSetSwimSpeed = 0x2db7, - MoveSplineSetTurnRate = 0x2dbc, - MoveSplineSetWalkMode = 0x2df4, - MoveSplineSetWalkSpeed = 0x2dbb, - MoveSplineSetWaterWalk = 0x2def, - MoveSplineStartSwim = 0x2df1, - MoveSplineStopSwim = 0x2df2, - MoveSplineUnroot = 0x2de6, - MoveSplineUnsetFlying = 0x2df6, - MoveSplineUnsetHover = 0x2dee, - MoveTeleport = 0x2dd2, - MoveUnroot = 0x2dc8, - MoveUnsetCanFly = 0x2dd4, - MoveUnsetCanTurnWhileFalling = 0x2dd6, - MoveUnsetHovering = 0x2dd0, - MoveUnsetIgnoreMovementForces = 0x2dd8, - MoveUpdate = 0x2dae, - MoveUpdateApplyMovementForce = 0x2db2, - MoveUpdateCollisionHeight = 0x2dad, - MoveUpdateFlightBackSpeed = 0x2daa, - MoveUpdateFlightSpeed = 0x2da9, - MoveUpdateKnockBack = 0x2db0, - MoveUpdateModMovementForceMagnitude = 0x2db1, - MoveUpdatePitchRate = 0x2dac, - MoveUpdateRemoveMovementForce = 0x2db3, - MoveUpdateRunBackSpeed = 0x2da5, - MoveUpdateRunSpeed = 0x2da4, - MoveUpdateSwimBackSpeed = 0x2da8, - MoveUpdateSwimSpeed = 0x2da7, - MoveUpdateTeleport = 0x2daf, - MoveUpdateTurnRate = 0x2dab, - MoveUpdateWalkSpeed = 0x2da6, - MythicPlusAllMapStats = 0x2624, - MythicPlusCurrentAffixes = 0x2625, - MythicPlusNewSeasonRecord = 0x2629, - MythicPlusNewWeekRecord = 0x2628, - MythicPlusWeeklyRewardResponse = 0x2623, - NeutralPlayerFactionSelectResult = 0x25f3, - NewTaxiPath = 0x26ad, - NewWorld = 0x25ad, + MovementEnforcementAlert = 0x285c, + MoveApplyMovementForce = 0x2e13, + MoveDisableCollision = 0x2e0f, + MoveDisableDoubleJump = 0x2dfd, + MoveDisableGravity = 0x2e0d, + MoveDisableTransitionBetweenSwimAndFly = 0x2e0c, + MoveEnableCollision = 0x2e10, + MoveEnableDoubleJump = 0x2dfc, + MoveEnableGravity = 0x2e0e, + MoveEnableTransitionBetweenSwimAndFly = 0x2e0b, + MoveKnockBack = 0x2e03, + MoveRemoveMovementForce = 0x2e14, + MoveRoot = 0x2df9, + MoveSetActiveMover = 0x2dd5, + MoveSetCanFly = 0x2e05, + MoveSetCanTurnWhileFalling = 0x2e07, + MoveSetCollisionHeight = 0x2e11, + MoveSetCompoundState = 0x2e15, + MoveSetFeatherFall = 0x2dff, + MoveSetFlightBackSpeed = 0x2df5, + MoveSetFlightSpeed = 0x2df4, + MoveSetHovering = 0x2e01, + MoveSetIgnoreMovementForces = 0x2e09, + MoveSetLandWalk = 0x2dfe, + MoveSetModMovementForceMagnitude = 0x2de6, + MoveSetNormalFall = 0x2e00, + MoveSetPitchRate = 0x2df8, + MoveSetRunBackSpeed = 0x2df1, + MoveSetRunSpeed = 0x2df0, + MoveSetSwimBackSpeed = 0x2df3, + MoveSetSwimSpeed = 0x2df2, + MoveSetTurnRate = 0x2df7, + MoveSetVehicleRecId = 0x2e12, + MoveSetWalkSpeed = 0x2df6, + MoveSetWaterWalk = 0x2dfb, + MoveSkipTime = 0x2e16, + MoveSplineDisableCollision = 0x2e1b, + MoveSplineDisableGravity = 0x2e19, + MoveSplineEnableCollision = 0x2e1c, + MoveSplineEnableGravity = 0x2e1a, + MoveSplineRoot = 0x2e17, + MoveSplineSetFeatherFall = 0x2e1d, + MoveSplineSetFlightBackSpeed = 0x2dec, + MoveSplineSetFlightSpeed = 0x2deb, + MoveSplineSetFlying = 0x2e27, + MoveSplineSetHover = 0x2e1f, + MoveSplineSetLandWalk = 0x2e22, + MoveSplineSetNormalFall = 0x2e1e, + MoveSplineSetPitchRate = 0x2def, + MoveSplineSetRunBackSpeed = 0x2de8, + MoveSplineSetRunMode = 0x2e25, + MoveSplineSetRunSpeed = 0x2de7, + MoveSplineSetSwimBackSpeed = 0x2dea, + MoveSplineSetSwimSpeed = 0x2de9, + MoveSplineSetTurnRate = 0x2dee, + MoveSplineSetWalkMode = 0x2e26, + MoveSplineSetWalkSpeed = 0x2ded, + MoveSplineSetWaterWalk = 0x2e21, + MoveSplineStartSwim = 0x2e23, + MoveSplineStopSwim = 0x2e24, + MoveSplineUnroot = 0x2e18, + MoveSplineUnsetFlying = 0x2e28, + MoveSplineUnsetHover = 0x2e20, + MoveTeleport = 0x2e04, + MoveUnroot = 0x2dfa, + MoveUnsetCanFly = 0x2e06, + MoveUnsetCanTurnWhileFalling = 0x2e08, + MoveUnsetHovering = 0x2e02, + MoveUnsetIgnoreMovementForces = 0x2e0a, + MoveUpdate = 0x2de0, + MoveUpdateApplyMovementForce = 0x2de4, + MoveUpdateCollisionHeight = 0x2ddf, + MoveUpdateFlightBackSpeed = 0x2ddc, + MoveUpdateFlightSpeed = 0x2ddb, + MoveUpdateKnockBack = 0x2de2, + MoveUpdateModMovementForceMagnitude = 0x2de3, + MoveUpdatePitchRate = 0x2dde, + MoveUpdateRemoveMovementForce = 0x2de5, + MoveUpdateRunBackSpeed = 0x2dd7, + MoveUpdateRunSpeed = 0x2dd6, + MoveUpdateSwimBackSpeed = 0x2dda, + MoveUpdateSwimSpeed = 0x2dd9, + MoveUpdateTeleport = 0x2de1, + MoveUpdateTurnRate = 0x2ddd, + MoveUpdateWalkSpeed = 0x2dd8, + MultiFloorLeaveFloor = 0x27e1, + MultiFloorNewFloor = 0x27e0, + MythicPlusAllMapStats = 0x2609, + MythicPlusCurrentAffixes = 0x260b, + MythicPlusNewSeasonRecord = 0x260f, + MythicPlusNewWeekRecord = 0x260e, + MythicPlusSeasonData = 0x260a, + MythicPlusWeeklyRewardResponse = 0x2608, + NeutralPlayerFactionSelectResult = 0x25d8, + NewTaxiPath = 0x267c, + NewWorld = 0x259d, NotifyDestLocSpellCast = 0x2c43, - NotifyMissileTrajectoryCollision = 0x26d9, - NotifyMoney = 0x25b0, - NotifyReceivedMail = 0x265c, - OfferPetitionError = 0x26e9, - OnCancelExpectedRideVehicleAura = 0x2725, - OnMonsterMove = 0x2da2, - OpenArtifactForge = 0x27e8, - OpenContainer = 0x2768, - OpenHeartForge = 0x2873, + NotifyMissileTrajectoryCollision = 0x26a8, + NotifyMoney = 0x25a0, + NotifyReceivedMail = 0x2639, + OfferPetitionError = 0x26b3, + OnCancelExpectedRideVehicleAura = 0x26ea, + OnMonsterMove = 0x2dd4, + OpenAnimaDiversionUi = 0x2720, + OpenArtifactForge = 0x27a2, + OpenContainer = 0x2da6, + OpenHeartForge = 0x282a, + OpenItemForge = 0x27a0, OpenLfgDungeonFinder = 0x2a31, - OpenShipmentNpcFromGossip = 0x27e0, - OpenShipmentNpcResult = 0x27e2, - OverrideLight = 0x26ef, - PageText = 0x275e, - PartyCommandResult = 0x27dd, - PartyInvite = 0x25d0, - PartyKillLog = 0x27a1, - PartyMemberFullState = 0x279f, - PartyMemberPartialState = 0x279e, - PartyNotifyLfgLeaderChange = 0x28cf, - PartyUpdate = 0x260d, - PauseMirrorTimer = 0x2755, - PendingRaidLock = 0x2736, - PetitionAlreadySigned = 0x25b9, + OpenShipmentNpcFromGossip = 0x2798, + OpenShipmentNpcResult = 0x279a, + OverrideLight = 0x26b9, + PageText = 0x271e, + PartyCommandResult = 0x2795, + PartyInvite = 0x25be, + PartyKillLog = 0x275e, + PartyMemberFullState = 0x275d, + PartyMemberPartialState = 0x275c, + PartyNotifyLfgLeaderChange = 0x288c, + PartyUpdate = 0x25f2, + PauseMirrorTimer = 0x2715, + PendingRaidLock = 0x26fb, + PetitionAlreadySigned = 0x25a6, PetitionRenameGuildResponse = 0x29fa, - PetitionShowList = 0x26f2, - PetitionShowSignatures = 0x26f3, - PetitionSignResults = 0x2793, - PetActionFeedback = 0x2790, - PetActionSound = 0x26cf, - PetAdded = 0x25aa, - PetBattleChatRestricted = 0x261a, - PetBattleDebugQueueDumpResponse = 0x26a2, - PetBattleFinalizeLocation = 0x2613, - PetBattleFinalRound = 0x2618, - PetBattleFinished = 0x2619, - PetBattleFirstRound = 0x2615, - PetBattleInitialUpdate = 0x2614, - PetBattleMaxGameLengthWarning = 0x261b, - PetBattlePvpChallenge = 0x2612, - PetBattleQueueProposeMatch = 0x2659, - PetBattleQueueStatus = 0x265a, - PetBattleReplacementsMade = 0x2617, - PetBattleRequestFailed = 0x2611, - PetBattleRoundResult = 0x2616, - PetBattleSlotUpdates = 0x2604, - PetCastFailed = 0x2c57, + PetitionShowList = 0x26bc, + PetitionShowSignatures = 0x26bd, + PetitionSignResults = 0x2750, + PetActionFeedback = 0x274d, + PetActionSound = 0x269e, + PetAdded = 0x259a, + PetBattleChatRestricted = 0x25ff, + PetBattleDebugQueueDumpResponse = 0x2673, + PetBattleFinalizeLocation = 0x25f8, + PetBattleFinalRound = 0x25fd, + PetBattleFinished = 0x25fe, + PetBattleFirstRound = 0x25fa, + PetBattleInitialUpdate = 0x25f9, + PetBattleMaxGameLengthWarning = 0x2600, + PetBattlePvpChallenge = 0x25f7, + PetBattleQueueProposeMatch = 0x2636, + PetBattleQueueStatus = 0x2637, + PetBattleReplacementsMade = 0x25fc, + PetBattleRequestFailed = 0x25f6, + PetBattleRoundResult = 0x25fb, + PetBattleSlotUpdates = 0x25e9, + PetCastFailed = 0x2c58, PetClearSpells = 0x2c24, - PetDismissSound = 0x26d0, - PetGodMode = 0x26aa, - PetGuids = 0x2747, + PetDismissSound = 0x269f, + PetGodMode = 0x2679, + PetGuids = 0x2707, PetLearnedSpells = 0x2c4f, PetMode = 0x258b, - PetNameInvalid = 0x26f7, + PetNameInvalid = 0x26c1, PetNewlyTamed = 0x2589, PetSlotUpdated = 0x258a, PetSpellsMessage = 0x2c25, - PetStableList = 0x25ab, - PetStableResult = 0x25ac, - PetTameFailure = 0x26e6, + PetStableList = 0x259b, + PetStableResult = 0x259c, + PetTameFailure = 0x26b0, PetUnlearnedSpells = 0x2c50, PhaseShiftChange = 0x2578, - PlayedTime = 0x2713, - PlayerAzeriteItemEquippedStatusChanged = 0x2871, - PlayerAzeriteItemGains = 0x2870, - PlayerBonusRollFailed = 0x2877, - PlayerBound = 0x257e, - PlayerConditionResult = 0x2843, - PlayerIsAdventureMapPoiValid = 0x2842, + PlayedTime = 0x26da, + PlayerAzeriteItemEquippedStatusChanged = 0x3015, + PlayerAzeriteItemGains = 0x3014, + PlayerBonusRollFailed = 0x3017, + PlayerBound = 0x2ff8, + PlayerChoiceClear = 0x2ffe, + PlayerChoiceDisplayError = 0x2ffd, + PlayerConditionResult = 0x300b, + PlayerIsAdventureMapPoiValid = 0x300a, + PlayerOpenSubscriptionInterstitial = 0x300f, PlayerSaveGuildEmblem = 0x29f9, - PlayerSkinned = 0x278c, - PlayerTabardVendorActivate = 0x27a0, - PlayerTutorialHighlightSpell = 0x2847, - PlayerTutorialUnhighlightSpell = 0x2846, - PlayMusic = 0x27b2, - PlayObjectSound = 0x27b3, - PlayOneShotAnimKit = 0x2776, + PlayerSkinned = 0x3007, + PlayerTabardVendorActivate = 0x3008, + PlayerTutorialHighlightSpell = 0x300e, + PlayerTutorialUnhighlightSpell = 0x300d, + PlayMusic = 0x276c, + PlayObjectSound = 0x276d, + PlayOneShotAnimKit = 0x2735, PlayOrphanSpellVisual = 0x2c47, - PlayScene = 0x2656, - PlaySound = 0x27b1, - PlaySpeakerbotSound = 0x27b4, + PlayScene = 0x2633, + PlaySound = 0x276b, + PlaySpeakerbotSound = 0x276e, PlaySpellVisual = 0x2c45, PlaySpellVisualKit = 0x2c49, - PlayTimeWarning = 0x2740, + PlayTimeWarning = 0x2701, Pong = 0x304e, - PowerUpdate = 0x2707, + PowerUpdate = 0x26d1, PreloadChildMap = 0x2579, - PrepopulateNameCache = 0x28aa, - PreRessurect = 0x27b0, - PrintNotification = 0x25e2, - ProcResist = 0x27a2, + PrepopulateNameCache = 0x285f, + PreRessurect = 0x276a, + PrintNotification = 0x25c9, + ProcResist = 0x275f, PushSpellToActionBar = 0x2c51, - PvpCredit = 0x271f, - PvpMatchComplete = 0x28a7, - PvpMatchInitialize = 0x28ac, - PvpMatchStart = 0x28a6, - PvpMatchStatistics = 0x25b4, - PvpOptionsEnabled = 0x25b7, - QueryBattlePetNameResponse = 0x270e, - QueryCommunityNameResponse = 0x270a, - QueryCreatureResponse = 0x2704, - QueryGameObjectResponse = 0x2705, - QueryGarrisonCreatureNameResponse = 0x292b, + PvpCredit = 0x2944, + PvpMatchComplete = 0x294e, + PvpMatchInitialize = 0x294f, + PvpMatchStart = 0x294d, + PvpMatchStatistics = 0x2931, + PvpOptionsEnabled = 0x2933, + QueryBattlePetNameResponse = 0x26d6, + QueryCreatureResponse = 0x26ce, + QueryGameObjectResponse = 0x26cf, + QueryGarrisonPetNameResponse = 0x2994, QueryGuildInfoResponse = 0x29e5, - QueryItemTextResponse = 0x280c, - QueryNpcTextResponse = 0x2708, - QueryPageTextResponse = 0x270b, - QueryPetitionResponse = 0x270f, - QueryPetNameResponse = 0x270d, - QueryPlayerNameResponse = 0x2709, + QueryItemTextResponse = 0x27c6, + QueryNpcTextResponse = 0x26d2, + QueryPageTextResponse = 0x26d3, + QueryPetitionResponse = 0x26d7, + QueryPetNameResponse = 0x26d5, + QueryPlayerNameByCommunityIdResponse = 0x3003, + QueryPlayerNameResponse = 0x3002, QueryQuestInfoResponse = 0x2a95, - QueryTimeResponse = 0x2723, + QueryTimeResponse = 0x26e8, QuestCompletionNpcResponse = 0x2a81, QuestConfirmAccept = 0x2a8e, QuestForceRemoved = 0x2a9b, @@ -1567,16 +1645,14 @@ namespace Framework.Constants QuestGiverRequestItems = 0x2a92, QuestGiverStatus = 0x2a9a, QuestGiverStatusMultiple = 0x2a90, - QuestLinesForMapResponse = 0x2aa1, QuestLogFull = 0x2a86, - QuestPoiChanged = 0x2a9f, QuestPoiQueryResponse = 0x2a9c, + QuestPoiUpdateResponse = 0x2a9e, QuestPushResult = 0x2a8f, - QuestSessionInfoResponse = 0x28ca, - QuestSessionReadyCheck = 0x28bb, - QuestSessionReadyCheckResponse = 0x28bc, - QuestSessionResult = 0x28ba, - QuestSpawnTrackingUpdate = 0x2a9e, + QuestSessionInfoResponse = 0x2882, + QuestSessionReadyCheck = 0x2870, + QuestSessionReadyCheckResponse = 0x2871, + QuestSessionResult = 0x286f, QuestUpdateAddCredit = 0x2a8b, QuestUpdateAddCreditSimple = 0x2a8c, QuestUpdateAddPvpCredit = 0x2a8d, @@ -1584,119 +1660,125 @@ namespace Framework.Constants QuestUpdateCompleteBySpell = 0x2a87, QuestUpdateFailed = 0x2a89, QuestUpdateFailedTimer = 0x2a8a, - QueueSummaryUpdate = 0x2859, - RafAccountInfo = 0x28b8, - RafActivityStateChanged = 0x28c6, - RaidDifficultySet = 0x27f1, - RaidGroupOnly = 0x27f3, + QueueSummaryUpdate = 0x2815, + RafAccountInfo = 0x286d, + RafActivityStateChanged = 0x287e, + RaidDifficultySet = 0x27ab, + RaidGroupOnly = 0x27ad, RaidInstanceMessage = 0x2bb4, - RaidMarkersChanged = 0x25ba, - RandomRoll = 0x2650, - RatedPvpInfo = 0x25a8, - ReadyCheckCompleted = 0x2610, - ReadyCheckResponse = 0x260f, - ReadyCheckStarted = 0x260e, - ReadItemResultFailed = 0x27ed, - ReadItemResultOk = 0x27e7, - RealmLookupInfo = 0x2812, - RealmQueryResponse = 0x26ee, - ReattachResurrect = 0x2792, - RecruitAFriendFailure = 0x26f4, - RefreshComponent = 0x267c, + RaidMarkersChanged = 0x25a7, + RandomRoll = 0x262d, + RatedPvpInfo = 0x2930, + ReadyCheckCompleted = 0x25f5, + ReadyCheckResponse = 0x25f4, + ReadyCheckStarted = 0x25f3, + ReadItemResultFailed = 0x27a7, + ReadItemResultOk = 0x279f, + RealmLookupInfo = 0x27cc, + RealmQueryResponse = 0x26b8, + ReattachResurrect = 0x274f, + RecruitAFriendFailure = 0x26be, + RefreshComponent = 0x264d, RefreshSpellHistory = 0x2c2c, - RemoveItemPassive = 0x25c1, - RemoveLossOfControl = 0x269d, - ReplaceTrophyResponse = 0x2809, - ReportPvpPlayerAfkResult = 0x26e2, - RequestCemeteryListResponse = 0x259f, - RequestPvpRewardsResponse = 0x25d5, - RequestScheduledPvpInfoResponse = 0x25d6, + RemoveItemPassive = 0x25ae, + RemoveLossOfControl = 0x266e, + RemoveSpellFromActionBar = 0x2c52, + ReplaceTrophyResponse = 0x27c3, + ReportPvpPlayerAfkResult = 0x3001, + RequestCemeteryListResponse = 0x2591, + RequestPvpRewardsResponse = 0x2934, + RequestScheduledPvpInfoResponse = 0x2935, ResearchComplete = 0x2587, ResetCompressionContext = 0x304f, - ResetFailedNotify = 0x26ea, - ResetRangedCombatTimer = 0x271c, + ResetFailedNotify = 0x26b4, + ResetQuestPoi = 0x2a9f, + ResetRangedCombatTimer = 0x2943, ResetWeeklyCurrency = 0x2575, - RespecWipeConfirm = 0x262a, + RespecWipeConfirm = 0x2610, RespondInspectAchievements = 0x2572, - RestrictedAccountWarning = 0x25cc, + RestrictedAccountWarning = 0x25ba, ResumeCast = 0x2c3b, ResumeCastBar = 0x2c3e, ResumeComms = 0x304b, - ResumeToken = 0x25bf, - ResurrectRequest = 0x257f, - ResyncRunes = 0x2743, - ReturnApplicantList = 0x28ae, - ReturnRecruitingClubs = 0x28ad, - RoleChangedInform = 0x258e, + ResumeToken = 0x25ac, + ResurrectRequest = 0x257e, + ResyncRunes = 0x2c5f, + ReturnApplicantList = 0x2863, + ReturnRecruitingClubs = 0x2862, + RoleChangedInform = 0x258d, RoleChosen = 0x2a39, - RolePollInform = 0x258f, - RuneRegenDebug = 0x25c9, - ScenarioCompleted = 0x282f, - ScenarioPois = 0x2653, - ScenarioProgressUpdate = 0x264c, - ScenarioShowCriteria = 0x2841, - ScenarioState = 0x264b, - ScenarioUiUpdate = 0x2840, - ScenarioVacate = 0x27ee, - SceneObjectEvent = 0x25f9, - SceneObjectPetBattleFinalRound = 0x25fe, - SceneObjectPetBattleFinished = 0x25ff, - SceneObjectPetBattleFirstRound = 0x25fb, - SceneObjectPetBattleInitialUpdate = 0x25fa, - SceneObjectPetBattleReplacementsMade = 0x25fd, - SceneObjectPetBattleRoundResult = 0x25fc, - ScriptCast = 0x2c55, - SeasonInfo = 0x25d4, - SellResponse = 0x26f8, - SendItemPassives = 0x25c2, + RolePollInform = 0x258e, + RuneforgeLegendaryCraftingOpenNpc = 0x2801, + RuneRegenDebug = 0x25b7, + ScenarioCompleted = 0x27ee, + ScenarioPois = 0x2630, + ScenarioProgressUpdate = 0x2629, + ScenarioShowCriteria = 0x2804, + ScenarioState = 0x2628, + ScenarioUiUpdate = 0x2803, + ScenarioVacate = 0x27a8, + SceneObjectEvent = 0x25de, + SceneObjectPetBattleFinalRound = 0x25e3, + SceneObjectPetBattleFinished = 0x25e4, + SceneObjectPetBattleFirstRound = 0x25e0, + SceneObjectPetBattleInitialUpdate = 0x25df, + SceneObjectPetBattleReplacementsMade = 0x25e2, + SceneObjectPetBattleRoundResult = 0x25e1, + ScriptCast = 0x2c56, + SeasonInfo = 0x25c2, + SellResponse = 0x26c2, + SendItemPassives = 0x25af, SendKnownSpells = 0x2c2a, - SendRaidTargetUpdateAll = 0x264e, - SendRaidTargetUpdateSingle = 0x264f, + SendRaidTargetUpdateAll = 0x262b, + SendRaidTargetUpdateSingle = 0x262c, SendSpellCharges = 0x2c2d, SendSpellHistory = 0x2c2b, SendUnlearnSpells = 0x2c2e, - ServerFirstAchievements = 0x266d, - ServerTime = 0x26b1, - ServerTimeOffset = 0x2759, + ServerFirstAchievements = 0x264a, + ServerTime = 0x2680, + ServerTimeOffset = 0x2719, SetupCurrency = 0x2573, SetupResearchHistory = 0x2586, - SetAiAnimKit = 0x2775, - SetAllTaskProgress = 0x27d7, - SetAnimTier = 0x2779, - SetChrUpgradeTier = 0x25f6, + SetAiAnimKit = 0x2734, + SetAllTaskProgress = 0x278f, + SetAnimTier = 0x2738, + SetChrUpgradeTier = 0x25db, SetCurrency = 0x2574, SetDfFastLaunchResult = 0x2a2e, - SetDungeonDifficulty = 0x26d3, - SetFactionAtWar = 0x2742, - SetFactionNotVisible = 0x2770, - SetFactionStanding = 0x2771, - SetFactionVisible = 0x276f, + SetDungeonDifficulty = 0x26a2, + SetFactionAtWar = 0x2703, + SetFactionNotVisible = 0x272f, + SetFactionStanding = 0x2730, + SetFactionVisible = 0x272e, SetFlatSpellModifier = 0x2c36, - SetForcedReactions = 0x2761, - SetItemPurchaseData = 0x25b2, - SetLootMethodFailed = 0x2818, - SetMaxWeeklyQuantity = 0x25b8, - SetMeleeAnimKit = 0x2778, - SetMovementAnimKit = 0x2777, + SetForcedReactions = 0x2722, + SetItemPurchaseData = 0x25a2, + SetLootMethodFailed = 0x27d2, + SetMaxWeeklyQuantity = 0x25a5, + SetMeleeAnimKit = 0x2737, + SetMovementAnimKit = 0x2736, SetPctSpellModifier = 0x2c37, - SetPetSpecialization = 0x2645, - SetPlayerDeclinedNamesResult = 0x2712, - SetPlayHoverAnim = 0x25cd, - SetProficiency = 0x277a, - SetQuestReplayCooldownOverride = 0x28be, + SetPetSpecialization = 0x2622, + SetPlayerDeclinedNamesResult = 0x3004, + SetPlayHoverAnim = 0x25bb, + SetProficiency = 0x2739, + SetQuestReplayCooldownOverride = 0x2876, + SetShipmentReadyResponse = 0x298d, SetSpellCharges = 0x2c29, - SetTaskComplete = 0x27d8, - SetTimeZoneInformation = 0x26a5, - SetVehicleRecId = 0x2735, - ShowBank = 0x26ae, - ShowMailbox = 0x27ef, - ShowNeutralPlayerFactionSelectUi = 0x25f2, - ShowTaxiNodes = 0x2700, - ShowTradeSkillResponse = 0x27b9, - SocketGemsFailure = 0x276d, - SocketGemsSuccess = 0x276c, - SpecialMountAnim = 0x26ce, - SpecInvoluntarilyChanged = 0x275d, + SetTaskComplete = 0x2790, + SetTimeZoneInformation = 0x2675, + SetVehicleRecId = 0x26fa, + ShipmentFactionUpdateResult = 0x298e, + ShowBank = 0x267d, + ShowMailbox = 0x27a9, + ShowNeutralPlayerFactionSelectUi = 0x25d7, + ShowQuestCompletionText = 0x2a94, + ShowTaxiNodes = 0x26ca, + ShowTradeSkillResponse = 0x2773, + SocketGemsFailure = 0x272c, + SocketGemsSuccess = 0x272b, + SpecialMountAnim = 0x269d, + SpecInvoluntarilyChanged = 0x271d, SpellAbsorbLog = 0x2c1f, SpellCategoryCooldown = 0x2c17, SpellChannelStart = 0x2c34, @@ -1707,9 +1789,9 @@ namespace Framework.Constants SpellDispellLog = 0x2c1a, SpellEnergizeLog = 0x2c1c, SpellExecuteLog = 0x2c40, - SpellFailedOther = 0x2c54, - SpellFailure = 0x2c52, - SpellFailureMessage = 0x2c59, + SpellFailedOther = 0x2c55, + SpellFailure = 0x2c53, + SpellFailureMessage = 0x2c5a, SpellGo = 0x2c39, SpellHealAbsorbLog = 0x2c1e, SpellHealLog = 0x2c1d, @@ -1721,116 +1803,122 @@ namespace Framework.Constants SpellPeriodicAuraLog = 0x2c1b, SpellPrepare = 0x2c38, SpellStart = 0x2c3a, - SpellVisualLoadScreen = 0x25e5, - SpiritHealerConfirm = 0x275a, - StandStateUpdate = 0x2760, - StartElapsedTimer = 0x261c, - StartElapsedTimers = 0x261e, - StartLightningStorm = 0x26d6, - StartLootRoll = 0x2634, - StartMirrorTimer = 0x2754, - StartTimer = 0x25bc, - StopElapsedTimer = 0x261d, - StopMirrorTimer = 0x2756, - StopSpeakerbotSound = 0x27b5, - StreamingMovies = 0x25bb, - SummonCancel = 0x26e1, - SummonRaidMemberValidateFailed = 0x2590, - SummonRequest = 0x2765, + SpellVisualLoadScreen = 0x25cb, + SpiritHealerConfirm = 0x271a, + SplashScreenShowLatest = 0x2888, + StandStateUpdate = 0x2721, + StartElapsedTimer = 0x2601, + StartElapsedTimers = 0x2603, + StartLightningStorm = 0x26a5, + StartLootRoll = 0x261a, + StartMirrorTimer = 0x2714, + StartTimer = 0x25a9, + StopElapsedTimer = 0x2602, + StopMirrorTimer = 0x2716, + StopSpeakerbotSound = 0x276f, + StreamingMovies = 0x25a8, + SummonCancel = 0x26ae, + SummonRaidMemberValidateFailed = 0x258f, + SummonRequest = 0x2726, SupercededSpells = 0x2c4c, SuspendComms = 0x304a, - SuspendToken = 0x25be, - SyncWowEntitlements = 0x28c8, - TalentsInvoluntarilyReset = 0x275c, - TaxiNodeStatus = 0x26ab, - TextEmote = 0x26a9, - ThreatClear = 0x271a, - ThreatRemove = 0x2719, - ThreatUpdate = 0x2718, - TimeAdjustment = 0x2da1, - TimeSyncRequest = 0x2da0, - TitleEarned = 0x2715, - TitleLost = 0x2716, - TotemCreated = 0x26fb, - TotemDurationChanged = 0x26fc, - TotemMoved = 0x26fd, - TradeStatus = 0x2583, - TradeUpdated = 0x2582, - TrainerBuyFailed = 0x271e, - TrainerList = 0x271d, - TransferAborted = 0x2746, - TransferPending = 0x25e6, - TransmogrifyNpc = 0x283a, - TreasurePickerResponse = 0x284d, - TriggerCinematic = 0x2810, - TriggerMovie = 0x26fe, - TurnInPetitionResult = 0x2795, - TutorialFlags = 0x2802, - TwitterStatus = 0x2ffd, - UiHealingRangeModified = 0x278a, - UiItemInteractionNpc = 0x283c, - UndeleteCharacterResponse = 0x2813, - UndeleteCooldownStatusResponse = 0x2814, + SuspendToken = 0x25ab, + SyncWowEntitlements = 0x2880, + TalentsInvoluntarilyReset = 0x271c, + TaxiNodeStatus = 0x267a, + TextEmote = 0x2678, + ThreatClear = 0x26e1, + ThreatRemove = 0x26e0, + ThreatUpdate = 0x26df, + TimeAdjustment = 0x2dd3, + TimeSyncRequest = 0x2dd2, + TitleEarned = 0x26dc, + TitleLost = 0x26dd, + TotemCreated = 0x26c5, + TotemDurationChanged = 0x26c6, + TotemMoved = 0x26c7, + TradeStatus = 0x2582, + TradeUpdated = 0x2581, + TrainerBuyFailed = 0x26e4, + TrainerList = 0x26e3, + TransferAborted = 0x2706, + TransferPending = 0x25cc, + TransmogrifyNpc = 0x27f9, + TreasurePickerResponse = 0x280b, + TriggerCinematic = 0x27ca, + TriggerMovie = 0x26c8, + TurnInPetitionResult = 0x2752, + TutorialFlags = 0x27bc, + TwitterStatus = 0x3043, + UiHealingRangeModified = 0x2748, + UiItemInteractionNpc = 0x27fb, + UiMapQuestLinesResponse = 0x2aa1, + UndeleteCharacterResponse = 0x27cd, + UndeleteCooldownStatusResponse = 0x27ce, UnlearnedSpells = 0x2c4e, UnloadChildMap = 0x257a, - UpdateAccountData = 0x274e, - UpdateActionButtons = 0x25f7, - UpdateBnetSessionKey = 0x286a, - UpdateCapturePoint = 0x2598, - UpdateCelestialBody = 0x2866, - UpdateCharacterFlags = 0x2808, - UpdateChargeCategoryCooldown = 0x27af, - UpdateCooldown = 0x27ae, - UpdateExpansionLevel = 0x2666, - UpdateGameTimeState = 0x286d, - UpdateInstanceOwnership = 0x26d8, - UpdateLastInstance = 0x26b7, - UpdateObject = 0x2811, - UpdatePrimarySpec = 0x25ee, - UpdateTalentData = 0x25ed, - UpdateTaskProgress = 0x27d6, + UpdateAccountData = 0x270e, + UpdateActionButtons = 0x25dc, + UpdateBnetSessionKey = 0x2826, + UpdateCapturePoint = 0x2929, + UpdateCelestialBody = 0x2822, + UpdateCharacterFlags = 0x27c2, + UpdateChargeCategoryCooldown = 0x2769, + UpdateCooldown = 0x2768, + UpdateDailyMissionCounter = 0x2975, + UpdateExpansionLevel = 0x2643, + UpdateGameTimeState = 0x2829, + UpdateInstanceOwnership = 0x26a7, + UpdateLastInstance = 0x2686, + UpdateObject = 0x27cb, + UpdatePrimarySpec = 0x25d4, + UpdateTalentData = 0x25d3, + UpdateTaskProgress = 0x278e, UpdateWeeklySpellUsage = 0x2c19, - UpdateWorldState = 0x278f, + UpdateWorldState = 0x274c, UserlistAdd = 0x2bb9, UserlistRemove = 0x2bba, UserlistUpdate = 0x2bbb, - UseEquipmentSetResult = 0x2796, - VasCheckTransferOkResponse = 0x2861, - VasGetQueueMinutesResponse = 0x285f, - VasGetServiceStatusResponse = 0x285e, - VasPurchaseComplete = 0x2836, - VasPurchaseStateUpdate = 0x2835, - VendorInventory = 0x25cb, - VignetteUpdate = 0x27b7, - VoiceChannelInfoResponse = 0x2865, - VoiceLoginResponse = 0x2864, - VoidItemSwapResponse = 0x25e0, - VoidStorageContents = 0x25dd, - VoidStorageFailed = 0x25dc, - VoidStorageTransferChanges = 0x25de, - VoidTransferResult = 0x25df, + UseEquipmentSetResult = 0x2753, + VasCheckTransferOkResponse = 0x281d, + VasGetQueueMinutesResponse = 0x281b, + VasGetServiceStatusResponse = 0x281a, + VasPurchaseComplete = 0x27f5, + VasPurchaseStateUpdate = 0x27f4, + VendorInventory = 0x25b9, + VignetteUpdate = 0x3009, + VoiceChannelInfoResponse = 0x2821, + VoiceLoginResponse = 0x2820, + VoidItemSwapResponse = 0x2da4, + VoidStorageContents = 0x2da1, + VoidStorageFailed = 0x2da0, + VoidStorageTransferChanges = 0x2da2, + VoidTransferResult = 0x2da3, WaitQueueFinish = 0x256f, WaitQueueUpdate = 0x256e, Warden3Data = 0x2577, - Warden3Disabled = 0x2868, - Warden3Enabled = 0x2867, - WarfrontComplete = 0x27a8, - WargameRequestSuccessfullySentToOpponent = 0x25b5, - Weather = 0x26d5, + Warden3Disabled = 0x2824, + Warden3Enabled = 0x2823, + WarfrontComplete = 0x2762, + WargameRequestSuccessfullySentToOpponent = 0x2932, + Weather = 0x26a4, + WeeklyRewardsProgressResult = 0x288b, + WeeklyRewardsResult = 0x2889, + WeeklyRewardClaimResult = 0x288a, WeeklySpellUsage = 0x2c18, Who = 0x2bae, - WhoIs = 0x26d4, - WillBeKickedForAddedSubscriptionTime = 0x286c, - WorldMapOpenNpc = 0x2839, - WorldQuestUpdateResponse = 0x284e, - WorldServerInfo = 0x25c3, - WowEntitlementNotification = 0x28c9, - XpGainAborted = 0x25e1, - XpGainEnabled = 0x27f2, + WhoIs = 0x26a3, + WillBeKickedForAddedSubscriptionTime = 0x2828, + WorldMapOpenNpc = 0x27f8, + WorldQuestUpdateResponse = 0x3010, + WorldServerInfo = 0x25b0, + WowEntitlementNotification = 0x2881, + XpGainAborted = 0x25c8, + XpGainEnabled = 0x27ac, ZoneUnderAttack = 0x2bb5, // Opcodes that are not generated automatically - AccountHeirloomUpdate = 0x25C6, // No Client Handler + AccountHeirloomUpdate = 0x25B3, // No Client Handler CompressedPacket = 0x3052, MultiplePackets = 0x3051, diff --git a/Source/Framework/IO/ByteBuffer.cs b/Source/Framework/IO/ByteBuffer.cs index d3ba1b9e4..7e8adf4cb 100644 --- a/Source/Framework/IO/ByteBuffer.cs +++ b/Source/Framework/IO/ByteBuffer.cs @@ -305,6 +305,14 @@ namespace Framework.IO WriteBytes(buffer.GetData()); } + public void WriteVector4(Vector4 pos) + { + WriteFloat(pos.X); + WriteFloat(pos.Y); + WriteFloat(pos.Z); + WriteFloat(pos.W); + } + public void WriteVector3(Vector3 pos) { WriteFloat(pos.X); diff --git a/Source/Game/AI/CoreAI/GameObjectAI.cs b/Source/Game/AI/CoreAI/GameObjectAI.cs index b4e808fb7..521702298 100644 --- a/Source/Game/AI/CoreAI/GameObjectAI.cs +++ b/Source/Game/AI/CoreAI/GameObjectAI.cs @@ -65,7 +65,11 @@ namespace Game.AI /// /// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 /// - public virtual void QuestReward(Player player, Quest quest, uint opt) { } + public virtual void QuestReward(Player player, Quest quest, uint opt) + { + QuestReward(player, quest, LootItemType.Item, opt); + } + public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { } /// /// Called when the dialog status between a player and the gameobject is requested. diff --git a/Source/Game/AI/CoreAI/UnitAI.cs b/Source/Game/AI/CoreAI/UnitAI.cs index 3407aef6e..803963593 100644 --- a/Source/Game/AI/CoreAI/UnitAI.cs +++ b/Source/Game/AI/CoreAI/UnitAI.cs @@ -516,12 +516,17 @@ namespace Game.AI /// /// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 /// - public virtual void QuestReward(Player player, Quest quest, uint opt) { } + public virtual void QuestReward(Player player, Quest quest, uint opt) + { + QuestReward(player, quest, LootItemType.Item, opt); + } + public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { } - /// - /// Called when a game event starts or ends - /// - public virtual void OnGameEvent(bool start, ushort eventId) { } + + /// + /// Called when a game event starts or ends + /// + public virtual void OnGameEvent(bool start, ushort eventId) { } // Called when the dialog status between a player and the creature is requested. public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedNoStatus; } diff --git a/Source/Game/Chat/Commands/GoCommands.cs b/Source/Game/Chat/Commands/GoCommands.cs index f6d0bda70..8e354be92 100644 --- a/Source/Game/Chat/Commands/GoCommands.cs +++ b/Source/Game/Chat/Commands/GoCommands.cs @@ -257,12 +257,12 @@ namespace Game.Chat.Commands var poiData = Global.ObjectMgr.GetQuestPOIData(questID); if (poiData != null) { - var data = poiData.QuestPOIBlobDataStats[0]; + var data = poiData.Blobs[0]; mapId = (uint)data.MapID; - x = data.QuestPOIBlobPointStats[0].X; - y = data.QuestPOIBlobPointStats[0].Y; + x = data.Points[0].X; + y = data.Points[0].Y; } else { diff --git a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs index e90a8ae2b..8bd15c16d 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs @@ -175,6 +175,18 @@ namespace Game.Entities public float ZOffset; } + public struct AreaTriggerMovementScriptInfo + { + public uint SpellScriptID; + public Vector3 Center; + + public void Write(WorldPacket data) + { + data.WriteUInt32(SpellScriptID); + data.WriteVector3(Center); + } + } + public class AreaTriggerTemplate : AreaTriggerData { public unsafe void InitMaxSearchRadius() diff --git a/Source/Game/Entities/Creature/Gossip.cs b/Source/Game/Entities/Creature/Gossip.cs index 7073c5aff..5d3d2668b 100644 --- a/Source/Game/Entities/Creature/Gossip.cs +++ b/Source/Game/Entities/Creature/Gossip.cs @@ -275,9 +275,8 @@ namespace Game.Misc { ClientGossipText text = new ClientGossipText(); text.QuestID = (int)questID; + text.ContentTuningID = quest.ContentTuningId; text.QuestType = item.QuestIcon; - text.QuestLevel = quest.Level; - text.QuestMaxScalingLevel = quest.MaxScalingLevel; text.QuestFlags = (int)quest.Flags; text.QuestFlagsEx = (int)quest.FlagsEx; text.Repeatable = quest.IsRepeatable(); @@ -365,24 +364,22 @@ namespace Game.Misc Quest quest = Global.ObjectMgr.GetQuestTemplate(questID); if (quest != null) { - string title = quest.LogTitle; + ClientGossipText text = new ClientGossipText(); + text.QuestID = questID; + text.ContentTuningID = quest.ContentTuningId; + text.QuestType = questMenuItem.QuestIcon; + text.QuestFlags = (uint)quest.Flags; + text.QuestFlagsEx = (uint)quest.FlagsEx; + text.Repeatable = quest.IsRepeatable(); + text.QuestTitle = quest.LogTitle; if (localeConstant != Locale.enUS) { QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id); if (localeData != null) - ObjectManager.GetLocaleString(localeData.LogTitle, localeConstant, ref title); + ObjectManager.GetLocaleString(localeData.LogTitle, localeConstant, ref text.QuestTitle); } - GossipText text = new GossipText(); - text.QuestID = questID; - text.QuestType = questMenuItem.QuestIcon; - text.QuestLevel = (uint)quest.Level; - text.QuestMaxScalingLevel = (uint)quest.MaxScalingLevel; - text.QuestFlags = (uint)quest.Flags; - text.QuestFlagsEx = (uint)quest.FlagsEx; - text.Repeatable = false; // NYI - text.QuestTitle = title; questList.QuestDataText.Add(text); } } diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 24b926353..514043b84 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -323,11 +323,11 @@ namespace Game.Entities data.WriteBits((uint)unit.GetUnitMovementFlags(), 30); data.WriteBits((uint)unit.GetUnitMovementFlags2(), 18); - data.WriteBit(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport + data.WriteBit(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport data.WriteBit(HasFall); // HasFall data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement - data.WriteBit(0); // HeightChangeFailed - data.WriteBit(0); // RemoteTimeValid + data.WriteBit(false); // HeightChangeFailed + data.WriteBit(false); // RemoteTimeValid if (!unit.m_movementInfo.transport.guid.IsEmpty()) MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport); @@ -467,6 +467,7 @@ namespace Game.Entities bool hasAreaTriggerCylinder = areaTriggerTemplate.IsCylinder(); bool hasAreaTriggerSpline = areaTrigger.HasSplines(); bool hasOrbit = areaTrigger.HasOrbit(); + bool hasMovementScript = false; data.WriteBit(hasAbsoluteOrientation); data.WriteBit(hasDynamicShape); @@ -489,6 +490,7 @@ namespace Game.Entities data.WriteBit(hasAreaTriggerCylinder); data.WriteBit(hasAreaTriggerSpline); data.WriteBit(hasOrbit); + data.WriteBit(hasMovementScript); if (hasUnk3) data.WriteBit(0); @@ -571,6 +573,9 @@ namespace Game.Entities data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffsetTarget); } + //if (hasMovementScript) + // *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo + if (hasOrbit) areaTrigger.GetCircularMovementInfo().Value.Write(data); } diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 5d1c72eed..01b07a783 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -497,6 +497,8 @@ namespace Game.Entities public Array Pieces = new Array(EquipmentSlot.End); public Array Appearances = new Array(EquipmentSlot.End); // ItemModifiedAppearanceID public Array Enchants = new Array(2); // SpellItemEnchantmentID + public int Unknown901_1; + public int Unknown901_2; } public enum EquipmentSetType diff --git a/Source/Game/Entities/Unit/Unit.Movement.cs b/Source/Game/Entities/Unit/Unit.Movement.cs index 98e3048bf..aa7c3aaeb 100644 --- a/Source/Game/Entities/Unit/Unit.Movement.cs +++ b/Source/Game/Entities/Unit/Unit.Movement.cs @@ -1335,10 +1335,6 @@ namespace Game.Entities if (thisPlayer != null) thisPlayer.SendMovementSetCollisionHeight(thisPlayer.GetCollisionHeight(false)); - Dismount data = new Dismount(); - data.Guid = GetGUID(); - SendMessageToSet(data, true); - // dismount as a vehicle if (IsTypeId(TypeId.Player) && GetVehicleKit() != null) { diff --git a/Source/Game/Garrisons/Garrisons.cs b/Source/Game/Garrisons/Garrisons.cs index c5ada77fd..23e2aba59 100644 --- a/Source/Game/Garrisons/Garrisons.cs +++ b/Source/Game/Garrisons/Garrisons.cs @@ -581,9 +581,9 @@ namespace Game.Garrisons _owner.SendPacket(data); } - public void SendBuildingLandmarks(Player receiver) + public void SendMapData(Player receiver) { - GarrisonBuildingLandmarks buildingLandmarks = new GarrisonBuildingLandmarks(); + GarrisonMapDataResponse mapData = new GarrisonMapDataResponse(); foreach (var plot in _plots.Values) { @@ -591,11 +591,11 @@ namespace Game.Garrisons { uint garrBuildingPlotInstId = Global.GarrisonMgr.GetGarrBuildingPlotInst(plot.BuildingInfo.PacketInfo.Value.GarrBuildingID, plot.GarrSiteLevelPlotInstId); if (garrBuildingPlotInstId != 0) - buildingLandmarks.Landmarks.Add(new GarrisonBuildingLandmark(garrBuildingPlotInstId, plot.PacketInfo.PlotPos)); + mapData.Buildings.Add(new GarrisonBuildingMapData(garrBuildingPlotInstId, plot.PacketInfo.PlotPos)); } } - receiver.SendPacket(buildingLandmarks); + receiver.SendPacket(mapData); } Map FindMap() diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index d2f55aea7..95ac16729 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -7544,7 +7544,7 @@ namespace Game _questPOIStorage[questID] = new QuestPOIData(questID); QuestPOIData poiData = _questPOIStorage[questID]; - poiData.QuestPOIBlobDataStats.Add(new QuestPOIBlobData(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapId, priority, flags, worldEffectID, playerConditionID, spawnTrackingID, POIs[questID][idx1], alwaysAllowMergingBlobs)); + poiData.Blobs.Add(new QuestPOIBlobData(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapId, priority, flags, worldEffectID, playerConditionID, spawnTrackingID, POIs[questID][idx1], alwaysAllowMergingBlobs)); ++count; } while (result.NextRow()); @@ -10490,8 +10490,23 @@ namespace Game public class QuestPOIBlobData { + public int BlobIndex; + public int ObjectiveIndex; + public int QuestObjectiveID; + public int QuestObjectID; + public int MapID; + public int UiMapID; + public int Priority; + public int Flags; + public int WorldEffectID; + public int PlayerConditionID; + public int NavigationPlayerConditionID; + public int SpawnTrackingID; + public List Points; + public bool AlwaysAllowMergingBlobs; + public QuestPOIBlobData(int blobIndex, int objectiveIndex, int questObjectiveID, int questObjectID, int mapID, int uiMapID, int priority, int flags, - int worldEffectID, int playerConditionID, int spawnTrackingID, List questPOIBlobPointStats, bool alwaysAllowMergingBlobs) + int worldEffectID, int playerConditionID, int spawnTrackingID, List points, bool alwaysAllowMergingBlobs) { BlobIndex = blobIndex; ObjectiveIndex = objectiveIndex; @@ -10504,46 +10519,36 @@ namespace Game WorldEffectID = worldEffectID; PlayerConditionID = playerConditionID; SpawnTrackingID = spawnTrackingID; - QuestPOIBlobPointStats = questPOIBlobPointStats; + Points = points; AlwaysAllowMergingBlobs = alwaysAllowMergingBlobs; - } - - public int BlobIndex; - public int ObjectiveIndex; - public int QuestObjectiveID; - public int QuestObjectID; - public int MapID; - public int UiMapID; - public int Priority; - public int Flags; - public int WorldEffectID; - public int PlayerConditionID; - public int SpawnTrackingID; - public List QuestPOIBlobPointStats; - public bool AlwaysAllowMergingBlobs; + } } public class QuestPOIBlobPoint - { - public QuestPOIBlobPoint(int _x, int _y) - { - X = _x; - Y = _y; - } - + { public int X; public int Y; + public int Z; + + public QuestPOIBlobPoint(int x, int y, int z) + { + X = x; + Y = y; + Z = z; + } } public class QuestPOIData { public uint QuestID; - public List QuestPOIBlobDataStats = new List(); - public ByteBuffer QueryDataBuffer = new ByteBuffer(); + public List Blobs; + public ByteBuffer QueryDataBuffer; public QuestPOIData(uint questId) { QuestID = questId; + Blobs = new List(); + QueryDataBuffer = new ByteBuffer(); } public void InitializeQueryData() @@ -10554,9 +10559,9 @@ namespace Game public void Write(ByteBuffer data) { data.WriteUInt32(QuestID); - data.WriteInt32(QuestPOIBlobDataStats.Count); + data.WriteInt32(Blobs.Count); - foreach (QuestPOIBlobData questPOIBlobData in QuestPOIBlobDataStats) + foreach (QuestPOIBlobData questPOIBlobData in Blobs) { data.WriteInt32(questPOIBlobData.BlobIndex); data.WriteInt32(questPOIBlobData.ObjectiveIndex); @@ -10568,13 +10573,15 @@ namespace Game data.WriteInt32(questPOIBlobData.Flags); data.WriteInt32(questPOIBlobData.WorldEffectID); data.WriteInt32(questPOIBlobData.PlayerConditionID); + data.WriteInt32(questPOIBlobData.NavigationPlayerConditionID); data.WriteInt32(questPOIBlobData.SpawnTrackingID); - data.WriteInt32(questPOIBlobData.QuestPOIBlobPointStats.Count); + data.WriteInt32(questPOIBlobData.Points.Count); - foreach (QuestPOIBlobPoint questPOIBlobPoint in questPOIBlobData.QuestPOIBlobPointStats) + foreach (QuestPOIBlobPoint questPOIBlobPoint in questPOIBlobData.Points) { - data.WriteInt32(questPOIBlobPoint.X); - data.WriteInt32(questPOIBlobPoint.Y); + data.WriteInt16((short)questPOIBlobPoint.X); + data.WriteInt16((short)questPOIBlobPoint.Y); + data.WriteInt16((short)questPOIBlobPoint.Z); } data.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs); diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index 2131078dd..10bc4501b 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -1107,11 +1107,11 @@ namespace Game.Guilds else member.RemoveFlag(GuildMemberFlags.DND); - GuildEventAwayChange awayChange = new GuildEventAwayChange(); - awayChange.Guid = memberGuid; - awayChange.AFK = afk; - awayChange.DND = dnd; - BroadcastPacket(awayChange); + GuildEventStatusChange statusChange = new GuildEventStatusChange(); + statusChange.Guid = memberGuid; + statusChange.AFK = afk; + statusChange.DND = dnd; + BroadcastPacket(statusChange); } void SendEventBankMoneyChanged() diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index 5281ecf06..73776be7f 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -578,8 +578,8 @@ namespace Game reportedPlayer.ReportedAfkBy(GetPlayer()); } - [WorldPacketHandler(ClientOpcodes.RequestRatedBattlefieldInfo)] - void HandleRequestRatedBattlefieldInfo(RequestRatedBattlefieldInfo packet) + [WorldPacketHandler(ClientOpcodes.RequestRatedPvpInfo)] + void HandleRequestRatedPvpInfo(RequestRatedPvpInfo packet) { RatedPvpInfo ratedPvpInfo = new RatedPvpInfo(); SendPacket(ratedPvpInfo); diff --git a/Source/Game/Handlers/CalendarHandler.cs b/Source/Game/Handlers/CalendarHandler.cs index 812c121bd..71d54732e 100644 --- a/Source/Game/Handlers/CalendarHandler.cs +++ b/Source/Game/Handlers/CalendarHandler.cs @@ -108,12 +108,12 @@ namespace Game Global.CalendarMgr.SendCalendarCommandResult(GetPlayer().GetGUID(), CalendarError.EventInvalid); } - [WorldPacketHandler(ClientOpcodes.CalendarCommunityFilter)] - void HandleCalendarCommunityFilter(CalendarCommunityFilter calendarCommunityFilter) + [WorldPacketHandler(ClientOpcodes.CalendarCommunityInviteRequest)] + void HandleCalendarCommunityInvite(CalendarCommunityInviteRequest calendarCommunityInvite) { Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId()); if (guild) - guild.MassInviteToEvent(this, calendarCommunityFilter.MinLevel, calendarCommunityFilter.MaxLevel, calendarCommunityFilter.MaxRankOrder); + guild.MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, calendarCommunityInvite.MaxRankOrder); } [WorldPacketHandler(ClientOpcodes.CalendarAddEvent)] @@ -234,8 +234,8 @@ namespace Game Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid); } - [WorldPacketHandler(ClientOpcodes.CalendarEventInvite)] - void HandleCalendarEventInvite(CalendarEventInvite calendarEventInvite) + [WorldPacketHandler(ClientOpcodes.CalendarInvite)] + void HandleCalendarInvite(CalendarInvitePkt calendarInvite) { ObjectGuid playerGuid = GetPlayer().GetGUID(); @@ -243,10 +243,10 @@ namespace Game Team inviteeTeam = 0; ulong inviteeGuildId = 0; - if (!ObjectManager.NormalizePlayerName(ref calendarEventInvite.Name)) + if (!ObjectManager.NormalizePlayerName(ref calendarInvite.Name)) return; - Player player = Global.ObjAccessor.FindPlayerByName(calendarEventInvite.Name); + Player player = Global.ObjAccessor.FindPlayerByName(calendarInvite.Name); if (player) { // Invitee is online @@ -257,7 +257,7 @@ namespace Game else { // Invitee offline, get data from database - ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(calendarEventInvite.Name); + ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(calendarInvite.Name); if (!guid.IsEmpty()) { CharacterCacheEntry characterInfo = Global.CharacterCacheStorage.GetCharacterCacheByGuid(guid); @@ -288,14 +288,14 @@ namespace Game if (Convert.ToBoolean(result1.Read(0) & (byte)SocialFlag.Ignored)) { - Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.IgnoringYouS, calendarEventInvite.Name); + Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.IgnoringYouS, calendarInvite.Name); return; } } - if (!calendarEventInvite.Creating) + if (!calendarInvite.Creating) { - CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventInvite.EventID); + CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarInvite.EventID); if (calendarEvent != null) { if (calendarEvent.IsGuildEvent() && calendarEvent.GuildId == inviteeGuildId) @@ -305,7 +305,7 @@ namespace Game return; } - CalendarInvite invite = new CalendarInvite(Global.CalendarMgr.GetFreeInviteId(), calendarEventInvite.EventID, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); + CalendarInvite invite = new CalendarInvite(Global.CalendarMgr.GetFreeInviteId(), calendarInvite.EventID, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); Global.CalendarMgr.AddInvite(calendarEvent, invite); } else @@ -313,13 +313,13 @@ namespace Game } else { - if (calendarEventInvite.IsSignUp && inviteeGuildId == GetPlayer().GetGuildId()) + if (calendarInvite.IsSignUp && inviteeGuildId == GetPlayer().GetGuildId()) { Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites); return; } - CalendarInvite invite = new CalendarInvite(calendarEventInvite.EventID, 0, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); + CalendarInvite invite = new CalendarInvite(calendarInvite.EventID, 0, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); Global.CalendarMgr.SendCalendarEventInvite(invite); } } @@ -347,25 +347,25 @@ namespace Game Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid); } - [WorldPacketHandler(ClientOpcodes.CalendarEventRsvp)] - void HandleCalendarEventRsvp(CalendarEventRSVP calendarEventRSVP) + [WorldPacketHandler(ClientOpcodes.CalendarRsvp)] + void HandleCalendarRsvp(HandleCalendarRsvp calendarRSVP) { ObjectGuid guid = GetPlayer().GetGUID(); - CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventRSVP.EventID); + CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarRSVP.EventID); if (calendarEvent != null) { // i think we still should be able to remove self from locked events - if (calendarEventRSVP.Status != CalendarInviteStatus.Removed && calendarEvent.IsLocked()) + if (calendarRSVP.Status != CalendarInviteStatus.Removed && calendarEvent.IsLocked()) { Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventLocked); return; } - CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarEventRSVP.InviteID); + CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarRSVP.InviteID); if (invite != null) { - invite.Status = calendarEventRSVP.Status; + invite.Status = calendarRSVP.Status; invite.ResponseTime = Time.UnixTime; Global.CalendarMgr.UpdateInvite(invite); @@ -399,22 +399,22 @@ namespace Game Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.NoInvite); } - [WorldPacketHandler(ClientOpcodes.CalendarEventStatus)] - void HandleCalendarEventStatus(CalendarEventStatus calendarEventStatus) + [WorldPacketHandler(ClientOpcodes.CalendarStatus)] + void HandleCalendarStatus(CalendarStatus calendarStatus) { ObjectGuid guid = GetPlayer().GetGUID(); - CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventStatus.EventID); + CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarStatus.EventID); if (calendarEvent != null) { - CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarEventStatus.InviteID); + CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarStatus.InviteID); if (invite != null) { - invite.Status = (CalendarInviteStatus)calendarEventStatus.Status; + invite.Status = (CalendarInviteStatus)calendarStatus.Status; Global.CalendarMgr.UpdateInvite(invite); Global.CalendarMgr.SendCalendarEventStatus(calendarEvent, invite); - Global.CalendarMgr.SendCalendarClearPendingAction(calendarEventStatus.Guid); + Global.CalendarMgr.SendCalendarClearPendingAction(calendarStatus.Guid); } else Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.NoInvite); // correct? @@ -424,17 +424,17 @@ namespace Game } [WorldPacketHandler(ClientOpcodes.CalendarEventModeratorStatus)] - void HandleCalendarEventModeratorStatus(CalendarEventModeratorStatus calendarEventModeratorStatus) + void HandleCalendarModeratorStatus(CalendarModeratorStatusQuery calendarModeratorStatus) { ObjectGuid guid = GetPlayer().GetGUID(); - CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventModeratorStatus.EventID); + CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarModeratorStatus.EventID); if (calendarEvent != null) { - CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarEventModeratorStatus.InviteID); + CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarModeratorStatus.InviteID); if (invite != null) { - invite.Rank = (CalendarModerationRank)calendarEventModeratorStatus.Status; + invite.Rank = (CalendarModerationRank)calendarModeratorStatus.Status; Global.CalendarMgr.UpdateInvite(invite); Global.CalendarMgr.SendCalendarEventModeratorStatusAlert(calendarEvent, invite); } diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 5687aee94..a768a0d8b 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -54,11 +54,6 @@ namespace Game void HandleCharEnumCallback(SQLResult result) { - byte demonHunterCount = 0; // We use this counter to allow multiple demon hunter creations when allowed in config - bool canAlwaysCreateDemonHunter = HasPermission(RBACPermissions.SkipCheckCharacterCreationDemonHunter); - if (WorldConfig.GetIntValue(WorldCfg.CharacterCreatingMinLevelForDemonHunter) == 0) // char level = 0 means this check is disabled, so always true - canAlwaysCreateDemonHunter = true; - EnumCharactersResult charResult = new EnumCharactersResult(); charResult.Success = true; charResult.IsDeletedCharacters = false; @@ -101,14 +96,6 @@ namespace Game if (!Global.CharacterCacheStorage.HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexId, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.ExperienceLevel, false); - if (charInfo.ClassId == Class.DemonHunter) - demonHunterCount++; - - if (demonHunterCount >= WorldConfig.GetIntValue(WorldCfg.DemonHuntersPerRealm) && !canAlwaysCreateDemonHunter) - charResult.HasDemonHunterOnRealm = true; - else - charResult.HasDemonHunterOnRealm = false; - charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.ExperienceLevel); charResult.Characters.Add(charInfo); @@ -116,8 +103,6 @@ namespace Game while (result.NextRow()); } - charResult.IsTestDemonHunterCreationAllowed = canAlwaysCreateDemonHunter; - charResult.IsDemonHunterCreationAllowed = GetAccountExpansion() >= Expansion.Legion || canAlwaysCreateDemonHunter; charResult.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= Expansion.BattleForAzeroth; foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) @@ -360,25 +345,10 @@ namespace Game if (result1 != null && !result1.IsEmpty()) { Team team = Player.TeamForRace(createInfo.RaceId); - int freeDemonHunterSlots = WorldConfig.GetIntValue(WorldCfg.DemonHuntersPerRealm); - byte accRace = result1.Read(1); if (checkDemonHunterReqs) { - byte accClass = result1.Read(2); - if (accClass == (byte)Class.DemonHunter) - { - if (freeDemonHunterSlots > 0) - --freeDemonHunterSlots; - - if (freeDemonHunterSlots == 0) - { - SendCharCreate(ResponseCodes.CharCreateFailed); - return; - } - } - if (!hasDemonHunterReqLevel) { byte accLevel = result1.Read(0); @@ -1079,6 +1049,40 @@ namespace Game GetPlayer().GetReputationMgr().SetInactive(packet.Index, packet.State); } + [WorldPacketHandler(ClientOpcodes.CheckCharacterNameAvailability)] + void HandleCheckCharacterNameAvailability(CheckCharacterNameAvailability checkCharacterNameAvailability) + { + // prevent character rename to invalid name + if (!ObjectManager.NormalizePlayerName(ref checkCharacterNameAvailability.Name)) + { + SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, ResponseCodes.CharNameNoName)); + return; + } + + ResponseCodes res = ObjectManager.CheckPlayerName(checkCharacterNameAvailability.Name, GetSessionDbcLocale(), true); + if (res != ResponseCodes.CharNameSuccess) + { + SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, res)); + return; + } + + // check name limitations + if (!HasPermission(RBACPermissions.SkipCheckCharacterCreationReservedname) && Global.ObjectMgr.IsReservedName(checkCharacterNameAvailability.Name)) + { + SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, ResponseCodes.CharNameReserved)); + return; + } + + // Ensure that there is no character with the desired new name + PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHECK_NAME); + stmt.AddValue(0, checkCharacterNameAvailability.Name); + + _queryProcessor.AddCallback(DB.Characters.AsyncQuery(stmt).WithCallback(result => + { + SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, !result.IsEmpty() ? ResponseCodes.CharCreateNameInUse : ResponseCodes.Success)); + })); + } + [WorldPacketHandler(ClientOpcodes.RequestForcedReactions)] void HandleRequestForcedReactions(RequestForcedReactions requestForcedReactions) { @@ -2455,13 +2459,8 @@ namespace Game packet.Display.HasValue = true; packet.Display.Value.Name = factionChangeInfo.Name; packet.Display.Value.SexID = (byte)factionChangeInfo.SexID; - packet.Display.Value.SkinID = factionChangeInfo.SkinID; - packet.Display.Value.HairColorID = factionChangeInfo.HairColorID; - packet.Display.Value.HairStyleID = factionChangeInfo.HairStyleID; - packet.Display.Value.FacialHairStyleID = factionChangeInfo.FacialHairStyleID; - packet.Display.Value.FaceID = factionChangeInfo.FaceID; + packet.Display.Value.Customizations = factionChangeInfo.Customizations; packet.Display.Value.RaceID = (byte)factionChangeInfo.RaceID; - packet.Display.Value.CustomDisplay = factionChangeInfo.CustomDisplay; } SendPacket(packet); diff --git a/Source/Game/Handlers/GarrisonHandler.cs b/Source/Game/Handlers/GarrisonHandler.cs index d83941e7d..2de536122 100644 --- a/Source/Game/Handlers/GarrisonHandler.cs +++ b/Source/Game/Handlers/GarrisonHandler.cs @@ -62,12 +62,12 @@ namespace Game garrison.SendBlueprintAndSpecializationData(); } - [WorldPacketHandler(ClientOpcodes.GarrisonGetBuildingLandmarks)] - void HandleGarrisonGetBuildingLandmarks(GarrisonGetBuildingLandmarks garrisonGetBuildingLandmarks) + [WorldPacketHandler(ClientOpcodes.GarrisonGetMapData)] + void HandleGarrisonGetMapData(GarrisonGetMapData garrisonGetMapData) { Garrison garrison = _player.GetGarrison(); if (garrison != null) - garrison.SendBuildingLandmarks(_player); + garrison.SendMapData(_player); } } } diff --git a/Source/Game/Handlers/HotfixHandler.cs b/Source/Game/Handlers/HotfixHandler.cs index 360974b8f..d7efba5d8 100644 --- a/Source/Game/Handlers/HotfixHandler.cs +++ b/Source/Game/Handlers/HotfixHandler.cs @@ -43,7 +43,7 @@ namespace Game if (store.HasRecord(record.RecordID)) { - dbReply.Allow = true; + dbReply.Status = 1; dbReply.Timestamp = (uint)GameTime.GetGameTime(); store.WriteRecord(record.RecordID, GetSessionDbcLocale(), dbReply.Data); } diff --git a/Source/Game/Handlers/LFGHandler.cs b/Source/Game/Handlers/LFGHandler.cs index fc6683520..5eb85d0b6 100644 --- a/Source/Game/Handlers/LFGHandler.cs +++ b/Source/Game/Handlers/LFGHandler.cs @@ -150,7 +150,7 @@ namespace Game // Get player locked Dungeons foreach (var locked in Global.LFGMgr.GetLockedDungeons(_player.GetGUID())) - lfgPlayerInfo.BlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel)); + lfgPlayerInfo.BlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel, 0)); foreach (var slot in randomDungeons) { @@ -231,7 +231,7 @@ namespace Game LFGBlackList lfgBlackList = new LFGBlackList(); lfgBlackList.PlayerGuid.Set(pguid); foreach (var locked in Global.LFGMgr.GetLockedDungeons(pguid)) - lfgBlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel)); + lfgBlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel, 0)); lfgPartyInfo.Player.Add(lfgBlackList); } @@ -353,7 +353,7 @@ namespace Game foreach (var it in joinData.lockmap) { - var blackList = new LFGJoinBlackList(); + var blackList = new LFGBlackListPkt(); blackList.PlayerGuid = it.Key; foreach (var lockInfo in it.Value) @@ -361,8 +361,10 @@ namespace Game Log.outTrace(LogFilter.Lfg, "SendLfgJoinResult:: {0} DungeonID: {1} Lock status: {2} Required itemLevel: {3} Current itemLevel: {4}", it.Key.ToString(), (lockInfo.Key & 0x00FFFFFF), lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, lockInfo.Value.currentItemLevel); - blackList.Slots.Add(new LFGJoinBlackListSlot((int)lockInfo.Key, (int)lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, (int)lockInfo.Value.currentItemLevel)); + blackList.Slot.Add(new LFGBlackListSlot(lockInfo.Key, (uint)lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, (int)lockInfo.Value.currentItemLevel, 0)); } + + lfgJoinResult.BlackList.Add(blackList); } SendPacket(lfgJoinResult); diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index 50291fcec..e55f70f33 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -732,8 +732,8 @@ namespace Game GetPlayer().SetPendingBind(0, 0); } - [WorldPacketHandler(ClientOpcodes.WardenData)] - void HandleWardenDataOpcode(WardenData packet) + [WorldPacketHandler(ClientOpcodes.Warden3Data)] + void HandleWarden3Data(WardenData packet) { if (_warden == null || packet.Data.GetSize() == 0) return; diff --git a/Source/Game/Handlers/MovementHandler.cs b/Source/Game/Handlers/MovementHandler.cs index d3f4d8edb..af97c051f 100644 --- a/Source/Game/Handlers/MovementHandler.cs +++ b/Source/Game/Handlers/MovementHandler.cs @@ -429,7 +429,7 @@ namespace Game NewWorld packet = new NewWorld(); packet.MapID = loc.GetMapId(); - packet.Pos = loc; + packet.Loc.Pos = loc; packet.Reason = (uint)(!_player.IsBeingTeleportedSeamlessly() ? NewWorldReason.Normal : NewWorldReason.Seamless); SendPacket(packet); diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index 7729d2f94..f2478d651 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -242,10 +242,13 @@ namespace Game if (quest == null) return; - // This is Real Item Entry, not slot id as pre 5.x + // TODO: currency choice items + if (packet.Choice.LootItemType != LootItemType.Item) + return; + if (packet.ItemChoiceID != 0) { - ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.ItemChoiceID); + ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.Choice.Item.ItemID); if (rewardProto == null) { Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID); @@ -255,7 +258,7 @@ namespace Game bool itemValid = false; for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i) { - if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == packet.ItemChoiceID) + if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID) { itemValid = true; break; @@ -269,7 +272,7 @@ namespace Game { foreach (var questPackageItem in questPackageItems) { - if (questPackageItem.ItemID != packet.ItemChoiceID) + if (questPackageItem.ItemID != packet.Choice.Item.ItemID) continue; if (_player.CanSelectQuestPackageItem(questPackageItem)) @@ -287,7 +290,7 @@ namespace Game { foreach (var questPackageItem in questPackageItems1) { - if (questPackageItem.ItemID != packet.ItemChoiceID) + if (questPackageItem.ItemID != packet.Choice.Item.ItemID) continue; itemValid = true; @@ -324,9 +327,9 @@ namespace Game return; } - if (GetPlayer().CanRewardQuest(quest, packet.ItemChoiceID, true)) + if (GetPlayer().CanRewardQuest(quest, packet.Choice.Item.ItemID, true)) { - GetPlayer().RewardQuest(quest, packet.ItemChoiceID, obj); + GetPlayer().RewardQuest(quest, packet.Choice.Item.ItemID, obj); switch (obj.GetTypeId()) { @@ -350,7 +353,7 @@ namespace Game } _player.PlayerTalkClass.ClearMenus(); - creatureQGiver.GetAI().QuestReward(_player, quest, packet.ItemChoiceID); + creatureQGiver.GetAI().QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); break; } case TypeId.GameObject: @@ -371,7 +374,7 @@ namespace Game } _player.PlayerTalkClass.ClearMenus(); - questGiver.GetAI().QuestReward(_player, quest, packet.ItemChoiceID); + questGiver.GetAI().QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); break; } default: diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index b9d7feee9..4edd9e706 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -531,13 +531,8 @@ namespace Game Guild guild = player.GetGuild(); - mirrorImageComponentedData.SkinColor = player.m_playerData.SkinID; - mirrorImageComponentedData.FaceVariation = player.m_playerData.FaceID; - mirrorImageComponentedData.HairVariation = player.m_playerData.HairStyleID; - mirrorImageComponentedData.HairColor = player.m_playerData.HairColorID; - mirrorImageComponentedData.BeardVariation = player.m_playerData.FacialHairStyleID; - for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) - mirrorImageComponentedData.CustomDisplay[i] = player.m_playerData.CustomDisplayOption[i]; + foreach (var customization in player.m_playerData.Customizations) + mirrorImageComponentedData.Customizations.Add(new ChrCustomizationChoice(customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID)); mirrorImageComponentedData.GuildGUID = (guild ? guild.GetGUID() : ObjectGuid.Empty); byte[] itemSlots = diff --git a/Source/Game/Handlers/TicketHandler.cs b/Source/Game/Handlers/TicketHandler.cs index 8c4658500..7b42a4ed9 100644 --- a/Source/Game/Handlers/TicketHandler.cs +++ b/Source/Game/Handlers/TicketHandler.cs @@ -43,32 +43,33 @@ namespace Game SendPacket(response); } - [WorldPacketHandler(ClientOpcodes.SupportTicketSubmitBug)] - void HandleSupportTicketSubmitBug(SupportTicketSubmitBug packet) + [WorldPacketHandler(ClientOpcodes.SubmitUserFeedback)] + void HandleSubmitUserFeedback(SubmitUserFeedback userFeedback) { - if (!Global.SupportMgr.GetBugSystemStatus()) - return; + if (userFeedback.IsSuggestion) + { + if (!Global.SupportMgr.GetSuggestionSystemStatus()) + return; - BugTicket ticket = new BugTicket(GetPlayer()); - ticket.SetPosition(packet.Header.MapID, packet.Header.Position); - ticket.SetFacing(packet.Header.Facing); - ticket.SetNote(packet.Note); + SuggestionTicket ticket = new SuggestionTicket(GetPlayer()); + ticket.SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position); + ticket.SetFacing(userFeedback.Header.Facing); + ticket.SetNote(userFeedback.Note); - Global.SupportMgr.AddTicket(ticket); - } + Global.SupportMgr.AddTicket(ticket); + } + else + { + if (!Global.SupportMgr.GetBugSystemStatus()) + return; - [WorldPacketHandler(ClientOpcodes.SupportTicketSubmitSuggestion)] - void HandleSupportTicketSubmitSuggestion(SupportTicketSubmitSuggestion packet) - { - if (!Global.SupportMgr.GetSuggestionSystemStatus()) - return; + BugTicket ticket = new BugTicket(GetPlayer()); + ticket.SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position); + ticket.SetFacing(userFeedback.Header.Facing); + ticket.SetNote(userFeedback.Note); - SuggestionTicket ticket = new SuggestionTicket(GetPlayer()); - ticket.SetPosition(packet.Header.MapID, packet.Header.Position); - ticket.SetFacing(packet.Header.Facing); - ticket.SetNote(packet.Note); - - Global.SupportMgr.AddTicket(ticket); + Global.SupportMgr.AddTicket(ticket); + } } [WorldPacketHandler(ClientOpcodes.SupportTicketSubmitComplaint)] diff --git a/Source/Game/Movement/MoveSpline.cs b/Source/Game/Movement/MoveSpline.cs index 15459f9f7..acae7f8d4 100644 --- a/Source/Game/Movement/MoveSpline.cs +++ b/Source/Game/Movement/MoveSpline.cs @@ -51,6 +51,7 @@ namespace Game.Movement vertical_acceleration = 0.0f; effect_start_time = 0; spell_effect_extra = args.spellEffectExtra; + anim_tier = args.animTier; splineIsFacingOnly = args.path.Length == 2 && args.facing.type != MonsterMoveType.Normal && ((args.path[1] - args.path[0]).GetLength() < 0.1f); // Check if its a stop spline @@ -155,7 +156,7 @@ namespace Game.Movement } else { - if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown0)) + if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown0x8)) { Vector3 hermite; spline.Evaluate_Derivative(point_Idx, u, out hermite); @@ -309,6 +310,7 @@ namespace Game.Movement public int point_Idx; public int point_Idx_offset; public Optional spell_effect_extra; + public Optional anim_tier; #endregion public class CommonInitializer : IInitializer diff --git a/Source/Game/Movement/MoveSplineFlags.cs b/Source/Game/Movement/MoveSplineFlags.cs index c95054f4b..bb7dc6f4b 100644 --- a/Source/Game/Movement/MoveSplineFlags.cs +++ b/Source/Game/Movement/MoveSplineFlags.cs @@ -29,7 +29,6 @@ namespace Game.Movement public bool IsSmooth() { return Flags.HasAnyFlag(SplineFlag.Catmullrom); } public bool IsLinear() { return !IsSmooth(); } - public byte GetAnimTier() { return animTier; } public bool HasAllFlags(SplineFlag f) { return (Flags & f) == f; } public bool HasFlag(SplineFlag f) { return (Flags & f) != 0; } @@ -41,10 +40,10 @@ namespace Game.Movement Flags &= ~f; } - public void EnableAnimation(uint anim) { Flags = (Flags & ~(SplineFlag.MaskAnimations | SplineFlag.Falling | SplineFlag.Parabolic | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Animation | ((SplineFlag)anim & SplineFlag.MaskAnimations); } - public void EnableParabolic() { Flags = (Flags & ~(SplineFlag.MaskAnimations | SplineFlag.Falling | SplineFlag.Animation | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Parabolic; } + public void EnableAnimation() { Flags = (Flags & ~(SplineFlag.Falling | SplineFlag.Parabolic | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Animation; } + public void EnableParabolic() { Flags = (Flags & ~(SplineFlag.Falling | SplineFlag.Animation | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Parabolic; } public void EnableFlying() { Flags = (Flags & ~SplineFlag.Falling) | SplineFlag.Flying; } - public void EnableFalling() { Flags = (Flags & ~(SplineFlag.MaskAnimations | SplineFlag.Parabolic | SplineFlag.Animation | SplineFlag.Flying)) | SplineFlag.Falling; } + public void EnableFalling() { Flags = (Flags & ~(SplineFlag.Parabolic | SplineFlag.Animation | SplineFlag.Flying)) | SplineFlag.Falling; } public void EnableCatmullRom() { Flags = (Flags & ~SplineFlag.SmoothGroundPath) | SplineFlag.Catmullrom; } public void EnableTransportEnter() { Flags = (Flags & ~SplineFlag.TransportExit) | SplineFlag.TransportEnter; } public void EnableTransportExit() { Flags = (Flags & ~SplineFlag.TransportEnter) | SplineFlag.TransportExit; } diff --git a/Source/Game/Movement/MoveSplineInit.cs b/Source/Game/Movement/MoveSplineInit.cs index 093aa5e44..73717190e 100644 --- a/Source/Game/Movement/MoveSplineInit.cs +++ b/Source/Game/Movement/MoveSplineInit.cs @@ -285,7 +285,9 @@ namespace Game.Movement public void SetAnimation(AnimType anim) { args.time_perc = 0.0f; - args.flags.EnableAnimation((byte)anim); + args.animTier.emplace(); + args.animTier.AnimTier = anim; + args.flags.EnableAnimation(); } public void SetFacing(Vector3 spot) diff --git a/Source/Game/Movement/MoveSplineInitArgs.cs b/Source/Game/Movement/MoveSplineInitArgs.cs index 747bdeb59..75bc74731 100644 --- a/Source/Game/Movement/MoveSplineInitArgs.cs +++ b/Source/Game/Movement/MoveSplineInitArgs.cs @@ -47,6 +47,7 @@ namespace Game.Movement public uint splineId; public float initialOrientation; public Optional spellEffectExtra; + public Optional animTier; public bool walk; public bool HasVelocity; public bool TransformForTransport; @@ -92,4 +93,10 @@ namespace Game.Movement public uint ProgressCurveId; public uint ParabolicCurveId; } + + public class AnimTierTransition + { + public uint TierTransitionId; + public byte AnimTier; + } } diff --git a/Source/Game/Networking/PacketUtilities.cs b/Source/Game/Networking/PacketUtilities.cs deleted file mode 100644 index f1c222fdf..000000000 --- a/Source/Game/Networking/PacketUtilities.cs +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2012-2020 CypherCore - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System; - -namespace Game.Networking -{ - public class CompactArray - { - public void Insert(int index, int value) - { - Cypher.Assert(index < 0x20); - - _mask |= 1u << index; - if (_contents.Length <= index) - Array.Resize(ref _contents, index + 1); - _contents[index] = value; - } - - void Clear() - { - _mask = 0; - _contents = new int[1]; - } - - public void Read(WorldPacket data) - { - uint mask = data.ReadUInt32(); - - for (int index = 0; mask != 0; mask >>= 1, ++index) - { - if ((mask & 1) != 0) - { - int value = data.ReadInt32(); - Insert(index, value); - } - } - } - - public void Write(WorldPacket data) - { - uint mask = GetMask(); - data.WriteUInt32(mask); - for (int i = 0; i < GetSize(); ++i) - { - if (Convert.ToBoolean(mask & (1 << i))) - data.WriteInt32(this[i]); - } - } - - public override int GetHashCode() - { - return _mask.GetHashCode() ^ _contents.GetHashCode(); - } - - public override bool Equals(object obj) - { - if (obj is CompactArray) - return (CompactArray)obj == this; - - return false; - } - - public static bool operator ==(CompactArray left, CompactArray right) - { - if (left._mask != right._mask) - return false; - - return left._contents == right._contents; - } - - public static bool operator !=(CompactArray left, CompactArray right) - { - return !(left == right); - } - - uint GetMask() { return _mask; } - public int this[int index] { get { return _contents[index]; } } - int GetSize() { return _contents.Length; } - - uint _mask; - int[] _contents = new int[1]; - } -} diff --git a/Source/Game/Networking/Packets/AreaTriggerPackets.cs b/Source/Game/Networking/Packets/AreaTriggerPackets.cs index de20e7dc0..643e203fd 100644 --- a/Source/Game/Networking/Packets/AreaTriggerPackets.cs +++ b/Source/Game/Networking/Packets/AreaTriggerPackets.cs @@ -72,17 +72,22 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(AreaTriggerSpline.HasValue); _worldPacket.WriteBit(AreaTriggerOrbit.HasValue); + _worldPacket.WriteBit(AreaTriggerMovementScript.HasValue); _worldPacket.FlushBits(); if (AreaTriggerSpline.HasValue) AreaTriggerSpline.Value.Write(_worldPacket); + if (AreaTriggerMovementScript.HasValue) + AreaTriggerMovementScript.Value.Write(_worldPacket); + if (AreaTriggerOrbit.HasValue) AreaTriggerOrbit.Value.Write(_worldPacket); } public Optional AreaTriggerSpline; public Optional AreaTriggerOrbit; + public Optional AreaTriggerMovementScript; public ObjectGuid TriggerGUID; } diff --git a/Source/Game/Networking/Packets/AuctionHousePackets.cs b/Source/Game/Networking/Packets/AuctionHousePackets.cs index 897e92848..23f8af43c 100644 --- a/Source/Game/Networking/Packets/AuctionHousePackets.cs +++ b/Source/Game/Networking/Packets/AuctionHousePackets.cs @@ -616,6 +616,9 @@ namespace Game.Networking.Packets foreach (AuctionItem item in Items) item.Write(_worldPacket); + + foreach (AuctionItem item in SoldItems) + item.Write(_worldPacket); } } @@ -857,10 +860,12 @@ namespace Game.Networking.Packets public AuctionBucketKey Key; public int TotalQuantity; public ulong MinPrice; + public int RequiredLevel; public List ItemModifiedAppearanceIDs = new List(); public Optional MaxBattlePetQuality; public Optional MaxBattlePetLevel; public Optional BattlePetBreedID; + public Optional Unk901_1; public bool ContainsOwnerItem; public bool ContainsOnlyCollectedAppearances; @@ -868,6 +873,7 @@ namespace Game.Networking.Packets { Key.Write(data); data.WriteInt32(TotalQuantity); + data.WriteInt32(RequiredLevel); data.WriteUInt64(MinPrice); data.WriteInt32(ItemModifiedAppearanceIDs.Count); if (!ItemModifiedAppearanceIDs.Empty()) @@ -879,6 +885,7 @@ namespace Game.Networking.Packets data.WriteBit(MaxBattlePetQuality.HasValue); data.WriteBit(MaxBattlePetLevel.HasValue); data.WriteBit(BattlePetBreedID.HasValue); + data.WriteBit(Unk901_1.HasValue); data.WriteBit(ContainsOwnerItem); data.WriteBit(ContainsOnlyCollectedAppearances); data.FlushBits(); @@ -891,6 +898,9 @@ namespace Game.Networking.Packets if (BattlePetBreedID.HasValue) data.WriteUInt8(BattlePetBreedID.Value); + + if (Unk901_1.HasValue) + data.WriteUInt32(Unk901_1.Value); } } diff --git a/Source/Game/Networking/Packets/AuthenticationPackets.cs b/Source/Game/Networking/Packets/AuthenticationPackets.cs index 123caeb3a..169d59222 100644 --- a/Source/Game/Networking/Packets/AuthenticationPackets.cs +++ b/Source/Game/Networking/Packets/AuthenticationPackets.cs @@ -153,13 +153,13 @@ namespace Game.Networking.Packets _worldPacket.FlushBits(); { - _worldPacket.WriteUInt32(SuccessInfo.Value.Billing.BillingPlan); - _worldPacket.WriteUInt32(SuccessInfo.Value.Billing.TimeRemain); - _worldPacket.WriteUInt32(SuccessInfo.Value.Billing.Unknown735); + _worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.BillingPlan); + _worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.TimeRemain); + _worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.Unknown735); // 3x same bit is not a mistake - preserves legacy client behavior of BillingPlanFlags::SESSION_IGR - _worldPacket.WriteBit(SuccessInfo.Value.Billing.InGameRoom); // inGameRoom check in function checking which lua event to fire when remaining time is near end - BILLING_NAG_DIALOG vs IGR_BILLING_NAG_DIALOG - _worldPacket.WriteBit(SuccessInfo.Value.Billing.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan - _worldPacket.WriteBit(SuccessInfo.Value.Billing.InGameRoom); // not used anywhere in the client + _worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.InGameRoom); // inGameRoom check in function checking which lua event to fire when remaining time is near end - BILLING_NAG_DIALOG vs IGR_BILLING_NAG_DIALOG + _worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan + _worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.InGameRoom); // not used anywhere in the client _worldPacket.FlushBits(); } @@ -213,7 +213,7 @@ namespace Game.Networking.Packets public uint CurrencyID; // this is probably used for the ingame shop. @todo implement public uint Time; - public BillingInfo Billing; + public GameTime GameTimeInfo; public List VirtualRealms = new List(); // list of realms connected to this one (inclusive) @todo implement public List Templates = new List(); // list of pre-made character templates. @todo implement @@ -226,7 +226,7 @@ namespace Game.Networking.Packets public Optional NumPlayersAlliance; // number of alliance players in this realm. @todo implement public Optional ExpansionTrialExpiration; // expansion trial expiration unix timestamp - public struct BillingInfo + public struct GameTime { public uint BillingPlan; public uint TimeRemain; diff --git a/Source/Game/Networking/Packets/BattleGroundPackets.cs b/Source/Game/Networking/Packets/BattleGroundPackets.cs index eefb1f146..312d8da6e 100644 --- a/Source/Game/Networking/Packets/BattleGroundPackets.cs +++ b/Source/Game/Networking/Packets/BattleGroundPackets.cs @@ -33,13 +33,18 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(MythicPlusSeasonID); _worldPacket.WriteInt32(CurrentSeason); _worldPacket.WriteInt32(PreviousSeason); + _worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID); _worldPacket.WriteInt32(PvpSeasonID); + _worldPacket.WriteBit(WeeklyRewardChestsEnabled); + _worldPacket.FlushBits(); } public int MythicPlusSeasonID; public int PreviousSeason; public int CurrentSeason; public int PvpSeasonID; + public int ConquestWeeklyProgressCurrencyID; + public bool WeeklyRewardChestsEnabled; } public class AreaSpiritHealerQuery : ClientPacket @@ -435,9 +440,9 @@ namespace Game.Networking.Packets public uint RandomMaxRewardPointsThisWeek; } - class RequestRatedBattlefieldInfo : ClientPacket + class RequestRatedPvpInfo : ClientPacket { - public RequestRatedBattlefieldInfo(WorldPacket packet) : base(packet) { } + public RequestRatedPvpInfo(WorldPacket packet) : base(packet) { } public override void Read() { } } diff --git a/Source/Game/Networking/Packets/CalendarPackets.cs b/Source/Game/Networking/Packets/CalendarPackets.cs index 1e627d4b0..2f58a8162 100644 --- a/Source/Game/Networking/Packets/CalendarPackets.cs +++ b/Source/Game/Networking/Packets/CalendarPackets.cs @@ -42,9 +42,9 @@ namespace Game.Networking.Packets public ulong EventID; } - class CalendarCommunityFilter : ClientPacket + class CalendarCommunityInviteRequest : ClientPacket { - public CalendarCommunityFilter(WorldPacket packet) : base(packet) { } + public CalendarCommunityInviteRequest(WorldPacket packet) : base(packet) { } public override void Read() { @@ -260,9 +260,9 @@ namespace Game.Networking.Packets public string EventName; } - class CalendarEventInvite : ClientPacket + class CalendarInvitePkt : ClientPacket { - public CalendarEventInvite(WorldPacket packet) : base(packet) { } + public CalendarInvitePkt(WorldPacket packet) : base(packet) { } public override void Read() { @@ -285,9 +285,9 @@ namespace Game.Networking.Packets public string Name; } - class CalendarEventRSVP : ClientPacket + class HandleCalendarRsvp : ClientPacket { - public CalendarEventRSVP(WorldPacket packet) : base(packet) { } + public HandleCalendarRsvp(WorldPacket packet) : base(packet) { } public override void Read() { @@ -502,9 +502,9 @@ namespace Game.Networking.Packets public ulong InviteID; } - class CalendarEventStatus : ClientPacket + class CalendarStatus : ClientPacket { - public CalendarEventStatus(WorldPacket packet) : base(packet) { } + public CalendarStatus(WorldPacket packet) : base(packet) { } public override void Read() { @@ -538,9 +538,9 @@ namespace Game.Networking.Packets public uint DifficultyID; } - class CalendarEventModeratorStatus : ClientPacket + class CalendarModeratorStatusQuery : ClientPacket { - public CalendarEventModeratorStatus(WorldPacket packet) : base(packet) { } + public CalendarModeratorStatusQuery(WorldPacket packet) : base(packet) { } public override void Read() { diff --git a/Source/Game/Networking/Packets/ChannelPackets.cs b/Source/Game/Networking/Packets/ChannelPackets.cs index f5b3d4549..74f98d253 100644 --- a/Source/Game/Networking/Packets/ChannelPackets.cs +++ b/Source/Game/Networking/Packets/ChannelPackets.cs @@ -115,7 +115,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBits(ChannelWelcomeMsg.GetByteCount(), 11); _worldPacket.WriteUInt32((uint)ChannelFlags); _worldPacket.WriteInt32(ChatChannelID); - _worldPacket.WriteUInt64((ulong)InstanceID); + _worldPacket.WriteUInt64(InstanceID); _worldPacket.WritePackedGuid(ChannelGUID); _worldPacket.WriteString(Channel); _worldPacket.WriteString(ChannelWelcomeMsg); @@ -123,7 +123,7 @@ namespace Game.Networking.Packets public string ChannelWelcomeMsg = ""; public int ChatChannelID; - public int InstanceID; + public ulong InstanceID; public ChannelFlags ChannelFlags; public string Channel = ""; public ObjectGuid ChannelGUID; diff --git a/Source/Game/Networking/Packets/CharacterPackets.cs b/Source/Game/Networking/Packets/CharacterPackets.cs index e43f08c35..fd59fafb8 100644 --- a/Source/Game/Networking/Packets/CharacterPackets.cs +++ b/Source/Game/Networking/Packets/CharacterPackets.cs @@ -41,9 +41,8 @@ namespace Game.Networking.Packets { _worldPacket.WriteBit(Success); _worldPacket.WriteBit(IsDeletedCharacters); - _worldPacket.WriteBit(IsTestDemonHunterCreationAllowed); - _worldPacket.WriteBit(HasDemonHunterOnRealm); - _worldPacket.WriteBit(IsDemonHunterCreationAllowed); + _worldPacket.WriteBit(IsNewPlayerRestrictionSkipped); + _worldPacket.WriteBit(IsNewPlayer); _worldPacket.WriteBit(DisabledClassesMask.HasValue); _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket.WriteInt32(Characters.Count); @@ -66,9 +65,8 @@ namespace Game.Networking.Packets public bool Success; public bool IsDeletedCharacters; // used for character undelete list - public bool IsTestDemonHunterCreationAllowed = false; //allows client to skip 1 per realm and level 70 requirements - public bool HasDemonHunterOnRealm = false; - public bool IsDemonHunterCreationAllowed = false; //used for demon hunter early access + public bool IsNewPlayerRestrictionSkipped = false; // allows client to skip new player restrictions + public bool IsNewPlayer = false; // forbids hero classes and allied races public bool IsAlliedRacesCreationAllowed = false; public int MaxCharacterLevel = 1; @@ -187,14 +185,7 @@ namespace Game.Networking.Packets data.WriteUInt8(RaceId); data.WriteUInt8((byte)ClassId); data.WriteUInt8(SexId); - data.WriteUInt8(SkinId); - data.WriteUInt8(FaceId); - data.WriteUInt8(HairStyle); - data.WriteUInt8(HairColor); - data.WriteUInt8(FacialHair); - - foreach (var display in CustomDisplay) - data.WriteUInt8(display); + data.WriteInt32(Customizations.Count); data.WriteUInt8(ExperienceLevel); data.WriteUInt32(ZoneId); @@ -219,18 +210,23 @@ namespace Game.Networking.Packets data.WriteUInt32(Unknown703); data.WriteUInt32(LastLoginVersion); data.WriteUInt32(Flags4); - data.WriteInt32(Unknown830.Count); + data.WriteInt32(MailSenders.Count); + data.WriteUInt32(OverrideSelectScreenFileDataID); + + foreach (ChrCustomizationChoice customization in Customizations) + customization.Write(data); + data.WriteBits(Name.GetByteCount(), 6); data.WriteBit(FirstLogin); data.WriteBit(BoostInProgress); data.WriteBits(unkWod61x, 5); - foreach (string str in Unknown830) + foreach (string str in MailSenders) data.WriteBits(str.GetByteCount() + 1, 6); data.FlushBits(); - foreach (string str in Unknown830) + foreach (string str in MailSenders) if (!str.IsEmpty()) data.WriteCString(str); @@ -244,12 +240,7 @@ namespace Game.Networking.Packets public byte RaceId; public Class ClassId; public byte SexId; - public byte SkinId; - public byte FaceId; - public byte HairStyle; - public byte HairColor; - public byte FacialHair; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public Array Customizations = new Array(50); public byte ExperienceLevel; public uint ZoneId; public uint MapId; @@ -265,14 +256,14 @@ namespace Game.Networking.Packets public ushort SpecID; public uint Unknown703; public uint LastLoginVersion; + public uint OverrideSelectScreenFileDataID; public uint PetCreatureDisplayId; public uint PetExperienceLevel; public uint PetCreatureFamilyId; public bool BoostInProgress; // @todo public uint[] ProfessionIds = new uint[2]; // @todo public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.BagEnd]; - public List Unknown830 = new List(); // Something with character names, same length limit as name, - // client accepts unlimited number of these in packet but only uses first 3 + public List MailSenders = new List(); public struct VisualItemInfo { @@ -280,12 +271,14 @@ namespace Game.Networking.Packets { data.WriteUInt32(DisplayId); data.WriteUInt32(DisplayEnchantId); + data.WriteInt32(ItemModifiedAppearanceID); data.WriteUInt8(InvType); data.WriteUInt8(Subclass); } public uint DisplayId; public uint DisplayEnchantId; + public int ItemModifiedAppearanceID; // also -1 is some special value public byte InvType; public byte Subclass; } @@ -328,6 +321,38 @@ namespace Game.Networking.Packets } } + class CheckCharacterNameAvailability : ClientPacket + { + public uint SequenceIndex; + public string Name; + + public CheckCharacterNameAvailability(WorldPacket packet) : base(packet) { } + + public override void Read() + { + SequenceIndex = _worldPacket.ReadUInt32(); + Name = _worldPacket.ReadString(_worldPacket.ReadBits(6)); + } + } + + class CheckCharacterNameAvailabilityResult : ServerPacket + { + public uint SequenceIndex; + public ResponseCodes Result; + + public CheckCharacterNameAvailabilityResult(uint sequenceIndex, ResponseCodes result) : base(ServerOpcodes.SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT) + { + SequenceIndex = sequenceIndex; + Result = result; + } + + public override void Write() + { + _worldPacket.WriteUInt32(SequenceIndex); + _worldPacket.WriteUInt32((uint)Result); + } + } + public class CreateCharacter : ClientPacket { public CreateCharacter(WorldPacket packet) : base(packet) { } @@ -338,23 +363,19 @@ namespace Game.Networking.Packets uint nameLength = _worldPacket.ReadBits(6); bool hasTemplateSet = _worldPacket.HasBit(); CreateInfo.IsTrialBoost = _worldPacket.HasBit(); + CreateInfo.UseNPE = _worldPacket.HasBit(); CreateInfo.RaceId = (Race)_worldPacket.ReadUInt8(); CreateInfo.ClassId = (Class)_worldPacket.ReadUInt8(); CreateInfo.Sex = (Gender)_worldPacket.ReadUInt8(); - CreateInfo.Skin = _worldPacket.ReadUInt8(); - CreateInfo.Face = _worldPacket.ReadUInt8(); - CreateInfo.HairStyle = _worldPacket.ReadUInt8(); - CreateInfo.HairColor = _worldPacket.ReadUInt8(); - CreateInfo.FacialHairStyle = _worldPacket.ReadUInt8(); - CreateInfo.OutfitId = _worldPacket.ReadUInt8(); - - for (var i = 0; i < CreateInfo.CustomDisplay.GetLimit(); ++i) - CreateInfo.CustomDisplay[i] = _worldPacket.ReadUInt8(); + var customizationCount = _worldPacket.ReadUInt32(); CreateInfo.Name = _worldPacket.ReadString(nameLength); if (CreateInfo.TemplateSet.HasValue) CreateInfo.TemplateSet.Set(_worldPacket.ReadUInt32()); + + for (var i = 0; i < customizationCount; ++i) + CreateInfo.Customizations[i].Read(_worldPacket); } public CharacterCreateInfo CreateInfo; @@ -446,14 +467,10 @@ namespace Game.Networking.Packets CustomizeInfo = new CharCustomizeInfo(); CustomizeInfo.CharGUID = _worldPacket.ReadPackedGuid(); CustomizeInfo.SexID = (Gender)_worldPacket.ReadUInt8(); - CustomizeInfo.SkinID = _worldPacket.ReadUInt8(); - CustomizeInfo.HairColorID = _worldPacket.ReadUInt8(); - CustomizeInfo.HairStyleID = _worldPacket.ReadUInt8(); - CustomizeInfo.FacialHairStyleID = _worldPacket.ReadUInt8(); - CustomizeInfo.FaceID = _worldPacket.ReadUInt8(); + var customizationCount = _worldPacket.ReadUInt32(); - for (var i = 0; i < CustomizeInfo.CustomDisplay.GetLimit(); ++i) - CustomizeInfo.CustomDisplay[i] = _worldPacket.ReadUInt8(); + for (var i = 0; i < customizationCount; ++i) + CustomizeInfo.Customizations[i].Read(_worldPacket); CustomizeInfo.CharName = _worldPacket.ReadString(_worldPacket.ReadBits(6)); } @@ -478,17 +495,11 @@ namespace Game.Networking.Packets RaceOrFactionChangeInfo.Guid = _worldPacket.ReadPackedGuid(); RaceOrFactionChangeInfo.SexID = (Gender)_worldPacket.ReadUInt8(); RaceOrFactionChangeInfo.RaceID = (Race)_worldPacket.ReadUInt8(); - - RaceOrFactionChangeInfo.SkinID = _worldPacket.ReadUInt8(); - RaceOrFactionChangeInfo.HairColorID = _worldPacket.ReadUInt8(); - RaceOrFactionChangeInfo.HairStyleID = _worldPacket.ReadUInt8(); - RaceOrFactionChangeInfo.FacialHairStyleID = _worldPacket.ReadUInt8(); - RaceOrFactionChangeInfo.FaceID = _worldPacket.ReadUInt8(); - - for (var i = 0; i < RaceOrFactionChangeInfo.CustomDisplay.GetLimit(); ++i) - RaceOrFactionChangeInfo.CustomDisplay[i] = _worldPacket.ReadUInt8(); - + var customizationCount = _worldPacket.ReadUInt32(); RaceOrFactionChangeInfo.Name = _worldPacket.ReadString(nameLength); + + for (var i = 0; i < customizationCount; ++i) + RaceOrFactionChangeInfo.Customizations[i].Read(_worldPacket); } public CharRaceOrFactionChangeInfo RaceOrFactionChangeInfo; @@ -512,14 +523,11 @@ namespace Game.Networking.Packets { _worldPacket.WriteBits(Display.Value.Name.GetByteCount(), 6); _worldPacket.WriteUInt8(Display.Value.SexID); - _worldPacket.WriteUInt8(Display.Value.SkinID); - _worldPacket.WriteUInt8(Display.Value.HairColorID); - _worldPacket.WriteUInt8(Display.Value.HairStyleID); - _worldPacket.WriteUInt8(Display.Value.FacialHairStyleID); - _worldPacket.WriteUInt8(Display.Value.FaceID); _worldPacket.WriteUInt8(Display.Value.RaceID); - Display.Value.CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id)); _worldPacket.WriteString(Display.Value.Name); + + foreach (ChrCustomizationChoice customization in Display.Value.Customizations) + customization.Write(_worldPacket); } } @@ -531,13 +539,8 @@ namespace Game.Networking.Packets { public string Name; public byte SexID; - public byte SkinID; - public byte HairColorID; - public byte HairStyleID; - public byte FacialHairStyleID; - public byte FaceID; public byte RaceID; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public Array Customizations = new Array(50); } } @@ -587,7 +590,7 @@ namespace Game.Networking.Packets } } - public ReorderInfo[] Entries = new ReorderInfo[WorldConfig.GetIntValue(WorldCfg.CharactersPerRealm)]; + public ReorderInfo[] Entries = new ReorderInfo[200]; public struct ReorderInfo { @@ -660,7 +663,7 @@ namespace Game.Networking.Packets } public ObjectGuid Guid; // Guid of the player that is logging in - float FarClip; // Visibility distance (for terrain) + public float FarClip; // Visibility distance (for terrain) } public class LoginVerifyWorld : ServerPacket @@ -706,7 +709,7 @@ namespace Game.Networking.Packets IdleLogout = _worldPacket.HasBit(); } - bool IdleLogout; + public bool IdleLogout; } public class LogoutResponse : ServerPacket @@ -755,8 +758,8 @@ namespace Game.Networking.Packets Showing = _worldPacket.HasBit(); } - int MapID = -1; - bool Showing; + public int MapID = -1; + public bool Showing; } public class InitialSetup : ServerPacket @@ -832,22 +835,15 @@ namespace Game.Networking.Packets public override void Read() { - NewHairStyle = _worldPacket.ReadUInt32(); - NewHairColor = _worldPacket.ReadUInt32(); - NewFacialHair = _worldPacket.ReadUInt32(); - NewSkinColor = _worldPacket.ReadUInt32(); - NewFace = _worldPacket.ReadUInt32(); + var customizationCount = _worldPacket.ReadUInt32(); + NewSex = _worldPacket.ReadUInt8(); - for (var i = 0; i < NewCustomDisplay.GetLimit(); ++i) - NewCustomDisplay[i] = _worldPacket.ReadUInt32(); + for (var i = 0; i < customizationCount; ++i) + Customizations[i].Read(_worldPacket); } - public uint NewHairStyle; - public uint NewHairColor; - public uint NewFacialHair; - public uint NewSkinColor; - public uint NewFace; - public Array NewCustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public byte NewSex; + public Array Customizations = new Array(50); } public class BarberShopResult : ServerPacket @@ -975,25 +971,18 @@ namespace Game.Networking.Packets { CharGUID = customizeInfo.CharGUID; SexID = (byte)customizeInfo.SexID; - SkinID = customizeInfo.SkinID; - HairColorID = customizeInfo.HairColorID; - HairStyleID = customizeInfo.HairStyleID; - FacialHairStyleID = customizeInfo.FacialHairStyleID; - FaceID = customizeInfo.FaceID; CharName = customizeInfo.CharName; - CustomDisplay = customizeInfo.CustomDisplay; + Customizations = customizeInfo.Customizations; } public override void Write() { _worldPacket.WritePackedGuid(CharGUID); _worldPacket.WriteUInt8(SexID); - _worldPacket.WriteUInt8(SkinID); - _worldPacket.WriteUInt8(HairColorID); - _worldPacket.WriteUInt8(HairStyleID); - _worldPacket.WriteUInt8(FacialHairStyleID); - _worldPacket.WriteUInt8(FaceID); - CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id)); + _worldPacket.WriteInt32(Customizations.Count); + foreach (ChrCustomizationChoice customization in Customizations) + customization.Write(_worldPacket); + _worldPacket.WriteBits(CharName.GetByteCount(), 6); _worldPacket.FlushBits(); _worldPacket.WriteString(CharName); @@ -1002,12 +991,7 @@ namespace Game.Networking.Packets ObjectGuid CharGUID; string CharName = ""; byte SexID; - byte SkinID; - byte HairColorID; - byte HairStyleID; - byte FacialHairStyleID; - byte FaceID; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + Array Customizations = new Array(50); } class CharCustomizeFailure : ServerPacket @@ -1063,21 +1047,40 @@ namespace Game.Networking.Packets } //Structs + public struct ChrCustomizationChoice + { + public uint ChrCustomizationOptionID; + public uint ChrCustomizationChoiceID; + + public ChrCustomizationChoice(uint chrCustomizationOptionID, uint chrCustomizationChoiceID) + { + ChrCustomizationOptionID = chrCustomizationOptionID; + ChrCustomizationChoiceID = chrCustomizationChoiceID; + } + + public void Write(WorldPacket data) + { + data.WriteUInt32(ChrCustomizationOptionID); + data.WriteUInt32(ChrCustomizationChoiceID); + } + + public void Read(WorldPacket data) + { + ChrCustomizationOptionID = data.ReadUInt32(); + ChrCustomizationChoiceID = data.ReadUInt32(); + } + } + public class CharacterCreateInfo { // User specified variables public Race RaceId = Race.None; public Class ClassId = Class.None; public Gender Sex = Gender.None; - public byte Skin; - public byte Face; - public byte HairStyle; - public byte HairColor; - public byte FacialHairStyle; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); - public byte OutfitId; + public Array Customizations = new Array(50); public Optional TemplateSet = new Optional(); public bool IsTrialBoost; + public bool UseNPE; public string Name; // Server side data @@ -1092,30 +1095,20 @@ namespace Game.Networking.Packets public class CharCustomizeInfo { - public byte HairStyleID; - public byte FaceID; public ObjectGuid CharGUID; public Gender SexID = Gender.None; public string CharName; - public byte HairColorID; - public byte FacialHairStyleID; - public byte SkinID; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public Array Customizations = new Array(50); } public class CharRaceOrFactionChangeInfo { - public byte HairColorID; public Race RaceID = Race.None; public Gender SexID = Gender.None; - public byte SkinID; - public byte FacialHairStyleID; public ObjectGuid Guid; public bool FactionChange; public string Name; - public byte FaceID; - public byte HairStyleID; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public Array Customizations = new Array(50); } public class CharacterUndeleteInfo diff --git a/Source/Game/Networking/Packets/ChatPackets.cs b/Source/Game/Networking/Packets/ChatPackets.cs index 970a9bb62..44fdec984 100644 --- a/Source/Game/Networking/Packets/ChatPackets.cs +++ b/Source/Game/Networking/Packets/ChatPackets.cs @@ -224,7 +224,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBits(Prefix.GetByteCount(), 5); _worldPacket.WriteBits(Channel.GetByteCount(), 7); _worldPacket.WriteBits(ChatText.GetByteCount(), 12); - _worldPacket.WriteBits((byte)_ChatFlags, 11); + _worldPacket.WriteBits((byte)_ChatFlags, 14); _worldPacket.WriteBit(HideChatLog); _worldPacket.WriteBit(FakeSenderName); _worldPacket.WriteBit(Unused_801.HasValue); diff --git a/Source/Game/Networking/Packets/ClientConfigPackets.cs b/Source/Game/Networking/Packets/ClientConfigPackets.cs index 0daf51a8f..ef35b638d 100644 --- a/Source/Game/Networking/Packets/ClientConfigPackets.cs +++ b/Source/Game/Networking/Packets/ClientConfigPackets.cs @@ -18,6 +18,7 @@ using Framework.Constants; using Framework.IO; using Game.Entities; +using System.Collections.Generic; namespace Game.Networking.Packets { @@ -29,13 +30,13 @@ namespace Game.Networking.Packets { _worldPacket.WritePackedGuid(PlayerGuid); _worldPacket.WriteUInt32(ServerTime); - for (int i = 0; i < (int)AccountDataTypes.Max; ++i) - _worldPacket.WriteUInt32(AccountTimes[i]); + foreach (var accounttime in AccountTimes) + _worldPacket.WriteUInt32(accounttime); } public ObjectGuid PlayerGuid; public uint ServerTime = 0; - public uint[] AccountTimes = new uint[(int)AccountDataTypes.Max]; + public Array AccountTimes = new Array((int)AccountDataTypes.Max); } public class ClientCacheVersion : ServerPacket diff --git a/Source/Game/Networking/Packets/CombatLogPackets.cs b/Source/Game/Networking/Packets/CombatLogPackets.cs index 9e5016de0..057987b11 100644 --- a/Source/Game/Networking/Packets/CombatLogPackets.cs +++ b/Source/Game/Networking/Packets/CombatLogPackets.cs @@ -66,7 +66,7 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(CasterGUID); _worldPacket.WritePackedGuid(CastID); _worldPacket.WriteInt32(SpellID); - _worldPacket.WriteInt32(SpellXSpellVisualID); + Visual.Write(_worldPacket); _worldPacket.WriteInt32(Damage); _worldPacket.WriteInt32(OriginalDamage); _worldPacket.WriteInt32(Overkill); @@ -90,7 +90,7 @@ namespace Game.Networking.Packets public ObjectGuid CasterGUID; public ObjectGuid CastID; public int SpellID; - public int SpellXSpellVisualID; + public SpellCastVisual Visual; public int Damage; public int OriginalDamage; public int Overkill = -1; @@ -578,8 +578,8 @@ namespace Game.Networking.Packets attackRoundInfo.WriteUInt8(ContentTuning.TargetMaxScalingLevel); attackRoundInfo.WriteInt16(ContentTuning.PlayerLevelDelta); attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta); - attackRoundInfo.WriteUInt16(ContentTuning.PlayerItemLevel); - attackRoundInfo.WriteUInt16(ContentTuning.TargetItemLevel); + attackRoundInfo.WriteFloat(ContentTuning.PlayerItemLevel); + attackRoundInfo.WriteFloat(ContentTuning.TargetItemLevel); attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID); attackRoundInfo.WriteUInt8((byte)(ContentTuning.ScalesWithItemLevel ? 1 : 0)); diff --git a/Source/Game/Networking/Packets/EquipmentPackets.cs b/Source/Game/Networking/Packets/EquipmentPackets.cs index c51e6391a..9dac10268 100644 --- a/Source/Game/Networking/Packets/EquipmentPackets.cs +++ b/Source/Game/Networking/Packets/EquipmentPackets.cs @@ -62,6 +62,9 @@ namespace Game.Networking.Packets foreach (var id in equipSet.Enchants) _worldPacket.WriteInt32(id); + _worldPacket.WriteInt32(equipSet.Unknown901_1); + _worldPacket.WriteInt32(equipSet.Unknown901_2); + _worldPacket.WriteBit(equipSet.AssignedSpecIndex != -1); _worldPacket.WriteBits(equipSet.SetName.GetByteCount(), 8); _worldPacket.WriteBits(equipSet.SetIcon.GetByteCount(), 9); @@ -100,6 +103,9 @@ namespace Game.Networking.Packets Set.Enchants[0] = _worldPacket.ReadInt32(); Set.Enchants[1] = _worldPacket.ReadInt32(); + Set.Unknown901_1 = _worldPacket.ReadInt32(); + Set.Unknown901_2 = _worldPacket.ReadInt32(); + bool hasSpecIndex = _worldPacket.HasBit(); uint setNameLength = _worldPacket.ReadBits(8); diff --git a/Source/Game/Networking/Packets/GarrisonPackets.cs b/Source/Game/Networking/Packets/GarrisonPackets.cs index ba4f4e7df..9f7cb1f4b 100644 --- a/Source/Game/Networking/Packets/GarrisonPackets.cs +++ b/Source/Game/Networking/Packets/GarrisonPackets.cs @@ -20,6 +20,7 @@ using Game.DataStorage; using Game.Entities; using System; using System.Collections.Generic; +using Framework.Dynamic; namespace Game.Networking.Packets { @@ -223,25 +224,25 @@ namespace Game.Networking.Packets public List BlueprintsKnown = null; } - class GarrisonGetBuildingLandmarks : ClientPacket + class GarrisonGetMapData : ClientPacket { - public GarrisonGetBuildingLandmarks(WorldPacket packet) : base(packet) { } + public GarrisonGetMapData(WorldPacket packet) : base(packet) { } public override void Read() { } } - class GarrisonBuildingLandmarks : ServerPacket + class GarrisonMapDataResponse : ServerPacket { - public GarrisonBuildingLandmarks() : base(ServerOpcodes.GarrisonBuildingLandmarks, ConnectionType.Instance) { } + public GarrisonMapDataResponse() : base(ServerOpcodes.GarrisonBuildingLandmarks, ConnectionType.Instance) { } public override void Write() { - _worldPacket.WriteInt32(Landmarks.Count); - foreach (GarrisonBuildingLandmark landmark in Landmarks) + _worldPacket.WriteInt32(Buildings.Count); + foreach (GarrisonBuildingMapData landmark in Buildings) landmark.Write(_worldPacket); } - public List Landmarks = new List(); + public List Buildings = new List(); } class GarrisonPlotPlaced : ServerPacket @@ -369,6 +370,9 @@ namespace Game.Networking.Packets data.WriteInt32(AbilityID.Count); data.WriteUInt32(ZoneSupportSpellID); data.WriteUInt32(FollowerStatus); + data.WriteInt32(Health); + data .WriteInt8(BoardIndex); + data .WriteInt32(HealingTimestamp); AbilityID.ForEach(ability => data.WriteUInt32(ability.Id)); @@ -390,6 +394,9 @@ namespace Game.Networking.Packets public List AbilityID = new List(); public uint ZoneSupportSpellID; public uint FollowerStatus; + public int Health; + public int HealingTimestamp; + public sbyte BoardIndex; public string CustomName = ""; } @@ -405,8 +412,9 @@ namespace Game.Networking.Packets data.WriteUInt32(TravelDuration); data.WriteUInt32(MissionDuration); data.WriteUInt32(MissionState); - data.WriteUInt32(Unknown1); - data.WriteUInt32(Unknown2); + data.WriteUInt32(SuccessChance); + data.WriteUInt32(Flags); + data.WriteFloat(MissionScalar); } public ulong DbID; @@ -417,8 +425,9 @@ namespace Game.Networking.Packets public uint TravelDuration; public uint MissionDuration; public uint MissionState; - public uint Unknown1 = 0; - public uint Unknown2 = 0; + public uint SuccessChance; + public uint Flags; + public float MissionScalar = 1.0f; } struct GarrisonMissionReward @@ -455,6 +464,18 @@ namespace Game.Networking.Packets public long StartTime; } + struct GarrisonTalentSocketData + { + public int SoulbindConduitID; + public int SoulbindConduitRank; + + public void Write(WorldPacket data) + { + data.WriteInt32(SoulbindConduitID); + data.WriteInt32(SoulbindConduitRank); + } + } + struct GarrisonTalent { public void Write(WorldPacket data) @@ -463,12 +484,70 @@ namespace Game.Networking.Packets data.WriteInt32(Rank); data.WriteUInt32((uint)ResearchStartTime); data.WriteInt32(Flags); + data.WriteBit(Socket.HasValue); + data.FlushBits(); + + if (Socket.HasValue) + Socket.Value.Write(data); } public int GarrTalentID; public int Rank; public long ResearchStartTime; public int Flags; + public Optional Socket; + } + + struct GarrisonCollectionEntry + { + public int EntryID; + public int Rank; + + public void Write(WorldPacket data) + { + data.WriteInt32(EntryID); + data.WriteInt32(Rank); + } + } + + class GarrisonCollection + { + public int Type; + public List Entries = new List(); + + public void Write(WorldPacket data) + { + data.WriteInt32(Type); + data.WriteInt32(Entries.Count); + foreach (GarrisonCollectionEntry collectionEntry in Entries) + collectionEntry.Write(data); + } + } + + struct GarrisonEventEntry + { + public int EntryID; + public int EventValue; + + public void Write(WorldPacket data) + { + data.WriteInt32(EntryID); + data.WriteInt32(EventValue); + } + } + + class GarrisonEventList + { + public int Type; + public List Events = new List(); + + public void Write(WorldPacket data) + { + data.WriteInt32(Type); + data.WriteInt32(Events.Count); + foreach (GarrisonEventEntry eventEntry in Events) + eventEntry.Write(data); + } } class GarrisonInfo @@ -481,11 +560,14 @@ namespace Game.Networking.Packets data.WriteInt32(Buildings.Count); data.WriteInt32(Plots.Count); data.WriteInt32(Followers.Count); + data.WriteInt32(AutoTroops.Count); data.WriteInt32(Missions.Count); data.WriteInt32(MissionRewards.Count); data.WriteInt32(MissionOvermaxRewards.Count); data.WriteInt32(MissionAreaBonuses.Count); data.WriteInt32(Talents.Count); + data.WriteInt32(Collections.Count); + data.WriteInt32(EventLists.Count); data.WriteInt32(CanStartMission.Count); data.WriteInt32(ArchivedMissions.Count); data.WriteUInt32(NumFollowerActivationsRemaining); @@ -514,11 +596,14 @@ namespace Game.Networking.Packets foreach (GarrisonMissionBonusAbility areaBonus in MissionAreaBonuses) areaBonus.Write(data); - foreach (GarrisonTalent talent in Talents) - talent.Write(data); + foreach (GarrisonCollection collection in Collections) + collection.Write(data); - foreach(var id in ArchivedMissions) - data.WriteInt32(id); + foreach (GarrisonEventList eventList in EventLists) + eventList.Write(data); + + foreach (var id in ArchivedMissions) + data.WriteInt32(id); foreach (GarrisonBuildingInfo building in Buildings) building.Write(data); @@ -530,6 +615,12 @@ namespace Game.Networking.Packets foreach (GarrisonFollower follower in Followers) follower.Write(data); + + foreach (GarrisonFollower follower in AutoTroops) + follower.Write(data); + + foreach (GarrisonTalent talent in Talents) + talent.Write(data); } public GarrisonType GarrTypeID; @@ -540,11 +631,14 @@ namespace Game.Networking.Packets public List Plots = new List(); public List Buildings = new List(); public List Followers = new List(); + public List AutoTroops = new List(); public List Missions = new List(); public List> MissionRewards = new List>(); public List> MissionOvermaxRewards = new List>(); public List MissionAreaBonuses = new List(); public List Talents = new List(); + public List Collections = new List(); + public List EventLists = new List(); public List CanStartMission = new List(); public List ArchivedMissions = new List(); } @@ -593,9 +687,9 @@ namespace Game.Networking.Packets public List Buildings = new List(); } - struct GarrisonBuildingLandmark + struct GarrisonBuildingMapData { - public GarrisonBuildingLandmark(uint buildingPlotInstId, Position pos) + public GarrisonBuildingMapData(uint buildingPlotInstId, Position pos) { GarrBuildingPlotInstID = buildingPlotInstId; Pos = pos; diff --git a/Source/Game/Networking/Packets/GuildPackets.cs b/Source/Game/Networking/Packets/GuildPackets.cs index ee5dba1ed..5cd7c68e2 100644 --- a/Source/Game/Networking/Packets/GuildPackets.cs +++ b/Source/Game/Networking/Packets/GuildPackets.cs @@ -278,9 +278,9 @@ namespace Game.Networking.Packets public string OldGuildName; } - public class GuildEventAwayChange : ServerPacket + public class GuildEventStatusChange : ServerPacket { - public GuildEventAwayChange() : base(ServerOpcodes.GuildEventAwayChange) { } + public GuildEventStatusChange() : base(ServerOpcodes.GuildEventAwayChange) { } public override void Write() { @@ -426,7 +426,6 @@ namespace Game.Networking.Packets { _worldPacket.WriteBit(Removed); _worldPacket.WriteBits(LeaverName.GetByteCount(), 6); - _worldPacket.FlushBits(); if (Removed) { diff --git a/Source/Game/Networking/Packets/HotfixPackets.cs b/Source/Game/Networking/Packets/HotfixPackets.cs index 6f060507f..1613325f0 100644 --- a/Source/Game/Networking/Packets/HotfixPackets.cs +++ b/Source/Game/Networking/Packets/HotfixPackets.cs @@ -63,7 +63,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(TableHash); _worldPacket.WriteUInt32(RecordID); _worldPacket.WriteUInt32(Timestamp); - _worldPacket.WriteBit(Allow); + _worldPacket.WriteBits(Status, 2); _worldPacket.WriteUInt32(Data.GetSize()); _worldPacket.WriteBytes(Data.GetData()); } @@ -71,7 +71,7 @@ namespace Game.Networking.Packets public uint TableHash; public uint Timestamp; public uint RecordID; - public bool Allow; + public byte Status = 3; public ByteBuffer Data = new ByteBuffer(); } @@ -147,12 +147,12 @@ namespace Game.Networking.Packets if (Size.HasValue) { data.WriteUInt32(Size.Value); - data.WriteBit(true); + data.WriteBits(1, 2); } else { data.WriteUInt32(0); - data.WriteBit(false); + data.WriteBits(3, 2); } data.FlushBits(); } diff --git a/Source/Game/Networking/Packets/InspectPackets.cs b/Source/Game/Networking/Packets/InspectPackets.cs index f4161f862..27e7c49e2 100644 --- a/Source/Game/Networking/Packets/InspectPackets.cs +++ b/Source/Game/Networking/Packets/InspectPackets.cs @@ -224,14 +224,9 @@ namespace Game.Networking.Packets public string Name; public uint SpecializationID; public byte GenderID; - public byte Skin; - public byte HairColor; - public byte HairStyle; - public byte FacialHairStyle; - public byte Face; public byte Race; public byte ClassID; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public List Customizations = new List(); public void Initialize(Player player) { @@ -239,14 +234,11 @@ namespace Game.Networking.Packets SpecializationID = player.GetPrimarySpecialization(); Name = player.GetName(); GenderID = player.m_playerData.NativeSex; - Skin = player.m_playerData.SkinID; - HairColor = player.m_playerData.HairColorID; - HairStyle = player.m_playerData.HairStyleID; - FacialHairStyle = player.m_playerData.FacialHairStyleID; - Face = player.m_playerData.FaceID; Race = (byte)player.GetRace(); ClassID = (byte)player.GetClass(); - CustomDisplay.AddRange(player.m_playerData.CustomDisplayOption._values); + + foreach (var customization in player.m_playerData.Customizations) + Customizations.Add(new ChrCustomizationChoice(customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID)); for (byte i = 0; i < EquipmentSlot.End; ++i) { @@ -263,17 +255,14 @@ namespace Game.Networking.Packets data.WriteInt32(Items.Count); data.WriteBits(Name.GetByteCount(), 6); data.WriteUInt8(GenderID); - data.WriteUInt8(Skin); - data.WriteUInt8(HairColor); - data.WriteUInt8(HairStyle); - data.WriteUInt8(FacialHairStyle); - data.WriteUInt8(Face); data.WriteUInt8(Race); data.WriteUInt8(ClassID); - CustomDisplay.ForEach(id => data.WriteUInt8(id)); - + data.WriteInt32(Customizations.Count); data.WriteString(Name); + foreach (var customization in Customizations) + customization.Write(data); + foreach (InspectItemData item in Items) item.Write(data); } diff --git a/Source/Game/Networking/Packets/ItemPackets.cs b/Source/Game/Networking/Packets/ItemPackets.cs index d580eb35f..9d31cf3ee 100644 --- a/Source/Game/Networking/Packets/ItemPackets.cs +++ b/Source/Game/Networking/Packets/ItemPackets.cs @@ -52,7 +52,7 @@ namespace Game.Networking.Packets Muid = _worldPacket.ReadUInt32(); Slot = _worldPacket.ReadUInt32(); Item.Read(_worldPacket); - ItemType = (ItemVendorType)_worldPacket.ReadBits(2); + ItemType = (ItemVendorType)_worldPacket.ReadBits(3); } public ObjectGuid VendorGUID; @@ -678,7 +678,7 @@ namespace Game.Networking.Packets } //Structs - public class ItemBonusInstanceData + public class ItemBonuses { public void Write(WorldPacket data) { @@ -708,13 +708,13 @@ namespace Game.Networking.Packets public override bool Equals(object obj) { - if (obj is ItemBonusInstanceData) - return (ItemBonusInstanceData)obj == this; + if (obj is ItemBonuses) + return (ItemBonuses)obj == this; return false; } - public static bool operator ==(ItemBonusInstanceData left, ItemBonusInstanceData right) + public static bool operator ==(ItemBonuses left, ItemBonuses right) { if (left.Context != right.Context) return false; @@ -725,7 +725,7 @@ namespace Game.Networking.Packets return left.BonusListIDs.SequenceEqual(right.BonusListIDs); } - public static bool operator !=(ItemBonusInstanceData left, ItemBonusInstanceData right) + public static bool operator !=(ItemBonuses left, ItemBonuses right) { return !(left == right); } @@ -734,8 +734,118 @@ namespace Game.Networking.Packets public List BonusListIDs = new List(); } + public class ItemMod + { + public uint Value; + public ItemModifier Type; + + public ItemMod() + { + Type = ItemModifier.Max; + } + public ItemMod(uint value, ItemModifier type) + { + Value = value; + Type = type; + } + + public void Read(WorldPacket data) + { + Value = data.ReadUInt32(); + Type = (ItemModifier)data.ReadUInt8(); + } + + public void Write(WorldPacket data) + { + data.WriteUInt32(Value); + data.WriteUInt8((byte)Type); + } + + public override int GetHashCode() + { + return Value.GetHashCode() ^ Type.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (obj is ItemMod) + return (ItemMod)obj == this; + + return false; + } + + public static bool operator ==(ItemMod left, ItemMod right) + { + if (left.Value != right.Value) + return false; + + return left.Type != right.Type; + } + + public static bool operator !=(ItemMod left, ItemMod right) + { + return !(left == right); + } + } + + public class ItemModList + { + public Array Values = new Array(ItemModifier.Max); + + public void Read(WorldPacket data) + { + var itemModListCount = data.ReadBits(6); + + for (var i = 0; i < itemModListCount; ++i) + { + var itemMod = new ItemMod(); + itemMod.Read(data); + Values[i] = itemMod; + } + } + + public void Write(WorldPacket data) + { + data.WriteBits(Values.Count, 6); + data.FlushBits(); + + foreach (ItemMod itemMod in Values) + itemMod.Write(data); + } + + public override int GetHashCode() + { + return Values.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (obj is ItemModList) + return (ItemModList)obj == this; + + return false; + } + + public static bool operator ==(ItemModList left, ItemModList right) + { + if (left.Values.Count != right.Values.Count) + return false; + + return !left.Values.Except(right.Values).Any(); + } + + public static bool operator !=(ItemModList left, ItemModList right) + { + return !(left == right); + } + } + public class ItemInstance { + public uint ItemID; + public Optional ItemBonus; + public ItemModList Modifications = new ItemModList(); + public ItemInstance() { } public ItemInstance(Item item) @@ -749,17 +859,8 @@ namespace Game.Networking.Packets ItemBonus.Value.Context = item.GetContext(); } - uint mask = item.m_itemData.ModifiersMask; - if (mask != 0) - { - Modifications.HasValue = true; - - for (int i = 0; mask != 0; mask >>= 1, ++i) - { - if ((mask & 1) != 0) - Modifications.Value.Insert(i, (int)item.GetModifier((ItemModifier)i)); - } - } + foreach (var mod in item.m_itemData.Modifiers.Values) + Modifications.Values.Add(mod.Value, (ItemModifier)mod.Type); } public ItemInstance(Loots.LootItem lootItem) @@ -780,14 +881,11 @@ namespace Game.Networking.Packets { ItemID = voidItem.ItemEntry; - if (voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0) - { - Modifications.HasValue = true; - if (voidItem.FixedScalingLevel != 0) - Modifications.Value.Insert((int)ItemModifier.TimewalkerLevel, (int)voidItem.FixedScalingLevel); - if (voidItem.ArtifactKnowledgeLevel != 0) - Modifications.Value.Insert((int)ItemModifier.ArtifactKnowledgeLevel, (int)voidItem.ArtifactKnowledgeLevel); - } + if (voidItem.FixedScalingLevel != 0) + Modifications.Values.Add(new ItemMod(voidItem.FixedScalingLevel, ItemModifier.TimewalkerLevel)); + + if (voidItem.ArtifactKnowledgeLevel != 0) + Modifications.Values.Add(new ItemMod(voidItem.ArtifactKnowledgeLevel, ItemModifier.ArtifactKnowledgeLevel)); if (!voidItem.BonusListIDs.Empty()) { @@ -801,7 +899,7 @@ namespace Game.Networking.Packets { ItemID = gem.ItemId; - ItemBonusInstanceData bonus = new ItemBonusInstanceData(); + ItemBonuses bonus = new ItemBonuses(); bonus.Context = (ItemContext)(byte)gem.Context; foreach (ushort bonusListId in gem.BonusListIDs) if (bonusListId != 0) @@ -816,14 +914,12 @@ namespace Game.Networking.Packets data.WriteUInt32(ItemID); data.WriteBit(ItemBonus.HasValue); - data.WriteBit(Modifications.HasValue); data.FlushBits(); + Modifications.Write(data); + if (ItemBonus.HasValue) ItemBonus.Value.Write(data); - - if (Modifications.HasValue) - Modifications.Value.Write(data); } public void Read(WorldPacket data) @@ -831,14 +927,12 @@ namespace Game.Networking.Packets ItemID = data.ReadUInt32(); ItemBonus.HasValue = data.HasBit(); - Modifications.HasValue = data.HasBit(); data.ResetBitPos(); + Modifications.Read(data); + if (ItemBonus.HasValue) ItemBonus.Value.Read(data); - - if (Modifications.HasValue) - Modifications.Value.Read(data); } public override int GetHashCode() @@ -859,10 +953,10 @@ namespace Game.Networking.Packets if (left.ItemID != right.ItemID) return false; - if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue) + if (left.ItemBonus.HasValue != right.ItemBonus.HasValue) return false; - if (left.Modifications.HasValue && left.Modifications.Value != right.Modifications.Value) + if (left.Modifications != right.Modifications) return false; if (left.ItemBonus.HasValue && left.ItemBonus.Value != right.ItemBonus.Value) @@ -875,10 +969,6 @@ namespace Game.Networking.Packets { return !(left == right); } - - public uint ItemID; - public Optional ItemBonus; - public Optional Modifications; } public class ItemEnchantData diff --git a/Source/Game/Networking/Packets/LFGPackets.cs b/Source/Game/Networking/Packets/LFGPackets.cs index e2a54e6e4..c52cc3e25 100644 --- a/Source/Game/Networking/Packets/LFGPackets.cs +++ b/Source/Game/Networking/Packets/LFGPackets.cs @@ -278,7 +278,7 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(BlackList.Count); _worldPacket.WriteInt32(BlackListNames.Count); - foreach (LFGJoinBlackList blackList in BlackList) + foreach (LFGBlackListPkt blackList in BlackList) blackList.Write(_worldPacket); foreach (string str in BlackListNames) @@ -292,7 +292,7 @@ namespace Game.Networking.Packets public RideTicket Ticket = new RideTicket(); public byte Result; public byte ResultDetail; - public List BlackList = new List(); + public List BlackList = new List(); public List BlackListNames = new List(); } @@ -440,23 +440,37 @@ namespace Game.Networking.Packets //Structs public class LFGBlackListSlot - { - public LFGBlackListSlot(uint slot, uint reason, int subReason1, int subReason2) + { + public uint Slot; + public uint Reason; + public int SubReason1; + public int SubReason2; + public uint SoftLock; + + public LFGBlackListSlot(uint slot, uint reason, int subReason1, int subReason2, uint softLock) { Slot = slot; Reason = reason; SubReason1 = subReason1; SubReason2 = subReason2; + SoftLock = softLock; } - public uint Slot { get; set; } - public uint Reason { get; set; } - public int SubReason1 { get; set; } - public int SubReason2 { get; set; } + public void Write(WorldPacket data) + { + data.WriteUInt32(Slot); + data.WriteUInt32(Reason); + data.WriteInt32(SubReason1); + data.WriteInt32(SubReason2); + data.WriteUInt32(SoftLock); + } } public class LFGBlackList - { + { + public Optional PlayerGuid; + public List Slot = new List(); + public void Write(WorldPacket data) { data.WriteBit(PlayerGuid.HasValue); @@ -464,17 +478,9 @@ namespace Game.Networking.Packets if (PlayerGuid.HasValue) data.WritePackedGuid(PlayerGuid.Value); - foreach (LFGBlackListSlot lfgBlackListSlot in Slot) - { - data.WriteUInt32(lfgBlackListSlot.Slot); - data.WriteUInt32(lfgBlackListSlot.Reason); - data.WriteInt32(lfgBlackListSlot.SubReason1); - data.WriteInt32(lfgBlackListSlot.SubReason2); - } + foreach (LFGBlackListSlot slot in Slot) + slot.Write(data); } - - public Optional PlayerGuid; - public List Slot = new List(); } public struct LfgPlayerQuestRewardItem @@ -639,40 +645,22 @@ namespace Game.Networking.Packets public bool RoleCheckComplete; } - public struct LFGJoinBlackListSlot - { - public LFGJoinBlackListSlot(int slot, int reason, int subReason1, int subReason2) - { - Slot = slot; - Reason = reason; - SubReason1 = subReason1; - SubReason2 = subReason2; - } - - public int Slot { get; set; } - public int Reason { get; set; } - public int SubReason1 { get; set; } - public int SubReason2 { get; set; } - } - - public class LFGJoinBlackList + public class LFGBlackListPkt { public void Write(WorldPacket data) { - data.WritePackedGuid(PlayerGuid); - data.WriteInt32(Slots.Count); + data.WriteBit(PlayerGuid.HasValue); + data.WriteInt32(Slot.Count); - foreach (LFGJoinBlackListSlot lfgBlackListSlot in Slots) - { - data.WriteInt32(lfgBlackListSlot.Slot); - data.WriteInt32(lfgBlackListSlot.Reason); - data.WriteInt32(lfgBlackListSlot.SubReason1); - data.WriteInt32(lfgBlackListSlot.SubReason2); - } + if (PlayerGuid.HasValue) + data.WritePackedGuid(PlayerGuid.Value); + + foreach (LFGBlackListSlot slot in Slot) + slot.Write(data); } - public ObjectGuid PlayerGuid; - public List Slots = new List(); + public Optional PlayerGuid; + public List Slot = new List(); } public struct LFGPlayerRewards diff --git a/Source/Game/Networking/Packets/MiscPackets.cs b/Source/Game/Networking/Packets/MiscPackets.cs index 9e63fa089..2152871a1 100644 --- a/Source/Game/Networking/Packets/MiscPackets.cs +++ b/Source/Game/Networking/Packets/MiscPackets.cs @@ -124,6 +124,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(WeeklyQuantity.HasValue); _worldPacket.WriteBit(TrackedQuantity.HasValue); _worldPacket.WriteBit(MaxQuantity.HasValue); + _worldPacket.WriteBit(Unused901.HasValue); _worldPacket.WriteBit(SuppressChatLog); _worldPacket.WriteBit(QuantityChange.HasValue); _worldPacket.WriteBit(QuantityGainSource.HasValue); @@ -139,6 +140,9 @@ namespace Game.Networking.Packets if (MaxQuantity.HasValue) _worldPacket.WriteInt32(MaxQuantity.Value); + if (Unused901.HasValue) + _worldPacket.WriteInt32(Unused901.Value); + if (QuantityChange.HasValue) _worldPacket.WriteInt32(QuantityChange.Value); @@ -155,6 +159,7 @@ namespace Game.Networking.Packets public Optional WeeklyQuantity; public Optional TrackedQuantity; public Optional MaxQuantity; + public Optional Unused901; public Optional QuantityChange; public Optional QuantityGainSource; public Optional QuantityLostSource; @@ -204,6 +209,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(data.MaxWeeklyQuantity.HasValue); _worldPacket.WriteBit(data.TrackedQuantity.HasValue); _worldPacket.WriteBit(data.MaxQuantity.HasValue); + _worldPacket.WriteBit(data.Unused901.HasValue); _worldPacket.WriteBits(data.Flags, 5); _worldPacket.FlushBits(); @@ -215,6 +221,8 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(data.TrackedQuantity.Value); if (data.MaxQuantity.HasValue) _worldPacket.WriteInt32(data.MaxQuantity.Value); + if (data.Unused901.HasValue) + _worldPacket.WriteInt32(data.Unused901.Value); } } @@ -228,6 +236,7 @@ namespace Game.Networking.Packets public Optional MaxWeeklyQuantity; // Weekly Currency cap. public Optional TrackedQuantity; public Optional MaxQuantity; + public Optional Unused901; public byte Flags; // 0 = none, } } @@ -366,7 +375,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(RestrictedAccountMaxLevel.Value); if (RestrictedAccountMaxMoney.HasValue) - _worldPacket.WriteUInt32(RestrictedAccountMaxMoney.Value); + _worldPacket.WriteUInt64(RestrictedAccountMaxMoney.Value); if (InstanceGroupSize.HasValue) _worldPacket.WriteUInt32(InstanceGroupSize.Value); @@ -378,7 +387,7 @@ namespace Game.Networking.Packets public bool BlockExitingLoadingScreen; // when set to true, sending SMSG_UPDATE_OBJECT with CreateObject Self bit = true will not hide loading screen // instead it will be done after this packet is sent again with false in this bit and SMSG_UPDATE_OBJECT Values for player public Optional RestrictedAccountMaxLevel; - public Optional RestrictedAccountMaxMoney; + public Optional RestrictedAccountMaxMoney; public Optional InstanceGroupSize; } @@ -864,12 +873,14 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(SourceObjectGUID); _worldPacket.WritePackedGuid(TargetObjectGUID); _worldPacket.WriteVector3(Position); + _worldPacket.WriteInt32(BroadcastTextID); } - ObjectGuid TargetObjectGUID; - ObjectGuid SourceObjectGUID; - uint SoundKitID; - Vector3 Position; + public ObjectGuid TargetObjectGUID; + public ObjectGuid SourceObjectGUID; + public uint SoundKitID; + public Vector3 Position; + public int BroadcastTextID; } class PlaySound : ServerPacket @@ -884,10 +895,12 @@ namespace Game.Networking.Packets { _worldPacket.WriteUInt32(SoundKitID); _worldPacket.WritePackedGuid(SourceObjectGuid); + _worldPacket.WriteInt32(BroadcastTextID); } - ObjectGuid SourceObjectGuid; - uint SoundKitID; + public ObjectGuid SourceObjectGuid; + public uint SoundKitID; + public int BroadcastTextID; } class PlaySpeakerBoxSound : ServerPacket @@ -948,18 +961,6 @@ namespace Game.Networking.Packets public bool Enable; } - class Dismount : ServerPacket - { - public Dismount() : base(ServerOpcodes.Dismount) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(Guid); - } - - public ObjectGuid Guid; - } - class SaveCUFProfiles : ClientPacket { public SaveCUFProfiles(WorldPacket packet) : base(packet) { } diff --git a/Source/Game/Networking/Packets/MovementPackets.cs b/Source/Game/Networking/Packets/MovementPackets.cs index db9a80fd1..b27d7e3df 100644 --- a/Source/Game/Networking/Packets/MovementPackets.cs +++ b/Source/Game/Networking/Packets/MovementPackets.cs @@ -161,8 +161,8 @@ namespace Game.Networking.Packets data.WriteBit(hasTransportData); data.WriteBit(hasFallData); data.WriteBit(hasSpline); - data.WriteBit(0); // HeightChangeFailed - data.WriteBit(0); // RemoteTimeValid + data.WriteBit(false); // HeightChangeFailed + data.WriteBit(false); // RemoteTimeValid data.FlushBits(); if (hasTransportData) @@ -206,10 +206,11 @@ namespace Game.Networking.Packets data.WriteBits((byte)moveSpline.facing.type, 2); // Face bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.FadeObject) && moveSpline.effect_start_time < moveSpline.Duration()); data.WriteBits(moveSpline.GetPath().Length, 16); - data.WriteBits((byte)moveSpline.spline.m_mode, 2); // Mode - data.WriteBit(0); // HasSplineFilter + data.WriteBit(false); // HasSplineFilter data.WriteBit(moveSpline.spell_effect_extra.HasValue); // HasSpellEffectExtraData data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic)); // HasJumpExtraData + data.WriteBit(moveSpline.anim_tier.HasValue); // HasAnimationTierTransition + data.WriteBit(false); // HasUnknown901 data.FlushBits(); //if (HasSplineFilterKey) @@ -258,6 +259,25 @@ namespace Game.Networking.Packets data.WriteInt32(moveSpline.effect_start_time); data.WriteUInt32(0); // Duration (override) } + + if (moveSpline.anim_tier.HasValue) + { + data.WriteUInt32(moveSpline.anim_tier.Value.TierTransitionId); + data.WriteInt32(moveSpline.effect_start_time); + data.WriteUInt32(0); + data.WriteUInt8(moveSpline.anim_tier.Value.AnimTier); + } + + //if (HasUnknown901) + //{ + // for (WorldPackets::Movement::MonsterSplineUnknown901::Inner const& unkInner : unk.Data) size = 16 + // { + // data << int32(unkInner.Unknown_1); + // data << int32(unkInner.Unknown_2); + // data << int32(unkInner.Unknown_3); + // data << uint32(unkInner.Unknown_4); + // } + //} } } @@ -353,8 +373,10 @@ namespace Game.Networking.Packets if (splineFlags.HasFlag(SplineFlag.Animation)) { - movementSpline.AnimTier = splineFlags.GetAnimTier(); - movementSpline.TierTransStartTime = (uint)moveSpline.effect_start_time; + movementSpline.AnimTierTransition.HasValue = true; + movementSpline.AnimTierTransition.Value.TierTransitionID = (int)moveSpline.anim_tier.Value.TierTransitionId; + movementSpline.AnimTierTransition.Value.StartTime = (uint)moveSpline.effect_start_time; + movementSpline.AnimTierTransition.Value.AnimTier = moveSpline.anim_tier.Value.AnimTier; } movementSpline.MoveTime = (uint)moveSpline.Duration(); @@ -562,14 +584,14 @@ namespace Game.Networking.Packets public override void Write() { _worldPacket.WriteUInt32(MapID); - _worldPacket.WriteXYZO(Pos); + Loc.Write(_worldPacket); _worldPacket.WriteUInt32(Reason); _worldPacket.WriteXYZ(MovementOffset); } public uint MapID; public uint Reason; - public Position Pos; + public TeleportLocation Loc = new TeleportLocation(); public Position MovementOffset; // Adjusts all pending movement events by this offset } @@ -894,10 +916,9 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(SequenceIndex); _worldPacket.WriteFloat(Height); _worldPacket.WriteFloat(Scale); + _worldPacket.WriteUInt8((byte)Reason); _worldPacket.WriteUInt32(MountDisplayID); _worldPacket.WriteInt32(ScaleDuration); - _worldPacket.WriteBits((uint)Reason, 2); - _worldPacket.FlushBits(); } public float Scale = 1.0f; @@ -934,7 +955,7 @@ namespace Game.Networking.Packets Data.Read(_worldPacket); Height = _worldPacket.ReadFloat(); MountDisplayID = _worldPacket.ReadUInt32(); - Reason = (UpdateCollisionHeightReason)_worldPacket.ReadBits(2); + Reason = (UpdateCollisionHeightReason)_worldPacket.ReadUInt8(); } public MovementAck Data; @@ -1118,13 +1139,10 @@ namespace Game.Networking.Packets data.WriteBit(MovementForceGUID.HasValue); data.FlushBits(); - if (CollisionHeight.HasValue) - { - data.WriteFloat(CollisionHeight.Value.Height); - data.WriteFloat(CollisionHeight.Value.Scale); - data.WriteBits(CollisionHeight.Value.Reason, 2); - data.FlushBits(); - } + if (MovementForce_.HasValue) + MovementForce_.Value.Write(data); + + if (Speed.HasValue) data.WriteFloat(Speed.Value); @@ -1139,11 +1157,16 @@ namespace Game.Networking.Packets if (VehicleRecID.HasValue) data.WriteInt32(VehicleRecID.Value); + if (CollisionHeight.HasValue) + { + data.WriteFloat(CollisionHeight.Value.Height); + data.WriteFloat(CollisionHeight.Value.Scale); + data.WriteBits(CollisionHeight.Value.Reason, 2); + data.FlushBits(); + } + if (MovementForceGUID.HasValue) data.WritePackedGuid(MovementForceGUID.Value); - - if (MovementForce_.HasValue) - MovementForce_.Value.Write(data); } public ServerOpcodes MessageID; @@ -1238,26 +1261,81 @@ namespace Game.Networking.Packets } } + struct MonsterSplineAnimTierTransition + { + public int TierTransitionID; + public uint StartTime; + public uint EndTime; + public byte AnimTier; + + public void Write(WorldPacket data) + { + data.WriteInt32(TierTransitionID); + data .WriteUInt32(StartTime); + data.WriteUInt32(EndTime); + data.WriteUInt8(AnimTier); + } + } + + class MonsterSplineUnknown901 + { + public Array Data = new Array(16); + + public void Write(WorldPacket data) + { + foreach (var unkInner in Data) + { + data.WriteInt32(unkInner.Unknown_1); + data.WriteInt32(unkInner.Unknown_2); + data.WriteInt32(unkInner.Unknown_3); + data.WriteUInt32(unkInner.Unknown_4); + } + } + + public struct Inner + { + public int Unknown_1; + public int Unknown_2; + public int Unknown_3; + public uint Unknown_4; + } + } + + public class TeleportLocation + { + public Vector4 Pos; + public int Unused901_1 = -1; + public int Unused901_2 = -1; + + public void Write(WorldPacket data) + { + data.WriteVector4(Pos); + data.WriteInt32(Unused901_1); + data.WriteInt32(Unused901_2); + } + } + public class MovementSpline { public void Write(WorldPacket data) { data.WriteUInt32(Flags); - data.WriteUInt8(AnimTier); - data.WriteUInt32(TierTransStartTime); data.WriteInt32(Elapsed); data.WriteUInt32(MoveTime); data.WriteUInt32(FadeObjectTime); data.WriteUInt8(Mode); - data.WriteUInt8(VehicleExitVoluntary); data.WritePackedGuid(TransportGUID); data.WriteInt8(VehicleSeat); data.WriteBits((byte)Face, 2); data.WriteBits(Points.Count, 16); + data.WriteBit(VehicleExitVoluntary); + data.WriteBit(Interpolate); data.WriteBits(PackedDeltas.Count, 16); data.WriteBit(SplineFilter.HasValue); data.WriteBit(SpellEffectExtraData.HasValue); data.WriteBit(JumpExtraData.HasValue); + data.WriteBit(AnimTierTransition.HasValue); + data.WriteBit(Unknown901.HasValue); data.FlushBits(); if (SplineFilter.HasValue) @@ -1288,24 +1366,31 @@ namespace Game.Networking.Packets if (JumpExtraData.HasValue) JumpExtraData.Value.Write(data); + + if (AnimTierTransition.HasValue) + AnimTierTransition.Value.Write(data); + + if (Unknown901.HasValue) + Unknown901.Value.Write(data); } public uint Flags; // Spline flags public MonsterMoveType Face; // Movement direction (see MonsterMoveType enum) - public byte AnimTier; - public uint TierTransStartTime; public int Elapsed; public uint MoveTime; public uint FadeObjectTime; public List Points = new List(); // Spline path public byte Mode; // Spline mode - actually always 0 in this packet - Catmullrom mode appears only in SMSG_UPDATE_OBJECT. In this packet it is determined by flags - public byte VehicleExitVoluntary; + public bool VehicleExitVoluntary; + public bool Interpolate; public ObjectGuid TransportGUID; public sbyte VehicleSeat = -1; public List PackedDeltas = new List(); public Optional SplineFilter; public Optional SpellEffectExtraData; public Optional JumpExtraData; + public Optional AnimTierTransition; + public Optional Unknown901; public float FaceDirection; public ObjectGuid FaceGUID; public Vector3 FaceSpot; diff --git a/Source/Game/Networking/Packets/NPCPackets.cs b/Source/Game/Networking/Packets/NPCPackets.cs index 7acaca5c8..ddd2b905e 100644 --- a/Source/Game/Networking/Packets/NPCPackets.cs +++ b/Source/Game/Networking/Packets/NPCPackets.cs @@ -65,27 +65,17 @@ namespace Game.Networking.Packets _worldPacket.WriteBits(options.Text.GetByteCount(), 12); _worldPacket.WriteBits(options.Confirm.GetByteCount(), 12); + _worldPacket.WriteBits((byte)options.Status, 2); _worldPacket.FlushBits(); + options.Treasure.Write(_worldPacket); + _worldPacket.WriteString(options.Text); _worldPacket.WriteString(options.Confirm); } foreach (ClientGossipText text in GossipText) - { - _worldPacket.WriteInt32(text.QuestID); - _worldPacket.WriteInt32(text.QuestType); - _worldPacket.WriteInt32(text.QuestLevel); - _worldPacket.WriteInt32(text.QuestMaxScalingLevel); - _worldPacket.WriteInt32(text.QuestFlags); - _worldPacket.WriteInt32(text.QuestFlagsEx); - - _worldPacket.WriteBit(text.Repeatable); - _worldPacket.WriteBits(text.QuestTitle.GetByteCount(), 9); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(text.QuestTitle); - } + text.Write(_worldPacket); } public List GossipOptions = new List(); @@ -297,26 +287,68 @@ namespace Game.Networking.Packets } //Structs + public struct TreasureItem + { + public GossipOptionRewardType Type; + public int ID; + public int Quantity; + + public void Write(WorldPacket data) + { + data.WriteBits((byte)Type, 1); + data.WriteInt32(ID); + data.WriteInt32(Quantity); + } + } + + public class TreasureLootList + { + public List Items = new List(); + + public void Write(WorldPacket data) + { + data.WriteInt32(Items.Count); + foreach (TreasureItem treasureItem in Items) + treasureItem.Write(data); + } + } + public struct ClientGossipOptions { public int ClientOption; public byte OptionNPC; public byte OptionFlags; public int OptionCost; + public GossipOptionStatus Status; public string Text; public string Confirm; + public TreasureLootList Treasure; } public class ClientGossipText { - public int QuestID; + public uint QuestID; + public int ContentTuningID; public int QuestType; - public int QuestLevel; - public int QuestMaxScalingLevel; public bool Repeatable; public string QuestTitle; - public int QuestFlags; - public int QuestFlagsEx; + public uint QuestFlags; + public uint QuestFlagsEx; + + public void Write(WorldPacket data) + { + data.WriteUInt32(QuestID); + data.WriteInt32(ContentTuningID); + data.WriteInt32(QuestType); + data.WriteUInt32(QuestFlags); + data.WriteUInt32(QuestFlagsEx); + + data.WriteBit(Repeatable); + data.WriteBits(QuestTitle.GetByteCount(), 9); + data.FlushBits(); + + data.WriteString(QuestTitle); + } } public class VendorItemPkt @@ -332,6 +364,7 @@ namespace Game.Networking.Packets data.WriteInt32(ExtendedCostID); data.WriteInt32(PlayerConditionFailed); Item.Write(data); + data.WriteBit(Locked); data.WriteBit(DoNotFilterOnVendor); data.WriteBit(Refundable); data.FlushBits(); @@ -346,6 +379,7 @@ namespace Game.Networking.Packets public int StackCount; public int ExtendedCostID; public int PlayerConditionFailed; + public bool Locked; public bool DoNotFilterOnVendor; public bool Refundable; } diff --git a/Source/Game/Networking/Packets/PartyPackets.cs b/Source/Game/Networking/Packets/PartyPackets.cs index 4e48062f0..d24df372e 100644 --- a/Source/Game/Networking/Packets/PartyPackets.cs +++ b/Source/Game/Networking/Packets/PartyPackets.cs @@ -85,9 +85,8 @@ namespace Game.Networking.Packets ProposedRoles = proposedRoles; - InviterVirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress(); - InviterRealmNameActual = Global.WorldMgr.GetRealm().Name; - InviterRealmNameNormalized = Global.WorldMgr.GetRealm().NormalizedName; + var realm = Global.WorldMgr.GetRealm(); + InviterRealm = new VirtualRealmInfo(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName); } public override void Write() @@ -97,15 +96,10 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(IsXRealm); _worldPacket.WriteBit(MustBeBNetFriend); _worldPacket.WriteBit(AllowMultipleRoles); + _worldPacket.WriteBit(QuestSessionActive); _worldPacket.WriteBits(InviterName.GetByteCount(), 6); - _worldPacket.WriteUInt32(InviterVirtualRealmAddress); - _worldPacket.WriteBit(IsLocal); - _worldPacket.WriteBit(Unk2); - _worldPacket.WriteBits(InviterRealmNameActual.GetByteCount(), 8); - _worldPacket.WriteBits(InviterRealmNameNormalized.GetByteCount(), 8); - _worldPacket.WriteString(InviterRealmNameActual); - _worldPacket.WriteString(InviterRealmNameNormalized); + InviterRealm.Write(_worldPacket); _worldPacket.WritePackedGuid(InviterGUID); _worldPacket.WritePackedGuid(InviterBNetAccountId); @@ -123,22 +117,19 @@ namespace Game.Networking.Packets public bool MightCRZYou; public bool MustBeBNetFriend; public bool AllowMultipleRoles; - public bool Unk2; + public bool QuestSessionActive; public ushort Unk1; public bool CanAccept; // Inviter + public VirtualRealmInfo InviterRealm; public ObjectGuid InviterGUID; public ObjectGuid InviterBNetAccountId; public string InviterName; // Realm public bool IsXRealm; - public bool IsLocal = true; - public uint InviterVirtualRealmAddress; - public string InviterRealmNameActual; - public string InviterRealmNameNormalized; // Lfg public uint ProposedRoles; @@ -919,21 +910,21 @@ namespace Game.Networking.Packets } class PartyMemberAuraStates - { + { + public int SpellID; + public ushort Flags; + public uint ActiveFlags; + public List Points = new List(); + public void Write(WorldPacket data) { data.WriteInt32(SpellID); - data.WriteUInt8(Flags); + data.WriteUInt16(Flags); data.WriteUInt32(ActiveFlags); data.WriteInt32(Points.Count); foreach (float points in Points) data.WriteFloat(points); } - - public int SpellID; - public byte Flags; - public uint ActiveFlags; - public List Points = new List(); } class PartyMemberPetStats @@ -962,6 +953,20 @@ namespace Game.Networking.Packets public List Auras = new List(); } + public struct CTROptions + { + public uint ContentTuningConditionMask; + public int Unused901; + public uint ExpansionLevelMask; + + public void Write(WorldPacket data) + { + data.WriteUInt32(ContentTuningConditionMask); + data.WriteInt32(Unused901); + data.WriteUInt32(ExpansionLevelMask); + } + } + class PartyMemberStats { public void Write(WorldPacket data) @@ -988,6 +993,7 @@ namespace Game.Networking.Packets data.WriteInt32(Auras.Count); Phases.Write(data); + ChromieTime.Write(data); foreach (PartyMemberAuraStates aura in Auras) aura.Write(data); @@ -1025,6 +1031,7 @@ namespace Game.Networking.Packets public ushort WmoGroupID; public uint WmoDoodadPlacementID; public sbyte[] PartyType = new sbyte[2]; + public CTROptions ChromieTime; } struct PartyPlayerInfo diff --git a/Source/Game/Networking/Packets/QueryPackets.cs b/Source/Game/Networking/Packets/QueryPackets.cs index d25a2a0cb..927be41d0 100644 --- a/Source/Game/Networking/Packets/QueryPackets.cs +++ b/Source/Game/Networking/Packets/QueryPackets.cs @@ -132,7 +132,6 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(Stats.RequiredExpansion); _worldPacket.WriteUInt32(Stats.VignetteID); _worldPacket.WriteInt32(Stats.Class); - _worldPacket.WriteFloat(Stats.FadeRegionRadius); _worldPacket.WriteInt32(Stats.WidgetSetID); _worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID); @@ -722,7 +721,6 @@ namespace Game.Networking.Packets public uint RequiredExpansion; public uint VignetteID; public int Class; - public float FadeRegionRadius; public int WidgetSetID; public int WidgetSetUnitConditionID; public uint[] Flags = new uint[2]; diff --git a/Source/Game/Networking/Packets/QuestPackets.cs b/Source/Game/Networking/Packets/QuestPackets.cs index 4c3cc605a..c91039594 100644 --- a/Source/Game/Networking/Packets/QuestPackets.cs +++ b/Source/Game/Networking/Packets/QuestPackets.cs @@ -108,7 +108,6 @@ namespace Game.Networking.Packets public override void Write() { _worldPacket.WriteUInt32(QuestID); - _worldPacket.WriteBit(Allow); _worldPacket.FlushBits(); @@ -116,11 +115,8 @@ namespace Game.Networking.Packets { _worldPacket.WriteUInt32(Info.QuestID); _worldPacket.WriteInt32(Info.QuestType); - _worldPacket.WriteInt32(Info.QuestLevel); - _worldPacket.WriteInt32(Info.QuestScalingFactionGroup); - _worldPacket.WriteInt32(Info.QuestMaxScalingLevel); _worldPacket.WriteUInt32(Info.QuestPackageID); - _worldPacket.WriteInt32(Info.QuestMinLevel); + _worldPacket.WriteInt32(Info.ContentTuningID); _worldPacket.WriteInt32(Info.QuestSortID); _worldPacket.WriteUInt32(Info.QuestInfoID); _worldPacket.WriteUInt32(Info.SuggestedGroupNum); @@ -131,10 +127,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(Info.RewardMoneyDifficulty); _worldPacket.WriteFloat(Info.RewardMoneyMultiplier); _worldPacket.WriteUInt32(Info.RewardBonusMoney); - - foreach (uint id in Info.RewardDisplaySpell) - _worldPacket.WriteUInt32(id); - + _worldPacket.WriteInt32(Info.RewardDisplaySpell.Count); _worldPacket.WriteUInt32(Info.RewardSpell); _worldPacket.WriteUInt32(Info.RewardHonor); _worldPacket.WriteFloat(Info.RewardKillHonor); @@ -204,6 +197,9 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(Info.ManagedWorldStateID); _worldPacket.WriteInt32(Info.QuestSessionBonus); + foreach (QuestCompleteDisplaySpell rewardDisplaySpell in Info.RewardDisplaySpell) + rewardDisplaySpell.Write(_worldPacket); + _worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9); _worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12); _worldPacket.WriteBits(Info.QuestDescription.GetByteCount(), 12); @@ -213,6 +209,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBits(Info.PortraitTurnInText.GetByteCount(), 10); _worldPacket.WriteBits(Info.PortraitTurnInName.GetByteCount(), 8); _worldPacket.WriteBits(Info.QuestCompletionLog.GetByteCount(), 11); + _worldPacket.WriteBit(Info.ReadyForTranslation); _worldPacket.FlushBits(); foreach (QuestObjective questObjective in Info.Objectives) @@ -358,7 +355,7 @@ namespace Game.Networking.Packets public ObjectGuid QuestGiverGUID; public uint QuestID; - public uint ItemChoiceID; + public QuestChoiceItem Choice; } public class QuestGiverQuestComplete : ServerPacket @@ -627,21 +624,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBits(Greeting.GetByteCount(), 11); _worldPacket.FlushBits(); - foreach (GossipText gossip in QuestDataText) - { - _worldPacket.WriteUInt32(gossip.QuestID); - _worldPacket.WriteUInt32(gossip.QuestType); - _worldPacket.WriteUInt32(gossip.QuestLevel); - _worldPacket.WriteUInt32(gossip.QuestMaxScalingLevel); - _worldPacket.WriteUInt32(gossip.QuestFlags); - _worldPacket.WriteUInt32(gossip.QuestFlagsEx); - - _worldPacket.WriteBit(gossip.Repeatable); - _worldPacket.WriteBits(gossip.QuestTitle.GetByteCount(), 9); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(gossip.QuestTitle); - } + foreach (ClientGossipText gossip in QuestDataText) + gossip.Write(_worldPacket); _worldPacket.WriteString(Greeting); } @@ -649,7 +633,7 @@ namespace Game.Networking.Packets public ObjectGuid QuestGiverGUID; public uint GreetEmoteDelay; public uint GreetEmoteType; - public List QuestDataText = new List(); + public List QuestDataText = new List(); public string Greeting = ""; } @@ -901,6 +885,18 @@ namespace Game.Networking.Packets public uint DisplayID; } + public struct QuestCompleteDisplaySpell + { + public int SpellID; + public int PlayerConditionID; + + public void Write(WorldPacket data) + { + data.WriteInt32(SpellID); + data.WriteInt32(PlayerConditionID); + } + } + public class QuestInfo { public QuestInfo() @@ -918,11 +914,8 @@ namespace Game.Networking.Packets public uint QuestID; public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) - public int QuestLevel; // may be -1, static data, in other cases must be used dynamic level: Player.GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) - public int QuestScalingFactionGroup; - public int QuestMaxScalingLevel = 255; + public int ContentTuningID; public uint QuestPackageID; - public int QuestMinLevel; public int QuestSortID; // zone or sort to display in quest log public uint QuestInfoID; public uint SuggestedGroupNum; @@ -933,7 +926,7 @@ namespace Game.Networking.Packets public uint RewardMoneyDifficulty; public float RewardMoneyMultiplier = 1.0f; public uint RewardBonusMoney; - public uint[] RewardDisplaySpell = new uint[SharedConst.QuestRewardDisplaySpellCount]; // reward spell, this spell will be displayed (icon) + public List RewardDisplaySpell = new List(); // reward spell, this spell will be displayed (icon) public uint RewardSpell; public uint RewardHonor; public float RewardKillHonor; @@ -986,16 +979,59 @@ namespace Game.Networking.Packets public int[] RewardFactionCapIn = new int[SharedConst.QuestRewardReputationsCount]; public uint[] RewardCurrencyID = new uint[SharedConst.QuestRewardCurrencyCount]; public uint[] RewardCurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount]; + public bool ReadyForTranslation; } public struct QuestChoiceItem { + public LootItemType LootItemType; public ItemInstance Item; public uint Quantity; + + public void Read(WorldPacket data) + { + data.ResetBitPos(); + LootItemType = (LootItemType)data.ReadBits(2); + Item = new ItemInstance(); + Item.Read(data); + Quantity = data.ReadUInt32(); + } + + public void Write(WorldPacket data) + { + data.WriteBits((byte)LootItemType, 2); + Item.Write(data); + data.WriteUInt32(Quantity); + } } public class QuestRewards - { + { + public uint ChoiceItemCount; + public uint ItemCount; + public uint Money; + public uint XP; + public uint ArtifactXP; + public uint ArtifactCategoryID; + public uint Honor; + public uint Title; + public uint FactionFlags; + public Array SpellCompletionDisplayID = new Array(SharedConst.QuestRewardDisplaySpellCount); + public uint SpellCompletionID; + public uint SkillLineID; + public uint NumSkillUps; + public uint TreasurePickerID; + public Array ChoiceItems = new Array(SharedConst.QuestRewardChoicesCount); + public Array ItemID = new Array(SharedConst.QuestRewardItemCount); + public Array ItemQty = new Array(SharedConst.QuestRewardItemCount); + public Array FactionID = new Array(SharedConst.QuestRewardReputationsCount); + public Array FactionValue = new Array(SharedConst.QuestRewardReputationsCount); + public Array FactionOverride = new Array(SharedConst.QuestRewardReputationsCount); + public Array FactionCapIn = new Array(SharedConst.QuestRewardReputationsCount); + public Array CurrencyID = new Array(SharedConst.QuestRewardCurrencyCount); + public Array CurrencyQty = new Array(SharedConst.QuestRewardCurrencyCount); + public bool IsBoostSpell; + public void Write(WorldPacket data) { data.WriteUInt32(ChoiceItemCount); @@ -1038,40 +1074,12 @@ namespace Game.Networking.Packets data.WriteUInt32(NumSkillUps); data.WriteUInt32(TreasurePickerID); - for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) - { - ChoiceItems[i].Item.Write(data); - data.WriteUInt32(ChoiceItems[i].Quantity); - } + foreach (var choice in ChoiceItems) + choice.Write(data); data.WriteBit(IsBoostSpell); data.FlushBits(); } - - public uint ChoiceItemCount; - public uint ItemCount; - public uint Money; - public uint XP; - public uint ArtifactXP; - public uint ArtifactCategoryID; - public uint Honor; - public uint Title; - public uint FactionFlags; - public int[] SpellCompletionDisplayID = new int[SharedConst.QuestRewardDisplaySpellCount]; - public uint SpellCompletionID; - public uint SkillLineID; - public uint NumSkillUps; - public uint TreasurePickerID; - public QuestChoiceItem[] ChoiceItems = new QuestChoiceItem[SharedConst.QuestRewardChoicesCount]; - public uint[] ItemID = new uint[SharedConst.QuestRewardItemCount]; - public uint[] ItemQty = new uint[SharedConst.QuestRewardItemCount]; - public uint[] FactionID = new uint[SharedConst.QuestRewardReputationsCount]; - public int[] FactionValue = new int[SharedConst.QuestRewardReputationsCount]; - public int[] FactionOverride = new int[SharedConst.QuestRewardReputationsCount]; - public int[] FactionCapIn = new int[SharedConst.QuestRewardReputationsCount]; - public uint[] CurrencyID = new uint[SharedConst.QuestRewardCurrencyCount]; - public uint[] CurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount]; - public bool IsBoostSpell; } public struct QuestDescEmote @@ -1105,6 +1113,7 @@ namespace Game.Networking.Packets } data.WriteBit(AutoLaunched); + data.WriteBit(false); // Unused data.FlushBits(); Rewards.Write(data); @@ -1154,30 +1163,6 @@ namespace Game.Networking.Packets public int Amount; } - public struct GossipText - { - public GossipText(uint questID, uint questType, uint questLevel, uint questMaxScalingLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle) - { - QuestID = questID; - QuestType = questType; - QuestLevel = questLevel; - QuestMaxScalingLevel = questMaxScalingLevel; - QuestFlags = questFlags; - QuestFlagsEx = questFlagsEx; - Repeatable = repeatable; - QuestTitle = questTitle; - } - - public uint QuestID; - public uint QuestType; - public uint QuestLevel; - public uint QuestMaxScalingLevel; - public uint QuestFlags; - public uint QuestFlagsEx; - public bool Repeatable; - public string QuestTitle; - } - struct WorldQuestUpdateInfo { public WorldQuestUpdateInfo(int lastUpdate, uint questID, uint timer, int variableID, int value) @@ -1255,17 +1240,60 @@ namespace Game.Networking.Packets public List ItemChoices = new List(); } - class PlayerChoiceResponse + struct PlayerChoiceResponseMawPower { + public int Unused901_1; + public int TypeArtFileID; + public int Rarity; + public uint RarityColor; + public int Unused901_2; + public int SpellID; + public int MaxStacks; + + public void Write(WorldPacket data) + { + data.WriteInt32(Unused901_1); + data.WriteInt32(TypeArtFileID); + data.WriteInt32(Rarity); + data.WriteUInt32(RarityColor); + data.WriteInt32(Unused901_2); + data.WriteInt32(SpellID); + data.WriteInt32(MaxStacks); + } + } + + class PlayerChoiceResponse + { + public int ResponseID; + public ushort ResponseIdentifier; + public int ChoiceArtFileID; + public int Flags; + public uint WidgetSetID; + public uint UiTextureAtlasElementID; + public uint SoundKitID; + public byte GroupID; + public int UiTextureKitID; + public string Answer; + public string Header; + public string SubHeader; + public string ButtonTooltip; + public string Description; + public string Confirmation; + public Optional Reward; + public Optional RewardQuestID; + public Optional MawPower; + public void Write(WorldPacket data) { data.WriteInt32(ResponseID); + data.WriteUInt16(ResponseIdentifier); data.WriteInt32(ChoiceArtFileID); data.WriteInt32(Flags); data.WriteUInt32(WidgetSetID); data.WriteUInt32(UiTextureAtlasElementID); data.WriteUInt32(SoundKitID); data.WriteUInt8(GroupID); + data.WriteInt32(UiTextureKitID); data.WriteBits(Answer.GetByteCount(), 9); data.WriteBits(Header.GetByteCount(), 9); @@ -1276,6 +1304,7 @@ namespace Game.Networking.Packets data.WriteBit(RewardQuestID.HasValue); data.WriteBit(Reward.HasValue); + data.WriteBit(MawPower.HasValue); data.FlushBits(); if (Reward.HasValue) @@ -1290,22 +1319,9 @@ namespace Game.Networking.Packets if (RewardQuestID.HasValue) data.WriteUInt32(RewardQuestID.Value); - } - public int ResponseID; - public int ChoiceArtFileID; - public int Flags; - public uint WidgetSetID; - public uint UiTextureAtlasElementID; - public uint SoundKitID; - public byte GroupID; - public string Answer; - public string Header; - public string SubHeader; - public string ButtonTooltip; - public string Description; - public string Confirmation; - public Optional Reward; - public Optional RewardQuestID; + if (MawPower.HasValue) + MawPower.Value.Write(data); + } } } \ No newline at end of file diff --git a/Source/Game/Networking/Packets/ReputationPackets.cs b/Source/Game/Networking/Packets/ReputationPackets.cs index 18ad7dd15..45c8cd753 100644 --- a/Source/Game/Networking/Packets/ReputationPackets.cs +++ b/Source/Game/Networking/Packets/ReputationPackets.cs @@ -22,7 +22,7 @@ namespace Game.Networking.Packets { public class InitializeFactions : ServerPacket { - const ushort FactionCount = 350; + const ushort FactionCount = 400; public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { } diff --git a/Source/Game/Networking/Packets/ScenarioPackets.cs b/Source/Game/Networking/Packets/ScenarioPackets.cs index 99acfa461..601cd6207 100644 --- a/Source/Game/Networking/Packets/ScenarioPackets.cs +++ b/Source/Game/Networking/Packets/ScenarioPackets.cs @@ -147,12 +147,14 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(scenarioPOI.Flags); _worldPacket.WriteInt32(scenarioPOI.WorldEffectID); _worldPacket.WriteInt32(scenarioPOI.PlayerConditionID); + _worldPacket.WriteInt32(scenarioPOI.NavigationPlayerConditionID); _worldPacket.WriteInt32(scenarioPOI.Points.Count); foreach (var scenarioPOIBlobPoint in scenarioPOI.Points) { _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.X); _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Y); + _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Z); } } } diff --git a/Source/Game/Networking/Packets/SocialPackets.cs b/Source/Game/Networking/Packets/SocialPackets.cs index ab7d5e0ea..28c18c6c4 100644 --- a/Source/Game/Networking/Packets/SocialPackets.cs +++ b/Source/Game/Networking/Packets/SocialPackets.cs @@ -47,7 +47,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBits(Contacts.Count, 8); _worldPacket.FlushBits(); - Contacts.ForEach(p => p.Write(_worldPacket)); + foreach (ContactInfo contact in Contacts) + contact.Write(_worldPacket); } public List Contacts; diff --git a/Source/Game/Networking/Packets/SpellPackets.cs b/Source/Game/Networking/Packets/SpellPackets.cs index 5f74324e2..b10801808 100644 --- a/Source/Game/Networking/Packets/SpellPackets.cs +++ b/Source/Game/Networking/Packets/SpellPackets.cs @@ -332,6 +332,7 @@ namespace Game.Networking.Packets { _worldPacket.WriteInt32(SpellID.Count); _worldPacket.WriteInt32(FavoriteSpellID.Count); + _worldPacket.WriteUInt32(SpecializationID); foreach (uint spell in SpellID) _worldPacket.WriteUInt32(spell); @@ -345,6 +346,7 @@ namespace Game.Networking.Packets public List SpellID = new List(); public List FavoriteSpellID = new List(); + public uint SpecializationID; public bool SuppressMessaging; } @@ -357,13 +359,15 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(CasterUnit); _worldPacket.WritePackedGuid(CastID); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(SpellXSpellVisualID); + + Visual.Write(_worldPacket); + _worldPacket.WriteUInt16(Reason); } public ObjectGuid CasterUnit; public uint SpellID; - public uint SpellXSpellVisualID; + public SpellCastVisual Visual; public ushort Reason; public ObjectGuid CastID; } @@ -377,49 +381,51 @@ namespace Game.Networking.Packets _worldPacket.WritePackedGuid(CasterUnit); _worldPacket.WritePackedGuid(CastID); _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt32(SpellXSpellVisualID); + + Visual.Write(_worldPacket); + _worldPacket.WriteUInt16(Reason); } public ObjectGuid CasterUnit; public uint SpellID; - public uint SpellXSpellVisualID; + public SpellCastVisual Visual; public ushort Reason; public ObjectGuid CastID; } - class CastFailedBase : ServerPacket + class CastFailed : ServerPacket { - public CastFailedBase(ServerOpcodes serverOpcodes, ConnectionType connectionType) : base(serverOpcodes, connectionType) { } - - public override void Write() { throw new NotImplementedException(); } - public ObjectGuid CastID; public int SpellID; + public SpellCastVisual Visual; public SpellCastResult Reason; public int FailedArg1 = -1; public int FailedArg2 = -1; - } - class CastFailed : CastFailedBase - { public CastFailed() : base(ServerOpcodes.CastFailed, ConnectionType.Instance) { } public override void Write() { _worldPacket.WritePackedGuid(CastID); _worldPacket.WriteInt32(SpellID); - _worldPacket.WriteInt32(SpellXSpellVisualID); + + Visual.Write(_worldPacket); + _worldPacket.WriteInt32((int)Reason); _worldPacket.WriteInt32(FailedArg1); _worldPacket.WriteInt32(FailedArg2); } - - public int SpellXSpellVisualID; } - class PetCastFailed : CastFailedBase + class PetCastFailed : ServerPacket { + public ObjectGuid CastID; + public int SpellID; + public SpellCastResult Reason; + public int FailedArg1 = -1; + public int FailedArg2 = -1; + public PetCastFailed() : base(ServerOpcodes.PetCastFailed, ConnectionType.Instance) { } public override void Write() @@ -673,10 +679,13 @@ namespace Game.Networking.Packets { _worldPacket.WritePackedGuid(Source); _worldPacket.WriteUInt32(SpellVisualKitID); + _worldPacket.WriteBit(MountedVisual); + _worldPacket.FlushBits(); } public ObjectGuid Source; public uint SpellVisualKitID; + public bool MountedVisual; } class PlayOrphanSpellVisual : ServerPacket @@ -753,12 +762,15 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(KitRecID); _worldPacket.WriteUInt32(KitType); _worldPacket.WriteUInt32(Duration); + _worldPacket.WriteBit(MountedVisual); + _worldPacket.FlushBits(); } public ObjectGuid Unit; public uint KitRecID; public uint KitType; public uint Duration; + public bool MountedVisual; } public class CancelCast : ClientPacket @@ -797,7 +809,9 @@ namespace Game.Networking.Packets { _worldPacket.WritePackedGuid(CasterGUID); _worldPacket.WriteInt32(SpellID); - _worldPacket.WriteInt32(SpellXSpellVisualID); + + Visual.Write(_worldPacket); + _worldPacket.WriteUInt32(ChannelDuration); _worldPacket.WriteBit(InterruptImmunities.HasValue); _worldPacket.WriteBit(HealPrediction.HasValue); @@ -811,7 +825,7 @@ namespace Game.Networking.Packets } public int SpellID; - public int SpellXSpellVisualID; + public SpellCastVisual Visual; public Optional InterruptImmunities; public ObjectGuid CasterGUID; public Optional HealPrediction; @@ -905,35 +919,28 @@ namespace Game.Networking.Packets { _worldPacket.WritePackedGuid(UnitGUID); _worldPacket.WriteInt32(DisplayID); + _worldPacket.WriteInt32(SpellVisualKitID); _worldPacket.WriteUInt8(RaceID); _worldPacket.WriteUInt8(Gender); _worldPacket.WriteUInt8(ClassID); - _worldPacket.WriteUInt8(SkinColor); - _worldPacket.WriteUInt8(FaceVariation); - _worldPacket.WriteUInt8(HairVariation); - _worldPacket.WriteUInt8(HairColor); - _worldPacket.WriteUInt8(BeardVariation); - - CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id)); - + _worldPacket.WriteInt32(Customizations.Count); _worldPacket.WritePackedGuid(GuildGUID); _worldPacket.WriteInt32(ItemDisplayID.Count); + foreach (ChrCustomizationChoice customization in Customizations) + customization.Write(_worldPacket); + foreach (var itemDisplayId in ItemDisplayID) _worldPacket.WriteInt32(itemDisplayId); } public ObjectGuid UnitGUID; public int DisplayID; + public int SpellVisualKitID; public byte RaceID; public byte Gender; public byte ClassID; - public byte SkinColor; - public byte FaceVariation; - public byte HairVariation; - public byte HairColor; - public byte BeardVariation; - public Array CustomDisplay = new Array(PlayerConst.CustomDisplaySize); + public List Customizations = new List(); public ObjectGuid GuildGUID; public List ItemDisplayID = new List(); @@ -947,10 +954,12 @@ namespace Game.Networking.Packets { _worldPacket.WritePackedGuid(UnitGUID); _worldPacket.WriteInt32(DisplayID); + _worldPacket.WriteInt32(SpellVisualKitID); } public ObjectGuid UnitGUID; public int DisplayID; + public int SpellVisualKitID; } class SpellClick : ClientPacket @@ -1299,10 +1308,10 @@ namespace Game.Networking.Packets } public void Write(WorldPacket data) - { + { + data.WriteFloat(PlayerItemLevel); + data.WriteFloat(TargetItemLevel); data.WriteInt16(PlayerLevelDelta); - data.WriteUInt16(PlayerItemLevel); - data.WriteUInt16(TargetItemLevel); data.WriteUInt16(ScalingHealthItemLevelCurveID); data.WriteUInt8(TargetLevel); data.WriteUInt8(Expansion); @@ -1316,8 +1325,8 @@ namespace Game.Networking.Packets public ContentTuningType TuningType; public short PlayerLevelDelta; - public ushort PlayerItemLevel; - public ushort TargetItemLevel; + public float PlayerItemLevel; + public float TargetItemLevel; public ushort ScalingHealthItemLevelCurveID; public byte TargetLevel; public byte Expansion; @@ -1335,14 +1344,34 @@ namespace Game.Networking.Packets } } + public struct SpellCastVisual + { + public uint SpellXSpellVisualID; + public int ScriptVisualID; + + public void Read(WorldPacket data) + { + SpellXSpellVisualID = data.ReadUInt32(); + ScriptVisualID = data.ReadInt32(); + } + + public void Write(WorldPacket data) + { + data.WriteUInt32(SpellXSpellVisualID); + data.WriteInt32(ScriptVisualID); + } + } + public class AuraDataInfo { public void Write(WorldPacket data) { data.WritePackedGuid(CastID); data.WriteInt32(SpellID); - data.WriteInt32(SpellXSpellVisualID); - data.WriteUInt8((byte)Flags); + + Visual.Write(data); + + data.WriteUInt16((ushort)Flags); data.WriteUInt32(ActiveFlags); data.WriteUInt16(CastLevel); data.WriteUInt8(Applications); @@ -1379,7 +1408,7 @@ namespace Game.Networking.Packets public ObjectGuid CastID; public int SpellID; - public int SpellXSpellVisualID; + public SpellCastVisual Visual; public AuraFlags Flags; public uint ActiveFlags; public ushort CastLevel = 1; @@ -1519,17 +1548,68 @@ namespace Game.Networking.Packets public uint Quantity; } - public class SpellCastRequest + public struct SpellOptionalReagent { + public int ItemID; + public int Slot; + public int Count; + + public void Read(WorldPacket data) + { + ItemID = data.ReadInt32(); + Slot = data.ReadInt32(); + Count = data.ReadInt32(); + } + } + + public struct SpellExtraCurrencyCost + { + public int CurrencyID; + public int Count; + + public void Read(WorldPacket data) + { + CurrencyID = data.ReadInt32(); + Count = data.ReadInt32(); + } + } + + public class SpellCastRequest + { + public ObjectGuid CastID; + public uint SpellID; + public SpellCastVisual Visual; + public uint SendCastFlags; + public SpellTargetData Target = new SpellTargetData(); + public MissileTrajectoryRequest MissileTrajectory; + public Optional MoveUpdate; + public List Weight = new List(); + public Array OptionalReagents = new Array(3); + public Array OptionalCurrencies = new Array(5 /*MAX_ITEM_EXT_COST_CURRENCIES*/); + public ObjectGuid CraftingNPC; + public uint[] Misc = new uint[2]; + public void Read(WorldPacket data) { CastID = data.ReadPackedGuid(); Misc[0] = data.ReadUInt32(); Misc[1] = data.ReadUInt32(); SpellID = data.ReadUInt32(); - SpellXSpellVisualID = data.ReadUInt32(); + + Visual.Read(data); + MissileTrajectory.Read(data); CraftingNPC = data.ReadPackedGuid(); + + var optionalReagents = data.ReadUInt32(); + var optionalCurrencies = data.ReadUInt32(); + + for (var i = 0; i < optionalReagents; ++i) + OptionalReagents[i].Read(data); + + for (var i = 0; i < optionalCurrencies; ++i) + OptionalCurrencies[i].Read(data); + SendCastFlags = data.ReadBits(5); MoveUpdate.HasValue = data.HasBit(); var weightCount = data.ReadBits(2); @@ -1548,17 +1628,6 @@ namespace Game.Networking.Packets Weight.Add(weight); } } - - public ObjectGuid CastID; - public uint SpellID; - public uint SpellXSpellVisualID; - public uint SendCastFlags; - public SpellTargetData Target = new SpellTargetData(); - public MissileTrajectoryRequest MissileTrajectory; - public Optional MoveUpdate; - public List Weight = new List(); - public ObjectGuid CraftingNPC; - public uint[] Misc = new uint[2]; } public struct SpellHitStatus @@ -1685,7 +1754,9 @@ namespace Game.Networking.Packets data.WritePackedGuid(CastID); data.WritePackedGuid(OriginalCastID); data.WriteInt32(SpellID); - data.WriteUInt32(SpellXSpellVisualID); + + Visual.Read(data); + data.WriteUInt32((uint)CastFlags); data.WriteUInt32((uint)CastFlagsEx); data.WriteUInt32(CastTime); @@ -1736,7 +1807,7 @@ namespace Game.Networking.Packets public ObjectGuid CastID; public ObjectGuid OriginalCastID; public int SpellID; - public uint SpellXSpellVisualID; + public SpellCastVisual Visual; public SpellCastFlags CastFlags; public SpellCastFlagsEx CastFlagsEx; public uint CastTime; diff --git a/Source/Game/Networking/Packets/SystemPackets.cs b/Source/Game/Networking/Packets/SystemPackets.cs index 2fdc81357..ea8456985 100644 --- a/Source/Game/Networking/Packets/SystemPackets.cs +++ b/Source/Game/Networking/Packets/SystemPackets.cs @@ -50,6 +50,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(TwitterPostThrottleCooldown); _worldPacket.WriteUInt32(TokenPollTimeSeconds); + _worldPacket.WriteUInt32(KioskSessionMinutes); _worldPacket.WriteInt64(TokenBalanceAmount); _worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay); @@ -71,7 +72,6 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(RestrictedAccount); _worldPacket.WriteBit(CommerceSystemEnabled); _worldPacket.WriteBit(TutorialsEnabled); - _worldPacket.WriteBit(NPETutorialsEnabled); _worldPacket.WriteBit(TwitterEnabled); _worldPacket.WriteBit(Unk67); _worldPacket.WriteBit(WillKickFromWorld); @@ -88,6 +88,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(QuestSessionEnabled); _worldPacket.WriteBit(IsMuted); _worldPacket.WriteBit(ClubFinderEnabled); + _worldPacket.WriteBit(Unknown901CheckoutRelated); _worldPacket.FlushBits(); { @@ -123,22 +124,12 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(SessionAlert.Value.DisplayTime); } - _worldPacket.WriteBit(VoiceChatManagerSettings.IsSquelched); - _worldPacket.WritePackedGuid(VoiceChatManagerSettings.BnetAccountGuid); - _worldPacket.WritePackedGuid(VoiceChatManagerSettings.GuildGuid); + _worldPacket.WriteBit(Squelch.IsSquelched); + _worldPacket.WritePackedGuid(Squelch.BnetAccountGuid); + _worldPacket.WritePackedGuid(Squelch.GuildGuid); if (EuropaTicketSystemStatus.HasValue) - { - _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.TicketsEnabled); - _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.BugsEnabled); - _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.ComplaintsEnabled); - _worldPacket.WriteBit(EuropaTicketSystemStatus.Value.SuggestionsEnabled); - - _worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.MaxTries); - _worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.PerMilliseconds); - _worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.TryCount); - _worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.LastResetTimeBeforeNow); - } + EuropaTicketSystemStatus.Value.Write(_worldPacket); } public bool VoiceEnabled; @@ -160,6 +151,7 @@ namespace Game.Networking.Packets public uint BpayStoreProductDeliveryDelay; public uint ClubsPresenceUpdateTimer; public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden + public uint KioskSessionMinutes; public bool ItemRestorationButtonEnabled; public bool CharUndeleteEnabled; // Implemented public bool BpayStoreDisabledByParentalControls; @@ -183,29 +175,12 @@ namespace Game.Networking.Packets public bool QuestSessionEnabled; public bool IsMuted; public bool ClubFinderEnabled; + public bool Unknown901CheckoutRelated; public SocialQueueConfig QuickJoinConfig; - public VoiceChatProxySettings VoiceChatManagerSettings; + public SquelchInfo Squelch; public RafSystemFeatureInfo RAFSystem; - public struct SavedThrottleObjectState - { - public uint MaxTries; - public uint PerMilliseconds; - public uint TryCount; - public uint LastResetTimeBeforeNow; - } - - public struct EuropaTicketConfig - { - public bool TicketsEnabled; - public bool BugsEnabled; - public bool ComplaintsEnabled; - public bool SuggestionsEnabled; - - public SavedThrottleObjectState ThrottleState; - } - public struct SessionAlertConfig { public int Delay; @@ -240,7 +215,7 @@ namespace Game.Networking.Packets public float ThrottleDfBestPriority; } - public struct VoiceChatProxySettings + public struct SquelchInfo { public bool IsSquelched; public ObjectGuid BnetAccountGuid; @@ -279,16 +254,28 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(LiveRegionCharacterListEnabled); _worldPacket.WriteBit(LiveRegionCharacterCopyEnabled); _worldPacket.WriteBit(LiveRegionAccountCopyEnabled); + _worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled); + _worldPacket.WriteBit(Unknown901CheckoutRelated); + _worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue); _worldPacket.FlushBits(); + if (EuropaTicketSystemStatus.HasValue) + EuropaTicketSystemStatus.Value.Write(_worldPacket); + _worldPacket.WriteUInt32(TokenPollTimeSeconds); + _worldPacket.WriteUInt32(KioskSessionMinutes); _worldPacket.WriteInt64(TokenBalanceAmount); _worldPacket.WriteInt32(MaxCharactersPerRealm); + _worldPacket.WriteInt32(LiveRegionCharacterCopySourceRegions.Count); _worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay); _worldPacket.WriteInt32(ActiveCharacterUpgradeBoostType); _worldPacket.WriteInt32(ActiveClassTrialBoostType); _worldPacket.WriteInt32(MinimumExpansionLevel); _worldPacket.WriteInt32(MaximumExpansionLevel); + + foreach (var sourceRegion in LiveRegionCharacterCopySourceRegions) + _worldPacket.WriteInt32(sourceRegion); + } public bool BpayStoreAvailable; // NYI @@ -306,6 +293,10 @@ namespace Game.Networking.Packets public bool LiveRegionCharacterListEnabled; // NYI public bool LiveRegionCharacterCopyEnabled; // NYI public bool LiveRegionAccountCopyEnabled; // NYI + public bool LiveRegionKeyBindingsCopyEnabled = false; + public bool Unknown901CheckoutRelated = false; // NYI + public Optional EuropaTicketSystemStatus; + public List LiveRegionCharacterCopySourceRegions = new List(); public uint TokenPollTimeSeconds; // NYI public long TokenBalanceAmount; // NYI public int MaxCharactersPerRealm; @@ -314,6 +305,7 @@ namespace Game.Networking.Packets public int ActiveClassTrialBoostType; // NYI public int MinimumExpansionLevel; public int MaximumExpansionLevel; + public uint KioskSessionMinutes; } public class MOTD : ServerPacket @@ -351,4 +343,40 @@ namespace Game.Networking.Packets public string ServerTimeTZ; public string GameTimeTZ; } + + public struct SavedThrottleObjectState + { + public uint MaxTries; + public uint PerMilliseconds; + public uint TryCount; + public uint LastResetTimeBeforeNow; + + public void Write(WorldPacket data) + { + data.WriteUInt32(MaxTries); + data.WriteUInt32(PerMilliseconds); + data.WriteUInt32(TryCount); + data.WriteUInt32(LastResetTimeBeforeNow); + } + } + + public struct EuropaTicketConfig + { + public bool TicketsEnabled; + public bool BugsEnabled; + public bool ComplaintsEnabled; + public bool SuggestionsEnabled; + + public SavedThrottleObjectState ThrottleState; + + public void Write(WorldPacket data) + { + data.WriteBit(TicketsEnabled); + data.WriteBit(BugsEnabled); + data.WriteBit(ComplaintsEnabled); + data.WriteBit(SuggestionsEnabled); + + ThrottleState.Write(data); + } + } } diff --git a/Source/Game/Networking/Packets/TicketPackets.cs b/Source/Game/Networking/Packets/TicketPackets.cs index 0975516fc..bdd455be6 100644 --- a/Source/Game/Networking/Packets/TicketPackets.cs +++ b/Source/Game/Networking/Packets/TicketPackets.cs @@ -102,31 +102,22 @@ namespace Game.Networking.Packets int CaseID; } - public class SupportTicketSubmitBug : ClientPacket + public class SubmitUserFeedback : ClientPacket { public SupportTicketHeader Header; public string Note; + public bool IsSuggestion; - public SupportTicketSubmitBug(WorldPacket packet) : base(packet) { } + public SubmitUserFeedback(WorldPacket packet) : base(packet) { } public override void Read() { Header.Read(_worldPacket); - Note = _worldPacket.ReadString(_worldPacket.ReadBits(10)); - } - } + uint noteLength = _worldPacket.ReadBits(24); + IsSuggestion = _worldPacket.HasBit(); - public class SupportTicketSubmitSuggestion : ClientPacket - { - public SupportTicketHeader Header; - public string Note; - - public SupportTicketSubmitSuggestion(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Header.Read(_worldPacket); - Note = _worldPacket.ReadString(_worldPacket.ReadBits(10)); + if (noteLength != 0) + Note = _worldPacket.ReadString(noteLength - 1); } } diff --git a/Source/Game/Networking/Packets/TransmogrificationPackets.cs b/Source/Game/Networking/Packets/TransmogrificationPackets.cs index 64688aef2..57cdee8bc 100644 --- a/Source/Game/Networking/Packets/TransmogrificationPackets.cs +++ b/Source/Game/Networking/Packets/TransmogrificationPackets.cs @@ -91,10 +91,12 @@ namespace Game.Networking.Packets ItemModifiedAppearanceID = data.ReadInt32(); Slot = data.ReadUInt32(); SpellItemEnchantmentID = data.ReadInt32(); + SecondaryItemModifiedAppearanceID = data.ReadInt32(); } public int ItemModifiedAppearanceID; public uint Slot; public int SpellItemEnchantmentID; + public int SecondaryItemModifiedAppearanceID; } } diff --git a/Source/Game/Scenarios/ScenarioManager.cs b/Source/Game/Scenarios/ScenarioManager.cs index a0e3a070d..a1cc46a88 100644 --- a/Source/Game/Scenarios/ScenarioManager.cs +++ b/Source/Game/Scenarios/ScenarioManager.cs @@ -242,6 +242,16 @@ namespace Game.Scenarios public class ScenarioPOI { + public int BlobIndex; + public int MapID; + public int UiMapID; + public int Priority; + public int Flags; + public int WorldEffectID; + public int PlayerConditionID; + public int NavigationPlayerConditionID; + public List Points = new List(); + public ScenarioPOI(int blobIndex, int mapID, int uiMapID, int priority, int flags, int worldEffectID, int playerConditionID, List points) { BlobIndex = blobIndex; @@ -253,14 +263,5 @@ namespace Game.Scenarios PlayerConditionID = playerConditionID; Points = points; } - - public int BlobIndex; - public int MapID; - public int UiMapID; - public int Priority; - public int Flags; - public int WorldEffectID; - public int PlayerConditionID; - public List Points = new List(); } } diff --git a/Source/Game/Spells/Auras/Aura.cs b/Source/Game/Spells/Auras/Aura.cs index db82a6f41..f3e62bd9f 100644 --- a/Source/Game/Spells/Auras/Aura.cs +++ b/Source/Game/Spells/Auras/Aura.cs @@ -33,6 +33,7 @@ namespace Game.Spells Unit, DynObj } + public enum AuraRemoveMode { None = 0, @@ -43,6 +44,7 @@ namespace Game.Spells Expire, // aura duration has ended Death } + public enum AuraFlags { None = 0x00, @@ -211,7 +213,7 @@ namespace Game.Spells AuraDataInfo auraData = auraInfo.AuraData.Value; auraData.CastID = aura.GetCastGUID(); auraData.SpellID = (int)aura.GetId(); - auraData.SpellXSpellVisualID = (int)aura.GetSpellXSpellVisualId(); + auraData.Visual.SpellXSpellVisualID = (int)aura.GetSpellXSpellVisualId(); auraData.Flags = GetFlags(); if (aura.GetMaxDuration() > 0 && !aura.GetSpellInfo().HasAttribute(SpellAttr5.HideDuration)) auraData.Flags |= AuraFlags.Duration; diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index d1f86396b..7855b9fe8 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -3525,7 +3525,7 @@ namespace Game.Spells result = SpellCastResult.DontReport; CastFailed castFailed = new CastFailed(); - castFailed.SpellXSpellVisualID = (int)m_SpellVisual; + castFailed.Visual.SpellXSpellVisualID = (int)m_SpellVisual; FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, param1, param2, m_caster.ToPlayer()); m_caster.ToPlayer().SendPacket(castFailed); } @@ -3553,7 +3553,7 @@ namespace Game.Spells return; CastFailed packet = new CastFailed(); - packet.SpellXSpellVisualID = (int)spellVisual; + packet.Visual.SpellXSpellVisualID = (int)spellVisual; FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, param1, param2, caster); caster.SendPacket(packet); } @@ -3610,7 +3610,7 @@ namespace Game.Spells castData.CastID = m_castId; castData.OriginalCastID = m_originalCastId; castData.SpellID = (int)m_spellInfo.Id; - castData.SpellXSpellVisualID = m_SpellVisual; + castData.Visual.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; castData.CastFlagsEx = m_castFlagsEx; castData.CastTime = (uint)m_casttime; @@ -3724,7 +3724,7 @@ namespace Game.Spells castData.CastID = m_castId; castData.OriginalCastID = m_originalCastId; castData.SpellID = (int)m_spellInfo.Id; - castData.SpellXSpellVisualID = m_SpellVisual; + castData.Visual.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; castData.CastFlagsEx = m_castFlagsEx; castData.CastTime = Time.GetMSTime(); @@ -4019,7 +4019,7 @@ namespace Game.Spells failurePacket.CasterUnit = m_caster.GetGUID(); failurePacket.CastID = m_castId; failurePacket.SpellID = m_spellInfo.Id; - failurePacket.SpellXSpellVisualID = m_SpellVisual; + failurePacket.Visual.SpellXSpellVisualID = m_SpellVisual; failurePacket.Reason = result; m_caster.SendMessageToSet(failurePacket, true); @@ -4027,6 +4027,7 @@ namespace Game.Spells failedPacket.CasterUnit = m_caster.GetGUID(); failedPacket.CastID = m_castId; failedPacket.SpellID = m_spellInfo.Id; + failedPacket.Visual.SpellXSpellVisualID = m_SpellVisual; failedPacket.Reason = result; m_caster.SendMessageToSet(failedPacket, true); } @@ -4051,7 +4052,7 @@ namespace Game.Spells SpellChannelStart spellChannelStart = new SpellChannelStart(); spellChannelStart.CasterGUID = m_caster.GetGUID(); spellChannelStart.SpellID = (int)m_spellInfo.Id; - spellChannelStart.SpellXSpellVisualID = (int)m_SpellVisual; + spellChannelStart.Visual.SpellXSpellVisualID = m_SpellVisual; spellChannelStart.ChannelDuration = duration; uint schoolImmunityMask = m_caster.GetSchoolImmunityMask();