From 4b669cfb5d024f67df1a9a5689829c715505728d Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 2 Feb 2024 21:49:02 -0500 Subject: [PATCH] Core: Update to 10.2.0 Port From (https://github.com/TrinityCore/TrinityCore/commit/1eea1d11b14d2ae065ab0f1888fba3b1ef03874f) --- .../Framework/Constants/AchievementConst.cs | 12 +- Source/Framework/Constants/CliDBConst.cs | 11 +- Source/Framework/Constants/CreatureConst.cs | 3 +- Source/Framework/Constants/GossipConst.cs | 4 +- Source/Framework/Constants/Network/Opcodes.cs | 1145 +++++++++-------- Source/Framework/Constants/PlayerConst.cs | 6 + Source/Framework/Constants/SharedConst.cs | 574 +++++---- .../Constants/Spells/SpellAuraConst.cs | 1 + .../Database/Databases/CharacterDatabase.cs | 41 +- .../Database/Databases/HotfixDatabase.cs | 24 +- Source/Game/Achievements/CriteriaHandler.cs | 40 +- Source/Game/DataStorage/CliDB.cs | 2 + Source/Game/DataStorage/Structs/A_Records.cs | 2 +- Source/Game/DataStorage/Structs/C_Records.cs | 3 + Source/Game/DataStorage/Structs/M_Records.cs | 2 +- Source/Game/DataStorage/Structs/P_Records.cs | 2 +- Source/Game/DataStorage/Structs/S_Records.cs | 8 +- Source/Game/DataStorage/Structs/U_Records.cs | 2 +- Source/Game/Entities/Conversation.cs | 5 +- .../Entities/Object/Update/UpdateField.cs | 63 +- .../Entities/Object/Update/UpdateFields.cs | 652 ++++++---- Source/Game/Entities/Object/WorldObject.cs | 9 + Source/Game/Entities/Player/Player.DB.cs | 27 +- Source/Game/Entities/Player/Player.Fields.cs | 1 - Source/Game/Entities/Player/Player.cs | 41 +- Source/Game/Entities/Unit/Unit.Fields.cs | 9 +- Source/Game/Entities/Unit/Unit.cs | 22 +- Source/Game/Guilds/Guild.cs | 11 +- Source/Game/Handlers/BattleGroundHandler.cs | 11 +- Source/Game/Handlers/CalendarHandler.cs | 7 +- Source/Game/Handlers/CharacterHandler.cs | 30 +- Source/Game/Handlers/NPCHandler.cs | 31 +- .../Networking/Packets/BattleGroundPackets.cs | 16 +- .../Networking/Packets/CalendarPackets.cs | 9 +- .../Networking/Packets/CharacterPackets.cs | 96 +- Source/Game/Networking/Packets/MiscPackets.cs | 11 +- .../Networking/Packets/MovementPackets.cs | 2 - Source/Game/Networking/Packets/NPCPackets.cs | 24 +- .../Game/Networking/Packets/PartyPackets.cs | 6 +- .../Game/Networking/Packets/QueryPackets.cs | 4 +- .../Networking/Packets/ReputationPackets.cs | 2 +- .../Game/Networking/Packets/SocialPackets.cs | 2 +- .../Game/Networking/Packets/SystemPackets.cs | 32 +- Source/Game/Networking/Packets/WhoPackets.cs | 4 + Source/Game/World/WorldManager.cs | 6 +- 45 files changed, 1742 insertions(+), 1273 deletions(-) diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index 0dd5e213b..9a08bdf53 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -447,6 +447,11 @@ namespace Framework.Constants PlayerHasCompletedQuestWithLabel = 372, /*NYI*/ // Player has previously completed quest with {QuestLabel} LegacyLootIsEnabled = 373, /*NYI*/ PlayerZPositionBelow = 374, + PlayerWeaponHighWatermarkAboveOrEqual = 375, /*NYI*/ + PlayerHeadHighWatermarkAboveOrEqual = 376, /*NYI*/ + PlayerHasDisplayedCurrencyLessThan = 377, /*NYI*/ // Player has {CurrencyTypes} less than {#Amount} (value visible in ui is taken into account, not raw value) + + PlayerIsOnMapWithExpansion = 380, // Player is on map that has {ExpansionID} } public enum CriteriaFailEvent : byte @@ -467,7 +472,7 @@ namespace Framework.Constants DailyQuestsCleared = 13, // Daily quests cleared SendEvent = 14, // Send event "{GameEvents}" (player-sent/instance only) - Max + Count } public enum CriteriaStartEvent : byte @@ -488,7 +493,7 @@ namespace Framework.Constants SendEvent = 13, // Send event "{GameEvents}" (player-sent/instance only) BeginScenarioStep = 14, // Begin scenario step "{#Step}" (for use with "Player on Scenario" modifier only) - Max + Count } public enum CriteriaFlags @@ -501,7 +506,7 @@ namespace Framework.Constants IsForQuest = 0x20 // Is For Quest } - public enum CriteriaType : byte + public enum CriteriaType : short { KillCreature = 0, // Kill NPC "{Creature}" WinBattleground = 1, // Win battleground "{Map}" @@ -745,6 +750,7 @@ namespace Framework.Constants PerksProgramMonthComplete = 249, /*NYI*/ CompleteTrackingQuest = 250, /*NYI*/ + GainLevels = 253, // Gain levels Count } diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index 54542ae23..eabe1eb96 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -1841,7 +1841,7 @@ namespace Framework.Constants Some = 8 } - public enum MountCapabilityFlags : byte + public enum MountCapabilityFlags : int { Ground = 0x1, Flying = 0x2, @@ -1850,7 +1850,7 @@ namespace Framework.Constants IgnoreRestrictions = 0x20 } - public enum MountFlags : ushort + public enum MountFlags : int { SelfMount = 0x02, // Player becomes the mount himself FactionSpecific = 0x04, @@ -1859,7 +1859,7 @@ namespace Framework.Constants HideIfUnknown = 0x40 } - public enum PhaseEntryFlags : ushort + public enum PhaseEntryFlags : int { ReadOnly = 0x1, InternalPhase = 0x2, @@ -1912,7 +1912,7 @@ namespace Framework.Constants Registrar = 11, Vendor = 12, PetitionVendor = 13, - TabardVendor = 14, + GuildTabardVendor = 14, TalentMaster = 15, SpecializationMaster = 16, MailInfo = 17, @@ -1962,7 +1962,8 @@ namespace Framework.Constants TraitSystem = 61, BarbersChoice = 62, JailersTowerBuffs = 63, - MajorFactionRenown = 64 + MajorFactionRenown = 64, + PersonalTabardVendor = 65 } [Flags] diff --git a/Source/Framework/Constants/CreatureConst.cs b/Source/Framework/Constants/CreatureConst.cs index 790321781..c70074438 100644 --- a/Source/Framework/Constants/CreatureConst.cs +++ b/Source/Framework/Constants/CreatureConst.cs @@ -225,7 +225,8 @@ namespace Framework.Constants ContributionCollector = 0x400, AzeriteRespec = 0x4000, IslandsQueue = 0x8000, - SuppressNpcSoundsExceptEndOfInteraction = 0x00010000, + SuppressNpcSoundsExceptEndOfInteraction = 0x10000, + PersonalTabardDesigner = 0x200000 } [Flags] diff --git a/Source/Framework/Constants/GossipConst.cs b/Source/Framework/Constants/GossipConst.cs index b69482b19..4bf2e17b9 100644 --- a/Source/Framework/Constants/GossipConst.cs +++ b/Source/Framework/Constants/GossipConst.cs @@ -40,7 +40,7 @@ namespace Framework.Constants Binder = 5, // Golden interaction wheel Banker = 6, // Brown bag (with gold coin in lower corner) PetitionVendor = 7, // White chat bubble (with "..." inside) - TabardVendor = 8, // White tabard + GuildTabardVendor = 8, // White tabard Battlemaster = 9, // Two crossed swords Auctioneer = 10, // Stack of gold coins TalentMaster = 11, // White chat bubble @@ -86,6 +86,8 @@ namespace Framework.Constants TraitSystem = 51, BarbersChoice = 52, MajorFactionRenown = 53, + PersonalTabardVendor = 54, + Max } diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index a81375abc..8ed18fe65 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -5,14 +5,14 @@ namespace Framework.Constants { public enum ClientOpcodes : uint { - AbandonNpeResponse = 0x33f1, + AbandonNpeResponse = 0x33f2, AcceptGuildInvite = 0x35fd, - AcceptReturningPlayerPrompt = 0x339c, + AcceptReturningPlayerPrompt = 0x339d, AcceptSocialContract = 0x3745, AcceptTrade = 0x315a, AcceptWargameInvite = 0x35e0, AccountNotificationAcknowledged = 0x3734, - ActivateSoulbind = 0x33e0, + ActivateSoulbind = 0x33e1, ActivateTaxi = 0x34b2, AddonList = 0x35d8, AddAccountCosmetic = 0x32b6, @@ -21,8 +21,8 @@ namespace Framework.Constants AddIgnore = 0x36d2, AddToy = 0x32b5, AdventureJournalOpenQuest = 0x3202, - AdventureJournalUpdateSuggestions = 0x33e3, - AdventureMapStartQuest = 0x336f, + AdventureJournalUpdateSuggestions = 0x33e4, + AdventureMapStartQuest = 0x3370, AlterAppearance = 0x3504, AreaSpiritHealerQuery = 0x34b7, AreaSpiritHealerQueue = 0x34b8, @@ -62,15 +62,15 @@ namespace Framework.Constants AutoGuildBankItem = 0x34be, AutoStoreBagItem = 0x399b, AutoStoreGuildBankItem = 0x34c7, - AzeriteEmpoweredItemSelectPower = 0x3398, - AzeriteEmpoweredItemViewed = 0x337a, - AzeriteEssenceActivateEssence = 0x339a, - AzeriteEssenceUnlockMilestone = 0x3399, + AzeriteEmpoweredItemSelectPower = 0x3399, + AzeriteEmpoweredItemViewed = 0x337b, + AzeriteEssenceActivateEssence = 0x339b, + AzeriteEssenceUnlockMilestone = 0x339a, BankerActivate = 0x34ba, BattlefieldLeave = 0x3172, BattlefieldList = 0x317d, BattlefieldPort = 0x3539, - BattlemasterHello = 0x32d2, + BattlemasterHello = 0x32d3, BattlemasterJoin = 0x3531, BattlemasterJoinArena = 0x3532, BattlemasterJoinBrawl = 0x3537, @@ -105,7 +105,7 @@ namespace Framework.Constants BlackMarketBidOnItem = 0x3541, BlackMarketOpen = 0x353f, BlackMarketRequestItems = 0x3540, - BonusRoll = 0x339b, + BonusRoll = 0x339c, BugReport = 0x3685, BusyTrade = 0x3158, BuyBackItem = 0x34ab, @@ -143,9 +143,9 @@ namespace Framework.Constants CanRedeemTokenForBalance = 0x3706, CastSpell = 0x32b9, ChallengeModeRequestLeaders = 0x308f, - ChangeBagSlotFlag = 0x3353, - ChangeBankBagSlotFlag = 0x3354, - ChangeMonumentAppearance = 0x3334, + ChangeBagSlotFlag = 0x3354, + ChangeBankBagSlotFlag = 0x3355, + ChangeMonumentAppearance = 0x3335, ChangeRealmTicket = 0x36f8, ChangeSubGroup = 0x364c, CharacterCheckUpgrade = 0x36c4, @@ -195,14 +195,14 @@ namespace Framework.Constants CheckCharacterNameAvailability = 0x3645, CheckIsAdventureMapPoiValid = 0x3258, ChoiceResponse = 0x32c1, - ChromieTimeSelectExpansion = 0x33df, - ClaimWeeklyReward = 0x33bb, - ClassTalentsDeleteConfig = 0x3418, + ChromieTimeSelectExpansion = 0x33e0, + ClaimWeeklyReward = 0x33bc, + ClassTalentsDeleteConfig = 0x341a, ClassTalentsNotifyEmptyConfig = 0x3212, - ClassTalentsNotifyValidationFailed = 0x341a, - ClassTalentsRenameConfig = 0x3417, - ClassTalentsRequestNewConfig = 0x3416, - ClassTalentsSetStarterBuildActive = 0x341b, + ClassTalentsNotifyValidationFailed = 0x341c, + ClassTalentsRenameConfig = 0x3419, + ClassTalentsRequestNewConfig = 0x3418, + ClassTalentsSetStarterBuildActive = 0x341d, ClassTalentsSetUsesSharedActionBars = 0x3211, ClearNewAppearance = 0x3129, ClearRaidMarker = 0x31a5, @@ -210,8 +210,8 @@ namespace Framework.Constants ClientPortGraveyard = 0x353b, CloseInteraction = 0x3499, CloseQuestChoice = 0x32c2, - CloseRuneforgeInteraction = 0x33e7, - CloseTraitSystemInteraction = 0x341c, + CloseRuneforgeInteraction = 0x33e8, + CloseTraitSystemInteraction = 0x341e, ClubFinderApplicationResponse = 0x371d, ClubFinderGetApplicantsList = 0x371b, ClubFinderPost = 0x3718, @@ -246,33 +246,33 @@ namespace Framework.Constants ConsumableTokenCanVeteranBuy = 0x36e6, ConsumableTokenRedeem = 0x36ea, ConsumableTokenRedeemConfirmation = 0x36eb, - ContentTrackingStartTracking = 0x342c, - ContentTrackingStopTracking = 0x342d, - ContributionContribute = 0x356d, - ContributionLastUpdateRequest = 0x356e, + ContentTrackingStartTracking = 0x342e, + ContentTrackingStopTracking = 0x342f, + ContributionContribute = 0x356e, + ContributionLastUpdateRequest = 0x356f, ConversationCinematicReady = 0x355b, ConversationLineStarted = 0x355a, ConvertRaid = 0x364e, - CovenantRenownRequestCatchupState = 0x3581, - CraftingOrderCancel = 0x358c, - CraftingOrderClaim = 0x3589, - CraftingOrderCreate = 0x3586, - CraftingOrderFulfill = 0x358b, - CraftingOrderListCrafterOrders = 0x3588, - CraftingOrderListMyOrders = 0x3587, - CraftingOrderReject = 0x358d, - CraftingOrderRelease = 0x358a, - CraftingOrderReportPlayer = 0x358e, - CraftingOrderUpdateIgnoreList = 0x358f, + CovenantRenownRequestCatchupState = 0x3582, + CraftingOrderCancel = 0x358d, + CraftingOrderClaim = 0x358a, + CraftingOrderCreate = 0x3587, + CraftingOrderFulfill = 0x358c, + CraftingOrderListCrafterOrders = 0x3589, + CraftingOrderListMyOrders = 0x3588, + CraftingOrderReject = 0x358e, + CraftingOrderRelease = 0x358b, + CraftingOrderReportPlayer = 0x358f, + CraftingOrderUpdateIgnoreList = 0x3590, CreateCharacter = 0x3644, - CreateShipment = 0x331f, + CreateShipment = 0x3320, DbQueryBulk = 0x35e4, DeclineGuildInvites = 0x352e, DeclinePetition = 0x3548, DeleteEquipmentSet = 0x351a, DelFriend = 0x36cf, DelIgnore = 0x36d3, - DepositReagentBank = 0x335d, + DepositReagentBank = 0x335e, DestroyItem = 0x32af, DfBootPlayerVote = 0x3617, DfConfirmExpandSearch = 0x3609, @@ -303,51 +303,51 @@ namespace Framework.Constants GameEventDebugEnable = 0x31b0, GameObjReportUse = 0x34fe, GameObjUse = 0x34fd, - GarrisonAddFollowerHealth = 0x331a, - GarrisonAssignFollowerToBuilding = 0x3300, - GarrisonCancelConstruction = 0x32ed, - GarrisonCheckUpgradeable = 0x334f, - GarrisonCompleteMission = 0x3341, - GarrisonFullyHealAllFollowers = 0x331b, - GarrisonGenerateRecruits = 0x3303, - GarrisonGetClassSpecCategoryInfo = 0x3312, - GarrisonGetMapData = 0x3319, - GarrisonGetMissionReward = 0x3373, - GarrisonLearnTalent = 0x330e, - GarrisonMissionBonusRoll = 0x3343, - GarrisonPurchaseBuilding = 0x32e9, - GarrisonRecruitFollower = 0x3305, - GarrisonRemoveFollower = 0x3338, - GarrisonRemoveFollowerFromBuilding = 0x3301, - GarrisonRenameFollower = 0x3302, - GarrisonRequestBlueprintAndSpecializationData = 0x32e8, - GarrisonRequestShipmentInfo = 0x331d, - GarrisonResearchTalent = 0x3306, - GarrisonSetBuildingActive = 0x32ea, - GarrisonSetFollowerFavorite = 0x32fe, - GarrisonSetFollowerInactive = 0x32f6, - GarrisonSetRecruitmentPreferences = 0x3304, - GarrisonSocketTalent = 0x33f4, - GarrisonStartMission = 0x3340, - GarrisonSwapBuildings = 0x32ee, + GarrisonAddFollowerHealth = 0x331b, + GarrisonAssignFollowerToBuilding = 0x3301, + GarrisonCancelConstruction = 0x32ee, + GarrisonCheckUpgradeable = 0x3350, + GarrisonCompleteMission = 0x3342, + GarrisonFullyHealAllFollowers = 0x331c, + GarrisonGenerateRecruits = 0x3304, + GarrisonGetClassSpecCategoryInfo = 0x3313, + GarrisonGetMapData = 0x331a, + GarrisonGetMissionReward = 0x3374, + GarrisonLearnTalent = 0x330f, + GarrisonMissionBonusRoll = 0x3344, + GarrisonPurchaseBuilding = 0x32ea, + GarrisonRecruitFollower = 0x3306, + GarrisonRemoveFollower = 0x3339, + GarrisonRemoveFollowerFromBuilding = 0x3302, + GarrisonRenameFollower = 0x3303, + GarrisonRequestBlueprintAndSpecializationData = 0x32e9, + GarrisonRequestShipmentInfo = 0x331e, + GarrisonResearchTalent = 0x3307, + GarrisonSetBuildingActive = 0x32eb, + GarrisonSetFollowerFavorite = 0x32ff, + GarrisonSetFollowerInactive = 0x32f7, + GarrisonSetRecruitmentPreferences = 0x3305, + GarrisonSocketTalent = 0x33f5, + GarrisonStartMission = 0x3341, + GarrisonSwapBuildings = 0x32ef, GenerateRandomCharacterName = 0x35e7, GetAccountCharacterList = 0x36b4, GetAccountNotifications = 0x3733, - GetGarrisonInfo = 0x32e3, + GetGarrisonInfo = 0x32e4, GetItemPurchaseData = 0x3543, - GetLandingPageShipments = 0x331e, + GetLandingPageShipments = 0x331f, GetMirrorImageData = 0x32b3, GetPvpOptionsEnabled = 0x35ee, GetRafAccountInfo = 0x3721, GetRemainingGameTime = 0x36e9, - GetTrophyList = 0x3331, + GetTrophyList = 0x3332, GetUndeleteCharacterCooldownStatus = 0x36dd, GetVasAccountCharacterList = 0x36ee, GetVasTransferTargetRealmList = 0x36ef, GmTicketAcknowledgeSurvey = 0x3690, GmTicketGetCaseStatus = 0x368f, GmTicketGetSystemStatus = 0x368e, - GossipRefreshOptions = 0x3580, + GossipRefreshOptions = 0x3581, GossipSelectOption = 0x349a, GuildAddBattlenetFriend = 0x308d, GuildAddRank = 0x3065, @@ -400,16 +400,16 @@ namespace Framework.Constants InitiateTrade = 0x3156, Inspect = 0x353d, InstanceLockResponse = 0x351b, - IslandQueue = 0x33b7, + IslandQueue = 0x33b8, ItemPurchaseRefund = 0x3544, - ItemTextQuery = 0x3350, + ItemTextQuery = 0x3351, JoinPetBattleQueue = 0x31dd, JoinRatedBattleground = 0x3178, KeepAlive = 0x367f, KeyboundOverride = 0x322f, LatencyReport = 0x3771, - LearnPvpTalents = 0x356c, - LearnTalents = 0x356a, + LearnPvpTalents = 0x356d, + LearnTalents = 0x356b, LeaveGroup = 0x3649, LeavePetBattleQueue = 0x31de, LfgListApplyToGroup = 0x360e, @@ -418,17 +418,17 @@ namespace Framework.Constants LfgListGetStatus = 0x360c, LfgListInviteApplicant = 0x3611, LfgListInviteResponse = 0x3612, - LfgListJoin = 0x3396, + LfgListJoin = 0x3397, LfgListLeave = 0x360b, LfgListSearch = 0x360d, - LfgListUpdateRequest = 0x3397, + LfgListUpdateRequest = 0x3398, ListInventory = 0x34a7, LiveRegionAccountRestore = 0x36b7, LiveRegionCharacterCopy = 0x36b6, LiveRegionGetAccountCharacterList = 0x36b5, LiveRegionKeyBindingsCopy = 0x36b8, LoadingScreenNotify = 0x35f8, - LoadSelectedTrophy = 0x3332, + LoadSelectedTrophy = 0x3333, LogoutCancel = 0x34e7, LogoutInstant = 0x34e8, LogoutRequest = 0x34e5, @@ -552,12 +552,12 @@ namespace Framework.Constants NextCinematicCamera = 0x3558, ObjectUpdateFailed = 0x317f, ObjectUpdateRescued = 0x3180, - OfferPetition = 0x33de, + OfferPetition = 0x33df, OpeningCinematic = 0x3557, - OpenItem = 0x3351, - OpenMissionNpc = 0x3314, - OpenShipmentNpc = 0x331c, - OpenTradeskillNpc = 0x3327, + OpenItem = 0x3352, + OpenMissionNpc = 0x3315, + OpenShipmentNpc = 0x331d, + OpenTradeskillNpc = 0x3328, OptOutOfLoot = 0x3505, OverrideScreenFlash = 0x352f, PartyInvite = 0x3603, @@ -565,10 +565,10 @@ namespace Framework.Constants PartyUninvite = 0x3647, PerformItemInteraction = 0x323b, PerksProgramRequestPendingRewards = 0x3135, - PerksProgramRequestPurchase = 0x3407, - PerksProgramRequestRefund = 0x3408, - PerksProgramSetFrozenVendorItem = 0x3409, - PerksProgramStatusRequest = 0x3406, + PerksProgramRequestPurchase = 0x3409, + PerksProgramRequestRefund = 0x340a, + PerksProgramSetFrozenVendorItem = 0x340b, + PerksProgramStatusRequest = 0x3408, PetitionBuy = 0x34d0, PetitionRenameGuild = 0x36c7, PetitionShowList = 0x34cf, @@ -618,7 +618,7 @@ namespace Framework.Constants QueryRealmName = 0x3689, QueryScenarioPoi = 0x3656, QueryTime = 0x34e4, - QueryTreasurePicker = 0x3376, + QueryTreasurePicker = 0x3377, QueryVoidStorage = 0x31a1, QuestConfirmAccept = 0x34a4, QuestGiverAcceptQuest = 0x349e, @@ -630,12 +630,12 @@ namespace Framework.Constants QuestGiverRequestReward = 0x34a1, QuestGiverStatusMultipleQuery = 0x34a3, QuestGiverStatusQuery = 0x34a2, - QuestGiverStatusTrackedQuery = 0x3591, + QuestGiverStatusTrackedQuery = 0x3592, QuestLogRemoveQuest = 0x3542, QuestPoiQuery = 0x36ae, QuestPushResult = 0x34a6, - QuestSessionBeginResponse = 0x33cf, - QuestSessionRequestStart = 0x33ce, + QuestSessionBeginResponse = 0x33d0, + QuestSessionRequestStart = 0x33cf, QuestSessionRequestStop = 0x372c, QueuedMessagesEnd = 0x376c, QuickJoinAutoAcceptRequests = 0x3704, @@ -649,34 +649,34 @@ namespace Framework.Constants RafUpdateRecruitmentInfo = 0x3723, RandomRoll = 0x3654, ReadyCheckResponse = 0x3635, - ReadItem = 0x3352, + ReadItem = 0x3353, ReclaimCorpse = 0x34ea, - RemoveNewItem = 0x3379, + RemoveNewItem = 0x337a, RemoveRafRecruit = 0x3725, ReorderCharacters = 0x35e9, RepairItem = 0x34fb, - ReplaceTrophy = 0x3333, + ReplaceTrophy = 0x3334, RepopRequest = 0x353a, ReportClientVariables = 0x36fe, ReportEnabledAddons = 0x36fd, ReportFrozenWhileLoadingMap = 0x36a6, ReportKeybindingExecutionCounts = 0x36ff, ReportPvpPlayerAfk = 0x3503, - ReportServerLag = 0x33c7, - ReportStuckInCombat = 0x33c8, + ReportServerLag = 0x33c8, + ReportStuckInCombat = 0x33c9, RequestAccountData = 0x3694, - RequestAreaPoiUpdate = 0x3378, + RequestAreaPoiUpdate = 0x3379, RequestBattlefieldStatus = 0x35dc, RequestCemeteryList = 0x3176, RequestCharacterGuildFollowInfo = 0x368b, - RequestConquestFormulaConstants = 0x32d5, - RequestCovenantCallings = 0x33b9, + RequestConquestFormulaConstants = 0x32d6, + RequestCovenantCallings = 0x33ba, RequestCrowdControlSpell = 0x353e, RequestForcedReactions = 0x320c, - RequestGarrisonTalentWorldQuestUnlocks = 0x33f3, + RequestGarrisonTalentWorldQuestUnlocks = 0x33f4, RequestGuildPartyState = 0x31a7, RequestGuildRewardsList = 0x31a6, - RequestLatestSplashScreen = 0x33c9, + RequestLatestSplashScreen = 0x33ca, RequestLfgListBlacklist = 0x32c4, RequestMythicPlusAffixes = 0x3206, RequestMythicPlusSeasonData = 0x3207, @@ -694,19 +694,20 @@ namespace Framework.Constants RequestVehicleNextSeat = 0x324a, RequestVehiclePrevSeat = 0x3249, RequestVehicleSwitchSeat = 0x324b, - RequestWeeklyRewards = 0x33bc, - RequestWorldQuestUpdate = 0x3377, + RequestWeeklyRewards = 0x33bd, + RequestWorldQuestUpdate = 0x3378, ResetChallengeMode = 0x3204, ResetChallengeModeCheat = 0x3205, ResetInstances = 0x3668, ResurrectResponse = 0x3683, - RevertMonumentAppearance = 0x3335, + RevertMonumentAppearance = 0x3336, RideVehicleInteract = 0x324c, RpeResetCharacter = 0x374f, SaveAccountDataExport = 0x3749, SaveCufProfiles = 0x318a, SaveEquipmentSet = 0x3519, SaveGuildEmblem = 0x32c8, + SavePersonalEmblem = 0x32c9, ScenePlaybackCanceled = 0x322c, ScenePlaybackComplete = 0x322b, SceneTriggerEvent = 0x322d, @@ -716,19 +717,19 @@ namespace Framework.Constants SendCharacterClubInvitation = 0x36f7, SendContactList = 0x36cd, SendMail = 0x35fa, - SendPingUnit = 0x342f, - SendPingWorldPoint = 0x3430, + SendPingUnit = 0x3432, + SendPingWorldPoint = 0x3433, SendTextEmote = 0x348e, ServerTimeOffsetRequest = 0x369b, SetAchievementsHidden = 0x3232, SetActionBarToggles = 0x3546, SetActionButton = 0x3636, SetActiveMover = 0x3a3c, - SetAdvancedCombatLogging = 0x32d6, + SetAdvancedCombatLogging = 0x32d7, SetAssistantLeader = 0x364f, - SetBackpackAutosortDisabled = 0x3355, - SetBackpackSellJunkDisabled = 0x3356, - SetBankAutosortDisabled = 0x3357, + SetBackpackAutosortDisabled = 0x3356, + SetBackpackSellJunkDisabled = 0x3357, + SetBankAutosortDisabled = 0x3358, SetContactNotes = 0x36d0, SetCurrencyFlags = 0x3168, SetDifficultyId = 0x322e, @@ -740,7 +741,7 @@ namespace Framework.Constants SetFactionInactive = 0x34ef, SetFactionNotAtWar = 0x34ee, SetGameEventDebugViewState = 0x31b8, - SetInsertItemsLeftToRight = 0x3359, + SetInsertItemsLeftToRight = 0x335a, SetLootMethod = 0x3648, SetLootSpecialization = 0x3553, SetPartyAssignment = 0x3651, @@ -748,30 +749,30 @@ namespace Framework.Constants SetPetSlot = 0x3167, SetPlayerDeclinedNames = 0x3688, SetPreferredCemetery = 0x3177, - SetPvp = 0x32cc, + SetPvp = 0x32cd, SetRaidDifficulty = 0x36d9, SetRestrictPingsToAssistants = 0x361a, SetRole = 0x35d9, SetSavedInstanceExtend = 0x3686, SetSelection = 0x353c, SetSheathed = 0x348f, - SetSortBagsRightToLeft = 0x3358, + SetSortBagsRightToLeft = 0x3359, SetTaxiBenchmarkMode = 0x3502, SetTitle = 0x3299, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x3316, - SetWarMode = 0x32cd, + SetUsingPartyGarrison = 0x3317, + SetWarMode = 0x32ce, SetWatchedFaction = 0x34f0, ShowTradeSkill = 0x36c0, SignPetition = 0x3547, SilencePartyTalker = 0x3652, SocialContractRequest = 0x3744, SocketGems = 0x34fa, - SortBags = 0x335a, - SortBankBags = 0x335b, - SortReagentBankBags = 0x335c, + SortBags = 0x335b, + SortBankBags = 0x335c, + SortReagentBankBags = 0x335d, SpawnTrackingUpdate = 0x32ae, SpellClick = 0x349b, SpellEmpowerRelease = 0x3280, @@ -787,7 +788,7 @@ namespace Framework.Constants StartWarGame = 0x35de, StoreGuildBankItem = 0x34bf, SubmitUserFeedback = 0x3693, - SubscriptionInterstitialResponse = 0x33e8, + SubscriptionInterstitialResponse = 0x33e9, SummonResponse = 0x366a, SupportTicketSubmitComplaint = 0x3646, SurrenderArena = 0x3173, @@ -799,7 +800,7 @@ namespace Framework.Constants SwapItemWithGuildBankItem = 0x34c0, SwapSubGroups = 0x364d, SwapVoidItem = 0x31a3, - TabardVendorActivate = 0x32c9, + TabardVendorActivate = 0x32ca, TalkToGossip = 0x3498, TaxiNodeStatusQuery = 0x34af, TaxiQueryAvailableNodes = 0x34b1, @@ -809,18 +810,18 @@ namespace Framework.Constants TimeSyncResponseDropped = 0x3a3f, TimeSyncResponseFailed = 0x3a3e, ToggleDifficulty = 0x3657, - TogglePvp = 0x32cb, + TogglePvp = 0x32cc, TotemDestroyed = 0x3507, ToyClearFanfare = 0x3128, - TradeSkillSetFavorite = 0x3375, + TradeSkillSetFavorite = 0x3376, TrainerBuySpell = 0x34b5, TrainerList = 0x34b4, - TraitsCommitConfig = 0x3410, - TraitsTalentTestUnlearnSpells = 0x340e, + TraitsCommitConfig = 0x3412, + TraitsTalentTestUnlearnSpells = 0x3410, TransmogrifyItems = 0x3196, TurnInPetition = 0x3549, Tutorial = 0x36da, - UiMapQuestLinesRequest = 0x33b8, + UiMapQuestLinesRequest = 0x33b9, UnacceptTrade = 0x315b, UndeleteCharacter = 0x36dc, UnlearnSkill = 0x34f4, @@ -830,13 +831,13 @@ namespace Framework.Constants UpdateAccountData = 0x3695, UpdateAreaTriggerVisual = 0x32bb, UpdateClientSettings = 0x3664, - UpdateCraftingNpcRecipes = 0x3328, + UpdateCraftingNpcRecipes = 0x3329, UpdateMissileTrajectory = 0x3a43, UpdateRaidTarget = 0x3650, UpdateSpellVisual = 0x32ba, UpdateVasPurchaseStates = 0x36f1, - UpgradeGarrison = 0x32de, - UpgradeRuneforgeLegendary = 0x33e6, + UpgradeGarrison = 0x32df, + UpgradeRuneforgeLegendary = 0x33e7, UsedFollow = 0x3185, UseCritterItem = 0x3252, UseEquipmentSet = 0x3995, @@ -865,32 +866,32 @@ namespace Framework.Constants AbortNewWorld = 0x2597, AccountCosmeticAdded = 0x2876, AccountCriteriaUpdate = 0x285c, - AccountDataTimes = 0x2704, - AccountExportResponse = 0x28b3, + AccountDataTimes = 0x2705, + AccountExportResponse = 0x28b2, AccountMountRemoved = 0x25ae, AccountMountUpdate = 0x25ad, AccountNotificationsResponse = 0x2875, AccountToyUpdate = 0x25af, AccountTransmogSetFavoritesUpdate = 0x25b3, AccountTransmogUpdate = 0x25b2, - AchievementDeleted = 0x26e2, - AchievementEarned = 0x263f, + AchievementDeleted = 0x26e3, + AchievementEarned = 0x2640, ActivateEssenceFailed = 0x3015, ActivateSoulbindFailed = 0x3017, - ActivateTaxiReply = 0x2679, - ActiveGlyphs = 0x2c54, - ActiveScheduledWorldStateInfo = 0x2740, - AddonListRequest = 0x263e, - AddBattlenetFriendResponse = 0x2639, + ActivateTaxiReply = 0x267a, + ActiveGlyphs = 0x2c56, + ActiveScheduledWorldStateInfo = 0x2741, + AddonListRequest = 0x263f, + AddBattlenetFriendResponse = 0x263a, AddItemPassive = 0x25a9, - AddLossOfControl = 0x266d, - AddRunePower = 0x26b3, + AddLossOfControl = 0x266e, + AddRunePower = 0x26b4, AdjustSplineDuration = 0x25cf, AdvancedCombatLog = 0x2872, AdventureJournalDataResponse = 0x286c, - AeLootTargets = 0x2614, - AeLootTargetAck = 0x2615, - AiReaction = 0x26b0, + AeLootTargets = 0x2615, + AeLootTargetAck = 0x2616, + AiReaction = 0x26b1, AlliedRaceDetails = 0x27f0, AllAccountCriteria = 0x2571, AllAchievementData = 0x2570, @@ -898,21 +899,21 @@ namespace Framework.Constants ApplyMountEquipmentResult = 0x2849, ArchaeologySurveryCast = 0x2586, AreaPoiUpdateResponse = 0x3010, - AreaSpiritHealerTime = 0x2739, + AreaSpiritHealerTime = 0x273a, AreaTriggerDenied = 0x2903, AreaTriggerForceSetPositionAndFacing = 0x2900, - AreaTriggerNoCorpse = 0x2710, + AreaTriggerNoCorpse = 0x2711, AreaTriggerPlaySpellVisual = 0x28fe, AreaTriggerRePath = 0x28fd, AreaTriggerReShape = 0x2902, AreaTriggerUnattach = 0x2901, AreaTriggerUpdateDecalProperties = 0x28ff, - ArenaClearOpponents = 0x2645, - ArenaCrowdControlSpellResult = 0x262e, - ArenaPrepOpponentSpecializations = 0x2644, - ArtifactEndgamePowersRefunded = 0x279b, - ArtifactForgeError = 0x2799, - ArtifactRespecPrompt = 0x279a, + ArenaClearOpponents = 0x2646, + ArenaCrowdControlSpellResult = 0x262f, + ArenaPrepOpponentSpecializations = 0x2645, + ArtifactEndgamePowersRefunded = 0x279c, + ArtifactForgeError = 0x279a, + ArtifactRespecPrompt = 0x279b, ArtifactXpGain = 0x27e3, AttackerStateUpdate = 0x294e, AttackStart = 0x2939, @@ -922,29 +923,29 @@ namespace Framework.Constants AuctionableTokenAuctionSold = 0x27cc, AuctionableTokenSellAtMarketPriceResponse = 0x27cb, AuctionableTokenSellConfirmRequired = 0x27ca, - AuctionClosedNotification = 0x26ed, - AuctionCommandResult = 0x26ea, - AuctionDisableNewPostings = 0x2893, + AuctionClosedNotification = 0x26ee, + AuctionCommandResult = 0x26eb, + AuctionDisableNewPostings = 0x2892, AuctionFavoriteList = 0x2863, AuctionGetCommodityQuoteResult = 0x285a, - AuctionHelloResponse = 0x26e8, + AuctionHelloResponse = 0x26e9, AuctionListBiddedItemsResult = 0x2859, AuctionListBucketsResult = 0x2856, AuctionListItemsResult = 0x2857, AuctionListOwnedItemsResult = 0x2858, - AuctionOutbidNotification = 0x26ec, - AuctionOwnerBidNotification = 0x26ee, - AuctionReplicateResponse = 0x26e9, - AuctionWonNotification = 0x26eb, - AuraPointsDepleted = 0x2c20, - AuraUpdate = 0x2c1f, + AuctionOutbidNotification = 0x26ed, + AuctionOwnerBidNotification = 0x26ef, + AuctionReplicateResponse = 0x26ea, + AuctionWonNotification = 0x26ec, + AuraPointsDepleted = 0x2c22, + AuraUpdate = 0x2c21, AuthChallenge = 0x3048, AuthFailed = 0x256c, AuthResponse = 0x256d, AvailableHotfixes = 0x290f, - BackpackDefaultSizeChanged = 0x2898, + BackpackDefaultSizeChanged = 0x2897, BagCleanupFinished = 0x2da7, - BarberShopResult = 0x26b8, + BarberShopResult = 0x26b9, BatchPresenceSubscription = 0x283a, BattlefieldList = 0x2927, BattlefieldPortDenied = 0x292d, @@ -961,33 +962,33 @@ namespace Framework.Constants BattlegroundPlayerLeft = 0x292c, BattlegroundPlayerPositions = 0x2928, BattlegroundPoints = 0x294a, - BattlenetChallengeAbort = 0x2783, - BattlenetChallengeStart = 0x2782, + BattlenetChallengeAbort = 0x2784, + BattlenetChallengeStart = 0x2783, BattlenetNotification = 0x27fc, BattlenetResponse = 0x27fb, BattleNetConnectionStatus = 0x27fd, - BattlePayAckFailed = 0x277d, - BattlePayBattlePetDelivered = 0x2772, - BattlePayCollectionItemDelivered = 0x2773, - BattlePayConfirmPurchase = 0x277c, - BattlePayDeliveryEnded = 0x2770, - BattlePayDeliveryStarted = 0x276f, + BattlePayAckFailed = 0x277e, + BattlePayBattlePetDelivered = 0x2773, + BattlePayCollectionItemDelivered = 0x2774, + BattlePayConfirmPurchase = 0x277d, + BattlePayDeliveryEnded = 0x2771, + BattlePayDeliveryStarted = 0x2770, BattlePayDistributionAssignVasResponse = 0x287b, - BattlePayDistributionUnrevoked = 0x276d, - BattlePayDistributionUpdate = 0x276e, - BattlePayGetDistributionListResponse = 0x276c, - BattlePayGetProductListResponse = 0x276a, - BattlePayGetPurchaseListResponse = 0x276b, - BattlePayMountDelivered = 0x2771, - BattlePayPurchaseUpdate = 0x277b, + BattlePayDistributionUnrevoked = 0x276e, + BattlePayDistributionUpdate = 0x276f, + BattlePayGetDistributionListResponse = 0x276d, + BattlePayGetProductListResponse = 0x276b, + BattlePayGetPurchaseListResponse = 0x276c, + BattlePayMountDelivered = 0x2772, + BattlePayPurchaseUpdate = 0x277c, BattlePayStartCheckout = 0x2818, - BattlePayStartDistributionAssignToTargetResponse = 0x2779, - BattlePayStartPurchaseResponse = 0x2778, + BattlePayStartDistributionAssignToTargetResponse = 0x277a, + BattlePayStartPurchaseResponse = 0x2779, BattlePayValidatePurchaseResponse = 0x280c, BattlePetsHealed = 0x25f1, - BattlePetCageDateError = 0x2674, + BattlePetCageDateError = 0x2675, BattlePetDeleted = 0x25ee, - BattlePetError = 0x2634, + BattlePetError = 0x2635, BattlePetJournal = 0x25ed, BattlePetJournalLockAcquired = 0x25eb, BattlePetJournalLockDenied = 0x25ec, @@ -996,56 +997,56 @@ namespace Framework.Constants BattlePetTrapLevel = 0x25e9, BattlePetUpdates = 0x25e8, BindPointUpdate = 0x257d, - BlackMarketBidOnItemResult = 0x2624, - BlackMarketOutbid = 0x2625, - BlackMarketRequestItemsResult = 0x2623, - BlackMarketWon = 0x2626, - BonusRollEmpty = 0x2641, + BlackMarketBidOnItemResult = 0x2625, + BlackMarketOutbid = 0x2626, + BlackMarketRequestItemsResult = 0x2624, + BlackMarketWon = 0x2627, + BonusRollEmpty = 0x2642, BossKill = 0x294d, BreakTarget = 0x2938, BroadcastAchievement = 0x2bbc, BroadcastSummonCast = 0x283c, BroadcastSummonResponse = 0x283d, - BuyFailed = 0x26c1, - BuySucceeded = 0x26c0, + BuyFailed = 0x26c2, + BuySucceeded = 0x26c1, CacheInfo = 0x291d, CacheVersion = 0x291c, - CalendarClearPendingAction = 0x2699, - CalendarCommandResult = 0x269a, - CalendarCommunityInvite = 0x2689, - CalendarEventRemovedAlert = 0x2691, - CalendarEventUpdatedAlert = 0x2692, - CalendarInviteAdded = 0x268a, - CalendarInviteAlert = 0x268e, - CalendarInviteNotes = 0x2693, - CalendarInviteNotesAlert = 0x2694, - CalendarInviteRemoved = 0x268b, - CalendarInviteRemovedAlert = 0x2690, - CalendarInviteStatus = 0x268c, - CalendarInviteStatusAlert = 0x268f, - CalendarModeratorStatus = 0x268d, - CalendarRaidLockoutAdded = 0x2695, - CalendarRaidLockoutRemoved = 0x2696, - CalendarRaidLockoutUpdated = 0x2697, - CalendarSendCalendar = 0x2687, - CalendarSendEvent = 0x2688, - CalendarSendNumPending = 0x2698, - CameraEffect = 0x271f, - CancelAutoRepeat = 0x26d8, + CalendarClearPendingAction = 0x269a, + CalendarCommandResult = 0x269b, + CalendarCommunityInvite = 0x268a, + CalendarEventRemovedAlert = 0x2692, + CalendarEventUpdatedAlert = 0x2693, + CalendarInviteAdded = 0x268b, + CalendarInviteAlert = 0x268f, + CalendarInviteNotes = 0x2694, + CalendarInviteNotesAlert = 0x2695, + CalendarInviteRemoved = 0x268c, + CalendarInviteRemovedAlert = 0x2691, + CalendarInviteStatus = 0x268d, + CalendarInviteStatusAlert = 0x2690, + CalendarModeratorStatus = 0x268e, + CalendarRaidLockoutAdded = 0x2696, + CalendarRaidLockoutRemoved = 0x2697, + CalendarRaidLockoutUpdated = 0x2698, + CalendarSendCalendar = 0x2688, + CalendarSendEvent = 0x2689, + CalendarSendNumPending = 0x2699, + CameraEffect = 0x2720, + CancelAutoRepeat = 0x26d9, CancelCombat = 0x2947, - CancelOrphanSpellVisual = 0x2c46, + CancelOrphanSpellVisual = 0x2c48, CancelPingPin = 0x25a2, CancelPreloadWorld = 0x2595, - CancelScene = 0x2633, - CancelSpellVisual = 0x2c44, - CancelSpellVisualKit = 0x2c48, + CancelScene = 0x2634, + CancelSpellVisual = 0x2c46, + CancelSpellVisualKit = 0x2c4a, CanDuelResult = 0x2943, CanRedeemTokenForBalanceResponse = 0x280b, CapturePointRemoved = 0x292a, - CastFailed = 0x2c57, + CastFailed = 0x2c59, ChainMissileBounce = 0x25c7, ChallengeModeComplete = 0x2608, - ChallengeModeRequestLeadersResult = 0x260c, + ChallengeModeRequestLeadersResult = 0x260d, ChallengeModeReset = 0x2607, ChallengeModeStart = 0x2605, ChallengeModeUpdateDeathCount = 0x2606, @@ -1055,17 +1056,17 @@ namespace Framework.Constants ChannelNotify = 0x2bc1, ChannelNotifyJoined = 0x2bc2, ChannelNotifyLeft = 0x2bc3, - CharacterCheckUpgradeResult = 0x27b6, - CharacterLoginFailed = 0x26ff, - CharacterObjectTestResponse = 0x2781, - CharacterRenameResult = 0x275c, - CharacterUpgradeAborted = 0x27b5, - CharacterUpgradeComplete = 0x27b4, - CharacterUpgradeManualUnrevokeResult = 0x27b7, - CharacterUpgradeStarted = 0x27b3, - CharCustomizeFailure = 0x26dc, - CharCustomizeSuccess = 0x26dd, - CharFactionChangeResult = 0x27a0, + CharacterCheckUpgradeResult = 0x27b7, + CharacterLoginFailed = 0x2700, + CharacterObjectTestResponse = 0x2782, + CharacterRenameResult = 0x275d, + CharacterUpgradeAborted = 0x27b6, + CharacterUpgradeComplete = 0x27b5, + CharacterUpgradeManualUnrevokeResult = 0x27b8, + CharacterUpgradeStarted = 0x27b4, + CharCustomizeFailure = 0x26dd, + CharCustomizeSuccess = 0x26de, + CharFactionChangeResult = 0x27a1, Chat = 0x2bad, ChatAutoResponded = 0x2bb8, ChatCanLocalWhisperTargetResponse = 0x2bcb, @@ -1085,94 +1086,94 @@ namespace Framework.Constants CheckWargameEntry = 0x258f, ChromieTimeSelectExpansionSuccess = 0x2866, ClaimRafRewardResponse = 0x284d, - ClearAllSpellCharges = 0x2c24, + ClearAllSpellCharges = 0x2c26, ClearBossEmotes = 0x25ba, - ClearCooldown = 0x26b5, - ClearCooldowns = 0x2c23, + ClearCooldown = 0x26b6, + ClearCooldowns = 0x2c25, ClearResurrect = 0x257f, - ClearSpellCharges = 0x2c25, + ClearSpellCharges = 0x2c27, ClearTarget = 0x2944, ClearTreasurePickerCache = 0x2aa1, - CloseArtifactForge = 0x2798, + CloseArtifactForge = 0x2799, ClubFinderErrorMessage = 0x2845, ClubFinderGetClubPostingIdsResponse = 0x2848, ClubFinderLookupClubPostingsList = 0x2846, ClubFinderResponseCharacterApplicationList = 0x2843, ClubFinderResponsePostRecruitmentMessage = 0x2847, ClubFinderUpdateApplications = 0x2844, - ClubFinderWhisperApplicantResponse = 0x288a, - CoinRemoved = 0x2613, + ClubFinderWhisperApplicantResponse = 0x2889, + CoinRemoved = 0x2614, CombatEventFailed = 0x293b, - CommentatorMapInfo = 0x2701, - CommentatorPlayerInfo = 0x2702, - CommentatorStateChanged = 0x2700, + CommentatorMapInfo = 0x2702, + CommentatorPlayerInfo = 0x2703, + CommentatorStateChanged = 0x2701, CommerceTokenGetCountResponse = 0x27c7, CommerceTokenGetLogResponse = 0x27d3, CommerceTokenGetMarketPriceResponse = 0x27c9, CommerceTokenUpdate = 0x27c8, - ComplaintResult = 0x26a7, - CompleteShipmentResponse = 0x2791, + ComplaintResult = 0x26a8, + CompleteShipmentResponse = 0x2792, ConfirmPartyInvite = 0x280a, ConnectTo = 0x304d, - ConquestFormulaConstants = 0x277e, - ConsoleWrite = 0x2631, + ConquestFormulaConstants = 0x277f, + ConsoleWrite = 0x2632, ConsumableTokenBuyAtMarketPriceResponse = 0x27cf, ConsumableTokenBuyChoiceRequired = 0x27ce, ConsumableTokenCanVeteranBuyResponse = 0x27cd, ConsumableTokenRedeemConfirmRequired = 0x27d1, ConsumableTokenRedeemResponse = 0x27d2, - ContactList = 0x277f, + ContactList = 0x2780, ContributionLastUpdateResponse = 0x2811, - ControlUpdate = 0x2643, + ControlUpdate = 0x2644, ConvertItemsToCurrencyValue = 0x286f, - CooldownCheat = 0x2732, - CooldownEvent = 0x26b4, - CorpseLocation = 0x264b, - CorpseReclaimDelay = 0x2743, - CorpseTransportQuery = 0x270c, + CooldownCheat = 0x2733, + CooldownEvent = 0x26b5, + CorpseLocation = 0x264c, + CorpseReclaimDelay = 0x2744, + CorpseTransportQuery = 0x270d, CovenantCallingsAvailabilityResponse = 0x2aa3, CovenantPreviewOpenNpc = 0x27f3, CovenantRenownSendCatchupState = 0x2870, - CraftingHouseHelloResponse = 0x28a6, - CraftingOrderCancelResult = 0x28a2, - CraftingOrderClaimResult = 0x289e, - CraftingOrderCraftResult = 0x28a0, - CraftingOrderCreateResult = 0x289c, - CraftingOrderFulfillResult = 0x28a1, - CraftingOrderListOrdersResponse = 0x289d, - CraftingOrderRejectResult = 0x28a4, - CraftingOrderReleaseResult = 0x289f, - CraftingOrderUpdateState = 0x28a7, - CraftEnchantResult = 0x28a5, - CreateChar = 0x26fb, - CreateShipmentResponse = 0x2790, - CreatorVisualsOverride = 0x28aa, - CriteriaDeleted = 0x26e1, - CriteriaUpdate = 0x26db, - CrossedInebriationThreshold = 0x26bc, + CraftingHouseHelloResponse = 0x28a5, + CraftingOrderCancelResult = 0x28a1, + CraftingOrderClaimResult = 0x289d, + CraftingOrderCraftResult = 0x289f, + CraftingOrderCreateResult = 0x289b, + CraftingOrderFulfillResult = 0x28a0, + CraftingOrderListOrdersResponse = 0x289c, + CraftingOrderRejectResult = 0x28a3, + CraftingOrderReleaseResult = 0x289e, + CraftingOrderUpdateState = 0x28a6, + CraftEnchantResult = 0x28a4, + CreateChar = 0x26fc, + CreateShipmentResponse = 0x2791, + CreatorVisualsOverride = 0x28a9, + CriteriaDeleted = 0x26e2, + CriteriaUpdate = 0x26dc, + CrossedInebriationThreshold = 0x26bd, CustomLoadScreen = 0x25ca, DailyQuestsReset = 0x2a80, - DamageCalcLog = 0x2c63, + DamageCalcLog = 0x2c65, DbReply = 0x290e, - DeathReleaseLoc = 0x26ce, - DebugMenuManagerFullUpdate = 0x2651, + DeathReleaseLoc = 0x26cf, + DebugMenuManagerFullUpdate = 0x2652, DefenseMessage = 0x2bb6, - DeleteChar = 0x26fc, + DeleteChar = 0x26fd, DeleteExpiredMissionsResult = 0x2980, - DestroyArenaUnit = 0x273b, - DestructibleBuildingDamage = 0x26f3, + DestroyArenaUnit = 0x273c, + DestructibleBuildingDamage = 0x26f4, DifferentInstanceFromParty = 0x2589, DisenchantCredit = 0x25a6, DismountResult = 0x257c, - DispelFailed = 0x2c2d, + DispelFailed = 0x2c2f, DisplayGameError = 0x259c, DisplayPlayerChoice = 0x2ffc, - DisplayPromotion = 0x2648, + DisplayPromotion = 0x2649, DisplayQuestPopup = 0x2a9e, DisplaySoulbindUpdateMessage = 0x2874, - DisplayToast = 0x2620, + DisplayToast = 0x2621, DisplayWorldText = 0x27e4, - DisplayWorldTextOnTarget = 0x2c62, + DisplayWorldTextOnTarget = 0x2c64, DontAutoPushSpellsToActionBar = 0x25df, DropNewConnection = 0x304c, DuelArranged = 0x293d, @@ -1182,51 +1183,52 @@ namespace Framework.Constants DuelOutOfBounds = 0x293e, DuelRequested = 0x293c, DuelWinner = 0x2942, - DurabilityDamageDeath = 0x273e, - Emote = 0x27bd, - EnableBarberShop = 0x26b7, - EnchantmentLog = 0x270d, - EncounterEnd = 0x2777, - EncounterStart = 0x2776, - EndLightningStorm = 0x26a4, - EnsureWorldLoaded = 0x2884, + DurabilityDamageDeath = 0x273f, + Emote = 0x27be, + EnableBarberShop = 0x26b8, + EnchantmentLog = 0x270e, + EncounterEnd = 0x2778, + EncounterStart = 0x2777, + EndLightningStorm = 0x26a5, + EnsureWorldLoaded = 0x2883, EnterEncryptedMode = 0x3049, EnumCharactersResult = 0x2583, EnumVasPurchaseStatesResponse = 0x27e9, EnvironmentalDamageLog = 0x2c1e, - EquipmentSetId = 0x26ad, + EquipmentSetId = 0x26ae, ExpectedSpamRecords = 0x2bb1, - ExplorationExperience = 0x2758, + ExplorationExperience = 0x2759, ExternalTransactionIdGenerated = 0x286d, - FactionBonusInfo = 0x271e, + FactionBonusInfo = 0x271f, FailedPlayerCondition = 0x2ffa, FailedQuestTurnIn = 0x2807, FeatureSystemStatus = 0x25be, FeatureSystemStatusGlueScreen = 0x25bf, - FeignDeathResisted = 0x273d, - FishEscaped = 0x26cb, - FishNotHooked = 0x26ca, + FeignDeathResisted = 0x273e, + FishEscaped = 0x26cc, + FishNotHooked = 0x26cb, FlightSplineSync = 0x2e2b, - ForcedDeathUpdate = 0x26cf, - ForceAnim = 0x274a, - ForceAnimations = 0x274b, - ForceObjectRelink = 0x2647, + FlushCombatLogFile = 0x2c20, + ForcedDeathUpdate = 0x26d0, + ForceAnim = 0x274b, + ForceAnimations = 0x274c, + ForceObjectRelink = 0x2648, ForceRandomTransmogToast = 0x25b1, - FriendStatus = 0x2780, + FriendStatus = 0x2781, GainMawPower = 0x27d8, GameObjectActivateAnimKit = 0x25c2, GameObjectBase = 0x281e, - GameObjectCloseInteraction = 0x2888, + GameObjectCloseInteraction = 0x2887, GameObjectCustomAnim = 0x25c3, GameObjectDespawn = 0x25c4, - GameObjectInteraction = 0x2887, - GameObjectPlaySpellVisual = 0x2c4b, - GameObjectPlaySpellVisualKit = 0x2c4a, - GameObjectResetState = 0x2718, + GameObjectInteraction = 0x2886, + GameObjectPlaySpellVisual = 0x2c4d, + GameObjectPlaySpellVisualKit = 0x2c4c, + GameObjectResetState = 0x2719, GameObjectSetStateLocal = 0x27fa, - GameSpeedSet = 0x267d, - GameTimeSet = 0x2706, - GameTimeUpdate = 0x2705, + GameSpeedSet = 0x267e, + GameTimeSet = 0x2707, + GameTimeUpdate = 0x2706, GarrisonActivateMissionBonusAbility = 0x2982, GarrisonAddEvent = 0x29a6, GarrisonAddFollowerResult = 0x2974, @@ -1299,35 +1301,35 @@ namespace Framework.Constants GarrisonUseRecallPortalResult = 0x297d, GenerateRandomCharacterNameResult = 0x2585, GenerateSsoTokenResponse = 0x2812, - GetAccountCharacterListResult = 0x275a, + GetAccountCharacterListResult = 0x275b, GetGarrisonInfoResult = 0x295e, - GetLandingPageShipmentsResponse = 0x2793, - GetRealmHiddenResult = 0x28b8, + GetLandingPageShipmentsResponse = 0x2794, + GetRealmHiddenResult = 0x28b7, GetRemainingGameTimeResponse = 0x27d0, - GetSelectedTrophyIdResponse = 0x27bb, - GetShipmentsOfTypeResponse = 0x2792, - GetShipmentInfoResponse = 0x278e, - GetTrophyListResponse = 0x27ba, + GetSelectedTrophyIdResponse = 0x27bc, + GetShipmentsOfTypeResponse = 0x2793, + GetShipmentInfoResponse = 0x278f, + GetTrophyListResponse = 0x27bb, GetVasAccountCharacterListResult = 0x27e5, GetVasTransferTargetRealmListResult = 0x27e6, GmPlayerInfo = 0x3005, GmRequestPlayerInfo = 0x2ffb, - GmTicketCaseStatus = 0x269f, - GmTicketSystemStatus = 0x269e, - GodMode = 0x26f6, + GmTicketCaseStatus = 0x26a0, + GmTicketSystemStatus = 0x269f, + GodMode = 0x26f7, GossipComplete = 0x2a97, GossipMessage = 0x2a98, GossipOptionNpcInteraction = 0x2aa7, - GossipPoi = 0x278b, + GossipPoi = 0x278c, GossipQuestUpdate = 0x2a99, GossipRefreshOptions = 0x2aa6, GroupActionThrottled = 0x258d, - GroupAutoKick = 0x2788, - GroupDecline = 0x2784, - GroupDestroyed = 0x2787, - GroupNewLeader = 0x2629, - GroupRequestDecline = 0x2785, - GroupUninvite = 0x2786, + GroupAutoKick = 0x2789, + GroupDecline = 0x2785, + GroupDestroyed = 0x2788, + GroupNewLeader = 0x262a, + GroupRequestDecline = 0x2786, + GroupUninvite = 0x2787, GuildAchievementDeleted = 0x29c5, GuildAchievementEarned = 0x29c4, GuildAchievementMembers = 0x29c7, @@ -1381,59 +1383,59 @@ namespace Framework.Constants GuildRoster = 0x29bb, GuildRosterUpdate = 0x29bc, GuildSendRankChange = 0x29b9, - HealthUpdate = 0x26cc, - HighestThreatUpdate = 0x26d4, + HealthUpdate = 0x26cd, + HighestThreatUpdate = 0x26d5, HotfixConnect = 0x2911, HotfixMessage = 0x2910, - InitializeFactions = 0x271d, + InitializeFactions = 0x271e, InitialSetup = 0x2580, - InitWorldStates = 0x273f, - InspectResult = 0x262d, - InstanceEncounterChangePriority = 0x27a6, - InstanceEncounterDisengageUnit = 0x27a5, - InstanceEncounterEnd = 0x27ae, - InstanceEncounterEngageUnit = 0x27a4, - InstanceEncounterGainCombatResurrectionCharge = 0x27b0, - InstanceEncounterInCombatResurrection = 0x27af, - InstanceEncounterObjectiveComplete = 0x27a9, - InstanceEncounterObjectiveStart = 0x27a8, - InstanceEncounterObjectiveUpdate = 0x27ad, - InstanceEncounterPhaseShiftChanged = 0x27b1, - InstanceEncounterStart = 0x27aa, - InstanceEncounterTimerStart = 0x27a7, - InstanceEncounterUpdateAllowReleaseInProgress = 0x27ac, - InstanceEncounterUpdateSuppressRelease = 0x27ab, - InstanceGroupSizeChanged = 0x26f4, - InstanceInfo = 0x2630, - InstanceReset = 0x2682, - InstanceResetFailed = 0x2683, - InstanceSaveCreated = 0x2775, - InterruptPowerRegen = 0x2c59, + InitWorldStates = 0x2740, + InspectResult = 0x262e, + InstanceEncounterChangePriority = 0x27a7, + InstanceEncounterDisengageUnit = 0x27a6, + InstanceEncounterEnd = 0x27af, + InstanceEncounterEngageUnit = 0x27a5, + InstanceEncounterGainCombatResurrectionCharge = 0x27b1, + InstanceEncounterInCombatResurrection = 0x27b0, + InstanceEncounterObjectiveComplete = 0x27aa, + InstanceEncounterObjectiveStart = 0x27a9, + InstanceEncounterObjectiveUpdate = 0x27ae, + InstanceEncounterPhaseShiftChanged = 0x27b2, + InstanceEncounterStart = 0x27ab, + InstanceEncounterTimerStart = 0x27a8, + InstanceEncounterUpdateAllowReleaseInProgress = 0x27ad, + InstanceEncounterUpdateSuppressRelease = 0x27ac, + InstanceGroupSizeChanged = 0x26f5, + InstanceInfo = 0x2631, + InstanceReset = 0x2683, + InstanceResetFailed = 0x2684, + InstanceSaveCreated = 0x2776, + InterruptPowerRegen = 0x2c5b, InvalidatePageText = 0x2918, InvalidatePlayer = 0x2fff, - InvalidPromotionCode = 0x274c, + InvalidPromotionCode = 0x274d, InventoryChangeFailure = 0x2da5, InventoryFixupComplete = 0x2809, InventoryFullOverflow = 0x281a, - IslandAzeriteGain = 0x2755, - IslandComplete = 0x2756, + IslandAzeriteGain = 0x2756, + IslandComplete = 0x2757, IsQuestCompleteResponse = 0x2a84, - ItemChanged = 0x26e5, - ItemCooldown = 0x27bc, - ItemEnchantTimeUpdate = 0x274e, + ItemChanged = 0x26e6, + ItemCooldown = 0x27bd, + ItemEnchantTimeUpdate = 0x274f, ItemExpirePurchaseRefund = 0x259b, ItemInteractionComplete = 0x2865, ItemPurchaseRefundResult = 0x2599, - ItemPushResult = 0x261f, - ItemTimeUpdate = 0x274d, - KickReason = 0x2685, + ItemPushResult = 0x2620, + ItemTimeUpdate = 0x274e, + KickReason = 0x2686, LatencyReportPing = 0x2877, - LearnedSpells = 0x2c4d, + LearnedSpells = 0x2c4f, LearnPvpTalentFailed = 0x25d3, LearnTalentFailed = 0x25d2, LegacyLootRules = 0x281f, LevelLinkingResult = 0x284b, - LevelUpInfo = 0x26e3, + LevelUpInfo = 0x26e4, LfgBootPlayer = 0x2a35, LfgDisabled = 0x2a33, LfgExpandSearchPrompt = 0x2a3b, @@ -1461,46 +1463,45 @@ namespace Framework.Constants LfgSlotInvalid = 0x2a30, LfgTeleportDenied = 0x2a32, LfgUpdateStatus = 0x2a24, - LiveRegionAccountRestoreResult = 0x2767, - LiveRegionCharacterCopyResult = 0x2766, - LiveRegionGetAccountCharacterListResult = 0x275b, - LiveRegionKeyBindingsCopyResult = 0x2768, + LiveRegionAccountRestoreResult = 0x2768, + LiveRegionCharacterCopyResult = 0x2767, + LiveRegionGetAccountCharacterListResult = 0x275c, + LiveRegionKeyBindingsCopyResult = 0x2769, LoadCufProfiles = 0x25bb, - LoadEquipmentSet = 0x2708, - LobbyMatchmakerPartyInfo = 0x288c, - LobbyMatchmakerPartyInviteRejected = 0x288d, - LobbyMatchmakerReceiveInvite = 0x288e, - LoginSetTimeSpeed = 0x2707, + LoadEquipmentSet = 0x2709, + LobbyMatchmakerPartyInfo = 0x288b, + LobbyMatchmakerPartyInviteRejected = 0x288c, + LobbyMatchmakerReceiveInvite = 0x288d, + LoginSetTimeSpeed = 0x2708, LoginVerifyWorld = 0x2596, - LogoutCancelAck = 0x2681, - LogoutComplete = 0x2680, - LogoutResponse = 0x267f, - LogXpGain = 0x26df, - LootAllPassed = 0x261d, - LootList = 0x273a, - LootMoneyNotify = 0x2618, - LootRelease = 0x2617, - LootReleaseAll = 0x2616, - LootRemoved = 0x2612, - LootResponse = 0x2611, - LootRoll = 0x261a, - LootRollsComplete = 0x261c, - LootRollWon = 0x261e, - LossOfControlAuraUpdate = 0x266c, - MailCommandResult = 0x2637, - MailListResult = 0x274f, - MailQueryNextTimeResult = 0x2750, + LogoutCancelAck = 0x2682, + LogoutComplete = 0x2681, + LogoutResponse = 0x2680, + LogXpGain = 0x26e0, + LootAllPassed = 0x261e, + LootList = 0x273b, + LootMoneyNotify = 0x2619, + LootRelease = 0x2618, + LootReleaseAll = 0x2617, + LootRemoved = 0x2613, + LootResponse = 0x2612, + LootRoll = 0x261b, + LootRollsComplete = 0x261d, + LootRollWon = 0x261f, + LossOfControlAuraUpdate = 0x266d, + MailCommandResult = 0x2638, + MailListResult = 0x2750, + MailQueryNextTimeResult = 0x2751, MapObjectivesInit = 0x294c, MapObjEvents = 0x25c5, - MasterLootCandidateList = 0x261b, - MeetingStoneFailed = 0x288f, + MasterLootCandidateList = 0x261c, + MeetingStoneFailed = 0x288e, MessageBox = 0x2576, - MinimapPing = 0x26c9, + MinimapPing = 0x26ca, MirrorImageComponentedData = 0x2c14, MirrorImageCreatureData = 0x2c13, MissileCancel = 0x25c6, - ModifyCooldown = 0x275d, - Motd = 0x2baf, + ModifyCooldown = 0x275e, MountResult = 0x257b, MovementEnforcementAlert = 0x283b, MoveAddImpulse = 0x2e32, @@ -1614,51 +1615,50 @@ namespace Framework.Constants MultiFloorNewFloor = 0x27d4, MythicPlusAllMapStats = 0x2609, MythicPlusCurrentAffixes = 0x260b, - MythicPlusNewWeekRecord = 0x260e, + MythicPlusNewWeekRecord = 0x260f, MythicPlusSeasonData = 0x260a, NeutralPlayerFactionSelectResult = 0x25da, - NewDataBuild = 0x28b7, - NewTaxiPath = 0x267a, + NewDataBuild = 0x28b6, + NewTaxiPath = 0x267b, NewWorld = 0x2593, - NotifyDestLocSpellCast = 0x2c43, - NotifyMissileTrajectoryCollision = 0x26a6, + NotifyDestLocSpellCast = 0x2c45, + NotifyMissileTrajectoryCollision = 0x26a7, NotifyMoney = 0x2598, - NotifyReceivedMail = 0x2638, - NpcInteractionOpenResult = 0x2886, - OfferPetitionError = 0x26b1, - OnCancelExpectedRideVehicleAura = 0x26e0, + NotifyReceivedMail = 0x2639, + NpcInteractionOpenResult = 0x2885, + OfferPetitionError = 0x26b2, + OnCancelExpectedRideVehicleAura = 0x26e1, OnMonsterMove = 0x2dd4, - OpenArtifactForge = 0x2797, + OpenArtifactForge = 0x2798, OpenContainer = 0x2da6, OpenLfgDungeonFinder = 0x2a31, - OpenShipmentNpcResult = 0x278f, - OverrideLight = 0x26b6, - PageText = 0x2713, - PartyCommandResult = 0x2789, + OpenShipmentNpcResult = 0x2790, + OverrideLight = 0x26b7, + PageText = 0x2714, + PartyCommandResult = 0x278a, PartyInvite = 0x25bc, - PartyKillLog = 0x2753, - PartyMemberFullState = 0x2752, - PartyMemberPartialState = 0x2751, + PartyKillLog = 0x2754, + PartyMemberFullState = 0x2753, + PartyMemberPartialState = 0x2752, PartyNotifyLfgLeaderChange = 0x286b, PartyUpdate = 0x25f2, PastTimeEvents = 0x25c1, - PauseMirrorTimer = 0x270a, - PendingRaidLock = 0x26f2, - PerksProgramActivityComplete = 0x2882, + PauseMirrorTimer = 0x270b, + PendingRaidLock = 0x26f3, + PerksProgramActivityComplete = 0x2881, PerksProgramActivityUpdate = 0x287d, - PerksProgramDisabled = 0x2883, - PerksProgramResult = 0x287f, - PerksProgramVendorPending = 0x287e, + PerksProgramDisabled = 0x2882, + PerksProgramResult = 0x287e, PerksProgramVendorUpdate = 0x287c, PetitionAlreadySigned = 0x259e, PetitionRenameGuildResponse = 0x29fa, - PetitionShowList = 0x26b9, - PetitionShowSignatures = 0x26ba, - PetitionSignResults = 0x2745, - PetActionFeedback = 0x2742, - PetActionSound = 0x269c, + PetitionShowList = 0x26ba, + PetitionShowSignatures = 0x26bb, + PetitionSignResults = 0x2746, + PetActionFeedback = 0x2743, + PetActionSound = 0x269d, PetBattleChatRestricted = 0x2600, - PetBattleDebugQueueDumpResponse = 0x2671, + PetBattleDebugQueueDumpResponse = 0x2672, PetBattleFinalizeLocation = 0x25f9, PetBattleFinalRound = 0x25fe, PetBattleFinished = 0x25ff, @@ -1666,27 +1666,27 @@ namespace Framework.Constants PetBattleInitialUpdate = 0x25fa, PetBattleMaxGameLengthWarning = 0x2601, PetBattlePvpChallenge = 0x25f8, - PetBattleQueueProposeMatch = 0x2635, - PetBattleQueueStatus = 0x2636, + PetBattleQueueProposeMatch = 0x2636, + PetBattleQueueStatus = 0x2637, PetBattleReplacementsMade = 0x25fd, PetBattleRequestFailed = 0x25f7, PetBattleRoundResult = 0x25fc, PetBattleSlotUpdates = 0x25ea, - PetCastFailed = 0x2c58, - PetClearSpells = 0x2c21, - PetDismissSound = 0x269d, - PetGodMode = 0x2677, - PetGuids = 0x26fe, - PetLearnedSpells = 0x2c4f, + PetCastFailed = 0x2c5a, + PetClearSpells = 0x2c23, + PetDismissSound = 0x269e, + PetGodMode = 0x2678, + PetGuids = 0x26ff, + PetLearnedSpells = 0x2c51, PetMode = 0x2588, - PetNameInvalid = 0x26be, + PetNameInvalid = 0x26bf, PetNewlyTamed = 0x2587, - PetSpellsMessage = 0x2c22, + PetSpellsMessage = 0x2c24, PetStableResult = 0x2592, - PetTameFailure = 0x26ae, - PetUnlearnedSpells = 0x2c50, + PetTameFailure = 0x26af, + PetUnlearnedSpells = 0x2c52, PhaseShiftChange = 0x2578, - PlayedTime = 0x26d0, + PlayedTime = 0x26d1, PlayerAckowledgeArrowCallout = 0x3022, PlayerAzeriteItemEquippedStatusChanged = 0x3014, PlayerAzeriteItemGains = 0x3013, @@ -1699,6 +1699,7 @@ namespace Framework.Constants PlayerIsAdventureMapPoiValid = 0x3009, PlayerOpenSubscriptionInterstitial = 0x300e, PlayerSaveGuildEmblem = 0x29f9, + PlayerSavePersonalEmblem = 0x3023, PlayerShowArrowCallout = 0x3020, PlayerShowGenericWidgetDisplay = 0x301e, PlayerShowPartyPoseUi = 0x301f, @@ -1706,26 +1707,26 @@ namespace Framework.Constants PlayerSkinned = 0x3006, PlayerTutorialHighlightSpell = 0x300d, PlayerTutorialUnhighlightSpell = 0x300c, - PlayMusic = 0x2762, - PlayObjectSound = 0x2763, - PlayOneShotAnimKit = 0x272a, - PlayOrphanSpellVisual = 0x2c47, - PlayScene = 0x2632, - PlaySound = 0x2761, - PlaySpeakerbotSound = 0x2764, - PlaySpellVisual = 0x2c45, - PlaySpellVisualKit = 0x2c49, - PlayTimeWarning = 0x26f8, + PlayMusic = 0x2763, + PlayObjectSound = 0x2764, + PlayOneShotAnimKit = 0x272b, + PlayOrphanSpellVisual = 0x2c49, + PlayScene = 0x2633, + PlaySound = 0x2762, + PlaySpeakerbotSound = 0x2765, + PlaySpellVisual = 0x2c47, + PlaySpellVisualKit = 0x2c4b, + PlayTimeWarning = 0x26f9, Pong = 0x304e, - PowerUpdate = 0x26cd, + PowerUpdate = 0x26ce, PreloadChildMap = 0x2579, PreloadWorld = 0x2594, PrepopulateNameCache = 0x283e, - PreRessurect = 0x2760, + PreRessurect = 0x2761, PrintNotification = 0x25c9, - ProcResist = 0x2754, + ProcResist = 0x2755, ProfessionGossip = 0x27f5, - PushSpellToActionBar = 0x2c51, + PushSpellToActionBar = 0x2c53, PvpCredit = 0x2946, PvpMatchComplete = 0x2951, PvpMatchInitialize = 0x2952, @@ -1749,7 +1750,7 @@ namespace Framework.Constants QueryPlayerNameByCommunityIdResponse = 0x3002, QueryQuestInfoResponse = 0x2a96, QueryRealmGuildMasterInfoResponse = 0x29e6, - QueryTimeResponse = 0x26de, + QueryTimeResponse = 0x26df, QuestCompletionNpcResponse = 0x2a81, QuestConfirmAccept = 0x2a8f, QuestForceRemoved = 0x2a9c, @@ -1781,53 +1782,52 @@ namespace Framework.Constants QueueSummaryUpdate = 0x2808, RafAccountInfo = 0x284c, RafActivityStateChanged = 0x285d, - RafDebugFriendMonths = 0x28b4, - RaidDifficultySet = 0x27a1, - RaidGroupOnly = 0x27a3, + RafDebugFriendMonths = 0x28b3, + RaidDifficultySet = 0x27a2, + RaidGroupOnly = 0x27a4, RaidInstanceMessage = 0x2bb4, RaidMarkersChanged = 0x259f, - RandomRoll = 0x262c, + RandomRoll = 0x262d, RatedPvpInfo = 0x2931, ReadyCheckCompleted = 0x25f6, ReadyCheckResponse = 0x25f5, ReadyCheckStarted = 0x25f4, - ReadItemResultFailed = 0x279d, - ReadItemResultOk = 0x2794, - RealmLookupInfo = 0x27c0, + ReadItemResultFailed = 0x279e, + ReadItemResultOk = 0x2795, RealmQueryResponse = 0x2913, - ReattachResurrect = 0x2744, + ReattachResurrect = 0x2745, ReceivePingUnit = 0x25a0, ReceivePingWorldPoint = 0x25a1, - RecraftItemResult = 0x28a3, - RecruitAFriendFailure = 0x26bb, - RefreshComponent = 0x264d, - RefreshSpellHistory = 0x2c29, + RecraftItemResult = 0x28a2, + RecruitAFriendFailure = 0x26bc, + RefreshComponent = 0x264e, + RefreshSpellHistory = 0x2c2b, RemoveItemPassive = 0x25aa, - RemoveSpellFromActionBar = 0x2c52, - ReplaceTrophyResponse = 0x27b9, + RemoveSpellFromActionBar = 0x2c54, + ReplaceTrophyResponse = 0x27ba, ReportPvpPlayerAfkResult = 0x3001, RequestCemeteryListResponse = 0x258e, RequestPvpRewardsResponse = 0x2936, RequestScheduledPvpInfoResponse = 0x2937, ResetCompressionContext = 0x304f, - ResetFailedNotify = 0x26b2, - ResetLastLoadedConfigCvars = 0x28a9, + ResetFailedNotify = 0x26b3, + ResetLastLoadedConfigCvars = 0x28a8, ResetQuestPoi = 0x2aa0, ResetRangedCombatTimer = 0x2945, ResetWeeklyCurrency = 0x2575, - RespecWipeConfirm = 0x260f, + RespecWipeConfirm = 0x2610, RespondInspectAchievements = 0x2572, - ResponsePerkPendingRewards = 0x2880, - ResponsePerkRecentPurchases = 0x2881, - RestartGlobalCooldown = 0x2c61, + ResponsePerkPendingRewards = 0x287f, + ResponsePerkRecentPurchases = 0x2880, + RestartGlobalCooldown = 0x2c63, RestrictedAccountWarning = 0x25b8, - ResumeCast = 0x2c3b, - ResumeCastBar = 0x2c3e, + ResumeCast = 0x2c3d, + ResumeCastBar = 0x2c40, ResumeComms = 0x304b, ResumeToken = 0x25a8, ResurrectRequest = 0x257e, - ResyncRunes = 0x2c5f, - ReturningPlayerPrompt = 0x279c, + ResyncRunes = 0x2c61, + ReturningPlayerPrompt = 0x279d, ReturnApplicantList = 0x2842, ReturnRecruitingClubs = 0x2841, RoleChangedInform = 0x258a, @@ -1836,12 +1836,12 @@ namespace Framework.Constants RuneforgeLegendaryCraftingOpenNpc = 0x27f4, RuneRegenDebug = 0x25b5, ScenarioCompleted = 0x27e2, - ScenarioPois = 0x262f, - ScenarioProgressUpdate = 0x2628, + ScenarioPois = 0x2630, + ScenarioProgressUpdate = 0x2629, ScenarioShowCriteria = 0x27f8, - ScenarioState = 0x2627, + ScenarioState = 0x2628, ScenarioUiUpdate = 0x27f7, - ScenarioVacate = 0x279e, + ScenarioVacate = 0x279f, SceneObjectEvent = 0x25e0, SceneObjectPetBattleFinalRound = 0x25e5, SceneObjectPetBattleFinished = 0x25e6, @@ -1849,163 +1849,164 @@ namespace Framework.Constants SceneObjectPetBattleInitialUpdate = 0x25e1, SceneObjectPetBattleReplacementsMade = 0x25e4, SceneObjectPetBattleRoundResult = 0x25e3, - ScriptCast = 0x2c56, + ScriptCast = 0x2c58, SeasonInfo = 0x25c0, - SellResponse = 0x26bf, + SellResponse = 0x26c0, SendItemPassives = 0x25ab, - SendKnownSpells = 0x2c27, - SendRaidTargetUpdateAll = 0x262a, - SendRaidTargetUpdateSingle = 0x262b, - SendSpellCharges = 0x2c2a, - SendSpellHistory = 0x2c28, - SendUnlearnSpells = 0x2c2b, - ServerFirstAchievements = 0x264a, - ServerTime = 0x267e, - ServerTimeOffset = 0x270e, + SendKnownSpells = 0x2c29, + SendRaidTargetUpdateAll = 0x262b, + SendRaidTargetUpdateSingle = 0x262c, + SendSpellCharges = 0x2c2c, + SendSpellHistory = 0x2c2a, + SendUnlearnSpells = 0x2c2d, + ServerFirstAchievements = 0x264b, + ServerTime = 0x267f, + ServerTimeOffset = 0x270f, + SetupCombatLogFileFlush = 0x2c1f, SetupCurrency = 0x2573, - SetAiAnimKit = 0x2729, - SetAnimTier = 0x272d, + SetAiAnimKit = 0x272a, + SetAnimTier = 0x272e, SetChrUpgradeTier = 0x25dd, SetCurrency = 0x2574, SetDfFastLaunchResult = 0x2a2e, - SetDungeonDifficulty = 0x26a0, - SetFactionAtWar = 0x26fa, - SetFactionNotVisible = 0x2724, - SetFactionStanding = 0x2725, - SetFactionVisible = 0x2723, - SetFlatSpellModifier = 0x2c36, - SetForcedReactions = 0x2717, + SetDungeonDifficulty = 0x26a1, + SetFactionAtWar = 0x26fb, + SetFactionNotVisible = 0x2725, + SetFactionStanding = 0x2726, + SetFactionVisible = 0x2724, + SetFlatSpellModifier = 0x2c38, + SetForcedReactions = 0x2718, SetItemPurchaseData = 0x259a, SetLootMethodFailed = 0x27c6, SetMaxWeeklyQuantity = 0x259d, - SetMeleeAnimKit = 0x272c, - SetMovementAnimKit = 0x272b, - SetPctSpellModifier = 0x2c37, - SetPetSpecialization = 0x2621, + SetMeleeAnimKit = 0x272d, + SetMovementAnimKit = 0x272c, + SetPctSpellModifier = 0x2c39, + SetPetSpecialization = 0x2622, SetPlayerDeclinedNamesResult = 0x3003, SetPlayHoverAnim = 0x25b9, - SetProficiency = 0x272e, + SetProficiency = 0x272f, SetQuestReplayCooldownOverride = 0x2855, SetShipmentReadyResponse = 0x2998, - SetSpellCharges = 0x2c26, - SetTimeZoneInformation = 0x2673, - SetVehicleRecId = 0x26f1, - ShadowlandsCapacitanceUpdate = 0x2885, + SetSpellCharges = 0x2c28, + SetTimeZoneInformation = 0x2674, + SetVehicleRecId = 0x26f2, + ShadowlandsCapacitanceUpdate = 0x2884, ShipmentFactionUpdateResult = 0x2999, ShowNeutralPlayerFactionSelectUi = 0x25d9, ShowQuestCompletionText = 0x2a95, - ShowTaxiNodes = 0x26c8, - ShowTradeSkillResponse = 0x2769, - SocialContractRequestResponse = 0x2890, - SocketGemsFailure = 0x2721, - SocketGemsSuccess = 0x2720, - SpecialMountAnim = 0x269b, - SpecInvoluntarilyChanged = 0x2712, + ShowTaxiNodes = 0x26c9, + ShowTradeSkillResponse = 0x276a, + SocialContractRequestResponse = 0x288f, + SocketGemsFailure = 0x2722, + SocketGemsSuccess = 0x2721, + SpecialMountAnim = 0x269c, + SpecInvoluntarilyChanged = 0x2713, SpellAbsorbLog = 0x2c1c, SpellCategoryCooldown = 0x2c16, - SpellChannelStart = 0x2c31, - SpellChannelUpdate = 0x2c32, + SpellChannelStart = 0x2c33, + SpellChannelUpdate = 0x2c34, SpellCooldown = 0x2c15, - SpellDamageShield = 0x2c2e, - SpellDelayed = 0x2c3f, + SpellDamageShield = 0x2c30, + SpellDelayed = 0x2c41, SpellDispellLog = 0x2c17, - SpellEmpowerSetStage = 0x2c35, - SpellEmpowerStart = 0x2c33, - SpellEmpowerUpdate = 0x2c34, + SpellEmpowerSetStage = 0x2c37, + SpellEmpowerStart = 0x2c35, + SpellEmpowerUpdate = 0x2c36, SpellEnergizeLog = 0x2c19, - SpellExecuteLog = 0x2c40, - SpellFailedOther = 0x2c55, - SpellFailure = 0x2c53, - SpellFailureMessage = 0x2c5a, - SpellGo = 0x2c39, + SpellExecuteLog = 0x2c42, + SpellFailedOther = 0x2c57, + SpellFailure = 0x2c55, + SpellFailureMessage = 0x2c5c, + SpellGo = 0x2c3b, SpellHealAbsorbLog = 0x2c1b, SpellHealLog = 0x2c1a, - SpellInstakillLog = 0x2c30, + SpellInstakillLog = 0x2c32, SpellInterruptLog = 0x2c1d, - SpellMissLog = 0x2c41, - SpellNonMeleeDamageLog = 0x2c2f, - SpellOrDamageImmune = 0x2c2c, + SpellMissLog = 0x2c43, + SpellNonMeleeDamageLog = 0x2c31, + SpellOrDamageImmune = 0x2c2e, SpellPeriodicAuraLog = 0x2c18, - SpellPrepare = 0x2c38, - SpellStart = 0x2c3a, + SpellPrepare = 0x2c3a, + SpellStart = 0x2c3c, SpellVisualLoadScreen = 0x25cb, SplashScreenShowLatest = 0x2867, - StandStateUpdate = 0x2716, + StandStateUpdate = 0x2717, StarterBuildActivateFailed = 0x25d1, StartElapsedTimer = 0x2602, StartElapsedTimers = 0x2604, - StartLightningStorm = 0x26a3, - StartLootRoll = 0x2619, - StartMirrorTimer = 0x2709, + StartLightningStorm = 0x26a4, + StartLootRoll = 0x261a, + StartMirrorTimer = 0x270a, StartTimer = 0x25a4, StopElapsedTimer = 0x2603, - StopMirrorTimer = 0x270b, - StopSpeakerbotSound = 0x2765, + StopMirrorTimer = 0x270c, + StopSpeakerbotSound = 0x2766, StopTimer = 0x25a5, StreamingMovies = 0x25a3, - SuggestInviteInform = 0x278a, - SummonCancel = 0x26ac, + SuggestInviteInform = 0x278b, + SummonCancel = 0x26ad, SummonRaidMemberValidateFailed = 0x258c, - SummonRequest = 0x271b, - SupercededSpells = 0x2c4c, + SummonRequest = 0x271c, + SupercededSpells = 0x2c4e, SuspendComms = 0x304a, SuspendToken = 0x25a7, SyncWowEntitlements = 0x285f, - TalentsInvoluntarilyReset = 0x2711, - TaxiNodeStatus = 0x2678, - TextEmote = 0x2676, - ThreatClear = 0x26d7, - ThreatRemove = 0x26d6, - ThreatUpdate = 0x26d5, + TalentsInvoluntarilyReset = 0x2712, + TaxiNodeStatus = 0x2679, + TextEmote = 0x2677, + ThreatClear = 0x26d8, + ThreatRemove = 0x26d7, + ThreatUpdate = 0x26d6, TimeAdjustment = 0x2dd3, TimeSyncRequest = 0x2dd2, - TitleEarned = 0x26d2, - TitleLost = 0x26d3, - TotemCreated = 0x26c2, - TotemDurationChanged = 0x26c4, - TotemMoved = 0x26c5, - TotemRemoved = 0x26c3, + TitleEarned = 0x26d3, + TitleLost = 0x26d4, + TotemCreated = 0x26c3, + TotemDurationChanged = 0x26c5, + TotemMoved = 0x26c6, + TotemRemoved = 0x26c4, TradeStatus = 0x2582, TradeUpdated = 0x2581, - TrainerBuyFailed = 0x26da, - TrainerList = 0x26d9, + TrainerBuyFailed = 0x26db, + TrainerList = 0x26da, TraitConfigCommitFailed = 0x25d0, - TransferAborted = 0x26fd, + TransferAborted = 0x26fe, TransferPending = 0x25cc, TreasurePickerResponse = 0x291f, - TriggerCinematic = 0x27be, - TriggerMovie = 0x26c6, - TurnInPetitionResult = 0x2747, - TutorialFlags = 0x27b2, + TriggerCinematic = 0x27bf, + TriggerMovie = 0x26c7, + TurnInPetitionResult = 0x2748, + TutorialFlags = 0x27b3, UiMapQuestLinesResponse = 0x2aa2, UndeleteCharacterResponse = 0x27c1, UndeleteCooldownStatusResponse = 0x27c2, - UnlearnedSpells = 0x2c4e, + UnlearnedSpells = 0x2c50, UnloadChildMap = 0x257a, UpdateAadcStatusResponse = 0x2879, - UpdateAccountData = 0x2703, + UpdateAccountData = 0x2704, UpdateActionButtons = 0x25de, UpdateBnetSessionKey = 0x2819, UpdateCapturePoint = 0x2929, UpdateCelestialBody = 0x2815, - UpdateCharacterFlags = 0x27b8, - UpdateChargeCategoryCooldown = 0x275f, - UpdateCooldown = 0x275e, + UpdateCharacterFlags = 0x27b9, + UpdateChargeCategoryCooldown = 0x2760, + UpdateCooldown = 0x275f, UpdateCraftingNpcRecipes = 0x2996, UpdateDailyMissionCounter = 0x297f, - UpdateExpansionLevel = 0x2642, + UpdateExpansionLevel = 0x2643, UpdateGameTimeState = 0x281c, - UpdateInstanceOwnership = 0x26a5, - UpdateLastInstance = 0x2684, - UpdateObject = 0x27bf, + UpdateInstanceOwnership = 0x26a6, + UpdateLastInstance = 0x2685, + UpdateObject = 0x27c0, UpdatePrimarySpec = 0x25d6, UpdateRecentPlayerGuids = 0x25f3, UpdateTalentData = 0x25d5, - UpdateWorldState = 0x2741, + UpdateWorldState = 0x2742, UserlistAdd = 0x2bb9, UserlistRemove = 0x2bba, UserlistUpdate = 0x2bbb, - UseEquipmentSetResult = 0x2748, + UseEquipmentSetResult = 0x2749, VasCheckTransferOkResponse = 0x2810, VasGetQueueMinutesResponse = 0x280e, VasGetServiceStatusResponse = 0x280d, @@ -2026,26 +2027,26 @@ namespace Framework.Constants Warden3Data = 0x2577, Warden3Disabled = 0x2817, Warden3Enabled = 0x2816, - WarfrontComplete = 0x2757, + WarfrontComplete = 0x2758, WargameRequestOpponentResponse = 0x2934, WargameRequestSuccessfullySentToOpponent = 0x2933, - Weather = 0x26a2, + Weather = 0x26a3, WeeklyRewardsProgressResult = 0x286a, WeeklyRewardsResult = 0x2868, WeeklyRewardClaimResult = 0x2869, Who = 0x2bae, - WhoIs = 0x26a1, + WhoIs = 0x26a2, WillBeKickedForAddedSubscriptionTime = 0x281b, WorldQuestUpdateResponse = 0x300f, WorldServerInfo = 0x25ac, WowEntitlementNotification = 0x2860, - XpAwardedFromCurrency = 0x28a8, + XpAwardedFromCurrency = 0x28a7, XpGainAborted = 0x25c8, - XpGainEnabled = 0x27a2, + XpGainEnabled = 0x27a3, ZoneUnderAttack = 0x2bb5, // Opcodes That Are Not Generated Automatically - AccountHeirloomUpdate = 0x25AD, // No Client Handler + AccountHeirloomUpdate = 0x25B0, // No Client Handler CompressedPacket = 0x3052, MultiplePackets = 0x3051, diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 8ade8c77d..bd0a031bb 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -894,4 +894,10 @@ namespace Framework.Constants DroppedFromDeath = 0x02, FromAccountServer = 0x04 } + + public enum TabardVendorType + { + Guild = 0, + Personal = 1, + } } diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 7f1f36408..76cfd2bec 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -2726,293 +2726,295 @@ namespace Framework.Constants ArenaTeamPartySize = 836, SoloShuffleWargameGroupSize = 837, SoloShuffleWargameGroupComp = 838, - SoloShuffleMinItemLevel = 839, + SoloMinItemLevel = 839, PvpPlayerAbandoned = 840, - QuestForceRemovedS = 841, - AttackNoActions = 842, - InRandomBg = 843, - InNonRandomBg = 844, - BnFriendSelf = 845, - BnFriendAlready = 846, - BnFriendBlocked = 847, - BnFriendListFull = 848, - BnFriendRequestSent = 849, - BnBroadcastThrottle = 850, - BgDeveloperOnly = 851, - CurrencySpellSlotMismatch = 852, - CurrencyNotTradable = 853, - RequiresExpansionS = 854, - QuestFailedSpell = 855, - TalentFailedUnspentTalentPoints = 856, - TalentFailedNotEnoughTalentsInPrimaryTree = 857, - TalentFailedNoPrimaryTreeSelected = 858, - TalentFailedCantRemoveTalent = 859, - TalentFailedUnknown = 860, - TalentFailedInCombat = 861, - TalentFailedInPvpMatch = 862, - TalentFailedInMythicPlus = 863, - WargameRequestFailure = 864, - RankRequiresAuthenticator = 865, - GuildBankVoucherFailed = 866, - WargameRequestSent = 867, - RequiresAchievementI = 868, - RefundResultExceedMaxCurrency = 869, - CantBuyQuantity = 870, - ItemIsBattlePayLocked = 871, - PartyAlreadyInBattlegroundQueue = 872, - PartyConfirmingBattlegroundQueue = 873, - BattlefieldTeamPartySize = 874, - InsuffTrackedCurrencyIs = 875, - NotOnTournamentRealm = 876, - GuildTrialAccountTrial = 877, - GuildTrialAccountVeteran = 878, - GuildUndeletableDueToLevel = 879, - CantDoThatInAGroup = 880, - GuildLeaderReplaced = 881, - TransmogrifyCantEquip = 882, - TransmogrifyInvalidItemType = 883, - TransmogrifyNotSoulbound = 884, - TransmogrifyInvalidSource = 885, - TransmogrifyInvalidDestination = 886, - TransmogrifyMismatch = 887, - TransmogrifyLegendary = 888, - TransmogrifySameItem = 889, - TransmogrifySameAppearance = 890, - TransmogrifyNotEquipped = 891, - VoidDepositFull = 892, - VoidWithdrawFull = 893, - VoidStorageWrapped = 894, - VoidStorageStackable = 895, - VoidStorageUnbound = 896, - VoidStorageRepair = 897, - VoidStorageCharges = 898, - VoidStorageQuest = 899, - VoidStorageConjured = 900, - VoidStorageMail = 901, - VoidStorageBag = 902, - VoidTransferStorageFull = 903, - VoidTransferInvFull = 904, - VoidTransferInternalError = 905, - VoidTransferItemInvalid = 906, - DifficultyDisabledInLfg = 907, - VoidStorageUnique = 908, - VoidStorageLoot = 909, - VoidStorageHoliday = 910, - VoidStorageDuration = 911, - VoidStorageLoadFailed = 912, - VoidStorageInvalidItem = 913, - ParentalControlsChatMuted = 914, - SorStartExperienceIncomplete = 915, - SorInvalidEmail = 916, - SorInvalidComment = 917, - ChallengeModeResetCooldownS = 918, - ChallengeModeResetKeystone = 919, - PetJournalAlreadyInLoadout = 920, - ReportSubmittedSuccessfully = 921, - ReportSubmissionFailed = 922, - SuggestionSubmittedSuccessfully = 923, - BugSubmittedSuccessfully = 924, - ChallengeModeEnabled = 925, - ChallengeModeDisabled = 926, - PetbattleCreateFailed = 927, - PetbattleNotHere = 928, - PetbattleNotHereOnTransport = 929, - PetbattleNotHereUnevenGround = 930, - PetbattleNotHereObstructed = 931, - PetbattleNotWhileInCombat = 932, - PetbattleNotWhileDead = 933, - PetbattleNotWhileFlying = 934, - PetbattleTargetInvalid = 935, - PetbattleTargetOutOfRange = 936, - PetbattleTargetNotCapturable = 937, - PetbattleNotATrainer = 938, - PetbattleDeclined = 939, - PetbattleInBattle = 940, - PetbattleInvalidLoadout = 941, - PetbattleAllPetsDead = 942, - PetbattleNoPetsInSlots = 943, - PetbattleNoAccountLock = 944, - PetbattleWildPetTapped = 945, - PetbattleRestrictedAccount = 946, - PetbattleOpponentNotAvailable = 947, - PetbattleNotWhileInMatchedBattle = 948, - CantHaveMorePetsOfThatType = 949, - CantHaveMorePets = 950, - PvpMapNotFound = 951, - PvpMapNotSet = 952, - PetbattleQueueQueued = 953, - PetbattleQueueAlreadyQueued = 954, - PetbattleQueueJoinFailed = 955, - PetbattleQueueJournalLock = 956, - PetbattleQueueRemoved = 957, - PetbattleQueueProposalDeclined = 958, - PetbattleQueueProposalTimeout = 959, - PetbattleQueueOpponentDeclined = 960, - PetbattleQueueRequeuedInternal = 961, - PetbattleQueueRequeuedRemoved = 962, - PetbattleQueueSlotLocked = 963, - PetbattleQueueSlotEmpty = 964, - PetbattleQueueSlotNoTracker = 965, - PetbattleQueueSlotNoSpecies = 966, - PetbattleQueueSlotCantBattle = 967, - PetbattleQueueSlotRevoked = 968, - PetbattleQueueSlotDead = 969, - PetbattleQueueSlotNoPet = 970, - PetbattleQueueNotWhileNeutral = 971, - PetbattleGameTimeLimitWarning = 972, - PetbattleGameRoundsLimitWarning = 973, - HasRestriction = 974, - ItemUpgradeItemTooLowLevel = 975, - ItemUpgradeNoPath = 976, - ItemUpgradeNoMoreUpgrades = 977, - BonusRollEmpty = 978, - ChallengeModeFull = 979, - ChallengeModeInProgress = 980, - ChallengeModeIncorrectKeystone = 981, - BattletagFriendNotFound = 982, - BattletagFriendNotValid = 983, - BattletagFriendNotAllowed = 984, - BattletagFriendThrottled = 985, - BattletagFriendSuccess = 986, - PetTooHighLevelToUncage = 987, - PetbattleInternal = 988, - CantCagePetYet = 989, - NoLootInChallengeMode = 990, - QuestPetBattleVictoriesPvpIi = 991, - RoleCheckAlreadyInProgress = 992, - RecruitAFriendAccountLimit = 993, - RecruitAFriendFailed = 994, - SetLootPersonal = 995, - SetLootMethodFailedCombat = 996, - ReagentBankFull = 997, - ReagentBankLocked = 998, - GarrisonBuildingExists = 999, - GarrisonInvalidPlot = 1000, - GarrisonInvalidBuildingid = 1001, - GarrisonInvalidPlotBuilding = 1002, - GarrisonRequiresBlueprint = 1003, - GarrisonNotEnoughCurrency = 1004, - GarrisonNotEnoughGold = 1005, - GarrisonCompleteMissionWrongFollowerType = 1006, - AlreadyUsingLfgList = 1007, - RestrictedAccountLfgListTrial = 1008, - ToyUseLimitReached = 1009, - ToyAlreadyKnown = 1010, - TransmogSetAlreadyKnown = 1011, - NotEnoughCurrency = 1012, - SpecIsDisabled = 1013, - FeatureRestrictedTrial = 1014, - CantBeObliterated = 1015, - CantBeScrapped = 1016, - CantBeRecrafted = 1017, - ArtifactRelicDoesNotMatchArtifact = 1018, - MustEquipArtifact = 1019, - CantDoThatRightNow = 1020, - AffectingCombat = 1021, - EquipmentManagerCombatSwapS = 1022, - EquipmentManagerBagsFull = 1023, - EquipmentManagerMissingItemS = 1024, - MovieRecordingWarningPerf = 1025, - MovieRecordingWarningDiskFull = 1026, - MovieRecordingWarningNoMovie = 1027, - MovieRecordingWarningRequirements = 1028, - MovieRecordingWarningCompressing = 1029, - NoChallengeModeReward = 1030, - ClaimedChallengeModeReward = 1031, - ChallengeModePeriodResetSs = 1032, - CantDoThatChallengeModeActive = 1033, - TalentFailedRestArea = 1034, - CannotAbandonLastPet = 1035, - TestCvarSetSss = 1036, - QuestTurnInFailReason = 1037, - ClaimedChallengeModeRewardOld = 1038, - TalentGrantedByAura = 1039, - ChallengeModeAlreadyComplete = 1040, - GlyphTargetNotAvailable = 1041, - PvpWarmodeToggleOn = 1042, - PvpWarmodeToggleOff = 1043, - SpellFailedLevelRequirement = 1044, - SpellFailedCantFlyHere = 1045, - BattlegroundJoinRequiresLevel = 1046, - BattlegroundJoinDisqualified = 1047, - BattlegroundJoinDisqualifiedNoName = 1048, - VoiceChatGenericUnableToConnect = 1049, - VoiceChatServiceLost = 1050, - VoiceChatChannelNameTooShort = 1051, - VoiceChatChannelNameTooLong = 1052, - VoiceChatChannelAlreadyExists = 1053, - VoiceChatTargetNotFound = 1054, - VoiceChatTooManyRequests = 1055, - VoiceChatPlayerSilenced = 1056, - VoiceChatParentalDisableAll = 1057, - VoiceChatDisabled = 1058, - NoPvpReward = 1059, - ClaimedPvpReward = 1060, - AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1061, - AzeriteEssenceSelectionFailedCantRemoveEssence = 1062, - AzeriteEssenceSelectionFailedConditionFailed = 1063, - AzeriteEssenceSelectionFailedRestArea = 1064, - AzeriteEssenceSelectionFailedSlotLocked = 1065, - AzeriteEssenceSelectionFailedNotAtForge = 1066, - AzeriteEssenceSelectionFailedHeartLevelTooLow = 1067, - AzeriteEssenceSelectionFailedNotEquipped = 1068, - SocketingRequiresPunchcardredGem = 1069, - SocketingPunchcardredGemOnlyInPunchcardredslot = 1070, - SocketingRequiresPunchcardyellowGem = 1071, - SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1072, - SocketingRequiresPunchcardblueGem = 1073, - SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1074, - SocketingRequiresDominationShard = 1075, - SocketingDominationShardOnlyInDominationslot = 1076, - SocketingRequiresCypherGem = 1077, - SocketingCypherGemOnlyInCypherslot = 1078, - SocketingRequiresTinkerGem = 1079, - SocketingTinkerGemOnlyInTinkerslot = 1080, - SocketingRequiresPrimordialGem = 1081, - SocketingPrimordialGemOnlyInPrimordialslot = 1082, - LevelLinkingResultLinked = 1083, - LevelLinkingResultUnlinked = 1084, - ClubFinderErrorPostClub = 1085, - ClubFinderErrorApplyClub = 1086, - ClubFinderErrorRespondApplicant = 1087, - ClubFinderErrorCancelApplication = 1088, - ClubFinderErrorTypeAcceptApplication = 1089, - ClubFinderErrorTypeNoInvitePermissions = 1090, - ClubFinderErrorTypeNoPostingPermissions = 1091, - ClubFinderErrorTypeApplicantList = 1092, - ClubFinderErrorTypeApplicantListNoPerm = 1093, - ClubFinderErrorTypeFinderNotAvailable = 1094, - ClubFinderErrorTypeGetPostingIds = 1095, - ClubFinderErrorTypeJoinApplication = 1096, - ClubFinderErrorTypeRealmNotEligible = 1097, - ClubFinderErrorTypeFlaggedRename = 1098, - ClubFinderErrorTypeFlaggedDescriptionChange = 1099, - ItemInteractionNotEnoughGold = 1100, - ItemInteractionNotEnoughCurrency = 1101, - PlayerChoiceErrorPendingChoice = 1102, - SoulbindInvalidConduit = 1103, - SoulbindInvalidConduitItem = 1104, - SoulbindInvalidTalent = 1105, - SoulbindDuplicateConduit = 1106, - ActivateSoulbindS = 1107, - ActivateSoulbindFailedRestArea = 1108, - CantUseProfanity = 1109, - NotInPetBattle = 1110, - NotInNpe = 1111, - NoSpec = 1112, - NoDominationshardOverwrite = 1113, - UseWeeklyRewardsDisabled = 1114, - CrossFactionGroupJoined = 1115, - CantTargetUnfriendlyInOverworld = 1116, - EquipablespellsSlotsFull = 1117, - ItemModAppearanceGroupAlreadyKnown = 1118, - CantBulkSellItemWithRefund = 1119, - WowLabsPartyErrorTypePartyIsFull = 1120, - WowLabsPartyErrorTypeMaxInviteSent = 1121, - WowLabsPartyErrorTypePlayerAlreadyInvited = 1122, - WowLabsPartyErrorTypePartyInviteInvalid = 1123, - WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1124, - WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1125, + BattlegroundJoinGroupQueueWithoutHealer = 841, + QuestForceRemovedS = 842, + AttackNoActions = 843, + InRandomBg = 844, + InNonRandomBg = 845, + BnFriendSelf = 846, + BnFriendAlready = 847, + BnFriendBlocked = 848, + BnFriendListFull = 849, + BnFriendRequestSent = 850, + BnBroadcastThrottle = 851, + BgDeveloperOnly = 852, + CurrencySpellSlotMismatch = 853, + CurrencyNotTradable = 854, + RequiresExpansionS = 855, + QuestFailedSpell = 856, + TalentFailedUnspentTalentPoints = 857, + TalentFailedNotEnoughTalentsInPrimaryTree = 858, + TalentFailedNoPrimaryTreeSelected = 859, + TalentFailedCantRemoveTalent = 860, + TalentFailedUnknown = 861, + TalentFailedInCombat = 862, + TalentFailedInPvpMatch = 863, + TalentFailedInMythicPlus = 864, + WargameRequestFailure = 865, + RankRequiresAuthenticator = 866, + GuildBankVoucherFailed = 867, + WargameRequestSent = 868, + RequiresAchievementI = 869, + RefundResultExceedMaxCurrency = 870, + CantBuyQuantity = 871, + ItemIsBattlePayLocked = 872, + PartyAlreadyInBattlegroundQueue = 873, + PartyConfirmingBattlegroundQueue = 874, + BattlefieldTeamPartySize = 875, + InsuffTrackedCurrencyIs = 876, + NotOnTournamentRealm = 877, + GuildTrialAccountTrial = 878, + GuildTrialAccountVeteran = 879, + GuildUndeletableDueToLevel = 880, + CantDoThatInAGroup = 881, + GuildLeaderReplaced = 882, + TransmogrifyCantEquip = 883, + TransmogrifyInvalidItemType = 884, + TransmogrifyNotSoulbound = 885, + TransmogrifyInvalidSource = 886, + TransmogrifyInvalidDestination = 887, + TransmogrifyMismatch = 888, + TransmogrifyLegendary = 889, + TransmogrifySameItem = 890, + TransmogrifySameAppearance = 891, + TransmogrifyNotEquipped = 892, + VoidDepositFull = 893, + VoidWithdrawFull = 894, + VoidStorageWrapped = 895, + VoidStorageStackable = 896, + VoidStorageUnbound = 897, + VoidStorageRepair = 898, + VoidStorageCharges = 899, + VoidStorageQuest = 900, + VoidStorageConjured = 901, + VoidStorageMail = 902, + VoidStorageBag = 903, + VoidTransferStorageFull = 904, + VoidTransferInvFull = 905, + VoidTransferInternalError = 906, + VoidTransferItemInvalid = 907, + DifficultyDisabledInLfg = 908, + VoidStorageUnique = 909, + VoidStorageLoot = 910, + VoidStorageHoliday = 911, + VoidStorageDuration = 912, + VoidStorageLoadFailed = 913, + VoidStorageInvalidItem = 914, + ParentalControlsChatMuted = 915, + SorStartExperienceIncomplete = 916, + SorInvalidEmail = 917, + SorInvalidComment = 918, + ChallengeModeResetCooldownS = 919, + ChallengeModeResetKeystone = 920, + PetJournalAlreadyInLoadout = 921, + ReportSubmittedSuccessfully = 922, + ReportSubmissionFailed = 923, + SuggestionSubmittedSuccessfully = 924, + BugSubmittedSuccessfully = 925, + ChallengeModeEnabled = 926, + ChallengeModeDisabled = 927, + PetbattleCreateFailed = 928, + PetbattleNotHere = 929, + PetbattleNotHereOnTransport = 930, + PetbattleNotHereUnevenGround = 931, + PetbattleNotHereObstructed = 932, + PetbattleNotWhileInCombat = 933, + PetbattleNotWhileDead = 934, + PetbattleNotWhileFlying = 935, + PetbattleTargetInvalid = 936, + PetbattleTargetOutOfRange = 937, + PetbattleTargetNotCapturable = 938, + PetbattleNotATrainer = 939, + PetbattleDeclined = 940, + PetbattleInBattle = 941, + PetbattleInvalidLoadout = 942, + PetbattleAllPetsDead = 943, + PetbattleNoPetsInSlots = 944, + PetbattleNoAccountLock = 945, + PetbattleWildPetTapped = 946, + PetbattleRestrictedAccount = 947, + PetbattleOpponentNotAvailable = 948, + PetbattleNotWhileInMatchedBattle = 949, + CantHaveMorePetsOfThatType = 950, + CantHaveMorePets = 951, + PvpMapNotFound = 952, + PvpMapNotSet = 953, + PetbattleQueueQueued = 954, + PetbattleQueueAlreadyQueued = 955, + PetbattleQueueJoinFailed = 956, + PetbattleQueueJournalLock = 957, + PetbattleQueueRemoved = 958, + PetbattleQueueProposalDeclined = 959, + PetbattleQueueProposalTimeout = 960, + PetbattleQueueOpponentDeclined = 961, + PetbattleQueueRequeuedInternal = 962, + PetbattleQueueRequeuedRemoved = 963, + PetbattleQueueSlotLocked = 964, + PetbattleQueueSlotEmpty = 965, + PetbattleQueueSlotNoTracker = 966, + PetbattleQueueSlotNoSpecies = 967, + PetbattleQueueSlotCantBattle = 968, + PetbattleQueueSlotRevoked = 969, + PetbattleQueueSlotDead = 970, + PetbattleQueueSlotNoPet = 971, + PetbattleQueueNotWhileNeutral = 972, + PetbattleGameTimeLimitWarning = 973, + PetbattleGameRoundsLimitWarning = 974, + HasRestriction = 975, + ItemUpgradeItemTooLowLevel = 976, + ItemUpgradeNoPath = 977, + ItemUpgradeNoMoreUpgrades = 978, + BonusRollEmpty = 979, + ChallengeModeFull = 980, + ChallengeModeInProgress = 981, + ChallengeModeIncorrectKeystone = 982, + BattletagFriendNotFound = 983, + BattletagFriendNotValid = 984, + BattletagFriendNotAllowed = 985, + BattletagFriendThrottled = 986, + BattletagFriendSuccess = 987, + PetTooHighLevelToUncage = 988, + PetbattleInternal = 989, + CantCagePetYet = 990, + NoLootInChallengeMode = 991, + QuestPetBattleVictoriesPvpIi = 992, + RoleCheckAlreadyInProgress = 993, + RecruitAFriendAccountLimit = 994, + RecruitAFriendFailed = 995, + SetLootPersonal = 996, + SetLootMethodFailedCombat = 997, + ReagentBankFull = 998, + ReagentBankLocked = 999, + GarrisonBuildingExists = 1000, + GarrisonInvalidPlot = 1001, + GarrisonInvalidBuildingid = 1002, + GarrisonInvalidPlotBuilding = 1003, + GarrisonRequiresBlueprint = 1004, + GarrisonNotEnoughCurrency = 1005, + GarrisonNotEnoughGold = 1006, + GarrisonCompleteMissionWrongFollowerType = 1007, + AlreadyUsingLfgList = 1008, + RestrictedAccountLfgListTrial = 1009, + ToyUseLimitReached = 1010, + ToyAlreadyKnown = 1011, + TransmogSetAlreadyKnown = 1012, + NotEnoughCurrency = 1013, + SpecIsDisabled = 1014, + FeatureRestrictedTrial = 1015, + CantBeObliterated = 1016, + CantBeScrapped = 1017, + CantBeRecrafted = 1018, + ArtifactRelicDoesNotMatchArtifact = 1019, + MustEquipArtifact = 1020, + CantDoThatRightNow = 1021, + AffectingCombat = 1022, + EquipmentManagerCombatSwapS = 1023, + EquipmentManagerBagsFull = 1024, + EquipmentManagerMissingItemS = 1025, + MovieRecordingWarningPerf = 1026, + MovieRecordingWarningDiskFull = 1027, + MovieRecordingWarningNoMovie = 1028, + MovieRecordingWarningRequirements = 1029, + MovieRecordingWarningCompressing = 1030, + NoChallengeModeReward = 1031, + ClaimedChallengeModeReward = 1032, + ChallengeModePeriodResetSs = 1033, + CantDoThatChallengeModeActive = 1034, + TalentFailedRestArea = 1035, + CannotAbandonLastPet = 1036, + TestCvarSetSss = 1037, + QuestTurnInFailReason = 1038, + ClaimedChallengeModeRewardOld = 1039, + TalentGrantedByAura = 1040, + ChallengeModeAlreadyComplete = 1041, + GlyphTargetNotAvailable = 1042, + PvpWarmodeToggleOn = 1043, + PvpWarmodeToggleOff = 1044, + SpellFailedLevelRequirement = 1045, + SpellFailedCantFlyHere = 1046, + BattlegroundJoinRequiresLevel = 1047, + BattlegroundJoinDisqualified = 1048, + BattlegroundJoinDisqualifiedNoName = 1049, + VoiceChatGenericUnableToConnect = 1050, + VoiceChatServiceLost = 1051, + VoiceChatChannelNameTooShort = 1052, + VoiceChatChannelNameTooLong = 1053, + VoiceChatChannelAlreadyExists = 1054, + VoiceChatTargetNotFound = 1055, + VoiceChatTooManyRequests = 1056, + VoiceChatPlayerSilenced = 1057, + VoiceChatParentalDisableAll = 1058, + VoiceChatDisabled = 1059, + NoPvpReward = 1060, + ClaimedPvpReward = 1061, + AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1062, + AzeriteEssenceSelectionFailedCantRemoveEssence = 1063, + AzeriteEssenceSelectionFailedConditionFailed = 1064, + AzeriteEssenceSelectionFailedRestArea = 1065, + AzeriteEssenceSelectionFailedSlotLocked = 1066, + AzeriteEssenceSelectionFailedNotAtForge = 1067, + AzeriteEssenceSelectionFailedHeartLevelTooLow = 1068, + AzeriteEssenceSelectionFailedNotEquipped = 1069, + SocketingRequiresPunchcardredGem = 1070, + SocketingPunchcardredGemOnlyInPunchcardredslot = 1071, + SocketingRequiresPunchcardyellowGem = 1072, + SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1073, + SocketingRequiresPunchcardblueGem = 1074, + SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1075, + SocketingRequiresDominationShard = 1076, + SocketingDominationShardOnlyInDominationslot = 1077, + SocketingRequiresCypherGem = 1078, + SocketingCypherGemOnlyInCypherslot = 1079, + SocketingRequiresTinkerGem = 1080, + SocketingTinkerGemOnlyInTinkerslot = 1081, + SocketingRequiresPrimordialGem = 1082, + SocketingPrimordialGemOnlyInPrimordialslot = 1083, + LevelLinkingResultLinked = 1084, + LevelLinkingResultUnlinked = 1085, + ClubFinderErrorPostClub = 1086, + ClubFinderErrorApplyClub = 1087, + ClubFinderErrorRespondApplicant = 1088, + ClubFinderErrorCancelApplication = 1089, + ClubFinderErrorTypeAcceptApplication = 1090, + ClubFinderErrorTypeNoInvitePermissions = 1091, + ClubFinderErrorTypeNoPostingPermissions = 1092, + ClubFinderErrorTypeApplicantList = 1093, + ClubFinderErrorTypeApplicantListNoPerm = 1094, + ClubFinderErrorTypeFinderNotAvailable = 1095, + ClubFinderErrorTypeGetPostingIds = 1096, + ClubFinderErrorTypeJoinApplication = 1097, + ClubFinderErrorTypeRealmNotEligible = 1098, + ClubFinderErrorTypeFlaggedRename = 1099, + ClubFinderErrorTypeFlaggedDescriptionChange = 1100, + ItemInteractionNotEnoughGold = 1101, + ItemInteractionNotEnoughCurrency = 1102, + ItemInteractionNoConversionOutput = 1103, + PlayerChoiceErrorPendingChoice = 1104, + SoulbindInvalidConduit = 1105, + SoulbindInvalidConduitItem = 1106, + SoulbindInvalidTalent = 1107, + SoulbindDuplicateConduit = 1108, + ActivateSoulbindS = 1109, + ActivateSoulbindFailedRestArea = 1110, + CantUseProfanity = 1111, + NotInPetBattle = 1112, + NotInNpe = 1113, + NoSpec = 1114, + NoDominationshardOverwrite = 1115, + UseWeeklyRewardsDisabled = 1116, + CrossFactionGroupJoined = 1117, + CantTargetUnfriendlyInOverworld = 1118, + EquipablespellsSlotsFull = 1119, + ItemModAppearanceGroupAlreadyKnown = 1120, + CantBulkSellItemWithRefund = 1121, + WowLabsPartyErrorTypePartyIsFull = 1122, + WowLabsPartyErrorTypeMaxInviteSent = 1123, + WowLabsPartyErrorTypePlayerAlreadyInvited = 1124, + WowLabsPartyErrorTypePartyInviteInvalid = 1125, + WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1126, + WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1127 } public enum SceneFlags diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 9c184c60c..f40ae3346 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -551,6 +551,7 @@ namespace Framework.Constants ModRequiredMountCapabilityFlags = 541, Unk542 = 542, Unk543 = 543, + Unk544 = 544, Total } diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 831122ce7..e240265a9 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -35,25 +35,31 @@ namespace Framework.Database "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? "); PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?"); PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); - PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, " + - "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id " + - "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " + + "WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); + PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor, cd.genitive " + + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid " + + "WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); PrepareStatement(CharStatements.SEL_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " + "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY cc.guid, cc.chrCustomizationOptionID"); PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); - PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, " + - "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id " + - "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + - "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 " + + "WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); + PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, " + + "c.personalTabardEmblemStyle, c.personalTabardEmblemColor, c.personalTabardBorderStyle, c.personalTabardBorderColor, c.personalTabardBackgroundColor, cd.genitive" + + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.summonedPetNumber = cp.id LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid " + + "WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_CUSTOMIZATIONS, "SELECT cc.guid, cc.chrCustomizationOptionID, cc.chrCustomizationChoiceID FROM character_customizations cc " + "LEFT JOIN characters c ON cc.guid = c.guid WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL ORDER BY cc.guid, cc.chrCustomizationOptionID"); @@ -71,7 +77,8 @@ namespace Framework.Database "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + "health, power1, power2, power3, power4, power5, power6, power7, power8, power9, power10, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, " + - "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + + "raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs, " + + "personalTabardEmblemStyle, personalTabardEmblemColor, personalTabardBorderStyle, personalTabardBorderColor, personalTabardBackgroundColor " + "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_CUSTOMIZATIONS, "SELECT chrCustomizationOptionID, chrCustomizationChoiceID FROM character_customizations WHERE guid = ? ORDER BY chrCustomizationOptionID"); @@ -248,7 +255,7 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?"); PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?"); PrepareStatement(CharStatements.INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?"); + PrepareStatement(CharStatements.DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?"); PrepareStatement(CharStatements.DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?"); PrepareStatement(CharStatements.INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)"); @@ -312,7 +319,7 @@ namespace Framework.Database // Equipmentsets PrepareStatement(CharStatements.UPD_EQUIP_SET, "UPDATE character_equipmentsets SET name=?, iconname=?, ignore_mask=?, AssignedSpecIndex=?, item0=?, item1=?, item2=?, item3=?, " + - "item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, " + + "item4=?, item5=?, item6=?, item7=?, item8=?, item9=?, item10=?, item11=?, item12=?, item13=?, item14=?, item15=?, item16=?, " + "item17=?, item18=? WHERE guid=? AND setguid=? AND setindex=?"); PrepareStatement(CharStatements.INS_EQUIP_SET, "INSERT INTO character_equipmentsets (guid, setguid, setindex, name, iconname, ignore_mask, AssignedSpecIndex, item0, item1, item2, item3, " + "item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18) " + diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index 5e47f9086..199160922 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -270,13 +270,13 @@ namespace Framework.Database // ChrCustomizationDisplayInfo.db2 PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_DISPLAY_INFO, "SELECT ID, ShapeshiftFormID, DisplayID, BarberShopMinCameraDistance, " + - "BarberShopHeightOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?"); + "BarberShopHeightOffset, BarberShopCameraZoomOffset FROM chr_customization_display_info WHERE (`VerifiedBuild` > 0) = ?"); // ChrCustomizationElement.db2 PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, " + "ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, " + - "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID, ParticleColorID" + - " FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?"); + "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID, AnimKitID, ParticleColorID, " + + "ChrCustGeoComponentLinkID FROM chr_customization_element WHERE (`VerifiedBuild` > 0) = ?"); // ChrCustomizationOption.db2 PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_OPTION, "SELECT Name, ID, SecondaryID, Flags, ChrModelID, SortIndex, ChrCustomizationCategoryID, " + @@ -357,8 +357,8 @@ namespace Framework.Database " WHERE (`VerifiedBuild` > 0) = ?"); // ConversationLine.db2 - PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " + - "AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, Unused1020, SpellVisualKitID, AdditionalDuration, " + + "NextConversationLineID, AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line WHERE (`VerifiedBuild` > 0) = ?"); // CorruptionEffects.db2 PrepareStatement(HotfixStatements.SEL_CORRUPTION_EFFECTS, "SELECT ID, MinCorruption, Aura, PlayerConditionID, Flags FROM corruption_effects" + @@ -1121,6 +1121,10 @@ namespace Framework.Database // SceneScriptText.db2 PrepareStatement(HotfixStatements.SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text WHERE (`VerifiedBuild` > 0) = ?"); + // ServerMessages.db2 + PrepareStatement(HotfixStatements.SEL_SERVER_MESSAGES, "SELECT ID, `Text` FROM server_messages WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_SERVER_MESSAGES_LOCALE, "SELECT ID, Text_lang FROM server_messages_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); + // SkillLine.db2 PrepareStatement(HotfixStatements.SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " + "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID, ExpansionNameSharedStringID, " + @@ -1305,10 +1309,9 @@ namespace Framework.Database "ShapeshiftMask2 FROM spell_shapeshift WHERE (`VerifiedBuild` > 0) = ?"); // SpellShapeshiftForm.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureType, Flags, AttackIconFileID, BonusActionBar, CombatRoundTime, " + - "DamageVariance, MountTypeID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, " + - "PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form" + - " WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureDisplayID, CreatureType, Flags, AttackIconFileID, BonusActionBar, " + + "CombatRoundTime, DamageVariance, MountTypeID, PresetSpellID1, PresetSpellID2, PresetSpellID3, PresetSpellID4, PresetSpellID5, " + + "PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT_FORM_LOCALE, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?"); @@ -2119,6 +2122,9 @@ namespace Framework.Database SEL_SCENE_SCRIPT_TEXT, + SEL_SERVER_MESSAGES, + SEL_SERVER_MESSAGES_LOCALE, + SEL_SKILL_LINE, SEL_SKILL_LINE_LOCALE, diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 071b8e497..192806106 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -153,6 +153,7 @@ namespace Game.Achievements case CriteriaType.DamageDealt: case CriteriaType.HealingDone: case CriteriaType.EarnArtifactXPForAzeriteItem: + case CriteriaType.GainLevels: SetCriteriaProgress(criteria, miscValue1, referencePlayer, ProgressType.Accumulate); break; case CriteriaType.KillCreature: @@ -458,7 +459,7 @@ namespace Game.Achievements } else _startedCriteria[key] -= timeDiff; - } + } } public void StartCriteria(CriteriaStartEvent startEvent, uint entry, TimeSpan timeLost = default) @@ -799,6 +800,7 @@ namespace Game.Achievements case CriteriaType.CompleteAnyReplayQuest: case CriteriaType.BuyItemsFromVendors: case CriteriaType.SellItemsToVendors: + case CriteriaType.GainLevels: return progress.Counter >= requiredAmount; case CriteriaType.EarnAchievement: case CriteriaType.CompleteQuest: @@ -932,6 +934,7 @@ namespace Game.Achievements case CriteriaType.CompleteAnyReplayQuest: case CriteriaType.BuyItemsFromVendors: case CriteriaType.SellItemsToVendors: + case CriteriaType.GainLevels: if (miscValue1 == 0) return false; break; @@ -3291,6 +3294,15 @@ namespace Game.Achievements case 149: // Shadowlands Season 2 End // timestamp = unknown break; + case 349: // Dragonflight Season 3 Start (pre-season) + eventTimestamp = 1699340400L; // November 7, 2023 8:00 + break; + case 350: // Dragonflight Season 3 Start + eventTimestamp = 1699945200L; // November 14, 2023 8:00 + break; + case 352: // Dragonflight Season 3 End + // eventTimestamp = time_t(); unknown + break; default: break; } @@ -3668,6 +3680,13 @@ namespace Game.Achievements if (referencePlayer.GetPositionZ() >= reqValue) return false; break; + case ModifierTreeType.PlayerIsOnMapWithExpansion: // 380 + { + var mapEntry = referencePlayer.GetMap().GetEntry(); + if (mapEntry.ExpansionID != reqValue) + return false; + break; + } default: return false; } @@ -3706,8 +3725,8 @@ namespace Game.Achievements MultiMap[] _scenarioCriteriasByTypeAndScenarioId = new MultiMap[(int)CriteriaType.Count]; MultiMap _questObjectiveCriteriasByType = new(); - MultiMap[] _criteriasByStartEvent = new MultiMap[(int)CriteriaStartEvent.Max]; - MultiMap[] _criteriasByFailEvent = new MultiMap[(int)CriteriaFailEvent.Max]; + MultiMap[] _criteriasByStartEvent = new MultiMap[(int)CriteriaStartEvent.Count]; + MultiMap[] _criteriasByFailEvent = new MultiMap[(int)CriteriaFailEvent.Count]; CriteriaManager() { @@ -3717,10 +3736,10 @@ namespace Game.Achievements _scenarioCriteriasByTypeAndScenarioId[i] = new MultiMap(); } - for (var i = 0; i < (int)CriteriaStartEvent.Max; ++i) + for (var i = 0; i < (int)CriteriaStartEvent.Count; ++i) _criteriasByStartEvent[i] = new(); - for (var i = 0; i < (int)CriteriaFailEvent.Max; ++i) + for (var i = 0; i < (int)CriteriaFailEvent.Count; ++i) _criteriasByFailEvent[i] = new(); } @@ -3836,7 +3855,7 @@ namespace Game.Achievements _criteriaTreeByCriteria.Add(pair.Value.Entry.CriteriaID, pair.Value); } - for (var i = 0; i < (int)CriteriaFailEvent.Max; ++i) + for (var i = 0; i < (int)CriteriaFailEvent.Count; ++i) _criteriasByFailEvent[i] = new MultiMap(); // Load criteria @@ -3846,10 +3865,9 @@ namespace Game.Achievements uint questObjectiveCriterias = 0; foreach (CriteriaRecord criteriaEntry in CliDB.CriteriaStorage.Values) { - Cypher.Assert(criteriaEntry.Type < CriteriaType.Count, - $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.Type + 1} but is currently equal to {CriteriaType.Count}"); - Cypher.Assert(criteriaEntry.StartEvent < (byte)CriteriaStartEvent.Max, $"CRITERIA_TYPE_TOTAL must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaStartEvent.Max}"); - Cypher.Assert(criteriaEntry.FailEvent < (byte)CriteriaFailEvent.Max, $"CRITERIA_CONDITION_MAX must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaFailEvent.Max}"); + Cypher.Assert(criteriaEntry.Type < CriteriaType.Count, $"CriteriaType.Count must be greater than or equal to {criteriaEntry.Type + 1} but is currently equal to {CriteriaType.Count}"); + Cypher.Assert(criteriaEntry.StartEvent < (byte)CriteriaStartEvent.Count, $"CriteriaStartEvent.Count must be greater than or equal to {criteriaEntry.StartEvent + 1} but is currently equal to {CriteriaStartEvent.Count}"); + Cypher.Assert(criteriaEntry.FailEvent < (byte)CriteriaFailEvent.Count, $"CriteriaFailEvent.Count must be greater than or equal to {criteriaEntry.FailEvent + 1} but is currently equal to {CriteriaFailEvent.Count}"); var treeList = _criteriaTreeByCriteria.LookupByKey(criteriaEntry.Id); if (treeList.Empty()) @@ -4086,7 +4104,7 @@ namespace Game.Achievements { return _criteriasByFailEvent[(int)failEvent].LookupByKey(asset); } - + public List GetGuildCriteriaByType(CriteriaType type) { return _guildCriteriasByType.LookupByKey(type); diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 34b5725e3..03f15688b 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -281,6 +281,7 @@ namespace Game.DataStorage SceneScriptGlobalTextStorage = ReadDB2("SceneScriptGlobalText.db2", HotfixStatements.SEL_SCENE_SCRIPT_GLOBAL_TEXT); SceneScriptPackageStorage = ReadDB2("SceneScriptPackage.db2", HotfixStatements.SEL_SCENE_SCRIPT_PACKAGE); SceneScriptTextStorage = ReadDB2("SceneScriptText.db2", HotfixStatements.SEL_SCENE_SCRIPT_TEXT); + ServerMessagesStorage = ReadDB2("ServerMessages.db2", HotfixStatements.SEL_SERVER_MESSAGES, HotfixStatements.SEL_SERVER_MESSAGES_LOCALE); SkillLineStorage = ReadDB2("SkillLine.db2", HotfixStatements.SEL_SKILL_LINE, HotfixStatements.SEL_SKILL_LINE_LOCALE); SkillLineAbilityStorage = ReadDB2("SkillLineAbility.db2", HotfixStatements.SEL_SKILL_LINE_ABILITY); SkillLineXTraitTreeStorage = ReadDB2("SkillLineXTraitTree.db2", HotfixStatements.SEL_SKILL_LINE_X_TRAIT_TREE); @@ -715,6 +716,7 @@ namespace Game.DataStorage public static DB6Storage SceneScriptGlobalTextStorage; public static DB6Storage SceneScriptPackageStorage; public static DB6Storage SceneScriptTextStorage; + public static DB6Storage ServerMessagesStorage; public static DB6Storage SkillLineStorage; public static DB6Storage SkillLineAbilityStorage; public static DB6Storage SkillLineXTraitTreeStorage; diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs index a25bef2cb..e8deb8b03 100644 --- a/Source/Game/DataStorage/Structs/A_Records.cs +++ b/Source/Game/DataStorage/Structs/A_Records.cs @@ -146,7 +146,7 @@ namespace Game.DataStorage public Vector3 Pos; public uint Id; public ushort ContinentID; - public sbyte PhaseUseFlags; + public int PhaseUseFlags; public ushort PhaseID; public ushort PhaseGroupID; public float Radius; diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index 5dc29f68d..bd06362a5 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -163,6 +163,7 @@ namespace Game.DataStorage public uint DisplayID; public float BarberShopMinCameraDistance; public float BarberShopHeightOffset; + public float BarberShopCameraZoomOffset; } public sealed class ChrCustomizationElementRecord @@ -180,6 +181,7 @@ namespace Game.DataStorage public int ChrCustomizationVoiceID; public int AnimKitID; public int ParticleColorID; + public int ChrCustGeoComponentLinkID; } public sealed class ChrCustomizationOptionRecord @@ -422,6 +424,7 @@ namespace Game.DataStorage { public uint Id; public uint BroadcastTextID; + public uint Unused1020; public uint SpellVisualKitID; public int AdditionalDuration; public ushort NextConversationLineID; diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs index 5d6690aa2..02105fae5 100644 --- a/Source/Game/DataStorage/Structs/M_Records.cs +++ b/Source/Game/DataStorage/Structs/M_Records.cs @@ -234,7 +234,7 @@ namespace Game.DataStorage public byte KeyID; public uint AudioFileDataID; public uint SubtitleFileDataID; - public int SubtitleFileFormat; + public uint SubtitleFileFormat; } public sealed class MythicPlusSeasonRecord diff --git a/Source/Game/DataStorage/Structs/P_Records.cs b/Source/Game/DataStorage/Structs/P_Records.cs index 46606f694..3b47497ba 100644 --- a/Source/Game/DataStorage/Structs/P_Records.cs +++ b/Source/Game/DataStorage/Structs/P_Records.cs @@ -66,7 +66,7 @@ namespace Game.DataStorage public int MaxAvgItemLevel; public ushort MinAvgEquippedItemLevel; public ushort MaxAvgEquippedItemLevel; - public byte PhaseUseFlags; + public int PhaseUseFlags; public ushort PhaseID; public uint PhaseGroupID; public int Flags; diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs index a12de8dd8..8c308d5d1 100644 --- a/Source/Game/DataStorage/Structs/S_Records.cs +++ b/Source/Game/DataStorage/Structs/S_Records.cs @@ -68,6 +68,12 @@ namespace Game.DataStorage public string Script; } + public sealed class ServerMessagesRecord + { + public uint Id; + public LocalizedString Text; + } + public sealed class SkillLineRecord { public LocalizedString DisplayName; @@ -544,6 +550,7 @@ namespace Game.DataStorage { public uint Id; public string Name; + public uint CreatureDisplayID; public sbyte CreatureType; public SpellShapeshiftFormFlags Flags; public int AttackIconFileID; @@ -551,7 +558,6 @@ namespace Game.DataStorage public ushort CombatRoundTime; public float DamageVariance; public ushort MountTypeID; - public uint[] CreatureDisplayID = new uint[4]; public uint[] PresetSpellID = new uint[SpellConst.MaxShapeshift]; } diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs index ddd4f9b03..f367781ba 100644 --- a/Source/Game/DataStorage/Structs/U_Records.cs +++ b/Source/Game/DataStorage/Structs/U_Records.cs @@ -12,7 +12,7 @@ namespace Game.DataStorage public uint Id; public int ParentUiMapID; public int Flags; - public byte System; + public sbyte System; public UiMapType Type; public int BountySetID; public uint BountyDisplayLocation; diff --git a/Source/Game/Entities/Conversation.cs b/Source/Game/Entities/Conversation.cs index 6d5f16946..40e5e4d80 100644 --- a/Source/Game/Entities/Conversation.cs +++ b/Source/Game/Entities/Conversation.cs @@ -127,15 +127,16 @@ namespace Game.Entities if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.ConversationLine, line.Id, creator)) continue; + var convoLine = CliDB.ConversationLineStorage.LookupByKey(line.Id); // never null for conversationTemplate->Lines + ConversationLine lineField = new(); lineField.ConversationLineID = line.Id; + lineField.BroadcastTextID = convoLine.BroadcastTextID; lineField.UiCameraID = line.UiCameraID; lineField.ActorIndex = line.ActorIdx; lineField.Flags = line.Flags; lineField.ChatType = line.ChatType; - ConversationLineRecord convoLine = CliDB.ConversationLineStorage.LookupByKey(line.Id); // never null for conversationTemplate->Lines - for (Locale locale = Locale.enUS; locale < Locale.Total; locale = locale + 1) { if (locale == Locale.None) diff --git a/Source/Game/Entities/Object/Update/UpdateField.cs b/Source/Game/Entities/Object/Update/UpdateField.cs index 8f55a84a5..d616012b0 100644 --- a/Source/Game/Entities/Object/Update/UpdateField.cs +++ b/Source/Game/Entities/Object/Update/UpdateField.cs @@ -126,6 +126,43 @@ namespace Game.Entities public bool HasValue() { return _hasValue; } } + public class UpdateFieldArrayString + { + public string[] _values; + public int FirstElementBit; + public int Bit; + + public UpdateFieldArrayString(uint size, int bit, int firstElementBit) + { + _values = new string[size]; + for (var i = 0; i < size; ++i) + _values[i] = ""; + + Bit = bit; + FirstElementBit = firstElementBit; + } + + public string this[int index] + { + get + { + return _values[index]; + } + set + { + _values[index] = value; + } + } + + public int GetSize() { return _values.Length; } + + public IEnumerator GetEnumerator() + { + foreach (var obj in _values) + yield return obj; + } + } + public class UpdateFieldArray where T : new() { public T[] _values; @@ -404,6 +441,8 @@ namespace Game.Entities } } + public void ClearChangesMask(UpdateFieldArrayString updateField) { } + public void ClearChangesMask(DynamicUpdateField updateField) where U : new() { if (typeof(IHasChangesMask).IsAssignableFrom(typeof(U))) @@ -421,24 +460,30 @@ namespace Game.Entities return updateField; } - public OptionalUpdateField ModifyValue(OptionalUpdateField updateField) where U : new() - { - MarkChanged(updateField); - return updateField; - } - public UpdateFieldString ModifyValue(UpdateFieldString updateField) { MarkChanged(updateField); return updateField; } + public OptionalUpdateField ModifyValue(OptionalUpdateField updateField) where U : new() + { + MarkChanged(updateField); + return updateField; + } + public ref U ModifyValue(UpdateFieldArray updateField, int index) where U : new() { MarkChanged(updateField, index); return ref updateField._values[index]; } + public ref string ModifyValue(UpdateFieldArrayString updateField, int index) + { + MarkChanged(updateField, index); + return ref updateField._values[index]; + } + public DynamicUpdateField ModifyValue(DynamicUpdateField updateField) where U : new() { _changesMask.Set(updateField.BlockBit); @@ -486,6 +531,12 @@ namespace Game.Entities _changesMask.Set(updateField.FirstElementBit + index); } + public void MarkChanged(UpdateFieldArrayString updateField, int index) + { + _changesMask.Set(updateField.Bit); + _changesMask.Set(updateField.FirstElementBit + index); + } + public void WriteCompleteDynamicFieldUpdateMask(int size, WorldPacket data, int bitsForSize = 32) { data.WriteBits(size, bitsForSize); diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index d5b86012c..c0a40a0e5 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -285,7 +285,7 @@ namespace Game.Entities { Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver); } - } + } } data.FlushBits(); } @@ -1047,15 +1047,17 @@ namespace Game.Entities { public UpdateField ItemID = new(0, 1); public UpdateField SecondaryItemModifiedAppearanceID = new(0, 2); - public UpdateField ItemAppearanceModID = new(0, 3); - public UpdateField ItemVisual = new(0, 4); + public UpdateField ConditionalItemAppearanceID = new(0, 3); + public UpdateField ItemAppearanceModID = new(0, 4); + public UpdateField ItemVisual = new(0, 5); - public VisibleItem() : base(5) { } + public VisibleItem() : base(6) { } public void WriteCreate(WorldPacket data, Unit owner, Player receiver) { data.WriteUInt32(ItemID); data.WriteUInt32(SecondaryItemModifiedAppearanceID); + data.WriteInt32(ConditionalItemAppearanceID); data.WriteUInt16(ItemAppearanceModID); data.WriteUInt16(ItemVisual); } @@ -1066,7 +1068,7 @@ namespace Game.Entities if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 5); + data.WriteBits(changesMask.GetBlock(0), 6); data.FlushBits(); if (changesMask[0]) @@ -1081,9 +1083,13 @@ namespace Game.Entities } if (changesMask[3]) { - data.WriteUInt16(ItemAppearanceModID); + data.WriteInt32(ConditionalItemAppearanceID); } if (changesMask[4]) + { + data.WriteUInt16(ItemAppearanceModID); + } + if (changesMask[5]) { data.WriteUInt16(ItemVisual); } @@ -1094,6 +1100,7 @@ namespace Game.Entities { ClearChangesMask(ItemID); ClearChangesMask(SecondaryItemModifiedAppearanceID); + ClearChangesMask(ConditionalItemAppearanceID); ClearChangesMask(ItemAppearanceModID); ClearChangesMask(ItemVisual); _changesMask.ResetAll(); @@ -2582,56 +2589,189 @@ namespace Game.Entities } } + public class DeclinedNames : HasChangesMask + { + public UpdateFieldArrayString Name = new(5, 0, 1); + + public DeclinedNames() : base(6) { } + + public void WriteCreate(WorldPacket data, Player owner, Player receiver) + { + for (int i = 0; i < 5; ++i) + { + data.WriteBits(Name[i].GetByteCount(), 10); + } + data.FlushBits(); + for (int i = 0; i < 5; ++i) + { + data.WriteString(Name[i]); + } + data.FlushBits(); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlocksMask(0), 1); + if (changesMask.GetBlock(0) != 0) + data.WriteBits(changesMask.GetBlock(0), 32); + + data.FlushBits(); + if (changesMask[0]) + { + for (int i = 0; i < 5; ++i) + { + if (changesMask[1 + i]) + { + data.WriteBits(Name[i].GetByteCount(), 10); + } + } + } + data.FlushBits(); + if (changesMask[0]) + { + for (int i = 0; i < 5; ++i) + { + if (changesMask[1 + i]) + { + data.WriteString(Name[i]); + } + } + } + data.FlushBits(); + } + + public override void ClearChangesMask() + { + ClearChangesMask(Name); + _changesMask.ResetAll(); + } + } + + public class CustomTabardInfo : HasChangesMask + { + public UpdateField EmblemStyle = new(0, 1); + public UpdateField EmblemColor = new(0, 2); + public UpdateField BorderStyle = new(0, 3); + public UpdateField BorderColor = new(0, 4); + public UpdateField BackgroundColor = new(0, 5); + + public CustomTabardInfo() : base(6) { } + + public void WriteCreate(WorldPacket data, Player owner, Player receiver) + { + data.WriteInt32(EmblemStyle); + data.WriteInt32(EmblemColor); + data.WriteInt32(BorderStyle); + data.WriteInt32(BorderColor); + data.WriteInt32(BackgroundColor); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 6); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteInt32(EmblemStyle); + } + if (changesMask[2]) + { + data.WriteInt32(EmblemColor); + } + if (changesMask[3]) + { + data.WriteInt32(BorderStyle); + } + if (changesMask[4]) + { + data.WriteInt32(BorderColor); + } + if (changesMask[5]) + { + data.WriteInt32(BackgroundColor); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(EmblemStyle); + ClearChangesMask(EmblemColor); + ClearChangesMask(BorderStyle); + ClearChangesMask(BorderColor); + ClearChangesMask(BackgroundColor); + _changesMask.ResetAll(); + } + } + public class PlayerData : HasChangesMask { public UpdateField HasQuestSession = new(0, 1); public UpdateField HasLevelLink = new(0, 2); public DynamicUpdateField Customizations = new(0, 3); - public DynamicUpdateField QuestSessionQuestLog = new(0, 4); - public DynamicUpdateField ArenaCooldowns = new(0, 5); - public DynamicUpdateField VisualItemReplacements = new(0, 6); - public UpdateField DuelArbiter = new(0, 7); - public UpdateField WowAccount = new(0, 8); - public UpdateField LootTargetGUID = new(0, 9); - public UpdateField PlayerFlags = new(0, 10); - public UpdateField PlayerFlagsEx = new(0, 11); - public UpdateField GuildRankID = new(0, 12); - public UpdateField GuildDeleteDate = new(0, 13); - public UpdateField GuildLevel = new(0, 14); - public UpdateField NativeSex = new(0, 15); - public UpdateField Inebriation = new(0, 16); - public UpdateField PvpTitle = new(0, 17); - public UpdateField ArenaFaction = new(0, 18); - public UpdateField DuelTeam = new(0, 19); - public UpdateField GuildTimeStamp = new(0, 20); - public UpdateField PlayerTitle = new(0, 21); - public UpdateField FakeInebriation = new(0, 22); - public UpdateField VirtualPlayerRealm = new(0, 23); - public UpdateField CurrentSpecID = new(0, 24); - public UpdateField TaxiMountAnimKitID = new(0, 25); - public UpdateField CurrentBattlePetBreedQuality = new(0, 26); - public UpdateField HonorLevel = new(0, 27); - public UpdateField LogoutTime = new(0, 28); - public UpdateField Field_B0 = new(0, 29); - public UpdateField Field_B4 = new(0, 30); - public UpdateField CurrentBattlePetSpeciesID = new(0, 31); - public UpdateField field_138 = new(32, 33); - public UpdateField CtrOptions = new(32, 34); - public UpdateField CovenantID = new(32, 35); - public UpdateField SoulbindID = new(32, 36); - public UpdateField DungeonScore = new(32, 37); - public UpdateFieldArray PartyType = new(2, 38, 39); - public UpdateFieldArray QuestLog = new(175, 41, 42); - public UpdateFieldArray VisibleItems = new(19, 217, 218); - public UpdateFieldArray AvgItemLevel = new(6, 237, 238); - public UpdateFieldArray Field_3120 = new(19, 244, 245); + public DynamicUpdateField QaCustomizations = new(0, 4); + public DynamicUpdateField QuestSessionQuestLog = new(0, 5); + public DynamicUpdateField ArenaCooldowns = new(0, 6); + public DynamicUpdateField VisualItemReplacements = new(0, 7); + public UpdateField DuelArbiter = new(0, 8); + public UpdateField WowAccount = new(0, 9); + public UpdateField BnetAccount = new(0, 10); + public UpdateField GuildClubMemberID = new(0, 11); + public UpdateField LootTargetGUID = new(0, 12); + public UpdateField PlayerFlags = new(0, 13); + public UpdateField PlayerFlagsEx = new(0, 14); + public UpdateField GuildRankID = new(0, 15); + public UpdateField GuildDeleteDate = new(0, 16); + public UpdateField GuildLevel = new(0, 17); + public UpdateField NativeSex = new(0, 18); + public UpdateField Inebriation = new(0, 19); + public UpdateField PvpTitle = new(0, 20); + public UpdateField ArenaFaction = new(0, 21); + public UpdateField DuelTeam = new(0, 22); + public UpdateField GuildTimeStamp = new(0, 23); + public UpdateField PlayerTitle = new(0, 24); + public UpdateField FakeInebriation = new(0, 25); + public UpdateField VirtualPlayerRealm = new(0, 26); + public UpdateField CurrentSpecID = new(0, 27); + public UpdateField TaxiMountAnimKitID = new(0, 28); + public UpdateField CurrentBattlePetBreedQuality = new(0, 29); + public UpdateField HonorLevel = new(0, 30); + public UpdateField LogoutTime = new(0, 31); + public UpdateFieldString Name = new(32, 33); + public UpdateField Field_B0 = new(32, 34); + public UpdateField Field_B4 = new(32, 35); + public UpdateField CurrentBattlePetSpeciesID = new(32, 36); + public UpdateField CtrOptions = new(32, 37); + public UpdateField CovenantID = new(32, 38); + public UpdateField SoulbindID = new(32, 39); + public UpdateField DungeonScore = new(32, 40); + public OptionalUpdateField DeclinedNames = new(32, 41); + public UpdateField PersonalTabard = new(32, 42); + public UpdateFieldArray PartyType = new(2, 43, 44); + public UpdateFieldArray QuestLog = new(175, 46, 47); + public UpdateFieldArray VisibleItems = new(19, 222, 223); + public UpdateFieldArray AvgItemLevel = new(6, 242, 243); + public UpdateFieldArray Field_3120 = new(19, 249, 250); - public PlayerData() : base(0, TypeId.Player, 264) { } + public PlayerData() : base(0, TypeId.Player, 269) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { data.WritePackedGuid(DuelArbiter); data.WritePackedGuid(WowAccount); + data.WritePackedGuid(BnetAccount); + data.WriteUInt64(GuildClubMemberID); data.WritePackedGuid(LootTargetGUID); data.WriteUInt32(PlayerFlags); data.WriteUInt32(PlayerFlagsEx); @@ -2639,6 +2779,7 @@ namespace Game.Entities data.WriteUInt32(GuildDeleteDate); data.WriteUInt32(GuildLevel); data.WriteInt32(Customizations.Size()); + data.WriteInt32(QaCustomizations.Size()); for (int i = 0; i < 2; ++i) { data.WriteUInt8(PartyType[i]); @@ -2676,7 +2817,6 @@ namespace Game.Entities data.WriteInt32(Field_B0); data.WriteInt32(Field_B4); data.WriteInt32(CurrentBattlePetSpeciesID); - data.WritePackedGuid(field_138); ((CTROptions)CtrOptions).WriteCreate(data, owner, receiver); data.WriteInt32(CovenantID); data.WriteInt32(SoulbindID); @@ -2685,10 +2825,15 @@ namespace Game.Entities { data.WriteUInt32(Field_3120[i]); } + PersonalTabard.GetValue().WriteCreate(data, owner, receiver); for (int i = 0; i < Customizations.Size(); ++i) { Customizations[i].WriteCreate(data, owner, receiver); } + for (int i = 0; i < QaCustomizations.Size(); ++i) + { + QaCustomizations[i].WriteCreate(data, owner, receiver); + } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) { for (int i = 0; i < QuestSessionQuestLog.Size(); ++i) @@ -2704,18 +2849,26 @@ namespace Game.Entities { data.WriteInt32(VisualItemReplacements[i]); } + data.FlushBits(); + data.WriteBits(Name.GetValue().GetByteCount(), 6); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) { data.WriteBit(HasQuestSession); } data.WriteBit(HasLevelLink); + data.WriteBits(DeclinedNames.HasValue(), 1); DungeonScore._value.Write(data); + data.WriteString(Name); + if (DeclinedNames.HasValue()) + { + DeclinedNames.GetValue().WriteCreate(data, owner, receiver); + } data.FlushBits(); } public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { - UpdateMask allowedMaskForTarget = new(261, new[] { 0xFFFFFFEDu, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFC00000u, 0xFFFFFFFFu, 0x000000FFu }); + UpdateMask allowedMaskForTarget = new(261, [0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu]); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2723,12 +2876,12 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - allowedMaskForTarget.OR(new UpdateMask(261, new[] { 0x00000012u, 0xFFFFFE00u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x01FFFFFFu, 0x00000000u, 0x00000000u })); + allowedMaskForTarget.OR(new UpdateMask(261, new[] { 0x00000022u, 0xFFFFC000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x3FFFFFFFu, 0x00000000u, 0x00000000u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(261, new[] { 0xFFFFFFEDu, 0x000001FFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFE000000u, 0xFFFFFFFFu, 0x000000FFu }); + UpdateMask allowedMaskForTarget = new(261, new[] { 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask.AND(allowedMaskForTarget); } @@ -2759,20 +2912,27 @@ namespace Game.Entities WriteCompleteDynamicFieldUpdateMask(Customizations.Size(), data); } if (changesMask[4]) + { + if (!ignoreNestedChangesMask) + QaCustomizations.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(QaCustomizations.Size(), data); + } + if (changesMask[5]) { if (!ignoreNestedChangesMask) QuestSessionQuestLog.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(QuestSessionQuestLog.Size(), data); } - if (changesMask[5]) + if (changesMask[6]) { if (!ignoreNestedChangesMask) ArenaCooldowns.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ArenaCooldowns.Size(), data); } - if (changesMask[6]) + if (changesMask[7]) { if (!ignoreNestedChangesMask) VisualItemReplacements.WriteUpdateMask(data); @@ -2794,6 +2954,16 @@ namespace Game.Entities } } if (changesMask[4]) + { + for (int i = 0; i < QaCustomizations.Size(); ++i) + { + if (QaCustomizations.HasChanged(i) || ignoreNestedChangesMask) + { + QaCustomizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[5]) { for (int i = 0; i < QuestSessionQuestLog.Size(); ++i) { @@ -2806,7 +2976,7 @@ namespace Game.Entities } } } - if (changesMask[5]) + if (changesMask[6]) { for (int i = 0; i < ArenaCooldowns.Size(); ++i) { @@ -2816,7 +2986,7 @@ namespace Game.Entities } } } - if (changesMask[6]) + if (changesMask[7]) { for (int i = 0; i < VisualItemReplacements.Size(); ++i) { @@ -2826,145 +2996,170 @@ namespace Game.Entities } } } - if (changesMask[7]) + if (changesMask[8]) { data.WritePackedGuid(DuelArbiter); } - if (changesMask[8]) + if (changesMask[9]) { data.WritePackedGuid(WowAccount); } - if (changesMask[9]) - { - data.WritePackedGuid(LootTargetGUID); - } if (changesMask[10]) { - data.WriteUInt32(PlayerFlags); + data.WritePackedGuid(BnetAccount); } if (changesMask[11]) { - data.WriteUInt32(PlayerFlagsEx); + data.WriteUInt64(GuildClubMemberID); } if (changesMask[12]) { - data.WriteUInt32(GuildRankID); + data.WritePackedGuid(LootTargetGUID); } if (changesMask[13]) { - data.WriteUInt32(GuildDeleteDate); + data.WriteUInt32(PlayerFlags); } if (changesMask[14]) { - data.WriteUInt32(GuildLevel); + data.WriteUInt32(PlayerFlagsEx); } if (changesMask[15]) { - data.WriteUInt8(NativeSex); + data.WriteUInt32(GuildRankID); } if (changesMask[16]) { - data.WriteUInt8(Inebriation); + data.WriteUInt32(GuildDeleteDate); } if (changesMask[17]) { - data.WriteUInt8(PvpTitle); + data.WriteUInt32(GuildLevel); } if (changesMask[18]) { - data.WriteUInt8(ArenaFaction); + data.WriteUInt8(NativeSex); } if (changesMask[19]) { - data.WriteUInt32(DuelTeam); + data.WriteUInt32(Inebriation); } if (changesMask[20]) { - data.WriteInt32(GuildTimeStamp); + data.WriteInt32(PvpTitle); } if (changesMask[21]) { - data.WriteUInt32(PlayerTitle); + data.WriteUInt32(ArenaFaction); } if (changesMask[22]) { - data.WriteInt32(FakeInebriation); + data.WriteUInt32(DuelTeam); } if (changesMask[23]) { - data.WriteUInt32(VirtualPlayerRealm); + data.WriteInt32(GuildTimeStamp); } if (changesMask[24]) { - data.WriteUInt32(CurrentSpecID); + data.WriteUInt32(PlayerTitle); } if (changesMask[25]) { - data.WriteInt32(TaxiMountAnimKitID); + data.WriteInt32(FakeInebriation); } if (changesMask[26]) { - data.WriteUInt8(CurrentBattlePetBreedQuality); + data.WriteUInt32(VirtualPlayerRealm); } if (changesMask[27]) { - data.WriteUInt32(HonorLevel); + data.WriteUInt32(CurrentSpecID); } if (changesMask[28]) { - data.WriteInt64(LogoutTime); + data.WriteInt64(TaxiMountAnimKitID); } if (changesMask[29]) { - data.WriteInt32(Field_B0); + data.WriteInt32(CurrentBattlePetBreedQuality); } if (changesMask[30]) { - data.WriteInt32(Field_B4); + data.WriteUInt32(HonorLevel); } if (changesMask[31]) { - data.WriteInt32(CurrentBattlePetSpeciesID); + data.WriteInt64(LogoutTime); } } if (changesMask[32]) { - if (changesMask[33]) - { - data.WritePackedGuid(field_138); - } if (changesMask[34]) { - ((CTROptions)CtrOptions).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data.WriteInt32(Field_B0); } if (changesMask[35]) { - data.WriteInt32(CovenantID); + data.WriteInt32(Field_B4); } if (changesMask[36]) { - data.WriteInt32(SoulbindID); + data.WriteInt32(CurrentBattlePetSpeciesID); } if (changesMask[37]) + { + ((CTROptions)CtrOptions).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[38]) + { + data.WriteInt32(CovenantID); + } + if (changesMask[39]) + { + data.WriteInt32(SoulbindID); + } + if (changesMask[42]) + { + PersonalTabard.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[33]) + { + data.WriteBits(Name.GetValue().GetByteCount(), 32); + } + data.WriteBits(DeclinedNames.HasValue(), 1); + data.FlushBits(); + if (changesMask[40]) { DungeonScore.GetValue().Write(data); } + if (changesMask[33]) + { + data.WriteString(Name); + } + if (changesMask[41]) + { + if (DeclinedNames.HasValue()) + { + DeclinedNames.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[38]) + if (changesMask[43]) { for (int i = 0; i < 2; ++i) { - if (changesMask[39 + i]) + if (changesMask[44 + i]) { data.WriteUInt8(PartyType[i]); } } } - if (changesMask[41]) + if (changesMask[46]) { for (int i = 0; i < 175; ++i) { - if (changesMask[42 + i]) + if (changesMask[47 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2973,31 +3168,31 @@ namespace Game.Entities } } } - if (changesMask[217]) + if (changesMask[222]) { for (int i = 0; i < 19; ++i) { - if (changesMask[218 + i]) + if (changesMask[223 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[237]) + if (changesMask[242]) { for (int i = 0; i < 6; ++i) { - if (changesMask[238 + i]) + if (changesMask[243 + i]) { data.WriteFloat(AvgItemLevel[i]); } } } - if (changesMask[244]) + if (changesMask[249]) { for (int i = 0; i < 19; ++i) { - if (changesMask[245 + i]) + if (changesMask[250 + i]) { data.WriteUInt32(Field_3120[i]); } @@ -3011,11 +3206,14 @@ namespace Game.Entities ClearChangesMask(HasQuestSession); ClearChangesMask(HasLevelLink); ClearChangesMask(Customizations); + ClearChangesMask(QaCustomizations); ClearChangesMask(QuestSessionQuestLog); ClearChangesMask(ArenaCooldowns); ClearChangesMask(VisualItemReplacements); ClearChangesMask(DuelArbiter); ClearChangesMask(WowAccount); + ClearChangesMask(BnetAccount); + ClearChangesMask(GuildClubMemberID); ClearChangesMask(LootTargetGUID); ClearChangesMask(PlayerFlags); ClearChangesMask(PlayerFlagsEx); @@ -3036,14 +3234,16 @@ namespace Game.Entities ClearChangesMask(CurrentBattlePetBreedQuality); ClearChangesMask(HonorLevel); ClearChangesMask(LogoutTime); + ClearChangesMask(Name); ClearChangesMask(Field_B0); ClearChangesMask(Field_B4); ClearChangesMask(CurrentBattlePetSpeciesID); - ClearChangesMask(field_138); ClearChangesMask(CtrOptions); ClearChangesMask(CovenantID); ClearChangesMask(SoulbindID); ClearChangesMask(DungeonScore); + ClearChangesMask(DeclinedNames); + ClearChangesMask(PersonalTabard); ClearChangesMask(PartyType); ClearChangesMask(QuestLog); ClearChangesMask(VisibleItems); @@ -3520,7 +3720,7 @@ namespace Game.Entities _changesMask.ResetAll(); } } - + public class MawPower { public int Field_0; @@ -4310,10 +4510,12 @@ namespace Game.Entities } } - public class PersonalCraftingOrderCount : IEquatable + public class PersonalCraftingOrderCount : HasChangesMask { - public int ProfessionID; - public uint Count; + public UpdateField ProfessionID = new(0, 1); + public UpdateField Count = new(0, 2); + + public PersonalCraftingOrderCount() : base(3) { } public void WriteCreate(WorldPacket data, Player owner, Player receiver) { @@ -4323,13 +4525,28 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) { - data.WriteInt32(ProfessionID); - data.WriteUInt32(Count); + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 2); + + data.FlushBits(); + if (changesMask[0]) + { + data.WriteInt32(ProfessionID); + } + if (changesMask[1]) + { + data.WriteUInt32(Count); + } } - public bool Equals(PersonalCraftingOrderCount right) + public override void ClearChangesMask() { - return ProfessionID == right.ProfessionID && Count == right.Count; + ClearChangesMask(ProfessionID); + ClearChangesMask(Count); + _changesMask.ResetAll(); } } @@ -4563,7 +4780,7 @@ namespace Game.Entities _changesMask.ResetAll(); } } - + public struct Research { public short ResearchProjectID; @@ -4578,15 +4795,15 @@ namespace Game.Entities data.WriteInt16(ResearchProjectID); } } - + public class ActivePlayerData : HasChangesMask { public static int ExploredZonesSize; public static int ExploredZonesBits; public static int QuestCompletedBitsSize; public static int QuestCompletedBitsPerBlock; - - static int changeMaskLength = 1619; + + static int changeMaskLength = 1616; public UpdateField BackpackAutoSortDisabled = new(0, 1); public UpdateField BackpackSellJunkDisabled = new(0, 2); @@ -4693,48 +4910,46 @@ namespace Game.Entities public UpdateField OverrideSpellsID = new(102, 109); public UpdateField LootSpecID = new(102, 110); public UpdateField OverrideZonePVPType = new(102, 111); - public UpdateField BnetAccount = new(102, 112); - public UpdateField GuildClubMemberID = new(102, 113); - public UpdateField Honor = new(102, 114); - public UpdateField HonorNextLevel = new(102, 115); - public UpdateField PerksProgramCurrency = new(102, 116); - public UpdateField NumBankSlots = new(102, 117); - public UpdateField ResearchHistory = new(102, 118); - public UpdateField FrozenPerksVendorItem = new(102, 119); - public UpdateField Field_1410 = new(102, 121); - public OptionalUpdateField QuestSession = new(102, 120); - public UpdateField UiChromieTimeExpansionID = new(102, 122); - public UpdateField TransportServerTime = new(102, 123); - public UpdateField WeeklyRewardsPeriodSinceOrigin = new(102, 124); // week count since Cfg_RegionsEntry::ChallengeOrigin - public UpdateField DEBUGSoulbindConduitRank = new(102, 125); - public UpdateField DungeonScore = new(102, 126); - public UpdateField ActiveCombatTraitConfigID = new(102, 127); - public UpdateField ItemUpgradeHighOnehandWeaponItemID = new(102, 128); - public UpdateField ItemUpgradeHighFingerItemID = new(102, 129); - public UpdateField ItemUpgradeHighFingerWatermark = new(102, 130); - public UpdateField ItemUpgradeHighTrinketItemID = new(102, 131); - public UpdateField ItemUpgradeHighTrinketWatermark = new(102, 132); - public UpdateField LootHistoryInstanceID = new(102, 133); - public OptionalUpdateField PetStable = new(134, 135); - public UpdateField RequiredMountCapabilityFlags = new(134, 136); - public UpdateFieldArray InvSlots = new(227, 137, 138); - public UpdateFieldArray ExploredZones = new(240, 365, 366); - public UpdateFieldArray RestInfo = new(2, 606, 607); - public UpdateFieldArray ModDamageDonePos = new(7, 609, 610); - public UpdateFieldArray ModDamageDoneNeg = new(7, 609, 617); - public UpdateFieldArray ModDamageDonePercent = new(7, 609, 624); - public UpdateFieldArray ModHealingDonePercent = new(7, 609, 631); - public UpdateFieldArray WeaponDmgMultipliers = new(3, 638, 639); - public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 638, 642); - public UpdateFieldArray BuybackPrice = new(12, 645, 646); - public UpdateFieldArray BuybackTimestamp = new(12, 645, 658); - public UpdateFieldArray CombatRatings = new(32, 670, 671); - public UpdateFieldArray NoReagentCostMask = new(4, 703, 704); - public UpdateFieldArray ProfessionSkillLine = new(2, 708, 709); - public UpdateFieldArray BagSlotFlags = new(5, 711, 712); - public UpdateFieldArray BankBagSlotFlags = new(7, 717, 718); - public UpdateFieldArray QuestCompleted = new(875, 725, 726); - public UpdateFieldArray ItemUpgradeHighWatermark = new(17, 1601, 1602); + public UpdateField Honor = new(102, 112); + public UpdateField HonorNextLevel = new(102, 113); + public UpdateField PerksProgramCurrency = new(102, 114); + public UpdateField NumBankSlots = new(102, 115); + public UpdateField ResearchHistory = new(102, 116); + public UpdateField FrozenPerksVendorItem = new(102, 117); + public UpdateField Field_1410 = new(102, 119); + public OptionalUpdateField QuestSession = new(102, 118); + public UpdateField UiChromieTimeExpansionID = new(102, 120); + public UpdateField TransportServerTime = new(102, 121); + public UpdateField WeeklyRewardsPeriodSinceOrigin = new(102, 122); // week count since Cfg_RegionsEntry::ChallengeOrigin + public UpdateField DEBUGSoulbindConduitRank = new(102, 123); + public UpdateField DungeonScore = new(102, 124); + public UpdateField ActiveCombatTraitConfigID = new(102, 125); + public UpdateField ItemUpgradeHighOnehandWeaponItemID = new(102, 126); + public UpdateField ItemUpgradeHighFingerItemID = new(102, 127); + public UpdateField ItemUpgradeHighFingerWatermark = new(102, 128); + public UpdateField ItemUpgradeHighTrinketItemID = new(102, 129); + public UpdateField ItemUpgradeHighTrinketWatermark = new(102, 130); + public UpdateField LootHistoryInstanceID = new(102, 131); + public OptionalUpdateField PetStable = new(102, 132); + public UpdateField RequiredMountCapabilityFlags = new(102, 133); + public UpdateFieldArray InvSlots = new(227, 134, 135); + public UpdateFieldArray ExploredZones = new(240, 362, 363); + public UpdateFieldArray RestInfo = new(2, 603, 604); + public UpdateFieldArray ModDamageDonePos = new(7, 606, 607); + public UpdateFieldArray ModDamageDoneNeg = new(7, 606, 614); + public UpdateFieldArray ModDamageDonePercent = new(7, 606, 621); + public UpdateFieldArray ModHealingDonePercent = new(7, 606, 628); + public UpdateFieldArray WeaponDmgMultipliers = new(3, 635, 636); + public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 635, 639); + public UpdateFieldArray BuybackPrice = new(12, 642, 643); + public UpdateFieldArray BuybackTimestamp = new(12, 642, 655); + public UpdateFieldArray CombatRatings = new(32, 667, 668); + public UpdateFieldArray NoReagentCostMask = new(4, 700, 701); + public UpdateFieldArray ProfessionSkillLine = new(2, 705, 706); + public UpdateFieldArray BagSlotFlags = new(5, 708, 709); + public UpdateFieldArray BankBagSlotFlags = new(7, 714, 715); + public UpdateFieldArray QuestCompleted = new(875, 722, 723); + public UpdateFieldArray ItemUpgradeHighWatermark = new(17, 1598, 1599); public ActivePlayerData() : base(0, TypeId.ActivePlayer, changeMaskLength) { @@ -4858,8 +5073,6 @@ namespace Game.Entities data.WriteUInt32(OverrideSpellsID); data.WriteUInt16(LootSpecID); data.WriteUInt32(OverrideZonePVPType); - data.WritePackedGuid(BnetAccount); - data.WriteUInt64(GuildClubMemberID); for (int i = 0; i < 5; ++i) { data.WriteUInt32(BagSlotFlags[i]); @@ -5976,118 +6189,98 @@ namespace Game.Entities } if (changesMask[112]) { - data.WritePackedGuid(BnetAccount); + data.WriteUInt32(Honor); } if (changesMask[113]) { - data.WriteUInt64(GuildClubMemberID); + data.WriteUInt32(HonorNextLevel); } if (changesMask[114]) { - data.WriteUInt32(Honor); + data.WriteInt32(PerksProgramCurrency); } if (changesMask[115]) - { - data.WriteUInt32(HonorNextLevel); - } - if (changesMask[116]) - { - data.WriteInt32(PerksProgramCurrency); - } - if (changesMask[117]) { data.WriteUInt8(NumBankSlots); } - if (changesMask[122]) + if (changesMask[120]) { data.WriteInt32(UiChromieTimeExpansionID); } - if (changesMask[123]) + if (changesMask[121]) { data.WriteInt32(TransportServerTime); } - if (changesMask[124]) + if (changesMask[122]) { data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); } - if (changesMask[125]) + if (changesMask[123]) { data.WriteInt16(DEBUGSoulbindConduitRank); } - if (changesMask[127]) + if (changesMask[125]) { data.WriteUInt32(ActiveCombatTraitConfigID); } - if (changesMask[128]) + if (changesMask[126]) { data.WriteInt32(ItemUpgradeHighOnehandWeaponItemID); } - if (changesMask[129]) + if (changesMask[127]) { data.WriteInt32(ItemUpgradeHighFingerItemID); } - if (changesMask[130]) + if (changesMask[128]) { data.WriteFloat(ItemUpgradeHighFingerWatermark); } - if (changesMask[131]) + if (changesMask[129]) { data.WriteInt32(ItemUpgradeHighTrinketItemID); } - if (changesMask[132]) + if (changesMask[130]) { data.WriteFloat(ItemUpgradeHighTrinketWatermark); } - if (changesMask[133]) + if (changesMask[131]) { data.WriteUInt64(LootHistoryInstanceID); } - } - if (changesMask[134]) - { - if (changesMask[136]) + if (changesMask[133]) { data.WriteUInt8(RequiredMountCapabilityFlags); } - } - if (changesMask[102]) - { data.WriteBits(QuestSession.HasValue(), 1); - } - if (changesMask[134]) - { data.WriteBits(PetStable.HasValue(), 1); } data.FlushBits(); if (changesMask[102]) { - if (changesMask[118]) + if (changesMask[116]) { ResearchHistory.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[120]) + if (changesMask[116]) { if (QuestSession.HasValue()) { QuestSession.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[119]) + if (changesMask[117]) { FrozenPerksVendorItem.GetValue().Write(data); } - if (changesMask[121]) + if (changesMask[119]) { Field_1410.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[126]) + if (changesMask[124]) { DungeonScore.GetValue().Write(data); } - } - if (changesMask[134]) - { - if (changesMask[135]) + if (changesMask[132]) { if (PetStable.HasValue()) { @@ -6095,151 +6288,151 @@ namespace Game.Entities } } } - if (changesMask[137]) + if (changesMask[134]) { for (int i = 0; i < 227; ++i) { - if (changesMask[138 + i]) + if (changesMask[135 + i]) { data.WritePackedGuid(InvSlots[i]); } } } - if (changesMask[365]) + if (changesMask[362]) { for (int i = 0; i < 240; ++i) { - if (changesMask[366 + i]) + if (changesMask[363 + i]) { data.WriteUInt64(ExploredZones[i]); } } } - if (changesMask[606]) + if (changesMask[603]) { for (int i = 0; i < 2; ++i) { - if (changesMask[607 + i]) + if (changesMask[604 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[609]) + if (changesMask[606]) { for (int i = 0; i < 7; ++i) { - if (changesMask[610 + i]) + if (changesMask[607 + i]) { data.WriteInt32(ModDamageDonePos[i]); } - if (changesMask[617 + i]) + if (changesMask[614 + i]) { data.WriteInt32(ModDamageDoneNeg[i]); } - if (changesMask[624 + i]) + if (changesMask[621 + i]) { data.WriteFloat(ModDamageDonePercent[i]); } - if (changesMask[631 + i]) + if (changesMask[628 + i]) { data.WriteFloat(ModHealingDonePercent[i]); } } } - if (changesMask[638]) + if (changesMask[635]) { for (int i = 0; i < 3; ++i) { - if (changesMask[639 + i]) + if (changesMask[636 + i]) { data.WriteFloat(WeaponDmgMultipliers[i]); } - if (changesMask[642 + i]) + if (changesMask[639 + i]) { data.WriteFloat(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[645]) + if (changesMask[642]) { for (int i = 0; i < 12; ++i) { - if (changesMask[646 + i]) + if (changesMask[643 + i]) { data.WriteUInt32(BuybackPrice[i]); } - if (changesMask[658 + i]) + if (changesMask[655 + i]) { data.WriteInt64(BuybackTimestamp[i]); } } } - if (changesMask[670]) + if (changesMask[667]) { for (int i = 0; i < 32; ++i) { - if (changesMask[671 + i]) + if (changesMask[668 + i]) { data.WriteUInt32(CombatRatings[i]); } } } - if (changesMask[703]) + if (changesMask[700]) { for (int i = 0; i < 4; ++i) { - if (changesMask[704 + i]) + if (changesMask[701 + i]) { data.WriteUInt32(NoReagentCostMask[i]); } } } - if (changesMask[708]) + if (changesMask[705]) { for (int i = 0; i < 2; ++i) { - if (changesMask[709 + i]) + if (changesMask[706 + i]) { data.WriteUInt32(ProfessionSkillLine[i]); } } } - if (changesMask[711]) + if (changesMask[708]) { for (int i = 0; i < 5; ++i) { - if (changesMask[712 + i]) + if (changesMask[709 + i]) { data.WriteUInt32(BagSlotFlags[i]); } } } - if (changesMask[717]) + if (changesMask[714]) { for (int i = 0; i < 7; ++i) { - if (changesMask[718 + i]) + if (changesMask[715 + i]) { data.WriteUInt32(BankBagSlotFlags[i]); } } } - if (changesMask[725]) + if (changesMask[722]) { for (int i = 0; i < 875; ++i) { - if (changesMask[726 + i]) + if (changesMask[723 + i]) { data.WriteUInt64(QuestCompleted[i]); } } } - if (changesMask[1601]) + if (changesMask[1598]) { for (int i = 0; i < 17; ++i) { - if (changesMask[1602 + i]) + if (changesMask[1599 + i]) { data.WriteFloat(ItemUpgradeHighWatermark[i]); } @@ -6355,8 +6548,6 @@ namespace Game.Entities ClearChangesMask(OverrideSpellsID); ClearChangesMask(LootSpecID); ClearChangesMask(OverrideZonePVPType); - ClearChangesMask(BnetAccount); - ClearChangesMask(GuildClubMemberID); ClearChangesMask(Honor); ClearChangesMask(HonorNextLevel); ClearChangesMask(PerksProgramCurrency); @@ -7303,6 +7494,7 @@ namespace Game.Entities public class ConversationLine { public uint ConversationLineID; + public uint BroadcastTextID; public uint StartTime; public uint UiCameraID; public byte ActorIndex; @@ -7312,6 +7504,7 @@ namespace Game.Entities public void WriteCreate(WorldPacket data, Conversation owner, Player receiver) { data.WriteUInt32(ConversationLineID); + data.WriteUInt32(BroadcastTextID); data.WriteUInt32(GetViewerStartTime(this, owner, receiver)); data.WriteUInt32(UiCameraID); data.WriteUInt8(ActorIndex); @@ -7322,6 +7515,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Conversation owner, Player receiver) { data.WriteUInt32(ConversationLineID); + data.WriteUInt32(BroadcastTextID); data.WriteUInt32(GetViewerStartTime(this, owner, receiver)); data.WriteUInt32(UiCameraID); data.WriteUInt8(ActorIndex); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index bdb4f1ee4..0ddea57c9 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -832,6 +832,15 @@ namespace Game.Entities } } + public void SetUpdateFieldValue(ref string value, string newValue) + { + if (!newValue.Equals(value)) + { + value = newValue; + AddToObjectUpdateIfNeeded(); + } + } + public void SetUpdateFieldValue(DynamicUpdateField updateField, int index, T newValue) where T : new() { if (!newValue.Equals(updateField[index])) diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 38cb25552..667f30c02 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -465,7 +465,7 @@ namespace Game.Entities do { var spell = m_spells.LookupByKey(favoritesResult.Read(0)); - if (spell !=null) + if (spell != null) spell.Favorite = true; } while (favoritesResult.NextRow()); } @@ -1388,9 +1388,9 @@ namespace Game.Entities if (result.IsEmpty()) return; - _declinedname = new DeclinedName(); - for (byte i = 0; i < SharedConst.MaxDeclinedNameCases; ++i) - _declinedname.name[i] = result.Read(i); + DeclinedNames declinedNames = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.DeclinedNames); + for (int i = 0; i < SharedConst.MaxDeclinedNameCases; ++i) + SetUpdateFieldValue(ref declinedNames.ModifyValue(declinedNames.Name, i), result.Read(i)); } void _LoadArenaTeamInfo(SQLResult result) { @@ -2047,7 +2047,7 @@ namespace Game.Entities void _SaveActions(SQLTransaction trans) { int traitConfigId = 0; - + TraitConfig traitConfig = GetTraitConfig((int)(uint)m_activePlayerData.ActiveCombatTraitConfigID); if (traitConfig != null) { @@ -2430,7 +2430,7 @@ namespace Game.Entities m_traitConfigStates.Clear(); } - + public void _SaveMail(SQLTransaction trans) { PreparedStatement stmt; @@ -2863,7 +2863,11 @@ namespace Game.Entities PlayerRestState honorRestState = (PlayerRestState)result.Read(fieldIndex++); float honorRestBonus = result.Read(fieldIndex++); byte numRespecs = result.Read(fieldIndex++); - + int personalTabardEmblemStyle = result.Read(fieldIndex++); + int personalTabardEmblemColor = result.Read(fieldIndex++); + int personalTabardBorderStyle = result.Read(fieldIndex++); + int personalTabardBorderColor = result.Read(fieldIndex++); + int personalTabardBackgroundColor = result.Read(fieldIndex++); // check if the character's account in the db and the logged in account match. // player should be able to load/delete character only with correct account! @@ -2895,9 +2899,10 @@ namespace Game.Entities return false; } + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Name), GetName()); SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.WowAccount), GetSession().GetAccountGUID()); - SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BnetAccount), GetSession().GetBattlenetAccountGUID()); + SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.BnetAccount), GetSession().GetBattlenetAccountGUID()); if (gender >= Gender.None) { @@ -3099,7 +3104,7 @@ namespace Game.Entities transport = transportOnMap; } } - + if (transport != null) { float x = trans_x; @@ -3217,7 +3222,7 @@ namespace Game.Entities else if (map.IsDungeon()) // if map is dungeon... { TransferAbortParams denyReason = map.CannotEnter(this); // ... and can't enter map, then look for entry point. - if (denyReason != null) + if (denyReason != null) { SendTransferAborted(map.GetId(), denyReason.Reason, denyReason.Arg, denyReason.MapDifficultyXConditionId); areaTrigger = Global.ObjectMgr.GetGoBackTrigger(mapId); @@ -3460,6 +3465,8 @@ namespace Game.Entities } } + SetPersonalTabard(personalTabardEmblemStyle, personalTabardEmblemColor, personalTabardBorderStyle, personalTabardBorderColor, personalTabardBackgroundColor); + Log.outDebug(LogFilter.Player, "The value of player {0} after load item and aura is: ", GetName()); // GM state diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 9fbef63c3..93cfbb413 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -237,7 +237,6 @@ namespace Game.Entities TimeTracker m_groupUpdateTimer; ulong m_GuildIdInvited; - DeclinedName _declinedname; Runes m_runes = new(); uint m_hostileReferenceCheckTimer; uint m_drunkTimer; diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index ceaa474c6..e0614993a 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -138,7 +138,6 @@ namespace Game.Entities PlayerTalkClass.ClearMenus(); ItemSetEff.Clear(); - _declinedname = null; m_runes = null; m_achievementSys = null; reputationMgr = null; @@ -816,7 +815,7 @@ namespace Game.Entities _session.SendPacket(data); } - public DeclinedName GetDeclinedNames() { return _declinedname; } + public DeclinedNames GetDeclinedNames() { return m_playerData.DeclinedNames.HasValue() ? m_playerData.DeclinedNames.GetValue() : null; } public void CreateGarrison(uint garrSiteId) { @@ -1040,7 +1039,7 @@ namespace Game.Entities if (!m_activePlayerData.PetStable.HasValue()) return ObjectGuid.Empty; - return m_activePlayerData.PetStable.GetValue().StableMaster; + return m_activePlayerData.PetStable.GetValue().StableMaster; } public void SetStableMaster(ObjectGuid stableMaster) @@ -1051,7 +1050,7 @@ namespace Game.Entities StableInfo stableInfo = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.PetStable); SetUpdateFieldValue(stableInfo.ModifyValue(stableInfo.StableMaster), stableMaster); } - + // last used pet number (for BG's) public uint GetLastPetNumber() { return m_lastpetnumber; } public void SetLastPetNumber(uint petnumber) { m_lastpetnumber = petnumber; } @@ -1059,7 +1058,7 @@ namespace Game.Entities public void SetTemporaryUnsummonedPetNumber(uint petnumber) { m_temporaryUnsummonedPetNumber = petnumber; } public ReactStates? GetTemporaryPetReactState() { return m_temporaryPetReactState; } - + public void DisablePetControlsOnMount(ReactStates reactState, CommandStates commandState) { Pet pet = GetPet(); @@ -2667,11 +2666,12 @@ namespace Game.Entities case GossipOptionNpc.Binder: case GossipOptionNpc.Banker: case GossipOptionNpc.PetitionVendor: - case GossipOptionNpc.TabardVendor: + case GossipOptionNpc.GuildTabardVendor: case GossipOptionNpc.Auctioneer: case GossipOptionNpc.Mailbox: case GossipOptionNpc.Transmogrify: case GossipOptionNpc.AzeriteRespec: + case GossipOptionNpc.PersonalTabardVendor: break; // No checks case GossipOptionNpc.CemeterySelect: canTalk = false; // Deprecated @@ -2887,7 +2887,7 @@ namespace Game.Entities { PlayerInteractionType.None, PlayerInteractionType.Vendor, PlayerInteractionType.TaxiNode, PlayerInteractionType.Trainer, PlayerInteractionType.SpiritHealer, PlayerInteractionType.Binder, - PlayerInteractionType.Banker, PlayerInteractionType.PetitionVendor, PlayerInteractionType.TabardVendor, + PlayerInteractionType.Banker, PlayerInteractionType.PetitionVendor, PlayerInteractionType.GuildTabardVendor, PlayerInteractionType.BattleMaster, PlayerInteractionType.Auctioneer, PlayerInteractionType.TalentMaster, PlayerInteractionType.StableMaster, PlayerInteractionType.None, PlayerInteractionType.GuildBanker, PlayerInteractionType.None, PlayerInteractionType.None, PlayerInteractionType.None, @@ -2902,7 +2902,8 @@ namespace Game.Entities PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.NewPlayerGuide, PlayerInteractionType.LegendaryCrafting, PlayerInteractionType.Renown, PlayerInteractionType.BlackMarketAuctioneer, PlayerInteractionType.PerksProgramVendor, PlayerInteractionType.ProfessionsCraftingOrder, PlayerInteractionType.Professions, PlayerInteractionType.ProfessionsCustomerOrder, - PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown + PlayerInteractionType.TraitSystem, PlayerInteractionType.BarbersChoice, PlayerInteractionType.MajorFactionRenown, + PlayerInteractionType.PersonalTabardVendor }; PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[(int)gossipOptionNpc]; @@ -4313,9 +4314,9 @@ namespace Game.Entities } ObjectGuid GetSpiritHealerGUID() { return _areaSpiritHealerGUID; } - + public bool CanAcceptAreaSpiritHealFrom(Unit spiritHealer) { return spiritHealer.GetGUID() == _areaSpiritHealerGUID; } - + public void SetAreaSpiritHealer(Creature creature) { if (creature == null) @@ -4349,7 +4350,7 @@ namespace Game.Entities areaSpiritHealerTime.TimeLeft = (uint)timeLeft; SendPacket(areaSpiritHealerTime); } - + public void KillPlayer() { if (IsFlying() && GetTransport() == null) @@ -5254,7 +5255,7 @@ namespace Game.Entities if (guildId != 0) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.GuildGUID), ObjectGuid.Create(HighGuid.Guild, guildId)); - SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.GuildClubMemberID), GetGUID().GetCounter()); + SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_playerData.GuildClubMemberID), GetGUID().GetCounter()); SetPlayerFlag(PlayerFlags.GuildLevelEnabled); } else @@ -5376,6 +5377,8 @@ namespace Game.Entities StartCriteria(CriteriaStartEvent.ReachLevel, level); UpdateCriteria(CriteriaType.ReachLevel); UpdateCriteria(CriteriaType.ActivelyReachLevel, level); + if (level > oldLevel) + UpdateCriteria(CriteriaType.GainLevels, level - oldLevel); PushQuests(); @@ -7691,10 +7694,10 @@ namespace Game.Entities public void RemoveAuraVision(PlayerFieldByte2Flags flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AuraVision), (byte)flags); } public void SetTransportServerTime(int transportServerTime) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TransportServerTime), transportServerTime); } - + public void SetRequiredMountCapabilityFlag(byte flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RequiredMountCapabilityFlags), flag); } public void ReplaceAllRequiredMountCapabilityFlags(byte flags) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.RequiredMountCapabilityFlags), flags); } - + public bool CanTameExoticPets() { return IsGameMaster() || HasAuraType(AuraType.AllowTamePetType); } void SendAttackSwingCantAttack() { SendPacket(new AttackSwingError(AttackSwingErr.CantAttack)); } @@ -7874,5 +7877,15 @@ namespace Game.Entities //Clears the Menu public void ClearGossipMenu() { PlayerTalkClass.ClearMenus(); } + + public void SetPersonalTabard(int style, int color, int borderStyle, int borderColor, int backgroundColor) + { + CustomTabardInfo personalTabard = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PersonalTabard); + SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.EmblemStyle), style); + SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.EmblemColor), color); + SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.BorderStyle), borderStyle); + SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.BorderColor), borderColor); + SetUpdateFieldValue(personalTabard.ModifyValue(personalTabard.BackgroundColor), backgroundColor); + } } } \ No newline at end of file diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 393b76a1e..0914fad81 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -566,7 +566,14 @@ namespace Game.Entities public class DeclinedName { public StringArray name = new(SharedConst.MaxDeclinedNameCases); - } + + public DeclinedName() { } + public DeclinedName(DeclinedNames uf) + { + for (var i = 0; i < SharedConst.MaxDeclinedNameCases; ++i) + name[i] = uf.Name[i]; + } +} struct PositionUpdateInfo { diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 024975e8f..61e3d89e8 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -1495,27 +1495,11 @@ namespace Game.Entities } } - uint modelid = 0; SpellShapeshiftFormRecord formEntry = CliDB.SpellShapeshiftFormStorage.LookupByKey(form); - if (formEntry != null && formEntry.CreatureDisplayID[0] != 0) - { - // Take the alliance modelid as default - if (GetTypeId() != TypeId.Player) - return formEntry.CreatureDisplayID[0]; - else - { - if (Player.TeamForRace(GetRace()) == Team.Alliance) - modelid = formEntry.CreatureDisplayID[0]; - else - modelid = formEntry.CreatureDisplayID[1]; + if (formEntry != null && formEntry.CreatureDisplayID != 0) + return formEntry.CreatureDisplayID; - // If the player is horde but there are no values for the horde modelid - take the alliance modelid - if (modelid == 0 && Player.TeamForRace(GetRace()) == Team.Horde) - modelid = formEntry.CreatureDisplayID[0]; - } - } - - return modelid; + return 0; } public Totem ToTotem() { return IsTotem() ? (this as Totem) : null; } diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index 865ece5cc..2b2234f1b 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -3539,9 +3539,14 @@ namespace Game.Guilds public bool ValidateEmblemColors() { - return CliDB.GuildColorBackgroundStorage.ContainsKey(m_backgroundColor) && - CliDB.GuildColorBorderStorage.ContainsKey(m_borderColor) && - CliDB.GuildColorEmblemStorage.ContainsKey(m_color); + return ValidateEmblemColors(m_style, m_color, m_borderStyle, m_borderColor, m_backgroundColor); + } + + public static bool ValidateEmblemColors(uint style, uint color, uint borderStyle, uint borderColor, uint backgroundColor) + { + return CliDB.GuildColorBackgroundStorage.ContainsKey(backgroundColor) && + CliDB.GuildColorBorderStorage.ContainsKey(borderColor) && + CliDB.GuildColorEmblemStorage.ContainsKey(color); } public bool LoadFromDB(SQLFields field) diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index 5487ab37d..ed0efd474 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -607,8 +607,17 @@ namespace Game { // This packet is completely irrelevant, it triggers PVP_TYPES_ENABLED lua event but that is not handled in interface code as of 6.1.2 PVPOptionsEnabled pvpOptionsEnabled = new(); + pvpOptionsEnabled.RatedBattlegrounds = false; pvpOptionsEnabled.PugBattlegrounds = true; - SendPacket(new PVPOptionsEnabled()); + pvpOptionsEnabled.WargameBattlegrounds = false; + pvpOptionsEnabled.WargameArenas = false; + pvpOptionsEnabled.RatedArenas = false; + pvpOptionsEnabled.ArenaSkirmish = false; + pvpOptionsEnabled.SoloShuffle = false; + pvpOptionsEnabled.RatedSoloShuffle = false; + pvpOptionsEnabled.BattlegroundBlitz = false; + pvpOptionsEnabled.RatedBattlegroundBlitz = false; + SendPacket(pvpOptionsEnabled); } [WorldPacketHandler(ClientOpcodes.RequestPvpRewards, Processing = PacketProcessing.Inplace)] diff --git a/Source/Game/Handlers/CalendarHandler.cs b/Source/Game/Handlers/CalendarHandler.cs index 9c7229d12..96370b355 100644 --- a/Source/Game/Handlers/CalendarHandler.cs +++ b/Source/Game/Handlers/CalendarHandler.cs @@ -26,8 +26,8 @@ namespace Game CalendarSendCalendar packet = new(); packet.ServerTime = currTime; - var invites = Global.CalendarMgr.GetPlayerInvites(guid); - foreach (var invite in invites) + var playerInvites = Global.CalendarMgr.GetPlayerInvites(guid); + foreach (var invite in playerInvites) { CalendarSendCalendarInviteInfo inviteInfo = new(); inviteInfo.EventID = invite.EventId; @@ -45,7 +45,7 @@ namespace Game var playerEvents = Global.CalendarMgr.GetPlayerEvents(guid); foreach (var calendarEvent in playerEvents) { - CalendarSendCalendarEventInfo eventInfo; + CalendarSendCalendarEventInfo eventInfo = new(); eventInfo.EventID = calendarEvent.EventId; eventInfo.Date = calendarEvent.Date; eventInfo.EventClubID = calendarEvent.GuildId; @@ -61,7 +61,6 @@ namespace Game foreach (InstanceLock instanceLock in Global.InstanceLockMgr.GetInstanceLocksForPlayer(_player.GetGUID())) { CalendarSendCalendarRaidLockoutInfo lockoutInfo = new(); - lockoutInfo.MapID = (int)instanceLock.GetMapId(); lockoutInfo.DifficultyID = (uint)instanceLock.GetDifficultyId(); lockoutInfo.ExpireTime = (int)Math.Max((instanceLock.GetEffectiveExpiryTime() - GameTime.GetSystemTime()).TotalSeconds, 0); diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 33bfcaa7b..4e4f0afdf 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -111,8 +111,6 @@ namespace Game while (result.NextRow() && charResult.Characters.Count < 200); } - charResult.IsAlliedRacesCreationAllowed = CanAccessAlliedRaces(); - foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) { EnumCharactersResult.RaceUnlock raceUnlock = new(); @@ -811,9 +809,8 @@ namespace Game SendFeatureSystemStatus(); - MOTD motd = new(); - motd.Text = Global.WorldMgr.GetMotd(); - SendPacket(motd); + foreach (var motdLine in Global.WorldMgr.GetMotd()) + Global.WorldMgr.SendServerMessage(ServerMessageType.String, motdLine, pCurrChar); SendSetTimeZoneInformation(); @@ -2544,6 +2541,29 @@ namespace Game GetPlayer().SetStandState(packet.StandState); } + [WorldPacketHandler(ClientOpcodes.SavePersonalEmblem)] + void HandleSavePersonalEmblem(SavePersonalEmblem savePersonalEmblem) + { + if (_player.GetNPCIfCanInteractWith(savePersonalEmblem.Vendor, NPCFlags.None, NPCFlags2.PersonalTabardDesigner) == null) + { + SendPacket(new PlayerSavePersonalEmblem(GuildEmblemError.InvalidVendor)); + return; + } + + if (!Guild.EmblemInfo.ValidateEmblemColors((uint)savePersonalEmblem.PersonalTabard.EmblemStyle, (uint)savePersonalEmblem.PersonalTabard.EmblemColor, + (uint)savePersonalEmblem.PersonalTabard.BorderStyle, (uint)savePersonalEmblem.PersonalTabard.BorderColor, (uint)savePersonalEmblem.PersonalTabard.BackgroundColor)) + { + SendPacket(new PlayerSavePersonalEmblem(GuildEmblemError.InvalidTabardColors)); + return; + } + + _player.SetPersonalTabard(savePersonalEmblem.PersonalTabard.EmblemStyle, savePersonalEmblem.PersonalTabard.EmblemColor, + savePersonalEmblem.PersonalTabard.BorderStyle, savePersonalEmblem.PersonalTabard.BorderColor, + savePersonalEmblem.PersonalTabard.BackgroundColor); + + SendPacket(new PlayerSavePersonalEmblem(GuildEmblemError.Success)); + } + void SendCharCreate(ResponseCodes result, ObjectGuid guid = default) { CreateChar response = new(); diff --git a/Source/Game/Handlers/NPCHandler.cs b/Source/Game/Handlers/NPCHandler.cs index 9acd6151a..e41872fcc 100644 --- a/Source/Game/Handlers/NPCHandler.cs +++ b/Source/Game/Handlers/NPCHandler.cs @@ -17,27 +17,44 @@ namespace Game public partial class WorldSession { [WorldPacketHandler(ClientOpcodes.TabardVendorActivate, Processing = PacketProcessing.Inplace)] - void HandleTabardVendorActivate(Hello packet) + void HandleTabardVendorActivate(TabardVendorActivate tabardVendorActivate) { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(packet.Unit, NPCFlags.TabardDesigner, NPCFlags2.None); + Creature unit = GetPlayer().GetNPCIfCanInteractWith(tabardVendorActivate.Vendor, NPCFlags.TabardDesigner, NPCFlags2.None); if (unit == null) { - Log.outDebug(LogFilter.Network, "WORLD: HandleTabardVendorActivateOpcode - {0} not found or you can not interact with him.", packet.Unit.ToString()); + Log.outDebug(LogFilter.Network, $"WORLD: HandleTabardVendorActivateOpcode - {tabardVendorActivate.Vendor} not found or you can not interact with him."); return; } + TabardVendorType type = (TabardVendorType)tabardVendorActivate.Type; + if (type != TabardVendorType.Guild && type != TabardVendorType.Personal) + return; + // remove fake death if (GetPlayer().HasUnitState(UnitState.Died)) GetPlayer().RemoveAurasByType(AuraType.FeignDeath); - SendTabardVendorActivate(packet.Unit); + SendTabardVendorActivate(tabardVendorActivate.Vendor, type); } - public void SendTabardVendorActivate(ObjectGuid guid) + public void SendTabardVendorActivate(ObjectGuid guid, TabardVendorType type) { NPCInteractionOpenResult npcInteraction = new(); npcInteraction.Npc = guid; - npcInteraction.InteractionType = PlayerInteractionType.TabardVendor; + + switch (type) + { + case TabardVendorType.Guild: + npcInteraction.InteractionType = PlayerInteractionType.GuildTabardVendor; + break; + case TabardVendorType.Personal: + npcInteraction.InteractionType = PlayerInteractionType.PersonalTabardVendor; + break; + default: + Log.outFatal(LogFilter.Server, $"Unsupported tabard vendor type {type}"); + break; + } + npcInteraction.Success = true; SendPacket(npcInteraction); } @@ -345,7 +362,7 @@ namespace Game _player.SetPetSlot(setPetSlot.PetNumber, (PetSaveMode)setPetSlot.DestSlot); } - + [WorldPacketHandler(ClientOpcodes.RepairItem, Processing = PacketProcessing.Inplace)] void HandleRepairItem(RepairItem packet) { diff --git a/Source/Game/Networking/Packets/BattleGroundPackets.cs b/Source/Game/Networking/Packets/BattleGroundPackets.cs index a3b0d7fc5..eb137ae1d 100644 --- a/Source/Game/Networking/Packets/BattleGroundPackets.cs +++ b/Source/Game/Networking/Packets/BattleGroundPackets.cs @@ -310,15 +310,23 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(WargameArenas); _worldPacket.WriteBit(RatedArenas); _worldPacket.WriteBit(ArenaSkirmish); + _worldPacket.WriteBit(SoloShuffle); + _worldPacket.WriteBit(RatedSoloShuffle); + _worldPacket.WriteBit(BattlegroundBlitz); + _worldPacket.WriteBit(RatedBattlegroundBlitz); _worldPacket.FlushBits(); } + public bool RatedBattlegrounds; + public bool PugBattlegrounds; + public bool WargameBattlegrounds; public bool WargameArenas; public bool RatedArenas; - public bool WargameBattlegrounds; public bool ArenaSkirmish; - public bool PugBattlegrounds; - public bool RatedBattlegrounds; + public bool SoloShuffle; + public bool RatedSoloShuffle; + public bool BattlegroundBlitz; + public bool RatedBattlegroundBlitz; // solo rbg } class RequestBattlefieldStatus : ClientPacket @@ -510,7 +518,7 @@ namespace Game.Networking.Packets PVPMatchState State; } - + class PVPMatchComplete : ServerPacket { public PVPMatchComplete() : base(ServerOpcodes.PvpMatchComplete, ConnectionType.Instance) { } diff --git a/Source/Game/Networking/Packets/CalendarPackets.cs b/Source/Game/Networking/Packets/CalendarPackets.cs index ff3c994bc..836535163 100644 --- a/Source/Game/Networking/Packets/CalendarPackets.cs +++ b/Source/Game/Networking/Packets/CalendarPackets.cs @@ -149,12 +149,12 @@ namespace Game.Networking.Packets _worldPacket.WriteInt32(Events.Count); _worldPacket.WriteInt32(RaidLockouts.Count); - foreach (var invite in Invites) - invite.Write(_worldPacket); - foreach (var lockout in RaidLockouts) lockout.Write(_worldPacket); + foreach (var invite in Invites) + invite.Write(_worldPacket); + foreach (var Event in Events) Event.Write(_worldPacket); } @@ -822,6 +822,8 @@ namespace Game.Networking.Packets data.WriteUInt8((byte)Moderator); data.WriteUInt8(InviteType); data.WritePackedGuid(InviterGuid); + data.WriteBit(IgnoreFriendAndGuildRestriction); + data.FlushBits(); } public ulong EventID; @@ -830,6 +832,7 @@ namespace Game.Networking.Packets public CalendarInviteStatus Status; public CalendarModerationRank Moderator; public byte InviteType; + public bool IgnoreFriendAndGuildRestriction; } struct CalendarSendCalendarRaidLockoutInfo { diff --git a/Source/Game/Networking/Packets/CharacterPackets.cs b/Source/Game/Networking/Packets/CharacterPackets.cs index faecb7865..ae943a4d4 100644 --- a/Source/Game/Networking/Packets/CharacterPackets.cs +++ b/Source/Game/Networking/Packets/CharacterPackets.cs @@ -33,7 +33,6 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(IsNewPlayer); _worldPacket.WriteBit(IsTrialAccountRestricted); _worldPacket.WriteBit(DisabledClassesMask.HasValue); - _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket.WriteInt32(Characters.Count); _worldPacket.WriteInt32(MaxCharacterLevel); _worldPacket.WriteInt32(RaceUnlockData.Count); @@ -62,7 +61,6 @@ namespace Game.Networking.Packets public bool IsNewPlayerRestricted; // forbids using level boost and class trials public bool IsNewPlayer; // forbids hero classes and allied races public bool IsTrialAccountRestricted; - public bool IsAlliedRacesCreationAllowed; public int MaxCharacterLevel = 1; public uint? DisabledClassesMask = new(); @@ -105,7 +103,7 @@ namespace Game.Networking.Packets if (fields.Read(18) != 0) Flags |= CharacterFlags.LockedByBilling; - if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read(23))) + if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read(28))) Flags |= CharacterFlags.Declined; if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize)) @@ -145,6 +143,12 @@ namespace Game.Networking.Packets LastLoginVersion = fields.Read(22); + PersonalTabard.EmblemStyle = fields.Read(23); + PersonalTabard.EmblemColor = fields.Read(24); + PersonalTabard.BorderStyle = fields.Read(25); + PersonalTabard.BorderColor = fields.Read(26); + PersonalTabard.BackgroundColor = fields.Read(27); + int equipmentFieldsPerSlot = 5; for (var slot = 0; slot < VisualItems.Length && (slot + 1) * equipmentFieldsPerSlot <= equipment.Length; ++slot) @@ -194,6 +198,7 @@ namespace Game.Networking.Packets data.WriteInt32(MailSenders.Count); data.WriteInt32(MailSenderTypes.Count); data.WriteUInt32(OverrideSelectScreenFileDataID); + PersonalTabard.Write(data); foreach (ChrCustomizationChoice customization in Customizations) { @@ -208,6 +213,8 @@ namespace Game.Networking.Packets data.WriteBit(FirstLogin); data.WriteBit(BoostInProgress); data.WriteBits(unkWod61x, 5); + data.WriteBit(RpeResetAvailable); + data.WriteBit(RpeResetQuestClearAvailable); foreach (string str in MailSenders) data.WriteBits(str.GetByteCount() + 1, 6); @@ -228,7 +235,7 @@ namespace Game.Networking.Packets public byte RaceId; public Class ClassId; public byte SexId; - public Array Customizations = new(125); + public Array Customizations = new(250); public byte ExperienceLevel; public uint ZoneId; public uint MapId; @@ -253,6 +260,9 @@ namespace Game.Networking.Packets public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.ReagentBagEnd]; public List MailSenders = new(); public List MailSenderTypes = new(); + public bool RpeResetAvailable = false; + public bool RpeResetQuestClearAvailable = false; + public CustomTabardInfo PersonalTabard = new(); public struct VisualItemInfo { @@ -288,6 +298,7 @@ namespace Game.Networking.Packets data.WriteBit(HasExpansion); data.WriteBit(HasAchievement); data.WriteBit(HasHeritageArmor); + data.WriteBit(IsLocked); data.FlushBits(); } @@ -295,6 +306,7 @@ namespace Game.Networking.Packets public bool HasExpansion; public bool HasAchievement; public bool HasHeritageArmor; + public bool IsLocked; } public struct UnlockedConditionalAppearance @@ -329,7 +341,7 @@ namespace Game.Networking.Packets } class CheckCharacterNameAvailability : ClientPacket - { + { public uint SequenceIndex; public string Name; @@ -359,7 +371,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32((uint)Result); } } - + public class CreateCharacter : ClientPacket { public CreateCharacter(WorldPacket packet) : base(packet) { } @@ -570,7 +582,7 @@ namespace Game.Networking.Packets public string Name; public byte SexID; public byte RaceID; - public Array Customizations = new(125); + public Array Customizations = new(250); } } @@ -883,7 +895,7 @@ namespace Game.Networking.Packets } public byte NewSex; - public Array Customizations = new(125); + public Array Customizations = new(250); public int CustomizedRace; public int CustomizedChrModelID; } @@ -952,7 +964,7 @@ namespace Game.Networking.Packets FactionIndex = _worldPacket.ReadUInt8(); } - public byte FactionIndex; + public ushort FactionIndex; } class SetFactionNotAtWar : ClientPacket @@ -964,7 +976,7 @@ namespace Game.Networking.Packets FactionIndex = _worldPacket.ReadUInt8(); } - public byte FactionIndex; + public ushort FactionIndex; } class SetFactionInactive : ClientPacket @@ -1089,6 +1101,35 @@ namespace Game.Networking.Packets public DeclinedNameResult ResultCode; } + class SavePersonalEmblem : ClientPacket + { + public ObjectGuid Vendor; + public CustomTabardInfo PersonalTabard = new(); + + public SavePersonalEmblem(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Vendor = _worldPacket.ReadPackedGuid(); + PersonalTabard.Read(_worldPacket); + } + } + + class PlayerSavePersonalEmblem : ServerPacket + { + public GuildEmblemError Error; + + public PlayerSavePersonalEmblem(GuildEmblemError error) : base(ServerOpcodes.PlayerSavePersonalEmblem) + { + Error = error; + } + + public override void Write() + { + _worldPacket.WriteInt32((int)Error); + } + } + //Structs public class CharacterCreateInfo { @@ -1096,7 +1137,7 @@ namespace Game.Networking.Packets public Race RaceId = Race.None; public Class ClassId = Class.None; public Gender Sex = Gender.None; - public Array Customizations = new(125); + public Array Customizations = new(250); public uint? TemplateSet; public bool IsTrialBoost; public bool UseNPE; @@ -1117,7 +1158,7 @@ namespace Game.Networking.Packets public ObjectGuid CharGUID; public Gender SexID = Gender.None; public string CharName; - public Array Customizations = new(125); + public Array Customizations = new(250); } public class CharRaceOrFactionChangeInfo @@ -1128,15 +1169,42 @@ namespace Game.Networking.Packets public ObjectGuid Guid; public bool FactionChange; public string Name; - public Array Customizations = new(125); + public Array Customizations = new(250); } public class CharacterUndeleteInfo { // User specified variables public ObjectGuid CharacterGuid; // Guid of the character to restore - public int ClientToken = 0; // @todo: research + public int ClientToken; // @todo: research // Server side data public string Name; } + + public class CustomTabardInfo + { + public int EmblemStyle = -1; + public int EmblemColor = -1; + public int BorderStyle = -1; + public int BorderColor = -1; + public int BackgroundColor = -1; + + public void Write(WorldPacket data) + { + data.WriteInt32(EmblemStyle); + data.WriteInt32(EmblemColor); + data.WriteInt32(BorderStyle); + data.WriteInt32(BorderColor); + data.WriteInt32(BackgroundColor); + } + + public void Read(WorldPacket data) + { + EmblemStyle = data.ReadInt32(); + EmblemColor = data.ReadInt32(); + BorderStyle = data.ReadInt32(); + BorderColor = data.ReadInt32(); + BackgroundColor = data.ReadInt32(); + } + } } diff --git a/Source/Game/Networking/Packets/MiscPackets.cs b/Source/Game/Networking/Packets/MiscPackets.cs index 4cab6c7e5..cde414b93 100644 --- a/Source/Game/Networking/Packets/MiscPackets.cs +++ b/Source/Game/Networking/Packets/MiscPackets.cs @@ -108,6 +108,7 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(FirstCraftOperationID.HasValue); _worldPacket.WriteBit(NextRechargeTime.HasValue); _worldPacket.WriteBit(RechargeCycleStartTime.HasValue); + _worldPacket.WriteBit(OverflownCurrencyID.HasValue); _worldPacket.FlushBits(); if (WeeklyQuantity.HasValue) @@ -139,6 +140,9 @@ namespace Game.Networking.Packets if (RechargeCycleStartTime.HasValue) _worldPacket.WriteInt64(RechargeCycleStartTime.Value); + + if (OverflownCurrencyID.HasValue) + _worldPacket.WriteInt32(OverflownCurrencyID.Value); } public uint Type; @@ -155,6 +159,7 @@ namespace Game.Networking.Packets public uint? FirstCraftOperationID; public long? NextRechargeTime; public long? RechargeCycleStartTime; + public int? OverflownCurrencyID; // what currency was originally changed but couldn't be incremented because of a cap public bool SuppressChatLog; } @@ -1442,17 +1447,17 @@ namespace Game.Networking.Packets { public PhaseShiftDataPhase(uint phaseFlags, uint id) { - PhaseFlags = (ushort)phaseFlags; + PhaseFlags = phaseFlags; Id = (ushort)id; } public void Write(WorldPacket data) { - data.WriteUInt16(PhaseFlags); + data.WriteUInt32(PhaseFlags); data.WriteUInt16(Id); } - public ushort PhaseFlags; + public uint PhaseFlags; public ushort Id; } diff --git a/Source/Game/Networking/Packets/MovementPackets.cs b/Source/Game/Networking/Packets/MovementPackets.cs index f71eb5cef..a16b8813a 100644 --- a/Source/Game/Networking/Packets/MovementPackets.cs +++ b/Source/Game/Networking/Packets/MovementPackets.cs @@ -1497,7 +1497,6 @@ namespace Game.Networking.Packets public void Write(WorldPacket data) { data.WriteUInt32(Id); - data.WriteVector3(Destination); data.WriteBit(CrzTeleport); data.WriteBits(StopDistanceTolerance, 3); @@ -1505,7 +1504,6 @@ namespace Game.Networking.Packets } public uint Id; - public Vector3 Destination; public bool CrzTeleport; public byte StopDistanceTolerance; // Determines how far from spline destination the mover is allowed to stop in place 0, 0, 3.0, 2.76, numeric_limits::max, 1.1, float(INT_MAX); default before this field existed was distance 3.0 (index 2) public MovementSpline Move; diff --git a/Source/Game/Networking/Packets/NPCPackets.cs b/Source/Game/Networking/Packets/NPCPackets.cs index b0cf09352..134e963ce 100644 --- a/Source/Game/Networking/Packets/NPCPackets.cs +++ b/Source/Game/Networking/Packets/NPCPackets.cs @@ -45,7 +45,7 @@ namespace Game.Networking.Packets public PlayerInteractionType InteractionType; public bool Success = true; } - + public class GossipMessagePkt : ServerPacket { public GossipMessagePkt() : base(ServerOpcodes.GossipMessage) { } @@ -122,7 +122,7 @@ namespace Game.Networking.Packets public int GossipNpcOptionID; public int? FriendshipFactionID; } - + public class GossipComplete : ServerPacket { public bool SuppressSound; @@ -230,6 +230,20 @@ namespace Game.Networking.Packets public ObjectGuid Healer; } + class TabardVendorActivate : ClientPacket + { + public ObjectGuid Vendor; + public int Type; + + public TabardVendorActivate(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Vendor = _worldPacket.ReadPackedGuid(); + Type = _worldPacket.ReadInt32(); + } + } + class TrainerBuySpell : ClientPacket { public TrainerBuySpell(WorldPacket packet) : base(packet) { } @@ -238,7 +252,7 @@ namespace Game.Networking.Packets { TrainerGUID = _worldPacket.ReadPackedGuid(); TrainerID = _worldPacket.ReadUInt32(); - SpellID= _worldPacket.ReadUInt32(); + SpellID = _worldPacket.ReadUInt32(); } public ObjectGuid TrainerGUID; @@ -289,7 +303,7 @@ namespace Game.Networking.Packets public uint PetNumber; public byte DestSlot; } - + //Structs public struct TreasureItem { @@ -406,7 +420,7 @@ namespace Game.Networking.Packets data.WriteBit(DoNotFilterOnVendor); data.WriteBit(Refundable); data.FlushBits(); - + Item.Write(data); } diff --git a/Source/Game/Networking/Packets/PartyPackets.cs b/Source/Game/Networking/Packets/PartyPackets.cs index dde7fa4bb..0af922306 100644 --- a/Source/Game/Networking/Packets/PartyPackets.cs +++ b/Source/Game/Networking/Packets/PartyPackets.cs @@ -1042,17 +1042,17 @@ namespace Game.Networking.Packets { public PartyMemberPhase(uint flags, uint id) { - Flags = (ushort)flags; + Flags = flags; Id = (ushort)id; } public void Write(WorldPacket data) { - data.WriteUInt16(Flags); + data.WriteUInt32(Flags); data.WriteUInt16(Id); } - public ushort Flags; + public uint Flags; public ushort Id; } diff --git a/Source/Game/Networking/Packets/QueryPackets.cs b/Source/Game/Networking/Packets/QueryPackets.cs index eeab3253a..2ceb40c38 100644 --- a/Source/Game/Networking/Packets/QueryPackets.cs +++ b/Source/Game/Networking/Packets/QueryPackets.cs @@ -601,9 +601,9 @@ namespace Game.Networking.Packets ClassID = player.GetClass(); Level = (byte)player.GetLevel(); - DeclinedName names = player.GetDeclinedNames(); + DeclinedNames names = player.GetDeclinedNames(); if (names != null) - DeclinedNames = names; + DeclinedNames = new(names); } else { diff --git a/Source/Game/Networking/Packets/ReputationPackets.cs b/Source/Game/Networking/Packets/ReputationPackets.cs index 5c4a00ac7..5fb1a13df 100644 --- a/Source/Game/Networking/Packets/ReputationPackets.cs +++ b/Source/Game/Networking/Packets/ReputationPackets.cs @@ -8,7 +8,7 @@ namespace Game.Networking.Packets { public class InitializeFactions : ServerPacket { - const ushort FactionCount = 443; + const ushort FactionCount = 1000; public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { } diff --git a/Source/Game/Networking/Packets/SocialPackets.cs b/Source/Game/Networking/Packets/SocialPackets.cs index 1abe5eaa3..2d3d15127 100644 --- a/Source/Game/Networking/Packets/SocialPackets.cs +++ b/Source/Game/Networking/Packets/SocialPackets.cs @@ -93,7 +93,7 @@ namespace Game.Networking.Packets public override void Read() { uint nameLength = _worldPacket.ReadBits(9); - uint noteslength = _worldPacket.ReadBits(10); + uint noteslength = _worldPacket.ReadBits(9); Name = _worldPacket.ReadString(nameLength); Notes = _worldPacket.ReadString(noteslength); } diff --git a/Source/Game/Networking/Packets/SystemPackets.cs b/Source/Game/Networking/Packets/SystemPackets.cs index ab59a0a0c..afc7f1041 100644 --- a/Source/Game/Networking/Packets/SystemPackets.cs +++ b/Source/Game/Networking/Packets/SystemPackets.cs @@ -83,9 +83,13 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(ChatDisabledByPlayer); _worldPacket.WriteBit(LFGListCustomRequiresAuthenticator); _worldPacket.WriteBit(AddonsDisabled); - _worldPacket.WriteBit(Unused1000); + _worldPacket.WriteBit(WarGamesEnabled); _worldPacket.WriteBit(ContentTrackingEnabled); _worldPacket.WriteBit(IsSellAllJunkEnabled); + _worldPacket.WriteBit(IsGroupFinderEnabled); + _worldPacket.WriteBit(IsLFDEnabled); + _worldPacket.WriteBit(IsLFREnabled); + _worldPacket.WriteBit(IsPremadeGroupEnabled); _worldPacket.FlushBits(); @@ -177,9 +181,13 @@ namespace Game.Networking.Packets public bool ChatDisabledByPlayer; public bool LFGListCustomRequiresAuthenticator; public bool AddonsDisabled; - public bool Unused1000; + public bool WarGamesEnabled; // classic only public bool ContentTrackingEnabled; public bool IsSellAllJunkEnabled; + public bool IsGroupFinderEnabled = true; // classic only + public bool IsLFDEnabled = true; // classic only + public bool IsLFREnabled = true; // classic only + public bool IsPremadeGroupEnabled = true; // classic only public SocialQueueConfig QuickJoinConfig; public SquelchInfo Squelch; @@ -361,26 +369,6 @@ namespace Game.Networking.Packets public string RealmHiddenAlert; } - public class MOTD : ServerPacket - { - public MOTD() : base(ServerOpcodes.Motd) { } - - public override void Write() - { - _worldPacket.WriteBits(Text.Count, 4); - _worldPacket.FlushBits(); - - foreach (var line in Text) - { - _worldPacket.WriteBits(line.GetByteCount(), 7); - _worldPacket.FlushBits(); - _worldPacket.WriteString(line); - } - } - - public List Text; - } - public class SetTimeZoneInformation : ServerPacket { public SetTimeZoneInformation() : base(ServerOpcodes.SetTimeZoneInformation) { } diff --git a/Source/Game/Networking/Packets/WhoPackets.cs b/Source/Game/Networking/Packets/WhoPackets.cs index dba782179..f543c5910 100644 --- a/Source/Game/Networking/Packets/WhoPackets.cs +++ b/Source/Game/Networking/Packets/WhoPackets.cs @@ -42,9 +42,11 @@ namespace Game.Networking.Packets public override void Read() { uint areasCount = _worldPacket.ReadBits(4); + IsFromAddOn = _worldPacket.HasBit(); Request.Read(_worldPacket); RequestID = _worldPacket.ReadUInt32(); + Origin = _worldPacket.ReadUInt8(); for (int i = 0; i < areasCount; ++i) Areas.Add(_worldPacket.ReadInt32()); @@ -52,6 +54,8 @@ namespace Game.Networking.Packets public WhoRequest Request = new(); public uint RequestID; + public byte Origin; // 1 = Social, 2 = Chat, 3 = Item + public bool IsFromAddOn; public List Areas= new(); } diff --git a/Source/Game/World/WorldManager.cs b/Source/Game/World/WorldManager.cs index e04ddfb00..7435ac829 100644 --- a/Source/Game/World/WorldManager.cs +++ b/Source/Game/World/WorldManager.cs @@ -1899,9 +1899,13 @@ namespace Game public void SendServerMessage(ServerMessageType messageID, string stringParam = "", Player player = null) { + ServerMessagesRecord serverMessage = CliDB.ServerMessagesStorage.LookupByKey(messageID); + if (serverMessage == null) + return; + ChatServerMessage packet = new(); packet.MessageID = (int)messageID; - if (messageID <= ServerMessageType.String) + if (serverMessage.Text[player != null ? player.GetSession().GetSessionDbcLocale() : GetDefaultDbcLocale()].Contains("%s")) packet.StringParam = stringParam; if (player != null)