diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index cff932452..a591573f4 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -19,29 +19,29 @@ namespace Framework.Constants { public enum ClientOpcodes : uint { - AbandonNpeResponse = 0x33ef, + AbandonNpeResponse = 0x33f1, AcceptGuildInvite = 0x35fc, AcceptTrade = 0x315a, AcceptWargameInvite = 0x35e0, - ActivateSoulbind = 0x33df, + ActivateSoulbind = 0x33e1, ActivateTaxi = 0x34b1, AddonList = 0x35d8, AddBattlenetFriend = 0x365a, AddFriend = 0x36d0, AddIgnore = 0x36d4, - AddToy = 0x32a6, - AdventureJournalOpenQuest = 0x3206, - AdventureJournalUpdateSuggestions = 0x33e2, - AdventureMapStartQuest = 0x335b, + AddToy = 0x32a7, + AdventureJournalOpenQuest = 0x3207, + AdventureJournalUpdateSuggestions = 0x33e4, + AdventureMapStartQuest = 0x335d, AlterAppearance = 0x3503, AreaSpiritHealerQuery = 0x34b6, AreaSpiritHealerQueue = 0x34b7, - AreaTrigger = 0x31d9, - ArtifactAddPower = 0x31ab, - ArtifactSetAppearance = 0x31ad, - AssignEquipmentSetSpec = 0x320f, - AttackStop = 0x325e, - AttackSwing = 0x325d, + AreaTrigger = 0x31da, + ArtifactAddPower = 0x31ac, + ArtifactSetAppearance = 0x31ae, + AssignEquipmentSetSpec = 0x3210, + AttackStop = 0x325f, + AttackSwing = 0x325e, AuctionableTokenSell = 0x36e8, AuctionableTokenSellAtMarketPrice = 0x36e9, AuctionBrowseQuery = 0x34d6, @@ -69,15 +69,15 @@ namespace Framework.Constants AutoEquipItem = 0x399a, AutoEquipItemSlot = 0x399f, AutoStoreBagItem = 0x399b, - AzeriteEmpoweredItemSelectPower = 0x3384, - AzeriteEmpoweredItemViewed = 0x3366, - AzeriteEssenceActivateEssence = 0x3386, - AzeriteEssenceUnlockMilestone = 0x3385, + AzeriteEmpoweredItemSelectPower = 0x3386, + AzeriteEmpoweredItemViewed = 0x3368, + AzeriteEssenceActivateEssence = 0x3388, + AzeriteEssenceUnlockMilestone = 0x3387, BankerActivate = 0x34b9, BattlefieldLeave = 0x3173, - BattlefieldList = 0x317e, + BattlefieldList = 0x317f, BattlefieldPort = 0x3537, - BattlemasterHello = 0x32c0, + BattlemasterHello = 0x32c1, BattlemasterJoin = 0x3530, BattlemasterJoinArena = 0x3531, BattlemasterJoinBrawl = 0x3535, @@ -103,21 +103,21 @@ namespace Framework.Constants BattlePetSetBattleSlot = 0x362c, BattlePetSetFlags = 0x3630, BattlePetSummon = 0x3628, - BattlePetUpdateDisplayNotify = 0x31e3, - BattlePetUpdateNotify = 0x31e2, + BattlePetUpdateDisplayNotify = 0x31e4, + BattlePetUpdateNotify = 0x31e3, BeginTrade = 0x3157, BinderActivate = 0x34b8, BlackMarketBidOnItem = 0x353f, BlackMarketOpen = 0x353d, BlackMarketRequestItems = 0x353e, - BonusRoll = 0x3387, + BonusRoll = 0x3389, BugReport = 0x3686, BusyTrade = 0x3158, BuyBackItem = 0x34aa, BuyBankSlot = 0x34ba, BuyItem = 0x34a9, BuyReagentBank = 0x34bb, - CageBattlePet = 0x31f5, + CageBattlePet = 0x31f6, CalendarAddEvent = 0x367d, CalendarCommunityInvite = 0x3671, CalendarComplain = 0x3679, @@ -133,24 +133,24 @@ namespace Framework.Constants CalendarRsvp = 0x3674, CalendarStatus = 0x3675, CalendarUpdateEvent = 0x367e, - CancelAura = 0x31af, + CancelAura = 0x31b0, CancelAutoRepeatSpell = 0x34f5, - CancelCast = 0x32ac, - CancelChannelling = 0x3276, - CancelGrowthAura = 0x327b, - CancelMasterLootRoll = 0x3217, - CancelModSpeedNoControlAuras = 0x31ae, - CancelMountAura = 0x328e, - CancelQueuedSpell = 0x317f, + CancelCast = 0x32ad, + CancelChannelling = 0x3277, + CancelGrowthAura = 0x327c, + CancelMasterLootRoll = 0x3218, + CancelModSpeedNoControlAuras = 0x31af, + CancelMountAura = 0x328f, + CancelQueuedSpell = 0x3180, CancelTempEnchantment = 0x3500, CancelTrade = 0x315c, CanDuel = 0x3662, CanRedeemTokenForBalance = 0x3709, - CastSpell = 0x32a9, + CastSpell = 0x32aa, ChallengeModeRequestLeaders = 0x3090, - ChangeBagSlotFlag = 0x333f, - ChangeBankBagSlotFlag = 0x3340, - ChangeMonumentAppearance = 0x3321, + ChangeBagSlotFlag = 0x3341, + ChangeBankBagSlotFlag = 0x3342, + ChangeMonumentAppearance = 0x3322, ChangeRealmTicket = 0x36fc, ChangeSubGroup = 0x364c, CharacterCheckUpgrade = 0x36c6, @@ -197,17 +197,17 @@ namespace Framework.Constants ChatReportIgnored = 0x37cb, ChatUnregisterAllAddonPrefixes = 0x37ce, CheckCharacterNameAvailability = 0x3645, - CheckIsAdventureMapPoiValid = 0x324f, - ChoiceResponse = 0x32b0, - ChromieTimeSelectExpansion = 0x33de, - ClaimWeeklyReward = 0x33b9, + CheckIsAdventureMapPoiValid = 0x3250, + ChoiceResponse = 0x32b1, + ChromieTimeSelectExpansion = 0x33e0, + ClaimWeeklyReward = 0x33bb, ClearNewAppearance = 0x312f, - ClearRaidMarker = 0x31a7, + ClearRaidMarker = 0x31a8, ClearTradeItem = 0x315e, ClientPortGraveyard = 0x3539, CloseInteraction = 0x3499, - CloseQuestChoice = 0x32b1, - CloseRuneforgeInteraction = 0x33e6, + CloseQuestChoice = 0x32b2, + CloseRuneforgeInteraction = 0x33e8, ClubFinderApplicationResponse = 0x371f, ClubFinderGetApplicantsList = 0x371d, ClubFinderPost = 0x371a, @@ -232,8 +232,8 @@ namespace Framework.Constants Complaint = 0x366c, CompleteCinematic = 0x3557, CompleteMovie = 0x34eb, - ConfirmArtifactRespec = 0x31ac, - ConfirmRespecWipe = 0x3211, + ConfirmArtifactRespec = 0x31ad, + ConfirmRespecWipe = 0x3212, ConnectToFailed = 0x35d4, ConsumableTokenBuy = 0x36eb, ConsumableTokenBuyAtMarketPrice = 0x36ec, @@ -244,16 +244,17 @@ namespace Framework.Constants ContributionLastUpdateRequest = 0x356a, ConversationLineStarted = 0x3558, ConvertRaid = 0x364e, + CovenantRenownRequestCatchupState = 0x357d, CreateCharacter = 0x3644, - CreateShipment = 0x330d, + CreateShipment = 0x330e, DbQueryBulk = 0x35e4, DeclineGuildInvites = 0x352d, DeclinePetition = 0x3546, DeleteEquipmentSet = 0x3519, DelFriend = 0x36d1, DelIgnore = 0x36d5, - DepositReagentBank = 0x3348, - DestroyItem = 0x32a0, + DepositReagentBank = 0x334a, + DestroyItem = 0x32a1, DfBootPlayerVote = 0x3615, DfConfirmExpandSearch = 0x3607, DfGetJoinStatus = 0x3613, @@ -267,10 +268,10 @@ namespace Framework.Constants DiscardedTimeSyncAcks = 0x3a3e, DismissCritter = 0x3507, DoCountdown = 0x3719, - DoMasterLootRoll = 0x3216, + DoMasterLootRoll = 0x3217, DoReadyCheck = 0x3634, DuelResponse = 0x34f0, - EjectPassenger = 0x3244, + EjectPassenger = 0x3245, Emote = 0x3553, EnableNagle = 0x376b, EnableTaxiNode = 0x34af, @@ -279,47 +280,47 @@ namespace Framework.Constants EnumCharacters = 0x35e8, EnumCharactersDeletedByClient = 0x36de, FarSight = 0x34f6, - GameEventDebugDisable = 0x31b3, - GameEventDebugEnable = 0x31b2, + GameEventDebugDisable = 0x31b4, + GameEventDebugEnable = 0x31b3, GameObjReportUse = 0x34fd, GameObjUse = 0x34fc, - GarrisonAddFollowerHealth = 0x3308, - GarrisonAssignFollowerToBuilding = 0x32ee, - GarrisonCancelConstruction = 0x32db, - GarrisonCheckUpgradeable = 0x333b, - GarrisonCompleteMission = 0x332e, - GarrisonFullyHealAllFollowers = 0x3309, - GarrisonGenerateRecruits = 0x32f1, - GarrisonGetClassSpecCategoryInfo = 0x3300, - GarrisonGetMapData = 0x3307, - GarrisonGetMissionReward = 0x335f, - GarrisonLearnTalent = 0x32fc, - GarrisonMissionBonusRoll = 0x3330, - GarrisonPurchaseBuilding = 0x32d7, - GarrisonRecruitFollower = 0x32f3, - GarrisonRemoveFollower = 0x3325, - GarrisonRemoveFollowerFromBuilding = 0x32ef, - GarrisonRenameFollower = 0x32f0, - GarrisonRequestBlueprintAndSpecializationData = 0x32d6, - GarrisonRequestShipmentInfo = 0x330b, - GarrisonResearchTalent = 0x32f4, - GarrisonSetBuildingActive = 0x32d8, - GarrisonSetFollowerFavorite = 0x32ec, - GarrisonSetFollowerInactive = 0x32e4, - GarrisonSetRecruitmentPreferences = 0x32f2, - GarrisonSocketTalent = 0x33f2, - GarrisonStartMission = 0x332d, - GarrisonSwapBuildings = 0x32dc, + GarrisonAddFollowerHealth = 0x3309, + GarrisonAssignFollowerToBuilding = 0x32ef, + GarrisonCancelConstruction = 0x32dc, + GarrisonCheckUpgradeable = 0x333d, + GarrisonCompleteMission = 0x332f, + GarrisonFullyHealAllFollowers = 0x330a, + GarrisonGenerateRecruits = 0x32f2, + GarrisonGetClassSpecCategoryInfo = 0x3301, + GarrisonGetMapData = 0x3308, + GarrisonGetMissionReward = 0x3361, + GarrisonLearnTalent = 0x32fd, + GarrisonMissionBonusRoll = 0x3331, + GarrisonPurchaseBuilding = 0x32d8, + GarrisonRecruitFollower = 0x32f4, + GarrisonRemoveFollower = 0x3326, + GarrisonRemoveFollowerFromBuilding = 0x32f0, + GarrisonRenameFollower = 0x32f1, + GarrisonRequestBlueprintAndSpecializationData = 0x32d7, + GarrisonRequestShipmentInfo = 0x330c, + GarrisonResearchTalent = 0x32f5, + GarrisonSetBuildingActive = 0x32d9, + GarrisonSetFollowerFavorite = 0x32ed, + GarrisonSetFollowerInactive = 0x32e5, + GarrisonSetRecruitmentPreferences = 0x32f3, + GarrisonSocketTalent = 0x33f4, + GarrisonStartMission = 0x332e, + GarrisonSwapBuildings = 0x32dd, GenerateRandomCharacterName = 0x35e7, GetAccountCharacterList = 0x36b6, - GetGarrisonInfo = 0x32d1, + GetGarrisonInfo = 0x32d2, GetItemPurchaseData = 0x3541, - GetLandingPageShipments = 0x330c, - GetMirrorImageData = 0x32a4, + GetLandingPageShipments = 0x330d, + GetMirrorImageData = 0x32a5, GetPvpOptionsEnabled = 0x35ee, GetRafAccountInfo = 0x3723, GetRemainingGameTime = 0x36ed, - GetTrophyList = 0x331e, + GetTrophyList = 0x331f, GetUndeleteCharacterCooldownStatus = 0x36e0, GetVasAccountCharacterList = 0x36f2, GetVasTransferTargetRealmList = 0x36f3, @@ -372,34 +373,34 @@ namespace Framework.Constants GuildUpdateInfoText = 0x3076, GuildUpdateMotdText = 0x3075, HearthAndResurrect = 0x3515, - HideQuestChoice = 0x32b2, + HideQuestChoice = 0x32b3, HotfixRequest = 0x35e5, IgnoreTrade = 0x3159, InitiateRolePoll = 0x35da, InitiateTrade = 0x3156, Inspect = 0x353b, InstanceLockResponse = 0x351a, - IslandQueue = 0x33b5, + IslandQueue = 0x33b7, ItemPurchaseRefund = 0x3542, - ItemTextQuery = 0x333c, - JoinPetBattleQueue = 0x31e0, - JoinRatedBattleground = 0x3178, + ItemTextQuery = 0x333e, + JoinPetBattleQueue = 0x31e1, + JoinRatedBattleground = 0x3179, KeepAlive = 0x367f, - KeyboundOverride = 0x3229, + KeyboundOverride = 0x322a, LearnPvpTalents = 0x3568, LearnTalents = 0x3566, LeaveGroup = 0x3649, - LeavePetBattleQueue = 0x31e1, + LeavePetBattleQueue = 0x31e2, LfgListApplyToGroup = 0x360c, LfgListCancelApplication = 0x360d, LfgListDeclineApplicant = 0x360e, LfgListGetStatus = 0x360a, LfgListInviteApplicant = 0x360f, LfgListInviteResponse = 0x3610, - LfgListJoin = 0x3382, + LfgListJoin = 0x3384, LfgListLeave = 0x3609, LfgListSearch = 0x360b, - LfgListUpdateRequest = 0x3383, + LfgListUpdateRequest = 0x3385, LfGuildAddRecruit = 0x361b, LfGuildBrowse = 0x361d, LfGuildDeclineRecruit = 0x3079, @@ -414,33 +415,33 @@ namespace Framework.Constants LiveRegionGetAccountCharacterList = 0x36b7, LiveRegionKeyBindingsCopy = 0x36ba, LoadingScreenNotify = 0x35f8, - LoadSelectedTrophy = 0x331f, + LoadSelectedTrophy = 0x3320, LogoutCancel = 0x34e6, LogoutInstant = 0x34e7, LogoutRequest = 0x34e4, LogDisconnect = 0x3769, LogStreamingError = 0x376d, - LootItem = 0x3214, - LootMoney = 0x3213, - LootRelease = 0x3218, - LootRoll = 0x3219, - LootUnit = 0x3212, + LootItem = 0x3215, + LootMoney = 0x3214, + LootRelease = 0x3219, + LootRoll = 0x321a, + LootUnit = 0x3213, LowLevelRaid1 = 0x36a2, LowLevelRaid2 = 0x3521, MailCreateTextItem = 0x354d, - MailDelete = 0x322b, + MailDelete = 0x322c, MailGetList = 0x3548, MailMarkAsRead = 0x354c, MailReturnToSender = 0x3655, MailTakeItem = 0x354a, MailTakeMoney = 0x3549, - MakeContitionalAppearancePermanent = 0x322d, - MasterLootItem = 0x3215, + MakeContitionalAppearancePermanent = 0x322e, + MasterLootItem = 0x3216, MinimapPing = 0x364b, - MissileTrajectoryCollision = 0x318a, + MissileTrajectoryCollision = 0x318b, MountClearFanfare = 0x312d, MountSetFavorite = 0x3632, - MountSpecialAnim = 0x328f, + MountSpecialAnim = 0x3290, MoveApplyMovementForceAck = 0x3a14, MoveChangeTransport = 0x3a2e, MoveChangeVehicleSeats = 0x3a33, @@ -510,40 +511,40 @@ namespace Framework.Constants MoveWaterWalkAck = 0x3a1c, MythicPlusRequestMapStats = 0x308f, MythicPlusWeeklyRewardRequest = 0x3683, - NeutralPlayerSelectFaction = 0x31d6, + NeutralPlayerSelectFaction = 0x31d7, NextCinematicCamera = 0x3556, - ObjectUpdateFailed = 0x3180, - ObjectUpdateRescued = 0x3181, - OfferPetition = 0x33dd, + ObjectUpdateFailed = 0x3181, + ObjectUpdateRescued = 0x3182, + OfferPetition = 0x33df, OpeningCinematic = 0x3555, - OpenItem = 0x333d, - OpenMissionNpc = 0x3302, - OpenShipmentNpc = 0x330a, - OpenTradeskillNpc = 0x3315, + OpenItem = 0x333f, + OpenMissionNpc = 0x3303, + OpenShipmentNpc = 0x330b, + OpenTradeskillNpc = 0x3316, OptOutOfLoot = 0x3504, OverrideScreenFlash = 0x352e, PartyInvite = 0x3602, PartyInviteResponse = 0x3603, PartyUninvite = 0x3647, - PerformItemInteraction = 0x3235, + PerformItemInteraction = 0x3236, PetitionBuy = 0x34cf, PetitionRenameGuild = 0x36c9, PetitionShowList = 0x34ce, PetitionShowSignatures = 0x34d0, PetAbandon = 0x3493, PetAction = 0x3491, - PetBattleFinalNotify = 0x31e5, + PetBattleFinalNotify = 0x31e6, PetBattleInput = 0x3641, - PetBattleQueueProposeMatchResult = 0x322a, - PetBattleQuitNotify = 0x31e4, + PetBattleQueueProposeMatchResult = 0x322b, + PetBattleQuitNotify = 0x31e5, PetBattleReplaceFrontPet = 0x3642, - PetBattleRequestPvp = 0x31de, - PetBattleRequestUpdate = 0x31df, - PetBattleRequestWild = 0x31dc, - PetBattleScriptErrorNotify = 0x31e6, - PetBattleWildLocationFail = 0x31dd, + PetBattleRequestPvp = 0x31df, + PetBattleRequestUpdate = 0x31e0, + PetBattleRequestWild = 0x31dd, + PetBattleScriptErrorNotify = 0x31e7, + PetBattleWildLocationFail = 0x31de, PetCancelAura = 0x3494, - PetCastSpell = 0x32a8, + PetCastSpell = 0x32a9, PetRename = 0x3685, PetSetAction = 0x3490, PetSpellAutocast = 0x3495, @@ -551,31 +552,31 @@ namespace Framework.Constants Ping = 0x3768, PlayerLogin = 0x35ea, PushQuestToParty = 0x34a5, - PvpLogData = 0x317b, - QueryBattlePetName = 0x3282, + PvpLogData = 0x317c, + QueryBattlePetName = 0x3283, QueryCorpseLocationFromClient = 0x3660, QueryCorpseTransport = 0x3661, - QueryCountdownTimer = 0x31aa, - QueryCreature = 0x327c, - QueryGameObject = 0x327d, - QueryGarrisonPetName = 0x3283, + QueryCountdownTimer = 0x31ab, + QueryCreature = 0x327d, + QueryGameObject = 0x327e, + QueryGarrisonPetName = 0x3284, QueryGuildInfo = 0x368e, QueryInspectAchievements = 0x350e, QueryNextMailTime = 0x354b, - QueryNpcText = 0x327e, - QueryPageText = 0x3280, - QueryPetition = 0x3284, - QueryPetName = 0x3281, + QueryNpcText = 0x327f, + QueryPageText = 0x3281, + QueryPetition = 0x3285, + QueryPetName = 0x3282, QueryPlayerName = 0x368a, QueryPlayerNamesForCommunity = 0x368c, QueryPlayerNameByCommunityId = 0x368b, QueryQuestCompletionNpcs = 0x3175, - QueryQuestInfo = 0x327f, + QueryQuestInfo = 0x3280, QueryRealmName = 0x368d, QueryScenarioPoi = 0x3656, QueryTime = 0x34e3, - QueryTreasurePicker = 0x3362, - QueryVoidStorage = 0x31a3, + QueryTreasurePicker = 0x3364, + QueryVoidStorage = 0x31a4, QuestConfirmAccept = 0x34a4, QuestGiverAcceptQuest = 0x349e, QuestGiverChooseReward = 0x34a0, @@ -589,8 +590,8 @@ namespace Framework.Constants QuestLogRemoveQuest = 0x3540, QuestPoiQuery = 0x36b0, QuestPushResult = 0x34a6, - QuestSessionBeginResponse = 0x33ce, - QuestSessionRequestStart = 0x33cd, + QuestSessionBeginResponse = 0x33d0, + QuestSessionRequestStart = 0x33cf, QuestSessionRequestStop = 0x372e, QueuedMessagesEnd = 0x376c, QuickJoinAutoAcceptRequests = 0x3708, @@ -605,66 +606,66 @@ namespace Framework.Constants RaidOrBattlegroundEngineSurvey = 0x36e5, RandomRoll = 0x3654, ReadyCheckResponse = 0x3635, - ReadItem = 0x333e, + ReadItem = 0x3340, ReclaimCorpse = 0x34e9, - RemoveNewItem = 0x3365, + RemoveNewItem = 0x3367, RemoveRafRecruit = 0x3727, ReorderCharacters = 0x35e9, RepairItem = 0x34fa, - ReplaceTrophy = 0x3320, + ReplaceTrophy = 0x3321, RepopRequest = 0x3538, ReportClientVariables = 0x3702, ReportEnabledAddons = 0x3701, ReportKeybindingExecutionCounts = 0x3703, ReportPvpPlayerAfk = 0x3502, - ReportServerLag = 0x33c4, - ReportStuckInCombat = 0x33c5, + ReportServerLag = 0x33c6, + ReportStuckInCombat = 0x33c7, RequestAccountData = 0x3698, - RequestAreaPoiUpdate = 0x3364, + RequestAreaPoiUpdate = 0x3366, RequestBattlefieldStatus = 0x35dc, - RequestCategoryCooldowns = 0x317d, - RequestCemeteryList = 0x3176, + RequestCategoryCooldowns = 0x317e, + RequestCemeteryList = 0x3177, RequestCharacterGuildFollowInfo = 0x368f, - RequestConquestFormulaConstants = 0x32c3, - RequestCovenantCallings = 0x33b7, + RequestConquestFormulaConstants = 0x32c4, + RequestCovenantCallings = 0x33b9, RequestCrowdControlSpell = 0x353c, - RequestForcedReactions = 0x320d, - RequestGarrisonTalentWorldQuestUnlocks = 0x33f1, - RequestGuildPartyState = 0x31a9, - RequestGuildRewardsList = 0x31a8, - RequestLatestSplashScreen = 0x33c6, - RequestLfgListBlacklist = 0x32b3, - RequestMythicPlusAffixes = 0x320a, - RequestMythicPlusSeasonData = 0x320b, + RequestForcedReactions = 0x320e, + RequestGarrisonTalentWorldQuestUnlocks = 0x33f3, + RequestGuildPartyState = 0x31aa, + RequestGuildRewardsList = 0x31a9, + RequestLatestSplashScreen = 0x33c8, + RequestLfgListBlacklist = 0x32b4, + RequestMythicPlusAffixes = 0x320b, + RequestMythicPlusSeasonData = 0x320c, RequestPartyJoinUpdates = 0x35f7, RequestPartyMemberStats = 0x3653, RequestPetInfo = 0x3496, - RequestPlayedTime = 0x3287, - RequestPvpRewards = 0x3196, + RequestPlayedTime = 0x3288, + RequestPvpRewards = 0x3197, RequestRaidInfo = 0x36ca, RequestRatedPvpInfo = 0x35e3, RequestRealmGuildMasterInfo = 0x309b, RequestResearchHistory = 0x3167, - RequestScheduledPvpInfo = 0x3197, + RequestScheduledPvpInfo = 0x3198, RequestStabledPets = 0x3497, - RequestVehicleExit = 0x323f, - RequestVehicleNextSeat = 0x3241, - RequestVehiclePrevSeat = 0x3240, - RequestVehicleSwitchSeat = 0x3242, - RequestWeeklyRewards = 0x33ba, - RequestWorldQuestUpdate = 0x3363, - ResetChallengeMode = 0x3208, - ResetChallengeModeCheat = 0x3209, + RequestVehicleExit = 0x3240, + RequestVehicleNextSeat = 0x3242, + RequestVehiclePrevSeat = 0x3241, + RequestVehicleSwitchSeat = 0x3243, + RequestWeeklyRewards = 0x33bc, + RequestWorldQuestUpdate = 0x3365, + ResetChallengeMode = 0x3209, + ResetChallengeModeCheat = 0x320a, ResetInstances = 0x3668, ResurrectResponse = 0x3684, - RevertMonumentAppearance = 0x3322, - RideVehicleInteract = 0x3243, - SaveCufProfiles = 0x318b, + RevertMonumentAppearance = 0x3323, + RideVehicleInteract = 0x3244, + SaveCufProfiles = 0x318c, SaveEquipmentSet = 0x3518, - SaveGuildEmblem = 0x32b7, - ScenePlaybackCanceled = 0x3226, - ScenePlaybackComplete = 0x3225, - SceneTriggerEvent = 0x3227, + SaveGuildEmblem = 0x32b8, + ScenePlaybackCanceled = 0x3227, + ScenePlaybackComplete = 0x3226, + SceneTriggerEvent = 0x3228, SelfRes = 0x3543, SellItem = 0x34a8, SendCharacterClubInvitation = 0x36fb, @@ -672,62 +673,62 @@ namespace Framework.Constants SendMail = 0x35fa, SendTextEmote = 0x348e, ServerTimeOffsetRequest = 0x369d, - SetAchievementsHidden = 0x322c, + SetAchievementsHidden = 0x322d, SetActionBarToggles = 0x3544, SetActionButton = 0x3636, SetActiveMover = 0x3a39, - SetAdvancedCombatLogging = 0x32c4, + SetAdvancedCombatLogging = 0x32c5, SetAssistantLeader = 0x364f, - SetBackpackAutosortDisabled = 0x3341, - SetBankAutosortDisabled = 0x3342, + SetBackpackAutosortDisabled = 0x3343, + SetBankAutosortDisabled = 0x3344, SetContactNotes = 0x36d2, SetCurrencyFlags = 0x3169, - SetDifficultyId = 0x3228, + SetDifficultyId = 0x3229, SetDungeonDifficulty = 0x3682, SetEveryoneIsAssistant = 0x3617, SetFactionAtWar = 0x34ec, SetFactionInactive = 0x34ee, SetFactionNotAtWar = 0x34ed, - SetGameEventDebugViewState = 0x31ba, - SetInsertItemsLeftToRight = 0x3344, + SetGameEventDebugViewState = 0x31bb, + SetInsertItemsLeftToRight = 0x3346, SetLootMethod = 0x3648, SetLootSpecialization = 0x3551, SetPartyAssignment = 0x3651, SetPartyLeader = 0x364a, SetPetSlot = 0x3168, SetPlayerDeclinedNames = 0x3689, - SetPreferredCemetery = 0x3177, - SetPvp = 0x32bb, + SetPreferredCemetery = 0x3178, + SetPvp = 0x32bc, SetRaidDifficulty = 0x36dc, SetRole = 0x35d9, SetSavedInstanceExtend = 0x3687, SetSelection = 0x353a, SetSheathed = 0x348f, - SetSortBagsRightToLeft = 0x3343, + SetSortBagsRightToLeft = 0x3345, SetTaxiBenchmarkMode = 0x3501, - SetTitle = 0x328d, + SetTitle = 0x328e, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x3304, - SetWarMode = 0x32bc, + SetUsingPartyGarrison = 0x3305, + SetWarMode = 0x32bd, SetWatchedFaction = 0x34ef, ShowTradeSkill = 0x36c2, SignPetition = 0x3545, SilencePartyTalker = 0x3652, SocketGems = 0x34f9, - SortBags = 0x3345, - SortBankBags = 0x3346, - SortReagentBankBags = 0x3347, + SortBags = 0x3347, + SortBankBags = 0x3348, + SortReagentBankBags = 0x3349, SpellClick = 0x349b, SpiritHealerActivate = 0x34b5, SplitItem = 0x399e, - StandStateChange = 0x3189, + StandStateChange = 0x318a, StartChallengeMode = 0x355c, StartSpectatorWarGame = 0x35df, StartWarGame = 0x35de, SubmitUserFeedback = 0x3697, - SubscriptionInterstitialResponse = 0x33e7, + SubscriptionInterstitialResponse = 0x33e9, SummonResponse = 0x366a, SupportTicketSubmitComplaint = 0x3646, SurrenderArena = 0x3174, @@ -736,8 +737,8 @@ namespace Framework.Constants SwapInvItem = 0x399d, SwapItem = 0x399c, SwapSubGroups = 0x364d, - SwapVoidItem = 0x31a5, - TabardVendorActivate = 0x32b8, + SwapVoidItem = 0x31a6, + TabardVendorActivate = 0x32b9, TalkToGossip = 0x3498, TaxiNodeStatusQuery = 0x34ae, TaxiQueryAvailableNodes = 0x34b0, @@ -747,46 +748,46 @@ namespace Framework.Constants TimeSyncResponseDropped = 0x3a3c, TimeSyncResponseFailed = 0x3a3b, ToggleDifficulty = 0x3657, - TogglePvp = 0x32ba, + TogglePvp = 0x32bb, TotemDestroyed = 0x3506, ToyClearFanfare = 0x312e, - TradeSkillSetFavorite = 0x3361, + TradeSkillSetFavorite = 0x3363, TrainerBuySpell = 0x34b4, TrainerList = 0x34b3, - TransmogrifyItems = 0x3198, + TransmogrifyItems = 0x3199, TurnInPetition = 0x3547, Tutorial = 0x36dd, TwitterCheckStatus = 0x312a, TwitterConnect = 0x3127, TwitterDisconnect = 0x312b, - TwitterPost = 0x3349, - UiMapQuestLinesRequest = 0x33b6, + TwitterPost = 0x334b, + UiMapQuestLinesRequest = 0x33b8, UnacceptTrade = 0x315b, UndeleteCharacter = 0x36df, UnlearnSkill = 0x34f3, - UnlearnSpecialization = 0x31a6, - UnlockVoidStorage = 0x31a2, + UnlearnSpecialization = 0x31a7, + UnlockVoidStorage = 0x31a3, UpdateAccountData = 0x3699, - UpdateAreaTriggerVisual = 0x32ab, + UpdateAreaTriggerVisual = 0x32ac, UpdateClientSettings = 0x3664, UpdateMissileTrajectory = 0x3a40, UpdateRaidTarget = 0x3650, - UpdateSpellVisual = 0x32aa, + UpdateSpellVisual = 0x32ab, UpdateVasPurchaseStates = 0x36f5, - UpgradeGarrison = 0x32cc, - UpgradeRuneforgeLegendary = 0x33e5, - UsedFollow = 0x3186, - UseCritterItem = 0x3249, + UpgradeGarrison = 0x32cd, + UpgradeRuneforgeLegendary = 0x33e7, + UsedFollow = 0x3187, + UseCritterItem = 0x324a, UseEquipmentSet = 0x3995, - UseItem = 0x32a5, - UseToy = 0x32a7, + UseItem = 0x32a6, + UseToy = 0x32a8, VasCheckTransferOk = 0x370d, VasGetQueueMinutes = 0x370c, VasGetServiceStatus = 0x370b, - ViolenceLevel = 0x3184, + ViolenceLevel = 0x3185, VoiceChatJoinChannel = 0x3711, VoiceChatLogin = 0x3710, - VoidStorageTransfer = 0x31a4, + VoidStorageTransfer = 0x31a5, Warden3Data = 0x35ec, Who = 0x3681, WhoIs = 0x3680, @@ -818,6 +819,7 @@ namespace Framework.Constants AddLossOfControl = 0x266d, AddRunePower = 0x26b5, AdjustSplineDuration = 0x25cf, + AdvancedCombatLog = 0x2893, AdventureJournalDataResponse = 0x288d, AdventureMapOpenNpc = 0x27f7, AeLootTargets = 0x2615, @@ -1025,7 +1027,7 @@ namespace Framework.Constants ClearResurrect = 0x257f, ClearSpellCharges = 0x2c28, ClearTarget = 0x2942, - ClearTreasurePickerCache = 0x2aa0, + ClearTreasurePickerCache = 0x2aa1, CloseArtifactForge = 0x27a3, CloseHeartForge = 0x282b, CloseItemForge = 0x27a1, @@ -1064,9 +1066,10 @@ namespace Framework.Constants CorpseLocation = 0x264b, CorpseReclaimDelay = 0x274e, CorpseTransportQuery = 0x2717, - CovenantCallingsAvailabilityResponse = 0x2aa2, + CovenantCallingsAvailabilityResponse = 0x2aa3, CovenantPreviewOpenNpc = 0x2800, CovenantRenownOpenNpc = 0x288f, + CovenantRenownSendCatchupState = 0x2891, CreateChar = 0x2704, CreateShipmentResponse = 0x279b, CriteriaDeleted = 0x26eb, @@ -1091,7 +1094,7 @@ namespace Framework.Constants DisplayGameError = 0x25a4, DisplayPlayerChoice = 0x2ffc, DisplayPromotion = 0x2648, - DisplayQuestPopup = 0x2a9d, + DisplayQuestPopup = 0x2a9e, DisplayToast = 0x2621, DisplayWorldText = 0x27f0, DontAutoPushSpellsToActionBar = 0x25dd, @@ -1141,7 +1144,7 @@ namespace Framework.Constants GameObjectPlaySpellVisualKit = 0x2c4a, GameObjectResetState = 0x2723, GameObjectSetStateLocal = 0x2806, - GameObjectUILink = 0x271f, + GameObjectUiLink = 0x271f, GameSpeedSet = 0x267f, GameTimeSet = 0x2711, GameTimeUpdate = 0x2710, @@ -1151,6 +1154,7 @@ namespace Framework.Constants GarrisonAddMissionResult = 0x296e, GarrisonApplyTalentSocketDataChanges = 0x29a0, GarrisonAssignFollowerToBuildingResult = 0x2980, + GarrisonAutoTroopMinLevelUpdateResult = 0x29a2, GarrisonBuildingActivated = 0x295f, GarrisonBuildingRemoved = 0x2958, GarrisonBuildingSetActiveSpecializationResult = 0x295a, @@ -1212,6 +1216,7 @@ namespace Framework.Constants GarrisonUnlearnBlueprintResult = 0x295c, GarrisonUpdateFollower = 0x296c, GarrisonUpdateGarrisonMonumentSelections = 0x2991, + GarrisonUpdateMissionCheatResult = 0x29a1, GarrisonUpgradeResult = 0x2961, GarrisonUseRecallPortalResult = 0x2973, GenerateRandomCharacterNameResult = 0x2585, @@ -1231,11 +1236,11 @@ namespace Framework.Constants GmTicketCaseStatus = 0x26a1, GmTicketSystemStatus = 0x26a0, GodMode = 0x26ff, - GossipComplete = 0x2a96, - GossipMessage = 0x2a97, + GossipComplete = 0x2a97, + GossipMessage = 0x2a98, GossipPoi = 0x2796, - GossipQuestUpdate = 0x2a98, - GossipRefreshOptions = 0x2aa5, + GossipQuestUpdate = 0x2a99, + GossipRefreshOptions = 0x2aa6, GroupActionThrottled = 0x2590, GroupAutoKick = 0x2794, GroupDecline = 0x2791, @@ -1332,7 +1337,7 @@ namespace Framework.Constants IslandsMissionNpc = 0x27fc, IslandAzeriteGain = 0x2760, IslandComplete = 0x2761, - IsQuestCompleteResponse = 0x2a83, + IsQuestCompleteResponse = 0x2a84, ItemChanged = 0x26ee, ItemCooldown = 0x27c7, ItemEnchantTimeUpdate = 0x2759, @@ -1631,35 +1636,35 @@ namespace Framework.Constants QueryPetNameResponse = 0x26d5, QueryPlayerNameByCommunityIdResponse = 0x3003, QueryPlayerNameResponse = 0x3002, - QueryQuestInfoResponse = 0x2a95, + QueryQuestInfoResponse = 0x2a96, QueryTimeResponse = 0x26e8, QuestCompletionNpcResponse = 0x2a81, - QuestConfirmAccept = 0x2a8e, - QuestForceRemoved = 0x2a9b, - QuestGiverInvalidQuest = 0x2a84, - QuestGiverOfferRewardMessage = 0x2a93, - QuestGiverQuestComplete = 0x2a82, - QuestGiverQuestDetails = 0x2a91, - QuestGiverQuestFailed = 0x2a85, - QuestGiverQuestListMessage = 0x2a99, - QuestGiverRequestItems = 0x2a92, - QuestGiverStatus = 0x2a9a, - QuestGiverStatusMultiple = 0x2a90, - QuestLogFull = 0x2a86, - QuestPoiQueryResponse = 0x2a9c, - QuestPoiUpdateResponse = 0x2a9e, - QuestPushResult = 0x2a8f, + QuestConfirmAccept = 0x2a8f, + QuestForceRemoved = 0x2a9c, + QuestGiverInvalidQuest = 0x2a85, + QuestGiverOfferRewardMessage = 0x2a94, + QuestGiverQuestComplete = 0x2a83, + QuestGiverQuestDetails = 0x2a92, + QuestGiverQuestFailed = 0x2a86, + QuestGiverQuestListMessage = 0x2a9a, + QuestGiverRequestItems = 0x2a93, + QuestGiverStatus = 0x2a9b, + QuestGiverStatusMultiple = 0x2a91, + QuestLogFull = 0x2a87, + QuestPoiQueryResponse = 0x2a9d, + QuestPoiUpdateResponse = 0x2a9f, + QuestPushResult = 0x2a90, QuestSessionInfoResponse = 0x2882, QuestSessionReadyCheck = 0x2870, QuestSessionReadyCheckResponse = 0x2871, QuestSessionResult = 0x286f, - QuestUpdateAddCredit = 0x2a8b, - QuestUpdateAddCreditSimple = 0x2a8c, - QuestUpdateAddPvpCredit = 0x2a8d, - QuestUpdateComplete = 0x2a88, - QuestUpdateCompleteBySpell = 0x2a87, - QuestUpdateFailed = 0x2a89, - QuestUpdateFailedTimer = 0x2a8a, + QuestUpdateAddCredit = 0x2a8c, + QuestUpdateAddCreditSimple = 0x2a8d, + QuestUpdateAddPvpCredit = 0x2a8e, + QuestUpdateComplete = 0x2a89, + QuestUpdateCompleteBySpell = 0x2a88, + QuestUpdateFailed = 0x2a8a, + QuestUpdateFailedTimer = 0x2a8b, QueueSummaryUpdate = 0x2815, RafAccountInfo = 0x286d, RafActivityStateChanged = 0x287e, @@ -1691,7 +1696,7 @@ namespace Framework.Constants ResearchComplete = 0x2587, ResetCompressionContext = 0x304f, ResetFailedNotify = 0x26b4, - ResetQuestPoi = 0x2a9f, + ResetQuestPoi = 0x2aa0, ResetRangedCombatTimer = 0x2943, ResetWeeklyCurrency = 0x2575, RespecWipeConfirm = 0x2610, @@ -1772,7 +1777,7 @@ namespace Framework.Constants ShowBank = 0x267d, ShowMailbox = 0x27a9, ShowNeutralPlayerFactionSelectUi = 0x25d7, - ShowQuestCompletionText = 0x2a94, + ShowQuestCompletionText = 0x2a95, ShowTaxiNodes = 0x26ca, ShowTradeSkillResponse = 0x2773, SocketGemsFailure = 0x272c, @@ -1852,7 +1857,7 @@ namespace Framework.Constants TwitterStatus = 0x3043, UiHealingRangeModified = 0x2748, UiItemInteractionNpc = 0x27fb, - UiMapQuestLinesResponse = 0x2aa1, + UiMapQuestLinesResponse = 0x2aa2, UndeleteCharacterResponse = 0x27cd, UndeleteCooldownStatusResponse = 0x27ce, UnlearnedSpells = 0x2c4e, diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index 57b70c9a4..67392b0d5 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -739,7 +739,7 @@ namespace Game.DataStorage hotfixRecord.RecordID = recordId; hotfixRecord.HotfixID = id; hotfixRecord.HotfixStatus = status; - _hotfixData.Add(hotfixRecord); + _hotfixData.Add(id, hotfixRecord); deletedRecords[(tableHash, recordId)] = status == HotfixRecord.Status.RecordRemoved; ++count; @@ -776,7 +776,7 @@ namespace Game.DataStorage var storeItr = _storage.LookupByKey(tableHash); if (storeItr != null) { - Log.outError(LogFilter.Sql, $"Table hash 0x{tableHash:X} points to a loaded DB2 store {nameof(storeItr)}, fill related table instead of hotfix_blob"); + Log.outError(LogFilter.Sql, $"Table hash 0x{tableHash:X} points to a loaded DB2 store {storeItr.GetType().Name}, fill related table instead of hotfix_blob"); continue; } @@ -878,11 +878,11 @@ namespace Game.DataStorage public uint GetHotfixCount() { return (uint)_hotfixData.Count; } - public List GetHotfixData() { return _hotfixData; } + public MultiMap GetHotfixData() { return _hotfixData; } public byte[] GetHotfixBlobData(uint tableHash, int recordId, Locale locale) { - Cypher.Assert(SharedConst.IsValidLocale(locale), "Locale {locale} is invalid locale"); + Cypher.Assert(SharedConst.IsValidLocale(locale), $"Locale {locale} is invalid locale"); return _hotfixBlob[(int)locale].LookupByKey((tableHash, recordId)); } @@ -2288,7 +2288,7 @@ namespace Game.DataStorage delegate bool AllowedHotfixOptionalData(byte[] data); Dictionary _storage = new(); - List _hotfixData = new(); + MultiMap _hotfixData = new(); Dictionary<(uint tableHash, int recordId), byte[]>[] _hotfixBlob = new Dictionary<(uint tableHash, int recordId), byte[]>[(int)Locale.Total]; MultiMap> _allowedHotfixOptionalData = new(); MultiMap<(uint tableHash, int recordId), HotfixOptionalData>[]_hotfixOptionalData = new MultiMap<(uint tableHash, int recordId), HotfixOptionalData>[(int)Locale.Total]; diff --git a/Source/Game/Entities/Creature/Gossip.cs b/Source/Game/Entities/Creature/Gossip.cs index 7c98b4023..d1e989944 100644 --- a/Source/Game/Entities/Creature/Gossip.cs +++ b/Source/Game/Entities/Creature/Gossip.cs @@ -330,6 +330,7 @@ namespace Game.Misc packet.Pos = pointOfInterest.Pos; packet.Icon = pointOfInterest.Icon; packet.Importance = pointOfInterest.Importance; + packet.Unknown905 = pointOfInterest.Unknown905; _session.SendPacket(packet); } @@ -772,6 +773,7 @@ namespace Game.Misc public uint Flags; public uint Importance; public string Name; + public uint Unknown905; } public class PointOfInterestLocale diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index baf4d5ecb..73bffcd43 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -377,7 +377,7 @@ namespace Game.Entities public UpdateField MaxDurability = new(0, 12); public UpdateField CreatePlayedTime = new(0, 13); public UpdateField Context = new(0, 14); - public UpdateField CreateTime = new(0, 15); + public UpdateField CreateTime = new(0, 15); public UpdateField ArtifactXP = new(0, 16); public UpdateField ItemAppearanceModID = new(0, 17); public UpdateField Modifiers = new(0, 18); @@ -419,7 +419,7 @@ namespace Game.Entities } data.WriteUInt32(CreatePlayedTime); data.WriteInt32(Context); - data.WriteInt32(CreateTime); + data.WriteInt64(CreateTime); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) { data.WriteUInt64(ArtifactXP); @@ -566,7 +566,7 @@ namespace Game.Entities } if (changesMask[15]) { - data.WriteInt32(CreateTime); + data.WriteInt64(CreateTime); } if (changesMask[16]) { @@ -3015,15 +3015,15 @@ namespace Game.Entities public class PVPInfo : BaseUpdateData { - public UpdateField Field_0 = new(0, 1); - public UpdateField Field_4 = new(0, 2); - public UpdateField Field_8 = new(0, 3); - public UpdateField Field_C = new(0, 4); - public UpdateField Rating = new(0, 5); - public UpdateField Field_14 = new(0, 6); - public UpdateField Field_18 = new(0, 7); - public UpdateField PvpTierID = new(0, 8); - public UpdateField Field_20 = new(0, 9); + public UpdateField Field_20 = new(0, 1); + public UpdateField Field_0 = new(0, 2); + public UpdateField Field_4 = new(0, 3); + public UpdateField Field_8 = new(0, 4); + public UpdateField Field_C = new(0, 5); + public UpdateField Rating = new(0, 6); + public UpdateField Field_14 = new(0, 7); + public UpdateField Field_18 = new(0, 8); + public UpdateField PvpTierID = new(0, 9); public PVPInfo() : base(10) { } @@ -3037,7 +3037,7 @@ namespace Game.Entities data.WriteUInt32(Field_14); data.WriteUInt32(Field_18); data.WriteUInt32(PvpTierID); - data.WriteBits((uint)Field_20, 1); + data.WriteBit(Field_20); data.FlushBits(); } @@ -3049,44 +3049,47 @@ namespace Game.Entities data.WriteBits(changesMask.GetBlock(0), 10); - data.FlushBits(); if (changesMask[0]) { if (changesMask[1]) { - data.WriteUInt32(Field_0); + data.WriteBit(Field_20); } + } + data.FlushBits(); + if (changesMask[0]) + { if (changesMask[2]) { - data.WriteUInt32(Field_4); + data.WriteUInt32(Field_0); } if (changesMask[3]) { - data.WriteUInt32(Field_8); + data.WriteUInt32(Field_4); } if (changesMask[4]) { - data.WriteUInt32(Field_C); + data.WriteUInt32(Field_8); } if (changesMask[5]) { - data.WriteUInt32(Rating); + data.WriteUInt32(Field_C); } if (changesMask[6]) { - data.WriteUInt32(Field_14); + data.WriteUInt32(Rating); } if (changesMask[7]) { - data.WriteUInt32(Field_18); + data.WriteUInt32(Field_14); } if (changesMask[8]) { - data.WriteUInt32(PvpTierID); + data.WriteUInt32(Field_18); } if (changesMask[9]) { - data.WriteBits(Field_20, 1); + data.WriteUInt32(PvpTierID); } } data.FlushBits(); @@ -3094,6 +3097,7 @@ namespace Game.Entities public override void ClearChangesMask() { + ClearChangesMask(Field_20); ClearChangesMask(Field_0); ClearChangesMask(Field_4); ClearChangesMask(Field_8); @@ -3102,7 +3106,6 @@ namespace Game.Entities ClearChangesMask(Field_14); ClearChangesMask(Field_18); ClearChangesMask(PvpTierID); - ClearChangesMask(Field_20); _changesMask.ResetAll(); } } @@ -3495,37 +3498,38 @@ namespace Game.Entities public UpdateField GuildClubMemberID = new(98, 101); public UpdateField Honor = new(98, 102); public UpdateField HonorNextLevel = new(98, 103); - public UpdateField PvpRewardAchieved = new(98, 104); + public UpdateField PvpRewardAchieved = new(98, 104); public UpdateField PvpTierMaxFromWins = new(98, 105); - public UpdateField PvpLastWeeksRewardAchieved = new(98, 106); + public UpdateField PvpLastWeeksRewardAchieved = new(98, 106); public UpdateField PvpLastWeeksTierMaxFromWins = new(98, 107); - public UpdateField PvpLastWeeksRewardClaimed = new(98, 108); + public UpdateField PvpLastWeeksRewardClaimed = new(98, 108); public UpdateField NumBankSlots = new(98, 109); public UpdateField Field_1410 = new(98, 111); public UpdateField> QuestSession = new(98, 110); public UpdateField UiChromieTimeExpansionID = new(98, 112); public UpdateField TransportServerTime = new(98, 113); - public UpdateFieldArray InvSlots = new(199, 114, 115); - public UpdateFieldArray TrackResourceMask = new(2, 314, 315); - public UpdateFieldArray ExploredZones = new(192, 317, 318); - public UpdateFieldArray RestInfo = new(2, 510, 511); - public UpdateFieldArray ModDamageDonePos = new(7, 513, 514); - public UpdateFieldArray ModDamageDoneNeg = new(7, 513, 521); - public UpdateFieldArray ModDamageDonePercent = new(7, 513, 528); - public UpdateFieldArray ModHealingDonePercent = new(7, 513, 535); - public UpdateFieldArray WeaponDmgMultipliers = new(3, 542, 543); - public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 542, 546); - public UpdateFieldArray BuybackPrice = new(12, 549, 550); - public UpdateFieldArray BuybackTimestamp = new(12, 549, 562); - public UpdateFieldArray CombatRatings = new(32, 574, 575); - public UpdateFieldArray PvpInfo = new(6, 607, 608); - public UpdateFieldArray NoReagentCostMask = new(4, 614, 615); - public UpdateFieldArray ProfessionSkillLine = new(2, 619, 620); - public UpdateFieldArray BagSlotFlags = new(4, 622, 623); - public UpdateFieldArray BankBagSlotFlags = new(7, 627, 628); - public UpdateFieldArray QuestCompleted = new(875, 635, 636); + public UpdateField WeeklyRewardsPeriodSinceOrigin = new(98, 114); // week count since Cfg_RegionsEntry::ChallengeOrigin + public UpdateFieldArray InvSlots = new(199, 115, 116); + public UpdateFieldArray TrackResourceMask = new(2, 315, 316); + public UpdateFieldArray ExploredZones = new(192, 318, 319); + public UpdateFieldArray RestInfo = new(2, 511, 512); + public UpdateFieldArray ModDamageDonePos = new(7, 514, 515); + public UpdateFieldArray ModDamageDoneNeg = new(7, 514, 522); + public UpdateFieldArray ModDamageDonePercent = new(7, 514, 529); + public UpdateFieldArray ModHealingDonePercent = new(7, 514, 536); + public UpdateFieldArray WeaponDmgMultipliers = new(3, 543, 544); + public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 543, 547); + public UpdateFieldArray BuybackPrice = new(12, 550, 551); + public UpdateFieldArray BuybackTimestamp = new(12, 550, 563); + public UpdateFieldArray CombatRatings = new(32, 575, 576); + public UpdateFieldArray PvpInfo = new(6, 608, 609); + public UpdateFieldArray NoReagentCostMask = new(4, 615, 616); + public UpdateFieldArray ProfessionSkillLine = new(2, 620, 621); + public UpdateFieldArray BagSlotFlags = new(4, 623, 624); + public UpdateFieldArray BankBagSlotFlags = new(7, 628, 629); + public UpdateFieldArray QuestCompleted = new(875, 636, 637); - public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1511) { } + public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1512) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { @@ -3659,11 +3663,11 @@ namespace Game.Entities } data.WriteUInt32(Honor); data.WriteUInt32(HonorNextLevel); - data.WriteInt32(PvpRewardAchieved); + data.WriteInt64(PvpRewardAchieved); data.WriteInt32(PvpTierMaxFromWins); - data.WriteInt32(PvpLastWeeksRewardAchieved); + data.WriteInt64(PvpLastWeeksRewardAchieved); data.WriteInt32(PvpLastWeeksTierMaxFromWins); - data.WriteInt32(PvpLastWeeksRewardClaimed); + data.WriteInt64(PvpLastWeeksRewardClaimed); data.WriteUInt8(NumBankSlots); data.WriteInt32(ResearchSites.Size()); data.WriteInt32(ResearchSiteProgress.Size()); @@ -3696,6 +3700,7 @@ namespace Game.Entities data.WriteInt32(DisabledSpells.Size()); data.WriteInt32(UiChromieTimeExpansionID); data.WriteInt32(TransportServerTime); + data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); for (int i = 0; i < KnownTitles.Size(); ++i) { data.WriteUInt64(KnownTitles[i]); @@ -3975,6 +3980,7 @@ namespace Game.Entities } } } + data.FlushBits(); if (changesMask[0]) { if (changesMask[22]) @@ -4535,7 +4541,7 @@ namespace Game.Entities } if (changesMask[104]) { - data.WriteInt32(PvpRewardAchieved); + data.WriteInt64(PvpRewardAchieved); } if (changesMask[105]) { @@ -4543,7 +4549,7 @@ namespace Game.Entities } if (changesMask[106]) { - data.WriteInt32(PvpLastWeeksRewardAchieved); + data.WriteInt64(PvpLastWeeksRewardAchieved); } if (changesMask[107]) { @@ -4551,7 +4557,7 @@ namespace Game.Entities } if (changesMask[108]) { - data.WriteInt32(PvpLastWeeksRewardClaimed); + data.WriteInt64(PvpLastWeeksRewardClaimed); } if (changesMask[109]) { @@ -4565,6 +4571,10 @@ namespace Game.Entities { data.WriteInt32(TransportServerTime); } + if (changesMask[114]) + { + data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); + } } if (changesMask[98]) { @@ -4581,161 +4591,161 @@ namespace Game.Entities } } } - if (changesMask[114]) + if (changesMask[115]) { for (int i = 0; i < 199; ++i) { - if (changesMask[115 + i]) + if (changesMask[116 + i]) { data.WritePackedGuid(InvSlots[i]); } } } - if (changesMask[314]) + if (changesMask[315]) { for (int i = 0; i < 2; ++i) { - if (changesMask[315 + i]) + if (changesMask[316 + i]) { data.WriteUInt32(TrackResourceMask[i]); } } } - if (changesMask[317]) + if (changesMask[318]) { for (int i = 0; i < 192; ++i) { - if (changesMask[318 + i]) + if (changesMask[319 + i]) { data.WriteUInt64(ExploredZones[i]); } } } - if (changesMask[510]) + if (changesMask[511]) { for (int i = 0; i < 2; ++i) { - if (changesMask[511 + i]) + if (changesMask[512 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[513]) + if (changesMask[514]) { for (int i = 0; i < 7; ++i) { - if (changesMask[514 + i]) + if (changesMask[515 + i]) { data.WriteInt32(ModDamageDonePos[i]); } - if (changesMask[521 + i]) + if (changesMask[522 + i]) { data.WriteInt32(ModDamageDoneNeg[i]); } - if (changesMask[528 + i]) + if (changesMask[529 + i]) { data.WriteFloat(ModDamageDonePercent[i]); } - if (changesMask[535 + i]) + if (changesMask[536 + i]) { data.WriteFloat(ModHealingDonePercent[i]); } } } - if (changesMask[542]) + if (changesMask[543]) { for (int i = 0; i < 3; ++i) { - if (changesMask[543 + i]) + if (changesMask[544 + i]) { data.WriteFloat(WeaponDmgMultipliers[i]); } - if (changesMask[546 + i]) + if (changesMask[547 + i]) { data.WriteFloat(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[549]) + if (changesMask[550]) { for (int i = 0; i < 12; ++i) { - if (changesMask[550 + i]) + if (changesMask[551 + i]) { data.WriteUInt32(BuybackPrice[i]); } - if (changesMask[562 + i]) + if (changesMask[563 + i]) { data.WriteUInt32(BuybackTimestamp[i]); } } } - if (changesMask[574]) + if (changesMask[575]) { for (int i = 0; i < 32; ++i) { - if (changesMask[575 + i]) + if (changesMask[576 + i]) { data.WriteUInt32(CombatRatings[i]); } } } - if (changesMask[614]) + if (changesMask[615]) { for (int i = 0; i < 4; ++i) { - if (changesMask[615 + i]) + if (changesMask[616 + i]) { data.WriteUInt32(NoReagentCostMask[i]); } } } - if (changesMask[619]) + if (changesMask[620]) { for (int i = 0; i < 2; ++i) { - if (changesMask[620 + i]) + if (changesMask[621 + i]) { data.WriteUInt32(ProfessionSkillLine[i]); } } } - if (changesMask[622]) + if (changesMask[623]) { for (int i = 0; i < 4; ++i) { - if (changesMask[623 + i]) + if (changesMask[624 + i]) { data.WriteUInt32(BagSlotFlags[i]); } } } - if (changesMask[627]) + if (changesMask[628]) { for (int i = 0; i < 7; ++i) { - if (changesMask[628 + i]) + if (changesMask[629 + i]) { data.WriteUInt32(BankBagSlotFlags[i]); } } } - if (changesMask[635]) + if (changesMask[636]) { for (int i = 0; i < 875; ++i) { - if (changesMask[636 + i]) + if (changesMask[637 + i]) { data.WriteUInt64(QuestCompleted[i]); } } } - if (changesMask[607]) + if (changesMask[608]) { for (int i = 0; i < 6; ++i) { - if (changesMask[608 + i]) + if (changesMask[609 + i]) { PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -4855,6 +4865,7 @@ namespace Game.Entities ClearChangesMask(QuestSession); ClearChangesMask(UiChromieTimeExpansionID); ClearChangesMask(TransportServerTime); + ClearChangesMask(WeeklyRewardsPeriodSinceOrigin); ClearChangesMask(InvSlots); ClearChangesMask(TrackResourceMask); ClearChangesMask(ExploredZones); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index bfd3a7b77..76618018e 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -598,6 +598,7 @@ namespace Game.Entities //if (flags.SmoothPhasing) //{ // data.WriteBit(ReplaceActive); + // data.WriteBit(StopAnimKits); // data.WriteBit(HasReplaceObjectt); // data.FlushBits(); // if (HasReplaceObject) diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 87d61aad3..03f2fa109 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -195,6 +195,7 @@ namespace Game.Entities UpdateSplineMovement(diff); GetMotionMaster().UpdateMotion(diff); } + void _UpdateSpells(uint diff) { if (GetCurrentSpell(CurrentSpellTypes.AutoRepeat) != null) @@ -250,13 +251,20 @@ namespace Game.Entities _spellHistory.Update(); } - public void HandleEmoteCommand(Emote anim_id) + public void HandleEmoteCommand(Emote animId, uint[] spellVisualKitIds = null) { EmoteMessage packet = new(); packet.Guid = GetGUID(); - packet.EmoteID = (int)anim_id; + packet.EmoteID = (uint)animId; + + var emotesEntry = CliDB.EmotesStorage.LookupByKey(animId); + if (emotesEntry != null && spellVisualKitIds != null) + if (emotesEntry.AnimId == (uint)Anim.MountSpecial || emotesEntry.AnimId == (uint)Anim.MountSelfSpecial) + packet.SpellVisualKitIDs.AddRange(spellVisualKitIds); + SendMessageToSet(packet, true); } + public void SendDurabilityLoss(Player receiver, uint percent) { DurabilityDamageDeath packet = new(); diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 4145e9ab0..0a2b17237 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -717,8 +717,8 @@ namespace Game pointsOfInterestStorage.Clear(); // need for reload case - // 0 1 2 3 4 5 6 - SQLResult result = DB.World.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name FROM points_of_interest"); + // 0 1 2 3 4 5 6 7 + SQLResult result = DB.World.Query("SELECT ID, PositionX, PositionY, Icon, Flags, Importance, Name, Unknown905 FROM points_of_interest"); if (result.IsEmpty()) { @@ -738,10 +738,11 @@ namespace Game POI.Flags = result.Read(4); POI.Importance = result.Read(5); POI.Name = result.Read(6); + POI.Unknown905 = result.Read(7); if (!GridDefines.IsValidMapCoord(POI.Pos.X, POI.Pos.Y)) { - Log.outError(LogFilter.Sql, "Table `points_of_interest` (ID: {0}) have invalid coordinates (PositionX: {1} PositionY: {2}), ignored.", id, POI.Pos.X, POI.Pos.Y); + Log.outError(LogFilter.Sql, $"Table `points_of_interest` (ID: {id}) have invalid coordinates (PositionX: {POI.Pos.X} PositionY: {POI.Pos.Y}), ignored."); continue; } @@ -750,7 +751,7 @@ namespace Game ++count; } while (result.NextRow()); - Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Points of Interest definitions in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime)); + Log.outInfo(LogFilter.ServerLoading, $"Loaded {count} Points of Interest definitions in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); } public List GetGossipMenusMapBounds(uint uiMenuId) diff --git a/Source/Game/Handlers/ChatHandler.cs b/Source/Game/Handlers/ChatHandler.cs index c1afea4dd..eb8431d90 100644 --- a/Source/Game/Handlers/ChatHandler.cs +++ b/Source/Game/Handlers/ChatHandler.cs @@ -588,7 +588,7 @@ namespace Game // Only allow text-emotes for "dead" entities (feign death included) if (GetPlayer().HasUnitState(UnitState.Died)) break; - GetPlayer().HandleEmoteCommand(emoteAnim); + GetPlayer().HandleEmoteCommand(emoteAnim, packet.SpellVisualKitIDs); break; } diff --git a/Source/Game/Handlers/HotfixHandler.cs b/Source/Game/Handlers/HotfixHandler.cs index 1950f12cb..e762865a7 100644 --- a/Source/Game/Handlers/HotfixHandler.cs +++ b/Source/Game/Handlers/HotfixHandler.cs @@ -61,7 +61,7 @@ namespace Game void SendAvailableHotfixes() { - SendPacket(new AvailableHotfixes(Global.WorldMgr.GetRealmId().GetAddress(), Global.DB2Mgr.GetHotfixCount(), Global.DB2Mgr.GetHotfixData())); + SendPacket(new AvailableHotfixes(Global.WorldMgr.GetRealmId().GetAddress(), Global.DB2Mgr.GetHotfixData())); } [WorldPacketHandler(ClientOpcodes.HotfixRequest, Status = SessionStatus.Authed)] @@ -70,42 +70,48 @@ namespace Game var hotfixes = Global.DB2Mgr.GetHotfixData(); HotfixConnect hotfixQueryResponse = new(); - foreach (HotfixRecord hotfixRecord in hotfixQuery.Hotfixes) + foreach (var hotfixId in hotfixQuery.Hotfixes) { - var serverHotfixIndex = hotfixes.IndexOf(hotfixRecord); - if (serverHotfixIndex != -1) + var hotfixRecords = hotfixes.LookupByKey(hotfixId); + if (hotfixRecords != null) { - HotfixConnect.HotfixData hotfixData = new(); - hotfixData.Record = hotfixes[serverHotfixIndex]; - if (hotfixData.Record.HotfixStatus == HotfixRecord.Status.Valid) + foreach (var hotfixRecord in hotfixRecords) { - var storage = Global.DB2Mgr.GetStorage(hotfixRecord.TableHash); - if (storage != null && storage.HasRecord((uint)hotfixRecord.RecordID)) + HotfixConnect.HotfixData hotfixData = new HotfixConnect.HotfixData(); + hotfixData.Record = hotfixRecord; + if (hotfixRecord.HotfixStatus == HotfixRecord.Status.Valid) { - uint pos = hotfixQueryResponse.HotfixContent.GetSize(); - storage.WriteRecord((uint)hotfixRecord.RecordID, GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent); - - var optionalDataEntries = Global.DB2Mgr.GetHotfixOptionalData(hotfixRecord.TableHash, (uint)hotfixRecord.RecordID, GetSessionDbcLocale()); - foreach (HotfixOptionalData optionalData in optionalDataEntries) + var storage = Global.DB2Mgr.GetStorage(hotfixRecord.TableHash); + if (storage != null && storage.HasRecord((uint)hotfixRecord.RecordID)) { - hotfixQueryResponse.HotfixContent.WriteUInt32(optionalData.Key); - hotfixQueryResponse.HotfixContent.WriteBytes(optionalData.Data); + var pos = hotfixQueryResponse.HotfixContent.GetSize(); + storage.WriteRecord((uint)hotfixRecord.RecordID, GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent); + + var optionalDataEntries = Global.DB2Mgr.GetHotfixOptionalData(hotfixRecord.TableHash, (uint)hotfixRecord.RecordID, GetSessionDbcLocale()); + if (optionalDataEntries != null) + { + foreach (var optionalData in optionalDataEntries) + { + hotfixQueryResponse.HotfixContent.WriteUInt32(optionalData.Key); + hotfixQueryResponse.HotfixContent.WriteBytes(optionalData.Data); + } + } + + hotfixData.Size = hotfixQueryResponse.HotfixContent.GetSize() - pos; } - - hotfixData.Size = hotfixQueryResponse.HotfixContent.GetSize() - pos; - } - else - { - byte[] blobData = Global.DB2Mgr.GetHotfixBlobData(hotfixRecord.TableHash, hotfixRecord.RecordID, GetSessionDbcLocale()); - if (blobData != null) + else { - hotfixData.Size = (uint)blobData.Length; - hotfixQueryResponse.HotfixContent.WriteBytes(blobData); + var blobData = Global.DB2Mgr.GetHotfixBlobData(hotfixRecord.TableHash, hotfixRecord.RecordID, GetSessionDbcLocale()); + if (blobData != null) + { + hotfixData.Size = (uint)blobData.Length; + hotfixQueryResponse.HotfixContent.WriteBytes(blobData); + } } } + + hotfixQueryResponse.Hotfixes.Add(hotfixData); } - - hotfixQueryResponse.Hotfixes.Add(hotfixData); } } diff --git a/Source/Game/Handlers/MiscHandler.cs b/Source/Game/Handlers/MiscHandler.cs index e5ff0679e..a5976dc02 100644 --- a/Source/Game/Handlers/MiscHandler.cs +++ b/Source/Game/Handlers/MiscHandler.cs @@ -419,6 +419,7 @@ namespace Game { SpecialMountAnim specialMountAnim = new(); specialMountAnim.UnitGUID = _player.GetGUID(); + specialMountAnim.SpellVisualKitIDs.AddRange(mountSpecial.SpellVisualKitIDs); GetPlayer().SendMessageToSet(specialMountAnim, false); } diff --git a/Source/Game/Networking/Packets/AchievementPackets.cs b/Source/Game/Networking/Packets/AchievementPackets.cs index 2761d01f8..7ccaa6840 100644 --- a/Source/Game/Networking/Packets/AchievementPackets.cs +++ b/Source/Game/Networking/Packets/AchievementPackets.cs @@ -189,6 +189,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(progress.DateCreated); _worldPacket.WriteUInt32(progress.DateStarted); _worldPacket.WritePackedTime(progress.DateUpdated); + _worldPacket.WriteUInt32(0); // this is a hack. this is a packed time written as int64 (progress.DateUpdated) _worldPacket.WriteUInt64(progress.Quantity); _worldPacket.WritePackedGuid(progress.PlayerGUID); _worldPacket.WriteInt32(progress.Flags); diff --git a/Source/Game/Networking/Packets/ChatPackets.cs b/Source/Game/Networking/Packets/ChatPackets.cs index 1195a1d91..9587490e9 100644 --- a/Source/Game/Networking/Packets/ChatPackets.cs +++ b/Source/Game/Networking/Packets/ChatPackets.cs @@ -16,10 +16,11 @@ */ using Framework.Constants; +using Framework.Dynamic; using Game.Entities; using Game.Groups; using System; -using Framework.Dynamic; +using System.Collections.Generic; namespace Game.Networking.Packets { @@ -269,11 +270,16 @@ namespace Game.Networking.Packets public override void Write() { _worldPacket.WritePackedGuid(Guid); - _worldPacket.WriteInt32(EmoteID); + _worldPacket.WriteUInt32(EmoteID); + _worldPacket.WriteInt32(SpellVisualKitIDs.Count); + + foreach (var id in SpellVisualKitIDs) + _worldPacket.WriteUInt32(id); } public ObjectGuid Guid; - public int EmoteID; + public uint EmoteID; + public List SpellVisualKitIDs = new(); } public class CTextEmote : ClientPacket @@ -285,11 +291,16 @@ namespace Game.Networking.Packets Target = _worldPacket.ReadPackedGuid(); EmoteID = _worldPacket.ReadInt32(); SoundIndex = _worldPacket.ReadInt32(); + + SpellVisualKitIDs = new uint[_worldPacket.ReadUInt32()]; + for (var i = 0; i < SpellVisualKitIDs.Length; ++i) + SpellVisualKitIDs[i] = _worldPacket.ReadUInt32(); } public ObjectGuid Target; public int EmoteID; public int SoundIndex; + public uint[] SpellVisualKitIDs; } public class STextEmote : ServerPacket diff --git a/Source/Game/Networking/Packets/GameObjectPackets.cs b/Source/Game/Networking/Packets/GameObjectPackets.cs index 3109682eb..e362b196f 100644 --- a/Source/Game/Networking/Packets/GameObjectPackets.cs +++ b/Source/Game/Networking/Packets/GameObjectPackets.cs @@ -138,7 +138,7 @@ namespace Game.Networking.Packets class GameObjectUILink : ServerPacket { - public GameObjectUILink() : base(ServerOpcodes.GameObjectUILink, ConnectionType.Instance) { } + public GameObjectUILink() : base(ServerOpcodes.GameObjectUiLink, ConnectionType.Instance) { } public override void Write() { diff --git a/Source/Game/Networking/Packets/GarrisonPackets.cs b/Source/Game/Networking/Packets/GarrisonPackets.cs index f17554947..5254cc244 100644 --- a/Source/Game/Networking/Packets/GarrisonPackets.cs +++ b/Source/Game/Networking/Packets/GarrisonPackets.cs @@ -405,12 +405,12 @@ namespace Game.Networking.Packets public void Write(WorldPacket data) { data.WriteUInt64(DbID); - data.WriteUInt32(MissionRecID); data.WriteUInt32((uint)OfferTime); data.WriteUInt32(OfferDuration); data.WriteUInt32((uint)StartTime); data.WriteUInt32(TravelDuration); data.WriteUInt32(MissionDuration); + data.WriteUInt32(MissionRecID); data.WriteUInt32(MissionState); data.WriteUInt32(SuccessChance); data.WriteUInt32(Flags); @@ -462,8 +462,8 @@ namespace Game.Networking.Packets { public void Write(WorldPacket data) { - data.WriteUInt32(GarrMssnBonusAbilityID); data.WriteUInt32((uint)StartTime); + data.WriteUInt32(GarrMssnBonusAbilityID); } public uint GarrMssnBonusAbilityID; @@ -533,12 +533,12 @@ namespace Game.Networking.Packets struct GarrisonEventEntry { public int EntryID; - public int EventValue; + public long EventValue; public void Write(WorldPacket data) { + data.WriteInt64(EventValue); data.WriteInt32(EntryID); - data.WriteInt32(EventValue); } } @@ -578,6 +578,7 @@ namespace Game.Networking.Packets data.WriteInt32(ArchivedMissions.Count); data.WriteUInt32(NumFollowerActivationsRemaining); data.WriteUInt32(NumMissionsStartedToday); + data.WriteInt32(MinAutoTroopLevel); foreach (GarrisonPlotInfo plot in Plots) plot.Write(data); @@ -634,6 +635,7 @@ namespace Game.Networking.Packets public uint GarrSiteLevelID; public uint NumFollowerActivationsRemaining; public uint NumMissionsStartedToday; // might mean something else, but sending 0 here enables follower abilities "Increase success chance of the first mission of the day by %." + public int MinAutoTroopLevel; public List Plots = new(); public List Buildings = new(); public List Followers = new(); diff --git a/Source/Game/Networking/Packets/HotfixPackets.cs b/Source/Game/Networking/Packets/HotfixPackets.cs index e8a234a77..85220f4af 100644 --- a/Source/Game/Networking/Packets/HotfixPackets.cs +++ b/Source/Game/Networking/Packets/HotfixPackets.cs @@ -78,25 +78,24 @@ namespace Game.Networking.Packets class AvailableHotfixes : ServerPacket { - public AvailableHotfixes(uint virtualRealmAddress, uint hotfixCount, List hotfixes) : base(ServerOpcodes.AvailableHotfixes) + public AvailableHotfixes(uint virtualRealmAddress, MultiMap hotfixes) : base(ServerOpcodes.AvailableHotfixes) { VirtualRealmAddress = virtualRealmAddress; - HotfixCount = hotfixCount; Hotfixes = hotfixes; } public override void Write() { _worldPacket.WriteUInt32(VirtualRealmAddress); - _worldPacket.WriteUInt32(HotfixCount); + _worldPacket.WriteInt32(Hotfixes.Count); - foreach (HotfixRecord hotfixRecord in Hotfixes) - hotfixRecord.Write(_worldPacket); + foreach (var pair in Hotfixes) + _worldPacket.WriteInt32(pair.Key); } public uint VirtualRealmAddress; public uint HotfixCount; - public List Hotfixes; + public MultiMap Hotfixes; } class HotfixRequest : ClientPacket @@ -110,16 +109,12 @@ namespace Game.Networking.Packets uint hotfixCount = _worldPacket.ReadUInt32(); for (var i = 0; i < hotfixCount; ++i) - { - HotfixRecord hotfixRecord = new(); - hotfixRecord.Read(_worldPacket); - Hotfixes.Add(hotfixRecord); - } + Hotfixes.Add(_worldPacket.ReadInt32()); } public uint ClientBuild; public uint DataBuild; - public List Hotfixes = new(); + public List Hotfixes = new(); } class HotfixConnect : ServerPacket diff --git a/Source/Game/Networking/Packets/MiscPackets.cs b/Source/Game/Networking/Packets/MiscPackets.cs index 4b0415548..a8029e88f 100644 --- a/Source/Game/Networking/Packets/MiscPackets.cs +++ b/Source/Game/Networking/Packets/MiscPackets.cs @@ -1162,7 +1162,14 @@ namespace Game.Networking.Packets { public MountSpecial(WorldPacket packet) : base(packet) { } - public override void Read() { } + public override void Read() + { + SpellVisualKitIDs = new int[_worldPacket.ReadUInt32()]; + for (var i = 0; i < SpellVisualKitIDs.Length; ++i) + SpellVisualKitIDs[i] = _worldPacket.ReadInt32(); + } + + public int[] SpellVisualKitIDs; } class SpecialMountAnim : ServerPacket @@ -1172,9 +1179,13 @@ namespace Game.Networking.Packets public override void Write() { _worldPacket.WritePackedGuid(UnitGUID); + _worldPacket.WriteInt32(SpellVisualKitIDs.Count); + foreach (var id in SpellVisualKitIDs) + _worldPacket.WriteInt32(id); } public ObjectGuid UnitGUID; + public List SpellVisualKitIDs = new(); } class CrossedInebriationThreshold : ServerPacket diff --git a/Source/Game/Networking/Packets/NPCPackets.cs b/Source/Game/Networking/Packets/NPCPackets.cs index f985ff61d..c4b130689 100644 --- a/Source/Game/Networking/Packets/NPCPackets.cs +++ b/Source/Game/Networking/Packets/NPCPackets.cs @@ -209,6 +209,7 @@ namespace Game.Networking.Packets _worldPacket.WriteFloat(Pos.Y); _worldPacket.WriteUInt32(Icon); _worldPacket.WriteUInt32(Importance); + _worldPacket.WriteUInt32(Unknown905); _worldPacket.WriteBits(Flags, 14); _worldPacket.WriteBits(Name.GetByteCount(), 6); _worldPacket.FlushBits(); @@ -220,6 +221,7 @@ namespace Game.Networking.Packets public Vector2 Pos; public uint Icon; public uint Importance; + public uint Unknown905; public string Name; } diff --git a/Source/Game/Networking/Packets/TicketPackets.cs b/Source/Game/Networking/Packets/TicketPackets.cs index ddc47d9d5..f6672bf49 100644 --- a/Source/Game/Networking/Packets/TicketPackets.cs +++ b/Source/Game/Networking/Packets/TicketPackets.cs @@ -61,10 +61,10 @@ namespace Game.Networking.Packets foreach (var c in Cases) { _worldPacket.WriteInt32(c.CaseID); - _worldPacket.WriteInt32(c.CaseOpened); + _worldPacket.WriteUInt32(c.CaseOpened); _worldPacket.WriteInt32(c.CaseStatus); - _worldPacket.WriteInt16(c.CfgRealmID); - _worldPacket.WriteInt64(c.CharacterID); + _worldPacket.WriteUInt16(c.CfgRealmID); + _worldPacket.WriteUInt64(c.CharacterID); _worldPacket.WriteInt32(c.WaitTimeOverrideMinutes); _worldPacket.WriteBits(c.Url.GetByteCount(), 11); @@ -80,10 +80,10 @@ namespace Game.Networking.Packets public struct GMTicketCase { public int CaseID; - public int CaseOpened; + public uint CaseOpened; public int CaseStatus; - public short CfgRealmID; - public long CharacterID; + public ushort CfgRealmID; + public ulong CharacterID; public int WaitTimeOverrideMinutes; public string Url; public string WaitTimeOverrideMessage; diff --git a/Source/Game/Networking/Packets/TokenPackets.cs b/Source/Game/Networking/Packets/TokenPackets.cs index a5374303c..32df635c5 100644 --- a/Source/Game/Networking/Packets/TokenPackets.cs +++ b/Source/Game/Networking/Packets/TokenPackets.cs @@ -42,27 +42,27 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32((uint)Result); _worldPacket.WriteInt32(AuctionableTokenAuctionableList.Count); - foreach (AuctionableTokenAuctionable auctionableTokenAuctionable in AuctionableTokenAuctionableList) + foreach (AuctionableTokenInfo auctionableTokenAuctionable in AuctionableTokenAuctionableList) { _worldPacket.WriteUInt64(auctionableTokenAuctionable.UnkInt1); _worldPacket.WriteUInt32(auctionableTokenAuctionable.UnkInt2); - _worldPacket.WriteUInt32(auctionableTokenAuctionable.Owner); _worldPacket.WriteUInt64(auctionableTokenAuctionable.BuyoutPrice); - _worldPacket.WriteUInt32(auctionableTokenAuctionable.EndTime); + _worldPacket.WriteUInt32(auctionableTokenAuctionable.Owner); + _worldPacket.WriteUInt32(auctionableTokenAuctionable.DurationLeft); } } public uint UnkInt; // send CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST public TokenResult Result; - List AuctionableTokenAuctionableList =new(); + List AuctionableTokenAuctionableList = new(); - struct AuctionableTokenAuctionable + struct AuctionableTokenInfo { public ulong UnkInt1; public uint UnkInt2; public uint Owner; public ulong BuyoutPrice; - public uint EndTime; + public uint DurationLeft; } } diff --git a/sql/updates/world/master/2021_04_09_00_world.sql b/sql/updates/world/master/2021_04_09_00_world.sql new file mode 100644 index 000000000..64696de1a --- /dev/null +++ b/sql/updates/world/master/2021_04_09_00_world.sql @@ -0,0 +1 @@ +ALTER TABLE `points_of_interest` ADD `Unknown905` int(11) NOT NULL DEFAULT '0' AFTER `Name`;