diff --git a/Source/Framework/Constants/AccountConst.cs b/Source/Framework/Constants/AccountConst.cs index a7ad1bea1..d07d98d33 100644 --- a/Source/Framework/Constants/AccountConst.cs +++ b/Source/Framework/Constants/AccountConst.cs @@ -785,4 +785,11 @@ namespace Framework.Constants NeedsFanfare = 0x01, IsFavorite = 0x02 } + + public enum ToyFlags + { + None = 0, + Favorite = 0x01, + HasFanfare = 0x02 + } } diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index 2db28fd31..dd622dac8 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -948,7 +948,8 @@ namespace Framework.Constants { Player = 0x01, DeathKnight = 0x04, - DemonHunter = 0x20 + DemonHunter = 0x20, + Conditional = 0x400 } public enum CharSectionType diff --git a/Source/Framework/Constants/LFGConst.cs b/Source/Framework/Constants/LFGConst.cs index e85cc2250..72c1a474f 100644 --- a/Source/Framework/Constants/LFGConst.cs +++ b/Source/Framework/Constants/LFGConst.cs @@ -84,6 +84,8 @@ namespace Framework.Constants TooLowGearScore = 4, TooHighGearScore = 5, RaidLocked = 6, + NoSpec = 14, + HasRestriction = 15, AttunementTooLowLevel = 1001, AttunementTooHighLevel = 1002, QuestNotCompleted = 1022, @@ -146,7 +148,7 @@ namespace Framework.Constants Ok = 0x00, // Joined (No Client Msg) GroupFull = 0x1f, // Your Group Is Already Full. NoLfgObject = 0x21, // Internal Lfg Error. - NoSlotsPlayer = 0x22, // You Do Not Meet The Requirements For The Chosen Dungeons. + NoSlots = 0x22, // You Do Not Meet The Requirements For The Chosen Dungeons. MismatchedSlots = 0x23, // You Cannot Mix Dungeons, Raids, And Random When Picking Dungeons. PartyPlayersFromDifferentRealms = 0x24, // The Dungeon You Chose Does Not Support Players From Multiple Realms. MembersNotPresent = 0x25, // One Or More Group Members Are Pending Invites Or Disconnected. diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index 55d4b55eb..c9bb2585d 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -19,28 +19,28 @@ namespace Framework.Constants { public enum ClientOpcodes : uint { - AcceptGuildInvite = 0x35fc, + AcceptGuildInvite = 0x35fd, AcceptLevelGrant = 0x34fa, AcceptTrade = 0x315a, - AcceptWargameInvite = 0x35e0, + AcceptWargameInvite = 0x35e1, ActivateTaxi = 0x34ab, AddonList = 0x35d8, - AddBattlenetFriend = 0x365a, - AddFriend = 0x36d0, - AddIgnore = 0x36d4, - AddToy = 0x3298, + AddBattlenetFriend = 0x365c, + AddFriend = 0x36d5, + AddIgnore = 0x36d9, + AddToy = 0x3297, AdventureJournalOpenQuest = 0x3201, - AdventureJournalStartQuest = 0x333d, - AdventureMapPoiQuery = 0x3244, + AdventureJournalStartQuest = 0x333e, + AdventureMapPoiQuery = 0x3245, AlterAppearance = 0x34f6, AreaSpiritHealerQuery = 0x34b0, AreaSpiritHealerQueue = 0x34b1, AreaTrigger = 0x31d5, - ArtifactAddPower = 0x31a9, - ArtifactSetAppearance = 0x31ab, + ArtifactAddPower = 0x31a8, + ArtifactSetAppearance = 0x31aa, AssignEquipmentSetSpec = 0x3209, - AttackStop = 0x3256, - AttackSwing = 0x3255, + AttackStop = 0x3254, + AttackSwing = 0x3253, AuctionHelloRequest = 0x34cb, AuctionListBidderItems = 0x34d1, AuctionListItems = 0x34ce, @@ -59,46 +59,46 @@ namespace Framework.Constants AutoEquipItem = 0x399a, AutoEquipItemSlot = 0x399f, AutoStoreBagItem = 0x399b, - AzeriteEmpoweredItemSelectPower = 0x335b, - AzeriteEmpoweredItemViewed = 0x3347, + AzeriteEmpoweredItemSelectPower = 0x335c, + AzeriteEmpoweredItemViewed = 0x3348, BankerActivate = 0x34b3, BattlefieldLeave = 0x3172, - BattlefieldList = 0x317e, + BattlefieldList = 0x317d, BattlefieldPort = 0x3527, - BattlemasterHello = 0x32b0, + BattlemasterHello = 0x32af, BattlemasterJoin = 0x3522, BattlemasterJoinArena = 0x3523, BattlemasterJoinBrawl = 0x3525, BattlemasterJoinSkirmish = 0x3524, - BattlenetChallengeResponse = 0x36d3, - BattlenetRequest = 0x36f7, - BattlenetRequestRealmListTicket = 0x36fb, - BattlePayAckFailedResponse = 0x36cb, - BattlePayCancelOpenCheckout = 0x3716, - BattlePayConfirmPurchaseResponse = 0x36ca, - BattlePayDistributionAssignToTarget = 0x36c1, - BattlePayGetProductList = 0x36bb, - BattlePayGetPurchaseList = 0x36bc, - BattlePayOpenCheckout = 0x370f, - BattlePayQueryClassTrialBoostResult = 0x36c4, - BattlePayRequestCharacterBoostUnrevoke = 0x36c2, - BattlePayRequestCurrentVasTransferQueues = 0x370c, - BattlePayRequestPriceInfo = 0x370b, - BattlePayRequestVasCharacterQueueTime = 0x370d, - BattlePayStartPurchase = 0x36f3, - BattlePayStartVasPurchase = 0x36f4, - BattlePayTrialBoostCharacter = 0x36c3, - BattlePayValidateBnetVasTransfer = 0x370e, - BattlePayVasPurchaseComplete = 0x36f2, + BattlenetChallengeResponse = 0x36d8, + BattlenetRequest = 0x36fc, + BattlenetRequestRealmListTicket = 0x3700, + BattlePayAckFailedResponse = 0x36d0, + BattlePayCancelOpenCheckout = 0x371b, + BattlePayConfirmPurchaseResponse = 0x36cf, + BattlePayDistributionAssignToTarget = 0x36c6, + BattlePayGetProductList = 0x36be, + BattlePayGetPurchaseList = 0x36bf, + BattlePayOpenCheckout = 0x3714, + BattlePayQueryClassTrialBoostResult = 0x36c9, + BattlePayRequestCharacterBoostUnrevoke = 0x36c7, + BattlePayRequestCurrentVasTransferQueues = 0x3711, + BattlePayRequestPriceInfo = 0x3710, + BattlePayRequestVasCharacterQueueTime = 0x3712, + BattlePayStartPurchase = 0x36f8, + BattlePayStartVasPurchase = 0x36f9, + BattlePayTrialBoostCharacter = 0x36c8, + BattlePayValidateBnetVasTransfer = 0x3713, + BattlePayVasPurchaseComplete = 0x36f7, BattlePetClearFanfare = 0x312c, - BattlePetDeletePet = 0x3624, - BattlePetDeletePetCheat = 0x3625, - BattlePetModifyName = 0x3627, - BattlePetRequestJournal = 0x3623, - BattlePetRequestJournalLock = 0x3622, - BattlePetSetBattleSlot = 0x362b, - BattlePetSetFlags = 0x362f, - BattlePetSummon = 0x3628, + BattlePetDeletePet = 0x3625, + BattlePetDeletePetCheat = 0x3626, + BattlePetModifyName = 0x3628, + BattlePetRequestJournal = 0x3624, + BattlePetRequestJournalLock = 0x3623, + BattlePetSetBattleSlot = 0x362d, + BattlePetSetFlags = 0x3631, + BattlePetSummon = 0x3629, BattlePetUpdateDisplayNotify = 0x31df, BattlePetUpdateNotify = 0x31de, BeginTrade = 0x3157, @@ -106,55 +106,55 @@ namespace Framework.Constants BlackMarketBidOnItem = 0x352f, BlackMarketOpen = 0x352d, BlackMarketRequestItems = 0x352e, - BonusRoll = 0x335c, - BugReport = 0x3686, + BonusRoll = 0x335d, + BugReport = 0x3688, BusyTrade = 0x3158, BuyBackItem = 0x34a4, BuyBankSlot = 0x34b4, BuyItem = 0x34a3, BuyReagentBank = 0x34b5, - BuyWowTokenConfirm = 0x36ec, - BuyWowTokenStart = 0x36eb, + BuyWowTokenConfirm = 0x36f1, + BuyWowTokenStart = 0x36f0, CageBattlePet = 0x31f0, - CalendarAddEvent = 0x367d, - CalendarCommunityFilter = 0x3671, - CalendarComplain = 0x3679, - CalendarCopyEvent = 0x3678, - CalendarEventInvite = 0x3672, - CalendarEventModeratorStatus = 0x3676, - CalendarEventRsvp = 0x3674, - CalendarEventSignUp = 0x367b, - CalendarEventStatus = 0x3675, - CalendarGet = 0x366f, - CalendarGetEvent = 0x3670, - CalendarGetNumPending = 0x367a, - CalendarRemoveEvent = 0x3677, - CalendarRemoveInvite = 0x3673, - CalendarUpdateEvent = 0x367e, - CancelAura = 0x31ad, + CalendarAddEvent = 0x367f, + CalendarCommunityFilter = 0x3673, + CalendarComplain = 0x367b, + CalendarCopyEvent = 0x367a, + CalendarEventInvite = 0x3674, + CalendarEventModeratorStatus = 0x3678, + CalendarEventRsvp = 0x3676, + CalendarEventSignUp = 0x367d, + CalendarEventStatus = 0x3677, + CalendarGet = 0x3671, + CalendarGetEvent = 0x3672, + CalendarGetNumPending = 0x367c, + CalendarRemoveEvent = 0x3679, + CalendarRemoveInvite = 0x3675, + CalendarUpdateEvent = 0x3680, + CancelAura = 0x31ac, CancelAutoRepeatSpell = 0x34e8, - CancelCast = 0x329e, - CancelChannelling = 0x326a, - CancelGrowthAura = 0x326f, + CancelCast = 0x329d, + CancelChannelling = 0x3269, + CancelGrowthAura = 0x326e, CancelMasterLootRoll = 0x3211, - CancelModSpeedNoControlAuras = 0x31ac, - CancelMountAura = 0x3280, - CancelQueuedSpell = 0x317f, + CancelModSpeedNoControlAuras = 0x31ab, + CancelMountAura = 0x327f, + CancelQueuedSpell = 0x317e, CancelTempEnchantment = 0x34f3, CancelTrade = 0x315c, - CanDuel = 0x3662, - CanRedeemWowTokenForBalance = 0x370a, - CastSpell = 0x329b, - ChallengeModeRequestLeaders = 0x308f, - ChallengeModeRequestMapStats = 0x308e, - ChangeBagSlotFlag = 0x3321, - ChangeBankBagSlotFlag = 0x3322, - ChangeMonumentAppearance = 0x3303, - ChangeSubGroup = 0x364c, - CharacterRenameRequest = 0x36bf, - CharCustomize = 0x368f, - CharDelete = 0x369c, - CharRaceOrFactionChange = 0x3695, + CanDuel = 0x3664, + CanRedeemWowTokenForBalance = 0x370f, + CastSpell = 0x329a, + ChallengeModeRequestLeaders = 0x3090, + ChallengeModeRequestMapStats = 0x308f, + ChangeBagSlotFlag = 0x3320, + ChangeBankBagSlotFlag = 0x3321, + ChangeMonumentAppearance = 0x3302, + ChangeSubGroup = 0x364e, + CharacterRenameRequest = 0x36c4, + CharCustomize = 0x3693, + CharDelete = 0x36a0, + CharRaceOrFactionChange = 0x3699, ChatAddonMessage = 0x37ee, ChatAddonMessageTargeted = 0x37ef, ChatChannelAnnouncements = 0x37e3, @@ -191,197 +191,196 @@ namespace Framework.Constants ChatReportFiltered = 0x37cc, ChatReportIgnored = 0x37cb, ChatUnregisterAllAddonPrefixes = 0x37ce, - CheckRafEmailEnabled = 0x36cc, - CheckWowTokenVeteranEligibility = 0x36ea, - ChoiceResponse = 0x32a0, - ClearRaidMarker = 0x31a5, + CheckRafEmailEnabled = 0x36d1, + CheckWowTokenVeteranEligibility = 0x36ef, + ChoiceResponse = 0x329f, + ClearRaidMarker = 0x31a4, ClearTradeItem = 0x315e, ClientPortGraveyard = 0x3529, CloseInteraction = 0x3493, - CloseQuestChoice = 0x32a1, - ClubInvite = 0x36fa, - CollectionItemSetFavorite = 0x3632, - CommentatorEnable = 0x35f0, - CommentatorEnterInstance = 0x35f4, - CommentatorExitInstance = 0x35f5, - CommentatorGetMapInfo = 0x35f1, - CommentatorGetPlayerCooldowns = 0x35f3, - CommentatorGetPlayerInfo = 0x35f2, - CommentatorStartWargame = 0x35ef, - Complaint = 0x366c, + CloseQuestChoice = 0x32a0, + ClubInvite = 0x36ff, + CollectionItemSetFavorite = 0x3634, + CommentatorEnable = 0x35f1, + CommentatorEnterInstance = 0x35f5, + CommentatorExitInstance = 0x35f6, + CommentatorGetMapInfo = 0x35f2, + CommentatorGetPlayerCooldowns = 0x35f4, + CommentatorGetPlayerInfo = 0x35f3, + CommentatorStartWargame = 0x35f0, + Complaint = 0x366e, CompleteCinematic = 0x3547, CompleteMovie = 0x34de, - ConfirmArtifactRespec = 0x31aa, + ConfirmArtifactRespec = 0x31a9, ConfirmRespecWipe = 0x320b, ConnectToFailed = 0x35d4, ContributionContribute = 0x3557, ContributionGetState = 0x3558, ConversationLineStarted = 0x3548, - ConvertConsumptionTime = 0x36fd, - ConvertRaid = 0x364e, - CreateCharacter = 0x3643, - CreateShipment = 0x32ef, - DbQueryBulk = 0x35e4, + ConvertConsumptionTime = 0x3702, + ConvertRaid = 0x3650, + CreateCharacter = 0x3645, + CreateShipment = 0x32ee, + DbQueryBulk = 0x35e5, DeclineGuildInvites = 0x3520, DeclinePetition = 0x3536, DeleteEquipmentSet = 0x350d, - DelFriend = 0x36d1, - DelIgnore = 0x36d5, - DepositReagentBank = 0x332a, - DestroyItem = 0x3292, - DfBootPlayerVote = 0x3615, - DfGetJoinStatus = 0x3613, - DfGetSystemInfo = 0x3612, - DfJoin = 0x3608, - DfLeave = 0x3611, - DfProposalResponse = 0x3607, - DfReadyCheckResponse = 0x3618, - DfSetRoles = 0x3614, - DfTeleport = 0x3616, + DelFriend = 0x36d6, + DelIgnore = 0x36da, + DepositReagentBank = 0x3329, + DestroyItem = 0x3291, + DfBootPlayerVote = 0x3616, + DfGetJoinStatus = 0x3614, + DfGetSystemInfo = 0x3613, + DfJoin = 0x3609, + DfLeave = 0x3612, + DfProposalResponse = 0x3608, + DfReadyCheckResponse = 0x3619, + DfSetRoles = 0x3615, + DfTeleport = 0x3617, DiscardedTimeSyncAcks = 0x3a3c, DismissCritter = 0x34fc, DoMasterLootRoll = 0x3210, - DoReadyCheck = 0x3633, + DoReadyCheck = 0x3635, DuelResponse = 0x34e3, - EjectPassenger = 0x3239, + EjectPassenger = 0x323a, Emote = 0x3543, EnableEncryptionAck = 0x3767, EnableNagle = 0x376b, EnableTaxiNode = 0x34a9, - EngineSurvey = 0x36e4, - EnumCharacters = 0x35e8, - EnumCharactersDeletedByClient = 0x36de, + EngineSurvey = 0x36e9, + EnumCharacters = 0x35e9, + EnumCharactersDeletedByClient = 0x36e3, FarSight = 0x34e9, GameEventDebugDisable = 0x31b0, GameEventDebugEnable = 0x31af, GameObjReportUse = 0x34f0, GameObjUse = 0x34ef, - GarrisonAssignFollowerToBuilding = 0x32da, - GarrisonCancelConstruction = 0x32cb, - GarrisonCheckUpgradeable = 0x331d, - GarrisonCompleteMission = 0x3310, - GarrisonGenerateRecruits = 0x32dd, - GarrisonGetBuildingLandmarks = 0x32eb, - GarrisonGetMissionReward = 0x3341, - GarrisonMissionBonusRoll = 0x3312, - GarrisonPurchaseBuilding = 0x32c7, - GarrisonRecruitFollower = 0x32df, - GarrisonRemoveFollower = 0x3307, - GarrisonRemoveFollowerFromBuilding = 0x32db, - GarrisonRenameFollower = 0x32dc, - GarrisonRequestBlueprintAndSpecializationData = 0x32c6, - GarrisonRequestClassSpecCategoryInfo = 0x32e4, - GarrisonRequestLandingPageShipmentInfo = 0x32ee, - GarrisonRequestShipmentInfo = 0x32ed, - GarrisonResearchTalent = 0x32e0, - GarrisonSetBuildingActive = 0x32c8, - GarrisonSetFollowerFavorite = 0x32d8, - GarrisonSetFollowerInactive = 0x32d4, - GarrisonSetRecruitmentPreferences = 0x32de, - GarrisonStartMission = 0x330f, - GarrisonSwapBuildings = 0x32cc, - GenerateRandomCharacterName = 0x35e7, - GetAccountCharacterList = 0x36b7, - GetChallengeModeRewards = 0x3683, - GetGarrisonInfo = 0x32c1, + GarrisonAssignFollowerToBuilding = 0x32d9, + GarrisonCancelConstruction = 0x32ca, + GarrisonCheckUpgradeable = 0x331c, + GarrisonCompleteMission = 0x330f, + GarrisonGenerateRecruits = 0x32dc, + GarrisonGetBuildingLandmarks = 0x32ea, + GarrisonGetMissionReward = 0x3342, + GarrisonMissionBonusRoll = 0x3311, + GarrisonPurchaseBuilding = 0x32c6, + GarrisonRecruitFollower = 0x32de, + GarrisonRemoveFollower = 0x3306, + GarrisonRemoveFollowerFromBuilding = 0x32da, + GarrisonRenameFollower = 0x32db, + GarrisonRequestBlueprintAndSpecializationData = 0x32c5, + GarrisonRequestClassSpecCategoryInfo = 0x32e3, + GarrisonRequestLandingPageShipmentInfo = 0x32ed, + GarrisonRequestShipmentInfo = 0x32ec, + GarrisonResearchTalent = 0x32df, + GarrisonSetBuildingActive = 0x32c7, + GarrisonSetFollowerFavorite = 0x32d7, + GarrisonSetFollowerInactive = 0x32d3, + GarrisonSetRecruitmentPreferences = 0x32dd, + GarrisonStartMission = 0x330e, + GarrisonSwapBuildings = 0x32cb, + GenerateRandomCharacterName = 0x35e8, + GetAccountCharacterList = 0x36ba, + GetChallengeModeRewards = 0x3685, + GetGarrisonInfo = 0x32c0, GetItemPurchaseData = 0x3531, - GetMirrorImageData = 0x3296, - GetPvpOptionsEnabled = 0x35ee, - GetRemainingGameTime = 0x36ed, - GetTrophyList = 0x3300, - GetUndeleteCharacterCooldownStatus = 0x36e0, - GmTicketAcknowledgeSurvey = 0x3693, - GmTicketGetCaseStatus = 0x3692, - GmTicketGetSystemStatus = 0x3691, + GetMirrorImageData = 0x3295, + GetPvpOptionsEnabled = 0x35ef, + GetRemainingGameTime = 0x36f2, + GetTrophyList = 0x32ff, + GetUndeleteCharacterCooldownStatus = 0x36e5, + GmTicketAcknowledgeSurvey = 0x3697, + GmTicketGetCaseStatus = 0x3696, + GmTicketGetSystemStatus = 0x3695, GossipSelectOption = 0x3494, GrantLevel = 0x34f8, - GuildAddBattlenetFriend = 0x308d, - GuildAddRank = 0x3064, - GuildAssignMemberRank = 0x305f, - GuildAutoDeclineInvitation = 0x3061, + GuildAddBattlenetFriend = 0x308e, + GuildAddRank = 0x3065, + GuildAssignMemberRank = 0x3060, + GuildAutoDeclineInvitation = 0x3062, GuildBankActivate = 0x34b6, GuildBankBuyTab = 0x34c4, GuildBankDepositMoney = 0x34c6, - GuildBankLogQuery = 0x3082, + GuildBankLogQuery = 0x3083, GuildBankQueryTab = 0x34c3, - GuildBankRemainingWithdrawMoneyQuery = 0x3083, - GuildBankSetTabText = 0x3086, - GuildBankTextQuery = 0x3087, + GuildBankRemainingWithdrawMoneyQuery = 0x3084, + GuildBankSetTabText = 0x3087, + GuildBankTextQuery = 0x3088, GuildBankUpdateTab = 0x34c5, GuildBankWithdrawMoney = 0x34c7, - GuildChallengeUpdateRequest = 0x307b, - GuildChangeNameRequest = 0x307e, - GuildDeclineInvitation = 0x3060, - GuildDelete = 0x3068, - GuildDeleteRank = 0x3065, - GuildDemoteMember = 0x305e, - GuildEventLogQuery = 0x3085, - GuildGetAchievementMembers = 0x3071, - GuildGetRanks = 0x306d, - GuildGetRoster = 0x3073, - GuildInviteByName = 0x3606, - GuildLeave = 0x3062, - GuildMemberSendSorRequest = 0x308c, - GuildNewsUpdateSticky = 0x306e, - GuildOfficerRemoveMember = 0x3063, - GuildPermissionsQuery = 0x3084, - GuildPromoteMember = 0x305d, - GuildQueryMembersForRecipe = 0x306b, - GuildQueryMemberRecipes = 0x3069, - GuildQueryNews = 0x306c, - GuildQueryRecipes = 0x306a, - GuildReplaceGuildMaster = 0x3088, - GuildSetAchievementTracking = 0x306f, - GuildSetFocusedAchievement = 0x3070, - GuildSetGuildMaster = 0x36c6, - GuildSetMemberNote = 0x3072, - GuildSetRankPermissions = 0x3067, - GuildShiftRank = 0x3066, - GuildUpdateInfoText = 0x3075, - GuildUpdateMotdText = 0x3074, + GuildChallengeUpdateRequest = 0x307c, + GuildChangeNameRequest = 0x307f, + GuildDeclineInvitation = 0x3061, + GuildDelete = 0x3069, + GuildDeleteRank = 0x3066, + GuildDemoteMember = 0x305f, + GuildEventLogQuery = 0x3086, + GuildGetAchievementMembers = 0x3072, + GuildGetRanks = 0x306e, + GuildGetRoster = 0x3074, + GuildInviteByName = 0x3607, + GuildLeave = 0x3063, + GuildMemberSendSorRequest = 0x308d, + GuildNewsUpdateSticky = 0x306f, + GuildOfficerRemoveMember = 0x3064, + GuildPermissionsQuery = 0x3085, + GuildPromoteMember = 0x305e, + GuildQueryMembersForRecipe = 0x306c, + GuildQueryMemberRecipes = 0x306a, + GuildQueryNews = 0x306d, + GuildQueryRecipes = 0x306b, + GuildReplaceGuildMaster = 0x3089, + GuildSetAchievementTracking = 0x3070, + GuildSetFocusedAchievement = 0x3071, + GuildSetGuildMaster = 0x36cb, + GuildSetMemberNote = 0x3073, + GuildSetRankPermissions = 0x3068, + GuildShiftRank = 0x3067, + GuildUpdateInfoText = 0x3076, + GuildUpdateMotdText = 0x3075, HearthAndResurrect = 0x3509, - HotfixRequest = 0x35e5, + HotfixRequest = 0x35e6, IgnoreTrade = 0x3159, InitiateRolePoll = 0x35da, InitiateTrade = 0x3156, Inspect = 0x352b, - InspectPvp = 0x36a2, InstanceLockResponse = 0x350e, - IslandQueue = 0x3387, + IslandQueue = 0x3388, ItemPurchaseRefund = 0x3532, - ItemTextQuery = 0x331e, + ItemTextQuery = 0x331d, JoinPetBattleQueue = 0x31dc, JoinRatedBattleground = 0x3177, - KeepAlive = 0x367f, + KeepAlive = 0x3681, KeyboundOverride = 0x3222, LearnPvpTalents = 0x3556, LearnTalents = 0x3554, - LeaveGroup = 0x3649, + LeaveGroup = 0x364b, LeavePetBattleQueue = 0x31dd, - LfgListApplyToGroup = 0x360c, - LfgListCancelApplication = 0x360d, - LfgListDeclineApplicant = 0x360e, - LfgListGetStatus = 0x360a, - LfgListInviteApplicant = 0x360f, - LfgListInviteResponse = 0x3610, - LfgListJoin = 0x3359, - LfgListLeave = 0x3609, - LfgListSearch = 0x360b, - LfgListUpdateRequest = 0x335a, - LfGuildAddRecruit = 0x361b, - LfGuildBrowse = 0x361d, - LfGuildDeclineRecruit = 0x3078, - LfGuildGetApplications = 0x3079, - LfGuildGetGuildPost = 0x3076, - LfGuildGetRecruits = 0x3077, - LfGuildRemoveRecruit = 0x307a, - LfGuildSetGuildPost = 0x361c, + LfgListApplyToGroup = 0x360d, + LfgListCancelApplication = 0x360e, + LfgListDeclineApplicant = 0x360f, + LfgListGetStatus = 0x360b, + LfgListInviteApplicant = 0x3610, + LfgListInviteResponse = 0x3611, + LfgListJoin = 0x335a, + LfgListLeave = 0x360a, + LfgListSearch = 0x360c, + LfgListUpdateRequest = 0x335b, + LfGuildAddRecruit = 0x361c, + LfGuildBrowse = 0x361e, + LfGuildDeclineRecruit = 0x3079, + LfGuildGetApplications = 0x307a, + LfGuildGetGuildPost = 0x3077, + LfGuildGetRecruits = 0x3078, + LfGuildRemoveRecruit = 0x307b, + LfGuildSetGuildPost = 0x361d, ListInventory = 0x34a1, - LiveRegionAccountRestore = 0x36ba, - LiveRegionCharacterCopy = 0x36b9, - LiveRegionGetAccountCharacterList = 0x36b8, - LoadingScreenNotify = 0x35f8, - LoadSelectedTrophy = 0x3301, + LiveRegionAccountRestore = 0x36bd, + LiveRegionCharacterCopy = 0x36bc, + LiveRegionGetAccountCharacterList = 0x36bb, + LoadingScreenNotify = 0x35f9, + LoadSelectedTrophy = 0x3300, LogoutCancel = 0x34d9, LogoutInstant = 0x34da, LogoutRequest = 0x34d7, @@ -392,22 +391,22 @@ namespace Framework.Constants LootRelease = 0x3212, LootRoll = 0x3213, LootUnit = 0x320c, - LowLevelRaid1 = 0x36a0, + LowLevelRaid1 = 0x36a4, LowLevelRaid2 = 0x3515, MailCreateTextItem = 0x353d, MailDelete = 0x3224, MailGetList = 0x3538, MailMarkAsRead = 0x353c, - MailReturnToSender = 0x3655, + MailReturnToSender = 0x3657, MailTakeItem = 0x353a, MailTakeMoney = 0x3539, MakeContitionalAppearancePermanent = 0x3227, MasterLootItem = 0x320f, - MinimapPing = 0x364b, - MissileTrajectoryCollision = 0x318a, + MinimapPing = 0x364d, + MissileTrajectoryCollision = 0x3189, MountClearFanfare = 0x312d, - MountSetFavorite = 0x3631, - MountSpecialAnim = 0x3281, + MountSetFavorite = 0x3633, + MountSpecialAnim = 0x3280, MoveApplyMovementForceAck = 0x3a12, MoveChangeTransport = 0x3a2c, MoveChangeVehicleSeats = 0x3a31, @@ -420,11 +419,11 @@ namespace Framework.Constants MoveFeatherFallAck = 0x3a19, MoveForceFlightBackSpeedChangeAck = 0x3a2b, MoveForceFlightSpeedChangeAck = 0x3a2a, - MoveForceMovementForceSpeedChangeAck = 0x3a3d, MoveForcePitchRateChangeAck = 0x3a2f, MoveForceRootAck = 0x3a0b, MoveForceRunBackSpeedChangeAck = 0x3a09, MoveForceRunSpeedChangeAck = 0x3a08, + MoveForceSetModMovementForceMagnitudeAck = 0x3a3d, MoveForceSwimBackSpeedChangeAck = 0x3a1f, MoveForceSwimSpeedChangeAck = 0x3a0a, MoveForceTurnRateChangeAck = 0x3a20, @@ -438,6 +437,7 @@ namespace Framework.Constants MoveKnockBackAck = 0x3a0f, MoveRemoveMovementForces = 0x3a14, MoveRemoveMovementForceAck = 0x3a13, + MoveSeamlessTransferComplete = 0x3a3f, MoveSetCanFlyAck = 0x3a24, MoveSetCanTurnWhileFallingAck = 0x3a22, MoveSetCollisionHeightAck = 0x3a36, @@ -469,71 +469,72 @@ namespace Framework.Constants MoveTeleportAck = 0x39f8, MoveTimeSkipped = 0x3a18, MoveToggleCollisionCheat = 0x3a05, + MoveUpdateFallSpeed = 0x3a17, MoveWaterWalkAck = 0x3a1a, NeutralPlayerSelectFaction = 0x31d2, NextCinematicCamera = 0x3546, - ObjectUpdateFailed = 0x3180, - ObjectUpdateRescued = 0x3181, - OfferPetition = 0x36b0, + ObjectUpdateFailed = 0x317f, + ObjectUpdateRescued = 0x3180, + OfferPetition = 0x36b3, OpeningCinematic = 0x3545, - OpenItem = 0x331f, - OpenMissionNpc = 0x32e6, - OpenShipmentNpc = 0x32ec, - OpenTradeskillNpc = 0x32f7, + OpenItem = 0x331e, + OpenMissionNpc = 0x32e5, + OpenShipmentNpc = 0x32eb, + OpenTradeskillNpc = 0x32f6, OptOutOfLoot = 0x34f7, - PartyInvite = 0x3602, - PartyInviteResponse = 0x3603, - PartyUninvite = 0x3647, + PartyInvite = 0x3603, + PartyInviteResponse = 0x3604, + PartyUninvite = 0x3649, PetitionBuy = 0x34c9, - PetitionRenameGuild = 0x36c7, + PetitionRenameGuild = 0x36cc, PetitionShowList = 0x34c8, PetitionShowSignatures = 0x34ca, PetAbandon = 0x348d, PetAction = 0x348b, PetBattleFinalNotify = 0x31e1, - PetBattleInput = 0x3640, + PetBattleInput = 0x3642, PetBattleQueueProposeMatchResult = 0x3223, PetBattleQuitNotify = 0x31e0, - PetBattleReplaceFrontPet = 0x3641, + PetBattleReplaceFrontPet = 0x3643, PetBattleRequestPvp = 0x31da, PetBattleRequestUpdate = 0x31db, PetBattleRequestWild = 0x31d8, PetBattleScriptErrorNotify = 0x31e2, PetBattleWildLocationFail = 0x31d9, PetCancelAura = 0x348e, - PetCastSpell = 0x329a, - PetRename = 0x3685, + PetCastSpell = 0x3299, + PetRename = 0x3687, PetSetAction = 0x348a, PetSpellAutocast = 0x348f, PetStopAttack = 0x348c, Ping = 0x3768, - PlayerLogin = 0x35ea, + PlayerLogin = 0x35eb, ProtocolMismatch = 0x376e, PushQuestToParty = 0x349f, - PvpLogData = 0x317b, - QueryBattlePetName = 0x3276, - QueryCommunityName = 0x368c, - QueryCorpseLocationFromClient = 0x3660, - QueryCorpseTransport = 0x3661, - QueryCountdownTimer = 0x31a8, - QueryCreature = 0x3270, - QueryGameObject = 0x3271, - QueryGarrisonCreatureName = 0x3277, - QueryGuildInfo = 0x368e, + PvpLogData = 0x317a, + QueryBattlePetName = 0x3275, + QueryCommunityName = 0x368e, + QueryCorpseLocationFromClient = 0x3662, + QueryCorpseTransport = 0x3663, + QueryCountdownTimer = 0x31a7, + QueryCreature = 0x326f, + QueryGameObject = 0x3270, + QueryGarrisonCreatureName = 0x3276, + QueryGuildInfo = 0x3691, QueryInspectAchievements = 0x3503, QueryNextMailTime = 0x353b, - QueryNpcText = 0x3272, - QueryPageText = 0x3274, - QueryPetition = 0x3278, - QueryPetName = 0x3275, - QueryPlayerName = 0x368b, + QueryNpcText = 0x3271, + QueryPageText = 0x3273, + QueryPetition = 0x3277, + QueryPetName = 0x3274, + QueryPlayerName = 0x368d, QueryQuestCompletionNpcs = 0x3174, - QueryQuestInfo = 0x3273, - QueryRealmName = 0x368d, - QueryScenarioPoi = 0x3656, + QueryQuestInfo = 0x3272, + QueryRealmName = 0x3690, + QueryScenarioPoi = 0x3658, QueryTime = 0x34d6, - QueryTreasurePicker = 0x3343, - QueryVoidStorage = 0x31a1, + QueryTreasurePicker = 0x3344, + QueryVoidStorage = 0x31a0, QuestConfirmAccept = 0x349e, QuestGiverAcceptQuest = 0x3498, QuestGiverChooseReward = 0x349a, @@ -544,147 +545,150 @@ namespace Framework.Constants QuestGiverStatusMultipleQuery = 0x349d, QuestGiverStatusQuery = 0x349c, QuestLogRemoveQuest = 0x3530, - QuestPoiQuery = 0x36b1, + QuestPoiQuery = 0x36b4, QuestPushResult = 0x34a0, QueuedMessagesEnd = 0x376c, - QuickJoinAutoAcceptRequests = 0x3709, - QuickJoinRequestInvite = 0x3708, - QuickJoinRespondToInvite = 0x3707, - QuickJoinSignalToastDisplayed = 0x3706, - RaidOrBattlegroundEngineSurvey = 0x36e5, - RandomRoll = 0x3654, - ReadyCheckResponse = 0x3634, - ReadItem = 0x3320, + QuickJoinAutoAcceptRequests = 0x370e, + QuickJoinRequestInvite = 0x370d, + QuickJoinRespondToInvite = 0x370c, + QuickJoinSignalToastDisplayed = 0x370b, + RaidOrBattlegroundEngineSurvey = 0x36ea, + RandomRoll = 0x3656, + ReadyCheckResponse = 0x3636, + ReadItem = 0x331f, ReclaimCorpse = 0x34dc, - RecruitAFriend = 0x36cd, - RedeemWowTokenConfirm = 0x36ef, - RedeemWowTokenStart = 0x36ee, - RemoveNewItem = 0x3346, - ReorderCharacters = 0x35e9, + RecruitAFriend = 0x36d2, + RedeemWowTokenConfirm = 0x36f4, + RedeemWowTokenStart = 0x36f3, + RemoveNewItem = 0x3347, + ReorderCharacters = 0x35ea, RepairItem = 0x34ed, - ReplaceTrophy = 0x3302, + ReplaceTrophy = 0x3301, RepopRequest = 0x3528, - ReportClientVariables = 0x3703, - ReportEnabledAddons = 0x3702, - ReportKeybindingExecutionCounts = 0x3704, + ReportClientVariables = 0x3708, + ReportEnabledAddons = 0x3707, + ReportKeybindingExecutionCounts = 0x3709, ReportPvpPlayerAfk = 0x34f5, - RequestAccountData = 0x3696, - RequestAreaPoiUpdate = 0x3345, - RequestBattlefieldStatus = 0x35dc, - RequestCategoryCooldowns = 0x317d, + ReportServerLag = 0x338d, + RequestAccountData = 0x369a, + RequestAreaPoiUpdate = 0x3346, + RequestBattlefieldStatus = 0x35dd, + RequestCategoryCooldowns = 0x317c, RequestCemeteryList = 0x3175, RequestChallengeModeAffixes = 0x3205, - RequestConquestFormulaConstants = 0x32b3, - RequestConsumptionConversionInfo = 0x36fc, + RequestCharacterGuildFollowInfo = 0x3692, + RequestConquestFormulaConstants = 0x32b2, + RequestConsumptionConversionInfo = 0x3701, RequestCrowdControlSpell = 0x352c, RequestForcedReactions = 0x3207, - RequestGuildPartyState = 0x31a7, - RequestGuildRewardsList = 0x31a6, - RequestHonorStats = 0x317a, - RequestLfgListBlacklist = 0x32a3, - RequestPartyJoinUpdates = 0x35f7, - RequestPartyMemberStats = 0x3653, + RequestGuildPartyState = 0x31a6, + RequestGuildRewardsList = 0x31a5, + RequestLfgListBlacklist = 0x32a2, + RequestPartyJoinUpdates = 0x35f8, + RequestPartyMemberStats = 0x3655, RequestPetInfo = 0x3490, - RequestPlayedTime = 0x327b, - RequestPvpBrawlInfo = 0x3195, - RequestPvpRewards = 0x3194, - RequestRaidInfo = 0x36c8, - RequestRatedBattlefieldInfo = 0x35e3, + RequestPlayedTime = 0x327a, + RequestPvpBrawlInfo = 0x3194, + RequestPvpRewards = 0x3193, + RequestQuestLinesForMap = 0x3389, + RequestRaidInfo = 0x36cd, + RequestRatedBattlefieldInfo = 0x35e4, + RequestRealmGuildMasterInfo = 0x309b, RequestResearchHistory = 0x3167, RequestStabledPets = 0x3491, - RequestVehicleExit = 0x3234, - RequestVehicleNextSeat = 0x3236, - RequestVehiclePrevSeat = 0x3235, - RequestVehicleSwitchSeat = 0x3237, - RequestWorldQuestUpdate = 0x3344, - RequestWowTokenMarketPrice = 0x36e7, + RequestVehicleExit = 0x3235, + RequestVehicleNextSeat = 0x3237, + RequestVehiclePrevSeat = 0x3236, + RequestVehicleSwitchSeat = 0x3238, + RequestWorldQuestUpdate = 0x3345, + RequestWowTokenMarketPrice = 0x36ec, ResetChallengeMode = 0x3203, ResetChallengeModeCheat = 0x3204, - ResetInstances = 0x3668, - ResurrectResponse = 0x3684, - RevertMonumentAppearance = 0x3304, - RideVehicleInteract = 0x3238, - SaveCufProfiles = 0x318b, + ResetInstances = 0x366a, + ResurrectResponse = 0x3686, + RevertMonumentAppearance = 0x3303, + RideVehicleInteract = 0x3239, + SaveCufProfiles = 0x318a, SaveEquipmentSet = 0x350c, - SaveGuildEmblem = 0x32a7, + SaveGuildEmblem = 0x32a6, ScenePlaybackCanceled = 0x321f, ScenePlaybackComplete = 0x321e, SceneTriggerEvent = 0x3220, SelfRes = 0x3533, SellItem = 0x34a2, - SellWowTokenConfirm = 0x36e9, - SellWowTokenStart = 0x36e8, - SendContactList = 0x36cf, - SendMail = 0x35fa, - SendSorRequestViaAddress = 0x3620, + SellWowTokenConfirm = 0x36ee, + SellWowTokenStart = 0x36ed, + SendContactList = 0x36d4, + SendMail = 0x35fb, + SendSorRequestViaAddress = 0x3621, SendTextEmote = 0x3488, SetAchievementsHidden = 0x3225, SetActionBarToggles = 0x3534, - SetActionButton = 0x3635, + SetActionButton = 0x3637, SetActiveMover = 0x3a37, - SetAdvancedCombatLogging = 0x32b4, - SetAssistantLeader = 0x364f, - SetBackpackAutosortDisabled = 0x3323, - SetBankAutosortDisabled = 0x3324, - SetContactNotes = 0x36d2, + SetAdvancedCombatLogging = 0x32b3, + SetAssistantLeader = 0x3651, + SetBackpackAutosortDisabled = 0x3322, + SetBankAutosortDisabled = 0x3323, + SetContactNotes = 0x36d7, SetCurrencyFlags = 0x3169, SetDifficultyId = 0x3221, - SetDungeonDifficulty = 0x3682, - SetEveryoneIsAssistant = 0x3617, + SetDungeonDifficulty = 0x3684, + SetEveryoneIsAssistant = 0x3618, SetFactionAtWar = 0x34df, SetFactionInactive = 0x34e1, SetFactionNotAtWar = 0x34e0, SetGameEventDebugViewState = 0x31b8, - SetInsertItemsLeftToRight = 0x3326, - SetLfgBonusFactionId = 0x32a2, - SetLootMethod = 0x3648, + SetInsertItemsLeftToRight = 0x3325, + SetLfgBonusFactionId = 0x32a1, + SetLootMethod = 0x364a, SetLootSpecialization = 0x3541, - SetPartyAssignment = 0x3651, - SetPartyLeader = 0x364a, + SetPartyAssignment = 0x3653, + SetPartyLeader = 0x364c, SetPetSlot = 0x3168, - SetPlayerDeclinedNames = 0x368a, + SetPlayerDeclinedNames = 0x368c, SetPreferredCemetery = 0x3176, - SetPvp = 0x32ab, - SetRaidDifficulty = 0x36dc, + SetPvp = 0x32aa, + SetRaidDifficulty = 0x36e1, SetRole = 0x35d9, - SetSavedInstanceExtend = 0x3688, + SetSavedInstanceExtend = 0x368a, SetSelection = 0x352a, SetSheathed = 0x3489, - SetSortBagsRightToLeft = 0x3325, + SetSortBagsRightToLeft = 0x3324, SetTaxiBenchmarkMode = 0x34f4, - SetTitle = 0x327f, + SetTitle = 0x327e, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x32e8, - SetWarMode = 0x32ac, + SetUsingPartyGarrison = 0x32e7, + SetWarMode = 0x32ab, SetWatchedFaction = 0x34e2, - ShowTradeSkill = 0x36c0, + ShowTradeSkill = 0x36c5, SignPetition = 0x3535, - SilencePartyTalker = 0x3652, + SilencePartyTalker = 0x3654, SocketGems = 0x34ec, - SortBags = 0x3327, - SortBankBags = 0x3328, - SortReagentBankBags = 0x3329, + SortBags = 0x3326, + SortBankBags = 0x3327, + SortReagentBankBags = 0x3328, SpellClick = 0x3495, SpiritHealerActivate = 0x34af, SplitItem = 0x399e, - StandStateChange = 0x3189, + StandStateChange = 0x3188, StartChallengeMode = 0x354c, - StartSpectatorWarGame = 0x35df, - StartWarGame = 0x35de, - SummonResponse = 0x366a, - SupportTicketSubmitBug = 0x3645, - SupportTicketSubmitComplaint = 0x3644, - SupportTicketSubmitSuggestion = 0x3646, + StartSpectatorWarGame = 0x35e0, + StartWarGame = 0x35df, + SummonResponse = 0x366c, + SupportTicketSubmitBug = 0x3647, + SupportTicketSubmitComplaint = 0x3646, + SupportTicketSubmitSuggestion = 0x3648, SurrenderArena = 0x3173, SuspendCommsAck = 0x3764, SuspendTokenResponse = 0x376a, SwapInvItem = 0x399d, SwapItem = 0x399c, - SwapSubGroups = 0x364d, - SwapVoidItem = 0x31a3, - TabardVendorActivate = 0x32a8, + SwapSubGroups = 0x364f, + SwapVoidItem = 0x31a2, + TabardVendorActivate = 0x32a7, TalkToGossip = 0x3492, TaxiNodeStatusQuery = 0x34a8, TaxiQueryAvailableNodes = 0x34aa, @@ -693,49 +697,50 @@ namespace Framework.Constants TimeSyncResponse = 0x3a38, TimeSyncResponseDropped = 0x3a3a, TimeSyncResponseFailed = 0x3a39, - ToggleDifficulty = 0x3657, - TogglePvp = 0x32aa, + ToggleDifficulty = 0x3659, + TogglePvp = 0x32a9, TotemDestroyed = 0x34fb, - TradeSkillSetFavorite = 0x3342, + ToyClearFanfare = 0x312e, + TradeSkillSetFavorite = 0x3343, TrainerBuySpell = 0x34ae, TrainerList = 0x34ad, - TransmogrifyItems = 0x3196, + TransmogrifyItems = 0x3195, TurnInPetition = 0x3537, - Tutorial = 0x36dd, + Tutorial = 0x36e2, TwitterCheckStatus = 0x312a, TwitterConnect = 0x3127, TwitterDisconnect = 0x312b, - TwitterPost = 0x332b, - UiTimeRequest = 0x369b, + TwitterPost = 0x332a, + UiTimeRequest = 0x369f, UnacceptTrade = 0x315b, - UndeleteCharacter = 0x36df, + UndeleteCharacter = 0x36e4, UnlearnSkill = 0x34e6, - UnlearnSpecialization = 0x31a4, - UnlockVoidStorage = 0x31a0, - UpdateAccountData = 0x3697, - UpdateAreaTriggerVisual = 0x329d, - UpdateClientSettings = 0x3664, + UnlearnSpecialization = 0x31a3, + UnlockVoidStorage = 0x319f, + UpdateAccountData = 0x369b, + UpdateAreaTriggerVisual = 0x329c, + UpdateClientSettings = 0x3666, UpdateMissileTrajectory = 0x3a3e, - UpdateRaidTarget = 0x3650, - UpdateSpellVisual = 0x329c, - UpdateVasPurchaseStates = 0x36f5, - UpdateWowTokenAuctionableList = 0x36f0, - UpdateWowTokenCount = 0x36e6, - UpgradeGarrison = 0x32bc, + UpdateRaidTarget = 0x3652, + UpdateSpellVisual = 0x329b, + UpdateVasPurchaseStates = 0x36fa, + UpdateWowTokenAuctionableList = 0x36f5, + UpdateWowTokenCount = 0x36eb, + UpgradeGarrison = 0x32bb, UpgradeItem = 0x3226, - UsedFollow = 0x3186, - UseCritterItem = 0x323e, + UsedFollow = 0x3185, + UseCritterItem = 0x323f, UseEquipmentSet = 0x3995, - UseItem = 0x3297, - UseToy = 0x3299, - ViolenceLevel = 0x3184, - VoiceChatJoinChannel = 0x3712, - VoiceChatLogin = 0x3711, - VoidStorageTransfer = 0x31a2, - WardenData = 0x35ec, - Who = 0x3681, - WhoIs = 0x3680, - WorldPortResponse = 0x35f9, + UseItem = 0x3296, + UseToy = 0x3298, + ViolenceLevel = 0x3183, + VoiceChatJoinChannel = 0x3717, + VoiceChatLogin = 0x3716, + VoidStorageTransfer = 0x31a1, + WardenData = 0x35ed, + Who = 0x3683, + WhoIs = 0x3682, + WorldPortResponse = 0x35fa, WrapItem = 0x3994, Max = 0x3FFF, @@ -744,44 +749,46 @@ namespace Framework.Constants public enum ServerOpcodes : uint { - AbortNewWorld = 0x25ad, - AccountCriteriaUpdate = 0x2654, + AbortNewWorld = 0x25ae, + AccountCriteriaUpdate = 0x2655, AccountDataTimes = 0x2752, AccountMountUpdate = 0x25c3, AccountToysUpdate = 0x25c4, AchievementDeleted = 0x2727, - AchievementEarned = 0x2662, - ActivateTaxiReply = 0x26ab, + AchievementEarned = 0x2663, + ActivateTaxiReply = 0x26ac, ActiveGlyphs = 0x2c53, - AddBattlenetFriendResponse = 0x265c, + AddBattlenetFriendResponse = 0x265d, AddItemPassive = 0x25bf, - AddLossOfControl = 0x269b, - AddRunePower = 0x26ea, + AddLossOfControl = 0x269c, + AddRunePower = 0x26eb, AdjustSplineDuration = 0x25e8, AdventureMapPoiQueryResponse = 0x2845, AeLootTargets = 0x262e, AeLootTargetAck = 0x262f, - AiReaction = 0x26e7, + AiReaction = 0x26e8, AllAccountCriteria = 0x2570, AllAchievementData = 0x256f, AllGuildAchievements = 0x29b8, - ArchaeologySurveryCast = 0x2586, + ArchaeologySurveryCast = 0x2587, AreaPoiUpdate = 0x2852, AreaSpiritHealerTime = 0x278a, - AreaTriggerDenied = 0x26a2, + AreaTriggerDenied = 0x26a3, AreaTriggerNoCorpse = 0x275e, - AreaTriggerRePath = 0x263E, - AreaTriggerReShape = 0x2642, - ArenaCrowdControlSpells = 0x2650, - ArenaError = 0x271a, - ArenaPrepOpponentSpecializations = 0x2667, + AreaTriggerPlayVisualEvent = 0x2640, + AreaTriggerRePath = 0x263e, + AreaTriggerReShape = 0x2643, + ArenaCrowdControlSpells = 0x2651, + ArenaMatchEnd = 0x28a9, + ArenaMatchStart = 0x28a8, + ArenaPrepOpponentSpecializations = 0x2668, ArtifactForgeOpened = 0x27ee, ArtifactRespecConfirm = 0x27f1, ArtifactTraitsRefunded = 0x27f2, ArtifactXpGain = 0x2835, AttackerStateUpdate = 0x27db, - AttackStart = 0x266f, - AttackStop = 0x2670, + AttackStart = 0x2670, + AttackStop = 0x2671, AttackSwingError = 0x273c, AttackSwingLandedLog = 0x273d, AuctionClosedNotification = 0x2731, @@ -799,24 +806,25 @@ namespace Framework.Constants AuraUpdate = 0x2c22, AuthChallenge = 0x3048, AuthResponse = 0x256c, - AvailableHotfixes = 0x25a1, + AvailableHotfixes = 0x25a2, + AzeriteEmpoweredItemEquippedStatusChanged = 0x2876, AzeriteEmpoweredItemRespecOpen = 0x283f, - AzeriteXpGain = 0x2878, - BanReason = 0x26b7, - BarberShopResult = 0x26f0, - BattlefieldList = 0x2594, - BattlefieldPortDenied = 0x259a, - BattlefieldStatusActive = 0x2590, - BattlefieldStatusFailed = 0x2593, - BattlefieldStatusNeedConfirmation = 0x258f, - BattlefieldStatusNone = 0x2592, - BattlefieldStatusQueued = 0x2591, - BattlefieldStatusWaitForGroups = 0x25a5, - BattlegroundInfoThrottled = 0x259b, + AzeriteXpGain = 0x2875, + BanReason = 0x26b8, + BarberShopResult = 0x26f1, + BattlefieldList = 0x2595, + BattlefieldPortDenied = 0x259b, + BattlefieldStatusActive = 0x2591, + BattlefieldStatusFailed = 0x2594, + BattlefieldStatusNeedConfirmation = 0x2590, + BattlefieldStatusNone = 0x2593, + BattlefieldStatusQueued = 0x2592, + BattlefieldStatusWaitForGroups = 0x25a6, + BattlegroundInfoThrottled = 0x259c, BattlegroundInit = 0x27a9, - BattlegroundPlayerJoined = 0x2598, - BattlegroundPlayerLeft = 0x2599, - BattlegroundPlayerPositions = 0x2595, + BattlegroundPlayerJoined = 0x2599, + BattlegroundPlayerLeft = 0x259a, + BattlegroundPlayerPositions = 0x2596, BattlegroundPoints = 0x27a8, BattlenetChallengeAbort = 0x27da, BattlenetChallengeStart = 0x27d9, @@ -824,7 +832,7 @@ namespace Framework.Constants BattlenetRealmListTicket = 0x284f, BattlenetResponse = 0x284c, BattlenetSetSessionState = 0x284e, - BattlenetUpdateSessionKey = 0x2872, + BattlenetUpdateSessionKey = 0x286f, BattlePayAckFailed = 0x27d2, BattlePayBattlePetDelivered = 0x27c7, BattlePayConfirmPurchase = 0x27d1, @@ -835,24 +843,27 @@ namespace Framework.Constants BattlePayGetProductListResponse = 0x27bf, BattlePayGetPurchaseListResponse = 0x27c0, BattlePayMountDelivered = 0x27c6, - BattlePayOpenCheckoutResult = 0x286b, + BattlePayOpenCheckoutResult = 0x2868, BattlePayPurchaseUpdate = 0x27d0, BattlePayStartDistributionAssignToTargetResponse = 0x27ce, BattlePayStartPurchaseResponse = 0x27cd, - BattlePaySubscriptionChanged = 0x2874, - BattlePayVasBnetTransferValidationResult = 0x2869, + BattlePaySubscriptionChanged = 0x2871, + BattlePayToyDelivered = 0x27c8, + BattlePayVasBnetTransferValidationResult = 0x2866, BattlePayVasBoostConsumed = 0x27c2, BattlePayVasCharacterList = 0x2838, BattlePayVasCharacterQueueStatus = 0x2864, + BattlePayVasGuildFollowInfo = 0x29e7, + BattlePayVasGuildMasterList = 0x29e6, BattlePayVasPurchaseComplete = 0x283b, BattlePayVasPurchaseList = 0x283c, BattlePayVasPurchaseStarted = 0x283a, BattlePayVasRealmList = 0x2839, BattlePayVasTransferQueueStatus = 0x2863, BattlePetsHealed = 0x260a, - BattlePetCageDateError = 0x26a5, + BattlePetCageDateError = 0x26a6, BattlePetDeleted = 0x2607, - BattlePetError = 0x2657, + BattlePetError = 0x2658, BattlePetJournal = 0x2606, BattlePetJournalLockAcquired = 0x2604, BattlePetJournalLockDenied = 0x2605, @@ -864,55 +875,55 @@ namespace Framework.Constants BattlePetUpdates = 0x2600, BinderConfirm = 0x2742, BindPointUpdate = 0x257c, - BlackMarketBidOnItemResult = 0x2646, - BlackMarketOpenResult = 0x2644, - BlackMarketOutbid = 0x2647, - BlackMarketRequestItemsResult = 0x2645, - BlackMarketWon = 0x2648, - BonusRollEmpty = 0x2664, - BonusRollFailed = 0x287b, + BlackMarketBidOnItemResult = 0x2647, + BlackMarketOpenResult = 0x2645, + BlackMarketOutbid = 0x2648, + BlackMarketRequestItemsResult = 0x2646, + BlackMarketWon = 0x2649, + BonusRollEmpty = 0x2665, + BonusRollFailed = 0x2879, BossKillCredit = 0x27cc, - BreakTarget = 0x266e, + BreakTarget = 0x266f, BroadcastAchievement = 0x2bbc, - BuyFailed = 0x26f9, - BuySucceeded = 0x26f8, + BuyFailed = 0x26fa, + BuySucceeded = 0x26f9, CacheInfo = 0x274c, CacheVersion = 0x274b, - CalendarClearPendingAction = 0x26cb, - CalendarCommandResult = 0x26cc, - CalendarEventInitialInvites = 0x26bb, - CalendarEventInvite = 0x26bc, - CalendarEventInviteAlert = 0x26c0, - CalendarEventInviteModeratorStatus = 0x26bf, - CalendarEventInviteNotes = 0x26c5, - CalendarEventInviteNotesAlert = 0x26c6, - CalendarEventInviteRemoved = 0x26bd, - CalendarEventInviteRemovedAlert = 0x26c2, - CalendarEventInviteStatus = 0x26be, - CalendarEventInviteStatusAlert = 0x26c1, - CalendarEventRemovedAlert = 0x26c3, - CalendarEventUpdatedAlert = 0x26c4, - CalendarRaidLockoutAdded = 0x26c7, - CalendarRaidLockoutRemoved = 0x26c8, - CalendarRaidLockoutUpdated = 0x26c9, - CalendarSendCalendar = 0x26b9, - CalendarSendEvent = 0x26ba, - CalendarSendNumPending = 0x26ca, + CalendarClearPendingAction = 0x26cc, + CalendarCommandResult = 0x26cd, + CalendarEventInitialInvites = 0x26bc, + CalendarEventInvite = 0x26bd, + CalendarEventInviteAlert = 0x26c1, + CalendarEventInviteModeratorStatus = 0x26c0, + CalendarEventInviteNotes = 0x26c6, + CalendarEventInviteNotesAlert = 0x26c7, + CalendarEventInviteRemoved = 0x26be, + CalendarEventInviteRemovedAlert = 0x26c3, + CalendarEventInviteStatus = 0x26bf, + CalendarEventInviteStatusAlert = 0x26c2, + CalendarEventRemovedAlert = 0x26c4, + CalendarEventUpdatedAlert = 0x26c5, + CalendarRaidLockoutAdded = 0x26c8, + CalendarRaidLockoutRemoved = 0x26c9, + CalendarRaidLockoutUpdated = 0x26ca, + CalendarSendCalendar = 0x26ba, + CalendarSendEvent = 0x26bb, + CalendarSendNumPending = 0x26cb, CameraEffect = 0x276f, CancelAutoRepeat = 0x271b, CancelCombat = 0x273a, CancelOrphanSpellVisual = 0x2c46, - CancelScene = 0x2656, + CancelScene = 0x2657, CancelSpellVisual = 0x2c44, CancelSpellVisualKit = 0x2c48, - CanDuelResult = 0x2679, + CanDuelResult = 0x267a, CastFailed = 0x2c56, CategoryCooldown = 0x2c16, ChallengeModeAffixes = 0x2624, ChallengeModeAllMapStats = 0x2623, ChallengeModeComplete = 0x2621, - ChallengeModeNewPlayerRecord = 0x2626, - ChallengeModeNewPlayerSeasonRecord = 0x2627, + ChallengeModeNewPlayerRecord = 0x2627, + ChallengeModeNewPlayerSeasonRecord = 0x2628, ChallengeModeRequestLeadersResult = 0x2625, ChallengeModeReset = 0x2620, ChallengeModeRewards = 0x2622, @@ -924,7 +935,7 @@ namespace Framework.Constants ChannelNotifyJoined = 0x2bc1, ChannelNotifyLeft = 0x2bc2, CharacterClassTrialCreate = 0x280c, - CharacterInventoryOverflowWarning = 0x2873, + CharacterInventoryOverflowWarning = 0x2870, CharacterItemFixup = 0x285f, CharacterLoginFailed = 0x274d, CharacterObjectTestResponse = 0x27d8, @@ -949,77 +960,77 @@ namespace Framework.Constants ChatRestricted = 0x2bb3, ChatServerMessage = 0x2bc4, CheatIgnoreDimishingReturns = 0x2c12, - CheckWargameEntry = 0x259e, + CheckWargameEntry = 0x259f, ClearAllSpellCharges = 0x2c27, ClearBossEmotes = 0x25cd, - ClearCooldown = 0x26ec, + ClearCooldown = 0x26ed, ClearCooldowns = 0x2c26, - ClearLossOfControl = 0x269d, + ClearLossOfControl = 0x269e, ClearSpellCharges = 0x2c28, - ClearTarget = 0x26e3, + ClearTarget = 0x26e4, CoinRemoved = 0x262d, - CombatEventFailed = 0x2671, + CombatEventFailed = 0x2672, CommentatorMapInfo = 0x274f, CommentatorPlayerInfo = 0x2750, CommentatorStateChanged = 0x274e, - ComplaintResult = 0x26da, + ComplaintResult = 0x26db, CompleteShipmentResponse = 0x27ea, ConnectTo = 0x304d, ConquestFormulaConstants = 0x27d3, - ConsoleWrite = 0x2653, + ConsoleWrite = 0x2654, ConsumptionConversionInfoResponse = 0x2853, ConsumptionConversionResult = 0x2854, ContactList = 0x27d6, - ContributionCollectorState = 0x286a, - ControlUpdate = 0x2666, + ContributionCollectorState = 0x2867, + ControlUpdate = 0x2667, CooldownCheat = 0x2783, - CooldownEvent = 0x26eb, - CorpseLocation = 0x266d, + CooldownEvent = 0x26ec, + CorpseLocation = 0x266e, CorpseReclaimDelay = 0x2796, CorpseTransportQuery = 0x275a, CreateChar = 0x2747, CreateShipmentResponse = 0x27e9, CriteriaDeleted = 0x2726, CriteriaUpdate = 0x2720, - CrossedInebriationThreshold = 0x26f4, + CrossedInebriationThreshold = 0x26f5, CustomLoadScreen = 0x25e3, DailyQuestsReset = 0x2a80, DamageCalcLog = 0x2814, - DbReply = 0x25a0, - DeathReleaseLoc = 0x270e, + DbReply = 0x25a1, + DeathReleaseLoc = 0x270f, DefenseMessage = 0x2bb6, DeleteChar = 0x2748, DestroyArenaUnit = 0x278c, DestructibleBuildingDamage = 0x273b, - DifferentInstanceFromParty = 0x258a, + DifferentInstanceFromParty = 0x258b, DisenchantCredit = 0x25bc, - Dismount = 0x26e2, + Dismount = 0x26e3, DismountResult = 0x257b, DispelFailed = 0x2c30, DisplayGameError = 0x25b5, - DisplayPlayerChoice = 0x26a6, - DisplayPromotion = 0x266a, + DisplayPlayerChoice = 0x26a7, + DisplayPromotion = 0x266b, DisplayQuestPopup = 0x2a9d, DisplayToast = 0x263a, DontAutoPushSpellsToActionBar = 0x25f7, DropNewConnection = 0x304c, - DuelComplete = 0x2677, - DuelCountdown = 0x2676, - DuelInBounds = 0x2675, - DuelOpponentSelected = 0x2673, - DuelOutOfBounds = 0x2674, - DuelRequested = 0x2672, - DuelWinner = 0x2678, + DuelComplete = 0x2678, + DuelCountdown = 0x2677, + DuelInBounds = 0x2676, + DuelOpponentSelected = 0x2674, + DuelOutOfBounds = 0x2675, + DuelRequested = 0x2673, + DuelWinner = 0x2679, DurabilityDamageDeath = 0x2792, Emote = 0x2815, - EnableBarberShop = 0x26ef, + EnableBarberShop = 0x26f0, EnableEncryption = 0x3049, EnchantmentLog = 0x275b, EncounterEnd = 0x27cb, EncounterStart = 0x27ca, - EnumCharactersResult = 0x2582, + EnumCharactersResult = 0x2583, EnvironmentalDamageLog = 0x2c21, - EquipmentSetId = 0x26e4, + EquipmentSetId = 0x26e5, ExpectedSpamRecords = 0x2bb1, ExplorationExperience = 0x27ae, FactionBonusInfo = 0x276e, @@ -1027,24 +1038,24 @@ namespace Framework.Constants FeatureSystemStatus = 0x25d1, FeatureSystemStatusGlueScreen = 0x25d2, FeignDeathResisted = 0x278f, - FishEscaped = 0x2701, - FishNotHooked = 0x2700, + FishEscaped = 0x2702, + FishNotHooked = 0x2701, FlightSplineSync = 0x2df7, - ForcedDeathUpdate = 0x270f, + ForcedDeathUpdate = 0x2710, ForceAnim = 0x279d, - ForceObjectRelink = 0x2669, + ForceObjectRelink = 0x266a, FriendStatus = 0x27d7, - GameEventDebugInitialize = 0x267f, + GameEventDebugInitialize = 0x2680, GameObjectActivateAnimKit = 0x25d6, GameObjectCustomAnim = 0x25d7, GameObjectDespawn = 0x25d8, - GameObjectMultiTransition = 0x2879, + GameObjectMultiTransition = 0x2877, GameObjectPlaySpellVisual = 0x2c4b, GameObjectPlaySpellVisualKit = 0x2c4a, GameObjectResetState = 0x2765, GameObjectSetState = 0x284b, GameObjectUiAction = 0x2762, - GameSpeedSet = 0x26af, + GameSpeedSet = 0x26b0, GameTimeSet = 0x2754, GameTimeUpdate = 0x2753, GarrisonAddFollowerResult = 0x2902, @@ -1072,6 +1083,7 @@ namespace Framework.Constants GarrisonListMissionsCheatResult = 0x292a, GarrisonMissionAreaBonusAdded = 0x2910, GarrisonMissionBonusRollResult = 0x290c, + GarrisonMissionListUpdate = 0x290e, GarrisonMissionRewardResponse = 0x292d, GarrisonMissionUpdateCanStart = 0x2911, GarrisonNumFollowerActivationsRemaining = 0x2917, @@ -1094,7 +1106,7 @@ namespace Framework.Constants GarrisonStartMissionResult = 0x2907, GarrisonUnlearnBlueprintResult = 0x28f8, GarrisonUpgradeResult = 0x28fd, - GenerateRandomCharacterNameResult = 0x2583, + GenerateRandomCharacterNameResult = 0x2584, GetAccountCharacterListResult = 0x27af, GetDisplayedTrophyListResponse = 0x2928, GetGarrisonInfoResult = 0x28f0, @@ -1103,18 +1115,18 @@ namespace Framework.Constants GetTrophyListResponse = 0x2810, GmPlayerInfo = 0x2782, GmRequestPlayerInfo = 0x25ee, - GmTicketCaseStatus = 0x26d1, - GmTicketSystemStatus = 0x26d0, + GmTicketCaseStatus = 0x26d2, + GmTicketSystemStatus = 0x26d1, GodMode = 0x2741, GossipComplete = 0x2a96, GossipMessage = 0x2a97, GossipPoi = 0x27e4, GossipTextUpdate = 0x2a98, - GroupActionThrottled = 0x259c, + GroupActionThrottled = 0x259d, GroupDecline = 0x27df, GroupDestroyed = 0x27e1, GroupInviteConfirmation = 0x2860, - GroupNewLeader = 0x264b, + GroupNewLeader = 0x264c, GroupUninvite = 0x27e0, GuildAchievementDeleted = 0x29c5, GuildAchievementEarned = 0x29c4, @@ -1129,25 +1141,25 @@ namespace Framework.Constants GuildCommandResult = 0x29ba, GuildCriteriaDeleted = 0x29c6, GuildCriteriaUpdate = 0x29c3, - GuildEventBankContentsChanged = 0x29f5, - GuildEventBankMoneyChanged = 0x29f4, - GuildEventDisbanded = 0x29eb, + GuildEventBankContentsChanged = 0x29f8, + GuildEventBankMoneyChanged = 0x29f7, + GuildEventDisbanded = 0x29ed, GuildEventLogQueryResults = 0x29e2, - GuildEventMotd = 0x29ec, - GuildEventNewLeader = 0x29ea, - GuildEventPlayerJoined = 0x29e8, - GuildEventPlayerLeft = 0x29e9, - GuildEventPresenceChange = 0x29ed, - GuildEventRanksUpdated = 0x29ee, - GuildEventRankChanged = 0x29ef, - GuildEventTabAdded = 0x29f0, - GuildEventTabDeleted = 0x29f1, - GuildEventTabModified = 0x29f2, - GuildEventTabTextChanged = 0x29f3, + GuildEventMotd = 0x29ee, + GuildEventNewLeader = 0x29ec, + GuildEventPlayerJoined = 0x29ea, + GuildEventPlayerLeft = 0x29eb, + GuildEventPresenceChange = 0x29ef, + GuildEventRanksUpdated = 0x29f1, + GuildEventRankChanged = 0x29f2, + GuildEventTabAdded = 0x29f3, + GuildEventTabDeleted = 0x29f4, + GuildEventTabModified = 0x29f5, + GuildEventTabTextChanged = 0x29f6, GuildFlaggedForRename = 0x29dc, GuildInvite = 0x29ca, - GuildInviteDeclined = 0x29e6, - GuildInviteExpired = 0x29e7, + GuildInviteDeclined = 0x29e8, + GuildInviteExpired = 0x29e9, GuildItemLooted = 0x29d4, GuildKnownRecipes = 0x29be, GuildMembersWithRecipe = 0x29bf, @@ -1168,16 +1180,16 @@ namespace Framework.Constants GuildRoster = 0x29bb, GuildRosterUpdate = 0x29bc, GuildSendRankChange = 0x29b9, - HealthUpdate = 0x2704, - HighestThreatUpdate = 0x2715, - HotfixMessage = 0x25a2, - HotfixResponse = 0x25a3, + HealthUpdate = 0x2705, + HighestThreatUpdate = 0x2716, + HotfixMessage = 0x25a3, + HotfixResponse = 0x25a4, + IncomingSummonCompleted = 0x28ab, + IncomingSummonPending = 0x28aa, InitializeFactions = 0x276d, - InitialSetup = 0x257f, + InitialSetup = 0x2580, InitWorldStates = 0x2793, - InspectHonorStats = 0x25b2, - InspectPvp = 0x2769, - InspectResult = 0x264f, + InspectResult = 0x2650, InstanceEncounterChangePriority = 0x27fc, InstanceEncounterDisengageUnit = 0x27fb, InstanceEncounterEnd = 0x2804, @@ -1193,12 +1205,12 @@ namespace Framework.Constants InstanceEncounterStart = 0x2800, InstanceEncounterTimerStart = 0x27fd, InstanceGroupSizeChanged = 0x273f, - InstanceInfo = 0x2652, - InstanceReset = 0x26b4, - InstanceResetFailed = 0x26b5, + InstanceInfo = 0x2653, + InstanceReset = 0x26b5, + InstanceResetFailed = 0x26b6, InstanceSaveCreated = 0x27c9, - InvalidatePageText = 0x270a, - InvalidatePlayer = 0x26d9, + InvalidatePageText = 0x270b, + InvalidatePlayer = 0x26da, InvalidPromotionCode = 0x279e, InventoryChangeFailure = 0x276b, IslandAzeriteXpGain = 0x27ab, @@ -1208,15 +1220,15 @@ namespace Framework.Constants ItemChanged = 0x2729, ItemCooldown = 0x2813, ItemEnchantTimeUpdate = 0x27a0, - ItemExpirePurchaseRefund = 0x25b1, - ItemPurchaseRefundResult = 0x25af, + ItemExpirePurchaseRefund = 0x25b2, + ItemPurchaseRefundResult = 0x25b0, ItemPushResult = 0x2639, ItemTimeUpdate = 0x279f, KickReason = 0x2837, LearnedSpells = 0x2c4d, LearnPvpTalentsFailed = 0x25ea, LearnTalentsFailed = 0x25e9, - LevelUpdate = 0x2587, + LevelUpdate = 0x2588, LevelUpInfo = 0x2728, LfgBootPlayer = 0x2a35, LfgDisabled = 0x2a33, @@ -1246,8 +1258,8 @@ namespace Framework.Constants LfGuildCommandResult = 0x29d0, LfGuildPost = 0x29cd, LfGuildRecruits = 0x29cf, - LightningStormEnd = 0x26d6, - LightningStormStart = 0x26d5, + LightningStormEnd = 0x26d7, + LightningStormStart = 0x26d6, LiveRegionAccountRestoreResult = 0x27bd, LiveRegionCharacterCopyResult = 0x27bb, LiveRegionGetAccountCharacterListResult = 0x27b0, @@ -1255,31 +1267,33 @@ namespace Framework.Constants LoadEquipmentSet = 0x2756, LoadSelectedTrophyResult = 0x2811, LoginSetTimeSpeed = 0x2755, - LoginVerifyWorld = 0x25ac, - LogoutCancelAck = 0x26b3, - LogoutComplete = 0x26b2, - LogoutResponse = 0x26b1, + LoginVerifyWorld = 0x25ad, + LogoutCancelAck = 0x26b4, + LogoutComplete = 0x26b3, + LogoutResponse = 0x26b2, LogXpGain = 0x2724, LootAllPassed = 0x2637, - LootLegacyRulesInEffect = 0x287a, + LootLegacyRulesInEffect = 0x2878, LootList = 0x278b, LootMoneyNotify = 0x2632, LootRelease = 0x2631, LootReleaseAll = 0x2630, - LootRemoved = 0x262b, - LootResponse = 0x262a, + LootRemoved = 0x262c, + LootResponse = 0x262b, LootRoll = 0x2634, LootRollsComplete = 0x2636, LootRollWon = 0x2638, - LossOfControlAuraUpdate = 0x269a, - MailCommandResult = 0x265a, + LossOfControlAuraUpdate = 0x269b, + MailCommandResult = 0x265b, MailListResult = 0x27a1, MailQueryNextTimeResult = 0x27a2, MapObjectivesInit = 0x27aa, + MapObjectiveAdd = 0x2597, + MapObjectiveRemove = 0x2598, MapObjEvents = 0x25d9, MasterLootCandidateList = 0x2635, MessageBox = 0x2575, - MinimapPing = 0x26ff, + MinimapPing = 0x2700, MirrorImageComponentedData = 0x2c14, MirrorImageCreatureData = 0x2c13, MissileCancel = 0x25da, @@ -1374,13 +1388,13 @@ namespace Framework.Constants MoveUpdateTurnRate = 0x2dab, MoveUpdateWalkSpeed = 0x2da6, NeutralPlayerFactionSelectResult = 0x25f2, - NewTaxiPath = 0x26ac, - NewWorld = 0x25ab, + NewTaxiPath = 0x26ad, + NewWorld = 0x25ac, NotifyDestLocSpellCast = 0x2c43, - NotifyMissileTrajectoryCollision = 0x26d8, - NotifyMoney = 0x25ae, - NotifyReceivedMail = 0x265b, - OfferPetitionError = 0x26e8, + NotifyMissileTrajectoryCollision = 0x26d9, + NotifyMoney = 0x25af, + NotifyReceivedMail = 0x265c, + OfferPetitionError = 0x26e9, OnCancelExpectedRideVehicleAura = 0x2725, OnMonsterMove = 0x2da2, OpenAlliedRaceDetailsGiver = 0x2841, @@ -1389,7 +1403,7 @@ namespace Framework.Constants OpenShipmentNpcFromGossip = 0x27e6, OpenShipmentNpcResult = 0x27e8, OpenTransmogrifier = 0x283e, - OverrideLight = 0x26ee, + OverrideLight = 0x26ef, PageText = 0x2761, PartyCommandResult = 0x27e3, PartyInvite = 0x25cf, @@ -1400,15 +1414,15 @@ namespace Framework.Constants PauseMirrorTimer = 0x2758, PendingRaidLock = 0x2739, PetitionAlreadySigned = 0x25b8, - PetitionRenameGuildResponse = 0x29f7, - PetitionShowList = 0x26f1, - PetitionShowSignatures = 0x26f2, + PetitionRenameGuildResponse = 0x29fa, + PetitionShowList = 0x26f2, + PetitionShowSignatures = 0x26f3, PetitionSignResults = 0x2798, PetActionFeedback = 0x2795, - PetActionSound = 0x26ce, - PetAdded = 0x25a8, + PetActionSound = 0x26cf, + PetAdded = 0x25a9, PetBattleChatRestricted = 0x2619, - PetBattleDebugQueueDumpResponse = 0x26a1, + PetBattleDebugQueueDumpResponse = 0x26a2, PetBattleFinalizeLocation = 0x2612, PetBattleFinalRound = 0x2617, PetBattleFinished = 0x2618, @@ -1416,65 +1430,65 @@ namespace Framework.Constants PetBattleInitialUpdate = 0x2613, PetBattleMaxGameLengthWarning = 0x261a, PetBattlePvpChallenge = 0x2611, - PetBattleQueueProposeMatch = 0x2658, - PetBattleQueueStatus = 0x2659, + PetBattleQueueProposeMatch = 0x2659, + PetBattleQueueStatus = 0x265a, PetBattleReplacementsMade = 0x2616, PetBattleRequestFailed = 0x2610, PetBattleRoundResult = 0x2615, PetBattleSlotUpdates = 0x2603, PetCastFailed = 0x2c57, PetClearSpells = 0x2c24, - PetDismissSound = 0x26cf, - PetGodMode = 0x26a9, + PetDismissSound = 0x26d0, + PetGodMode = 0x26aa, PetGuids = 0x274a, PetLearnedSpells = 0x2c4f, - PetMode = 0x2589, - PetNameInvalid = 0x26f6, - PetSlotUpdated = 0x2588, + PetMode = 0x258a, + PetNameInvalid = 0x26f7, + PetSlotUpdated = 0x2589, PetSpellsMessage = 0x2c25, - PetStableList = 0x25a9, - PetStableResult = 0x25aa, - PetTameFailure = 0x26e5, + PetStableList = 0x25aa, + PetStableResult = 0x25ab, + PetTameFailure = 0x26e6, PetUnlearnedSpells = 0x2c50, PhaseShiftChange = 0x2577, - PlayedTime = 0x2711, + PlayedTime = 0x2712, PlayerBound = 0x257d, - PlayerSaveGuildEmblem = 0x29f6, + PlayerSaveGuildEmblem = 0x29f9, PlayerSkinned = 0x2790, PlayerTabardVendorActivate = 0x27a5, PlayMusic = 0x27b7, PlayObjectSound = 0x27b8, PlayOneShotAnimKit = 0x277a, PlayOrphanSpellVisual = 0x2c47, - PlayScene = 0x2655, + PlayScene = 0x2656, PlaySound = 0x27b6, PlaySpeakerbotSound = 0x27b9, PlaySpellVisual = 0x2c45, PlaySpellVisualKit = 0x2c49, PlayTimeWarning = 0x2743, Pong = 0x304e, - PowerUpdate = 0x2705, + PowerUpdate = 0x2706, PreRessurect = 0x27b5, PrintNotification = 0x25e1, ProcResist = 0x27a7, - ProposeLevelGrant = 0x2719, + ProposeLevelGrant = 0x271a, PushSpellToActionBar = 0x2c51, PvpCredit = 0x271f, PvpLogData = 0x25b3, PvpOptionsEnabled = 0x25b6, PvpSeason = 0x25d3, - QueryBattlePetNameResponse = 0x270c, - QueryCommunityNameResponse = 0x2708, - QueryCreatureResponse = 0x2702, - QueryGameObjectResponse = 0x2703, + QueryBattlePetNameResponse = 0x270d, + QueryCommunityNameResponse = 0x2709, + QueryCreatureResponse = 0x2703, + QueryGameObjectResponse = 0x2704, QueryGarrisonCreatureNameResponse = 0x292b, QueryGuildInfoResponse = 0x29e5, QueryItemTextResponse = 0x2812, - QueryNpcTextResponse = 0x2706, - QueryPageTextResponse = 0x2709, - QueryPetitionResponse = 0x270d, - QueryPetNameResponse = 0x270b, - QueryPlayerNameResponse = 0x2707, + QueryNpcTextResponse = 0x2707, + QueryPageTextResponse = 0x270a, + QueryPetitionResponse = 0x270e, + QueryPetNameResponse = 0x270c, + QueryPlayerNameResponse = 0x2708, QueryQuestInfoResponse = 0x2a95, QueryTimeResponse = 0x2723, QueryTreasurePickerResponse = 0x2850, @@ -1508,51 +1522,52 @@ namespace Framework.Constants RaidGroupOnly = 0x27f9, RaidInstanceMessage = 0x2bb4, RaidMarkersChanged = 0x25b9, - RandomRoll = 0x264e, - RatedBattlefieldInfo = 0x25a6, + RandomRoll = 0x264f, + RatedBattlefieldInfo = 0x25a7, ReadyCheckCompleted = 0x260f, ReadyCheckResponse = 0x260e, ReadyCheckStarted = 0x260d, ReadItemResultFailed = 0x27f3, ReadItemResultOk = 0x27ed, RealmLookupInformation = 0x2818, - RealmQueryResponse = 0x26ed, + RealmQueryResponse = 0x26ee, RecruitAFriendResponse = 0x27d5, ReferAFriendExpired = 0x276a, - ReferAFriendFailure = 0x26f3, - RefreshComponent = 0x267b, + ReferAFriendFailure = 0x26f4, + RefreshComponent = 0x267c, RefreshSpellHistory = 0x2c2c, RemoveItemPassive = 0x25c0, - RemoveLossOfControl = 0x269c, + RemoveLossOfControl = 0x269d, ReplaceTrophyResponse = 0x280f, - ReportPvpPlayerAfkResult = 0x26e1, - RequestAddonList = 0x2661, - RequestCemeteryListResponse = 0x259d, + ReportPvpPlayerAfkResult = 0x26e2, + RequestAddonList = 0x2662, + RequestCemeteryListResponse = 0x259e, RequestPvpBrawlInfoResponse = 0x25d5, RequestPvpRewardsResponse = 0x25d4, - ResearchComplete = 0x2585, + ResearchComplete = 0x2586, ResetCompressionContext = 0x304f, - ResetFailedNotify = 0x26e9, + ResetFailedNotify = 0x26ea, ResetRangedCombatTimer = 0x271c, ResetWeeklyCurrency = 0x2574, - RespecWipeConfirm = 0x2628, + RespecWipeConfirm = 0x2629, RespondInspectAchievements = 0x2571, ResumeCastBar = 0x2c3e, ResumeComms = 0x304b, ResumeToken = 0x25be, + ResurrectClearData = 0x257f, ResurrectRequest = 0x257e, ResyncRunes = 0x2746, - RoleChangedInform = 0x258c, + RoleChangedInform = 0x258d, RoleChosen = 0x2a39, - RolePollInform = 0x258d, + RolePollInform = 0x258e, RuneRegenDebug = 0x25c8, ScenarioBoot = 0x27f4, ScenarioCompleted = 0x2834, - ScenarioPois = 0x2651, - ScenarioProgressUpdate = 0x264a, + ScenarioPois = 0x2652, + ScenarioProgressUpdate = 0x264b, ScenarioSetShouldShowCriteria = 0x2844, ScenarioSpellUpdate = 0x2843, - ScenarioState = 0x2649, + ScenarioState = 0x264a, SceneObjectEvent = 0x25f8, SceneObjectPetBattleFinalRound = 0x25fd, SceneObjectPetBattleFinished = 0x25fe, @@ -1561,56 +1576,56 @@ namespace Framework.Constants SceneObjectPetBattleReplacementsMade = 0x25fc, SceneObjectPetBattleRoundResult = 0x25fb, ScriptCast = 0x2c55, - SellResponse = 0x26f7, + SellResponse = 0x26f8, SendItemPassives = 0x25c1, SendKnownSpells = 0x2c2a, - SendRaidTargetUpdateAll = 0x264c, - SendRaidTargetUpdateSingle = 0x264d, + SendRaidTargetUpdateAll = 0x264d, + SendRaidTargetUpdateSingle = 0x264e, SendSpellCharges = 0x2c2d, SendSpellHistory = 0x2c2b, SendUnlearnSpells = 0x2c2e, - ServerFirstAchievements = 0x266c, - ServerTime = 0x26b0, + ServerFirstAchievements = 0x266d, + ServerTime = 0x26b1, SetupCurrency = 0x2572, - SetupResearchHistory = 0x2584, + SetupResearchHistory = 0x2585, SetAiAnimKit = 0x2779, SetAllTaskProgress = 0x27dd, SetAnimTier = 0x277d, SetCurrency = 0x2573, SetDfFastLaunchResult = 0x2a2e, - SetDungeonDifficulty = 0x26d2, + SetDungeonDifficulty = 0x26d3, SetFactionAtWar = 0x2745, SetFactionNotVisible = 0x2774, SetFactionStanding = 0x2775, SetFactionVisible = 0x2773, SetFlatSpellModifier = 0x2c36, SetForcedReactions = 0x2764, - SetItemPurchaseData = 0x25b0, + SetItemPurchaseData = 0x25b1, SetLootMethodFailed = 0x281e, SetMaxWeeklyQuantity = 0x25b7, SetMeleeAnimKit = 0x277c, SetMovementAnimKit = 0x277b, SetPctSpellModifier = 0x2c37, - SetPetSpecialization = 0x2643, - SetPlayerDeclinedNamesResult = 0x2710, + SetPetSpecialization = 0x2644, + SetPlayerDeclinedNamesResult = 0x2711, SetPlayHoverAnim = 0x25cc, SetProficiency = 0x277e, SetSpellCharges = 0x2c29, SetTaskComplete = 0x27de, - SetTimeZoneInformation = 0x26a4, + SetTimeZoneInformation = 0x26a5, SetVehicleRecId = 0x2738, ShowAdventureMap = 0x283d, - ShowBank = 0x26ad, + ShowBank = 0x26ae, ShowMailbox = 0x27f5, ShowNeutralPlayerFactionSelectUi = 0x25f1, - ShowTaxiNodes = 0x26fe, + ShowTaxiNodes = 0x26ff, ShowTradeSkillResponse = 0x27be, SocketGems = 0x2770, SocketGemsFailure = 0x2771, SortBagsResult = 0x282c, SorStartExperienceIncomplete = 0x25f3, SpecializationChanged = 0x25ed, - SpecialMountAnim = 0x26cd, + SpecialMountAnim = 0x26ce, SpecInvoluntarilyChanged = 0x2760, SpellAbsorbLog = 0x2c1f, SpellCategoryCooldown = 0x2c17, @@ -1647,26 +1662,26 @@ namespace Framework.Constants StopMirrorTimer = 0x2759, StopSpeakerbotSound = 0x27ba, StreamingMovies = 0x25ba, - SummonCancel = 0x26e0, - SummonRaidMemberValidateFailed = 0x258e, + SummonCancel = 0x26e1, + SummonRaidMemberValidateFailed = 0x258f, SummonRequest = 0x2768, SupercededSpells = 0x2c4c, SuspendComms = 0x304a, SuspendToken = 0x25bd, TalentsInvoluntarilyReset = 0x275f, - TaxiNodeStatus = 0x26aa, - TextEmote = 0x26a8, - ThreatClear = 0x2718, - ThreatRemove = 0x2717, - ThreatUpdate = 0x2716, + TaxiNodeStatus = 0x26ab, + TextEmote = 0x26a9, + ThreatClear = 0x2719, + ThreatRemove = 0x2718, + ThreatUpdate = 0x2717, TimeAdjustment = 0x2da1, TimeSyncRequest = 0x2da0, - TitleEarned = 0x2713, - TitleLost = 0x2714, - TotemCreated = 0x26fa, - TotemMoved = 0x26fb, - TradeStatus = 0x2581, - TradeUpdated = 0x2580, + TitleEarned = 0x2714, + TitleLost = 0x2715, + TotemCreated = 0x26fb, + TotemMoved = 0x26fc, + TradeStatus = 0x2582, + TradeUpdated = 0x2581, TrainerBuyFailed = 0x271e, TrainerList = 0x271d, TransferAborted = 0x2749, @@ -1674,7 +1689,7 @@ namespace Framework.Constants TransmogCollectionUpdate = 0x25c6, TransmogSetCollectionUpdate = 0x25c7, TriggerCinematic = 0x2816, - TriggerMovie = 0x26fc, + TriggerMovie = 0x26fd, TurnInPetitionResult = 0x279a, TutorialFlags = 0x2808, TutorialHighlightSpell = 0x284a, @@ -1686,12 +1701,12 @@ namespace Framework.Constants UnlearnedSpells = 0x2c4e, UpdateAccountData = 0x2751, UpdateActionButtons = 0x25f6, - UpdateCelestialBody = 0x286e, + UpdateCelestialBody = 0x286b, UpdateCharacterFlags = 0x280e, - UpdateExpansionLevel = 0x2665, - UpdateGameTimeState = 0x2875, - UpdateInstanceOwnership = 0x26d7, - UpdateLastInstance = 0x26b6, + UpdateExpansionLevel = 0x2666, + UpdateGameTimeState = 0x2872, + UpdateInstanceOwnership = 0x26d8, + UpdateLastInstance = 0x26b7, UpdateObject = 0x2817, UpdateTalentData = 0x25ec, UpdateTaskProgress = 0x27dc, @@ -1713,10 +1728,10 @@ namespace Framework.Constants WardenData = 0x2576, WarfrontCompleted = 0x27ad, WargameRequestSuccessfullySentToOpponent = 0x25b4, - Weather = 0x26d4, + Weather = 0x26d5, WeeklySpellUsage = 0x2c18, Who = 0x2bae, - WhoIs = 0x26d3, + WhoIs = 0x26d4, WorldQuestUpdate = 0x2851, WorldServerInfo = 0x25c2, WorldText = 0x2836, diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 239527dd5..837051af3 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -369,7 +369,7 @@ namespace Framework.Constants BypassArmorForCaster = 345, EnableAltPower = 346, // Nyi ModSpellCooldownByHaste = 347, - DepositBonusMoneyInGuildBankOnLoot = 348, // Nyi + ModMoneyGain = 348, // Modifies gold gains from source: [Misc = 0, Quests][Misc = 1, Loot] ModCurrencyGain = 349, ModGatheringItemsGainedPercent = 350, // Nyi Unk351 = 351, diff --git a/Source/Framework/Database/Databases/LoginDatabase.cs b/Source/Framework/Database/Databases/LoginDatabase.cs index 998485f45..4ff821ec3 100644 --- a/Source/Framework/Database/Databases/LoginDatabase.cs +++ b/Source/Framework/Database/Databases/LoginDatabase.cs @@ -149,8 +149,8 @@ namespace Framework.Database PrepareStatement(LoginStatements.UPD_LAST_CHAR_UNDELETE, "UPDATE battlenet_accounts SET LastCharacterUndelete = UNIX_TIMESTAMP() WHERE Id = ?"); // Account wide toys - PrepareStatement(LoginStatements.SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite FROM battlenet_account_toys WHERE accountId = ?"); - PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite) VALUES (?, ?, ?)"); + PrepareStatement(LoginStatements.SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite, hasFanfare FROM battlenet_account_toys WHERE accountId = ?"); + PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite, hasFanfare) VALUES (?, ?, ?, ?)"); // Battle Pets PrepareStatement(LoginStatements.SEL_BATTLE_PETS, "SELECT guid, species, breed, level, exp, health, quality, flags, name FROM battle_pets WHERE battlenetAccountId = ?"); diff --git a/Source/Framework/Realm/RealmManager.cs b/Source/Framework/Realm/RealmManager.cs index 11945a3a6..1814053e1 100644 --- a/Source/Framework/Realm/RealmManager.cs +++ b/Source/Framework/Realm/RealmManager.cs @@ -120,31 +120,32 @@ public class RealmManager : Singleton return _realms.LookupByKey(id); } + // List of client builds for verbose version info in realmlist packet + RealmBuildInfo[] ClientBuilds = + { + new RealmBuildInfo(28938, 8, 1, 5, ' ' ), + new RealmBuildInfo(21355, 6, 2, 4, ' ' ), + new RealmBuildInfo(20726, 6, 2, 3, ' ' ), + new RealmBuildInfo(20574, 6, 2, 2, 'a' ), + new RealmBuildInfo(20490, 6, 2, 2, 'a' ), + new RealmBuildInfo(15595, 4, 3, 4, ' ' ), + new RealmBuildInfo(14545, 4, 2, 2, ' ' ), + new RealmBuildInfo(13623, 4, 0, 6, 'a' ), + new RealmBuildInfo(13930, 3, 3, 5, 'a' ), // 3.3.5a China Mainland build + new RealmBuildInfo(12340, 3, 3, 5, 'a' ), + new RealmBuildInfo(11723, 3, 3, 3, 'a' ), + new RealmBuildInfo(11403, 3, 3, 2, ' ' ), + new RealmBuildInfo(11159, 3, 3, 0, 'a' ), + new RealmBuildInfo(10505, 3, 2, 2, 'a' ), + new RealmBuildInfo(9947, 3, 1, 3, ' ' ), + new RealmBuildInfo(8606, 2, 4, 3, ' ' ), + new RealmBuildInfo(6141, 1, 12, 3, ' ' ), + new RealmBuildInfo(6005, 1, 12, 2, ' ' ), + new RealmBuildInfo(5875, 1, 12, 1, ' ' ), + }; + RealmBuildInfo GetBuildInfo(uint build) { - // List of client builds for verbose version info in realmlist packet - RealmBuildInfo[] ClientBuilds = - { - new RealmBuildInfo(21355, 6, 2, 4, ' '), - new RealmBuildInfo( 20726, 6, 2, 3, ' '), - new RealmBuildInfo(20574, 6, 2, 2, 'a'), - new RealmBuildInfo( 20490, 6, 2, 2, 'a'), - new RealmBuildInfo( 15595, 4, 3, 4, ' '), - new RealmBuildInfo( 14545, 4, 2, 2, ' '), - new RealmBuildInfo( 13623, 4, 0, 6, 'a'), - new RealmBuildInfo( 13930, 3, 3, 5, 'a'), // 3.3.5a China Mainland build - new RealmBuildInfo( 12340, 3, 3, 5, 'a'), - new RealmBuildInfo( 11723, 3, 3, 3, 'a'), - new RealmBuildInfo( 11403, 3, 3, 2, ' '), - new RealmBuildInfo( 11159, 3, 3, 0, 'a'), - new RealmBuildInfo( 10505, 3, 2, 2, 'a'), - new RealmBuildInfo( 9947, 3, 1, 3, ' '), - new RealmBuildInfo( 8606, 2, 4, 3, ' '), - new RealmBuildInfo( 6141, 1, 12, 3, ' '), - new RealmBuildInfo( 6005, 1, 12, 2, ' '), - new RealmBuildInfo( 5875, 1, 12, 1, ' '), - }; - foreach (var clientBuild in ClientBuilds) if (clientBuild.Build == build) return clientBuild; @@ -152,6 +153,16 @@ public class RealmManager : Singleton return null; } + public uint GetMinorMajorBugfixVersionForBuild(uint build) + { + RealmBuildInfo buildInfo = ClientBuilds.FirstOrDefault(p => + { + return p.Build < build; + }); + + return buildInfo != null ? (buildInfo.MajorVersion * 10000 + buildInfo.MinorVersion * 100 + buildInfo.BugfixVersion) : 0; + } + public void WriteSubRegions(Bgs.Protocol.GameUtilities.V1.GetAllValuesForAttributeResponse response) { foreach (string subRegion in GetSubRegions()) diff --git a/Source/Game/Arenas/ArenaTeam.cs b/Source/Game/Arenas/ArenaTeam.cs index 339a7324f..48874527f 100644 --- a/Source/Game/Arenas/ArenaTeam.cs +++ b/Source/Game/Arenas/ArenaTeam.cs @@ -399,24 +399,6 @@ namespace Game.Arenas } } - public void Inspect(WorldSession session, ObjectGuid guid) - { - ArenaTeamMember member = GetMember(guid); - if (member == null) - return; - - WorldPacket data = new WorldPacket(ServerOpcodes.InspectPvp); - data.WritePackedGuid(guid); // player guid - data.WriteUInt8(GetSlot()); // slot (0...2) - data.WriteUInt32(GetId()); // arena team id - data.WriteUInt32(stats.Rating); // rating - data.WriteUInt32(stats.SeasonGames); // season played - data.WriteUInt32(stats.SeasonWins); // season wins - data.WriteUInt32(member.SeasonGames); // played (count of all games, that the inspected member participated...) - data.WriteUInt32(member.PersonalRating); // personal rating - //session.SendPacket(data); - } - void BroadcastPacket(ServerPacket packet) { foreach (var member in Members) diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index 962d16fce..b99974ba3 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -611,7 +611,7 @@ namespace Game.DataStorage uint count = 0; do { - uint id = result.Read(0); + int id = result.Read(0); uint tableHash = result.Read(1); int recordId = result.Read(2); bool deleted = result.Read(3); @@ -621,7 +621,8 @@ namespace Game.DataStorage continue; } - _hotfixData[MathFunctions.MakePair64(id, tableHash)] = recordId; + _hotfixData.Add(id, Tuple.Create(tableHash, recordId)); + ++_hotfixCount; deletedRecords[Tuple.Create(tableHash, recordId)] = deleted; ++count; @@ -669,7 +670,8 @@ namespace Game.DataStorage Log.outInfo(LogFilter.ServerLoading, $"Loaded {_hotfixBlob.Count} hotfix blob records in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); } - public Dictionary GetHotfixData() { return _hotfixData; } + public uint GetHotfixCount() { return _hotfixCount; } + public MultiMap> GetHotfixData() { return _hotfixData; } public byte[] GetHotfixBlobData(uint tableHash, int recordId) { @@ -1884,7 +1886,8 @@ namespace Game.DataStorage } Dictionary _storage = new Dictionary(); - Dictionary _hotfixData = new Dictionary(); + uint _hotfixCount = 0; + MultiMap> _hotfixData = new MultiMap>(); Dictionary, byte[]> _hotfixBlob = new Dictionary, byte[]>(); MultiMap _areaGroupMembers = new MultiMap(); diff --git a/Source/Game/DungeonFinding/LFGManager.cs b/Source/Game/DungeonFinding/LFGManager.cs index 7c6f7936f..3f3610d50 100644 --- a/Source/Game/DungeonFinding/LFGManager.cs +++ b/Source/Game/DungeonFinding/LFGManager.cs @@ -382,7 +382,7 @@ namespace Game.DungeonFinding // Check player or group member restrictions if (!player.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder)) - joinData.result = LfgJoinResult.NoSlotsPlayer; + joinData.result = LfgJoinResult.NoSlots; else if (player.InBattleground() || player.InArena() || player.InBattlegroundQueue()) joinData.result = LfgJoinResult.CantUseDungeons; else if (player.HasAura(SharedConst.LFGSpellDungeonDeserter)) @@ -390,9 +390,9 @@ namespace Game.DungeonFinding else if (player.HasAura(SharedConst.LFGSpellDungeonCooldown)) joinData.result = LfgJoinResult.RandomCooldownPlayer; else if (dungeons.Empty()) - joinData.result = LfgJoinResult.NoSlotsPlayer; + joinData.result = LfgJoinResult.NoSlots; else if (player.HasAura(9454)) // check Freeze debuff - joinData.result = LfgJoinResult.NoSlotsPlayer; + joinData.result = LfgJoinResult.NoSlots; else if (grp) { if (grp.GetMembersCount() > MapConst.MaxGroupSize) @@ -414,7 +414,10 @@ namespace Game.DungeonFinding else if (plrg.InBattleground() || plrg.InArena() || plrg.InBattlegroundQueue()) joinData.result = LfgJoinResult.CantUseDungeons; else if (plrg.HasAura(9454)) // check Freeze debuff - joinData.result = LfgJoinResult.PartyNotMeetReqs; + { + joinData.result = LfgJoinResult.NoSlots; + joinData.playersMissingRequirement.Add(plrg.GetName()); + } ++memberCount; players.Add(plrg.GetGUID()); } @@ -471,9 +474,9 @@ namespace Game.DungeonFinding dungeons = GetDungeonsByRandom(rDungeonId); // if we have lockmap then there are no compatible dungeons - GetCompatibleDungeons(dungeons, players, joinData.lockmap, isContinue); + GetCompatibleDungeons(dungeons, players, joinData.lockmap, joinData.playersMissingRequirement, isContinue); if (dungeons.Empty()) - joinData.result = grp ? LfgJoinResult.NoLfgObject : LfgJoinResult.NoSlotsPlayer; + joinData.result = LfgJoinResult.NoSlots; } } @@ -730,10 +733,11 @@ namespace Game.DungeonFinding } } - void GetCompatibleDungeons(List dungeons, List players, Dictionary> lockMap, bool isContinue) + void GetCompatibleDungeons(List dungeons, List players, Dictionary> lockMap, List playersMissingRequirement, bool isContinue) { lockMap.Clear(); Dictionary lockedDungeons = new Dictionary(); + List dungeonsToRemove = new List(); foreach (var guid in players) { @@ -775,15 +779,20 @@ namespace Game.DungeonFinding } if (eraseDungeon) - dungeons.Remove(dungeonId); + dungeonsToRemove.Add(dungeonId); if (!lockMap.ContainsKey(guid)) lockMap[guid] = new Dictionary(); lockMap[guid][it2.Key] = it2.Value; + playersMissingRequirement.Add(player.GetName()); } } } + + foreach (uint dungeonIdToRemove in dungeonsToRemove) + dungeons.Remove(dungeonIdToRemove); + if (!dungeons.Empty()) lockMap.Clear(); } @@ -1995,6 +2004,7 @@ namespace Game.DungeonFinding public LfgJoinResult result; public LfgRoleCheckState state; public Dictionary> lockmap = new Dictionary>(); + public List playersMissingRequirement = new List(); } public class LfgUpdateData diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index e47d6b907..a21593085 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -83,6 +83,9 @@ namespace Game.Entities public float ModExperience; public bool RacialLeader; public uint MovementId; + public float FadeRegionRadius; + public int WidgetSetID; + public int WidgetSetUnitConditionID; public bool RegenHealth; public uint MechanicImmuneMask; public CreatureFlagsExtra FlagsExtra; diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 6fa9c5ff8..9edbad82c 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -1481,9 +1481,6 @@ namespace Game.Entities static bool HasStats(ItemInstance itemInstance, BonusData bonus) { - if (itemInstance.RandomPropertiesID != 0) - return true; - for (byte i = 0; i < ItemConst.MaxStats; ++i) { if (bonus.ItemStatAllocation[i] != 0) diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index bc13119b0..3b6e3e4e7 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -399,6 +399,7 @@ namespace Game.Entities data.WriteFloat(unit.GetSpeed(UnitMoveType.PitchRate)); data.WriteUInt32(0); // unit.m_movementInfo.forces.size() + data.WriteFloat(1.0f); // MovementForcesModMagnitude data.WriteBit(HasSpline); data.FlushBits(); diff --git a/Source/Game/Entities/Player/CollectionManager.cs b/Source/Game/Entities/Player/CollectionManager.cs index 81100798f..64101c74f 100644 --- a/Source/Game/Entities/Player/CollectionManager.cs +++ b/Source/Game/Entities/Player/CollectionManager.cs @@ -73,9 +73,9 @@ namespace Game.Entities _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, value); } - public bool AddToy(uint itemId, bool isFavourite = false) + public bool AddToy(uint itemId, bool isFavourite, bool hasFanfare) { - if (UpdateAccountToys(itemId, isFavourite)) + if (UpdateAccountToys(itemId, isFavourite, hasFanfare)) { _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, itemId); return true; @@ -92,9 +92,8 @@ namespace Game.Entities do { uint itemId = result.Read(0); - bool isFavourite = result.Read(1); - _toys[itemId] = isFavourite; + _toys[itemId] = GetToyFlags(result.Read(1), result.Read(2)); } while (result.NextRow()); } @@ -106,17 +105,18 @@ namespace Game.Entities stmt = DB.Login.GetPreparedStatement(LoginStatements.REP_ACCOUNT_TOYS); stmt.AddValue(0, _owner.GetBattlenetAccountId()); stmt.AddValue(1, pair.Key); - stmt.AddValue(2, pair.Value); + stmt.AddValue(2, pair.Value.HasAnyFlag(ToyFlags.Favorite)); + stmt.AddValue(3, pair.Value.HasAnyFlag(ToyFlags.HasFanfare)); trans.Append(stmt); } } - bool UpdateAccountToys(uint itemId, bool isFavourite = false) + bool UpdateAccountToys(uint itemId, bool isFavourite, bool hasFanfare) { if (_toys.ContainsKey(itemId)) return false; - _toys.Add(itemId, isFavourite); + _toys.Add(itemId, GetToyFlags(isFavourite, hasFanfare)); return true; } @@ -125,7 +125,30 @@ namespace Game.Entities if (!_toys.ContainsKey(itemId)) return; - _toys[itemId] = favorite; + if (favorite) + _toys[itemId] |= ToyFlags.Favorite; + else + _toys[itemId] &= ~ToyFlags.Favorite; + } + + public void ToyClearFanfare(uint itemId) + { + if (!_toys.ContainsKey(itemId)) + return; + + _toys[itemId] &= ~ToyFlags.HasFanfare; + } + + ToyFlags GetToyFlags(bool isFavourite, bool hasFanfare) + { + ToyFlags flags = ToyFlags.None; + if (isFavourite) + flags |= ToyFlags.Favorite; + + if (hasFanfare) + flags |= ToyFlags.HasFanfare; + + return flags; } public void OnItemAdded(Item item) @@ -825,13 +848,13 @@ namespace Game.Entities } public bool HasToy(uint itemId) { return _toys.ContainsKey(itemId); } - public Dictionary GetAccountToys() { return _toys; } + public Dictionary GetAccountToys() { return _toys; } public Dictionary GetAccountHeirlooms() { return _heirlooms; } public Dictionary GetAccountMounts() { return _mounts; } WorldSession _owner; - Dictionary _toys = new Dictionary(); + Dictionary _toys = new Dictionary(); Dictionary _heirlooms = new Dictionary(); Dictionary _mounts = new Dictionary(); System.Collections.BitSet _appearances; diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 486502260..31adfd876 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -3253,7 +3253,7 @@ namespace Game.Entities stmt.AddValue(index++, GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles)); stmt.AddValue(index++, m_grantableLevels); - stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build); + stmt.AddValue(index++, Global.RealmMgr.GetMinorMajorBugfixVersionForBuild(Global.WorldMgr.GetRealm().Build)); } else { diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 8fc51910d..4e1895f57 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -1327,6 +1327,7 @@ namespace Game.Entities packet.WeeklyQuantity.Set(newWeekCount); packet.TrackedQuantity.Set(newTrackedCount); packet.Flags = playerCurrency.Flags; + packet.QuantityChange.Set(count); SendPacket(packet); } @@ -2771,7 +2772,7 @@ namespace Game.Entities } void SendNewMail() { - SendPacket(new NotifyRecievedMail()); + SendPacket(new NotifyReceivedMail()); } public void UpdateNextMailTimeAndUnreads() { @@ -5015,6 +5016,7 @@ namespace Game.Entities displayPlayerChoice.SenderGUID = sender; displayPlayerChoice.ChoiceID = choiceId; displayPlayerChoice.UiTextureKitID = playerChoice.UiTextureKitId; + displayPlayerChoice.SoundKitID = playerChoice.SoundKitId; displayPlayerChoice.Question = playerChoice.Question; if (playerChoiceLocale != null) ObjectManager.GetLocaleString(playerChoiceLocale.Question, locale, ref displayPlayerChoice.Question); @@ -5032,9 +5034,13 @@ namespace Game.Entities playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId; playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags; playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID; + playerChoiceResponse.UiTextureAtlasElementID = playerChoiceResponseTemplate.UiTextureAtlasElementID; + playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID; playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID; playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer; playerChoiceResponse.Header = playerChoiceResponseTemplate.Header; + playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader; + playerChoiceResponse.ButtonTooltip = playerChoiceResponseTemplate.ButtonTooltip; playerChoiceResponse.Description = playerChoiceResponseTemplate.Description; playerChoiceResponse.Confirmation = playerChoiceResponseTemplate.Confirmation; if (playerChoiceLocale != null) @@ -5044,6 +5050,8 @@ namespace Game.Entities { ObjectManager.GetLocaleString(playerChoiceResponseLocale.Answer, locale, ref playerChoiceResponse.Answer); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Header, locale, ref playerChoiceResponse.Header); + ObjectManager.GetLocaleString(playerChoiceResponseLocale.SubHeader, locale, ref playerChoiceResponse.SubHeader); + ObjectManager.GetLocaleString(playerChoiceResponseLocale.ButtonTooltip, locale, ref playerChoiceResponse.ButtonTooltip); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Description, locale, ref playerChoiceResponse.Description); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Confirmation, locale, ref playerChoiceResponse.Confirmation); } @@ -5093,6 +5101,8 @@ namespace Game.Entities playerChoiceResponse.Reward.Set(reward); displayPlayerChoice.Responses[i] = playerChoiceResponse; } + + playerChoiceResponse.RewardQuestID = playerChoiceResponseTemplate.RewardQuestID; } SendPacket(displayPlayerChoice); diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 1273083ae..9bd808710 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -977,7 +977,7 @@ namespace Game.Entities playOrphanSpellVisual.SpellVisualID = spellVisualId; playOrphanSpellVisual.TravelSpeed = travelSpeed; playOrphanSpellVisual.SpeedAsTime = speedAsTime; - playOrphanSpellVisual.UnkZero = 0.0f; + playOrphanSpellVisual.LaunchDelay = 0.0f; SendMessageToSet(playOrphanSpellVisual, true); } @@ -991,7 +991,7 @@ namespace Game.Entities playOrphanSpellVisual.SpellVisualID = spellVisualId; playOrphanSpellVisual.TravelSpeed = travelSpeed; playOrphanSpellVisual.SpeedAsTime = speedAsTime; - playOrphanSpellVisual.UnkZero = 0.0f; + playOrphanSpellVisual.LaunchDelay = 0.0f; SendMessageToSet(playOrphanSpellVisual, true); } @@ -1016,12 +1016,12 @@ namespace Game.Entities SendMessageToSet(playSpellVisual, true); } - public void SendPlaySpellVisual(Vector3 targetPosition, float o, uint spellVisualId, uint missReason, uint reflectStatus, float travelSpeed, bool speedAsTime = false) + public void SendPlaySpellVisual(Vector3 targetPosition, float launchDelay, uint spellVisualId, uint missReason, uint reflectStatus, float travelSpeed, bool speedAsTime = false) { PlaySpellVisual playSpellVisual = new PlaySpellVisual(); playSpellVisual.Source = GetGUID(); playSpellVisual.TargetPosition = targetPosition; // exclusive with Target - playSpellVisual.Orientation = o; + playSpellVisual.LaunchDelay = launchDelay; playSpellVisual.SpellVisualID = spellVisualId; playSpellVisual.TravelSpeed = travelSpeed; playSpellVisual.MissReason = (ushort)missReason; diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index b0c8ea766..0c05e8caf 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -1760,8 +1760,10 @@ namespace Game "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, " + //60 61 62 63 64 65 66 67 68 "InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, " + - //69 70 71 72 73 74 - "RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template"); + //69 70 71 72 73 74 75 76 + "RacialLeader, movementId, FadeRegionRadius, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, flags_extra, " + + //77 + "ScriptName FROM creature_template"); if (result.IsEmpty()) @@ -1855,10 +1857,13 @@ namespace Game creature.ModExperience = fields.Read(68); creature.RacialLeader = fields.Read(69); creature.MovementId = fields.Read(70); - creature.RegenHealth = fields.Read(71); - creature.MechanicImmuneMask = fields.Read(72); - creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(73); - creature.ScriptID = GetScriptId(fields.Read(74)); + creature.FadeRegionRadius = fields.Read(71); + creature.WidgetSetID = fields.Read(72); + creature.WidgetSetUnitConditionID = fields.Read(73); + creature.RegenHealth = fields.Read(74); + creature.MechanicImmuneMask = fields.Read(75); + creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(76); + creature.ScriptID = GetScriptId(fields.Read(77)); creatureTemplateStorage.Add(entry, creature); } @@ -6298,9 +6303,9 @@ namespace Game "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " + //96 97 98 99 100 101 102 103 "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " + - //104 105 106 107 108 109 110 - "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, " + - //111 112 113 114 115 116 117 118 119 + //104 105 106 107 108 109 110 111 + "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, " + + //112 113 114 115 116 117 118 119 120 "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" + " FROM quest_template"); @@ -8834,7 +8839,7 @@ namespace Game uint oldMSTime = Time.GetMSTime(); _playerChoices.Clear(); - SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice"); + SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, SoundKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice"); if (choiceResult.IsEmpty()) { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 player choices. DB table `playerchoice` is empty."); @@ -8852,15 +8857,16 @@ namespace Game PlayerChoice choice = new PlayerChoice(); choice.ChoiceId = choiceResult.Read(0); choice.UiTextureKitId = choiceResult.Read(1); - choice.Question = choiceResult.Read(2); - choice.HideWarboardHeader = choiceResult.Read(3); - choice.KeepOpenAfterChoice = choiceResult.Read(4); + choice.SoundKitId = choiceResult.Read(2); + choice.Question = choiceResult.Read(3); + choice.HideWarboardHeader = choiceResult.Read(4); + choice.KeepOpenAfterChoice = choiceResult.Read(5); _playerChoices[choice.ChoiceId] = choice; } while (choiceResult.NextRow()); - SQLResult responses = DB.World.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, GroupID, Header, Answer, Description, Confirmation FROM playerchoice_response ORDER BY `Index` ASC"); + SQLResult responses = DB.World.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, UiTextureAtlasElementID, SoundKitID, GroupID, Answer, Header, SubHeader, ButtonTemplate, Description, Confirmation, RewardQuestID FROM playerchoice_response ORDER BY `Index` ASC"); if (!responses.IsEmpty()) { do @@ -8881,11 +8887,17 @@ namespace Game response.ChoiceArtFileId = responses.Read(2); response.Flags = responses.Read(3); response.WidgetSetID = responses.Read(4); - response.GroupID = responses.Read(5); - response.Header = responses.Read(6); - response.Answer = responses.Read(7); - response.Description = responses.Read(8); - response.Confirmation = responses.Read(9); + response.UiTextureAtlasElementID = responses.Read(5); + response.SoundKitID = responses.Read(6); + response.GroupID = responses.Read(7); + response.Answer = responses.Read(8); + response.Header = responses.Read(9); + response.SubHeader = responses.Read(10); + response.ButtonTooltip = responses.Read(11); + response.Description = responses.Read(12); + response.Confirmation = responses.Read(13); + if (!responses.IsNull(14)) + response.RewardQuestID.Set(responses.Read(14)); ++responseCount; choice.Responses[responseId] = response; @@ -9122,8 +9134,8 @@ namespace Game oldMSTime = Time.GetMSTime(); - // 0 1 2 3 4 5 6 - result = DB.World.Query("SELECT ChoiceID, ResponseID, locale, Header, Answer, Description, Confirmation FROM playerchoice_response_locale"); + // 0 1 2 3 4 5 6 7 8 + result = DB.World.Query("SELECT ChoiceID, ResponseID, locale, Answer, Header, SubHeader, ButtonTooltip, Description, Confirmation FROM playerchoice_response_locale"); if (!result.IsEmpty()) { uint count = 0; @@ -9151,10 +9163,12 @@ namespace Game } PlayerChoiceResponseLocale data = playerChoiceLocale.Responses[responseId]; - AddLocaleString(result.Read(3), locale, data.Header); - AddLocaleString(result.Read(4), locale, data.Answer); - AddLocaleString(result.Read(5), locale, data.Description); - AddLocaleString(result.Read(6), locale, data.Confirmation); + AddLocaleString(result.Read(3), locale, data.Answer); + AddLocaleString(result.Read(4), locale, data.Header); + AddLocaleString(result.Read(5), locale, data.SubHeader); + AddLocaleString(result.Read(6), locale, data.ButtonTooltip); + AddLocaleString(result.Read(7), locale, data.Description); + AddLocaleString(result.Read(8), locale, data.Confirmation); count++; } while (result.NextRow()); @@ -10579,6 +10593,8 @@ namespace Game { public StringArray Answer = new StringArray((int)LocaleConstant.Total); public StringArray Header = new StringArray((int)LocaleConstant.Total); + public StringArray SubHeader = new StringArray((int)LocaleConstant.Total); + public StringArray ButtonTooltip = new StringArray((int)LocaleConstant.Total); public StringArray Description = new StringArray((int)LocaleConstant.Total); public StringArray Confirmation = new StringArray((int)LocaleConstant.Total); } @@ -10632,12 +10648,17 @@ namespace Game public int ChoiceArtFileId; public int Flags; public uint WidgetSetID; + public uint UiTextureAtlasElementID; + public uint SoundKitID; public byte GroupID; - public string Header; 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 class PlayerChoice @@ -10649,6 +10670,7 @@ namespace Game public int ChoiceId; public int UiTextureKitId; + public uint SoundKitId; public string Question; public List Responses = new List(); public bool HideWarboardHeader; diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index 0c13b670c..6cc4e1ca6 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -254,10 +254,11 @@ namespace Game.Guilds session.SendPacket(roster); } - public void SendQueryResponse(WorldSession session) + public void SendQueryResponse(WorldSession session, ObjectGuid playerGuid) { QueryGuildInfoResponse response = new QueryGuildInfoResponse(); response.GuildGUID = GetGUID(); + response.PlayerGuid = playerGuid; response.HasGuildInfo = true; response.Info.GuildGuid = GetGUID(); @@ -400,7 +401,7 @@ namespace Game.Guilds SendSaveEmblemResult(session, GuildEmblemError.Success); // "Guild Emblem saved." - SendQueryResponse(session); + SendQueryResponse(session, ObjectGuid.Empty); } } diff --git a/Source/Game/Handlers/ArenaHandler.cs b/Source/Game/Handlers/ArenaHandler.cs deleted file mode 100644 index 0331c2d72..000000000 --- a/Source/Game/Handlers/ArenaHandler.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2012-2019 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 Framework.Constants; -using Game.Network.Packets; - -namespace Game -{ - public partial class WorldSession - { - void SendNotInArenaTeamPacket(ArenaTypes type) - { - ArenaError arenaError = new ArenaError(); - arenaError.ErrorType = ArenaErrorType.NoTeam; - arenaError.TeamSize = (byte)type; // team type (2=2v2, 3=3v3, 5=5v5), can be used for custom types... - SendPacket(arenaError); - } - } -} diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index 54523fd56..c704708ba 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -57,11 +57,14 @@ namespace Game void HandleBattlemasterJoin(BattlemasterJoin battlemasterJoin) { bool isPremade = false; - Group grp = null; - BattlefieldStatusFailed battlefieldStatusFailed; + if (battlemasterJoin.QueueIDs.Empty()) + { + Log.outError(LogFilter.Network, $"Battleground: no bgtype received. possible cheater? {_player.GetGUID().ToString()}"); + return; + } - uint bgTypeId_ = (uint)(battlemasterJoin.QueueID & 0xFFFF); + uint bgTypeId_ = (uint)(battlemasterJoin.QueueIDs[0] & 0xFFFF); if (!CliDB.BattlemasterListStorage.ContainsKey(bgTypeId_)) { Log.outError(LogFilter.Network, "Battleground: invalid bgtype ({0}) received. possible cheater? player guid {1}", bgTypeId_, GetPlayer().GetGUID().ToString()); @@ -94,8 +97,12 @@ namespace Game return; GroupJoinBattlegroundResult err = GroupJoinBattlegroundResult.None; + + Group grp = _player.GetGroup(); + + BattlefieldStatusFailed battlefieldStatusFailed; // check queue conditions - if (!battlemasterJoin.JoinAsGroup) + if (grp == null) { if (GetPlayer().isUsingLfg()) { @@ -159,11 +166,6 @@ namespace Game } else { - grp = GetPlayer().GetGroup(); - - if (!grp) - return; - if (grp.GetLeaderGUID() != GetPlayer().GetGUID()) return; @@ -517,10 +519,7 @@ namespace Game // check real arenateam existence only here (if it was moved to group.CanJoin .. () then we would ahve to get it twice) ArenaTeam at = Global.ArenaTeamMgr.GetArenaTeamById(ateamId); if (at == null) - { - GetPlayer().GetSession().SendNotInArenaTeamPacket(arenatype); return; - } // get the team rating for queuing uint arenaRating = at.GetRating(); diff --git a/Source/Game/Handlers/BlackMarketHandlers.cs b/Source/Game/Handlers/BlackMarketHandlers.cs index a9c8ed28e..de53a67bd 100644 --- a/Source/Game/Handlers/BlackMarketHandlers.cs +++ b/Source/Game/Handlers/BlackMarketHandlers.cs @@ -157,7 +157,7 @@ namespace Game packet.MarketID = templ.MarketID; packet.Item = templ.Item; - packet.RandomPropertiesID = templ.Item.RandomPropertiesID; + packet.RandomPropertiesID = 0; SendPacket(packet); } diff --git a/Source/Game/Handlers/GuildHandler.cs b/Source/Game/Handlers/GuildHandler.cs index 8b30bfa07..75a87e8a8 100644 --- a/Source/Game/Handlers/GuildHandler.cs +++ b/Source/Game/Handlers/GuildHandler.cs @@ -34,13 +34,14 @@ namespace Game { if (guild.IsMember(query.PlayerGuid)) { - guild.SendQueryResponse(this); + guild.SendQueryResponse(this, query.PlayerGuid); return; } } QueryGuildInfoResponse response = new QueryGuildInfoResponse(); response.GuildGUID = query.GuildGuid; + response.PlayerGuid = query.PlayerGuid; SendPacket(response); } diff --git a/Source/Game/Handlers/HotfixHandler.cs b/Source/Game/Handlers/HotfixHandler.cs index fcf1c55f9..5e6332906 100644 --- a/Source/Game/Handlers/HotfixHandler.cs +++ b/Source/Game/Handlers/HotfixHandler.cs @@ -59,41 +59,44 @@ namespace Game void SendAvailableHotfixes(int version) { - SendPacket(new AvailableHotfixes(version, Global.DB2Mgr.GetHotfixData())); + SendPacket(new AvailableHotfixes(version, Global.DB2Mgr.GetHotfixCount(), Global.DB2Mgr.GetHotfixData())); } [WorldPacketHandler(ClientOpcodes.HotfixRequest, Status = SessionStatus.Authed)] void HandleHotfixRequest(HotfixRequest hotfixQuery) { - Dictionary hotfixes = Global.DB2Mgr.GetHotfixData(); + var hotfixes = Global.DB2Mgr.GetHotfixData(); HotfixResponse hotfixQueryResponse = new HotfixResponse(); - foreach (ulong hotfixId in hotfixQuery.Hotfixes) + foreach (HotfixRecord hotfixRecord in hotfixQuery.Hotfixes) { - int hotfix = hotfixes.LookupByKey(hotfixId); - if (hotfix != 0) + var hotfixedRecords = hotfixes.LookupByKey(hotfixRecord.HotfixID); + if (!hotfixedRecords.Empty()) { - var storage = Global.DB2Mgr.GetStorage(MathFunctions.Pair64_HiPart(hotfixId)); + foreach (var tableRecord in hotfixedRecords) + { + var storage = Global.DB2Mgr.GetStorage(hotfixRecord.TableHash); - HotfixResponse.HotfixData hotfixData = new HotfixResponse.HotfixData(); - hotfixData.ID = hotfixId; - hotfixData.RecordID = hotfix; - if (storage != null && storage.HasRecord((uint)hotfixData.RecordID)) - { - hotfixData.Data.HasValue = true; - storage.WriteRecord((uint)hotfixData.RecordID, GetSessionDbcLocale(), hotfixData.Data.Value); - } - else - { - byte[] blobData = Global.DB2Mgr.GetHotfixBlobData(MathFunctions.Pair64_HiPart(hotfixId), hotfix); - if (blobData != null) + HotfixResponse.HotfixData hotfixData = new HotfixResponse.HotfixData(); + hotfixData.Record = hotfixRecord; + if (storage != null && storage.HasRecord((uint)hotfixData.Record.RecordID)) { - hotfixData.Data.HasValue = true; - hotfixData.Data.Value.WriteBytes(blobData); + uint pos = hotfixQueryResponse.HotfixContent.GetSize(); + storage.WriteRecord((uint)hotfixData.Record.RecordID, GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent); + hotfixData.Size.Set(hotfixQueryResponse.HotfixContent.GetSize() - pos); + } + else + { + byte[] blobData = Global.DB2Mgr.GetHotfixBlobData(hotfixData.Record.TableHash, hotfixData.Record.RecordID); + if (blobData != null) + { + hotfixData.Size.Set((uint)blobData.Length); + hotfixQueryResponse.HotfixContent.WriteBytes(blobData); + } } - } - hotfixQueryResponse.Hotfixes.Add(hotfixData); + hotfixQueryResponse.Hotfixes.Add(hotfixData); + } } } diff --git a/Source/Game/Handlers/InspectHandler.cs b/Source/Game/Handlers/InspectHandler.cs index 948698a8d..9377c00a8 100644 --- a/Source/Game/Handlers/InspectHandler.cs +++ b/Source/Game/Handlers/InspectHandler.cs @@ -78,61 +78,15 @@ namespace Game inspectResult.InspecteeGUID = inspect.Target; inspectResult.SpecializationID = (int)player.GetUInt32Value(PlayerFields.CurrentSpecId); + inspectResult.LifetimeMaxRank = player.GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetLifetimeMaxPvpRank); + inspectResult.TodayHK = player.GetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetTodayKills); + inspectResult.YesterdayHK = player.GetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetYesterdayKills); + inspectResult.LifetimeHK = player.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills); + inspectResult.HonorLevel = player.GetUInt32Value(PlayerFields.HonorLevel); SendPacket(inspectResult); } - [WorldPacketHandler(ClientOpcodes.RequestHonorStats)] - void HandleRequestHonorStatsOpcode(RequestHonorStats request) - { - Player player = Global.ObjAccessor.FindPlayer(request.TargetGUID); - if (!player) - { - Log.outDebug(LogFilter.Network, "WorldSession.HandleRequestHonorStatsOpcode: Target {0} not found.", request.TargetGUID.ToString()); - return; - } - - if (!GetPlayer().IsWithinDistInMap(player, SharedConst.InspectDistance, false)) - return; - - if (GetPlayer().IsValidAttackTarget(player)) - return; - - InspectHonorStats honorStats = new InspectHonorStats(); - honorStats.PlayerGUID = request.TargetGUID; - honorStats.LifetimeHK = player.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills); - honorStats.YesterdayHK = player.GetUInt16Value(ActivePlayerFields.Kills, 1); - honorStats.TodayHK = player.GetUInt16Value(ActivePlayerFields.Kills, 0); - honorStats.LifetimeMaxRank = 0; // @todo - - SendPacket(honorStats); - } - - [WorldPacketHandler(ClientOpcodes.InspectPvp)] - void HandleInspectPVP(InspectPVPRequest request) - { - // @todo: deal with request.InspectRealmAddress - - Player player = Global.ObjAccessor.FindPlayer(request.InspectTarget); - if (!player) - { - Log.outDebug(LogFilter.Network, "WorldSession.HandleInspectPVP: Target {0} not found.", request.InspectTarget.ToString()); - return; - } - - if (!GetPlayer().IsWithinDistInMap(player, SharedConst.InspectDistance, false)) - return; - - if (GetPlayer().IsValidAttackTarget(player)) - return; - - InspectPVPResponse response = new InspectPVPResponse(); - response.ClientGUID = request.InspectTarget; - // @todo: fill brackets - - SendPacket(response); - } - [WorldPacketHandler(ClientOpcodes.QueryInspectAchievements)] void HandleQueryInspectAchievements(QueryInspectAchievements inspect) { diff --git a/Source/Game/Handlers/LFGHandler.cs b/Source/Game/Handlers/LFGHandler.cs index 92ffa23c7..ec82da38c 100644 --- a/Source/Game/Handlers/LFGHandler.cs +++ b/Source/Game/Handlers/LFGHandler.cs @@ -316,7 +316,6 @@ namespace Game foreach (var dungeonId in dungeons) lfgRoleCheckUpdate.JoinSlots.Add(Global.LFGMgr.GetLFGDungeonEntry(dungeonId)); - lfgRoleCheckUpdate.BgQueueID = 0; lfgRoleCheckUpdate.GroupFinderActivityID = 0; if (!roleCheck.roles.Empty()) { @@ -348,6 +347,8 @@ namespace Game lfgJoinResult.Result = (byte)joinData.result; if (joinData.result == LfgJoinResult.RoleCheckFailed) lfgJoinResult.ResultDetail = (byte)joinData.state; + else if (joinData.result == LfgJoinResult.NoSlots) + lfgJoinResult.BlackListNames = joinData.playersMissingRequirement; foreach (var it in joinData.lockmap) { diff --git a/Source/Game/Handlers/LootHandler.cs b/Source/Game/Handlers/LootHandler.cs index 214c6a17e..b09c501ec 100644 --- a/Source/Game/Handlers/LootHandler.cs +++ b/Source/Game/Handlers/LootHandler.cs @@ -196,42 +196,32 @@ namespace Game playersNear.Add(member); } - uint goldPerPlayer = (uint)(loot.gold / playersNear.Count); + ulong goldPerPlayer = (ulong)(loot.gold / playersNear.Count); foreach (var pl in playersNear) { - pl.ModifyMoney(goldPerPlayer); - pl.UpdateCriteria(CriteriaTypes.LootMoney, goldPerPlayer); + ulong goldMod = MathFunctions.CalculatePct(goldPerPlayer, pl.GetTotalAuraModifierByMiscValue(AuraType.ModMoneyGain, 1)); - Guild guild = Global.GuildMgr.GetGuildById(pl.GetGuildId()); - if (guild) - { - uint guildGold = MathFunctions.CalculatePct(goldPerPlayer, pl.GetTotalAuraModifier(AuraType.DepositBonusMoneyInGuildBankOnLoot)); - if (guildGold != 0) - guild.HandleMemberDepositMoney(this, guildGold, true); - } + pl.ModifyMoney((long)(goldPerPlayer + goldMod)); + pl.UpdateCriteria(CriteriaTypes.LootMoney, goldPerPlayer); LootMoneyNotify packet = new LootMoneyNotify(); packet.Money = goldPerPlayer; + packet.MoneyMod = goldMod; packet.SoleLooter = playersNear.Count <= 1 ? true : false; pl.SendPacket(packet); } } else { - player.ModifyMoney(loot.gold); - player.UpdateCriteria(CriteriaTypes.LootMoney, loot.gold); + ulong goldMod = MathFunctions.CalculatePct(loot.gold, player.GetTotalAuraModifierByMiscValue(AuraType.ModMoneyGain, 1)); - Guild guild = Global.GuildMgr.GetGuildById(player.GetGuildId()); - if (guild) - { - uint guildGold = MathFunctions.CalculatePct(loot.gold, player.GetTotalAuraModifier(AuraType.DepositBonusMoneyInGuildBankOnLoot)); - if (guildGold != 0) - guild.HandleMemberDepositMoney(this, guildGold, true); - } + player.ModifyMoney((long)(loot.gold + goldMod)); + player.UpdateCriteria(CriteriaTypes.LootMoney, loot.gold); LootMoneyNotify packet = new LootMoneyNotify(); packet.Money = loot.gold; + packet.MoneyMod = goldMod; packet.SoleLooter = true; // "You loot..." SendPacket(packet); } diff --git a/Source/Game/Handlers/NPCHandler.cs b/Source/Game/Handlers/NPCHandler.cs index 34e40d653..295adc577 100644 --- a/Source/Game/Handlers/NPCHandler.cs +++ b/Source/Game/Handlers/NPCHandler.cs @@ -534,6 +534,7 @@ namespace Game item.StackCount = (int)itemTemplate.GetBuyCount(); item.Price = (ulong)price; item.DoNotFilterOnVendor = vendorItem.IgnoreFiltering; + item.Refundable = (itemTemplate.GetFlags() & ItemFlags.ItemPurchaseRecord) != 0 && vendorItem.ExtendedCost != 0 && itemTemplate.GetMaxStackSize() == 1; item.Item.ItemID = vendorItem.item; if (!vendorItem.BonusListIDs.Empty()) diff --git a/Source/Game/Handlers/QueryHandler.cs b/Source/Game/Handlers/QueryHandler.cs index 5fd891cb4..a1c983026 100644 --- a/Source/Game/Handlers/QueryHandler.cs +++ b/Source/Game/Handlers/QueryHandler.cs @@ -158,6 +158,9 @@ namespace Game stats.HealthScalingExpansion = creatureInfo.HealthScalingExpansion; stats.VignetteID = creatureInfo.VignetteID; stats.Class = (int)creatureInfo.UnitClass; + stats.FadeRegionRadius = creatureInfo.FadeRegionRadius; + stats.WidgetSetID = creatureInfo.WidgetSetID; + stats.WidgetSetUnitConditionID = creatureInfo.WidgetSetUnitConditionID; stats.Title = creatureInfo.SubName; stats.TitleAlt = creatureInfo.TitleAlt; diff --git a/Source/Game/Handlers/ToyHandler.cs b/Source/Game/Handlers/ToyHandler.cs index 5ddd87324..c93176e3e 100644 --- a/Source/Game/Handlers/ToyHandler.cs +++ b/Source/Game/Handlers/ToyHandler.cs @@ -48,7 +48,7 @@ namespace Game return; } - if (_collectionMgr.AddToy(item.GetEntry(), false)) + if (_collectionMgr.AddToy(item.GetEntry(), false, false)) _player.DestroyItem(item.GetBagSlot(), item.GetSlot(), true); } @@ -93,5 +93,11 @@ namespace Game spell.m_castFlagsEx |= SpellCastFlagsEx.UseToySpell; spell.prepare(targets); } + + [WorldPacketHandler(ClientOpcodes.ToyClearFanfare)] + void HandleToyClearFanfare(ToyClearFanfare toyClearFanfare) + { + _collectionMgr.ToyClearFanfare(toyClearFanfare.ItemID); + } } } diff --git a/Source/Game/Network/Packets/BattleGroundPackets.cs b/Source/Game/Network/Packets/BattleGroundPackets.cs index 89ffba858..825872dea 100644 --- a/Source/Game/Network/Packets/BattleGroundPackets.cs +++ b/Source/Game/Network/Packets/BattleGroundPackets.cs @@ -32,10 +32,12 @@ namespace Game.Network.Packets { _worldPacket.WriteUInt32(CurrentSeason); _worldPacket.WriteUInt32(PreviousSeason); + _worldPacket.WriteUInt32(PvpSeasonID); } - public uint PreviousSeason = 0; - public uint CurrentSeason = 0; + public uint PreviousSeason; + public uint CurrentSeason; + public uint PvpSeasonID; } public class AreaSpiritHealerQuery : ClientPacket @@ -301,16 +303,17 @@ namespace Game.Network.Packets public override void Read() { - QueueID = _worldPacket.ReadUInt64(); + var queueCount = _worldPacket.ReadUInt32(); Roles = _worldPacket.ReadUInt8(); BlacklistMap[0] = _worldPacket.ReadInt32(); BlacklistMap[1] = _worldPacket.ReadInt32(); - JoinAsGroup = _worldPacket.HasBit(); + + for (var i = 0; i < queueCount; ++i) + QueueIDs[i] = _worldPacket.ReadUInt64(); } - public bool JoinAsGroup; + public Array QueueIDs = new Array(1); public byte Roles; - public ulong QueueID; public int[] BlacklistMap = new int[2]; } @@ -550,21 +553,6 @@ namespace Game.Network.Packets public override void Read() { } } - public class ArenaError : ServerPacket - { - public ArenaError() : base(ServerOpcodes.ArenaError) { } - - public override void Write() - { - _worldPacket.WriteUInt32(ErrorType); - if (ErrorType == ArenaErrorType.NoTeam) - _worldPacket.WriteUInt8(TeamSize); - } - - public ArenaErrorType ErrorType; - public byte TeamSize; - } - //Structs public struct BattlefieldStatusHeader { diff --git a/Source/Game/Network/Packets/CharacterPackets.cs b/Source/Game/Network/Packets/CharacterPackets.cs index 4ad9a1d5a..1723736d7 100644 --- a/Source/Game/Network/Packets/CharacterPackets.cs +++ b/Source/Game/Network/Packets/CharacterPackets.cs @@ -49,10 +49,14 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(Characters.Count); _worldPacket.WriteInt32(MaxCharacterLevel); _worldPacket.WriteUInt32(RaceUnlockData.Count); + _worldPacket.WriteUInt32(UnlockedConditionalAppearances.Count); if (DisabledClassesMask.HasValue) _worldPacket.WriteUInt32(DisabledClassesMask.Value); + foreach (UnlockedConditionalAppearance unlockedConditionalAppearance in UnlockedConditionalAppearances) + unlockedConditionalAppearance.Write(_worldPacket); + foreach (CharacterInfo charInfo in Characters) charInfo.Write(_worldPacket); @@ -72,6 +76,7 @@ namespace Game.Network.Packets public List Characters = new List(); // all characters on the list public List RaceUnlockData = new List(); // + public List UnlockedConditionalAppearances = new List(); public class CharacterInfo { @@ -169,7 +174,7 @@ namespace Game.Network.Packets if (spec != null) SpecID = (ushort)spec.Id; - LastLoginBuild = fields.Read(30); + LastLoginVersion = fields.Read(30); for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot) { @@ -217,7 +222,7 @@ namespace Game.Network.Packets data.WriteUInt32(LastPlayedTime); data.WriteUInt16(SpecID); data.WriteUInt32(Unknown703); - data.WriteUInt32(LastLoginBuild); + data.WriteUInt32(LastLoginVersion); data.WriteUInt32(Flags4); data.WriteBits(Name.GetByteCount(), 6); data.WriteBit(FirstLogin); @@ -255,7 +260,7 @@ namespace Game.Network.Packets public uint LastPlayedTime; public ushort SpecID; public uint Unknown703; - public uint LastLoginBuild; + public uint LastLoginVersion; public PetInfo Pet = new PetInfo(); public bool BoostInProgress; // @todo public uint[] ProfessionIds = new uint[2]; // @todo @@ -274,6 +279,7 @@ namespace Game.Network.Packets public uint DisplayEnchantId; public byte InventoryType; } + public struct PetInfo { public uint CreatureDisplayId; // PetCreatureDisplayID @@ -298,6 +304,18 @@ namespace Game.Network.Packets public bool HasAchievement; public bool HasHeritageArmor; } + + public struct UnlockedConditionalAppearance + { + public void Write(WorldPacket data) + { + data.WriteInt32(AchievementID); + data.WriteInt32(Unused); + } + + public int AchievementID; + public int Unused; + } } public class CreateCharacter : ClientPacket diff --git a/Source/Game/Network/Packets/ChatPackets.cs b/Source/Game/Network/Packets/ChatPackets.cs index dcf1a6ad2..79d307106 100644 --- a/Source/Game/Network/Packets/ChatPackets.cs +++ b/Source/Game/Network/Packets/ChatPackets.cs @@ -388,7 +388,7 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(MessageID); + _worldPacket.WriteInt32(MessageID); _worldPacket.WriteBits(StringParam.GetByteCount(), 11); _worldPacket.WriteString(StringParam); diff --git a/Source/Game/Network/Packets/GarrisonPackets.cs b/Source/Game/Network/Packets/GarrisonPackets.cs index 08741ece9..e8bba7cbf 100644 --- a/Source/Game/Network/Packets/GarrisonPackets.cs +++ b/Source/Game/Network/Packets/GarrisonPackets.cs @@ -443,7 +443,7 @@ namespace Game.Network.Packets public int Unknown; } - struct GarrisonMissionAreaBonus + struct GarrisonMissionBonusAbility { public void Write(WorldPacket data) { @@ -509,7 +509,7 @@ namespace Game.Network.Packets missionRewardItem.Write(data); } - foreach (GarrisonMissionAreaBonus areaBonus in MissionAreaBonuses) + foreach (GarrisonMissionBonusAbility areaBonus in MissionAreaBonuses) areaBonus.Write(data); foreach (GarrisonTalent talent in Talents) @@ -541,7 +541,7 @@ namespace Game.Network.Packets public List Missions = new List(); public List> MissionRewards = new List>(); public List> MissionOvermaxRewards = new List>(); - public List MissionAreaBonuses = new List(); + public List MissionAreaBonuses = new List(); public List Talents = new List(); public List CanStartMission = new List(); public List ArchivedMissions = new List(); diff --git a/Source/Game/Network/Packets/GuildPackets.cs b/Source/Game/Network/Packets/GuildPackets.cs index 1fb3e8138..c529a441c 100644 --- a/Source/Game/Network/Packets/GuildPackets.cs +++ b/Source/Game/Network/Packets/GuildPackets.cs @@ -44,6 +44,7 @@ namespace Game.Network.Packets public override void Write() { _worldPacket.WritePackedGuid(GuildGUID); + _worldPacket.WritePackedGuid(PlayerGuid); _worldPacket.WriteBit(HasGuildInfo); _worldPacket.FlushBits(); @@ -75,6 +76,7 @@ namespace Game.Network.Packets } public ObjectGuid GuildGUID; + public ObjectGuid PlayerGuid; public GuildInfo Info = new GuildInfo(); public bool HasGuildInfo; diff --git a/Source/Game/Network/Packets/HotfixPackets.cs b/Source/Game/Network/Packets/HotfixPackets.cs index 0ccc8ef1c..e8d6f3aa2 100644 --- a/Source/Game/Network/Packets/HotfixPackets.cs +++ b/Source/Game/Network/Packets/HotfixPackets.cs @@ -20,6 +20,7 @@ using Framework.Dynamic; using Framework.IO; using Game.Entities; using System.Collections.Generic; +using System; namespace Game.Network.Packets { @@ -78,23 +79,32 @@ namespace Game.Network.Packets class AvailableHotfixes : ServerPacket { - public AvailableHotfixes(int hotfixCacheVersion, Dictionary hotfixes) : base(ServerOpcodes.AvailableHotfixes) + public AvailableHotfixes(int hotfixCacheVersion, uint hotfixCount, MultiMap> hotfixes) : base(ServerOpcodes.AvailableHotfixes) { HotfixCacheVersion = hotfixCacheVersion; + HotfixCount = hotfixCount; Hotfixes = hotfixes; } public override void Write() { _worldPacket.WriteInt32(HotfixCacheVersion); + _worldPacket.WriteUInt32(HotfixCount); - _worldPacket.WriteUInt32(Hotfixes.Count); - foreach (var hotfixEntry in Hotfixes) - _worldPacket.WriteInt64(hotfixEntry.Key); + foreach (var key in Hotfixes.Keys) + { + foreach (var tableRecord in Hotfixes[key]) + { + _worldPacket.WriteUInt32(tableRecord.Item1); + _worldPacket.WriteInt32(tableRecord.Item2); + _worldPacket.WriteInt32(key); + } + } } public int HotfixCacheVersion; - public Dictionary Hotfixes = new Dictionary(); + public uint HotfixCount; + public MultiMap> Hotfixes; } class HotfixRequest : ClientPacket @@ -103,15 +113,17 @@ namespace Game.Network.Packets public override void Read() { - uint hotfixCount = _worldPacket.ReadUInt32(); - //if (hotfixCount > Global.DB2Mgr.GetHotfixData().Count) - //throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixData().size()); + ClientBuild = _worldPacket.ReadUInt32(); + DataBuild = _worldPacket.ReadUInt32(); + uint hotfixCount = _worldPacket.ReadUInt32(); for (var i = 0; i < hotfixCount; ++i) - Hotfixes.Add(_worldPacket.ReadUInt64()); + Hotfixes.Add(new HotfixRecord(_worldPacket)); } - public List Hotfixes = new List(); + public uint ClientBuild; + public uint DataBuild; + public List Hotfixes = new List(); } class HotfixResponse : ServerPacket @@ -123,27 +135,55 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(Hotfixes.Count); foreach (HotfixData hotfix in Hotfixes) hotfix.Write(_worldPacket); + + _worldPacket.WriteUInt32(HotfixContent.GetSize()); + _worldPacket.WriteBytes(HotfixContent); } public List Hotfixes = new List(); + public ByteBuffer HotfixContent; public class HotfixData { public void Write(WorldPacket data) { - data.WriteInt64(ID); - data.WriteInt32(RecordID); - data.WriteBit(Data.HasValue); - if (Data.HasValue) + Record.Write(data); + if (Size.HasValue) { - data.WriteUInt32(Data.Value.GetSize()); - data.WriteBytes(Data.Value); + data.WriteUInt32(Size); + data.WriteBit(true); } + else + { + data.WriteUInt32(0); + data.WriteBit(false); + } + data.FlushBits(); } - public ulong ID; - public int RecordID; - public Optional Data; + public HotfixRecord Record; + public Optional Size; } } + + public struct HotfixRecord + { + public HotfixRecord(WorldPacket data) + { + TableHash = data.ReadUInt32(); + RecordID = data.ReadInt32(); + HotfixID = data.ReadInt32(); + } + + public void Write(WorldPacket data) + { + data.WriteUInt32(TableHash); + data.WriteInt32(RecordID); + data.WriteInt32(HotfixID); + } + + public uint TableHash; + public int RecordID; + public int HotfixID; + } } diff --git a/Source/Game/Network/Packets/InspectPackets.cs b/Source/Game/Network/Packets/InspectPackets.cs index d5b97929e..666c7c6b3 100644 --- a/Source/Game/Network/Packets/InspectPackets.cs +++ b/Source/Game/Network/Packets/InspectPackets.cs @@ -48,6 +48,11 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(ClassID); _worldPacket.WriteInt32(SpecializationID); _worldPacket.WriteInt32(GenderID); + _worldPacket.WriteUInt8(LifetimeMaxRank); + _worldPacket.WriteUInt16(TodayHK); + _worldPacket.WriteUInt16(YesterdayHK); + _worldPacket.WriteInt32(LifetimeHK); + _worldPacket.WriteInt32(HonorLevel); for (int i = 0; i < Glyphs.Count; ++i) _worldPacket.WriteUInt16(Glyphs[i]); @@ -62,13 +67,17 @@ namespace Game.Network.Packets _worldPacket.WriteBit(AzeriteLevel.HasValue); _worldPacket.FlushBits(); - Items.ForEach(p => p.Write(_worldPacket)); + foreach (PVPBracketData bracket in Bracket) + bracket.Write(_worldPacket); if (GuildData.HasValue) GuildData.Value.Write(_worldPacket); if (AzeriteLevel.HasValue) _worldPacket.WriteInt32(AzeriteLevel.Value); + + foreach (InspectItemData item in Items) + item.Write(_worldPacket); } public ObjectGuid InspecteeGUID; @@ -79,74 +88,16 @@ namespace Game.Network.Packets public Class ClassID = Class.None; public Gender GenderID = Gender.None; public Optional GuildData = new Optional(); + public Array Bracket = new Array(6); public int SpecializationID; public Optional AzeriteLevel; - } - - public class RequestHonorStats : ClientPacket - { - public RequestHonorStats(WorldPacket packet) : base(packet) { } - - public override void Read() - { - TargetGUID = _worldPacket.ReadPackedGuid(); - } - - public ObjectGuid TargetGUID; - } - - public class InspectHonorStats : ServerPacket - { - public InspectHonorStats() : base(ServerOpcodes.InspectHonorStats) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(PlayerGUID); - _worldPacket.WriteUInt8(LifetimeMaxRank); - _worldPacket.WriteUInt16(YesterdayHK); // @todo: confirm order - _worldPacket.WriteUInt16(TodayHK); // @todo: confirm order - _worldPacket.WriteUInt32(LifetimeHK); - } - - public ObjectGuid PlayerGUID; public uint LifetimeHK; - public ushort YesterdayHK; + public uint HonorLevel; public ushort TodayHK; + public ushort YesterdayHK; public byte LifetimeMaxRank; } - public class InspectPVPRequest : ClientPacket - { - public InspectPVPRequest(WorldPacket packet) : base(packet) { } - - public override void Read() - { - InspectTarget = _worldPacket.ReadPackedGuid(); - InspectRealmAddress = _worldPacket.ReadUInt32(); - } - - public ObjectGuid InspectTarget; - public uint InspectRealmAddress; - } - - public class InspectPVPResponse : ServerPacket - { - public InspectPVPResponse() : base(ServerOpcodes.InspectPvp) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(ClientGUID); - - _worldPacket.WriteBits(Bracket.Count, 3); - _worldPacket.FlushBits(); - - Bracket.ForEach(p => p.Write(_worldPacket)); - } - - public List Bracket = new List(); - public ObjectGuid ClientGUID; - } - public class QueryInspectAchievements : ClientPacket { public QueryInspectAchievements(WorldPacket packet) : base(packet) { } @@ -272,7 +223,6 @@ namespace Game.Network.Packets data.WriteInt32(Unk801_1); data.WriteBit(Unk801_2); data.FlushBits(); - } public int Rating; diff --git a/Source/Game/Network/Packets/ItemPackets.cs b/Source/Game/Network/Packets/ItemPackets.cs index 016e13313..15daaa828 100644 --- a/Source/Game/Network/Packets/ItemPackets.cs +++ b/Source/Game/Network/Packets/ItemPackets.cs @@ -774,8 +774,6 @@ namespace Game.Network.Packets public ItemInstance(Item item) { ItemID = item.GetEntry(); - RandomPropertiesSeed = item.GetItemSuffixFactor(); - RandomPropertiesID = (uint)item.GetItemRandomPropertyId(); var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds); if (!bonusListIds.Empty()) { @@ -800,9 +798,6 @@ namespace Game.Network.Packets public ItemInstance(Loots.LootItem lootItem) { ItemID = lootItem.itemid; - RandomPropertiesSeed = lootItem.randomSuffix; - if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType.BonusList) - RandomPropertiesID = lootItem.randomPropertyId.Id; if (!lootItem.BonusListIDs.Empty()) { @@ -821,9 +816,6 @@ namespace Game.Network.Packets public ItemInstance(VoidStorageItem voidItem) { ItemID = voidItem.ItemEntry; - RandomPropertiesSeed = voidItem.ItemSuffixFactor; - if (voidItem.ItemRandomPropertyId.Type != ItemRandomEnchantmentType.BonusList) - RandomPropertiesID = voidItem.ItemRandomPropertyId.Id; if (voidItem.ItemUpgradeId != 0 || voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0) { @@ -861,8 +853,6 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { data.WriteUInt32(ItemID); - data.WriteUInt32(RandomPropertiesSeed); - data.WriteUInt32(RandomPropertiesID); data.WriteBit(ItemBonus.HasValue); data.WriteBit(Modifications.HasValue); @@ -878,8 +868,6 @@ namespace Game.Network.Packets public void Read(WorldPacket data) { ItemID = data.ReadUInt32(); - RandomPropertiesSeed = data.ReadUInt32(); - RandomPropertiesID = data.ReadUInt32(); ItemBonus.HasValue = data.HasBit(); Modifications.HasValue = data.HasBit(); @@ -894,8 +882,7 @@ namespace Game.Network.Packets public override int GetHashCode() { - return ItemID.GetHashCode() ^ RandomPropertiesSeed.GetHashCode() ^ - RandomPropertiesID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode(); + return ItemID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode(); } public override bool Equals(object obj) @@ -908,7 +895,7 @@ namespace Game.Network.Packets public static bool operator ==(ItemInstance left, ItemInstance right) { - if (left.ItemID != right.ItemID || left.RandomPropertiesID != right.RandomPropertiesID || left.RandomPropertiesSeed != right.RandomPropertiesSeed) + if (left.ItemID != right.ItemID) return false; if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue) @@ -929,8 +916,6 @@ namespace Game.Network.Packets } public uint ItemID; - public uint RandomPropertiesSeed; - public uint RandomPropertiesID; public Optional ItemBonus; public Optional Modifications; } diff --git a/Source/Game/Network/Packets/LFGPackets.cs b/Source/Game/Network/Packets/LFGPackets.cs index 88790dd1a..aae3471e3 100644 --- a/Source/Game/Network/Packets/LFGPackets.cs +++ b/Source/Game/Network/Packets/LFGPackets.cs @@ -235,13 +235,16 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(PartyIndex); _worldPacket.WriteUInt8(RoleCheckStatus); _worldPacket.WriteUInt32(JoinSlots.Count); - _worldPacket.WriteUInt64(BgQueueID); + _worldPacket.WriteUInt32(BgQueueIDs.Count); _worldPacket.WriteUInt32(GroupFinderActivityID); _worldPacket.WriteUInt32(Members.Count); foreach (var slot in JoinSlots) _worldPacket.WriteUInt32(slot); + foreach (ulong bgQueueID in BgQueueIDs) + _worldPacket.WriteUInt64(bgQueueID); + _worldPacket.WriteBit(IsBeginning); _worldPacket.WriteBit(IsRequeue); _worldPacket.FlushBits(); @@ -253,7 +256,7 @@ namespace Game.Network.Packets public byte PartyIndex; public byte RoleCheckStatus; public List JoinSlots = new List(); - public ulong BgQueueID; + public List BgQueueIDs = new List(); public int GroupFinderActivityID = 0; public List Members = new List(); public bool IsBeginning; @@ -271,15 +274,24 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(Result); _worldPacket.WriteUInt8(ResultDetail); _worldPacket.WriteUInt32(BlackList.Count); + _worldPacket.WriteUInt32(BlackListNames.Count); foreach (LFGJoinBlackList blackList in BlackList) blackList.Write(_worldPacket); + + foreach (string str in BlackListNames) + _worldPacket.WriteBits(str.GetByteCount() + 1, 24); + + foreach (string str in BlackListNames) + if (!str.IsEmpty()) + _worldPacket.WriteCString(str); } public RideTicket Ticket = new RideTicket(); public byte Result; public byte ResultDetail; public List BlackList = new List(); + public List BlackListNames = new List(); } class LFGQueueStatus : ServerPacket diff --git a/Source/Game/Network/Packets/LootPackets.cs b/Source/Game/Network/Packets/LootPackets.cs index 5730938a2..939ec6cba 100644 --- a/Source/Game/Network/Packets/LootPackets.cs +++ b/Source/Game/Network/Packets/LootPackets.cs @@ -143,12 +143,14 @@ namespace Game.Network.Packets public override void Write() { - _worldPacket.WriteUInt32(Money); + _worldPacket.WriteUInt64(Money); + _worldPacket.WriteUInt64(MoneyMod); _worldPacket.WriteBit(SoleLooter); _worldPacket.FlushBits(); } - public uint Money; + public ulong Money; + public ulong MoneyMod; public bool SoleLooter; } diff --git a/Source/Game/Network/Packets/MailPackets.cs b/Source/Game/Network/Packets/MailPackets.cs index f954953db..e48a64700 100644 --- a/Source/Game/Network/Packets/MailPackets.cs +++ b/Source/Game/Network/Packets/MailPackets.cs @@ -283,9 +283,9 @@ namespace Game.Network.Packets } } - public class NotifyRecievedMail : ServerPacket + public class NotifyReceivedMail : ServerPacket { - public NotifyRecievedMail() : base(ServerOpcodes.NotifyReceivedMail) { } + public NotifyReceivedMail() : base(ServerOpcodes.NotifyReceivedMail) { } public override void Write() { diff --git a/Source/Game/Network/Packets/MiscPackets.cs b/Source/Game/Network/Packets/MiscPackets.cs index 6b78ddeb6..3fb6e263d 100644 --- a/Source/Game/Network/Packets/MiscPackets.cs +++ b/Source/Game/Network/Packets/MiscPackets.cs @@ -118,6 +118,9 @@ namespace Game.Network.Packets _worldPacket.WriteBit(TrackedQuantity.HasValue); _worldPacket.WriteBit(MaxQuantity.HasValue); _worldPacket.WriteBit(SuppressChatLog); + _worldPacket.WriteBit(QuantityChange.HasValue); + _worldPacket.WriteBit(QuantityGainSource.HasValue); + _worldPacket.WriteBit(QuantityLostSource.HasValue); _worldPacket.FlushBits(); if (WeeklyQuantity.HasValue) @@ -128,6 +131,15 @@ namespace Game.Network.Packets if (MaxQuantity.HasValue) _worldPacket.WriteInt32(MaxQuantity.Value); + + if (QuantityChange.HasValue) + _worldPacket.WriteInt32(QuantityChange.Value); + + if (QuantityGainSource.HasValue) + _worldPacket.WriteInt32(QuantityGainSource.Value); + + if (QuantityLostSource.HasValue) + _worldPacket.WriteInt32(QuantityLostSource.Value); } public uint Type; @@ -136,6 +148,9 @@ namespace Game.Network.Packets public Optional WeeklyQuantity; public Optional TrackedQuantity; public Optional MaxQuantity; + public Optional QuantityChange; + public Optional QuantityGainSource; + public Optional QuantityLostSource; public bool SuppressChatLog; } diff --git a/Source/Game/Network/Packets/MovementPackets.cs b/Source/Game/Network/Packets/MovementPackets.cs index 20d190140..584e8163c 100644 --- a/Source/Game/Network/Packets/MovementPackets.cs +++ b/Source/Game/Network/Packets/MovementPackets.cs @@ -1017,7 +1017,7 @@ namespace Game.Network.Packets data.WriteBit(VehicleRecID.HasValue); data.WriteBit(CollisionHeight.HasValue); data.WriteBit(MovementForce_.HasValue); - data.WriteBit(Unknown.HasValue); + data.WriteBit(MovementForceGUID.HasValue); data.FlushBits(); if (CollisionHeight.HasValue) @@ -1041,8 +1041,8 @@ namespace Game.Network.Packets if (VehicleRecID.HasValue) data.WriteInt32(VehicleRecID.Value); - if (Unknown.HasValue) - data.WritePackedGuid(Unknown.Value); + if (MovementForceGUID.HasValue) + data.WritePackedGuid(MovementForceGUID.Value); if (MovementForce_.HasValue) MovementForce_.Value.Write(data); @@ -1055,7 +1055,7 @@ namespace Game.Network.Packets public Optional VehicleRecID; public Optional CollisionHeight; public Optional MovementForce_; - public Optional Unknown; + public Optional MovementForceGUID; } } diff --git a/Source/Game/Network/Packets/NPCPackets.cs b/Source/Game/Network/Packets/NPCPackets.cs index 5a7e7aedc..bb2de0624 100644 --- a/Source/Game/Network/Packets/NPCPackets.cs +++ b/Source/Game/Network/Packets/NPCPackets.cs @@ -333,6 +333,7 @@ namespace Game.Network.Packets data.WriteInt32(PlayerConditionFailed); Item.Write(data); data.WriteBit(DoNotFilterOnVendor); + data.WriteBit(Refundable); data.FlushBits(); } @@ -346,6 +347,7 @@ namespace Game.Network.Packets public int ExtendedCostID; public int PlayerConditionFailed; public bool DoNotFilterOnVendor; + public bool Refundable; } public class TrainerListSpell diff --git a/Source/Game/Network/Packets/PartyPackets.cs b/Source/Game/Network/Packets/PartyPackets.cs index 22ea78fdd..5ead7b593 100644 --- a/Source/Game/Network/Packets/PartyPackets.cs +++ b/Source/Game/Network/Packets/PartyPackets.cs @@ -201,6 +201,13 @@ namespace Game.Network.Packets public string Name; } + class GroupUninvite : ServerPacket + { + public GroupUninvite() : base(ServerOpcodes.GroupUninvite) { } + + public override void Write() { } + } + class RequestPartyMemberStats : ClientPacket { public RequestPartyMemberStats(WorldPacket packet) : base(packet) { } @@ -422,13 +429,6 @@ namespace Game.Network.Packets public sbyte PartyIndex; } - class GroupUninvite : ServerPacket - { - public GroupUninvite() : base(ServerOpcodes.GroupUninvite) { } - - public override void Write() { } - } - class GroupDestroyed : ServerPacket { public GroupDestroyed() : base(ServerOpcodes.GroupDestroyed) { } @@ -1042,7 +1042,8 @@ namespace Game.Network.Packets data.WriteUInt8(RolesAssigned); data.WriteUInt8(Class); data.WriteString(Name); - data.WriteString(VoiceStateID); + if (!VoiceStateID.IsEmpty()) + data.WriteString(VoiceStateID); } public ObjectGuid GUID; diff --git a/Source/Game/Network/Packets/QueryPackets.cs b/Source/Game/Network/Packets/QueryPackets.cs index 0b4081d17..771ae99ec 100644 --- a/Source/Game/Network/Packets/QueryPackets.cs +++ b/Source/Game/Network/Packets/QueryPackets.cs @@ -131,6 +131,9 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(Stats.RequiredExpansion); _worldPacket.WriteInt32(Stats.VignetteID); _worldPacket.WriteInt32(Stats.Class); + _worldPacket.WriteFloat(Stats.FadeRegionRadius); + _worldPacket.WriteInt32(Stats.WidgetSetID); + _worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID); if (!Stats.Title.IsEmpty()) _worldPacket.WriteCString(Stats.Title); @@ -738,6 +741,9 @@ namespace Game.Network.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]; public uint[] ProxyCreatureID = new uint[SharedConst.MaxCreatureKillCredit]; public StringArray Name = new StringArray(SharedConst.MaxCreatureNames); diff --git a/Source/Game/Network/Packets/QuestPackets.cs b/Source/Game/Network/Packets/QuestPackets.cs index 754bd398c..3c1dfbfbd 100644 --- a/Source/Game/Network/Packets/QuestPackets.cs +++ b/Source/Game/Network/Packets/QuestPackets.cs @@ -201,6 +201,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt64(Info.AllowableRaces); _worldPacket.WriteInt32(Info.TreasurePickerID); _worldPacket.WriteInt32(Info.Expansion); + _worldPacket.WriteInt32(Info.ManagedWorldStateID); _worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9); _worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12); @@ -837,6 +838,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(Responses.Count); _worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WriteInt32(UiTextureKitID); + _worldPacket.WriteUInt32(SoundKitID); _worldPacket.WriteBits(Question.GetByteCount(), 8); _worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(HideWarboardHeader); @@ -852,6 +854,7 @@ namespace Game.Network.Packets public ObjectGuid SenderGUID; public int ChoiceID; public int UiTextureKitID; + public uint SoundKitID; public string Question; public List Responses = new List(); public bool CloseChoiceFrame; @@ -965,6 +968,7 @@ namespace Game.Network.Packets public uint TimeAllowed; public int TreasurePickerID; public int Expansion; + public int ManagedWorldStateID; public List Objectives = new List(); public uint[] RewardItems = new uint[SharedConst.QuestRewardItemCount]; public uint[] RewardAmount = new uint[SharedConst.QuestRewardItemCount]; @@ -1254,13 +1258,18 @@ namespace Game.Network.Packets data.WriteInt32(ChoiceArtFileID); data.WriteInt32(Flags); data.WriteUInt32(WidgetSetID); + data.WriteUInt32(UiTextureAtlasElementID); + data.WriteUInt32(SoundKitID); data.WriteUInt8(GroupID); data.WriteBits(Answer.GetByteCount(), 9); data.WriteBits(Header.GetByteCount(), 9); + data.WriteBits(SubHeader.GetByteCount(), 7); + data.WriteBits(ButtonTooltip.GetByteCount(), 9); data.WriteBits(Description.GetByteCount(), 11); data.WriteBits(Confirmation.GetByteCount(), 7); + data.WriteBit(RewardQuestID.HasValue); data.WriteBit(Reward.HasValue); data.FlushBits(); @@ -1269,19 +1278,29 @@ namespace Game.Network.Packets data.WriteString(Answer); data.WriteString(Header); + data.WriteString(SubHeader); + data.WriteString(ButtonTooltip); data.WriteString(Description); data.WriteString(Confirmation); + + 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; } } \ No newline at end of file diff --git a/Source/Game/Network/Packets/ReputationPackets.cs b/Source/Game/Network/Packets/ReputationPackets.cs index 442ab8793..d4cc47d60 100644 --- a/Source/Game/Network/Packets/ReputationPackets.cs +++ b/Source/Game/Network/Packets/ReputationPackets.cs @@ -22,7 +22,7 @@ namespace Game.Network.Packets { public class InitializeFactions : ServerPacket { - const ushort FactionCount = 300; + const ushort FactionCount = 350; public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { } diff --git a/Source/Game/Network/Packets/SpellPackets.cs b/Source/Game/Network/Packets/SpellPackets.cs index a72e80e1f..b56bb8656 100644 --- a/Source/Game/Network/Packets/SpellPackets.cs +++ b/Source/Game/Network/Packets/SpellPackets.cs @@ -691,8 +691,8 @@ namespace Game.Network.Packets _worldPacket.WritePackedGuid(Target); _worldPacket.WriteUInt32(SpellVisualID); _worldPacket.WriteFloat(TravelSpeed); - _worldPacket.WriteFloat(UnkZero); - _worldPacket.WriteFloat(Unk801); + _worldPacket.WriteFloat(LaunchDelay); + _worldPacket.WriteFloat(MinDuration); _worldPacket.WriteBit(SpeedAsTime); _worldPacket.FlushBits(); } @@ -702,8 +702,8 @@ namespace Game.Network.Packets public uint SpellVisualID; public bool SpeedAsTime; public float TravelSpeed; - public float UnkZero; // Always zero - public float Unk801; + public float LaunchDelay; // Always zero + public float MinDuration; public Vector3 SourceRotation; // Vector of rotations, Orientation is z public Vector3 TargetLocation; // Exclusive with Target } @@ -716,29 +716,31 @@ namespace Game.Network.Packets { _worldPacket.WritePackedGuid(Source); _worldPacket.WritePackedGuid(Target); - _worldPacket.WritePackedGuid(Unk801_1); + _worldPacket.WritePackedGuid(Transport); _worldPacket.WriteVector3(TargetPosition); _worldPacket.WriteUInt32(SpellVisualID); _worldPacket.WriteFloat(TravelSpeed); + _worldPacket.WriteUInt16(HitReason); _worldPacket.WriteUInt16(MissReason); _worldPacket.WriteUInt16(ReflectStatus); - _worldPacket.WriteFloat(Orientation); - _worldPacket.WriteFloat(Unk801_2); + _worldPacket.WriteFloat(LaunchDelay); + _worldPacket.WriteFloat(MinDuration); _worldPacket.WriteBit(SpeedAsTime); _worldPacket.FlushBits(); } public ObjectGuid Source; public ObjectGuid Target; // Exclusive with TargetPosition - public ObjectGuid Unk801_1; - public ushort MissReason; - public uint SpellVisualID; - public bool SpeedAsTime; - public ushort ReflectStatus; - public float TravelSpeed; + public ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0 public Vector3 TargetPosition; // Exclusive with Target - public float Orientation; - public float Unk801_2; + public uint SpellVisualID; + public float TravelSpeed; + public ushort HitReason; + public ushort MissReason; + public ushort ReflectStatus; + public float LaunchDelay; + public float MinDuration; + public bool SpeedAsTime; } class PlaySpellVisualKit : ServerPacket @@ -1268,6 +1270,7 @@ namespace Game.Network.Packets { data.WriteInt16(PlayerLevelDelta); data.WriteUInt16(PlayerItemLevel); + data.WriteUInt16(TargetItemLevel); data.WriteUInt16(ScalingHealthItemLevelCurveID); data.WriteUInt8(TargetLevel); data.WriteUInt8(Expansion); @@ -1282,6 +1285,7 @@ namespace Game.Network.Packets public ContentTuningType TuningType; public short PlayerLevelDelta; public ushort PlayerItemLevel; + public ushort TargetItemLevel; public ushort ScalingHealthItemLevelCurveID; public byte TargetLevel; public byte Expansion; @@ -1401,7 +1405,7 @@ namespace Game.Network.Packets { public void Read(WorldPacket data) { - Flags = (SpellCastTargetFlags)data.ReadBits(25); + Flags = (SpellCastTargetFlags)data.ReadBits(26); SrcLocation.HasValue = data.HasBit(); DstLocation.HasValue = data.HasBit(); Orientation.HasValue = data.HasBit(); @@ -1428,7 +1432,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { - data.WriteBits((uint)Flags, 25); + data.WriteBits((uint)Flags, 26); data.WriteBit(SrcLocation.HasValue); data.WriteBit(DstLocation.HasValue); data.WriteBit(Orientation.HasValue); @@ -1525,19 +1529,40 @@ namespace Game.Network.Packets public uint[] Misc = new uint[2]; } - public struct SpellMissStatus + public struct SpellHitStatus { + public SpellHitStatus(SpellMissInfo reason) + { + Reason = reason; + } + public void Write(WorldPacket data) { - data.WriteBits(Reason, 4); - if (Reason == (byte)SpellMissInfo.Reflect) + data.WriteUInt8(Reason); + } + + public SpellMissInfo Reason; + } + + public struct SpellMissStatus + { + public SpellMissStatus(SpellMissInfo reason, SpellMissInfo reflectStatus) + { + Reason = reason; + ReflectStatus = reflectStatus; + } + + public void Write(WorldPacket data) + { + data.WriteBits((byte)Reason, 4); + if (Reason == SpellMissInfo.Reflect) data.WriteBits(ReflectStatus, 4); data.FlushBits(); } - public byte Reason; - public byte ReflectStatus; + public SpellMissInfo Reason; + public SpellMissInfo ReflectStatus; } public struct SpellPowerData @@ -1643,22 +1668,26 @@ namespace Game.Network.Packets data.WriteBits(HitTargets.Count, 16); data.WriteBits(MissTargets.Count, 16); + data.WriteBits(HitStatus.Count, 16); data.WriteBits(MissStatus.Count, 16); data.WriteBits(RemainingPower.Count, 9); data.WriteBit(RemainingRunes.HasValue); data.WriteBits(TargetPoints.Count, 16); data.FlushBits(); - foreach (SpellMissStatus status in MissStatus) - status.Write(data); + foreach (SpellMissStatus missStatus in MissStatus) + missStatus.Write(data); Target.Write(data); - foreach (ObjectGuid target in HitTargets) - data.WritePackedGuid(target); + foreach (ObjectGuid hitTarget in HitTargets) + data.WritePackedGuid(hitTarget); - foreach (ObjectGuid target in MissTargets) - data.WritePackedGuid(target); + foreach (ObjectGuid missTarget in MissTargets) + data.WritePackedGuid(missTarget); + + foreach (SpellHitStatus hitStatus in HitStatus) + hitStatus.Write(data); foreach (SpellPowerData power in RemainingPower) power.Write(data); @@ -1681,6 +1710,7 @@ namespace Game.Network.Packets public uint CastTime; public List HitTargets = new List(); public List MissTargets = new List(); + public List HitStatus = new List(); public List MissStatus = new List(); public SpellTargetData Target = new SpellTargetData(); public List RemainingPower = new List(); diff --git a/Source/Game/Network/Packets/SystemPackets.cs b/Source/Game/Network/Packets/SystemPackets.cs index c88c35aa3..b0e5b4dae 100644 --- a/Source/Game/Network/Packets/SystemPackets.cs +++ b/Source/Game/Network/Packets/SystemPackets.cs @@ -50,6 +50,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay); _worldPacket.WriteUInt32(ClubsPresenceUpdateTimer); + _worldPacket.WriteUInt32(HiddenUIClubsPresenceUpdateTimer); _worldPacket.WriteBit(VoiceEnabled); _worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue); @@ -77,6 +78,7 @@ namespace Game.Network.Packets _worldPacket.WriteBit(ClubsEnabled); _worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed); _worldPacket.WriteBit(ClubsCharacterClubTypeAllowed); + _worldPacket.WriteBit(ClubsPresenceUpdateEnabled); _worldPacket.WriteBit(VoiceChatDisabledByParentalControl); _worldPacket.WriteBit(VoiceChatMutedByParentalControl); _worldPacket.FlushBits(); @@ -159,6 +161,7 @@ namespace Game.Network.Packets public long TokenBalanceAmount; public uint BpayStoreProductDeliveryDelay; public uint ClubsPresenceUpdateTimer; + public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden public bool ItemRestorationButtonEnabled; public bool CharUndeleteEnabled; // Implemented public bool BpayStoreDisabledByParentalControls; @@ -176,6 +179,7 @@ namespace Game.Network.Packets public bool ClubsEnabled; public bool ClubsBattleNetClubTypeAllowed; public bool ClubsCharacterClubTypeAllowed; + public bool ClubsPresenceUpdateEnabled; public bool VoiceChatDisabledByParentalControl; public bool VoiceChatMutedByParentalControl; diff --git a/Source/Game/Network/Packets/TokenPackets.cs b/Source/Game/Network/Packets/TokenPackets.cs index de831feaf..bcf7213c4 100644 --- a/Source/Game/Network/Packets/TokenPackets.cs +++ b/Source/Game/Network/Packets/TokenPackets.cs @@ -87,12 +87,12 @@ namespace Game.Network.Packets _worldPacket.WriteUInt64(CurrentMarketPrice); _worldPacket.WriteUInt32(UnkInt); _worldPacket.WriteUInt32(Result); - _worldPacket.WriteUInt32(UnkInt2); + _worldPacket.WriteUInt32(AuctionDuration); } public ulong CurrentMarketPrice; public uint UnkInt; // send CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE public TokenResult Result; - public uint UnkInt2 = 0; + public uint AuctionDuration; // preset auction duration enum } } diff --git a/Source/Game/Network/Packets/ToyPackets.cs b/Source/Game/Network/Packets/ToyPackets.cs index ffc7b45e0..8d9912901 100644 --- a/Source/Game/Network/Packets/ToyPackets.cs +++ b/Source/Game/Network/Packets/ToyPackets.cs @@ -18,6 +18,7 @@ using Framework.Constants; using Game.Entities; using System.Collections.Generic; +using System; namespace Game.Network.Packets { @@ -54,20 +55,36 @@ namespace Game.Network.Packets _worldPacket.WriteBit(IsFullUpdate); _worldPacket.FlushBits(); - // both lists have to have the same size + // all lists have to have the same size + _worldPacket.WriteUInt32(Toys.Count); _worldPacket.WriteUInt32(Toys.Count); _worldPacket.WriteUInt32(Toys.Count); - foreach (var item in Toys) - _worldPacket.WriteUInt32(item.Key); + foreach (var pair in Toys) + _worldPacket.WriteUInt32(pair.Key); - foreach (var favourite in Toys) - _worldPacket.WriteBit(favourite.Value); + foreach (var pair in Toys) + _worldPacket.WriteBit(pair.Value.HasAnyFlag(ToyFlags.Favorite)); + + foreach (var pair in Toys) + _worldPacket.WriteBit(pair.Value.HasAnyFlag(ToyFlags.HasFanfare)); _worldPacket.FlushBits(); } public bool IsFullUpdate = false; - public Dictionary Toys = new Dictionary(); + public Dictionary Toys = new Dictionary(); + } + + class ToyClearFanfare : ClientPacket + { + public ToyClearFanfare(WorldPacket packet) : base(packet) { } + + public override void Read() + { + ItemID = _worldPacket.ReadUInt32(); + } + + public uint ItemID; } } diff --git a/Source/Game/Quest/Quest.cs b/Source/Game/Quest/Quest.cs index b2604a5fa..be972b94f 100644 --- a/Source/Game/Quest/Quest.cs +++ b/Source/Game/Quest/Quest.cs @@ -124,16 +124,17 @@ namespace Game AllowableRaces = (long)fields.Read(108); TreasurePickerID = fields.Read(109); Expansion = fields.Read(110); + ManagedWorldStateID = fields.Read(111); - LogTitle = fields.Read(111); - LogDescription = fields.Read(112); - QuestDescription = fields.Read(113); - AreaDescription = fields.Read(114); - PortraitGiverText = fields.Read(115); - PortraitGiverName = fields.Read(116); - PortraitTurnInText = fields.Read(117); - PortraitTurnInName = fields.Read(118); - QuestCompletionLog = fields.Read(119); + LogTitle = fields.Read(112); + LogDescription = fields.Read(113); + QuestDescription = fields.Read(114); + AreaDescription = fields.Read(115); + PortraitGiverText = fields.Read(116); + PortraitGiverName = fields.Read(117); + PortraitTurnInText = fields.Read(118); + PortraitTurnInName = fields.Read(119); + QuestCompletionLog = fields.Read(120); } public void LoadQuestDetails(SQLFields fields) @@ -487,6 +488,7 @@ namespace Game public long AllowableRaces { get; set; } public int TreasurePickerID; public int Expansion; + public int ManagedWorldStateID; public List Objectives = new List(); public string LogTitle = ""; public string LogDescription = ""; diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index abdfef734..d2821b502 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -3724,6 +3724,7 @@ namespace Game.Spells if (targetInfo.missCondition == SpellMissInfo.None) // hits { data.HitTargets.Add(targetInfo.targetGUID); + data.HitStatus.Add(new SpellHitStatus(SpellMissInfo.None)); m_channelTargetEffectMask |= targetInfo.effectMask; } @@ -3731,12 +3732,7 @@ namespace Game.Spells { data.MissTargets.Add(targetInfo.targetGUID); - SpellMissStatus missStatus = new SpellMissStatus(); - missStatus.Reason = (byte)targetInfo.missCondition; - if (targetInfo.missCondition == SpellMissInfo.Reflect) - missStatus.ReflectStatus = (byte)targetInfo.reflectResult; - - data.MissStatus.Add(missStatus); + data.MissStatus.Add(new SpellMissStatus(targetInfo.missCondition, targetInfo.reflectResult)); } }