From aaa669210ab0bb9fd1afe0d5deae19e02ea44b84 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 25 Aug 2025 20:48:29 -0400 Subject: [PATCH] Core: Updated to 11.2.0 Port From (https://github.com/TrinityCore/TrinityCore/commit/5cf0c6c8bb2c4e58a2d66ba5f304af34d18a4782) --- .../Framework/Constants/AchievementConst.cs | 4 +- .../Framework/Constants/AreaTriggerConst.cs | 24 + Source/Framework/Constants/GameObjectConst.cs | 2 + Source/Framework/Constants/ItemConst.cs | 57 +- Source/Framework/Constants/Network/Opcodes.cs | 4249 ++++++++--------- Source/Framework/Constants/PlayerConst.cs | 13 +- Source/Framework/Constants/SharedConst.cs | 1824 ++++--- .../Constants/Spells/SpellAuraConst.cs | 3 + .../Framework/Constants/Spells/SpellConst.cs | 4 + Source/Framework/Database/DatabaseUpdater.cs | 4 +- .../Database/Databases/CharacterDatabase.cs | 31 +- .../Database/Databases/HotfixDatabase.cs | 43 +- Source/Game/Achievements/CriteriaHandler.cs | 20 +- Source/Game/Chat/Commands/ListCommands.cs | 2 - .../DataStorage/AreaTriggerDataStorage.cs | 6 +- Source/Game/DataStorage/CliDB.cs | 20 +- Source/Game/DataStorage/Structs/A_Records.cs | 2 +- Source/Game/DataStorage/Structs/B_Records.cs | 16 +- Source/Game/DataStorage/Structs/C_Records.cs | 8 +- Source/Game/DataStorage/Structs/E_Records.cs | 1 + Source/Game/DataStorage/Structs/I_Records.cs | 1 + Source/Game/DataStorage/Structs/M_Records.cs | 5 +- Source/Game/DataStorage/Structs/S_Records.cs | 10 +- Source/Game/DataStorage/Structs/U_Records.cs | 2 +- Source/Game/DataStorage/Structs/W_Records.cs | 2 - .../Game/Entities/AreaTrigger/AreaTrigger.cs | 459 +- .../AreaTrigger/AreaTriggerTemplate.cs | 38 +- Source/Game/Entities/Creature/CreatureData.cs | 2 + .../Entities/GameObject/GameObjectData.cs | 27 +- Source/Game/Entities/Item/Item.cs | 16 +- .../Entities/Object/Update/UpdateField.cs | 68 +- .../Entities/Object/Update/UpdateFields.cs | 2502 +++++++--- Source/Game/Entities/Object/WorldObject.cs | 153 +- Source/Game/Entities/Player/Player.DB.cs | 167 +- Source/Game/Entities/Player/Player.Fields.cs | 27 - Source/Game/Entities/Player/Player.Items.cs | 354 +- Source/Game/Entities/Player/Player.Talents.cs | 24 +- Source/Game/Entities/Player/Player.cs | 21 +- Source/Game/Entities/Unit/Unit.Fields.cs | 2 + Source/Game/Entities/Unit/Unit.cs | 9 +- Source/Game/Globals/ObjectManager.cs | 35 +- Source/Game/Guilds/Guild.cs | 18 +- Source/Game/Handlers/AuthenticationHandler.cs | 1 - Source/Game/Handlers/BankHandler.cs | 224 +- Source/Game/Handlers/CharacterHandler.cs | 12 +- Source/Game/Handlers/ItemHandler.cs | 20 - Source/Game/Handlers/TradeHandler.cs | 17 + Source/Game/Handlers/VoidStorageHandler.cs | 230 - .../Networking/Packets/AreaTriggerPackets.cs | 58 - Source/Game/Networking/Packets/BankPackets.cs | 91 +- .../Game/Networking/Packets/InspectPackets.cs | 3 + Source/Game/Networking/Packets/ItemPackets.cs | 25 - .../Networking/Packets/MovementPackets.cs | 4 +- .../Game/Networking/Packets/PartyPackets.cs | 123 +- .../Game/Networking/Packets/QueryPackets.cs | 2 +- .../Game/Networking/Packets/SystemPackets.cs | 32 +- .../Game/Networking/Packets/TalentPackets.cs | 70 +- .../Game/Networking/Packets/TraitPackets.cs | 3 + .../Networking/Packets/VoidStoragePackets.cs | 169 - Source/Game/Spells/Spell.cs | 2 + Source/Game/Spells/SpellHistory.cs | 6 +- Source/Game/Spells/SpellInfo.cs | 4 + Source/Game/Spells/SpellManager.cs | 21 +- 63 files changed, 5958 insertions(+), 5434 deletions(-) delete mode 100644 Source/Game/Handlers/VoidStorageHandler.cs delete mode 100644 Source/Game/Networking/Packets/VoidStoragePackets.cs diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index 46720b948..0df0fdc7c 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -774,10 +774,10 @@ namespace Framework.Constants CompleteQuestsCountOnAccount = 257, /*NYI*/ - WarbandBankTabPurchased = 260, /*NYI*/ + BankTabPurchased = 260, // Bank Tab Purchased in {#BankType} ReachRenownLevel = 261, LearnTaxiNode = 262, - Count = 264 + Count = 270 } public enum CriteriaDataType diff --git a/Source/Framework/Constants/AreaTriggerConst.cs b/Source/Framework/Constants/AreaTriggerConst.cs index c28e6fb06..1bae22981 100644 --- a/Source/Framework/Constants/AreaTriggerConst.cs +++ b/Source/Framework/Constants/AreaTriggerConst.cs @@ -46,4 +46,28 @@ namespace Framework.Constants HasCircularMovement = 0x400, // DEPRECATED Unk5 = 0x800, } + + public enum AreaTriggerFieldFlags + { + None = 0x0000, + HeightIgnoresScale = 0x0001, + WowLabsCircle = 0x0002, + CanLoop = 0x0004, + AbsoluteOrientation = 0x0008, + DynamicShape = 0x0010, + Attached = 0x0020, + FaceMovementDir = 0x0040, + FollowsTerrain = 0x0080, + Unknown1025 = 0x0100, + AlwaysExterior = 0x0200, + HasPlayers = 0x0400, + } + + public enum AreaTriggerPathType + { + Spline = 0, + Orbit = 1, + None = 2, + MovementScript = 3 + } } diff --git a/Source/Framework/Constants/GameObjectConst.cs b/Source/Framework/Constants/GameObjectConst.cs index 7af25425a..41403dfd9 100644 --- a/Source/Framework/Constants/GameObjectConst.cs +++ b/Source/Framework/Constants/GameObjectConst.cs @@ -68,6 +68,8 @@ namespace Framework.Constants ClientModel = 60, CraftingTable = 61, PerksProgramChest = 62, + FuturePatch = 63, + AssistAction = 64, Max } diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index 3fa65c6d8..f01c76407 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -144,20 +144,14 @@ namespace Framework.Constants public const byte ItemStart = 35; public const byte ItemEnd = 63; - public const byte BankItemStart = 63; - public const byte BankItemEnd = 91; + public const byte BankBagStart = 63; + public const byte BankBagEnd = 69; - public const byte BankBagStart = 91; - public const byte BankBagEnd = 98; + public const byte BuyBackStart = 69; + public const byte BuyBackEnd = 81; - public const byte BuyBackStart = 98; - public const byte BuyBackEnd = 110; - - public const byte ReagentStart = 110; - public const byte ReagentEnd = 208; - - public const byte ChildEquipmentStart = 208; - public const byte ChildEquipmentEnd = 211; + public const byte ChildEquipmentStart = 81; + public const byte ChildEquipmentEnd = 84; public const byte Bag0 = 255; public const byte DefaultSize = 16; @@ -165,22 +159,22 @@ namespace Framework.Constants enum EquipableSpellSlots { - OffensiveSlot1 = 211, - OffensiveSlot2 = 212, - OffensiveSlot3 = 213, - OffensiveSlot4 = 214, - UtilitySlot1 = 215, - UtilitySlot2 = 216, - UtilitySlot3 = 217, - UtilitySlot4 = 218, - DefensiveSlot1 = 219, - DefensiveSlot2 = 220, - DefensiveSlot3 = 221, - DefensiveSlot4 = 222, - WeaponSlot1 = 223, - WeaponSlot2 = 224, - WeaponSlot3 = 225, - WeaponSlot4 = 226, + OffensiveSlot1 = 84, + OffensiveSlot2 = 85, + OffensiveSlot3 = 86, + OffensiveSlot4 = 87, + UtilitySlot1 = 88, + UtilitySlot2 = 89, + UtilitySlot3 = 90, + UtilitySlot4 = 91, + DefensiveSlot1 = 92, + DefensiveSlot2 = 93, + DefensiveSlot3 = 94, + DefensiveSlot4 = 95, + WeaponSlot1 = 96, + WeaponSlot2 = 97, + WeaponSlot3 = 98, + WeaponSlot4 = 99, } public struct EquipmentSlot @@ -761,7 +755,7 @@ namespace Framework.Constants BnetAccountUntilEquipped = 9, } - public enum ItemClass : sbyte + public enum ItemClass : int { None = -1, Consumable = 0, @@ -1399,6 +1393,8 @@ namespace Framework.Constants BankNotAccessible = 128,// This Character Does Not Have Access To This Bank. CantTradeAccountItem = 129,// You Can't Trade An Item From The Warband Bank. AccountMoneyLocked = 130,// You cannot withdraw or deposit gold from the warband bank currently; please try again later. + CharacterBankNotAccessible = 131,// This character does not have access to this bank. + CharacterBankNotConverted = 132,// Your character's bank has not been converted. Please try again later. } public enum BankType @@ -1531,6 +1527,9 @@ namespace Framework.Constants PriorityJunk = 0x10, PriorityQuestItems = 0x20, ExcludeJunkSell = 0x40, + PriorityReagents = 0x80, + ExpansionCurrent = 0x100, + ExpansionLegacy = 0x200, } public enum LootStoreItemType diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index 09776f39b..123d91942 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -5,2138 +5,2135 @@ namespace Framework.Constants { public enum ClientOpcodes : uint { - AbandonNpeResponse = 0x31029a, - AcceptGuildInvite = 0x360029, - AcceptReturningPlayerPrompt = 0x31025b, - AcceptSocialContract = 0x360172, - AcceptTrade = 0x310004, - AcceptWargameInvite = 0x36000c, - AccountBankDepositMoney = 0x3102dd, - AccountBankWithdrawMoney = 0x3102de, - AccountNotificationAcknowledged = 0x36015e, - AccountStoreBeginPurchaseOrRefund = 0x3600be, - ActivateSoulbind = 0x310289, - ActivateTaxi = 0x32003e, - AddonList = 0x360004, - AddAccountCosmetic = 0x310170, - AddBattlenetFriend = 0x360084, - AddFriend = 0x3600fc, - AddIgnore = 0x360100, - AddToy = 0x31016f, - AdventureJournalOpenQuest = 0x3100b3, - AdventureJournalUpdateSuggestions = 0x31028c, - AdventureMapStartQuest = 0x31022c, - AlterAppearance = 0x32008f, - AreaSpiritHealerQuery = 0x320043, - AreaSpiritHealerQueue = 0x320044, - AreaTrigger = 0x310086, - ArtifactAddPower = 0x310056, - ArtifactSetAppearance = 0x310058, - AssignEquipmentSetSpec = 0x3100bf, - AttackStop = 0x31011d, - AttackSwing = 0x31011c, - AuctionableTokenSell = 0x360112, - AuctionableTokenSellAtMarketPrice = 0x360113, - AuctionBrowseQuery = 0x320063, - AuctionCancelCommoditiesPurchase = 0x32006b, - AuctionConfirmCommoditiesPurchase = 0x32006a, - AuctionGetCommodityQuote = 0x320069, - AuctionHelloRequest = 0x32005e, - AuctionListBiddedItems = 0x320067, - AuctionListBucketsByBucketKeys = 0x320068, - AuctionListItemsByBucketKey = 0x320064, - AuctionListItemsByItemId = 0x320065, - AuctionListOwnedItems = 0x320066, - AuctionPlaceBid = 0x320062, - AuctionRemoveItem = 0x320060, - AuctionReplicateItems = 0x320061, - AuctionSellCommodity = 0x32006c, - AuctionSellItem = 0x32005f, - AuctionSetFavoriteItem = 0x36015f, - AuthContinuedSession = 0x370002, - AuthSession = 0x370001, - AutobankItem = 0x330003, - AutobankReagent = 0x330005, - AutostoreBankItem = 0x330002, - AutostoreBankReagent = 0x330004, - AutoDepositAccountBank = 0x3102e7, - AutoEquipItem = 0x330006, - AutoEquipItemSlot = 0x33000b, - AutoGuildBankItem = 0x32004a, - AutoStoreBagItem = 0x330007, - AutoStoreGuildBankItem = 0x320053, - AzeriteEmpoweredItemSelectPower = 0x310257, - AzeriteEmpoweredItemViewed = 0x310238, - AzeriteEssenceActivateEssence = 0x310259, - AzeriteEssenceUnlockMilestone = 0x310258, - BankerActivate = 0x320046, - BattlefieldLeave = 0x31001f, - BattlefieldList = 0x31002a, - BattlefieldPort = 0x3200c5, - BattlemasterHello = 0x31018e, - BattlemasterJoin = 0x3200bc, - BattlemasterJoinArena = 0x3200bd, - BattlemasterJoinBrawl = 0x3200c3, - BattlemasterJoinRatedBgBlitz = 0x3200bf, - BattlemasterJoinRatedSoloShuffle = 0x3200be, - BattlemasterJoinSkirmish = 0x3200c0, - BattlenetChallengeResponse = 0x3600ff, - BattlenetRequest = 0x360120, - BattlePayAckFailedResponse = 0x3600f9, - BattlePayCancelOpenCheckout = 0x36013c, - BattlePayConfirmPurchaseResponse = 0x3600f8, - BattlePayDistributionAssignToTarget = 0x3600ef, - BattlePayDistributionAssignVas = 0x360162, - BattlePayGetProductList = 0x3600e6, - BattlePayGetPurchaseList = 0x3600e7, - BattlePayOpenCheckout = 0x360135, - BattlePayRequestPriceInfo = 0x360131, - BattlePayStartPurchase = 0x3600f7, - BattlePayStartVasPurchase = 0x36011e, - BattlePetClearFanfare = 0x2b0002, - BattlePetDeletePet = 0x36004f, - BattlePetDeletePetCheat = 0x360050, - BattlePetModifyName = 0x360052, - BattlePetRequestJournal = 0x36004e, - BattlePetRequestJournalLock = 0x36004d, - BattlePetSetBattleSlot = 0x360057, - BattlePetSetFlags = 0x36005a, - BattlePetSummon = 0x360053, - BattlePetUpdateDisplayNotify = 0x310090, - BattlePetUpdateNotify = 0x31008f, - BeginTrade = 0x310001, - BinderActivate = 0x320045, - BlackMarketBidOnItem = 0x3200cd, - BlackMarketOpen = 0x3200cb, - BlackMarketRequestItems = 0x3200cc, - BonusRoll = 0x31025a, - BugReport = 0x3600af, - BusyTrade = 0x310002, - BuyAccountBankTab = 0x320122, - BuyBackItem = 0x320037, - BuyBankSlot = 0x320047, - BuyItem = 0x320036, - BuyReagentBank = 0x320048, - CageBattlePet = 0x3100a3, - CalendarAddEvent = 0x3600a7, - CalendarCommunityInvite = 0x36009b, - CalendarComplain = 0x3600a3, - CalendarCopyEvent = 0x3600a2, - CalendarEventSignUp = 0x3600a5, - CalendarGet = 0x360099, - CalendarGetEvent = 0x36009a, - CalendarGetNumPending = 0x3600a4, - CalendarInvite = 0x36009c, - CalendarModeratorStatus = 0x3600a0, - CalendarRemoveEvent = 0x3600a1, - CalendarRemoveInvite = 0x36009d, - CalendarRsvp = 0x36009e, - CalendarStatus = 0x36009f, - CalendarUpdateEvent = 0x3600a8, - CancelAura = 0x31005a, - CancelAutoRepeatSpell = 0x320081, - CancelCast = 0x310176, - CancelChannelling = 0x310137, - CancelGrowthAura = 0x31013f, - CancelMasterLootRoll = 0x3100cc, - CancelModSpeedNoControlAuras = 0x310059, - CancelMountAura = 0x310152, - CancelQueuedSpell = 0x31002b, - CancelTempEnchantment = 0x32008c, - CancelTrade = 0x310006, - CanDuel = 0x36008c, - CanRedeemTokenForBalance = 0x360130, - CastSpell = 0x310173, - ChallengeModeRequestLeaders = 0x2e0002, - ChangeBagSlotFlag = 0x310210, - ChangeBankBagSlotFlag = 0x310211, - ChangeMonumentAppearance = 0x3101f1, - ChangeRealmTicket = 0x360125, - ChangeSubGroup = 0x360076, - CharacterCheckUpgrade = 0x3600f2, - CharacterRenameRequest = 0x3600ed, - CharacterUpgradeManualUnrevokeRequest = 0x3600f0, - CharacterUpgradeStart = 0x3600f1, - CharCustomize = 0x3600b6, - CharDelete = 0x3600c8, - CharRaceOrFactionChange = 0x3600bc, - ChatAddonMessage = 0x2d002a, - ChatAddonMessageTargeted = 0x2d002b, - ChatCanLocalWhisperTargetRequest = 0x2d0032, - ChatChannelAnnouncements = 0x2d001f, - ChatChannelBan = 0x2d001d, - ChatChannelDeclineInvite = 0x2d0022, - ChatChannelDisplayList = 0x2d0012, - ChatChannelInvite = 0x2d001b, - ChatChannelKick = 0x2d001c, - ChatChannelList = 0x2d0011, - ChatChannelModerate = 0x2d0016, - ChatChannelModerator = 0x2d0017, - ChatChannelOwner = 0x2d0015, - ChatChannelPassword = 0x2d0013, - ChatChannelSetOwner = 0x2d0014, - ChatChannelSilenceAll = 0x2d0020, - ChatChannelUnban = 0x2d001e, - ChatChannelUnmoderator = 0x2d0018, - ChatChannelUnsilenceAll = 0x2d0021, - ChatDropCautionaryChatMessage = 0x2d000a, - ChatJoinChannel = 0x2d0000, - ChatLeaveChannel = 0x2d0001, - ChatLobbyMatchmakerMessageInstanceChat = 0x2d0031, - ChatLobbyMatchmakerMessageParty = 0x2d0030, - ChatMessageAfk = 0x2d000f, - ChatMessageChannel = 0x2d0007, - ChatMessageDnd = 0x2d0010, - ChatMessageEmote = 0x2d0024, - ChatMessageGuild = 0x2d000d, - ChatMessageInstanceChat = 0x2d0028, - ChatMessageOfficer = 0x2d000e, - ChatMessageParty = 0x2d0026, - ChatMessageRaid = 0x2d0027, - ChatMessageRaidWarning = 0x2d0029, - ChatMessageSay = 0x2d0023, - ChatMessageWhisper = 0x2d0008, - ChatMessageYell = 0x2d0025, - ChatRegisterAddonPrefixes = 0x2d0005, - ChatReportFiltered = 0x2d0004, - ChatReportIgnored = 0x2d0003, - ChatSendCautionaryChannelMessage = 0x2d000b, - ChatSendCautionaryChatMessage = 0x2d0009, - ChatUnregisterAllAddonPrefixes = 0x2d0006, - CheckCharacterNameAvailability = 0x36006f, - CheckIsAdventureMapPoiValid = 0x31010e, - ChoiceResponse = 0x31017b, - ChromieTimeSelectExpansion = 0x310288, - ClaimWeeklyReward = 0x310265, - ClassTalentsDeleteConfig = 0x3102c2, - ClassTalentsNotifyEmptyConfig = 0x3100c3, - ClassTalentsNotifyValidationFailed = 0x3102c4, - ClassTalentsRenameConfig = 0x3102c1, - ClassTalentsRequestNewConfig = 0x3102c0, - ClassTalentsSetStarterBuildActive = 0x3102c5, - ClassTalentsSetUsesSharedActionBars = 0x3100c2, - ClearNewAppearance = 0x2b0005, - ClearRaidMarker = 0x310052, - ClearTradeItem = 0x310008, - ClientPortGraveyard = 0x3200c7, - CloseInteraction = 0x320025, - CloseQuestChoice = 0x31017c, - CloseRuneforgeInteraction = 0x310290, - CloseTraitSystemInteraction = 0x3102c6, - ClubFinderApplicationResponse = 0x360147, - ClubFinderGetApplicantsList = 0x360145, - ClubFinderPost = 0x360142, - ClubFinderRequestClubsData = 0x360149, - ClubFinderRequestClubsList = 0x360143, - ClubFinderRequestMembershipToClub = 0x360144, - ClubFinderRequestPendingClubsList = 0x360148, - ClubFinderRequestSubscribedClubPostingIds = 0x36014a, - ClubFinderRespondToApplicant = 0x360146, - ClubFinderWhisperApplicantRequest = 0x360165, - ClubPresenceSubscribe = 0x360122, - CollectionItemSetFavorite = 0x36005d, - CommentatorEnable = 0x36001c, - CommentatorEnterInstance = 0x360020, - CommentatorExitInstance = 0x360021, - CommentatorGetMapInfo = 0x36001d, - CommentatorGetPlayerCooldowns = 0x36001f, - CommentatorGetPlayerInfo = 0x36001e, - CommentatorSpectate = 0x360163, - CommentatorStartWargame = 0x36001b, - CommerceTokenGetCount = 0x360110, - CommerceTokenGetLog = 0x36011a, - CommerceTokenGetMarketPrice = 0x360111, - Complaint = 0x360096, - CompleteCinematic = 0x3200e5, - CompleteMovie = 0x320077, - ConfirmArtifactRespec = 0x310057, - ConfirmProfessionRespec = 0x3100c6, - ConfirmRespecWipe = 0x3100c5, - ConnectToFailed = 0x360000, - ConsumableTokenBuy = 0x360115, - ConsumableTokenBuyAtMarketPrice = 0x360116, - ConsumableTokenCanVeteranBuy = 0x360114, - ConsumableTokenRedeem = 0x360118, - ConsumableTokenRedeemConfirmation = 0x360119, - ContentTrackingStartTracking = 0x3102d6, - ContentTrackingStopTracking = 0x3102d7, - ContributionContribute = 0x3200fa, - ContributionLastUpdateRequest = 0x3200fb, - ConversationCinematicReady = 0x3200e7, - ConversationLineStarted = 0x3200e6, - ConvertItemToBindToAccount = 0x3102e6, - ConvertRaid = 0x360078, - CovenantRenownRequestCatchupState = 0x32010e, - CraftingOrderCancel = 0x32011a, - CraftingOrderClaim = 0x320117, - CraftingOrderCreate = 0x320113, - CraftingOrderFulfill = 0x320119, - CraftingOrderGetNpcRewardInfo = 0x320116, - CraftingOrderListCrafterOrders = 0x320115, - CraftingOrderListMyOrders = 0x320114, - CraftingOrderReject = 0x32011b, - CraftingOrderRelease = 0x320118, - CraftingOrderReportPlayer = 0x32011c, - CraftingOrderUpdateIgnoreList = 0x32011d, - CreateCharacter = 0x36006e, - CreateShipment = 0x3101da, - DbQueryBulk = 0x360010, - DeclineGuildInvites = 0x3200b9, - DeclinePetition = 0x3200d4, - DeleteEquipmentSet = 0x3200a5, - DelveTeleportOut = 0x320129, - DelFriend = 0x3600fd, - DelIgnore = 0x360101, - DepositReagentBank = 0x31021a, - DestroyItem = 0x310169, - DfBootPlayerVote = 0x360044, - DfConfirmExpandSearch = 0x360036, - DfGetJoinStatus = 0x360042, - DfGetSystemInfo = 0x360041, - DfJoin = 0x360037, - DfLeave = 0x360040, - DfProposalResponse = 0x360035, - DfReadyCheckResponse = 0x360048, - DfSetRoles = 0x360043, - DfTeleport = 0x360045, - DiscardedTimeSyncAcks = 0x34005e, - DismissCritter = 0x320093, - DoCountdown = 0x360141, - DoMasterLootRoll = 0x3100cb, - DoReadyCheck = 0x36005e, - DuelResponse = 0x32007c, - EjectPassenger = 0x310103, - Emote = 0x3200e1, - EnableNagle = 0x370007, - EnableTaxiNode = 0x32003c, - EngineSurvey = 0x36010f, - EnterEncryptedModeAck = 0x370003, - EnumCharacters = 0x360014, - EnumCharactersDeletedByClient = 0x360109, - FarSight = 0x320082, - GameEventDebugDisable = 0x31005e, - GameEventDebugEnable = 0x31005d, - GameObjReportUse = 0x320089, - GameObjUse = 0x320088, - GarrisonAddFollowerHealth = 0x3101d5, - GarrisonAssignFollowerToBuilding = 0x3101bb, - GarrisonCancelConstruction = 0x3101a8, - GarrisonCheckUpgradeable = 0x31020c, - GarrisonCompleteMission = 0x3101fe, - GarrisonFullyHealAllFollowers = 0x3101d6, - GarrisonGenerateRecruits = 0x3101be, - GarrisonGetClassSpecCategoryInfo = 0x3101cd, - GarrisonGetMapData = 0x3101d4, - GarrisonGetMissionReward = 0x310230, - GarrisonLearnTalent = 0x3101c9, - GarrisonMissionBonusRoll = 0x310200, - GarrisonPurchaseBuilding = 0x3101a4, - GarrisonRecruitFollower = 0x3101c0, - GarrisonRemoveFollower = 0x3101f5, - GarrisonRemoveFollowerFromBuilding = 0x3101bc, - GarrisonRenameFollower = 0x3101bd, - GarrisonRequestBlueprintAndSpecializationData = 0x3101a3, - GarrisonRequestShipmentInfo = 0x3101d8, - GarrisonResearchTalent = 0x3101c1, - GarrisonSetBuildingActive = 0x3101a5, - GarrisonSetFollowerFavorite = 0x3101b9, - GarrisonSetFollowerInactive = 0x3101b1, - GarrisonSetRecruitmentPreferences = 0x3101bf, - GarrisonSocketTalent = 0x31029d, - GarrisonStartMission = 0x3101fd, - GarrisonSwapBuildings = 0x3101a9, - GenerateRandomCharacterName = 0x360013, - GetAccountCharacterList = 0x3600e1, - GetAccountNotifications = 0x36015d, - GetGarrisonInfo = 0x31019e, - GetItemPurchaseData = 0x3200cf, - GetLandingPageShipments = 0x3101d9, - GetMirrorImageData = 0x31016d, - GetPvpOptionsEnabled = 0x36001a, - GetRafAccountInfo = 0x36014b, - GetRegionwideCharacterRestrictionAndMailData = 0x36018e, - GetRemainingGameTime = 0x360117, - GetTrophyList = 0x3101ee, - GetUndeleteCharacterCooldownStatus = 0x36010b, - GetVasAccountCharacterList = 0x36011c, - GetVasTransferTargetRealmList = 0x36011d, - GmTicketAcknowledgeSurvey = 0x3600ba, - GmTicketGetCaseStatus = 0x3600b9, - GmTicketGetSystemStatus = 0x3600b8, - GossipRefreshOptions = 0x32010d, - GossipSelectOption = 0x320026, - GuildAddBattlenetFriend = 0x2f0020, - GuildAddRank = 0x2f0005, - GuildAssignMemberRank = 0x2f0002, - GuildBankActivate = 0x320049, - GuildBankBuyTab = 0x320057, - GuildBankDepositMoney = 0x320059, - GuildBankLogQuery = 0x2f0019, - GuildBankQueryTab = 0x320056, - GuildBankRemainingWithdrawMoneyQuery = 0x2f001a, - GuildBankSetTabText = 0x2f001d, - GuildBankTextQuery = 0x2f001e, - GuildBankUpdateTab = 0x320058, - GuildBankWithdrawMoney = 0x32005a, - GuildChallengeUpdateRequest = 0x2f0017, - GuildChangeNameRequest = 0x2f0018, - GuildDeclineInvitation = 0x36002a, - GuildDelete = 0x2f0009, - GuildDeleteRank = 0x2f0006, - GuildDemoteMember = 0x2f0001, - GuildEventLogQuery = 0x2f001c, - GuildGetAchievementMembers = 0x2f0012, - GuildGetRanks = 0x2f000e, - GuildGetRoster = 0x2f0014, - GuildInviteByName = 0x360034, - GuildLeave = 0x2f0003, - GuildNewsUpdateSticky = 0x2f000f, - GuildOfficerRemoveMember = 0x2f0004, - GuildPermissionsQuery = 0x2f001b, - GuildPromoteMember = 0x2f0000, - GuildQueryMembersForRecipe = 0x2f000c, - GuildQueryMemberRecipes = 0x2f000a, - GuildQueryNews = 0x2f000d, - GuildQueryRecipes = 0x2f000b, - GuildReplaceGuildMaster = 0x2f001f, - GuildRequestRename = 0x2f0023, - GuildRequestRenameNameCheck = 0x2f0022, - GuildRequestRenameRefund = 0x2f0024, - GuildRequestRenameStatus = 0x2f0021, - GuildSetAchievementTracking = 0x2f0010, - GuildSetFocusedAchievement = 0x2f0011, - GuildSetGuildMaster = 0x3600f4, - GuildSetMemberNote = 0x2f0013, - GuildSetRankPermissions = 0x2f0008, - GuildShiftRank = 0x2f0007, - GuildUpdateInfoText = 0x2f0016, - GuildUpdateMotdText = 0x2f0015, - HearthAndResurrect = 0x3200a1, - HideQuestChoice = 0x31017d, - HotfixRequest = 0x360011, - IgnoreTrade = 0x310003, - InitiateRolePoll = 0x360006, - InitiateTrade = 0x310000, - Inspect = 0x3200c9, - InstanceLockResponse = 0x3200a6, - IslandQueue = 0x310261, - ItemPurchaseRefund = 0x3200d0, - ItemTextQuery = 0x31020d, - JoinPetBattleQueue = 0x31008d, - JoinRatedBattleground = 0x310025, - KeepAlive = 0x3600a9, - KeyboundOverride = 0x3100e1, - LatencyReport = 0x37000d, - LearnPvpTalents = 0x3200f9, - LearnTalents = 0x3200f7, - LeaveGroup = 0x360073, - LeavePetBattleQueue = 0x31008e, - LfgListApplyToGroup = 0x36003b, - LfgListCancelApplication = 0x36003c, - LfgListDeclineApplicant = 0x36003d, - LfgListGetStatus = 0x360039, - LfgListInviteApplicant = 0x36003e, - LfgListInviteResponse = 0x36003f, - LfgListJoin = 0x310255, - LfgListLeave = 0x360038, - LfgListSearch = 0x36003a, - LfgListUpdateRequest = 0x310256, - ListInventory = 0x320033, - LiveRegionAccountRestore = 0x3600e4, - LiveRegionCharacterCopy = 0x3600e3, - LiveRegionGetAccountCharacterList = 0x3600e2, - LiveRegionKeyBindingsCopy = 0x3600e5, - LoadingScreenNotify = 0x360024, - LoadSelectedTrophy = 0x3101ef, - LobbyMatchmakerAbandonQueue = 0x360170, - LobbyMatchmakerAcceptPartyInvite = 0x360167, - LobbyMatchmakerCreateCharacter = 0x360179, - LobbyMatchmakerEnterQueue = 0x36016e, - LobbyMatchmakerLeaveParty = 0x36016a, - LobbyMatchmakerPartyInvite = 0x360166, - LobbyMatchmakerPartyUninvite = 0x360169, - LobbyMatchmakerQueuePropsalResponse = 0x36016f, - LobbyMatchmakerRejectPartyInvite = 0x360168, - LobbyMatchmakerSetPartyPlaylistEntry = 0x36016b, - LobbyMatchmakerSetPlayerReady = 0x36016c, - LogoutCancel = 0x320072, - LogoutInstant = 0x320073, - LogoutLobbyMatchmaker = 0x320121, - LogoutRequest = 0x320071, - LogDisconnect = 0x370005, - LogStreamingError = 0x370009, - LootItem = 0x3100c9, - LootMoney = 0x3100c8, - LootRelease = 0x3100cd, - LootRoll = 0x3100ce, - LootUnit = 0x3100c7, - LowLevelRaid1 = 0x3600cc, - LowLevelRaid2 = 0x3200ad, - MailCreateTextItem = 0x3200db, - MailDelete = 0x3100e3, - MailGetList = 0x3200d6, - MailMarkAsRead = 0x3200da, - MailReturnToSender = 0x36007f, - MailTakeItem = 0x3200d8, - MailTakeMoney = 0x3200d7, - MakeContitionalAppearancePermanent = 0x3100e4, - MasterLootItem = 0x3100ca, - MergeGuildBankItemWithGuildBankItem = 0x320054, - MergeGuildBankItemWithItem = 0x320051, - MergeItemWithGuildBankItem = 0x32004f, - MinimapPing = 0x360075, - MissileTrajectoryCollision = 0x310036, - MountClearFanfare = 0x2b0003, - MountSetFavorite = 0x36005c, - MountSpecialAnim = 0x310153, - MoveAddImpulseAck = 0x34006d, - MoveApplyInertiaAck = 0x34006b, - MoveApplyMovementForceAck = 0x340031, - MoveChangeTransport = 0x34004c, - MoveChangeVehicleSeats = 0x340051, - MoveCollisionDisableAck = 0x340056, - MoveCollisionEnableAck = 0x340057, - MoveDismissVehicle = 0x340050, - MoveDoubleJump = 0x340007, - MoveEnableDoubleJumpAck = 0x34003a, - MoveEnableFullSpeedTurningAck = 0x340083, - MoveEnableSwimToFlyTransAck = 0x340040, - MoveFallLand = 0x340017, - MoveFallReset = 0x340035, - MoveFeatherFallAck = 0x340038, - MoveForceFlightBackSpeedChangeAck = 0x34004b, - MoveForceFlightSpeedChangeAck = 0x34004a, - MoveForcePitchRateChangeAck = 0x34004f, - MoveForceRootAck = 0x34002a, - MoveForceRunBackSpeedChangeAck = 0x340028, - MoveForceRunSpeedChangeAck = 0x340027, - MoveForceSwimBackSpeedChangeAck = 0x34003e, - MoveForceSwimSpeedChangeAck = 0x340029, - MoveForceTurnRateChangeAck = 0x34003f, - MoveForceUnrootAck = 0x34002b, - MoveForceWalkSpeedChangeAck = 0x34003d, - MoveGravityDisableAck = 0x340052, - MoveGravityEnableAck = 0x340053, - MoveGuildBankItem = 0x32004e, - MoveHeartbeat = 0x34002c, - MoveHoverAck = 0x34002f, - MoveInertiaDisableAck = 0x340054, - MoveInertiaEnableAck = 0x340055, - MoveInitActiveMoverComplete = 0x340063, - MoveJump = 0x340006, - MoveKnockBackAck = 0x34002e, - MoveRemoveInertiaAck = 0x34006c, - MoveRemoveMovementForces = 0x340033, - MoveRemoveMovementForceAck = 0x340032, - MoveSetAdvFly = 0x34006f, - MoveSetAdvFlyingAddImpulseMaxSpeedAck = 0x340077, - MoveSetAdvFlyingAirFrictionAck = 0x340072, - MoveSetAdvFlyingBankingRateAck = 0x340078, - MoveSetAdvFlyingDoubleJumpVelModAck = 0x340075, - MoveSetAdvFlyingGlideStartMinHeightAck = 0x340076, - MoveSetAdvFlyingLaunchSpeedCoefficientAck = 0x34007f, - MoveSetAdvFlyingLiftCoefficientAck = 0x340074, - MoveSetAdvFlyingMaxVelAck = 0x340073, - MoveSetAdvFlyingOverMaxDecelerationAck = 0x34007d, - MoveSetAdvFlyingPitchingRateDownAck = 0x340079, - MoveSetAdvFlyingPitchingRateUpAck = 0x34007a, - MoveSetAdvFlyingSurfaceFrictionAck = 0x34007c, - MoveSetAdvFlyingTurnVelocityThresholdAck = 0x34007b, - MoveSetCanAdvFlyAck = 0x34006e, - MoveSetCanDriveAck = 0x340070, - MoveSetCanFlyAck = 0x340043, - MoveSetCanTurnWhileFallingAck = 0x340041, - MoveSetCollisionHeightAck = 0x340058, - MoveSetFacing = 0x340025, - MoveSetFacingHeartbeat = 0x34007e, - MoveSetFly = 0x340045, - MoveSetIgnoreMovementForcesAck = 0x340042, - MoveSetModMovementForceMagnitudeAck = 0x34005f, - MoveSetPitch = 0x340026, - MoveSetRunMode = 0x34000e, - MoveSetTurnRateCheat = 0x340022, - MoveSetVehicleRecIdAck = 0x340030, - MoveSetWalkMode = 0x34000f, - MoveSplineDone = 0x340034, - MoveStartAscend = 0x340046, - MoveStartBackward = 0x340001, - MoveStartDescend = 0x34004d, - MoveStartDriveForward = 0x340071, - MoveStartForward = 0x340000, - MoveStartPitchDown = 0x34000c, - MoveStartPitchUp = 0x34000b, - MoveStartStrafeLeft = 0x340003, - MoveStartStrafeRight = 0x340004, - MoveStartSwim = 0x340018, - MoveStartTurnLeft = 0x340008, - MoveStartTurnRight = 0x340009, - MoveStop = 0x340002, - MoveStopAscend = 0x340047, - MoveStopPitch = 0x34000d, - MoveStopStrafe = 0x340005, - MoveStopSwim = 0x340019, - MoveStopTurn = 0x34000a, - MoveTeleportAck = 0x340016, - MoveTimeSkipped = 0x340037, - MoveUpdateFallSpeed = 0x340036, - MoveWaterWalkAck = 0x340039, - MythicPlusRequestMapStats = 0x2e0001, - NeutralPlayerSelectFaction = 0x310083, - NextCinematicCamera = 0x3200e4, - ObjectUpdateFailed = 0x31002c, - ObjectUpdateRescued = 0x31002d, - OfferPetition = 0x310287, - OpeningCinematic = 0x3200e3, - OpenItem = 0x31020e, - OpenMissionNpc = 0x3101cf, - OpenShipmentNpc = 0x3101d7, - OpenTradeskillNpc = 0x3101e2, - OptOutOfLoot = 0x320090, - OverrideScreenFlash = 0x3200ba, - PartyInvite = 0x360030, - PartyInviteResponse = 0x360032, - PartyUninvite = 0x360071, - PerformItemInteraction = 0x3100ec, - PerksProgramItemsRefreshed = 0x3102af, - PerksProgramRequestCartCheckout = 0x3102b2, - PerksProgramRequestPendingRewards = 0x2b0012, - PerksProgramRequestPurchase = 0x3102b1, - PerksProgramRequestRefund = 0x3102b3, - PerksProgramSetFrozenVendorItem = 0x3102b4, - PerksProgramStatusRequest = 0x3102b0, - PetitionBuy = 0x32005c, - PetitionRenameGuild = 0x3600f5, - PetitionShowList = 0x32005b, - PetitionShowSignatures = 0x32005d, - PetAbandon = 0x32001e, - PetAbandonByNumber = 0x32001f, - PetAction = 0x32001c, - PetBattleFinalNotify = 0x310092, - PetBattleInput = 0x36006b, - PetBattleQueueProposeMatchResult = 0x3100e2, - PetBattleQuitNotify = 0x310091, - PetBattleReplaceFrontPet = 0x36006c, - PetBattleRequestPvp = 0x31008b, - PetBattleRequestUpdate = 0x31008c, - PetBattleRequestWild = 0x310089, - PetBattleScriptErrorNotify = 0x310093, - PetBattleWildLocationFail = 0x31008a, - PetCancelAura = 0x320020, - PetCastSpell = 0x310172, - PetRename = 0x3600ae, - PetSetAction = 0x32001b, - PetSpellAutocast = 0x320021, - PetStopAttack = 0x32001d, - Ping = 0x370004, - PlayerLogin = 0x360016, - PushQuestToParty = 0x320031, - PvpLogData = 0x310028, - QueryBattlePetName = 0x310146, - QueryCorpseLocationFromClient = 0x36008a, - QueryCorpseTransport = 0x36008b, - QueryCountdownTimer = 0x310055, - QueryCreature = 0x310140, - QueryGameObject = 0x310141, - QueryGarrisonPetName = 0x310147, - QueryGuildInfo = 0x3600b4, - QueryInspectAchievements = 0x32009a, - QueryNextMailTime = 0x3200d9, - QueryNpcText = 0x310142, - QueryPageText = 0x310144, - QueryPetition = 0x310148, - QueryPetName = 0x310145, - QueryPlayerNames = 0x37000e, - QueryPlayerNamesForCommunity = 0x37000c, - QueryPlayerNameByCommunityId = 0x37000b, - QueryQuestCompletionNpcs = 0x310021, - QueryQuestInfo = 0x310143, - QueryQuestItemUsability = 0x310022, - QueryRealmName = 0x3600b3, - QueryScenarioPoi = 0x360080, - QuerySelectedWowLabsArea = 0x3102eb, - QueryTime = 0x320070, - QueryTreasurePicker = 0x310233, - QueryVoidStorage = 0x31004e, - QueryWowLabsAreaInfo = 0x3102ec, - QuestConfirmAccept = 0x320030, - QuestGiverAcceptQuest = 0x32002a, - QuestGiverChooseReward = 0x32002c, - QuestGiverCloseQuest = 0x3200ea, - QuestGiverCompleteQuest = 0x32002b, - QuestGiverHello = 0x320028, - QuestGiverQueryQuest = 0x320029, - QuestGiverRequestReward = 0x32002d, - QuestGiverStatusMultipleQuery = 0x32002f, - QuestGiverStatusQuery = 0x32002e, - QuestLogRemoveQuest = 0x3200ce, - QuestPoiQuery = 0x3600db, - QuestPushResult = 0x320032, - QuestSessionBeginResponse = 0x310279, - QuestSessionRequestStart = 0x310278, - QuestSessionRequestStop = 0x360156, - QueuedMessagesEnd = 0x370008, - QuickJoinAutoAcceptRequests = 0x36012e, - QuickJoinRequestInvite = 0x36012d, - QuickJoinRequestInviteWithConfirmation = 0x36015b, - QuickJoinRespondToInvite = 0x36012c, - QuickJoinSignalToastDisplayed = 0x36012b, - RafClaimActivityReward = 0x32009e, - RafClaimNextReward = 0x36014c, - RafGenerateRecruitmentLink = 0x36014e, - RafUpdateRecruitmentInfo = 0x36014d, - RandomRoll = 0x36007e, - ReadyCheckResponse = 0x36005f, - ReadItem = 0x31020f, - ReclaimCorpse = 0x320075, - RemoveNewItem = 0x310237, - RemoveRafRecruit = 0x36014f, - ReorderCharacters = 0x360015, - RepairItem = 0x320086, - ReplaceTrophy = 0x3101f0, - RepopRequest = 0x3200c6, - ReportPvpPlayerAfk = 0x32008e, - ReportServerLag = 0x310271, - ReportStuckInCombat = 0x310272, - RequestAccountData = 0x3600c0, - RequestAreaPoiUpdate = 0x310235, - RequestBattlefieldStatus = 0x360008, - RequestCemeteryList = 0x310023, - RequestCharacterGuildFollowInfo = 0x3600b5, - RequestCovenantCallings = 0x310263, - RequestCrowdControlSpell = 0x3200ca, - RequestCurrencyDataForAccountCharacters = 0x2b0019, - RequestGarrisonTalentWorldQuestUnlocks = 0x31029c, - RequestGuildPartyState = 0x310054, - RequestGuildRewardsList = 0x310053, - RequestLatestSplashScreen = 0x310273, - RequestLfgListBlacklist = 0x31017e, - RequestMythicPlusAffixes = 0x3100b7, - RequestMythicPlusSeasonData = 0x3100b8, - RequestPartyEligibilityForDelveTiers = 0x3102ea, - RequestPartyJoinUpdates = 0x360023, - RequestPartyMemberStats = 0x36007d, - RequestPetInfo = 0x320022, - RequestPlayedTime = 0x31014b, - RequestPvpRewards = 0x310041, - RequestRaidInfo = 0x3600f6, - RequestRatedPvpInfo = 0x36000f, - RequestRealmGuildMasterInfo = 0x360191, - RequestScheduledAreaPoiUpdate = 0x310236, - RequestScheduledPvpInfo = 0x310042, - RequestStabledPets = 0x320023, - RequestStoreFrontInfoUpdate = 0x2b001e, - RequestVehicleExit = 0x3100fe, - RequestVehicleNextSeat = 0x310100, - RequestVehiclePrevSeat = 0x3100ff, - RequestVehicleSwitchSeat = 0x310101, - RequestWeeklyRewards = 0x310266, - RequestWorldQuestUpdate = 0x310234, - ResetChallengeMode = 0x3100b5, - ResetChallengeModeCheat = 0x3100b6, - ResetInstances = 0x360092, - ResurrectResponse = 0x3600ad, - RevertMonumentAppearance = 0x3101f2, - RideVehicleInteract = 0x310102, - RpeResetCharacter = 0x36017c, - SaveAccountDataExport = 0x360176, - SaveCufProfiles = 0x310037, - SaveEquipmentSet = 0x3200a4, - SaveGuildEmblem = 0x310183, - SavePersonalEmblem = 0x310184, - ScenePlaybackCanceled = 0x3100de, - ScenePlaybackComplete = 0x3100dd, - SceneTriggerEvent = 0x3100df, - SeamlessTransferComplete = 0x3102d9, - SelectWowLabsArea = 0x3102ed, - SelfRes = 0x3200d1, - SellAllJunkItems = 0x320035, - SellItem = 0x320034, - SendCharacterClubInvitation = 0x360124, - SendContactList = 0x3600fb, - SendMail = 0x360026, - SendPingUnit = 0x3102db, - SendPingWorldPoint = 0x3102dc, - SendTextEmote = 0x320019, - ServerTimeOffsetRequest = 0x3600c7, - SetupWarbandGroups = 0x36018a, - SetActionBarToggles = 0x3200d2, - SetActionButton = 0x360060, - SetActiveMover = 0x340059, - SetAdvancedCombatLogging = 0x310191, - SetAssistantLeader = 0x360079, - SetBackpackAutosortDisabled = 0x310212, - SetBackpackSellJunkDisabled = 0x310213, - SetBankAutosortDisabled = 0x310214, - SetContactNotes = 0x3600fe, - SetCurrencyFlags = 0x310015, - SetDifficultyId = 0x3100e0, - SetDungeonDifficulty = 0x3600ac, - SetEmpowerMinHoldStagePercent = 0x31013a, - SetEveryoneIsAssistant = 0x360046, - SetExcludedChatCensorSources = 0x36012f, - SetFactionAtWar = 0x320078, - SetFactionInactive = 0x32007a, - SetFactionNotAtWar = 0x320079, - SetGameEventDebugViewState = 0x310065, - SetInsertItemsLeftToRight = 0x310216, - SetLootMethod = 0x360072, - SetLootSpecialization = 0x3200df, - SetPartyAssignment = 0x36007b, - SetPartyLeader = 0x360074, - SetPetFavorite = 0x310012, - SetPetSlot = 0x310011, - SetPetSpecialization = 0x310013, - SetPlayerDeclinedNames = 0x3600b2, - SetPreferredCemetery = 0x310024, - SetPvp = 0x310188, - SetRaidDifficulty = 0x360107, - SetRestrictPingsToAssistants = 0x360047, - SetRole = 0x360005, - SetSavedInstanceExtend = 0x3600b0, - SetSelection = 0x3200c8, - SetSheathed = 0x32001a, - SetSortBagsRightToLeft = 0x310215, - SetTaxiBenchmarkMode = 0x32008d, - SetTitle = 0x310151, - SetTradeCurrency = 0x31000a, - SetTradeGold = 0x310009, - SetTradeItem = 0x310007, - SetUsingPartyGarrison = 0x3101d1, - SetWarMode = 0x310189, - SetWatchedFaction = 0x32007b, - ShowTradeSkill = 0x3600ee, - SignPetition = 0x3200d3, - SilencePartyTalker = 0x36007c, - SocialContractRequest = 0x360171, - SocketGems = 0x320085, - SortAccountBankBags = 0x3102df, - SortBags = 0x310217, - SortBankBags = 0x310218, - SortReagentBankBags = 0x310219, - SpawnTrackingUpdate = 0x310166, - SpectateChange = 0x3102d2, - SpellClick = 0x320027, - SpellEmpowerRelease = 0x310138, - SpellEmpowerRestart = 0x310139, - SpiritHealerActivate = 0x320042, - SplitGuildBankItem = 0x320055, - SplitGuildBankItemToInventory = 0x320052, - SplitItem = 0x33000a, - SplitItemToGuildBank = 0x320050, - StandStateChange = 0x310035, - StartChallengeMode = 0x3200eb, - StartSpectatorWarGame = 0x36000b, - StartWarGame = 0x36000a, - StoreGuildBankItem = 0x32004b, - SubmitUserFeedback = 0x3600bf, - SubscriptionInterstitialResponse = 0x310291, - SummonResponse = 0x360094, - SupportTicketSubmitComplaint = 0x360070, - SurrenderArena = 0x310020, - SuspendCommsAck = 0x370000, - SuspendTokenResponse = 0x370006, - SwapGuildBankItemWithGuildBankItem = 0x32004d, - SwapInvItem = 0x330009, - SwapItem = 0x330008, - SwapItemWithGuildBankItem = 0x32004c, - SwapSubGroups = 0x360077, - SwapVoidItem = 0x310050, - TabardVendorActivate = 0x310185, - TalkToGossip = 0x320024, - TaxiNodeStatusQuery = 0x32003b, - TaxiQueryAvailableNodes = 0x32003d, - TaxiRequestEarlyLanding = 0x32003f, - TimeAdjustmentResponse = 0x34005d, - TimeSyncResponse = 0x34005a, - TimeSyncResponseDropped = 0x34005c, - TimeSyncResponseFailed = 0x34005b, - ToggleDifficulty = 0x360081, - TogglePvp = 0x310187, - TotemDestroyed = 0x320092, - ToyClearFanfare = 0x2b0004, - TradeSkillSetFavorite = 0x310232, - TrainerBuySpell = 0x320041, - TrainerList = 0x320040, - TraitsCommitConfig = 0x3102ba, - TraitsTalentTestUnlearnSpells = 0x3102b8, - TransferCurrencyFromAccountCharacter = 0x3102e8, - TransmogrifyItems = 0x310043, - TurnInPetition = 0x3200d5, - Tutorial = 0x360108, - UiMapQuestLinesRequest = 0x310262, - UnacceptTrade = 0x310005, - UndeleteCharacter = 0x36010a, - UnlearnSkill = 0x32007f, - UnlearnSpecialization = 0x310051, - UnlockVoidStorage = 0x31004d, - UpdateAadcStatus = 0x360161, - UpdateAccountBankTabSettings = 0x320128, - UpdateAccountData = 0x3600c1, - UpdateAreaTriggerVisual = 0x310175, - UpdateClientSettings = 0x36008e, - UpdateCraftingNpcRecipes = 0x3101e3, - UpdateMissileTrajectory = 0x340060, - UpdateRaidTarget = 0x36007a, - UpdateSpellVisual = 0x310174, - UpdateVasPurchaseStates = 0x36011f, - UpgradeGarrison = 0x310199, - UpgradeRuneforgeLegendary = 0x31028f, - UsedFollow = 0x310032, - UseCritterItem = 0x310108, - UseEquipmentSet = 0x330001, - UseItem = 0x31016e, - UseToy = 0x310171, - VasCheckTransferOk = 0x360134, - VasGetQueueMinutes = 0x360133, - VasGetServiceStatus = 0x360132, - ViolenceLevel = 0x310030, - VoiceChannelSttTokenRequest = 0x360138, - VoiceChatJoinChannel = 0x360139, - VoiceChatLogin = 0x360137, - VoidStorageTransfer = 0x31004f, - Warden3Data = 0x360018, - Who = 0x3600ab, - WhoIs = 0x3600aa, - WorldLootObjectClick = 0x3102d5, - WorldPortResponse = 0x360025, - WrapItem = 0x330000, + AbandonNpeResponse = 0x2f0299, + AcceptGuildInvite = 0x340029, + AcceptReturningPlayerPrompt = 0x2f025a, + AcceptSocialContract = 0x340174, + AcceptTrade = 0x2f0004, + AcceptWargameInvite = 0x34000c, + AccountBankDepositMoney = 0x2f02dc, + AccountBankWithdrawMoney = 0x2f02dd, + AccountNotificationAcknowledged = 0x340160, + AccountStoreBeginPurchaseOrRefund = 0x3400c0, + ActivateSoulbind = 0x2f0288, + ActivateTaxi = 0x30003e, + AddonList = 0x340004, + AddAccountCosmetic = 0x2f0171, + AddBattlenetFriend = 0x340086, + AddFriend = 0x3400fe, + AddIgnore = 0x340102, + AddToy = 0x2f0170, + AdventureJournalOpenQuest = 0x2f00b3, + AdventureJournalUpdateSuggestions = 0x2f028b, + AdventureMapStartQuest = 0x2f022b, + AlterAppearance = 0x30008d, + AreaSpiritHealerQuery = 0x300043, + AreaSpiritHealerQueue = 0x300044, + AreaTrigger = 0x2f0086, + ArtifactAddPower = 0x2f0056, + ArtifactSetAppearance = 0x2f0058, + AssignEquipmentSetSpec = 0x2f00bf, + AttackStop = 0x2f011d, + AttackSwing = 0x2f011c, + AuctionableTokenSell = 0x340114, + AuctionableTokenSellAtMarketPrice = 0x340115, + AuctionBrowseQuery = 0x300061, + AuctionCancelCommoditiesPurchase = 0x300069, + AuctionConfirmCommoditiesPurchase = 0x300068, + AuctionGetCommodityQuote = 0x300067, + AuctionHelloRequest = 0x30005c, + AuctionListBiddedItems = 0x300065, + AuctionListBucketsByBucketKeys = 0x300066, + AuctionListItemsByBucketKey = 0x300062, + AuctionListItemsByItemId = 0x300063, + AuctionListOwnedItems = 0x300064, + AuctionPlaceBid = 0x300060, + AuctionRemoveItem = 0x30005e, + AuctionReplicateItems = 0x30005f, + AuctionSellCommodity = 0x30006a, + AuctionSellItem = 0x30005d, + AuctionSetFavoriteItem = 0x340161, + AuthContinuedSession = 0x350002, + AuthSession = 0x350001, + AutobankItem = 0x310003, + AutostoreBankItem = 0x310002, + AutoDepositAccountBank = 0x2f02e6, + AutoDepositCharacterBank = 0x2f02ee, + AutoEquipItem = 0x310004, + AutoEquipItemSlot = 0x310009, + AutoGuildBankItem = 0x300048, + AutoStoreBagItem = 0x310005, + AutoStoreGuildBankItem = 0x300051, + AzeriteEmpoweredItemSelectPower = 0x2f0256, + AzeriteEmpoweredItemViewed = 0x2f0237, + AzeriteEssenceActivateEssence = 0x2f0258, + AzeriteEssenceUnlockMilestone = 0x2f0257, + BankerActivate = 0x300046, + BattlefieldLeave = 0x2f001f, + BattlefieldList = 0x2f002a, + BattlefieldPort = 0x3000c3, + BattlemasterHello = 0x2f018f, + BattlemasterJoin = 0x3000ba, + BattlemasterJoinArena = 0x3000bb, + BattlemasterJoinBrawl = 0x3000c1, + BattlemasterJoinRatedBgBlitz = 0x3000bd, + BattlemasterJoinRatedSoloShuffle = 0x3000bc, + BattlemasterJoinSkirmish = 0x3000be, + BattlenetChallengeResponse = 0x340101, + BattlenetRequest = 0x340122, + BattlePayAckFailedResponse = 0x3400fb, + BattlePayCancelOpenCheckout = 0x34013e, + BattlePayConfirmPurchaseResponse = 0x3400fa, + BattlePayDistributionAssignToTarget = 0x3400f1, + BattlePayDistributionAssignVas = 0x340164, + BattlePayGetProductList = 0x3400e8, + BattlePayGetPurchaseList = 0x3400e9, + BattlePayOpenCheckout = 0x340137, + BattlePayRequestPriceInfo = 0x340133, + BattlePayStartPurchase = 0x3400f9, + BattlePayStartVasPurchase = 0x340120, + BattlePetClearFanfare = 0x290002, + BattlePetDeletePet = 0x34004f, + BattlePetDeletePetCheat = 0x340050, + BattlePetModifyName = 0x340052, + BattlePetRequestJournal = 0x34004e, + BattlePetRequestJournalLock = 0x34004d, + BattlePetSetBattleSlot = 0x340057, + BattlePetSetFlags = 0x34005a, + BattlePetSummon = 0x340053, + BattlePetUpdateDisplayNotify = 0x2f0090, + BattlePetUpdateNotify = 0x2f008f, + BeginTrade = 0x2f0001, + BinderActivate = 0x300045, + BlackMarketBidOnItem = 0x3000cb, + BlackMarketOpen = 0x3000c9, + BlackMarketRequestItems = 0x3000ca, + BonusRoll = 0x2f0259, + BugReport = 0x3400b1, + BusyTrade = 0x2f0002, + BuyAccountBankTab = 0x300123, + BuyBackItem = 0x300037, + BuyItem = 0x300036, + CageBattlePet = 0x2f00a3, + CalendarAddEvent = 0x3400a9, + CalendarCommunityInvite = 0x34009d, + CalendarComplain = 0x3400a5, + CalendarCopyEvent = 0x3400a4, + CalendarEventSignUp = 0x3400a7, + CalendarGet = 0x34009b, + CalendarGetEvent = 0x34009c, + CalendarGetNumPending = 0x3400a6, + CalendarInvite = 0x34009e, + CalendarModeratorStatus = 0x3400a2, + CalendarRemoveEvent = 0x3400a3, + CalendarRemoveInvite = 0x34009f, + CalendarRsvp = 0x3400a0, + CalendarStatus = 0x3400a1, + CalendarUpdateEvent = 0x3400aa, + CancelAura = 0x2f005a, + CancelAutoRepeatSpell = 0x30007f, + CancelCast = 0x2f0177, + CancelChannelling = 0x2f0138, + CancelGrowthAura = 0x2f0140, + CancelMasterLootRoll = 0x2f00cc, + CancelModSpeedNoControlAuras = 0x2f0059, + CancelMountAura = 0x2f0153, + CancelQueuedSpell = 0x2f002b, + CancelTempEnchantment = 0x30008a, + CancelTrade = 0x2f0006, + CanDuel = 0x34008e, + CanRedeemTokenForBalance = 0x340132, + CastSpell = 0x2f0174, + ChallengeModeRequestLeaders = 0x2c0002, + ChangeBagSlotFlag = 0x2f0211, + ChangeBankBagSlotFlag = 0x2f0212, + ChangeMonumentAppearance = 0x2f01f2, + ChangeRealmTicket = 0x340127, + ChangeSubGroup = 0x340078, + CharacterCheckUpgrade = 0x3400f4, + CharacterRenameRequest = 0x3400ef, + CharacterUpgradeManualUnrevokeRequest = 0x3400f2, + CharacterUpgradeStart = 0x3400f3, + CharCustomize = 0x3400b8, + CharDelete = 0x3400ca, + CharRaceOrFactionChange = 0x3400be, + ChatAddonMessage = 0x2b002a, + ChatAddonMessageTargeted = 0x2b002b, + ChatCanLocalWhisperTargetRequest = 0x2b0032, + ChatChannelAnnouncements = 0x2b001f, + ChatChannelBan = 0x2b001d, + ChatChannelDeclineInvite = 0x2b0022, + ChatChannelDisplayList = 0x2b0012, + ChatChannelInvite = 0x2b001b, + ChatChannelKick = 0x2b001c, + ChatChannelList = 0x2b0011, + ChatChannelModerate = 0x2b0016, + ChatChannelModerator = 0x2b0017, + ChatChannelOwner = 0x2b0015, + ChatChannelPassword = 0x2b0013, + ChatChannelSetOwner = 0x2b0014, + ChatChannelSilenceAll = 0x2b0020, + ChatChannelUnban = 0x2b001e, + ChatChannelUnmoderator = 0x2b0018, + ChatChannelUnsilenceAll = 0x2b0021, + ChatDropCautionaryChatMessage = 0x2b000a, + ChatJoinChannel = 0x2b0000, + ChatLeaveChannel = 0x2b0001, + ChatLobbyMatchmakerMessageInstanceChat = 0x2b0031, + ChatLobbyMatchmakerMessageParty = 0x2b0030, + ChatMessageAfk = 0x2b000f, + ChatMessageChannel = 0x2b0007, + ChatMessageDnd = 0x2b0010, + ChatMessageEmote = 0x2b0024, + ChatMessageGuild = 0x2b000d, + ChatMessageInstanceChat = 0x2b0028, + ChatMessageOfficer = 0x2b000e, + ChatMessageParty = 0x2b0026, + ChatMessageRaid = 0x2b0027, + ChatMessageRaidWarning = 0x2b0029, + ChatMessageSay = 0x2b0023, + ChatMessageWhisper = 0x2b0008, + ChatMessageYell = 0x2b0025, + ChatRegisterAddonPrefixes = 0x2b0005, + ChatReportFiltered = 0x2b0004, + ChatReportIgnored = 0x2b0003, + ChatSendCautionaryChannelMessage = 0x2b000b, + ChatSendCautionaryChatMessage = 0x2b0009, + ChatUnregisterAllAddonPrefixes = 0x2b0006, + CheckCharacterNameAvailability = 0x340071, + CheckIsAdventureMapPoiValid = 0x2f010e, + ChoiceResponse = 0x2f017c, + ChromieTimeSelectExpansion = 0x2f0287, + ClaimWeeklyReward = 0x2f0264, + ClassTalentsDeleteConfig = 0x2f02c1, + ClassTalentsNotifyEmptyConfig = 0x2f00c3, + ClassTalentsNotifyValidationFailed = 0x2f02c3, + ClassTalentsRenameConfig = 0x2f02c0, + ClassTalentsRequestNewConfig = 0x2f02bf, + ClassTalentsSetStarterBuildActive = 0x2f02c4, + ClassTalentsSetUsesSharedActionBars = 0x2f00c2, + ClearNewAppearance = 0x290005, + ClearRaidMarker = 0x2f0052, + ClearTradeItem = 0x2f0008, + ClientPortGraveyard = 0x3000c5, + CloseInteraction = 0x300025, + CloseQuestChoice = 0x2f017d, + CloseRuneforgeInteraction = 0x2f028f, + CloseTraitSystemInteraction = 0x2f02c5, + ClubFinderApplicationResponse = 0x340149, + ClubFinderGetApplicantsList = 0x340147, + ClubFinderPost = 0x340144, + ClubFinderRequestClubsData = 0x34014b, + ClubFinderRequestClubsList = 0x340145, + ClubFinderRequestMembershipToClub = 0x340146, + ClubFinderRequestPendingClubsList = 0x34014a, + ClubFinderRequestSubscribedClubPostingIds = 0x34014c, + ClubFinderRespondToApplicant = 0x340148, + ClubFinderWhisperApplicantRequest = 0x340167, + ClubPresenceSubscribe = 0x340124, + CollectionItemSetFavorite = 0x34005d, + CommentatorEnable = 0x34001c, + CommentatorEnterInstance = 0x340020, + CommentatorExitInstance = 0x340021, + CommentatorGetMapInfo = 0x34001d, + CommentatorGetPlayerCooldowns = 0x34001f, + CommentatorGetPlayerInfo = 0x34001e, + CommentatorSpectate = 0x340165, + CommentatorStartWargame = 0x34001b, + CommerceTokenGetCount = 0x340112, + CommerceTokenGetLog = 0x34011c, + CommerceTokenGetMarketPrice = 0x340113, + Complaint = 0x340098, + CompleteCinematic = 0x3000e3, + CompleteMovie = 0x300075, + ConfirmArtifactRespec = 0x2f0057, + ConfirmProfessionRespec = 0x2f00c6, + ConfirmRespecWipe = 0x2f00c5, + ConnectToFailed = 0x340000, + ConsumableTokenBuy = 0x340117, + ConsumableTokenBuyAtMarketPrice = 0x340118, + ConsumableTokenCanVeteranBuy = 0x340116, + ConsumableTokenRedeem = 0x34011a, + ConsumableTokenRedeemConfirmation = 0x34011b, + ContentTrackingStartTracking = 0x2f02d5, + ContentTrackingStopTracking = 0x2f02d6, + ContributionContribute = 0x3000fb, + ContributionLastUpdateRequest = 0x3000fc, + ConversationCinematicReady = 0x3000e5, + ConversationLineStarted = 0x3000e4, + ConvertItemToBindToAccount = 0x2f02e5, + ConvertRaid = 0x34007a, + CovenantRenownRequestCatchupState = 0x30010f, + CraftingOrderCancel = 0x30011b, + CraftingOrderClaim = 0x300118, + CraftingOrderCreate = 0x300114, + CraftingOrderFulfill = 0x30011a, + CraftingOrderGetNpcRewardInfo = 0x300117, + CraftingOrderListCrafterOrders = 0x300116, + CraftingOrderListMyOrders = 0x300115, + CraftingOrderReject = 0x30011c, + CraftingOrderRelease = 0x300119, + CraftingOrderReportPlayer = 0x30011d, + CraftingOrderUpdateIgnoreList = 0x30011e, + CreateCharacter = 0x340070, + CreateShipment = 0x2f01db, + DbQueryBulk = 0x340010, + DeclineGuildInvites = 0x3000b7, + DeclinePetition = 0x3000d2, + DeleteEquipmentSet = 0x3000a3, + DelveTeleportOut = 0x30012b, + DelFriend = 0x3400ff, + DelIgnore = 0x340103, + DestroyItem = 0x2f016a, + DfBootPlayerVote = 0x340044, + DfConfirmExpandSearch = 0x340036, + DfGetJoinStatus = 0x340042, + DfGetSystemInfo = 0x340041, + DfJoin = 0x340037, + DfLeave = 0x340040, + DfProposalResponse = 0x340035, + DfReadyCheckResponse = 0x340048, + DfSetRoles = 0x340043, + DfTeleport = 0x340045, + DiscardedTimeSyncAcks = 0x32005e, + DismissCritter = 0x300091, + DoCountdown = 0x340143, + DoMasterLootRoll = 0x2f00cb, + DoReadyCheck = 0x34005e, + DuelResponse = 0x30007a, + EjectPassenger = 0x2f0103, + Emote = 0x3000df, + EnableNagle = 0x350007, + EnableTaxiNode = 0x30003c, + EngineSurvey = 0x340111, + EnterEncryptedModeAck = 0x350003, + EnumCharacters = 0x340014, + EnumCharactersDeletedByClient = 0x34010b, + FarSight = 0x300080, + GameEventDebugDisable = 0x2f005e, + GameEventDebugEnable = 0x2f005d, + GameObjReportUse = 0x300087, + GameObjUse = 0x300086, + GarrisonAddFollowerHealth = 0x2f01d6, + GarrisonAssignFollowerToBuilding = 0x2f01bc, + GarrisonCancelConstruction = 0x2f01a9, + GarrisonCheckUpgradeable = 0x2f020d, + GarrisonCompleteMission = 0x2f01ff, + GarrisonFullyHealAllFollowers = 0x2f01d7, + GarrisonGenerateRecruits = 0x2f01bf, + GarrisonGetClassSpecCategoryInfo = 0x2f01ce, + GarrisonGetMapData = 0x2f01d5, + GarrisonGetMissionReward = 0x2f022f, + GarrisonLearnTalent = 0x2f01ca, + GarrisonMissionBonusRoll = 0x2f0201, + GarrisonPurchaseBuilding = 0x2f01a5, + GarrisonRecruitFollower = 0x2f01c1, + GarrisonRemoveFollower = 0x2f01f6, + GarrisonRemoveFollowerFromBuilding = 0x2f01bd, + GarrisonRenameFollower = 0x2f01be, + GarrisonRequestBlueprintAndSpecializationData = 0x2f01a4, + GarrisonRequestShipmentInfo = 0x2f01d9, + GarrisonResearchTalent = 0x2f01c2, + GarrisonSetBuildingActive = 0x2f01a6, + GarrisonSetFollowerFavorite = 0x2f01ba, + GarrisonSetFollowerInactive = 0x2f01b2, + GarrisonSetRecruitmentPreferences = 0x2f01c0, + GarrisonSocketTalent = 0x2f029c, + GarrisonStartMission = 0x2f01fe, + GarrisonSwapBuildings = 0x2f01aa, + GenerateRandomCharacterName = 0x340013, + GetAccountCharacterList = 0x3400e3, + GetAccountNotifications = 0x34015f, + GetGarrisonInfo = 0x2f019f, + GetItemPurchaseData = 0x3000cd, + GetLandingPageShipments = 0x2f01da, + GetMirrorImageData = 0x2f016e, + GetPvpOptionsEnabled = 0x34001a, + GetRafAccountInfo = 0x34014d, + GetRegionwideCharacterRestrictionAndMailData = 0x340190, + GetRemainingGameTime = 0x340119, + GetTrophyList = 0x2f01ef, + GetUndeleteCharacterCooldownStatus = 0x34010d, + GetVasAccountCharacterList = 0x34011e, + GetVasTransferTargetRealmList = 0x34011f, + GmTicketAcknowledgeSurvey = 0x3400bc, + GmTicketGetCaseStatus = 0x3400bb, + GmTicketGetSystemStatus = 0x3400ba, + GossipRefreshOptions = 0x30010e, + GossipSelectOption = 0x300026, + GuildAddBattlenetFriend = 0x2d0020, + GuildAddRank = 0x2d0005, + GuildAssignMemberRank = 0x2d0002, + GuildBankActivate = 0x300047, + GuildBankBuyTab = 0x300055, + GuildBankDepositMoney = 0x300057, + GuildBankLogQuery = 0x2d0019, + GuildBankQueryTab = 0x300054, + GuildBankRemainingWithdrawMoneyQuery = 0x2d001a, + GuildBankSetTabText = 0x2d001d, + GuildBankTextQuery = 0x2d001e, + GuildBankUpdateTab = 0x300056, + GuildBankWithdrawMoney = 0x300058, + GuildChallengeUpdateRequest = 0x2d0017, + GuildChangeNameRequest = 0x2d0018, + GuildDeclineInvitation = 0x34002a, + GuildDelete = 0x2d0009, + GuildDeleteRank = 0x2d0006, + GuildDemoteMember = 0x2d0001, + GuildEventLogQuery = 0x2d001c, + GuildGetAchievementMembers = 0x2d0012, + GuildGetRanks = 0x2d000e, + GuildGetRoster = 0x2d0014, + GuildInviteByName = 0x340034, + GuildLeave = 0x2d0003, + GuildNewsUpdateSticky = 0x2d000f, + GuildOfficerRemoveMember = 0x2d0004, + GuildPermissionsQuery = 0x2d001b, + GuildPromoteMember = 0x2d0000, + GuildQueryMembersForRecipe = 0x2d000c, + GuildQueryMemberRecipes = 0x2d000a, + GuildQueryNews = 0x2d000d, + GuildQueryRecipes = 0x2d000b, + GuildReplaceGuildMaster = 0x2d001f, + GuildRequestRename = 0x2d0023, + GuildRequestRenameNameCheck = 0x2d0022, + GuildRequestRenameRefund = 0x2d0024, + GuildRequestRenameStatus = 0x2d0021, + GuildSetAchievementTracking = 0x2d0010, + GuildSetFocusedAchievement = 0x2d0011, + GuildSetGuildMaster = 0x3400f6, + GuildSetMemberNote = 0x2d0013, + GuildSetRankPermissions = 0x2d0008, + GuildShiftRank = 0x2d0007, + GuildUpdateInfoText = 0x2d0016, + GuildUpdateMotdText = 0x2d0015, + HearthAndResurrect = 0x30009f, + HideQuestChoice = 0x2f017e, + HotfixRequest = 0x340011, + IgnoreTrade = 0x2f0003, + InitiateRolePoll = 0x340006, + InitiateTrade = 0x2f0000, + Inspect = 0x3000c7, + InstanceAbandonVoteResponse = 0x340061, + InstanceLockResponse = 0x3000a4, + IslandQueue = 0x2f0260, + ItemPurchaseRefund = 0x3000ce, + ItemTextQuery = 0x2f020e, + JoinPetBattleQueue = 0x2f008d, + JoinRatedBattleground = 0x2f0025, + KeepAlive = 0x3400ab, + KeyboundOverride = 0x2f00e1, + LatencyReport = 0x35000d, + LearnPvpTalents = 0x3000fa, + LearnTalents = 0x3000f8, + LeaveGroup = 0x340075, + LeavePetBattleQueue = 0x2f008e, + LfgListApplyToGroup = 0x34003b, + LfgListCancelApplication = 0x34003c, + LfgListDeclineApplicant = 0x34003d, + LfgListGetStatus = 0x340039, + LfgListInviteApplicant = 0x34003e, + LfgListInviteResponse = 0x34003f, + LfgListJoin = 0x2f0254, + LfgListLeave = 0x340038, + LfgListSearch = 0x34003a, + LfgListUpdateRequest = 0x2f0255, + ListInventory = 0x300033, + LiveRegionAccountRestore = 0x3400e6, + LiveRegionCharacterCopy = 0x3400e5, + LiveRegionGetAccountCharacterList = 0x3400e4, + LiveRegionKeyBindingsCopy = 0x3400e7, + LoadingScreenNotify = 0x340024, + LoadSelectedTrophy = 0x2f01f0, + LobbyMatchmakerAbandonQueue = 0x340172, + LobbyMatchmakerAcceptPartyInvite = 0x340169, + LobbyMatchmakerCreateCharacter = 0x34017b, + LobbyMatchmakerEnterQueue = 0x340170, + LobbyMatchmakerLeaveParty = 0x34016c, + LobbyMatchmakerPartyInvite = 0x340168, + LobbyMatchmakerPartyUninvite = 0x34016b, + LobbyMatchmakerQueuePropsalResponse = 0x340171, + LobbyMatchmakerRejectPartyInvite = 0x34016a, + LobbyMatchmakerSetPartyPlaylistEntry = 0x34016d, + LobbyMatchmakerSetPlayerReady = 0x34016e, + LogoutCancel = 0x300070, + LogoutInstant = 0x300071, + LogoutLobbyMatchmaker = 0x300122, + LogoutRequest = 0x30006f, + LogDisconnect = 0x350005, + LogStreamingError = 0x350009, + LootItem = 0x2f00c9, + LootMoney = 0x2f00c8, + LootRelease = 0x2f00cd, + LootRoll = 0x2f00ce, + LootUnit = 0x2f00c7, + LowLevelRaid1 = 0x3400ce, + LowLevelRaid2 = 0x3000ab, + MailCreateTextItem = 0x3000d9, + MailDelete = 0x2f00e3, + MailGetList = 0x3000d4, + MailMarkAsRead = 0x3000d8, + MailReturnToSender = 0x340081, + MailTakeItem = 0x3000d6, + MailTakeMoney = 0x3000d5, + MakeContitionalAppearancePermanent = 0x2f00e4, + MasterLootItem = 0x2f00ca, + MergeGuildBankItemWithGuildBankItem = 0x300052, + MergeGuildBankItemWithItem = 0x30004f, + MergeItemWithGuildBankItem = 0x30004d, + MinimapPing = 0x340077, + MissileTrajectoryCollision = 0x2f0036, + MountClearFanfare = 0x290003, + MountSetFavorite = 0x34005c, + MountSpecialAnim = 0x2f0154, + MoveAddImpulseAck = 0x32006d, + MoveApplyInertiaAck = 0x32006b, + MoveApplyMovementForceAck = 0x320031, + MoveChangeTransport = 0x32004c, + MoveChangeVehicleSeats = 0x320051, + MoveCollisionDisableAck = 0x320056, + MoveCollisionEnableAck = 0x320057, + MoveDismissVehicle = 0x320050, + MoveDoubleJump = 0x320007, + MoveEnableDoubleJumpAck = 0x32003a, + MoveEnableFullSpeedTurningAck = 0x320083, + MoveEnableSwimToFlyTransAck = 0x320040, + MoveFallLand = 0x320017, + MoveFallReset = 0x320035, + MoveFeatherFallAck = 0x320038, + MoveForceFlightBackSpeedChangeAck = 0x32004b, + MoveForceFlightSpeedChangeAck = 0x32004a, + MoveForcePitchRateChangeAck = 0x32004f, + MoveForceRootAck = 0x32002a, + MoveForceRunBackSpeedChangeAck = 0x320028, + MoveForceRunSpeedChangeAck = 0x320027, + MoveForceSwimBackSpeedChangeAck = 0x32003e, + MoveForceSwimSpeedChangeAck = 0x320029, + MoveForceTurnRateChangeAck = 0x32003f, + MoveForceUnrootAck = 0x32002b, + MoveForceWalkSpeedChangeAck = 0x32003d, + MoveGravityDisableAck = 0x320052, + MoveGravityEnableAck = 0x320053, + MoveGuildBankItem = 0x30004c, + MoveHeartbeat = 0x32002c, + MoveHoverAck = 0x32002f, + MoveInertiaDisableAck = 0x320054, + MoveInertiaEnableAck = 0x320055, + MoveInitActiveMoverComplete = 0x320063, + MoveJump = 0x320006, + MoveKnockBackAck = 0x32002e, + MoveRemoveInertiaAck = 0x32006c, + MoveRemoveMovementForces = 0x320033, + MoveRemoveMovementForceAck = 0x320032, + MoveSetAdvFly = 0x32006f, + MoveSetAdvFlyingAddImpulseMaxSpeedAck = 0x320077, + MoveSetAdvFlyingAirFrictionAck = 0x320072, + MoveSetAdvFlyingBankingRateAck = 0x320078, + MoveSetAdvFlyingDoubleJumpVelModAck = 0x320075, + MoveSetAdvFlyingGlideStartMinHeightAck = 0x320076, + MoveSetAdvFlyingLaunchSpeedCoefficientAck = 0x32007f, + MoveSetAdvFlyingLiftCoefficientAck = 0x320074, + MoveSetAdvFlyingMaxVelAck = 0x320073, + MoveSetAdvFlyingOverMaxDecelerationAck = 0x32007d, + MoveSetAdvFlyingPitchingRateDownAck = 0x320079, + MoveSetAdvFlyingPitchingRateUpAck = 0x32007a, + MoveSetAdvFlyingSurfaceFrictionAck = 0x32007c, + MoveSetAdvFlyingTurnVelocityThresholdAck = 0x32007b, + MoveSetCanAdvFlyAck = 0x32006e, + MoveSetCanDriveAck = 0x320070, + MoveSetCanFlyAck = 0x320043, + MoveSetCanTurnWhileFallingAck = 0x320041, + MoveSetCollisionHeightAck = 0x320058, + MoveSetFacing = 0x320025, + MoveSetFacingHeartbeat = 0x32007e, + MoveSetFly = 0x320045, + MoveSetIgnoreMovementForcesAck = 0x320042, + MoveSetModMovementForceMagnitudeAck = 0x32005f, + MoveSetPitch = 0x320026, + MoveSetRunMode = 0x32000e, + MoveSetTurnRateCheat = 0x320022, + MoveSetVehicleRecIdAck = 0x320030, + MoveSetWalkMode = 0x32000f, + MoveSplineDone = 0x320034, + MoveStartAscend = 0x320046, + MoveStartBackward = 0x320001, + MoveStartDescend = 0x32004d, + MoveStartDriveForward = 0x320071, + MoveStartForward = 0x320000, + MoveStartPitchDown = 0x32000c, + MoveStartPitchUp = 0x32000b, + MoveStartStrafeLeft = 0x320003, + MoveStartStrafeRight = 0x320004, + MoveStartSwim = 0x320018, + MoveStartTurnLeft = 0x320008, + MoveStartTurnRight = 0x320009, + MoveStop = 0x320002, + MoveStopAscend = 0x320047, + MoveStopPitch = 0x32000d, + MoveStopStrafe = 0x320005, + MoveStopSwim = 0x320019, + MoveStopTurn = 0x32000a, + MoveTeleportAck = 0x320016, + MoveTimeSkipped = 0x320037, + MoveUpdateFallSpeed = 0x320036, + MoveWaterWalkAck = 0x320039, + MythicPlusRequestMapStats = 0x2c0001, + NeutralPlayerSelectFaction = 0x2f0083, + NextCinematicCamera = 0x3000e2, + ObjectUpdateFailed = 0x2f002c, + ObjectUpdateRescued = 0x2f002d, + OfferPetition = 0x2f0286, + OpeningCinematic = 0x3000e1, + OpenItem = 0x2f020f, + OpenMissionNpc = 0x2f01d0, + OpenShipmentNpc = 0x2f01d8, + OpenTradeskillNpc = 0x2f01e3, + OptOutOfLoot = 0x30008e, + OverrideScreenFlash = 0x3000b8, + PartyInvite = 0x340030, + PartyInviteResponse = 0x340032, + PartyUninvite = 0x340073, + PerformItemInteraction = 0x2f00ec, + PerksProgramItemsRefreshed = 0x2f02ae, + PerksProgramRequestCartCheckout = 0x2f02b1, + PerksProgramRequestPendingRewards = 0x290012, + PerksProgramRequestPurchase = 0x2f02b0, + PerksProgramRequestRefund = 0x2f02b2, + PerksProgramSetFrozenVendorItem = 0x2f02b3, + PerksProgramStatusRequest = 0x2f02af, + PetitionBuy = 0x30005a, + PetitionRenameGuild = 0x3400f7, + PetitionShowList = 0x300059, + PetitionShowSignatures = 0x30005b, + PetAbandon = 0x30001e, + PetAbandonByNumber = 0x30001f, + PetAction = 0x30001c, + PetBattleFinalNotify = 0x2f0092, + PetBattleInput = 0x34006d, + PetBattleQueueProposeMatchResult = 0x2f00e2, + PetBattleQuitNotify = 0x2f0091, + PetBattleReplaceFrontPet = 0x34006e, + PetBattleRequestPvp = 0x2f008b, + PetBattleRequestUpdate = 0x2f008c, + PetBattleRequestWild = 0x2f0089, + PetBattleScriptErrorNotify = 0x2f0093, + PetBattleWildLocationFail = 0x3d008a, + PetCancelAura = 0x300020, + PetCastSpell = 0x2f0173, + PetRename = 0x3400b0, + PetSetAction = 0x30001b, + PetSpellAutocast = 0x300021, + PetStopAttack = 0x30001d, + Ping = 0x350004, + PlayerLogin = 0x340016, + PushQuestToParty = 0x300031, + PvpLogData = 0x2f0028, + QueryBattlePetName = 0x2f0147, + QueryCorpseLocationFromClient = 0x34008c, + QueryCorpseTransport = 0x34008d, + QueryCountdownTimer = 0x2f0055, + QueryCreature = 0x2f0141, + QueryGameObject = 0x2f0142, + QueryGarrisonPetName = 0x2f0148, + QueryGuildInfo = 0x3400b6, + QueryInspectAchievements = 0x300098, + QueryNextMailTime = 0x3000d7, + QueryNpcText = 0x2f0143, + QueryPageText = 0x2f0145, + QueryPetition = 0x2f0149, + QueryPetName = 0x2f0146, + QueryPlayerNames = 0x35000e, + QueryPlayerNamesForCommunity = 0x35000c, + QueryPlayerNameByCommunityId = 0x35000b, + QueryQuestCompletionNpcs = 0x2f0021, + QueryQuestInfo = 0x2f0144, + QueryQuestItemUsability = 0x2f0022, + QueryRealmName = 0x3400b5, + QueryScenarioPoi = 0x340082, + QuerySelectedWowLabsArea = 0x2f02ea, + QueryTime = 0x30006e, + QueryTreasurePicker = 0x2f0232, + QueryWowLabsAreaInfo = 0x2f02eb, + QuestConfirmAccept = 0x300030, + QuestGiverAcceptQuest = 0x30002a, + QuestGiverChooseReward = 0x30002c, + QuestGiverCloseQuest = 0x3000e8, + QuestGiverCompleteQuest = 0x30002b, + QuestGiverHello = 0x300028, + QuestGiverQueryQuest = 0x300029, + QuestGiverRequestReward = 0x30002d, + QuestGiverStatusMultipleQuery = 0x30002f, + QuestGiverStatusQuery = 0x30002e, + QuestLogRemoveQuest = 0x3000cc, + QuestPoiQuery = 0x3400dd, + QuestPushResult = 0x300032, + QuestSessionBeginResponse = 0x2f0278, + QuestSessionRequestStart = 0x2f0277, + QuestSessionRequestStop = 0x340158, + QueuedMessagesEnd = 0x350008, + QuickJoinAutoAcceptRequests = 0x340130, + QuickJoinRequestInvite = 0x34012f, + QuickJoinRequestInviteWithConfirmation = 0x34015d, + QuickJoinRespondToInvite = 0x34012e, + QuickJoinSignalToastDisplayed = 0x34012d, + RafClaimActivityReward = 0x30009c, + RafClaimNextReward = 0x34014e, + RafGenerateRecruitmentLink = 0x340150, + RafUpdateRecruitmentInfo = 0x34014f, + RandomRoll = 0x340080, + ReadyCheckResponse = 0x34005f, + ReadItem = 0x2f0210, + ReclaimCorpse = 0x300073, + RemoveNewItem = 0x2f0236, + RemoveRafRecruit = 0x340151, + ReorderCharacters = 0x340015, + RepairItem = 0x300084, + ReplaceTrophy = 0x2f01f1, + RepopRequest = 0x3000c4, + ReportPvpPlayerAfk = 0x30008c, + ReportServerLag = 0x2f0270, + ReportStuckInCombat = 0x2f0271, + RequestAccountData = 0x3400c2, + RequestAreaPoiUpdate = 0x2f0234, + RequestBattlefieldStatus = 0x340008, + RequestCemeteryList = 0x2f0023, + RequestCharacterGuildFollowInfo = 0x3400b7, + RequestCovenantCallings = 0x2f0262, + RequestCrowdControlSpell = 0x3000c8, + RequestCurrencyDataForAccountCharacters = 0x290019, + RequestGarrisonTalentWorldQuestUnlocks = 0x2f029b, + RequestGuildPartyState = 0x2f0054, + RequestGuildRewardsList = 0x2f0053, + RequestLatestSplashScreen = 0x2f0272, + RequestLfgListBlacklist = 0x2f017f, + RequestMythicPlusAffixes = 0x2f00b7, + RequestMythicPlusSeasonData = 0x2f00b8, + RequestPartyEligibilityForDelveTiers = 0x2f02e9, + RequestPartyJoinUpdates = 0x340023, + RequestPartyMemberStats = 0x34007f, + RequestPetInfo = 0x300022, + RequestPlayedTime = 0x2f014c, + RequestPvpRewards = 0x2f0041, + RequestRaidInfo = 0x3400f8, + RequestRatedPvpInfo = 0x34000f, + RequestRealmGuildMasterInfo = 0x340193, + RequestScheduledAreaPoiUpdate = 0x2f0235, + RequestScheduledPvpInfo = 0x2f0042, + RequestStabledPets = 0x300023, + RequestStoreFrontInfoUpdate = 0x29001e, + RequestVehicleExit = 0x2f00fe, + RequestVehicleNextSeat = 0x2f0100, + RequestVehiclePrevSeat = 0x2f00ff, + RequestVehicleSwitchSeat = 0x2f0101, + RequestWeeklyRewards = 0x2f0265, + RequestWorldQuestUpdate = 0x2f0233, + ResetChallengeMode = 0x2f00b5, + ResetChallengeModeCheat = 0x2f00b6, + ResetInstances = 0x340094, + ResurrectResponse = 0x3400af, + RevertMonumentAppearance = 0x2f01f3, + RideVehicleInteract = 0x2f0102, + RpeResetCharacter = 0x34017e, + SaveAccountDataExport = 0x340178, + SaveCufProfiles = 0x2f0037, + SaveEquipmentSet = 0x3000a2, + SaveGuildEmblem = 0x2f0184, + SavePersonalEmblem = 0x2f0185, + ScenePlaybackCanceled = 0x2f00de, + ScenePlaybackComplete = 0x2f00dd, + SceneTriggerEvent = 0x2f00df, + SeamlessTransferComplete = 0x2f02d8, + SelectWowLabsArea = 0x2f02ec, + SelfRes = 0x3000cf, + SellAllJunkItems = 0x300035, + SellItem = 0x300034, + SendCharacterClubInvitation = 0x340126, + SendContactList = 0x3400fd, + SendMail = 0x340026, + SendPingUnit = 0x2f02da, + SendPingWorldPoint = 0x2f02db, + SendTextEmote = 0x300019, + ServerTimeOffsetRequest = 0x3400c9, + SetupWarbandGroups = 0x34018c, + SetActionBarToggles = 0x3000d0, + SetActionButton = 0x340062, + SetActiveMover = 0x320059, + SetAdvancedCombatLogging = 0x2f0192, + SetAssistantLeader = 0x34007b, + SetBackpackAutosortDisabled = 0x2f0213, + SetBackpackSellJunkDisabled = 0x2f0214, + SetBankAutosortDisabled = 0x2f0215, + SetContactNotes = 0x340100, + SetCurrencyFlags = 0x2f0015, + SetDifficultyId = 0x2f00e0, + SetDungeonDifficulty = 0x3400ae, + SetEmpowerMinHoldStagePercent = 0x2f013b, + SetEveryoneIsAssistant = 0x340046, + SetExcludedChatCensorSources = 0x340131, + SetFactionAtWar = 0x300076, + SetFactionInactive = 0x300078, + SetFactionNotAtWar = 0x300077, + SetGameEventDebugViewState = 0x2f0065, + SetInsertItemsLeftToRight = 0x2f0217, + SetLootMethod = 0x340074, + SetLootSpecialization = 0x3000dd, + SetPartyAssignment = 0x34007d, + SetPartyLeader = 0x340076, + SetPetFavorite = 0x2f0012, + SetPetSlot = 0x2f0011, + SetPetSpecialization = 0x2f0013, + SetPlayerDeclinedNames = 0x3400b4, + SetPreferredCemetery = 0x2f0024, + SetPvp = 0x2f0189, + SetRaidDifficulty = 0x340109, + SetRestrictPingsToAssistants = 0x340047, + SetRole = 0x340005, + SetSavedInstanceExtend = 0x3400b2, + SetSelection = 0x3000c6, + SetSheathed = 0x30001a, + SetSortBagsRightToLeft = 0x2f0216, + SetTaxiBenchmarkMode = 0x30008b, + SetTitle = 0x2f0152, + SetTradeCurrency = 0x2f000a, + SetTradeGold = 0x2f0009, + SetTradeItem = 0x2f0007, + SetUsingPartyGarrison = 0x2f01d2, + SetWarMode = 0x2f018a, + SetWatchedFaction = 0x300079, + ShowTradeSkill = 0x3400f0, + SignPetition = 0x3000d1, + SilencePartyTalker = 0x34007e, + SocialContractRequest = 0x340173, + SocketGems = 0x300083, + SortAccountBankBags = 0x2f02de, + SortBags = 0x2f0218, + SortBankBags = 0x2f0219, + SpawnTrackingUpdate = 0x2f0167, + SpectateChange = 0x2f02d1, + SpellClick = 0x300027, + SpellEmpowerRelease = 0x2f0139, + SpellEmpowerRestart = 0x2f013a, + SpiritHealerActivate = 0x300042, + SplitGuildBankItem = 0x300053, + SplitGuildBankItemToInventory = 0x300050, + SplitItem = 0x310008, + SplitItemToGuildBank = 0x30004e, + StandStateChange = 0x2f0035, + StartChallengeMode = 0x3000e9, + StartInstanceAbandonVote = 0x340060, + StartSpectatorWarGame = 0x34000b, + StartWarGame = 0x34000a, + StoreGuildBankItem = 0x300049, + SubmitUserFeedback = 0x3400c1, + SubscriptionInterstitialResponse = 0x2f0290, + SummonResponse = 0x340096, + SupportTicketSubmitComplaint = 0x340072, + SurrenderArena = 0x2f0020, + SuspendCommsAck = 0x350000, + SuspendTokenResponse = 0x350006, + SwapGuildBankItemWithGuildBankItem = 0x30004b, + SwapInvItem = 0x310007, + SwapItem = 0x310006, + SwapItemWithGuildBankItem = 0x30004a, + SwapSubGroups = 0x340079, + TabardVendorActivate = 0x2f0186, + TalkToGossip = 0x300024, + TaxiNodeStatusQuery = 0x30003b, + TaxiQueryAvailableNodes = 0x30003d, + TaxiRequestEarlyLanding = 0x30003f, + TimeAdjustmentResponse = 0x32005d, + TimeSyncResponse = 0x32005a, + TimeSyncResponseDropped = 0x32005c, + TimeSyncResponseFailed = 0x32005b, + ToggleDifficulty = 0x340083, + TogglePvp = 0x2f0188, + TotemDestroyed = 0x300090, + ToyClearFanfare = 0x290004, + TradeSkillSetFavorite = 0x2f0231, + TrainerBuySpell = 0x300041, + TrainerList = 0x300040, + TraitsCommitConfig = 0x2f02b9, + TraitsTalentTestUnlearnSpells = 0x2f02b7, + TransferCurrencyFromAccountCharacter = 0x2f02e7, + TransmogrifyItems = 0x2f0043, + TurnInPetition = 0x3000d3, + Tutorial = 0x34010a, + UiMapQuestLinesRequest = 0x2f0261, + UnacceptTrade = 0x2f0005, + UndeleteCharacter = 0x34010c, + UnlearnSkill = 0x30007d, + UnlearnSpecialization = 0x2f0051, + UpdateAadcStatus = 0x340163, + UpdateAccountBankTabSettings = 0x30012a, + UpdateAccountData = 0x3400c3, + UpdateAreaTriggerVisual = 0x2f0176, + UpdateClientSettings = 0x340090, + UpdateCraftingNpcRecipes = 0x2f01e4, + UpdateMissileTrajectory = 0x320060, + UpdateRaidTarget = 0x34007c, + UpdateSpellVisual = 0x2f0175, + UpdateVasPurchaseStates = 0x340121, + UpgradeGarrison = 0x2f019a, + UpgradeRuneforgeLegendary = 0x2f028e, + UsedFollow = 0x2f0032, + UseCritterItem = 0x2f0108, + UseEquipmentSet = 0x310001, + UseItem = 0x2f016f, + UseToy = 0x2f0172, + VasCheckTransferOk = 0x340136, + VasGetQueueMinutes = 0x340135, + VasGetServiceStatus = 0x340134, + ViolenceLevel = 0x2f0030, + VoiceChannelSttTokenRequest = 0x34013a, + VoiceChatJoinChannel = 0x34013b, + VoiceChatLogin = 0x340139, + Warden3Data = 0x340018, + Who = 0x3400ad, + WhoIs = 0x3400ac, + WorldLootObjectClick = 0x2f02d4, + WorldPortResponse = 0x340025, + WrapItem = 0x310000, Unknown = 0xbadd } public enum ServerOpcodes : uint { - AbortNewWorld = 0x380030, - AccountCharacterCurrencyLists = 0x380342, - AccountConversionStateUpdate = 0x380347, - AccountCosmeticAdded = 0x3802fb, - AccountCriteriaUpdate = 0x3802e3, - AccountDataTimes = 0x3801a4, - AccountExportResponse = 0x380333, - AccountItemCollectionData = 0x38034d, - AccountMountRemoved = 0x380047, - AccountMountUpdate = 0x380046, - AccountNotificationsResponse = 0x3802fa, - AccountStoreCurrencyUpdate = 0x38031c, - AccountStoreFrontUpdate = 0x38031d, - AccountStoreItemStateChanged = 0x38031e, - AccountStoreResult = 0x38031f, - AccountToyUpdate = 0x380048, - AccountTransmogSetFavoritesUpdate = 0x38004c, - AccountTransmogUpdate = 0x38004b, - AccountWarbandSceneUpdate = 0x38004e, - AchievementDeleted = 0x380181, - AchievementEarned = 0x3800db, - ActivateEssenceFailed = 0x4b0020, - ActivateSoulbindFailed = 0x4b0022, - ActivateTaxiReply = 0x380118, - ActiveGlyphs = 0x4e0045, - ActiveScheduledWorldStateInfo = 0x3801df, - AddonListRequest = 0x3800da, - AddBattlenetFriendResponse = 0x3800d5, - AddItemPassive = 0x380042, - AddLossOfControl = 0x38010b, - AddRunePower = 0x380152, - AdjustSplineDuration = 0x380069, - AdvancedCombatLog = 0x3802f8, - AdventureJournalDataResponse = 0x3802f3, - AeLootTargets = 0x3800b0, - AeLootTargetAck = 0x3800b1, - AiReaction = 0x38014f, - AlliedRaceDetails = 0x38028d, - AllAccountCriteria = 0x380005, - AllAchievementData = 0x380004, - AllGuildAchievements = 0x440000, - ApplyMountEquipmentResult = 0x3802d0, - ArchaeologySurveryCast = 0x38001d, - AreaPoiUpdateResponse = 0x4b0018, - AreaSpiritHealerTime = 0x3801d8, - AreaTriggerDenied = 0x390009, - AreaTriggerForceSetPositionAndFacing = 0x390006, - AreaTriggerNoCorpse = 0x3801b0, - AreaTriggerPlaySpellVisual = 0x390004, - AreaTriggerRePath = 0x390003, - AreaTriggerReShape = 0x390008, - AreaTriggerUnattach = 0x390007, - AreaTriggerUpdateDecalProperties = 0x390005, - ArenaClearOpponents = 0x3800e1, - ArenaCrowdControlSpellResult = 0x3800ca, - ArenaPrepOpponentSpecializations = 0x3800e0, - ArtifactEndgamePowersRefunded = 0x38023a, - ArtifactForgeError = 0x380238, - ArtifactRespecPrompt = 0x380239, - ArtifactXpGain = 0x380280, - AttackerStateUpdate = 0x3e002c, - AttackStart = 0x3e0017, - AttackStop = 0x3e0018, - AttackSwingError = 0x3e0026, - AttackSwingLandedLog = 0x3e0027, - AuctionableTokenAuctionSold = 0x380269, - AuctionableTokenSellAtMarketPriceResponse = 0x380268, - AuctionableTokenSellConfirmRequired = 0x380267, - AuctionClosedNotification = 0x38018c, - AuctionCommandResult = 0x380189, - AuctionDisableNewPostings = 0x380320, - AuctionFavoriteList = 0x3802ea, - AuctionGetCommodityQuoteResult = 0x3802e2, - AuctionHelloResponse = 0x380187, - AuctionListBiddedItemsResult = 0x3802e1, - AuctionListBucketsResult = 0x3802dd, - AuctionListItemsResult = 0x3802de, - AuctionListOwnedItemsResult = 0x3802e0, - AuctionOutbidNotification = 0x38018b, - AuctionOwnerBidNotification = 0x38018d, - AuctionReplicateResponse = 0x380188, - AuctionWonNotification = 0x38018a, - AuraPointsDepleted = 0x4e0012, - AuraUpdate = 0x4e0011, - AuthChallenge = 0x3f0000, - AuthFailed = 0x380000, - AuthResponse = 0x380001, - AvailableHotfixes = 0x3c0001, - BackpackDefaultSizeChanged = 0x380321, - BagCleanupFinished = 0x4f0007, - BarberShopResult = 0x380157, - BatchPresenceSubscription = 0x3802c1, - BattlefieldList = 0x3e0005, - BattlefieldPortDenied = 0x3e000b, - BattlefieldStatusActive = 0x3e0001, - BattlefieldStatusFailed = 0x3e0004, - BattlefieldStatusGroupProposalFailed = 0x3e000e, - BattlefieldStatusNeedConfirmation = 0x3e0000, - BattlefieldStatusNone = 0x3e0003, - BattlefieldStatusQueued = 0x3e0002, - BattlefieldStatusWaitForGroups = 0x3e000d, - BattlegroundInfoThrottled = 0x3e000c, - BattlegroundInit = 0x3e0029, - BattlegroundPlayerJoined = 0x3e0009, - BattlegroundPlayerLeft = 0x3e000a, - BattlegroundPlayerPositions = 0x3e0006, - BattlegroundPoints = 0x3e0028, - BattlenetChallengeAbort = 0x380222, - BattlenetChallengeStart = 0x380221, - BattlenetNotification = 0x380299, - BattlenetResponse = 0x380298, - BattleNetConnectionStatus = 0x38029a, - BattlePayAckFailed = 0x38021d, - BattlePayBattlePetDelivered = 0x380212, - BattlePayCollectionItemDelivered = 0x380213, - BattlePayConfirmPurchase = 0x38021c, - BattlePayDeliveryEnded = 0x380210, - BattlePayDeliveryStarted = 0x38020f, - BattlePayDistributionAssignVasResponse = 0x380300, - BattlePayDistributionUnrevoked = 0x38020d, - BattlePayDistributionUpdate = 0x38020e, - BattlePayGetDistributionListResponse = 0x38020c, - BattlePayGetProductListResponse = 0x38020a, - BattlePayGetPurchaseListResponse = 0x38020b, - BattlePayMountDelivered = 0x380211, - BattlePayPurchaseUpdate = 0x38021b, - BattlePayStartCheckout = 0x3802b5, - BattlePayStartDistributionAssignToTargetResponse = 0x380219, - BattlePayStartPurchaseResponse = 0x380218, - BattlePayValidatePurchaseResponse = 0x3802a9, - BattlePetsHealed = 0x38008b, - BattlePetCageDateError = 0x380113, - BattlePetDeleted = 0x380088, - BattlePetError = 0x3800d0, - BattlePetJournal = 0x380087, - BattlePetJournalLockAcquired = 0x380085, - BattlePetJournalLockDenied = 0x380086, - BattlePetRestored = 0x38008a, - BattlePetRevoked = 0x380089, - BattlePetTrapLevel = 0x380083, - BattlePetUpdates = 0x380082, - BindPointUpdate = 0x380011, - BlackMarketBidOnItemResult = 0x3800c0, - BlackMarketOutbid = 0x3800c1, - BlackMarketRequestItemsResult = 0x3800bf, - BlackMarketWon = 0x3800c2, - BonusRollEmpty = 0x3800dd, - BossKill = 0x3e002b, - BreakTarget = 0x3e0016, - BroadcastAchievement = 0x3d0012, - BroadcastSummonCast = 0x3802c3, - BroadcastSummonResponse = 0x3802c4, - BuyFailed = 0x380160, - BuySucceeded = 0x38015f, - CacheInfo = 0x3c000f, - CacheVersion = 0x3c000e, - CalendarClearPendingAction = 0x380138, - CalendarCommandResult = 0x380139, - CalendarCommunityInvite = 0x380128, - CalendarEventRemovedAlert = 0x380130, - CalendarEventUpdatedAlert = 0x380131, - CalendarInviteAdded = 0x380129, - CalendarInviteAlert = 0x38012d, - CalendarInviteNotes = 0x380132, - CalendarInviteNotesAlert = 0x380133, - CalendarInviteRemoved = 0x38012a, - CalendarInviteRemovedAlert = 0x38012f, - CalendarInviteStatus = 0x38012b, - CalendarInviteStatusAlert = 0x38012e, - CalendarModeratorStatus = 0x38012c, - CalendarRaidLockoutAdded = 0x380134, - CalendarRaidLockoutRemoved = 0x380135, - CalendarRaidLockoutUpdated = 0x380136, - CalendarSendCalendar = 0x380126, - CalendarSendEvent = 0x380127, - CalendarSendNumPending = 0x380137, - CameraEffect = 0x3801be, - CancelAutoRepeat = 0x380177, - CancelCombat = 0x3e0025, - CancelOrphanSpellVisual = 0x4e0037, - CancelPingPin = 0x38003b, - CancelPreloadWorld = 0x38002e, - CancelScene = 0x3800cf, - CancelSpellVisual = 0x4e0035, - CancelSpellVisualKit = 0x4e0039, - CanDuelResult = 0x3e0021, - CanRedeemTokenForBalanceResponse = 0x3802a8, - CapturePointRemoved = 0x3e0008, - CastFailed = 0x4e0048, - CasRefreshRemoteData = 0x380111, - CautionaryChannelMessage = 0x3d0009, - CautionaryChatMessage = 0x3d0008, - ChainMissileBounce = 0x380061, - ChallengeModeComplete = 0x3800a2, - ChallengeModeRequestLeadersResult = 0x3800a8, - ChallengeModeReset = 0x3800a1, - ChallengeModeStart = 0x38009f, - ChallengeModeUpdateDeathCount = 0x3800a0, - ChangePlayerDifficultyResult = 0x4b000c, - ChangeRealmTicketResponse = 0x38029b, - ChannelList = 0x3d001b, - ChannelNotify = 0x3d0017, - ChannelNotifyJoined = 0x3d0019, - ChannelNotifyLeft = 0x3d001a, - ChannelNotifyNpeJoinedBatch = 0x3d0018, - CharacterCheckUpgradeResult = 0x380255, - CharacterLoginFailed = 0x38019e, - CharacterObjectTestResponse = 0x380220, - CharacterRenameResult = 0x3801fb, - CharacterUpgradeAborted = 0x380254, - CharacterUpgradeComplete = 0x380253, - CharacterUpgradeManualUnrevokeResult = 0x380256, - CharacterUpgradeStarted = 0x380252, - CharCustomizeFailure = 0x38017b, - CharCustomizeSuccess = 0x38017c, - CharFactionChangeResult = 0x38023f, - Chat = 0x3d0001, - ChatAutoResponded = 0x3d000e, - ChatCanLocalWhisperTargetResponse = 0x3d0022, - ChatDown = 0x3d0014, - ChatIgnoredAccountMuted = 0x3d0000, - ChatIsDown = 0x3d0015, - ChatNotInGuild = 0x3d0023, - ChatNotInParty = 0x3d0006, - ChatPlayerAmbiguous = 0x3d0004, - ChatPlayerNotfound = 0x3d000d, - ChatReconnect = 0x3d0016, - ChatRegionalServiceStatus = 0x3d001d, - ChatRestricted = 0x3d0007, - ChatServerMessage = 0x3d001c, - CheatIgnoreDimishingReturns = 0x4e0002, - CheckAbandonNpe = 0x4b0023, - CheckCharacterNameAvailabilityResult = 0x38001b, - CheckWargameEntry = 0x380027, - ChromieTimeSelectExpansionSuccess = 0x3802ed, - ClaimRafRewardResponse = 0x3802d4, - ClearAllSpellCharges = 0x4e0016, - ClearBossEmotes = 0x380054, - ClearCooldown = 0x380154, - ClearCooldowns = 0x4e0015, - ClearResurrect = 0x380013, - ClearSpellCharges = 0x4e0017, - ClearTarget = 0x3e0022, - ClearTreasurePickerCache = 0x4c0022, - CloseArtifactForge = 0x380237, - ClubFinderErrorMessage = 0x3802cc, - ClubFinderGetClubPostingIdsResponse = 0x3802cf, - ClubFinderLookupClubPostingsList = 0x3802cd, - ClubFinderResponseCharacterApplicationList = 0x3802ca, - ClubFinderResponsePostRecruitmentMessage = 0x3802ce, - ClubFinderUpdateApplications = 0x3802cb, - ClubFinderWhisperApplicantResponse = 0x38030c, - CoinRemoved = 0x3800af, - CombatEventFailed = 0x3e0019, - CommentatorMapInfo = 0x3801a0, - CommentatorPlayerInfo = 0x3801a1, - CommentatorStateChanged = 0x38019f, - CommerceTokenGetCountResponse = 0x380264, - CommerceTokenGetLogResponse = 0x380270, - CommerceTokenGetMarketPriceResponse = 0x380266, - CommerceTokenUpdate = 0x380265, - ComplaintResult = 0x380146, - CompleteShipmentResponse = 0x380230, - ConfirmPartyInvite = 0x3802a7, - ConnectTo = 0x3f0005, - ConsoleWrite = 0x3800cd, - ConsumableTokenBuyAtMarketPriceResponse = 0x38026c, - ConsumableTokenBuyChoiceRequired = 0x38026b, - ConsumableTokenCanVeteranBuyResponse = 0x38026a, - ConsumableTokenRedeemConfirmRequired = 0x38026e, - ConsumableTokenRedeemResponse = 0x38026f, - ContactList = 0x38021e, - ContributionLastUpdateResponse = 0x3802ae, - ControlUpdate = 0x3800df, - ConvertItemsToCurrencyValue = 0x3802f6, - CooldownCheat = 0x3801d1, - CooldownEvent = 0x380153, - CorpseLocation = 0x3800e7, - CorpseReclaimDelay = 0x3801e2, - CorpseTransportQuery = 0x3801ac, - CovenantCallingsAvailabilityResponse = 0x4c0024, - CovenantPreviewOpenNpc = 0x380290, - CovenantRenownSendCatchupState = 0x3802f7, - CraftingHouseHelloResponse = 0x38032d, - CraftingOrderCancelResult = 0x380329, - CraftingOrderClaimResult = 0x380325, - CraftingOrderCraftResult = 0x380327, - CraftingOrderCreateResult = 0x380323, - CraftingOrderFulfillResult = 0x380328, - CraftingOrderListOrdersResponse = 0x380324, - CraftingOrderNpcRewardInfo = 0x38032f, - CraftingOrderRejectResult = 0x38032b, - CraftingOrderReleaseResult = 0x380326, - CraftingOrderUpdateState = 0x38032e, - CraftEnchantResult = 0x38032c, - CreateChar = 0x38019a, - CreateShipmentResponse = 0x38022f, - CreatorVisualsOverride = 0x380332, - CriteriaDeleted = 0x380180, - CriteriaUpdate = 0x38017a, - CrossedInebriationThreshold = 0x38015b, - CurrencyTransferLog = 0x380344, - CurrencyTransferResult = 0x380343, - CustomLoadScreen = 0x380064, - DailyQuestsReset = 0x4c0000, - DamageCalcLog = 0x4e0054, - DbReply = 0x3c0000, - DeathReleaseLoc = 0x38016d, - DebugMenuManagerFullUpdate = 0x3800ef, - DefenseMessage = 0x3d000c, - DeleteChar = 0x38019b, - DeleteExpiredMissionsResult = 0x420022, - DelvesAccountDataElementChanged = 0x380349, - DestroyArenaUnit = 0x3801da, - DestructibleBuildingDamage = 0x380192, - DifferentInstanceFromParty = 0x380020, - DisenchantCredit = 0x38003f, - DismountResult = 0x380010, - DispelFailed = 0x4e001e, - DisplayGameError = 0x380035, - DisplayPlayerChoice = 0x4b0004, - DisplayPromotion = 0x3800e4, - DisplayQuestPopup = 0x4c001e, - DisplayToast = 0x3800bc, - DisplayWorldText = 0x380281, - DisplayWorldTextOnTarget = 0x4e0053, - DontAutoPushSpellsToActionBar = 0x380079, - DropNewConnection = 0x3f0004, - DuelArranged = 0x3e001b, - DuelComplete = 0x3e001f, - DuelCountdown = 0x3e001e, - DuelInBounds = 0x3e001d, - DuelOutOfBounds = 0x3e001c, - DuelRequested = 0x3e001a, - DuelWinner = 0x3e0020, - DurabilityDamageDeath = 0x3801dd, - Emote = 0x38025c, - EnableBarberShop = 0x380156, - EnchantmentLog = 0x3801ad, - EncounterEnd = 0x380217, - EncounterStart = 0x380216, - EndLightningStorm = 0x380143, - EnterEncryptedMode = 0x3f0001, - EnumCharactersResult = 0x380018, - EnumVasPurchaseStatesResponse = 0x380286, - EnvironmentalDamageLog = 0x4e000e, - EquipmentSetId = 0x38014c, - ExpectedSpamRecords = 0x3d0005, - ExplorationExperience = 0x3801f7, - ExportAccountProfile = 0x3800ec, - ExternalTransactionIdGenerated = 0x3802f4, - FactionBonusInfo = 0x3801bd, - FailedPlayerCondition = 0x4b0002, - FailedQuestTurnIn = 0x3802a4, - FeatureSystemStatus = 0x380058, - FeatureSystemStatus2 = 0x380341, - FeatureSystemStatusGlueScreen = 0x380059, - FeignDeathResisted = 0x3801dc, - FishEscaped = 0x38016a, - FishNotHooked = 0x380169, - FlightSplineSync = 0x49005b, - FlushCombatLogFile = 0x4e0010, - ForcedDeathUpdate = 0x38016e, - ForceAnim = 0x3801e9, - ForceAnimations = 0x3801ea, - ForceObjectRelink = 0x3800e3, - ForceRandomTransmogToast = 0x38004a, - ForceSpawnTrackingUpdate = 0x4c0021, - FriendStatus = 0x38021f, - GainMawPower = 0x380275, - GameObjectActivateAnimKit = 0x38005c, - GameObjectBase = 0x3802bb, - GameObjectCloseInteraction = 0x38030b, - GameObjectCustomAnim = 0x38005d, - GameObjectDespawn = 0x38005e, - GameObjectInteraction = 0x38030a, - GameObjectPlaySpellVisual = 0x4e003c, - GameObjectPlaySpellVisualKit = 0x4e003b, - GameObjectResetState = 0x3801b7, - GameObjectSetStateLocal = 0x380297, - GameSpeedSet = 0x38011c, - GameTimeSet = 0x3801a6, - GameTimeUpdate = 0x3801a5, - GarrisonActivateMissionBonusAbility = 0x420024, - GarrisonAddEvent = 0x420048, - GarrisonAddFollowerResult = 0x420016, - GarrisonAddMissionResult = 0x42001a, - GarrisonAddSpecGroups = 0x42004b, - GarrisonApplyTalentSocketDataChanges = 0x42004f, - GarrisonAssignFollowerToBuildingResult = 0x42002c, - GarrisonAutoTroopMinLevelUpdateResult = 0x420051, - GarrisonBuildingActivated = 0x42000b, - GarrisonBuildingRemoved = 0x420004, - GarrisonBuildingSetActiveSpecializationResult = 0x420006, - GarrisonChangeMissionStartTimeResult = 0x42001d, - GarrisonClearCollection = 0x420047, - GarrisonClearEventList = 0x42004a, - GarrisonClearSpecGroups = 0x42004c, - GarrisonCollectionRemoveEntry = 0x420046, - GarrisonCollectionUpdateEntry = 0x420045, - GarrisonCompleteBuildingConstructionResult = 0x42003d, - GarrisonCompleteMissionResult = 0x42001c, - GarrisonCreateResult = 0x42000c, - GarrisonDeleteMissionResult = 0x420023, - GarrisonDeleteResult = 0x420035, - GarrisonFollowerActivationsSet = 0x42002b, - GarrisonFollowerChangedFlags = 0x420029, - GarrisonFollowerChangedItemLevel = 0x420027, - GarrisonFollowerChangedQuality = 0x420028, - GarrisonFollowerChangedXp = 0x420026, - GarrisonFollowerFatigueCleared = 0x42002a, - GarrisonGenerateFollowersResult = 0x420033, - GarrisonGetClassSpecCategoryInfoResult = 0x420015, - GarrisonGetRecallPortalLastUsedTimeResult = 0x42001e, - GarrisonIsUpgradeableResponse = 0x42003f, - GarrisonLearnBlueprintResult = 0x420007, - GarrisonLearnSpecializationResult = 0x420005, - GarrisonListCompletedMissionsCheatResult = 0x420040, - GarrisonListFollowersCheatResult = 0x420019, - GarrisonMapDataResponse = 0x420042, - GarrisonMissionBonusRollResult = 0x420020, - GarrisonMissionRequestRewardInfoResponse = 0x420043, - GarrisonMissionStartConditionUpdate = 0x420025, - GarrisonOpenCrafter = 0x420037, - GarrisonOpenRecruitmentNpc = 0x420030, - GarrisonPlaceBuildingResult = 0x420003, - GarrisonPlotPlaced = 0x420001, - GarrisonPlotRemoved = 0x420002, - GarrisonRecruitFollowerResult = 0x420034, - GarrisonRemoteInfo = 0x42000a, - GarrisonRemoveEvent = 0x420049, - GarrisonRemoveFollowerAbilityResult = 0x42002f, - GarrisonRemoveFollowerFromBuildingResult = 0x42002d, - GarrisonRemoveFollowerResult = 0x420017, - GarrisonRenameFollowerResult = 0x42002e, - GarrisonRequestBlueprintAndSpecializationDataResult = 0x420009, - GarrisonResearchTalentResult = 0x42000e, - GarrisonResetTalentTree = 0x420013, - GarrisonResetTalentTreeSocketData = 0x420014, - GarrisonStartMissionResult = 0x42001b, - GarrisonSwapBuildingsResponse = 0x42003c, - GarrisonSwitchTalentTreeBranch = 0x42004d, - GarrisonTalentCompleted = 0x42000f, - GarrisonTalentRemoved = 0x420010, - GarrisonTalentRemoveSocketData = 0x420012, - GarrisonTalentUpdateSocketData = 0x420011, - GarrisonTalentWorldQuestUnlocksResponse = 0x42004e, - GarrisonUnlearnBlueprintResult = 0x420008, - GarrisonUpdateFollower = 0x420018, - GarrisonUpdateGarrisonMonumentSelections = 0x42003e, - GarrisonUpdateMissionCheatResult = 0x420050, - GarrisonUpgradeResult = 0x42000d, - GarrisonUseRecallPortalResult = 0x42001f, - GenerateRandomCharacterNameResult = 0x38001c, - GenerateSsoTokenResponse = 0x3802af, - GetAccountCharacterListResult = 0x3801f9, - GetGarrisonInfoResult = 0x420000, - GetLandingPageShipmentsResponse = 0x380232, - GetRealmHiddenResult = 0x380338, - GetRemainingGameTimeResponse = 0x38026d, - GetSelectedTrophyIdResponse = 0x38025a, - GetShipmentsOfTypeResponse = 0x380231, - GetShipmentInfoResponse = 0x38022d, - GetTrophyListResponse = 0x380259, - GetVasAccountCharacterListResult = 0x380282, - GetVasTransferTargetRealmListResult = 0x380283, - GmPlayerInfo = 0x4b000d, - GmRequestPlayerInfo = 0x4b0003, - GmTicketCaseStatus = 0x38013e, - GmTicketSystemStatus = 0x38013d, - GodMode = 0x380195, - GossipComplete = 0x4c0017, - GossipMessage = 0x4c0018, - GossipOptionNpcInteraction = 0x4c0028, - GossipPoi = 0x38022a, - GossipQuestUpdate = 0x4c0019, - GossipRefreshOptions = 0x4c0027, - GroupActionThrottled = 0x380024, - GroupAutoKick = 0x380227, - GroupDecline = 0x380223, - GroupDestroyed = 0x380226, - GroupNewLeader = 0x3800c5, - GroupRequestDecline = 0x380224, - GroupUninvite = 0x380225, - GuildAchievementDeleted = 0x44000d, - GuildAchievementEarned = 0x44000c, - GuildAchievementMembers = 0x44000f, - GuildBankLogQueryResults = 0x440027, - GuildBankQueryResults = 0x440026, - GuildBankRemainingWithdrawMoney = 0x440028, - GuildBankTextQueryResult = 0x44002b, - GuildChallengeCompleted = 0x44001b, - GuildChallengeUpdate = 0x44001a, - GuildChangeNameResult = 0x440025, - GuildCommandResult = 0x440002, - GuildCriteriaDeleted = 0x44000e, - GuildCriteriaUpdate = 0x44000b, - GuildEventBankContentsChanged = 0x440040, - GuildEventBankMoneyChanged = 0x44003f, - GuildEventDisbanded = 0x440035, - GuildEventLogQueryResults = 0x44002a, - GuildEventMotd = 0x440036, - GuildEventNewLeader = 0x440034, - GuildEventPlayerJoined = 0x440032, - GuildEventPlayerLeft = 0x440033, - GuildEventPresenceChange = 0x440037, - GuildEventRanksUpdated = 0x440039, - GuildEventRankChanged = 0x44003a, - GuildEventStatusChange = 0x440038, - GuildEventTabAdded = 0x44003b, - GuildEventTabDeleted = 0x44003c, - GuildEventTabModified = 0x44003d, - GuildEventTabTextChanged = 0x44003e, - GuildFlaggedForRename = 0x440024, - GuildHardcoreMemberDeath = 0x440004, - GuildInvite = 0x440012, - GuildInviteDeclined = 0x440030, - GuildInviteExpired = 0x440031, - GuildItemLootedNotify = 0x44001c, - GuildKnownRecipes = 0x440006, - GuildMembersWithRecipe = 0x440007, - GuildMemberDailyReset = 0x44002c, - GuildMemberRecipes = 0x440005, - GuildMemberUpdateNote = 0x440011, - GuildMoved = 0x440022, - GuildMoveStarting = 0x440021, - GuildNameChanged = 0x440023, - GuildNews = 0x440009, - GuildNewsDeleted = 0x44000a, - GuildPartyState = 0x440013, - GuildPermissionsQueryResults = 0x440029, - GuildRanks = 0x440010, - GuildRenameNameCheck = 0x440044, - GuildRenameRefundResult = 0x440046, - GuildRenameRequestedResult = 0x440045, - GuildRenameStatusUpdate = 0x440043, - GuildReputationReactionChanged = 0x440014, - GuildReset = 0x440020, - GuildRewardList = 0x440008, - GuildRoster = 0x440003, - GuildSendRankChange = 0x440001, - HardcoreDeathAlert = 0x380340, - HealthUpdate = 0x38016b, - HighestThreatUpdate = 0x380173, - HotfixConnect = 0x3c0003, - HotfixMessage = 0x3c0002, - InitializeFactions = 0x3801bc, - InitialSetup = 0x380014, - InitWorldStates = 0x3801de, - InspectResult = 0x3800c9, - InstanceEncounterChangePriority = 0x380245, - InstanceEncounterDisengageUnit = 0x380244, - InstanceEncounterEnd = 0x38024d, - InstanceEncounterEngageUnit = 0x380243, - InstanceEncounterGainCombatResurrectionCharge = 0x38024f, - InstanceEncounterInCombatResurrection = 0x38024e, - InstanceEncounterObjectiveComplete = 0x380248, - InstanceEncounterObjectiveStart = 0x380247, - InstanceEncounterObjectiveUpdate = 0x38024c, - InstanceEncounterPhaseShiftChanged = 0x380250, - InstanceEncounterStart = 0x380249, - InstanceEncounterTimerStart = 0x380246, - InstanceEncounterUpdateAllowReleaseInProgress = 0x38024b, - InstanceEncounterUpdateSuppressRelease = 0x38024a, - InstanceGroupSizeChanged = 0x380193, - InstanceInfo = 0x3800cc, - InstanceReset = 0x380121, - InstanceResetFailed = 0x380122, - InstanceSaveCreated = 0x380215, - InterruptPowerRegen = 0x4e004a, - InvalidatePageText = 0x3c000a, - InvalidatePlayer = 0x4b0007, - InvalidPromotionCode = 0x3801eb, - InventoryChangeFailure = 0x4f0005, - InventoryFixupComplete = 0x3802a6, - InventoryFullOverflow = 0x3802b7, - IslandAzeriteGain = 0x3801f4, - IslandComplete = 0x3801f5, - IsQuestCompleteResponse = 0x4c0004, - ItemChanged = 0x380184, - ItemCooldown = 0x38025b, - ItemEnchantTimeUpdate = 0x3801ed, - ItemExpirePurchaseRefund = 0x380034, - ItemInteractionComplete = 0x3802ec, - ItemPurchaseRefundResult = 0x380032, - ItemPushResult = 0x3800bb, - ItemTimeUpdate = 0x3801ec, - KickReason = 0x380124, - LatencyReportPing = 0x3802fc, - LearnedSpells = 0x4e003e, - LearnPvpTalentFailed = 0x38006d, - LearnTalentFailed = 0x38006c, - LegacyLootRules = 0x3802bc, - LevelLinkingResult = 0x3802d2, - LevelUpInfo = 0x380182, - LfgBootPlayer = 0x460019, - LfgDisabled = 0x460017, - LfgExpandSearchPrompt = 0x46001f, - LfgInstanceShutdownCountdown = 0x460009, - LfgJoinLobbyMatchmakerQueue = 0x460020, - LfgJoinResult = 0x460000, - LfgListApplicantListUpdate = 0x46000f, - LfgListApplicationStatusUpdate = 0x46000c, - LfgListApplyToGroupResult = 0x46000d, - LfgListJoinResult = 0x460001, - LfgListSearchResults = 0x460002, - LfgListSearchResultsUpdate = 0x460010, - LfgListSearchStatus = 0x460003, - LfgListUpdateBlacklist = 0x46000e, - LfgListUpdateExpiration = 0x46000b, - LfgListUpdateStatus = 0x46000a, - LfgOfferContinue = 0x460018, - LfgPartyInfo = 0x46001a, - LfgPlayerInfo = 0x46001b, - LfgPlayerReward = 0x46001c, - LfgProposalUpdate = 0x460011, - LfgQueueStatus = 0x460004, - LfgReadyCheckResult = 0x46001e, - LfgReadyCheckUpdate = 0x460006, - LfgRoleCheckUpdate = 0x460005, - LfgSlotInvalid = 0x460014, - LfgTeleportDenied = 0x460016, - LfgUpdateStatus = 0x460008, - LiveRegionAccountRestoreResult = 0x380207, - LiveRegionCharacterCopyResult = 0x380206, - LiveRegionGetAccountCharacterListResult = 0x3801fa, - LiveRegionKeyBindingsCopyResult = 0x380208, - LoadCufProfiles = 0x380055, - LoadEquipmentSet = 0x3801a8, - LobbyMatchmakerLobbyAcquiredServer = 0x38030d, - LobbyMatchmakerPartyInfo = 0x38030e, - LobbyMatchmakerPartyInviteRejected = 0x38030f, - LobbyMatchmakerQueueProposed = 0x380311, - LobbyMatchmakerQueueResult = 0x380312, - LobbyMatchmakerReceiveInvite = 0x380310, - LoginSetTimeSpeed = 0x3801a7, - LoginVerifyWorld = 0x38002f, - LogoutCancelAck = 0x380120, - LogoutComplete = 0x38011f, - LogoutResponse = 0x38011e, - LogXpGain = 0x38017e, - LootAllPassed = 0x3800b9, - LootList = 0x3801d9, - LootMoneyNotify = 0x3800b4, - LootRelease = 0x3800b3, - LootReleaseAll = 0x3800b2, - LootRemoved = 0x3800ae, - LootResponse = 0x3800ad, - LootRoll = 0x3800b6, - LootRollsComplete = 0x3800b8, - LootRollWon = 0x3800ba, - LossOfControlAuraUpdate = 0x38010a, - MailCommandResult = 0x3800d3, - MailListResult = 0x3801ee, - MailQueryNextTimeResult = 0x3801ef, - MapObjectivesInit = 0x3e002a, - MapObjEvents = 0x38005f, - MasterLootCandidateList = 0x3800b7, - MeetingStoneFailed = 0x380313, - MessageBox = 0x38000a, - MinimapPing = 0x380168, - MirrorImageComponentedData = 0x4e0004, - MirrorImageCreatureData = 0x4e0003, - MissileCancel = 0x380060, - ModifyCooldown = 0x3801fc, - Motd = 0x3d0003, - MountResult = 0x38000f, - MovementEnforcementAlert = 0x3802c2, - MoveAddImpulse = 0x490062, - MoveApplyInertia = 0x49005e, - MoveApplyMovementForce = 0x490045, - MoveDisableCollision = 0x490041, - MoveDisableDoubleJump = 0x49002b, - MoveDisableFullSpeedTurning = 0x490075, - MoveDisableGravity = 0x49003d, - MoveDisableInertia = 0x49003f, - MoveDisableTransitionBetweenSwimAndFly = 0x49003c, - MoveEnableCollision = 0x490042, - MoveEnableDoubleJump = 0x49002a, - MoveEnableFullSpeedTurning = 0x490074, - MoveEnableGravity = 0x49003e, - MoveEnableInertia = 0x490040, - MoveEnableTransitionBetweenSwimAndFly = 0x49003b, - MoveKnockBack = 0x490031, - MoveRemoveInertia = 0x49005f, - MoveRemoveMovementForce = 0x490046, - MoveRoot = 0x490027, - MoveSetActiveMover = 0x490003, - MoveSetAdvFlyingAddImpulseMaxSpeed = 0x49006b, - MoveSetAdvFlyingAirFriction = 0x490066, - MoveSetAdvFlyingBankingRate = 0x49006c, - MoveSetAdvFlyingDoubleJumpVelMod = 0x490069, - MoveSetAdvFlyingGlideStartMinHeight = 0x49006a, - MoveSetAdvFlyingLaunchSpeedCoefficient = 0x490072, - MoveSetAdvFlyingLiftCoefficient = 0x490068, - MoveSetAdvFlyingMaxVel = 0x490067, - MoveSetAdvFlyingOverMaxDeceleration = 0x490071, - MoveSetAdvFlyingPitchingRateDown = 0x49006d, - MoveSetAdvFlyingPitchingRateUp = 0x49006e, - MoveSetAdvFlyingSurfaceFriction = 0x490070, - MoveSetAdvFlyingTurnVelocityThreshold = 0x49006f, - MoveSetCantSwim = 0x490035, - MoveSetCanAdvFly = 0x490064, - MoveSetCanDrive = 0x490076, - MoveSetCanFly = 0x490033, - MoveSetCanTurnWhileFalling = 0x490037, - MoveSetCollisionHeight = 0x490043, - MoveSetCompoundState = 0x490047, - MoveSetFeatherFall = 0x49002d, - MoveSetFlightBackSpeed = 0x490023, - MoveSetFlightSpeed = 0x490022, - MoveSetHovering = 0x49002f, - MoveSetIgnoreMovementForces = 0x490039, - MoveSetLandWalk = 0x49002c, - MoveSetModMovementForceMagnitude = 0x490014, - MoveSetNormalFall = 0x49002e, - MoveSetPitchRate = 0x490026, - MoveSetRunBackSpeed = 0x49001f, - MoveSetRunSpeed = 0x49001e, - MoveSetSwimBackSpeed = 0x490021, - MoveSetSwimSpeed = 0x490020, - MoveSetTurnRate = 0x490025, - MoveSetVehicleRecId = 0x490044, - MoveSetWalkSpeed = 0x490024, - MoveSetWaterWalk = 0x490029, - MoveSkipTime = 0x490048, - MoveSplineDisableCollision = 0x49004d, - MoveSplineDisableGravity = 0x49004b, - MoveSplineEnableCollision = 0x49004e, - MoveSplineEnableGravity = 0x49004c, - MoveSplineRoot = 0x490049, - MoveSplineSetFeatherFall = 0x49004f, - MoveSplineSetFlightBackSpeed = 0x49001a, - MoveSplineSetFlightSpeed = 0x490019, - MoveSplineSetFlying = 0x490059, - MoveSplineSetHover = 0x490051, - MoveSplineSetLandWalk = 0x490054, - MoveSplineSetNormalFall = 0x490050, - MoveSplineSetPitchRate = 0x49001d, - MoveSplineSetRunBackSpeed = 0x490016, - MoveSplineSetRunMode = 0x490057, - MoveSplineSetRunSpeed = 0x490015, - MoveSplineSetSwimBackSpeed = 0x490018, - MoveSplineSetSwimSpeed = 0x490017, - MoveSplineSetTurnRate = 0x49001c, - MoveSplineSetWalkMode = 0x490058, - MoveSplineSetWalkSpeed = 0x49001b, - MoveSplineSetWaterWalk = 0x490053, - MoveSplineStartSwim = 0x490055, - MoveSplineStopSwim = 0x490056, - MoveSplineUnroot = 0x49004a, - MoveSplineUnsetFlying = 0x49005a, - MoveSplineUnsetHover = 0x490052, - MoveTeleport = 0x490032, - MoveUnroot = 0x490028, - MoveUnsetCantSwim = 0x490036, - MoveUnsetCanAdvFly = 0x490065, - MoveUnsetCanDrive = 0x490077, - MoveUnsetCanFly = 0x490034, - MoveUnsetCanTurnWhileFalling = 0x490038, - MoveUnsetHovering = 0x490030, - MoveUnsetIgnoreMovementForces = 0x49003a, - MoveUpdate = 0x49000e, - MoveUpdateAddImpulse = 0x490063, - MoveUpdateApplyInertia = 0x490060, - MoveUpdateApplyMovementForce = 0x490012, - MoveUpdateCollisionHeight = 0x49000d, - MoveUpdateFlightBackSpeed = 0x49000a, - MoveUpdateFlightSpeed = 0x490009, - MoveUpdateKnockBack = 0x490010, - MoveUpdateModMovementForceMagnitude = 0x490011, - MoveUpdatePitchRate = 0x49000c, - MoveUpdateRemoveInertia = 0x490061, - MoveUpdateRemoveMovementForce = 0x490013, - MoveUpdateRunBackSpeed = 0x490005, - MoveUpdateRunSpeed = 0x490004, - MoveUpdateSwimBackSpeed = 0x490008, - MoveUpdateSwimSpeed = 0x490007, - MoveUpdateTeleport = 0x49000f, - MoveUpdateTurnRate = 0x49000b, - MoveUpdateWalkSpeed = 0x490006, - MultiFloorLeaveFloor = 0x380272, - MultiFloorNewFloor = 0x380271, - MythicPlusAllMapStats = 0x3800a3, - MythicPlusCurrentAffixes = 0x3800a5, - MythicPlusNewWeekRecord = 0x3800aa, - MythicPlusSeasonData = 0x3800a4, - NeutralPlayerFactionSelectResult = 0x380074, - NewDataBuild = 0x380337, - NewTaxiPath = 0x380119, - NewWorld = 0x38002b, - NotifyDestLocSpellCast = 0x4e0034, - NotifyMissileTrajectoryCollision = 0x380145, - NotifyMoney = 0x380031, - NotifyReceivedMail = 0x3800d4, - NpcInteractionOpenResult = 0x380309, - OfferPetitionError = 0x380150, - OnCancelExpectedRideVehicleAura = 0x38017f, - OnMonsterMove = 0x490002, - OpenArtifactForge = 0x380236, - OpenContainer = 0x4f0006, - OpenLfgDungeonFinder = 0x460015, - OpenShipmentNpcResult = 0x38022e, - OverrideLight = 0x380155, - PageText = 0x3801b3, - PartyCommandResult = 0x380228, - PartyEligibilityForDelveTiersResponse = 0x38034c, - PartyInvite = 0x380056, - PartyKillLog = 0x3801f2, - PartyMemberFullState = 0x3801f1, - PartyMemberPartialState = 0x3801f0, - PartyNotifyLfgLeaderChange = 0x3802f2, - PartyUpdate = 0x38008c, - PastTimeEvents = 0x38005b, - PauseMirrorTimer = 0x3801aa, - PendingRaidLock = 0x380191, - PerksProgramActivityComplete = 0x380306, - PerksProgramActivityUpdate = 0x380302, - PerksProgramDisabled = 0x380307, - PerksProgramResult = 0x380303, - PerksProgramVendorUpdate = 0x380301, - PetitionAlreadySigned = 0x380037, - PetitionRenameGuildResponse = 0x440042, - PetitionShowList = 0x380158, - PetitionShowSignatures = 0x380159, - PetitionSignResults = 0x3801e4, - PetActionFeedback = 0x3801e1, - PetActionSound = 0x38013b, - PetBattleChatRestricted = 0x38009a, - PetBattleDebugQueueDumpResponse = 0x38010f, - PetBattleFinalizeLocation = 0x380093, - PetBattleFinalRound = 0x380098, - PetBattleFinished = 0x380099, - PetBattleFirstRound = 0x380095, - PetBattleInitialUpdate = 0x380094, - PetBattleMaxGameLengthWarning = 0x38009b, - PetBattlePvpChallenge = 0x380092, - PetBattleQueueProposeMatch = 0x3800d1, - PetBattleQueueStatus = 0x3800d2, - PetBattleReplacementsMade = 0x380097, - PetBattleRequestFailed = 0x380091, - PetBattleRoundResult = 0x380096, - PetBattleSlotUpdates = 0x380084, - PetCastFailed = 0x4e0049, - PetClearSpells = 0x4e0013, - PetDismissSound = 0x38013c, - PetGodMode = 0x380116, - PetGuids = 0x38019d, - PetLearnedSpells = 0x4e0040, - PetMode = 0x38001f, - PetNameInvalid = 0x38015d, - PetNewlyTamed = 0x38001e, - PetSpellsMessage = 0x4e0014, - PetStableResult = 0x38002a, - PetTameFailure = 0x38014d, - PetUnlearnedSpells = 0x4e0041, - PhaseShiftChange = 0x38000c, - PlayedTime = 0x38016f, - PlayerAckowledgeArrowCallout = 0x4b002d, - PlayerAzeriteItemEquippedStatusChanged = 0x4b001f, - PlayerAzeriteItemGains = 0x4b001e, - PlayerBonusRollFailed = 0x4b0021, - PlayerBound = 0x4b0000, - PlayerChoiceClear = 0x4b0006, - PlayerChoiceDisplayError = 0x4b0005, - PlayerConditionResult = 0x4b0012, - PlayerEndOfMatchDetails = 0x4b002f, - PlayerHideArrowCallout = 0x4b002c, - PlayerIsAdventureMapPoiValid = 0x4b0011, - PlayerOpenSubscriptionInterstitial = 0x4b0016, - PlayerSaveGuildEmblem = 0x440041, - PlayerSavePersonalEmblem = 0x4b002e, - PlayerShowArrowCallout = 0x4b002b, - PlayerShowGenericWidgetDisplay = 0x4b0029, - PlayerShowPartyPoseUi = 0x4b002a, - PlayerShowUiEventToast = 0x4b0024, - PlayerSkinned = 0x4b000e, - PlayerTutorialHighlightSpell = 0x4b0015, - PlayerTutorialUnhighlightSpell = 0x4b0014, - PlayMusic = 0x380201, - PlayObjectSound = 0x380203, - PlayOneShotAnimKit = 0x3801c9, - PlayOrphanSpellVisual = 0x4e0038, - PlayScene = 0x3800ce, - PlaySound = 0x380200, - PlaySpeakerbotSound = 0x380204, - PlaySpellVisual = 0x4e0036, - PlaySpellVisualKit = 0x4e003a, - PlayTimeWarning = 0x380197, - Pong = 0x3f0006, - PowerUpdate = 0x38016c, - PreloadChildMap = 0x38000d, - PreloadWorld = 0x38002c, - PrepopulateNameCache = 0x3802c5, - PreRessurect = 0x3801ff, - PrintNotification = 0x380063, - ProcResist = 0x3801f3, - ProfessionGossip = 0x380292, - PushSpellToActionBar = 0x4e0042, - PvpCredit = 0x3e0024, - PvpMatchComplete = 0x3e002f, - PvpMatchInitialize = 0x3e0030, - PvpMatchSetState = 0x3e002e, - PvpMatchStart = 0x3e002d, - PvpMatchStatistics = 0x3e0010, - PvpOptionsEnabled = 0x3e0013, - PvpTierRecord = 0x3802fd, - QueryBattlePetNameResponse = 0x3c000c, - QueryCreatureResponse = 0x3c0006, - QueryGameObjectResponse = 0x3c0007, - QueryGarrisonPetNameResponse = 0x420041, - QueryGuildFollowInfoResponse = 0x44002f, - QueryGuildInfoResponse = 0x44002d, - QueryItemTextResponse = 0x3c0010, - QueryNpcTextResponse = 0x3c0008, - QueryPageTextResponse = 0x3c0009, - QueryPetitionResponse = 0x3c000d, - QueryPetNameResponse = 0x3c000b, - QueryPlayerNamesResponse = 0x4b0026, - QueryPlayerNameByCommunityIdResponse = 0x4b000a, - QueryQuestInfoResponse = 0x4c0016, - QueryRealmGuildMasterInfoResponse = 0x44002e, - QueryTimeResponse = 0x38017d, - QuestCompletionNpcResponse = 0x4c0001, - QuestConfirmAccept = 0x4c000f, - QuestForceRemoved = 0x4c001c, - QuestGiverInvalidQuest = 0x4c0005, - QuestGiverOfferRewardMessage = 0x4c0014, - QuestGiverQuestComplete = 0x4c0003, - QuestGiverQuestDetails = 0x4c0012, - QuestGiverQuestFailed = 0x4c0006, - QuestGiverQuestListMessage = 0x4c001a, - QuestGiverRequestItems = 0x4c0013, - QuestGiverStatus = 0x4c001b, - QuestGiverStatusMultiple = 0x4c0011, - QuestItemUsabilityResponse = 0x4c0002, - QuestLogFull = 0x4c0007, - QuestNonLogUpdateComplete = 0x4c0008, - QuestPoiQueryResponse = 0x4c001d, - QuestPoiUpdateResponse = 0x4c001f, - QuestPushResult = 0x4c0010, - QuestSessionInfoResponse = 0x3802e8, - QuestSessionReadyCheck = 0x3802d6, - QuestSessionReadyCheckResponse = 0x3802d7, - QuestSessionResult = 0x3802d5, - QuestUpdateAddCredit = 0x4c000c, - QuestUpdateAddCreditSimple = 0x4c000d, - QuestUpdateAddPvpCredit = 0x4c000e, - QuestUpdateComplete = 0x4c0009, - QuestUpdateFailed = 0x4c000a, - QuestUpdateFailedTimer = 0x4c000b, - QueueSummaryUpdate = 0x3802a5, - RafAccountInfo = 0x3802d3, - RafActivityStateChanged = 0x3802e4, - RafDebugFriendMonths = 0x380334, - RaidDifficultySet = 0x380240, - RaidGroupOnly = 0x380242, - RaidInstanceMessage = 0x3d000a, - RaidMarkersChanged = 0x380038, - RandomRoll = 0x3800c8, - RatedPvpInfo = 0x3e000f, - ReadyCheckCompleted = 0x380090, - ReadyCheckResponse = 0x38008f, - ReadyCheckStarted = 0x38008e, - ReadItemResultFailed = 0x38023c, - ReadItemResultOk = 0x380233, - RealmQueryResponse = 0x3c0005, - ReattachResurrect = 0x3801e3, - ReceivePingUnit = 0x380039, - ReceivePingWorldPoint = 0x38003a, - RecraftItemResult = 0x38032a, - RecruitAFriendFailure = 0x38015a, - RefreshComponent = 0x3800e9, - RegionwideCharacterMailData = 0x38001a, - RegionwideCharacterRestrictionsData = 0x380019, - RemoveItemPassive = 0x380043, - RemoveSpellFromActionBar = 0x4e0043, - ReplaceTrophyResponse = 0x380258, - ReportPvpPlayerAfkResult = 0x4b0009, - RequestCemeteryListResponse = 0x380025, - RequestPvpRewardsResponse = 0x3e0014, - RequestScheduledPvpInfoResponse = 0x3e0015, - ResetCompressionContext = 0x3f0007, - ResetFailedNotify = 0x380151, - ResetLastLoadedConfigCvars = 0x380331, - ResetQuestPoi = 0x4c0020, - ResetRangedCombatTimer = 0x3e0023, - ResetWeeklyCurrency = 0x380009, - RespecWipeConfirm = 0x3800ab, - RespondInspectAchievements = 0x380006, - ResponsePerkPendingRewards = 0x380304, - ResponsePerkRecentPurchases = 0x380305, - RestartGlobalCooldown = 0x4e0052, - RestrictedAccountWarning = 0x380052, - ResumeCast = 0x4e002c, - ResumeCastBar = 0x4e002f, - ResumeComms = 0x3f0003, - ResumeToken = 0x380041, - ResurrectRequest = 0x380012, - ResyncRunes = 0x4e0050, - ReturningPlayerPrompt = 0x38023b, - ReturnApplicantList = 0x3802c9, - ReturnRecruitingClubs = 0x3802c8, - RoleChangedInform = 0x380021, - RoleChosen = 0x46001d, - RolePollInform = 0x380022, - RuneforgeLegendaryCraftingOpenNpc = 0x380291, - RuneRegenDebug = 0x38004f, - ScenarioCompleted = 0x38027f, - ScenarioPois = 0x3800cb, - ScenarioProgressUpdate = 0x3800c4, - ScenarioShowCriteria = 0x380295, - ScenarioState = 0x3800c3, - ScenarioUiUpdate = 0x380294, - ScenarioVacate = 0x38023d, - SceneObjectEvent = 0x38007a, - SceneObjectPetBattleFinalRound = 0x38007f, - SceneObjectPetBattleFinished = 0x380080, - SceneObjectPetBattleFirstRound = 0x38007c, - SceneObjectPetBattleInitialUpdate = 0x38007b, - SceneObjectPetBattleReplacementsMade = 0x38007e, - SceneObjectPetBattleRoundResult = 0x38007d, - ScheduledAreaPoiUpdateResponse = 0x4b0019, - ScriptCast = 0x4e0047, - SeasonInfo = 0x38005a, - SellResponse = 0x38015e, - SendItemPassives = 0x380044, - SendKnownSpells = 0x4e0019, - SendRaidTargetUpdateAll = 0x3800c6, - SendRaidTargetUpdateSingle = 0x3800c7, - SendSpellCharges = 0x4e001b, - SendSpellHistory = 0x4e001a, - SendUnlearnSpells = 0x4e001c, - ServerFirstAchievements = 0x3800e6, - ServerTime = 0x38011d, - ServerTimeOffset = 0x3801ae, - SetupCombatLogFileFlush = 0x4e000f, - SetupCurrency = 0x380007, - SetAiAnimKit = 0x3801c8, - SetAnimTier = 0x3801cc, - SetChrUpgradeTier = 0x380077, - SetCurrency = 0x380008, - SetDfFastLaunchResult = 0x460012, - SetDungeonDifficulty = 0x38013f, - SetFactionAtWar = 0x380199, - SetFactionNotVisible = 0x3801c3, - SetFactionStanding = 0x3801c4, - SetFactionVisible = 0x3801c2, - SetFlatSpellModifier = 0x4e0027, - SetItemPurchaseData = 0x380033, - SetLootMethodFailed = 0x380263, - SetMaxWeeklyQuantity = 0x380036, - SetMeleeAnimKit = 0x3801cb, - SetMovementAnimKit = 0x3801ca, - SetPctSpellModifier = 0x4e0028, - SetPetSpecialization = 0x3800bd, - SetPlayerDeclinedNamesResult = 0x4b000b, - SetPlayHoverAnim = 0x380053, - SetProficiency = 0x3801cd, - SetQuestReplayCooldownOverride = 0x3802dc, - SetShipmentReadyResponse = 0x42003a, - SetSpellCharges = 0x4e0018, - SetTimeZoneInformation = 0x380112, - SetVehicleRecId = 0x380190, - ShadowlandsCapacitanceUpdate = 0x380308, - ShipmentFactionUpdateResult = 0x42003b, - ShowDelvesCompanionConfigurationUi = 0x38034a, - ShowDelvesDisplayUi = 0x380348, - ShowNeutralPlayerFactionSelectUi = 0x380073, - ShowQuestCompletionText = 0x4c0015, - ShowTaxiNodes = 0x380167, - ShowTradeSkillResponse = 0x380209, - SocialContractRequestResponse = 0x380314, - SocketGemsFailure = 0x3801c0, - SocketGemsSuccess = 0x3801bf, - SpecialMountAnim = 0x38013a, - SpectateEnd = 0x380336, - SpectatePlayer = 0x380335, - SpecInvoluntarilyChanged = 0x3801b2, - SpellAbsorbLog = 0x4e000c, - SpellCategoryCooldown = 0x4e0006, - SpellChannelStart = 0x4e0022, - SpellChannelUpdate = 0x4e0023, - SpellCooldown = 0x4e0005, - SpellDamageShield = 0x4e001f, - SpellDelayed = 0x4e0030, - SpellDispellLog = 0x4e0007, - SpellEmpowerSetStage = 0x4e0026, - SpellEmpowerStart = 0x4e0024, - SpellEmpowerUpdate = 0x4e0025, - SpellEnergizeLog = 0x4e0009, - SpellExecuteLog = 0x4e0031, - SpellFailedOther = 0x4e0046, - SpellFailure = 0x4e0044, - SpellFailureMessage = 0x4e004b, - SpellGo = 0x4e002a, - SpellHealAbsorbLog = 0x4e000b, - SpellHealLog = 0x4e000a, - SpellInstakillLog = 0x4e0021, - SpellInterruptLog = 0x4e000d, - SpellMissLog = 0x4e0032, - SpellNonMeleeDamageLog = 0x4e0020, - SpellOrDamageImmune = 0x4e001d, - SpellPeriodicAuraLog = 0x4e0008, - SpellPrepare = 0x4e0029, - SpellStart = 0x4e002b, - SpellVisualLoadScreen = 0x380065, - SplashScreenShowLatest = 0x3802ee, - StandStateUpdate = 0x3801b6, - StarterBuildActivateFailed = 0x38006b, - StartElapsedTimer = 0x38009c, - StartElapsedTimers = 0x38009e, - StartLightningStorm = 0x380142, - StartLootRoll = 0x3800b5, - StartMirrorTimer = 0x3801a9, - StartTimer = 0x38003d, - StopElapsedTimer = 0x38009d, - StopMirrorTimer = 0x3801ab, - StopSpeakerbotSound = 0x380205, - StopTimer = 0x38003e, - StreamingMovies = 0x38003c, - SuggestInviteInform = 0x380229, - SummonCancel = 0x38014b, - SummonRaidMemberValidateFailed = 0x380023, - SummonRequest = 0x3801ba, - SupercededSpells = 0x4e003d, - SuspendComms = 0x3f0002, - SuspendToken = 0x380040, - SyncWowEntitlements = 0x3802e6, - TalentsInvoluntarilyReset = 0x3801b1, - TaxiNodeStatus = 0x380117, - TextEmote = 0x380115, - ThreatClear = 0x380176, - ThreatRemove = 0x380175, - ThreatUpdate = 0x380174, - TimerunningSeasonEnded = 0x38034b, - TimeAdjustment = 0x490001, - TimeSyncRequest = 0x490000, - TitleEarned = 0x380171, - TitleLost = 0x380172, - TotemCreated = 0x380161, - TotemDurationChanged = 0x380163, - TotemMoved = 0x380164, - TotemRemoved = 0x380162, - TradeStatus = 0x380017, - TradeUpdated = 0x380016, - TrainerBuyFailed = 0x380179, - TrainerList = 0x380178, - TraitConfigCommitFailed = 0x38006a, - TransferAborted = 0x38019c, - TransferPending = 0x380066, - TreasurePickerResponse = 0x3c0011, - TriggerCinematic = 0x38025d, - TriggerMovie = 0x380165, - TurnInPetitionResult = 0x3801e6, - TutorialFlags = 0x380251, - UiAction = 0x380202, - UiMapQuestLinesResponse = 0x4c0023, - UndeleteCharacterResponse = 0x38025e, - UndeleteCooldownStatusResponse = 0x38025f, - UnlearnedSpells = 0x4e003f, - UnloadChildMap = 0x38000e, - UpdateAadcStatusResponse = 0x3802fe, - UpdateAccountData = 0x3801a2, - UpdateAccountDataComplete = 0x3801a3, - UpdateActionButtons = 0x380078, - UpdateBnetSessionKey = 0x3802b6, - UpdateCapturePoint = 0x3e0007, - UpdateCelestialBody = 0x3802b2, - UpdateCharacterFlags = 0x380257, - UpdateChargeCategoryCooldown = 0x3801fe, - UpdateCooldown = 0x3801fd, - UpdateCraftingNpcRecipes = 0x420038, - UpdateDailyMissionCounter = 0x420021, - UpdateExpansionLevel = 0x3800de, - UpdateGameTimeState = 0x3802b9, - UpdateInstanceOwnership = 0x380144, - UpdateLastInstance = 0x380123, - UpdateObject = 0x480000, - UpdatePrimarySpec = 0x380070, - UpdateRecentPlayerGuids = 0x38008d, - UpdateTalentData = 0x38006f, - UpdateWorldState = 0x3801e0, - UserlistAdd = 0x3d000f, - UserlistRemove = 0x3d0010, - UserlistUpdate = 0x3d0011, - UseEquipmentSetResult = 0x3801e7, - VasCheckTransferOkResponse = 0x3802ad, - VasGetQueueMinutesResponse = 0x3802ab, - VasGetServiceStatusResponse = 0x3802aa, - VasPurchaseComplete = 0x380285, - VasPurchaseStateUpdate = 0x380284, - VendorInventory = 0x380051, - VignetteUpdate = 0x4b0010, - VoiceChannelInfoResponse = 0x3802b1, - VoiceChannelSttTokenResponse = 0x3802f9, - VoiceLoginResponse = 0x3802b0, - VoidItemSwapResponse = 0x4f0004, - VoidStorageContents = 0x4f0001, - VoidStorageFailed = 0x4f0000, - VoidStorageTransferChanges = 0x4f0002, - VoidTransferResult = 0x4f0003, - WaitQueueFinish = 0x380003, - WaitQueueUpdate = 0x380002, - Warden3Data = 0x38000b, - Warden3Disabled = 0x3802b4, - Warden3Enabled = 0x3802b3, - WarfrontComplete = 0x3801f6, - WargameRequestOpponentResponse = 0x3e0012, - WargameRequestSuccessfullySentToOpponent = 0x3e0011, - Weather = 0x380141, - WeeklyRewardsProgressResult = 0x3802f1, - WeeklyRewardsResult = 0x3802ef, - WeeklyRewardClaimResult = 0x3802f0, - Who = 0x3d0002, - WhoIs = 0x380140, - WillBeKickedForAddedSubscriptionTime = 0x3802b8, - WorldQuestUpdateResponse = 0x4b0017, - WorldServerInfo = 0x380045, - WowEntitlementNotification = 0x3802e7, - WowLabsAreaInfo = 0x380319, - WowLabsNotifyPlayersMatchEnd = 0x380315, - WowLabsNotifyPlayersMatchStateChanged = 0x380316, - WowLabsPartyError = 0x380322, - WowLabsSetAreaIdResult = 0x380317, - WowLabsSetPredictionCircle = 0x38031b, - WowLabsSetSelectedAreaId = 0x380318, - XpAwardedFromCurrency = 0x380330, - XpGainAborted = 0x380062, - XpGainEnabled = 0x380241, - ZoneUnderAttack = 0x3d000b, + AbortNewWorld = 0x360030, + AccountCharacterCurrencyLists = 0x360346, + AccountConversionStateUpdate = 0x36034b, + AccountCosmeticAdded = 0x3602ff, + AccountCriteriaUpdate = 0x3602e7, + AccountDataTimes = 0x3601a8, + AccountExportResponse = 0x360337, + AccountItemCollectionData = 0x360351, + AccountMountRemoved = 0x360047, + AccountMountUpdate = 0x360046, + AccountNotificationsResponse = 0x3602fe, + AccountStoreCurrencyUpdate = 0x360320, + AccountStoreFrontUpdate = 0x360321, + AccountStoreItemStateChanged = 0x360322, + AccountStoreResult = 0x360323, + AccountToyUpdate = 0x360048, + AccountTransmogSetFavoritesUpdate = 0x36004c, + AccountTransmogUpdate = 0x36004b, + AccountWarbandSceneUpdate = 0x36004e, + AchievementDeleted = 0x360185, + AchievementEarned = 0x3600e0, + ActivateEssenceFailed = 0x4a0020, + ActivateSoulbindFailed = 0x4a0022, + ActivateTaxiReply = 0x36011c, + ActiveGlyphs = 0x4d0045, + ActiveScheduledWorldStateInfo = 0x3601e3, + AddonListRequest = 0x3600df, + AddBattlenetFriendResponse = 0x3600da, + AddItemPassive = 0x360042, + AddLossOfControl = 0x36010f, + AddRunePower = 0x360156, + AdjustSplineDuration = 0x360069, + AdvancedCombatLog = 0x3602fc, + AdventureJournalDataResponse = 0x3602f7, + AeLootTargets = 0x3600b5, + AeLootTargetAck = 0x3600b6, + AiReaction = 0x360153, + AlliedRaceDetails = 0x360291, + AllAccountCriteria = 0x360005, + AllAchievementData = 0x360004, + AllGuildAchievements = 0x420000, + ApplyMountEquipmentResult = 0x3602d4, + ArchaeologySurveryCast = 0x36001d, + AreaPoiUpdateResponse = 0x4a0018, + AreaSpiritHealerTime = 0x3601dc, + AreaTriggerDenied = 0x370004, + AreaTriggerNoCorpse = 0x3601b4, + AreaTriggerPlaySpellVisual = 0x370002, + AreaTriggerUpdateDecalProperties = 0x370003, + ArenaClearOpponents = 0x3600e6, + ArenaCrowdControlSpellResult = 0x3600cf, + ArenaPrepOpponentSpecializations = 0x3600e5, + ArtifactEndgamePowersRefunded = 0x36023e, + ArtifactForgeError = 0x36023c, + ArtifactRespecPrompt = 0x36023d, + ArtifactXpGain = 0x360284, + AttackerStateUpdate = 0x3c002c, + AttackStart = 0x3c0017, + AttackStop = 0x3c0018, + AttackSwingError = 0x3c0026, + AttackSwingLandedLog = 0x3c0027, + AuctionableTokenAuctionSold = 0x36026d, + AuctionableTokenSellAtMarketPriceResponse = 0x36026c, + AuctionableTokenSellConfirmRequired = 0x36026b, + AuctionClosedNotification = 0x360190, + AuctionCommandResult = 0x36018d, + AuctionDisableNewPostings = 0x360324, + AuctionFavoriteList = 0x3602ee, + AuctionGetCommodityQuoteResult = 0x3602e6, + AuctionHelloResponse = 0x36018b, + AuctionListBiddedItemsResult = 0x3602e5, + AuctionListBucketsResult = 0x3602e1, + AuctionListItemsResult = 0x3602e2, + AuctionListOwnedItemsResult = 0x3602e4, + AuctionOutbidNotification = 0x36018f, + AuctionOwnerBidNotification = 0x360191, + AuctionReplicateResponse = 0x36018c, + AuctionWonNotification = 0x36018e, + AuraPointsDepleted = 0x4d0012, + AuraUpdate = 0x4d0011, + AuthChallenge = 0x3d0000, + AuthFailed = 0x360000, + AuthResponse = 0x360001, + AvailableHotfixes = 0x3a0001, + BackpackDefaultSizeChanged = 0x360325, + BagCleanupFinished = 0x4e0007, + BarberShopResult = 0x36015b, + BatchPresenceSubscription = 0x3602c5, + BattlefieldList = 0x3c0005, + BattlefieldPortDenied = 0x3c000b, + BattlefieldStatusActive = 0x3c0001, + BattlefieldStatusFailed = 0x3c0004, + BattlefieldStatusGroupProposalFailed = 0x3c000e, + BattlefieldStatusNeedConfirmation = 0x3c0000, + BattlefieldStatusNone = 0x3c0003, + BattlefieldStatusQueued = 0x3c0002, + BattlefieldStatusWaitForGroups = 0x3c000d, + BattlegroundInfoThrottled = 0x3c000c, + BattlegroundInit = 0x3c0029, + BattlegroundPlayerJoined = 0x3c0009, + BattlegroundPlayerLeft = 0x3c000a, + BattlegroundPlayerPositions = 0x3c0006, + BattlegroundPoints = 0x3c0028, + BattlenetChallengeAbort = 0x360226, + BattlenetChallengeStart = 0x360225, + BattlenetNotification = 0x36029d, + BattlenetResponse = 0x36029c, + BattleNetConnectionStatus = 0x36029e, + BattlePayAckFailed = 0x360221, + BattlePayBattlePetDelivered = 0x360216, + BattlePayCollectionItemDelivered = 0x360217, + BattlePayConfirmPurchase = 0x360220, + BattlePayDeliveryEnded = 0x360214, + BattlePayDeliveryStarted = 0x360213, + BattlePayDistributionAssignVasResponse = 0x360304, + BattlePayDistributionUnrevoked = 0x360211, + BattlePayDistributionUpdate = 0x360212, + BattlePayGetDistributionListResponse = 0x360210, + BattlePayGetProductListResponse = 0x36020e, + BattlePayGetPurchaseListResponse = 0x36020f, + BattlePayMountDelivered = 0x360215, + BattlePayPurchaseUpdate = 0x36021f, + BattlePayStartCheckout = 0x3602b9, + BattlePayStartDistributionAssignToTargetResponse = 0x36021d, + BattlePayStartPurchaseResponse = 0x36021c, + BattlePayValidatePurchaseResponse = 0x3602ad, + BattlePetsHealed = 0x36008b, + BattlePetCageDateError = 0x360117, + BattlePetDeleted = 0x360088, + BattlePetError = 0x3600d5, + BattlePetJournal = 0x360087, + BattlePetJournalLockAcquired = 0x360085, + BattlePetJournalLockDenied = 0x360086, + BattlePetRestored = 0x36008a, + BattlePetRevoked = 0x360089, + BattlePetTrapLevel = 0x360083, + BattlePetUpdates = 0x360082, + BindPointUpdate = 0x360011, + BlackMarketBidOnItemResult = 0x3600c5, + BlackMarketOutbid = 0x3600c6, + BlackMarketRequestItemsResult = 0x3600c4, + BlackMarketWon = 0x3600c7, + BonusRollEmpty = 0x3600e2, + BossKill = 0x3c002b, + BreakTarget = 0x3c0016, + BroadcastAchievement = 0x3b0012, + BroadcastSummonCast = 0x3602c7, + BroadcastSummonResponse = 0x3602c8, + BuyFailed = 0x360164, + BuySucceeded = 0x360163, + CacheInfo = 0x3a000f, + CacheVersion = 0x3a000e, + CalendarClearPendingAction = 0x36013c, + CalendarCommandResult = 0x36013d, + CalendarCommunityInvite = 0x36012c, + CalendarEventRemovedAlert = 0x360134, + CalendarEventUpdatedAlert = 0x360135, + CalendarInviteAdded = 0x36012d, + CalendarInviteAlert = 0x360131, + CalendarInviteNotes = 0x360136, + CalendarInviteNotesAlert = 0x360137, + CalendarInviteRemoved = 0x36012e, + CalendarInviteRemovedAlert = 0x360133, + CalendarInviteStatus = 0x36012f, + CalendarInviteStatusAlert = 0x360132, + CalendarModeratorStatus = 0x360130, + CalendarRaidLockoutAdded = 0x360138, + CalendarRaidLockoutRemoved = 0x360139, + CalendarRaidLockoutUpdated = 0x36013a, + CalendarSendCalendar = 0x36012a, + CalendarSendEvent = 0x36012b, + CalendarSendNumPending = 0x36013b, + CameraEffect = 0x3601c2, + CancelAutoRepeat = 0x36017b, + CancelCombat = 0x3c0025, + CancelOrphanSpellVisual = 0x4d0037, + CancelPingPin = 0x36003b, + CancelPreloadWorld = 0x36002e, + CancelScene = 0x3600d4, + CancelSpellVisual = 0x4d0035, + CancelSpellVisualKit = 0x4d0039, + CanDuelResult = 0x3c0021, + CanRedeemTokenForBalanceResponse = 0x3602ac, + CapturePointRemoved = 0x3c0008, + CastFailed = 0x4d0048, + CasRefreshRemoteData = 0x360115, + CautionaryChannelMessage = 0x3b0009, + CautionaryChatMessage = 0x3b0008, + ChainMissileBounce = 0x360061, + ChallengeModeComplete = 0x3600a6, + ChallengeModeNewPlayerRecord = 0x3600a7, + ChallengeModeRequestLeadersResult = 0x3600ad, + ChallengeModeReset = 0x3600a5, + ChallengeModeSetLeaverPenaltyTimer = 0x4a0030, + ChallengeModeStart = 0x3600a3, + ChallengeModeUpdateDeathCount = 0x3600a4, + ChangePlayerDifficultyResult = 0x4a000c, + ChangeRealmTicketResponse = 0x36029f, + ChannelList = 0x3b001b, + ChannelNotify = 0x3b0017, + ChannelNotifyJoined = 0x3b0019, + ChannelNotifyLeft = 0x3b001a, + ChannelNotifyNpeJoinedBatch = 0x3b0018, + CharacterCheckUpgradeResult = 0x360259, + CharacterLoginFailed = 0x3601a2, + CharacterObjectTestResponse = 0x360224, + CharacterRenameResult = 0x3601ff, + CharacterUpgradeAborted = 0x360258, + CharacterUpgradeComplete = 0x360257, + CharacterUpgradeManualUnrevokeResult = 0x36025a, + CharacterUpgradeStarted = 0x360256, + CharCustomizeFailure = 0x36017f, + CharCustomizeSuccess = 0x360180, + CharFactionChangeResult = 0x360243, + Chat = 0x3b0001, + ChatAutoResponded = 0x3b000e, + ChatCanLocalWhisperTargetResponse = 0x3b0022, + ChatDown = 0x3b0014, + ChatIgnoredAccountMuted = 0x3b0000, + ChatIsDown = 0x3b0015, + ChatNotInGuild = 0x3b0023, + ChatNotInParty = 0x3b0006, + ChatPlayerAmbiguous = 0x3b0004, + ChatPlayerNotfound = 0x3b000d, + ChatReconnect = 0x3b0016, + ChatRegionalServiceStatus = 0x3b001d, + ChatRestricted = 0x3b0007, + ChatServerMessage = 0x3b001c, + CheatIgnoreDimishingReturns = 0x4d0002, + CheckAbandonNpe = 0x4a0023, + CheckCharacterNameAvailabilityResult = 0x36001b, + CheckWargameEntry = 0x360027, + ChromieTimeSelectExpansionSuccess = 0x3602f1, + ClaimRafRewardResponse = 0x3602d8, + ClearAllSpellCharges = 0x4d0016, + ClearBossEmotes = 0x360054, + ClearCooldown = 0x360158, + ClearCooldowns = 0x4d0015, + ClearResurrect = 0x360013, + ClearSpellCharges = 0x4d0017, + ClearTarget = 0x3c0022, + ClearTreasurePickerCache = 0x4b0022, + CloseArtifactForge = 0x36023b, + ClubFinderErrorMessage = 0x3602d0, + ClubFinderGetClubPostingIdsResponse = 0x3602d3, + ClubFinderLookupClubPostingsList = 0x3602d1, + ClubFinderResponseCharacterApplicationList = 0x3602ce, + ClubFinderResponsePostRecruitmentMessage = 0x3602d2, + ClubFinderUpdateApplications = 0x3602cf, + ClubFinderWhisperApplicantResponse = 0x360310, + CoinRemoved = 0x3600b4, + CombatEventFailed = 0x3c0019, + CommentatorMapInfo = 0x3601a4, + CommentatorPlayerInfo = 0x3601a5, + CommentatorStateChanged = 0x3601a3, + CommerceTokenGetCountResponse = 0x360268, + CommerceTokenGetLogResponse = 0x360274, + CommerceTokenGetMarketPriceResponse = 0x36026a, + CommerceTokenUpdate = 0x360269, + ComplaintResult = 0x36014a, + CompleteShipmentResponse = 0x360234, + ConfirmPartyInvite = 0x3602ab, + ConnectTo = 0x3d0005, + ConsoleWrite = 0x3600d2, + ConsumableTokenBuyAtMarketPriceResponse = 0x360270, + ConsumableTokenBuyChoiceRequired = 0x36026f, + ConsumableTokenCanVeteranBuyResponse = 0x36026e, + ConsumableTokenRedeemConfirmRequired = 0x360272, + ConsumableTokenRedeemResponse = 0x360273, + ContactList = 0x360222, + ContributionLastUpdateResponse = 0x3602b2, + ControlUpdate = 0x3600e4, + ConvertItemsToCurrencyValue = 0x3602fa, + CooldownCheat = 0x3601d5, + CooldownEvent = 0x360157, + CorpseLocation = 0x3600eb, + CorpseReclaimDelay = 0x3601e6, + CorpseTransportQuery = 0x3601b0, + CovenantCallingsAvailabilityResponse = 0x4b0024, + CovenantPreviewOpenNpc = 0x360294, + CovenantRenownSendCatchupState = 0x3602fb, + CraftingHouseHelloResponse = 0x360331, + CraftingOrderCancelResult = 0x36032d, + CraftingOrderClaimResult = 0x360329, + CraftingOrderCraftResult = 0x36032b, + CraftingOrderCreateResult = 0x360327, + CraftingOrderFulfillResult = 0x36032c, + CraftingOrderListOrdersResponse = 0x360328, + CraftingOrderNpcRewardInfo = 0x360333, + CraftingOrderRejectResult = 0x36032f, + CraftingOrderReleaseResult = 0x36032a, + CraftingOrderUpdateState = 0x360332, + CraftEnchantResult = 0x360330, + CreateChar = 0x36019e, + CreateShipmentResponse = 0x360233, + CreatorVisualsOverride = 0x360336, + CriteriaDeleted = 0x360184, + CriteriaUpdate = 0x36017e, + CrossedInebriationThreshold = 0x36015f, + CurrencyTransferLog = 0x360348, + CurrencyTransferResult = 0x360347, + CustomLoadScreen = 0x360064, + DailyQuestsReset = 0x4b0000, + DamageCalcLog = 0x4d0054, + DbReply = 0x3a0000, + DeathReleaseLoc = 0x360171, + DebugMenuManagerFullUpdate = 0x3600f3, + DefenseMessage = 0x3b000c, + DeleteChar = 0x36019f, + DeleteExpiredMissionsResult = 0x400022, + DelvesAccountDataElementChanged = 0x36034d, + DestroyArenaUnit = 0x3601de, + DestructibleBuildingDamage = 0x360196, + DifferentInstanceFromParty = 0x360020, + DisenchantCredit = 0x36003f, + DismountResult = 0x360010, + DispelFailed = 0x4d001e, + DisplayGameError = 0x360035, + DisplayPlayerChoice = 0x4a0004, + DisplayPromotion = 0x3600e8, + DisplayQuestPopup = 0x4b001e, + DisplayToast = 0x3600c1, + DisplayWorldText = 0x360285, + DisplayWorldTextOnTarget = 0x4d0053, + DontAutoPushSpellsToActionBar = 0x360079, + DropNewConnection = 0x3d0004, + DuelArranged = 0x3c001b, + DuelComplete = 0x3c001f, + DuelCountdown = 0x3c001e, + DuelInBounds = 0x3c001d, + DuelOutOfBounds = 0x3c001c, + DuelRequested = 0x3c001a, + DuelWinner = 0x3c0020, + DurabilityDamageDeath = 0x3601e1, + Emote = 0x360260, + EnableBarberShop = 0x36015a, + EnchantmentLog = 0x3601b1, + EncounterEnd = 0x36021b, + EncounterStart = 0x36021a, + EndLightningStorm = 0x360147, + EnterEncryptedMode = 0x3d0001, + EnumCharactersResult = 0x360018, + EnumVasPurchaseStatesResponse = 0x36028a, + EnvironmentalDamageLog = 0x4d000e, + EquipmentSetId = 0x360150, + ExpectedSpamRecords = 0x3b0005, + ExplorationExperience = 0x3601fb, + ExportAccountProfile = 0x3600f0, + ExternalTransactionIdGenerated = 0x3602f8, + FactionBonusInfo = 0x3601c1, + FailedPlayerCondition = 0x4a0002, + FailedQuestTurnIn = 0x3602a8, + FeatureSystemStatus = 0x360058, + FeatureSystemStatus2 = 0x360345, + FeatureSystemStatusGlueScreen = 0x360059, + FeignDeathResisted = 0x3601e0, + FishEscaped = 0x36016e, + FishNotHooked = 0x36016d, + FlightSplineSync = 0x48005b, + FlushCombatLogFile = 0x4d0010, + ForcedDeathUpdate = 0x360172, + ForceAnim = 0x3601ed, + ForceAnimations = 0x3601ee, + ForceRandomTransmogToast = 0x36004a, + ForceSpawnTrackingUpdate = 0x4b0021, + FriendStatus = 0x360223, + GainMawPower = 0x360279, + GameObjectActivateAnimKit = 0x36005c, + GameObjectBase = 0x3602bf, + GameObjectCloseInteraction = 0x36030f, + GameObjectCustomAnim = 0x36005d, + GameObjectDespawn = 0x36005e, + GameObjectInteraction = 0x36030e, + GameObjectPlaySpellVisual = 0x4d003c, + GameObjectPlaySpellVisualKit = 0x4d003b, + GameObjectResetState = 0x3601bb, + GameObjectSetStateLocal = 0x36029b, + GameSpeedSet = 0x360120, + GameTimeSet = 0x3601aa, + GameTimeUpdate = 0x3601a9, + GarrisonActivateMissionBonusAbility = 0x400024, + GarrisonAddEvent = 0x400048, + GarrisonAddFollowerResult = 0x400016, + GarrisonAddMissionResult = 0x40001a, + GarrisonAddSpecGroups = 0x40004b, + GarrisonApplyTalentSocketDataChanges = 0x40004f, + GarrisonAssignFollowerToBuildingResult = 0x40002c, + GarrisonAutoTroopMinLevelUpdateResult = 0x400051, + GarrisonBuildingActivated = 0x40000b, + GarrisonBuildingRemoved = 0x400004, + GarrisonBuildingSetActiveSpecializationResult = 0x400006, + GarrisonChangeMissionStartTimeResult = 0x40001d, + GarrisonClearCollection = 0x400047, + GarrisonClearEventList = 0x40004a, + GarrisonClearSpecGroups = 0x40004c, + GarrisonCollectionRemoveEntry = 0x400046, + GarrisonCollectionUpdateEntry = 0x400045, + GarrisonCompleteBuildingConstructionResult = 0x40003d, + GarrisonCompleteMissionResult = 0x40001c, + GarrisonCreateResult = 0x40000c, + GarrisonDeleteMissionResult = 0x400023, + GarrisonDeleteResult = 0x400035, + GarrisonFollowerActivationsSet = 0x40002b, + GarrisonFollowerChangedFlags = 0x400029, + GarrisonFollowerChangedItemLevel = 0x400027, + GarrisonFollowerChangedQuality = 0x400028, + GarrisonFollowerChangedXp = 0x400026, + GarrisonFollowerFatigueCleared = 0x40002a, + GarrisonGenerateFollowersResult = 0x400033, + GarrisonGetClassSpecCategoryInfoResult = 0x400015, + GarrisonGetRecallPortalLastUsedTimeResult = 0x40001e, + GarrisonIsUpgradeableResponse = 0x40003f, + GarrisonLearnBlueprintResult = 0x400007, + GarrisonLearnSpecializationResult = 0x400005, + GarrisonListCompletedMissionsCheatResult = 0x400040, + GarrisonListFollowersCheatResult = 0x400019, + GarrisonMapDataResponse = 0x400042, + GarrisonMissionBonusRollResult = 0x400020, + GarrisonMissionRequestRewardInfoResponse = 0x400043, + GarrisonMissionStartConditionUpdate = 0x400025, + GarrisonOpenCrafter = 0x400037, + GarrisonOpenRecruitmentNpc = 0x400030, + GarrisonPlaceBuildingResult = 0x400003, + GarrisonPlotPlaced = 0x400001, + GarrisonPlotRemoved = 0x400002, + GarrisonRecruitFollowerResult = 0x400034, + GarrisonRemoteInfo = 0x40000a, + GarrisonRemoveEvent = 0x400049, + GarrisonRemoveFollowerAbilityResult = 0x40002f, + GarrisonRemoveFollowerFromBuildingResult = 0x40002d, + GarrisonRemoveFollowerResult = 0x400017, + GarrisonRenameFollowerResult = 0x40002e, + GarrisonRequestBlueprintAndSpecializationDataResult = 0x400009, + GarrisonResearchTalentResult = 0x40000e, + GarrisonResetTalentTree = 0x400013, + GarrisonResetTalentTreeSocketData = 0x400014, + GarrisonStartMissionResult = 0x40001b, + GarrisonSwapBuildingsResponse = 0x40003c, + GarrisonSwitchTalentTreeBranch = 0x40004d, + GarrisonTalentCompleted = 0x40000f, + GarrisonTalentRemoved = 0x400010, + GarrisonTalentRemoveSocketData = 0x400012, + GarrisonTalentUpdateSocketData = 0x400011, + GarrisonTalentWorldQuestUnlocksResponse = 0x40004e, + GarrisonUnlearnBlueprintResult = 0x400008, + GarrisonUpdateFollower = 0x400018, + GarrisonUpdateGarrisonMonumentSelections = 0x40003e, + GarrisonUpdateMissionCheatResult = 0x400050, + GarrisonUpgradeResult = 0x40000d, + GarrisonUseRecallPortalResult = 0x40001f, + GenerateRandomCharacterNameResult = 0x36001c, + GenerateSsoTokenResponse = 0x3602b3, + GetAccountCharacterListResult = 0x3601fd, + GetGarrisonInfoResult = 0x400000, + GetLandingPageShipmentsResponse = 0x360236, + GetRealmHiddenResult = 0x36033c, + GetRemainingGameTimeResponse = 0x360271, + GetSelectedTrophyIdResponse = 0x36025e, + GetShipmentsOfTypeResponse = 0x360235, + GetShipmentInfoResponse = 0x360231, + GetTrophyListResponse = 0x36025d, + GetVasAccountCharacterListResult = 0x360286, + GetVasTransferTargetRealmListResult = 0x360287, + GmPlayerInfo = 0x4a000d, + GmRequestPlayerInfo = 0x4a0003, + GmTicketCaseStatus = 0x360142, + GmTicketSystemStatus = 0x360141, + GodMode = 0x360199, + GossipComplete = 0x4b0017, + GossipMessage = 0x4b0018, + GossipOptionNpcInteraction = 0x4b0028, + GossipPoi = 0x36022e, + GossipQuestUpdate = 0x4b0019, + GossipRefreshOptions = 0x4b0027, + GroupActionThrottled = 0x360024, + GroupAutoKick = 0x36022b, + GroupDecline = 0x360227, + GroupDestroyed = 0x36022a, + GroupNewLeader = 0x3600ca, + GroupRequestDecline = 0x360228, + GroupUninvite = 0x360229, + GuildAchievementDeleted = 0x42000d, + GuildAchievementEarned = 0x42000c, + GuildAchievementMembers = 0x42000f, + GuildBankLogQueryResults = 0x420027, + GuildBankQueryResults = 0x420026, + GuildBankRemainingWithdrawMoney = 0x420028, + GuildBankTextQueryResult = 0x42002b, + GuildChallengeCompleted = 0x42001b, + GuildChallengeUpdate = 0x42001a, + GuildChangeNameResult = 0x420025, + GuildCommandResult = 0x420002, + GuildCriteriaDeleted = 0x42000e, + GuildCriteriaUpdate = 0x42000b, + GuildEventBankContentsChanged = 0x420040, + GuildEventBankMoneyChanged = 0x42003f, + GuildEventDisbanded = 0x420035, + GuildEventLogQueryResults = 0x42002a, + GuildEventMotd = 0x420036, + GuildEventNewLeader = 0x420034, + GuildEventPlayerJoined = 0x420032, + GuildEventPlayerLeft = 0x420033, + GuildEventPresenceChange = 0x420037, + GuildEventRanksUpdated = 0x420039, + GuildEventRankChanged = 0x42003a, + GuildEventStatusChange = 0x420038, + GuildEventTabAdded = 0x42003b, + GuildEventTabDeleted = 0x42003c, + GuildEventTabModified = 0x42003d, + GuildEventTabTextChanged = 0x42003e, + GuildFlaggedForRename = 0x420024, + GuildHardcoreMemberDeath = 0x420004, + GuildInvite = 0x420012, + GuildInviteDeclined = 0x420030, + GuildInviteExpired = 0x420031, + GuildItemLootedNotify = 0x42001c, + GuildKnownRecipes = 0x420006, + GuildMembersWithRecipe = 0x420007, + GuildMemberDailyReset = 0x42002c, + GuildMemberRecipes = 0x420005, + GuildMemberUpdateNote = 0x420011, + GuildMoved = 0x420022, + GuildMoveStarting = 0x420021, + GuildNameChanged = 0x420023, + GuildNews = 0x420009, + GuildNewsDeleted = 0x42000a, + GuildPartyState = 0x420013, + GuildPermissionsQueryResults = 0x420029, + GuildRanks = 0x420010, + GuildRenameNameCheck = 0x420044, + GuildRenameRefundResult = 0x420046, + GuildRenameRequestedResult = 0x420045, + GuildRenameStatusUpdate = 0x420043, + GuildReputationReactionChanged = 0x420014, + GuildReset = 0x420020, + GuildRewardList = 0x420008, + GuildRoster = 0x420003, + GuildSendRankChange = 0x420001, + HardcoreDeathAlert = 0x360344, + HealthUpdate = 0x36016f, + HighestThreatUpdate = 0x360177, + HotfixConnect = 0x3a0003, + HotfixMessage = 0x3a0002, + InitializeFactions = 0x3601c0, + InitialSetup = 0x360014, + InitWorldStates = 0x3601e2, + InspectResult = 0x3600ce, + InstanceAbandonVoteCompleted = 0x360093, + InstanceAbandonVotePlayerLeft = 0x360094, + InstanceAbandonVoteResponse = 0x360092, + InstanceAbandonVoteStarted = 0x360091, + InstanceEncounterChangePriority = 0x360249, + InstanceEncounterDisengageUnit = 0x360248, + InstanceEncounterEnd = 0x360251, + InstanceEncounterEngageUnit = 0x360247, + InstanceEncounterGainCombatResurrectionCharge = 0x360253, + InstanceEncounterInCombatResurrection = 0x360252, + InstanceEncounterObjectiveComplete = 0x36024c, + InstanceEncounterObjectiveStart = 0x36024b, + InstanceEncounterObjectiveUpdate = 0x360250, + InstanceEncounterPhaseShiftChanged = 0x360254, + InstanceEncounterStart = 0x36024d, + InstanceEncounterTimerStart = 0x36024a, + InstanceEncounterUpdateAllowReleaseInProgress = 0x36024f, + InstanceEncounterUpdateSuppressRelease = 0x36024e, + InstanceGroupSizeChanged = 0x360197, + InstanceInfo = 0x3600d1, + InstanceReset = 0x360125, + InstanceResetFailed = 0x360126, + InstanceSaveCreated = 0x360219, + InterruptPowerRegen = 0x4d004a, + InvalidatePageText = 0x3a000a, + InvalidatePlayer = 0x4a0007, + InvalidPromotionCode = 0x3601ef, + InventoryChangeFailure = 0x4e0005, + InventoryFixupComplete = 0x3602aa, + InventoryFullOverflow = 0x3602bb, + IslandAzeriteGain = 0x3601f8, + IslandComplete = 0x3601f9, + IsQuestCompleteResponse = 0x4b0004, + ItemChanged = 0x360188, + ItemCooldown = 0x36025f, + ItemEnchantTimeUpdate = 0x3601f1, + ItemExpirePurchaseRefund = 0x360034, + ItemInteractionComplete = 0x3602f0, + ItemPurchaseRefundResult = 0x360032, + ItemPushResult = 0x3600c0, + ItemTimeUpdate = 0x3601f0, + KickReason = 0x360128, + LatencyReportPing = 0x360300, + LearnedSpells = 0x4d003e, + LearnPvpTalentFailed = 0x36006d, + LearnTalentFailed = 0x36006c, + LegacyLootRules = 0x3602c0, + LevelLinkingResult = 0x3602d6, + LevelUpInfo = 0x360186, + LfgBootPlayer = 0x440019, + LfgDisabled = 0x440017, + LfgExpandSearchPrompt = 0x44001f, + LfgInstanceShutdownCountdown = 0x440009, + LfgJoinLobbyMatchmakerQueue = 0x440020, + LfgJoinResult = 0x440000, + LfgListApplicantListUpdate = 0x44000f, + LfgListApplicationStatusUpdate = 0x44000c, + LfgListApplyToGroupResult = 0x44000d, + LfgListJoinResult = 0x440001, + LfgListSearchResults = 0x440002, + LfgListSearchResultsUpdate = 0x440010, + LfgListSearchStatus = 0x440003, + LfgListUpdateBlacklist = 0x44000e, + LfgListUpdateExpiration = 0x44000b, + LfgListUpdateStatus = 0x44000a, + LfgOfferContinue = 0x440018, + LfgPartyInfo = 0x44001a, + LfgPlayerInfo = 0x44001b, + LfgPlayerReward = 0x44001c, + LfgProposalUpdate = 0x440011, + LfgQueueStatus = 0x440004, + LfgReadyCheckResult = 0x44001e, + LfgReadyCheckUpdate = 0x440006, + LfgRoleCheckUpdate = 0x440005, + LfgSlotInvalid = 0x440014, + LfgTeleportDenied = 0x440016, + LfgUpdateStatus = 0x440008, + LiveRegionAccountRestoreResult = 0x36020b, + LiveRegionCharacterCopyResult = 0x36020a, + LiveRegionGetAccountCharacterListResult = 0x3601fe, + LiveRegionKeyBindingsCopyResult = 0x36020c, + LoadCufProfiles = 0x360055, + LoadEquipmentSet = 0x3601ac, + LobbyMatchmakerLobbyAcquiredServer = 0x360311, + LobbyMatchmakerPartyInfo = 0x360312, + LobbyMatchmakerPartyInviteRejected = 0x360313, + LobbyMatchmakerQueueProposed = 0x360315, + LobbyMatchmakerQueueResult = 0x360316, + LobbyMatchmakerReceiveInvite = 0x360314, + LoginSetTimeSpeed = 0x3601ab, + LoginVerifyWorld = 0x36002f, + LogoutCancelAck = 0x360124, + LogoutComplete = 0x360123, + LogoutResponse = 0x360122, + LogXpGain = 0x360182, + LootAllPassed = 0x3600be, + LootList = 0x3601dd, + LootMoneyNotify = 0x3600b9, + LootRelease = 0x3600b8, + LootReleaseAll = 0x3600b7, + LootRemoved = 0x3600b3, + LootResponse = 0x3600b2, + LootRoll = 0x3600bb, + LootRollsComplete = 0x3600bd, + LootRollWon = 0x3600bf, + LossOfControlAuraUpdate = 0x36010e, + MailCommandResult = 0x3600d8, + MailListResult = 0x3601f2, + MailQueryNextTimeResult = 0x3601f3, + MapObjectivesInit = 0x3c002a, + MapObjEvents = 0x36005f, + MasterLootCandidateList = 0x3600bc, + MeetingStoneFailed = 0x360317, + MessageBox = 0x36000a, + MinimapPing = 0x36016c, + MirrorImageComponentedData = 0x4d0004, + MirrorImageCreatureData = 0x4d0003, + MirrorVars = 0x360355, + MissileCancel = 0x360060, + ModifyCooldown = 0x360200, + Motd = 0x3b0003, + MountResult = 0x36000f, + MovementEnforcementAlert = 0x3602c6, + MoveAddImpulse = 0x480062, + MoveApplyInertia = 0x48005e, + MoveApplyMovementForce = 0x480045, + MoveDisableCollision = 0x480041, + MoveDisableDoubleJump = 0x48002b, + MoveDisableFullSpeedTurning = 0x480075, + MoveDisableGravity = 0x48003d, + MoveDisableInertia = 0x48003f, + MoveDisableTransitionBetweenSwimAndFly = 0x48003c, + MoveEnableCollision = 0x480042, + MoveEnableDoubleJump = 0x48002a, + MoveEnableFullSpeedTurning = 0x480074, + MoveEnableGravity = 0x48003e, + MoveEnableInertia = 0x480040, + MoveEnableTransitionBetweenSwimAndFly = 0x48003b, + MoveKnockBack = 0x480031, + MoveRemoveInertia = 0x48005f, + MoveRemoveMovementForce = 0x480046, + MoveRoot = 0x480027, + MoveSetActiveMover = 0x480003, + MoveSetAdvFlyingAddImpulseMaxSpeed = 0x48006b, + MoveSetAdvFlyingAirFriction = 0x480066, + MoveSetAdvFlyingBankingRate = 0x48006c, + MoveSetAdvFlyingDoubleJumpVelMod = 0x480069, + MoveSetAdvFlyingGlideStartMinHeight = 0x48006a, + MoveSetAdvFlyingLaunchSpeedCoefficient = 0x480072, + MoveSetAdvFlyingLiftCoefficient = 0x480068, + MoveSetAdvFlyingMaxVel = 0x480067, + MoveSetAdvFlyingOverMaxDeceleration = 0x480071, + MoveSetAdvFlyingPitchingRateDown = 0x48006d, + MoveSetAdvFlyingPitchingRateUp = 0x48006e, + MoveSetAdvFlyingSurfaceFriction = 0x480070, + MoveSetAdvFlyingTurnVelocityThreshold = 0x48006f, + MoveSetCantSwim = 0x480035, + MoveSetCanAdvFly = 0x480064, + MoveSetCanDrive = 0x480076, + MoveSetCanFly = 0x480033, + MoveSetCanTurnWhileFalling = 0x480037, + MoveSetCollisionHeight = 0x480043, + MoveSetCompoundState = 0x480047, + MoveSetFeatherFall = 0x48002d, + MoveSetFlightBackSpeed = 0x480023, + MoveSetFlightSpeed = 0x480022, + MoveSetHovering = 0x48002f, + MoveSetIgnoreMovementForces = 0x480039, + MoveSetLandWalk = 0x48002c, + MoveSetModMovementForceMagnitude = 0x480014, + MoveSetNormalFall = 0x48002e, + MoveSetPitchRate = 0x480026, + MoveSetRunBackSpeed = 0x48001f, + MoveSetRunSpeed = 0x48001e, + MoveSetSwimBackSpeed = 0x480021, + MoveSetSwimSpeed = 0x480020, + MoveSetTurnRate = 0x480025, + MoveSetVehicleRecId = 0x480044, + MoveSetWalkSpeed = 0x480024, + MoveSetWaterWalk = 0x480029, + MoveSkipTime = 0x480048, + MoveSplineDisableCollision = 0x48004d, + MoveSplineDisableGravity = 0x48004b, + MoveSplineEnableCollision = 0x48004e, + MoveSplineEnableGravity = 0x48004c, + MoveSplineRoot = 0x480049, + MoveSplineSetFeatherFall = 0x48004f, + MoveSplineSetFlightBackSpeed = 0x48001a, + MoveSplineSetFlightSpeed = 0x480019, + MoveSplineSetFlying = 0x480059, + MoveSplineSetHover = 0x480051, + MoveSplineSetLandWalk = 0x480054, + MoveSplineSetNormalFall = 0x480050, + MoveSplineSetPitchRate = 0x48001d, + MoveSplineSetRunBackSpeed = 0x480016, + MoveSplineSetRunMode = 0x480057, + MoveSplineSetRunSpeed = 0x480015, + MoveSplineSetSwimBackSpeed = 0x480018, + MoveSplineSetSwimSpeed = 0x480017, + MoveSplineSetTurnRate = 0x48001c, + MoveSplineSetWalkMode = 0x480058, + MoveSplineSetWalkSpeed = 0x48001b, + MoveSplineSetWaterWalk = 0x480053, + MoveSplineStartSwim = 0x480055, + MoveSplineStopSwim = 0x480056, + MoveSplineUnroot = 0x48004a, + MoveSplineUnsetFlying = 0x48005a, + MoveSplineUnsetHover = 0x480052, + MoveTeleport = 0x480032, + MoveUnroot = 0x480028, + MoveUnsetCantSwim = 0x480036, + MoveUnsetCanAdvFly = 0x480065, + MoveUnsetCanDrive = 0x480077, + MoveUnsetCanFly = 0x480034, + MoveUnsetCanTurnWhileFalling = 0x480038, + MoveUnsetHovering = 0x480030, + MoveUnsetIgnoreMovementForces = 0x48003a, + MoveUpdate = 0x48000e, + MoveUpdateAddImpulse = 0x480063, + MoveUpdateApplyInertia = 0x480060, + MoveUpdateApplyMovementForce = 0x480012, + MoveUpdateCollisionHeight = 0x48000d, + MoveUpdateFlightBackSpeed = 0x48000a, + MoveUpdateFlightSpeed = 0x480009, + MoveUpdateKnockBack = 0x480010, + MoveUpdateModMovementForceMagnitude = 0x480011, + MoveUpdatePitchRate = 0x48000c, + MoveUpdateRemoveInertia = 0x480061, + MoveUpdateRemoveMovementForce = 0x480013, + MoveUpdateRunBackSpeed = 0x480005, + MoveUpdateRunSpeed = 0x480004, + MoveUpdateSwimBackSpeed = 0x480008, + MoveUpdateSwimSpeed = 0x480007, + MoveUpdateTeleport = 0x48000f, + MoveUpdateTurnRate = 0x48000b, + MoveUpdateWalkSpeed = 0x480006, + MultiFloorLeaveFloor = 0x360276, + MultiFloorNewFloor = 0x360275, + MythicPlusAllMapStats = 0x3600a8, + MythicPlusCurrentAffixes = 0x3600aa, + MythicPlusNewWeekRecord = 0x3600af, + MythicPlusSeasonData = 0x3600a9, + NeutralPlayerFactionSelectResult = 0x360074, + NewDataBuild = 0x36033b, + NewTaxiPath = 0x36011d, + NewWorld = 0x36002b, + NotifyDestLocSpellCast = 0x4d0034, + NotifyMissileTrajectoryCollision = 0x360149, + NotifyMoney = 0x360031, + NotifyReceivedMail = 0x3600d9, + NpcInteractionOpenResult = 0x36030d, + OfferPetitionError = 0x360154, + OnCancelExpectedRideVehicleAura = 0x360183, + OnMonsterMove = 0x480002, + OpenArtifactForge = 0x36023a, + OpenContainer = 0x4e0006, + OpenLfgDungeonFinder = 0x440015, + OpenShipmentNpcResult = 0x360232, + OverrideLight = 0x360159, + PageText = 0x3601b7, + PartyCommandResult = 0x36022c, + PartyEligibilityForDelveTiersResponse = 0x360350, + PartyInvite = 0x360056, + PartyKillLog = 0x3601f6, + PartyMemberFullState = 0x3601f5, + PartyMemberPartialState = 0x3601f4, + PartyNotifyLfgLeaderChange = 0x3602f6, + PartyUpdate = 0x36008c, + PastTimeEvents = 0x36005b, + PauseMirrorTimer = 0x3601ae, + PendingRaidLock = 0x360195, + PerksProgramActivityComplete = 0x36030a, + PerksProgramActivityUpdate = 0x360306, + PerksProgramDisabled = 0x36030b, + PerksProgramResult = 0x360307, + PerksProgramVendorUpdate = 0x360305, + PetitionAlreadySigned = 0x360037, + PetitionRenameGuildResponse = 0x420042, + PetitionShowList = 0x36015c, + PetitionShowSignatures = 0x36015d, + PetitionSignResults = 0x3601e8, + PetActionFeedback = 0x3601e5, + PetActionSound = 0x36013f, + PetBattleChatRestricted = 0x36009e, + PetBattleDebugQueueDumpResponse = 0x360113, + PetBattleFinalizeLocation = 0x360097, + PetBattleFinalRound = 0x36009c, + PetBattleFinished = 0x36009d, + PetBattleFirstRound = 0x360099, + PetBattleInitialUpdate = 0x360098, + PetBattleMaxGameLengthWarning = 0x36009f, + PetBattlePvpChallenge = 0x360096, + PetBattleQueueProposeMatch = 0x3600d6, + PetBattleQueueStatus = 0x3600d7, + PetBattleReplacementsMade = 0x36009b, + PetBattleRequestFailed = 0x360095, + PetBattleRoundResult = 0x36009a, + PetBattleSlotUpdates = 0x360084, + PetCastFailed = 0x4d0049, + PetClearSpells = 0x4d0013, + PetDismissSound = 0x360140, + PetGodMode = 0x36011a, + PetGuids = 0x3601a1, + PetLearnedSpells = 0x4d0040, + PetMode = 0x36001f, + PetNameInvalid = 0x360161, + PetNewlyTamed = 0x36001e, + PetSpellsMessage = 0x4d0014, + PetStableResult = 0x36002a, + PetTameFailure = 0x360151, + PetUnlearnedSpells = 0x4d0041, + PhaseShiftChange = 0x36000c, + PlayedTime = 0x360173, + PlayerAckowledgeArrowCallout = 0x4a002d, + PlayerAzeriteItemEquippedStatusChanged = 0x4a001f, + PlayerAzeriteItemGains = 0x4a001e, + PlayerBonusRollFailed = 0x4a0021, + PlayerBound = 0x4a0000, + PlayerChoiceClear = 0x4a0006, + PlayerChoiceDisplayError = 0x4a0005, + PlayerConditionResult = 0x4a0012, + PlayerEndOfMatchDetails = 0x4a002f, + PlayerHideArrowCallout = 0x4a002c, + PlayerIsAdventureMapPoiValid = 0x4a0011, + PlayerOpenSubscriptionInterstitial = 0x4a0016, + PlayerSaveGuildEmblem = 0x420041, + PlayerSavePersonalEmblem = 0x4a002e, + PlayerShowArrowCallout = 0x4a002b, + PlayerShowGenericWidgetDisplay = 0x4a0029, + PlayerShowPartyPoseUi = 0x4a002a, + PlayerShowUiEventToast = 0x4a0024, + PlayerSkinned = 0x4a000e, + PlayerTutorialHighlightSpell = 0x4a0015, + PlayerTutorialUnhighlightSpell = 0x4a0014, + PlayMusic = 0x360205, + PlayObjectSound = 0x360207, + PlayOneShotAnimKit = 0x3601cd, + PlayOrphanSpellVisual = 0x4d0038, + PlayScene = 0x3600d3, + PlaySound = 0x360204, + PlaySpeakerbotSound = 0x360208, + PlaySpellVisual = 0x4d0036, + PlaySpellVisualKit = 0x4d003a, + PlayTimeWarning = 0x36019b, + Pong = 0x3d0006, + PowerUpdate = 0x360170, + PreloadChildMap = 0x36000d, + PreloadWorld = 0x36002c, + PrepopulateNameCache = 0x3602c9, + PreRessurect = 0x360203, + PrintNotification = 0x360063, + ProcResist = 0x3601f7, + ProfessionGossip = 0x360296, + PushSpellToActionBar = 0x4d0042, + PvpCredit = 0x3c0024, + PvpMatchComplete = 0x3c002f, + PvpMatchInitialize = 0x3c0030, + PvpMatchSetState = 0x3c002e, + PvpMatchStart = 0x3c002d, + PvpMatchStatistics = 0x3c0010, + PvpOptionsEnabled = 0x3c0013, + PvpTierRecord = 0x360301, + QueryBattlePetNameResponse = 0x3a000c, + QueryCreatureResponse = 0x3a0006, + QueryGameObjectResponse = 0x3a0007, + QueryGarrisonPetNameResponse = 0x400041, + QueryGuildFollowInfoResponse = 0x42002f, + QueryGuildInfoResponse = 0x42002d, + QueryItemTextResponse = 0x3a0010, + QueryNpcTextResponse = 0x3a0008, + QueryPageTextResponse = 0x3a0009, + QueryPetitionResponse = 0x3a000d, + QueryPetNameResponse = 0x3a000b, + QueryPlayerNamesResponse = 0x4a0026, + QueryPlayerNameByCommunityIdResponse = 0x4a000a, + QueryQuestInfoResponse = 0x4b0016, + QueryRealmGuildMasterInfoResponse = 0x42002e, + QueryTimeResponse = 0x360181, + QuestCompletionNpcResponse = 0x4b0001, + QuestConfirmAccept = 0x4b000f, + QuestForceRemoved = 0x4b001c, + QuestGiverInvalidQuest = 0x4b0005, + QuestGiverOfferRewardMessage = 0x4b0014, + QuestGiverQuestComplete = 0x4b0003, + QuestGiverQuestDetails = 0x4b0012, + QuestGiverQuestFailed = 0x4b0006, + QuestGiverQuestListMessage = 0x4b001a, + QuestGiverRequestItems = 0x4b0013, + QuestGiverStatus = 0x4b001b, + QuestGiverStatusMultiple = 0x4b0011, + QuestItemUsabilityResponse = 0x4b0002, + QuestLogFull = 0x4b0007, + QuestNonLogUpdateComplete = 0x4b0008, + QuestPoiQueryResponse = 0x4b001d, + QuestPoiUpdateResponse = 0x4b001f, + QuestPushResult = 0x4b0010, + QuestSessionInfoResponse = 0x3602ec, + QuestSessionReadyCheck = 0x3602da, + QuestSessionReadyCheckResponse = 0x3602db, + QuestSessionResult = 0x3602d9, + QuestUpdateAddCredit = 0x4b000c, + QuestUpdateAddCreditSimple = 0x4b000d, + QuestUpdateAddPvpCredit = 0x4b000e, + QuestUpdateComplete = 0x4b0009, + QuestUpdateFailed = 0x4b000a, + QuestUpdateFailedTimer = 0x4b000b, + QueueSummaryUpdate = 0x3602a9, + RafAccountInfo = 0x3602d7, + RafActivityStateChanged = 0x3602e8, + RafDebugFriendMonths = 0x360338, + RaidDifficultySet = 0x360244, + RaidGroupOnly = 0x360246, + RaidInstanceMessage = 0x3b000a, + RaidMarkersChanged = 0x360038, + RandomRoll = 0x3600cd, + RatedPvpInfo = 0x3c000f, + ReadyCheckCompleted = 0x360090, + ReadyCheckResponse = 0x36008f, + ReadyCheckStarted = 0x36008e, + ReadItemResultFailed = 0x360240, + ReadItemResultOk = 0x360237, + RealmQueryResponse = 0x3a0005, + ReattachResurrect = 0x3601e7, + ReceivePingUnit = 0x360039, + ReceivePingWorldPoint = 0x36003a, + RecraftItemResult = 0x36032e, + RecruitAFriendFailure = 0x36015e, + RefreshComponent = 0x3600ed, + RegionwideCharacterMailData = 0x36001a, + RegionwideCharacterRestrictionsData = 0x360019, + RemoveItemPassive = 0x360043, + RemoveSpellFromActionBar = 0x4d0043, + ReplaceTrophyResponse = 0x36025c, + ReportPvpPlayerAfkResult = 0x4a0009, + RequestCemeteryListResponse = 0x360025, + RequestPvpRewardsResponse = 0x3c0014, + RequestScheduledPvpInfoResponse = 0x3c0015, + ResetCompressionContext = 0x3d0007, + ResetFailedNotify = 0x360155, + ResetLastLoadedConfigCvars = 0x360335, + ResetQuestPoi = 0x4b0020, + ResetRangedCombatTimer = 0x3c0023, + ResetWeeklyCurrency = 0x360009, + RespecWipeConfirm = 0x3600b0, + RespondInspectAchievements = 0x360006, + ResponsePerkPendingRewards = 0x360308, + ResponsePerkRecentPurchases = 0x360309, + RestartGlobalCooldown = 0x4d0052, + RestrictedAccountWarning = 0x360052, + ResumeCast = 0x4d002c, + ResumeCastBar = 0x4d002f, + ResumeComms = 0x3d0003, + ResumeToken = 0x360041, + ResurrectRequest = 0x360012, + ResyncRunes = 0x4d0050, + ReturningPlayerPrompt = 0x36023f, + ReturnApplicantList = 0x3602cd, + ReturnRecruitingClubs = 0x3602cc, + RoleChangedInform = 0x360021, + RoleChosen = 0x44001d, + RolePollInform = 0x360022, + RuneforgeLegendaryCraftingOpenNpc = 0x360295, + RuneRegenDebug = 0x36004f, + ScenarioCompleted = 0x360283, + ScenarioPois = 0x3600d0, + ScenarioProgressUpdate = 0x3600c9, + ScenarioShowCriteria = 0x360299, + ScenarioState = 0x3600c8, + ScenarioUiUpdate = 0x360298, + ScenarioVacate = 0x360241, + SceneObjectEvent = 0x36007a, + SceneObjectPetBattleFinalRound = 0x36007f, + SceneObjectPetBattleFinished = 0x360080, + SceneObjectPetBattleFirstRound = 0x36007c, + SceneObjectPetBattleInitialUpdate = 0x36007b, + SceneObjectPetBattleReplacementsMade = 0x36007e, + SceneObjectPetBattleRoundResult = 0x36007d, + ScheduledAreaPoiUpdateResponse = 0x4a0019, + ScriptCast = 0x4d0047, + SeasonInfo = 0x36005a, + SellResponse = 0x360162, + SendItemPassives = 0x360044, + SendKnownSpells = 0x4d0019, + SendRaidTargetUpdateAll = 0x3600cb, + SendRaidTargetUpdateSingle = 0x3600cc, + SendSpellCharges = 0x4d001b, + SendSpellHistory = 0x4d001a, + SendUnlearnSpells = 0x4d001c, + ServerFirstAchievements = 0x3600ea, + ServerTime = 0x360121, + ServerTimeOffset = 0x3601b2, + SetupCombatLogFileFlush = 0x4d000f, + SetupCurrency = 0x360007, + SetAiAnimKit = 0x3601cc, + SetAnimTier = 0x3601d0, + SetChrUpgradeTier = 0x360077, + SetCurrency = 0x360008, + SetDfFastLaunchResult = 0x440012, + SetDungeonDifficulty = 0x360143, + SetFactionAtWar = 0x36019d, + SetFactionNotVisible = 0x3601c7, + SetFactionStanding = 0x3601c8, + SetFactionVisible = 0x3601c6, + SetFlatSpellModifier = 0x4d0027, + SetInstanceLeaver = 0x360356, + SetItemPurchaseData = 0x360033, + SetLootMethodFailed = 0x360267, + SetMaxWeeklyQuantity = 0x360036, + SetMeleeAnimKit = 0x3601cf, + SetMovementAnimKit = 0x3601ce, + SetPctSpellModifier = 0x4d0028, + SetPetSpecialization = 0x3600c2, + SetPlayerDeclinedNamesResult = 0x4a000b, + SetPlayHoverAnim = 0x360053, + SetProficiency = 0x3601d1, + SetQuestReplayCooldownOverride = 0x3602e0, + SetShipmentReadyResponse = 0x40003a, + SetSpellCharges = 0x4d0018, + SetTimeZoneInformation = 0x360116, + SetVehicleRecId = 0x360194, + ShadowlandsCapacitanceUpdate = 0x36030c, + ShipmentFactionUpdateResult = 0x40003b, + ShowDelvesCompanionConfigurationUi = 0x36034e, + ShowDelvesDisplayUi = 0x36034c, + ShowNeutralPlayerFactionSelectUi = 0x360073, + ShowQuestCompletionText = 0x4b0015, + ShowTaxiNodes = 0x36016b, + ShowTradeSkillResponse = 0x36020d, + SocialContractRequestResponse = 0x360318, + SocketGemsFailure = 0x3601c4, + SocketGemsSuccess = 0x3601c3, + SpecialMountAnim = 0x36013e, + SpectateEnd = 0x36033a, + SpectatePlayer = 0x360339, + SpecInvoluntarilyChanged = 0x3601b6, + SpellAbsorbLog = 0x4d000c, + SpellCategoryCooldown = 0x4d0006, + SpellChannelStart = 0x4d0022, + SpellChannelUpdate = 0x4d0023, + SpellCooldown = 0x4d0005, + SpellDamageShield = 0x4d001f, + SpellDelayed = 0x4d0030, + SpellDispellLog = 0x4d0007, + SpellEmpowerSetStage = 0x4d0026, + SpellEmpowerStart = 0x4d0024, + SpellEmpowerUpdate = 0x4d0025, + SpellEnergizeLog = 0x4d0009, + SpellExecuteLog = 0x4d0031, + SpellFailedOther = 0x4d0046, + SpellFailure = 0x4d0044, + SpellFailureMessage = 0x4d004b, + SpellGo = 0x4d002a, + SpellHealAbsorbLog = 0x4d000b, + SpellHealLog = 0x4d000a, + SpellInstakillLog = 0x4d0021, + SpellInterruptLog = 0x4d000d, + SpellMissLog = 0x4d0032, + SpellNonMeleeDamageLog = 0x4d0020, + SpellOrDamageImmune = 0x4d001d, + SpellPeriodicAuraLog = 0x4d0008, + SpellPrepare = 0x4d0029, + SpellStart = 0x4d002b, + SpellVisualLoadScreen = 0x360065, + SplashScreenShowLatest = 0x3602f2, + StandStateUpdate = 0x3601ba, + StarterBuildActivateFailed = 0x36006b, + StartElapsedTimer = 0x3600a0, + StartElapsedTimers = 0x3600a2, + StartLightningStorm = 0x360146, + StartLootRoll = 0x3600ba, + StartMirrorTimer = 0x3601ad, + StartTimer = 0x36003d, + StopElapsedTimer = 0x3600a1, + StopMirrorTimer = 0x3601af, + StopSpeakerbotSound = 0x360209, + StopTimer = 0x36003e, + StreamingMovies = 0x36003c, + SuggestInviteInform = 0x36022d, + SummonCancel = 0x36014f, + SummonRaidMemberValidateFailed = 0x360023, + SummonRequest = 0x3601be, + SupercededSpells = 0x4d003d, + SuspendComms = 0x3d0002, + SuspendToken = 0x360040, + SyncWowEntitlements = 0x3602ea, + TalentsInvoluntarilyReset = 0x3601b5, + TaxiNodeStatus = 0x36011b, + TextEmote = 0x360119, + ThreatClear = 0x36017a, + ThreatRemove = 0x360179, + ThreatUpdate = 0x360178, + TimerunningSeasonEnded = 0x36034f, + TimeAdjustment = 0x480001, + TimeSyncRequest = 0x480000, + TitleEarned = 0x360175, + TitleLost = 0x360176, + TotemCreated = 0x360165, + TotemDurationChanged = 0x360167, + TotemMoved = 0x360168, + TotemRemoved = 0x360166, + TradeStatus = 0x360017, + TradeUpdated = 0x360016, + TrainerBuyFailed = 0x36017d, + TrainerList = 0x36017c, + TraitConfigCommitFailed = 0x36006a, + TransferAborted = 0x3601a0, + TransferPending = 0x360066, + TreasurePickerResponse = 0x3a0011, + TriggerCinematic = 0x360261, + TriggerMovie = 0x360169, + TurnInPetitionResult = 0x3601ea, + TutorialFlags = 0x360255, + UiAction = 0x360206, + UiMapQuestLinesResponse = 0x4b0023, + UndeleteCharacterResponse = 0x360262, + UndeleteCooldownStatusResponse = 0x360263, + UnlearnedSpells = 0x4d003f, + UnloadChildMap = 0x36000e, + UnsetInstanceLeaver = 0x360357, + UpdateAadcStatusResponse = 0x360302, + UpdateAccountData = 0x3601a6, + UpdateAccountDataComplete = 0x3601a7, + UpdateActionButtons = 0x360078, + UpdateBnetSessionKey = 0x3602ba, + UpdateCapturePoint = 0x3c0007, + UpdateCelestialBody = 0x3602b6, + UpdateCharacterFlags = 0x36025b, + UpdateChargeCategoryCooldown = 0x360202, + UpdateCooldown = 0x360201, + UpdateCraftingNpcRecipes = 0x400038, + UpdateDailyMissionCounter = 0x400021, + UpdateExpansionLevel = 0x3600e3, + UpdateGameTimeState = 0x3602bd, + UpdateInstanceOwnership = 0x360148, + UpdateLastInstance = 0x360127, + UpdateObject = 0x460000, + UpdatePrimarySpec = 0x360070, + UpdateRecentPlayerGuids = 0x36008d, + UpdateTalentData = 0x36006f, + UpdateWorldState = 0x3601e4, + UserlistAdd = 0x3b000f, + UserlistRemove = 0x3b0010, + UserlistUpdate = 0x3b0011, + UseEquipmentSetResult = 0x3601eb, + VasCheckTransferOkResponse = 0x3602b1, + VasGetQueueMinutesResponse = 0x3602af, + VasGetServiceStatusResponse = 0x3602ae, + VasPurchaseComplete = 0x360289, + VasPurchaseStateUpdate = 0x360288, + VendorInventory = 0x360051, + VignetteUpdate = 0x4a0010, + VoiceChannelInfoResponse = 0x3602b5, + VoiceChannelSttTokenResponse = 0x3602fd, + VoiceLoginResponse = 0x3602b4, + VoidItemSwapResponse = 0x4e0004, + VoidStorageContents = 0x4e0001, + VoidStorageFailed = 0x4e0000, + VoidStorageTransferChanges = 0x4e0002, + VoidTransferResult = 0x4e0003, + WaitQueueFinish = 0x360003, + WaitQueueUpdate = 0x360002, + Warden3Data = 0x36000b, + Warden3Disabled = 0x3602b8, + Warden3Enabled = 0x3602b7, + WarfrontComplete = 0x3601fa, + WargameRequestOpponentResponse = 0x3c0012, + WargameRequestSuccessfullySentToOpponent = 0x3c0011, + Weather = 0x360145, + WeeklyRewardsProgressResult = 0x3602f5, + WeeklyRewardsResult = 0x3602f3, + WeeklyRewardClaimResult = 0x3602f4, + Who = 0x3b0002, + WhoIs = 0x360144, + WillBeKickedForAddedSubscriptionTime = 0x3602bc, + WorldQuestUpdateResponse = 0x4a0017, + WorldServerInfo = 0x360045, + WowEntitlementNotification = 0x3602eb, + WowLabsAreaInfo = 0x36031d, + WowLabsNotifyPlayersMatchEnd = 0x360319, + WowLabsNotifyPlayersMatchStateChanged = 0x36031a, + WowLabsPartyError = 0x360326, + WowLabsSetAreaIdResult = 0x36031b, + WowLabsSetPredictionCircle = 0x36031f, + WowLabsSetSelectedAreaId = 0x36031c, + XpAwardedFromCurrency = 0x360334, + XpGainAborted = 0x360062, + XpGainEnabled = 0x360245, + ZoneUnderAttack = 0x3b000b, // Opcodes That Are Not Generated Automatically AccountHeirloomUpdate = AccountToyUpdate + 1, // No Client Handler diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 77e0657d5..564b34e03 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -532,7 +532,10 @@ namespace Framework.Constants AccountSecured = 0x1000, // Script_IsAccountSecured OverrideTransportServerTime = 0x8000, MentorRestricted = 0x20000, - WeeklyRewardAvailable = 0x40000 + HasAccountBankLock = 0x40000, + CharacterBankDisabled = 0x80000, + CharacterBankConversionFailed = 0x100000, + AccountBankDisabled = 0x200000, } public enum PlayerFieldByte2Flags @@ -592,14 +595,14 @@ namespace Framework.Constants // first slot for item stored (in any way in player items data) Start = 0, // last+1 slot for item stored (in any way in player items data) - End = 232, + End = 105, Count = (End - Start) } - enum AccountBankBagSlots + public enum AccountBankBagSlots { - Start = 227, - End = 232 + Start = 100, + End = 105 } public enum PlayerTitle : ulong diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 031fa44ff..5644c3fe4 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -118,15 +118,6 @@ namespace Framework.Constants public const int ArenaTimeLimitPointsLoss = -16; public const int MaxArenaSlot = 3; - /// - /// Void Storage Const - /// - public const uint VoidStorageUnlockCost = 100 * MoneyConstants.Gold; - public const uint VoidStorageStoreItemCost = 10 * MoneyConstants.Gold; - public const uint VoidStorageMaxDeposit = 9; - public const uint VoidStorageMaxWithdraw = 9; - public const byte VoidStorageMaxSlot = 160; - /// /// Calendar Const /// @@ -1380,20 +1371,6 @@ namespace Framework.Constants CastleNathria32 = 1222 // Enter Castle Nathria And Confront Sire Denathrius In His Citadel. } - public enum VoidTransferError - { - Ok = 0, - InternalError1 = 1, - InternalError2 = 2, - Full = 3, - InternalError3 = 4, - InternalError4 = 5, - NotEnoughMoney = 6, - InventoryFull = 7, - ItemInvalid = 8, - TransferUnknown = 9 - } - public enum eScriptFlags { // Talk Flags @@ -2220,903 +2197,910 @@ namespace Framework.Constants SetLootRoundrobin = 294, SetLootMaster = 295, SetLootGroup = 296, - SetLootThresholdS = 297, - NewLootMasterS = 298, - SpecifyMasterLooter = 299, - LootSpecChangedS = 300, - TameFailed = 301, - ChatWhileDead = 302, - ChatPlayerNotFoundS = 303, - Newtaxipath = 304, - NoPet = 305, - Notyourpet = 306, - PetNotRenameable = 307, - QuestObjectiveCompleteS = 308, - QuestUnknownComplete = 309, - QuestAddKillSii = 310, - QuestAddFoundSii = 311, - QuestAddItemSii = 312, - QuestAddPlayerKillSii = 313, - Cannotcreatedirectory = 314, - Cannotcreatefile = 315, - PlayerWrongFaction = 316, - PlayerIsNeutral = 317, - BankslotFailedTooMany = 318, - BankslotInsufficientFunds = 319, - BankslotNotbanker = 320, - FriendDbError = 321, - FriendListFull = 322, - FriendAddedS = 323, - BattletagFriendAddedS = 324, - FriendOnlineSs = 325, - FriendOfflineS = 326, - FriendNotFound = 327, - FriendWrongFaction = 328, - FriendRemovedS = 329, - BattletagFriendRemovedS = 330, - FriendError = 331, - FriendAlreadyS = 332, - FriendSelf = 333, - FriendDeleted = 334, - IgnoreFull = 335, - IgnoreSelf = 336, - IgnoreNotFound = 337, - IgnoreAlreadyS = 338, - IgnoreAddedS = 339, - IgnoreRemovedS = 340, - IgnoreAmbiguous = 341, - IgnoreDeleted = 342, - OnlyOneBolt = 343, - OnlyOneAmmo = 344, - SpellFailedEquippedSpecificItem = 345, - WrongBagTypeSubclass = 346, - CantWrapStackable = 347, - CantWrapEquipped = 348, - CantWrapWrapped = 349, - CantWrapBound = 350, - CantWrapUnique = 351, - CantWrapBags = 352, - OutOfMana = 353, - OutOfRage = 354, - OutOfFocus = 355, - OutOfEnergy = 356, - OutOfChi = 357, - OutOfHealth = 358, - OutOfRunes = 359, - OutOfRunicPower = 360, - OutOfSoulShards = 361, - OutOfLunarPower = 362, - OutOfHolyPower = 363, - OutOfMaelstrom = 364, - OutOfComboPoints = 365, - OutOfInsanity = 366, - OutOfEssence = 367, - OutOfArcaneCharges = 368, - OutOfFury = 369, - OutOfPain = 370, - OutOfPowerDisplay = 371, - OutOfRuneBlood = 372, - OutOfRuneFrost = 373, - OutOfRuneUnholy = 374, - OutOfAlternateQuest = 375, - OutOfAlternateEncounter = 376, - OutOfAlternateMount = 377, - OutOfBalance = 378, - OutOfHappiness = 379, - OutOfShadowOrbs = 380, - OutOfRuneChromatic = 381, - LootGone = 382, - MountForceddismount = 383, - AutofollowTooFar = 384, - UnitNotFound = 385, - InvalidFollowTarget = 386, - InvalidFollowPvpCombat = 387, - InvalidFollowTargetPvpCombat = 388, - InvalidInspectTarget = 389, - GuildemblemSuccess = 390, - GuildemblemInvalidTabardColors = 391, - GuildemblemNoguild = 392, - GuildemblemNotguildmaster = 393, - GuildemblemNotenoughmoney = 394, - GuildemblemInvalidvendor = 395, - EmblemerrorNotabardgeoset = 396, - SpellOutOfRange = 397, - CommandNeedsTarget = 398, - NoammoS = 399, - Toobusytofollow = 400, - DuelRequested = 401, - DuelCancelled = 402, - Deathbindalreadybound = 403, - DeathbindSuccessS = 404, - Noemotewhilerunning = 405, - ZoneExplored = 406, - ZoneExploredXp = 407, - InvalidItemTarget = 408, - InvalidQuestTarget = 409, - IgnoringYouS = 410, - FishNotHooked = 411, - FishEscaped = 412, - SpellFailedNotunsheathed = 413, - PetitionOfferedS = 414, - PetitionSigned = 415, - PetitionSignedS = 416, - PetitionDeclinedS = 417, - PetitionAlreadySigned = 418, - PetitionRestrictedAccountTrial = 419, - PetitionAlreadySignedOther = 420, - PetitionInGuild = 421, - PetitionCreator = 422, - PetitionNotEnoughSignatures = 423, - PetitionNotSameServer = 424, - PetitionFull = 425, - PetitionAlreadySignedByS = 426, - GuildNameInvalid = 427, - SpellUnlearnedS = 428, - PetSpellRooted = 429, - PetSpellAffectingCombat = 430, - PetSpellOutOfRange = 431, - PetSpellNotBehind = 432, - PetSpellTargetsDead = 433, - PetSpellDead = 434, - PetSpellNopath = 435, - ItemCantBeDestroyed = 436, - TicketAlreadyExists = 437, - TicketCreateError = 438, - TicketUpdateError = 439, - TicketDbError = 440, - TicketNoText = 441, - TicketTextTooLong = 442, - ObjectIsBusy = 443, - ExhaustionWellrested = 444, - ExhaustionRested = 445, - ExhaustionNormal = 446, - ExhaustionTired = 447, - ExhaustionExhausted = 448, - NoItemsWhileShapeshifted = 449, - CantInteractShapeshifted = 450, - RealmNotFound = 451, - MailQuestItem = 452, - MailBoundItem = 453, - MailConjuredItem = 454, - MailBag = 455, - MailToSelf = 456, - MailTargetNotFound = 457, - MailDatabaseError = 458, - MailDeleteItemError = 459, - MailWrappedCod = 460, - MailCantSendRealm = 461, - MailTempReturnOutage = 462, - MailRecepientCantReceiveMail = 463, - MailSent = 464, - MailTargetIsTrial = 465, - NotHappyEnough = 466, - UseCantImmune = 467, - CantBeDisenchanted = 468, - CantUseDisarmed = 469, - AuctionDatabaseError = 470, - AuctionHigherBid = 471, - AuctionAlreadyBid = 472, - AuctionOutbidS = 473, - AuctionWonS = 474, - AuctionRemovedS = 475, - AuctionBidPlaced = 476, - LogoutFailed = 477, - QuestPushSuccessS = 478, - QuestPushInvalidS = 479, - QuestPushInvalidToRecipientS = 480, - QuestPushAcceptedS = 481, - QuestPushDeclinedS = 482, - QuestPushBusyS = 483, - QuestPushDeadS = 484, - QuestPushDeadToRecipientS = 485, - QuestPushLogFullS = 486, - QuestPushLogFullToRecipientS = 487, - QuestPushOnquestS = 488, - QuestPushOnquestToRecipientS = 489, - QuestPushAlreadyDoneS = 490, - QuestPushAlreadyDoneToRecipientS = 491, - QuestPushNotDailyS = 492, - QuestPushTimerExpiredS = 493, - QuestPushNotInPartyS = 494, - QuestPushDifferentServerDailyS = 495, - QuestPushDifferentServerDailyToRecipientS = 496, - QuestPushNotAllowedS = 497, - QuestPushPrerequisiteS = 498, - QuestPushPrerequisiteToRecipientS = 499, - QuestPushLowLevelS = 500, - QuestPushLowLevelToRecipientS = 501, - QuestPushHighLevelS = 502, - QuestPushHighLevelToRecipientS = 503, - QuestPushClassS = 504, - QuestPushClassToRecipientS = 505, - QuestPushRaceS = 506, - QuestPushRaceToRecipientS = 507, - QuestPushLowFactionS = 508, - QuestPushLowFactionToRecipientS = 509, - QuestPushHighFactionS = 510, - QuestPushHighFactionToRecipientS = 511, - QuestPushExpansionS = 512, - QuestPushExpansionToRecipientS = 513, - QuestPushNotGarrisonOwnerS = 514, - QuestPushNotGarrisonOwnerToRecipientS = 515, - QuestPushWrongCovenantS = 516, - QuestPushWrongCovenantToRecipientS = 517, - QuestPushNewPlayerExperienceS = 518, - QuestPushNewPlayerExperienceToRecipientS = 519, - QuestPushWrongFactionS = 520, - QuestPushWrongFactionToRecipientS = 521, - QuestPushCrossFactionRestrictedS = 522, - RaidGroupLowlevel = 523, - RaidGroupOnly = 524, - RaidGroupFull = 525, - RaidGroupRequirementsUnmatch = 526, - CorpseIsNotInInstance = 527, - PvpKillHonorable = 528, - PvpKillDishonorable = 529, - SpellFailedAlreadyAtFullHealth = 530, - SpellFailedAlreadyAtFullMana = 531, - SpellFailedAlreadyAtFullPowerS = 532, - AutolootMoneyS = 533, - GenericStunned = 534, - GenericThrottle = 535, - ClubFinderSearchingTooFast = 536, - TargetStunned = 537, - MustRepairDurability = 538, - RaidYouJoined = 539, - RaidYouLeft = 540, - InstanceGroupJoinedWithParty = 541, - InstanceGroupJoinedWithRaid = 542, - RaidMemberAddedS = 543, - RaidMemberRemovedS = 544, - InstanceGroupAddedS = 545, - InstanceGroupRemovedS = 546, - ClickOnItemToFeed = 547, - TooManyChatChannels = 548, - LootRollPending = 549, - LootPlayerNotFound = 550, - NotInRaid = 551, - LoggingOut = 552, - TargetLoggingOut = 553, - NotWhileMounted = 554, - NotWhileShapeshifted = 555, - NotInCombat = 556, - NotWhileDisarmed = 557, - PetBroken = 558, - TalentWipeError = 559, - SpecWipeError = 560, - GlyphWipeError = 561, - PetSpecWipeError = 562, - FeignDeathResisted = 563, - MeetingStoneInQueueS = 564, - MeetingStoneLeftQueueS = 565, - MeetingStoneOtherMemberLeft = 566, - MeetingStonePartyKickedFromQueue = 567, - MeetingStoneMemberStillInQueue = 568, - MeetingStoneSuccess = 569, - MeetingStoneInProgress = 570, - MeetingStoneMemberAddedS = 571, - MeetingStoneGroupFull = 572, - MeetingStoneNotLeader = 573, - MeetingStoneInvalidLevel = 574, - MeetingStoneTargetNotInParty = 575, - MeetingStoneTargetInvalidLevel = 576, - MeetingStoneMustBeLeader = 577, - MeetingStoneNoRaidGroup = 578, - MeetingStoneNeedParty = 579, - MeetingStoneNotFound = 580, - MeetingStoneTargetInVehicle = 581, - GuildemblemSame = 582, - EquipTradeItem = 583, - PvpToggleOn = 584, - PvpToggleOff = 585, - GroupJoinBattlegroundDeserters = 586, - GroupJoinBattlegroundDead = 587, - GroupJoinBattlegroundS = 588, - GroupJoinBattlegroundFail = 589, - GroupJoinBattlegroundTooMany = 590, - SoloJoinBattlegroundS = 591, - JoinSingleScenarioS = 592, - BattlegroundTooManyQueues = 593, - BattlegroundCannotQueueForRated = 594, - BattledgroundQueuedForRated = 595, - BattlegroundTeamLeftQueue = 596, - BattlegroundNotInBattleground = 597, - AlreadyInArenaTeamS = 598, - InvalidPromotionCode = 599, - BgPlayerJoinedSs = 600, - BgPlayerLeftS = 601, - RestrictedAccount = 602, - RestrictedAccountTrial = 603, - NotEnoughPurchasedGameTime = 604, - PlayTimeExceeded = 605, - ApproachingPartialPlayTime = 606, - ApproachingPartialPlayTime2 = 607, - ApproachingNoPlayTime = 608, - ApproachingNoPlayTime2 = 609, - UnhealthyTime = 610, - ChatRestrictedTrial = 611, - ChatThrottled = 612, - MailReachedCap = 613, - InvalidRaidTarget = 614, - RaidLeaderReadyCheckStartS = 615, - ReadyCheckInProgress = 616, - ReadyCheckThrottled = 617, - DungeonDifficultyFailed = 618, - DungeonDifficultyChangedS = 619, - TradeWrongRealm = 620, - TradeNotOnTaplist = 621, - ChatPlayerAmbiguousS = 622, - LootCantLootThatNow = 623, - LootMasterInvFull = 624, - LootMasterUniqueItem = 625, - LootMasterOther = 626, - FilteringYouS = 627, - UsePreventedByMechanicS = 628, - ItemUniqueEquippable = 629, - LfgLeaderIsLfmS = 630, - LfgPending = 631, - CantSpeakLangage = 632, - VendorMissingTurnins = 633, - BattlegroundNotInTeam = 634, - NotInBattleground = 635, - NotEnoughHonorPoints = 636, - NotEnoughArenaPoints = 637, - SocketingRequiresMetaGem = 638, - SocketingMetaGemOnlyInMetaslot = 639, - SocketingRequiresHydraulicGem = 640, - SocketingHydraulicGemOnlyInHydraulicslot = 641, - SocketingRequiresCogwheelGem = 642, - SocketingCogwheelGemOnlyInCogwheelslot = 643, - SocketingItemTooLowLevel = 644, - ItemMaxCountSocketed = 645, - SystemDisabled = 646, - QuestFailedTooManyDailyQuestsI = 647, - ItemMaxCountEquippedSocketed = 648, - ItemUniqueEquippableSocketed = 649, - UserSquelched = 650, - AccountSilenced = 651, - PartyMemberSilenced = 652, - PartyMemberSilencedLfgDelist = 653, - TooMuchGold = 654, - NotBarberSitting = 655, - QuestFailedCais = 656, - InviteRestrictedTrial = 657, - VoiceIgnoreFull = 658, - VoiceIgnoreSelf = 659, - VoiceIgnoreNotFound = 660, - VoiceIgnoreAlreadyS = 661, - VoiceIgnoreAddedS = 662, - VoiceIgnoreRemovedS = 663, - VoiceIgnoreAmbiguous = 664, - VoiceIgnoreDeleted = 665, - UnknownMacroOptionS = 666, - NotDuringArenaMatch = 667, - NotInRatedBattleground = 668, - PlayerSilenced = 669, - PlayerUnsilenced = 670, - ComsatDisconnect = 671, - ComsatReconnectAttempt = 672, - ComsatConnectFail = 673, - MailInvalidAttachmentSlot = 674, - MailTooManyAttachments = 675, - MailInvalidAttachment = 676, - MailAttachmentExpired = 677, - VoiceChatParentalDisableMic = 678, - ProfaneChatName = 679, - PlayerSilencedEcho = 680, - PlayerUnsilencedEcho = 681, - LootCantLootThat = 682, - ArenaExpiredCais = 683, - GroupActionThrottled = 684, - AlreadyPickpocketed = 685, - NameInvalid = 686, - NameNoName = 687, - NameTooShort = 688, - NameTooLong = 689, - NameMixedLanguages = 690, - NameProfane = 691, - NameReserved = 692, - NameThreeConsecutive = 693, - NameInvalidSpace = 694, - NameConsecutiveSpaces = 695, - NameRussianConsecutiveSilentCharacters = 696, - NameRussianSilentCharacterAtBeginningOrEnd = 697, - NameDeclensionDoesntMatchBaseName = 698, - RecruitAFriendNotLinked = 699, - RecruitAFriendNotNow = 700, - RecruitAFriendSummonLevelMax = 701, - RecruitAFriendSummonCooldown = 702, - RecruitAFriendSummonOffline = 703, - RecruitAFriendInsufExpanLvl = 704, - RecruitAFriendMapIncomingTransferNotAllowed = 705, - NotSameAccount = 706, - BadOnUseEnchant = 707, - TradeSelf = 708, - TooManySockets = 709, - ItemMaxLimitCategoryCountExceededIs = 710, - TradeTargetMaxLimitCategoryCountExceededIs = 711, - ItemMaxLimitCategorySocketedExceededIs = 712, - ItemMaxLimitCategoryEquippedExceededIs = 713, - ShapeshiftFormCannotEquip = 714, - ItemInventoryFullSatchel = 715, - ScalingStatItemLevelExceeded = 716, - ScalingStatItemLevelTooLow = 717, - PurchaseLevelTooLow = 718, - GroupSwapFailed = 719, - InviteInCombat = 720, - InvalidGlyphSlot = 721, - GenericNoValidTargets = 722, - CalendarEventAlertS = 723, - PetLearnSpellS = 724, - PetLearnAbilityS = 725, - PetSpellUnlearnedS = 726, - InviteUnknownRealm = 727, - InviteNoPartyServer = 728, - InvitePartyBusy = 729, - InvitePartyBusyPendingRequest = 730, - InvitePartyBusyPendingSuggest = 731, - PartyTargetAmbiguous = 732, - PartyLfgInviteRaidLocked = 733, - PartyLfgBootLimit = 734, - PartyLfgBootCooldownS = 735, - PartyLfgBootNotEligibleS = 736, - PartyLfgBootInpatientTimerS = 737, - PartyLfgBootInProgress = 738, - PartyLfgBootTooFewPlayers = 739, - PartyLfgBootVoteSucceeded = 740, - PartyLfgBootVoteFailed = 741, - PartyLfgBootDisallowedByMap = 742, - PartyLfgBootDungeonComplete = 743, - PartyLfgBootLootRolls = 744, - PartyLfgBootVoteRegistered = 745, - PartyPrivateGroupOnly = 746, - PartyLfgTeleportInCombat = 747, - PartyTimeRunningSeasonIdMustMatch = 748, - RaidDisallowedByLevel = 749, - RaidDisallowedByCrossRealm = 750, - PartyRoleNotAvailable = 751, - JoinLfgObjectFailed = 752, - LfgRemovedLevelup = 753, - LfgRemovedXpToggle = 754, - LfgRemovedFactionChange = 755, - BattlegroundInfoThrottled = 756, - BattlegroundAlreadyIn = 757, - ArenaTeamChangeFailedQueued = 758, - ArenaTeamPermissions = 759, - NotWhileFalling = 760, - NotWhileMoving = 761, - NotWhileFatigued = 762, - MaxSockets = 763, - MultiCastActionTotemS = 764, - BattlegroundJoinLevelup = 765, - RemoveFromPvpQueueXpGain = 766, - BattlegroundJoinXpGain = 767, - BattlegroundJoinMercenary = 768, - BattlegroundJoinTooManyHealers = 769, - BattlegroundJoinRatedTooManyHealers = 770, - BattlegroundJoinTooManyTanks = 771, - BattlegroundJoinTooManyDamage = 772, - RaidDifficultyFailed = 773, - RaidDifficultyChangedS = 774, - LegacyRaidDifficultyChangedS = 775, - RaidLockoutChangedS = 776, - RaidConvertedToParty = 777, - PartyConvertedToRaid = 778, - PlayerDifficultyChangedS = 779, - GmresponseDbError = 780, - BattlegroundJoinRangeIndex = 781, - ArenaJoinRangeIndex = 782, - RemoveFromPvpQueueFactionChange = 783, - BattlegroundJoinFailed = 784, - BattlegroundJoinNoValidSpecForRole = 785, - BattlegroundJoinRespec = 786, - BattlegroundInvitationDeclined = 787, - BattlegroundInvitationDeclinedBy = 788, - BattlegroundJoinTimedOut = 789, - BattlegroundDupeQueue = 790, - BattlegroundJoinMustCompleteQuest = 791, - InBattlegroundRespec = 792, - MailLimitedDurationItem = 793, - YellRestrictedTrial = 794, - ChatRaidRestrictedTrial = 795, - LfgRoleCheckFailed = 796, - LfgRoleCheckFailedTimeout = 797, - LfgRoleCheckFailedNotViable = 798, - LfgReadyCheckFailed = 799, - LfgReadyCheckFailedTimeout = 800, - LfgGroupFull = 801, - LfgNoLfgObject = 802, - LfgNoSlotsPlayer = 803, - LfgNoSlotsParty = 804, - LfgNoSpec = 805, - LfgMismatchedSlots = 806, - LfgMismatchedSlotsLocalXrealm = 807, - LfgPartyPlayersFromDifferentRealms = 808, - LfgMembersNotPresent = 809, - LfgGetInfoTimeout = 810, - LfgInvalidSlot = 811, - LfgDeserterPlayer = 812, - LfgDeserterParty = 813, - LfgDead = 814, - LfgRandomCooldownPlayer = 815, - LfgRandomCooldownParty = 816, - LfgTooManyMembers = 817, - LfgTooFewMembers = 818, - LfgProposalFailed = 819, - LfgProposalDeclinedSelf = 820, - LfgProposalDeclinedParty = 821, - LfgNoSlotsSelected = 822, - LfgNoRolesSelected = 823, - LfgRoleCheckInitiated = 824, - LfgReadyCheckInitiated = 825, - LfgPlayerDeclinedRoleCheck = 826, - LfgPlayerDeclinedReadyCheck = 827, - LfgLorewalking = 828, - LfgJoinedQueue = 829, - LfgJoinedFlexQueue = 830, - LfgJoinedRfQueue = 831, - LfgJoinedScenarioQueue = 832, - LfgJoinedWorldPvpQueue = 833, - LfgJoinedBattlefieldQueue = 834, - LfgJoinedList = 835, - QueuedPlunderstorm = 836, - LfgLeftQueue = 837, - LfgLeftList = 838, - LfgRoleCheckAborted = 839, - LfgReadyCheckAborted = 840, - LfgCantUseBattleground = 841, - LfgCantUseDungeons = 842, - LfgReasonTooManyLfg = 843, - LfgFarmLimit = 844, - LfgNoCrossFactionParties = 845, - InvalidTeleportLocation = 846, - TooFarToInteract = 847, - BattlegroundPlayersFromDifferentRealms = 848, - DifficultyChangeCooldownS = 849, - DifficultyChangeCombatCooldownS = 850, - DifficultyChangeWorldstate = 851, - DifficultyChangeEncounter = 852, - DifficultyChangeCombat = 853, - DifficultyChangePlayerBusy = 854, - DifficultyChangePlayerOnVehicle = 855, - DifficultyChangeAlreadyStarted = 856, - DifficultyChangeOtherHeroicS = 857, - DifficultyChangeHeroicInstanceAlreadyRunning = 858, - ArenaTeamPartySize = 859, - SoloShuffleWargameGroupSize = 860, - SoloShuffleWargameGroupComp = 861, - SoloRbgWargameGroupSize = 862, - SoloRbgWargameGroupComp = 863, - SoloMinItemLevel = 864, - PvpPlayerAbandoned = 865, - BattlegroundJoinGroupQueueWithoutHealer = 866, - QuestForceRemovedS = 867, - AttackNoActions = 868, - InRandomBg = 869, - InNonRandomBg = 870, - BnFriendSelf = 871, - BnFriendAlready = 872, - BnFriendBlocked = 873, - BnFriendListFull = 874, - BnFriendRequestSent = 875, - BnBroadcastThrottle = 876, - BgDeveloperOnly = 877, - CurrencySpellSlotMismatch = 878, - CurrencyNotTradable = 879, - RequiresExpansionS = 880, - QuestFailedSpell = 881, - TalentFailedUnspentTalentPoints = 882, - TalentFailedNotEnoughTalentsInPrimaryTree = 883, - TalentFailedNoPrimaryTreeSelected = 884, - TalentFailedCantRemoveTalent = 885, - TalentFailedUnknown = 886, - TalentFailedInCombat = 887, - TalentFailedInPvpMatch = 888, - TalentFailedInMythicPlus = 889, - WargameRequestFailure = 890, - RankRequiresAuthenticator = 891, - GuildBankVoucherFailed = 892, - WargameRequestSent = 893, - RequiresAchievementI = 894, - RefundResultExceedMaxCurrency = 895, - CantBuyQuantity = 896, - ItemIsBattlePayLocked = 897, - PartyAlreadyInBattlegroundQueue = 898, - PartyConfirmingBattlegroundQueue = 899, - BattlefieldTeamPartySize = 900, - InsuffTrackedCurrencyIs = 901, - NotOnTournamentRealm = 902, - GuildTrialAccountTrial = 903, - GuildTrialAccountVeteran = 904, - GuildUndeletableDueToLevel = 905, - CantDoThatInAGroup = 906, - GuildLeaderReplaced = 907, - TransmogrifyCantEquip = 908, - TransmogrifyInvalidItemType = 909, - TransmogrifyNotSoulbound = 910, - TransmogrifyInvalidSource = 911, - TransmogrifyInvalidDestination = 912, - TransmogrifyMismatch = 913, - TransmogrifyLegendary = 914, - TransmogrifySameItem = 915, - TransmogrifySameAppearance = 916, - TransmogrifyNotEquipped = 917, - VoidDepositFull = 918, - VoidWithdrawFull = 919, - VoidStorageWrapped = 920, - VoidStorageStackable = 921, - VoidStorageUnbound = 922, - VoidStorageRepair = 923, - VoidStorageCharges = 924, - VoidStorageQuest = 925, - VoidStorageConjured = 926, - VoidStorageMail = 927, - VoidStorageBag = 928, - VoidTransferStorageFull = 929, - VoidTransferInvFull = 930, - VoidTransferInternalError = 931, - VoidTransferItemInvalid = 932, - DifficultyDisabledInLfg = 933, - VoidStorageUnique = 934, - VoidStorageLoot = 935, - VoidStorageHoliday = 936, - VoidStorageDuration = 937, - VoidStorageLoadFailed = 938, - VoidStorageInvalidItem = 939, - VoidStorageAccountItem = 940, - ParentalControlsChatMuted = 941, - SorStartExperienceIncomplete = 942, - SorInvalidEmail = 943, - SorInvalidComment = 944, - ChallengeModeResetCooldownS = 945, - ChallengeModeResetKeystone = 946, - PetJournalAlreadyInLoadout = 947, - ReportSubmittedSuccessfully = 948, - ReportSubmissionFailed = 949, - SuggestionSubmittedSuccessfully = 950, - BugSubmittedSuccessfully = 951, - ChallengeModeEnabled = 952, - ChallengeModeDisabled = 953, - PetbattleCreateFailed = 954, - PetbattleNotHere = 955, - PetbattleNotHereOnTransport = 956, - PetbattleNotHereUnevenGround = 957, - PetbattleNotHereObstructed = 958, - PetbattleNotWhileInCombat = 959, - PetbattleNotWhileDead = 960, - PetbattleNotWhileFlying = 961, - PetbattleTargetInvalid = 962, - PetbattleTargetOutOfRange = 963, - PetbattleTargetNotCapturable = 964, - PetbattleNotATrainer = 965, - PetbattleDeclined = 966, - PetbattleInBattle = 967, - PetbattleInvalidLoadout = 968, - PetbattleAllPetsDead = 969, - PetbattleNoPetsInSlots = 970, - PetbattleNoAccountLock = 971, - PetbattleWildPetTapped = 972, - PetbattleRestrictedAccount = 973, - PetbattleOpponentNotAvailable = 974, - PetbattleNotWhileInMatchedBattle = 975, - CantHaveMorePetsOfThatType = 976, - CantHaveMorePets = 977, - PvpMapNotFound = 978, - PvpMapNotSet = 979, - PetbattleQueueQueued = 980, - PetbattleQueueAlreadyQueued = 981, - PetbattleQueueJoinFailed = 982, - PetbattleQueueJournalLock = 983, - PetbattleQueueRemoved = 984, - PetbattleQueueProposalDeclined = 985, - PetbattleQueueProposalTimeout = 986, - PetbattleQueueOpponentDeclined = 987, - PetbattleQueueRequeuedInternal = 988, - PetbattleQueueRequeuedRemoved = 989, - PetbattleQueueSlotLocked = 990, - PetbattleQueueSlotEmpty = 991, - PetbattleQueueSlotNoTracker = 992, - PetbattleQueueSlotNoSpecies = 993, - PetbattleQueueSlotCantBattle = 994, - PetbattleQueueSlotRevoked = 995, - PetbattleQueueSlotDead = 996, - PetbattleQueueSlotNoPet = 997, - PetbattleQueueNotWhileNeutral = 998, - PetbattleGameTimeLimitWarning = 999, - PetbattleGameRoundsLimitWarning = 1000, - HasRestriction = 1001, - ItemUpgradeItemTooLowLevel = 1002, - ItemUpgradeNoPath = 1003, - ItemUpgradeNoMoreUpgrades = 1004, - BonusRollEmpty = 1005, - ChallengeModeFull = 1006, - ChallengeModeInProgress = 1007, - ChallengeModeIncorrectKeystone = 1008, - BattletagFriendNotFound = 1009, - BattletagFriendNotValid = 1010, - BattletagFriendNotAllowed = 1011, - BattletagFriendThrottled = 1012, - BattletagFriendSuccess = 1013, - PetTooHighLevelToUncage = 1014, - PetbattleInternal = 1015, - CantCagePetYet = 1016, - NoLootInChallengeMode = 1017, - QuestPetBattleVictoriesPvpIi = 1018, - RoleCheckAlreadyInProgress = 1019, - RecruitAFriendAccountLimit = 1020, - RecruitAFriendFailed = 1021, - SetLootPersonal = 1022, - SetLootMethodFailedCombat = 1023, - ReagentBankFull = 1024, - ReagentBankLocked = 1025, - GarrisonBuildingExists = 1026, - GarrisonInvalidPlot = 1027, - GarrisonInvalidBuildingid = 1028, - GarrisonInvalidPlotBuilding = 1029, - GarrisonRequiresBlueprint = 1030, - GarrisonNotEnoughCurrency = 1031, - GarrisonNotEnoughGold = 1032, - GarrisonCompleteMissionWrongFollowerType = 1033, - AlreadyUsingLfgList = 1034, - RestrictedAccountLfgListTrial = 1035, - ToyUseLimitReached = 1036, - ToyAlreadyKnown = 1037, - TransmogSetAlreadyKnown = 1038, - NotEnoughCurrency = 1039, - SpecIsDisabled = 1040, - FeatureRestrictedTrial = 1041, - CantBeObliterated = 1042, - CantBeScrapped = 1043, - CantBeRecrafted = 1044, - ArtifactRelicDoesNotMatchArtifact = 1045, - MustEquipArtifact = 1046, - CantDoThatRightNow = 1047, - AffectingCombat = 1048, - EquipmentManagerCombatSwapS = 1049, - EquipmentManagerBagsFull = 1050, - EquipmentManagerMissingItemS = 1051, - MovieRecordingWarningPerf = 1052, - MovieRecordingWarningDiskFull = 1053, - MovieRecordingWarningNoMovie = 1054, - MovieRecordingWarningRequirements = 1055, - MovieRecordingWarningCompressing = 1056, - NoChallengeModeReward = 1057, - ClaimedChallengeModeReward = 1058, - ChallengeModePeriodResetSs = 1059, - CantDoThatChallengeModeActive = 1060, - TalentFailedRestArea = 1061, - CannotAbandonLastPet = 1062, - TestCvarSetSss = 1063, - QuestTurnInFailReason = 1064, - ClaimedChallengeModeRewardOld = 1065, - TalentGrantedByAura = 1066, - ChallengeModeAlreadyComplete = 1067, - GlyphTargetNotAvailable = 1068, - PvpWarmodeToggleOn = 1069, - PvpWarmodeToggleOff = 1070, - SpellFailedLevelRequirement = 1071, - SpellFailedCantFlyHere = 1072, - BattlegroundJoinRequiresLevel = 1073, - BattlegroundJoinDisqualified = 1074, - BattlegroundJoinDisqualifiedNoName = 1075, - VoiceChatGenericUnableToConnect = 1076, - VoiceChatServiceLost = 1077, - VoiceChatChannelNameTooShort = 1078, - VoiceChatChannelNameTooLong = 1079, - VoiceChatChannelAlreadyExists = 1080, - VoiceChatTargetNotFound = 1081, - VoiceChatTooManyRequests = 1082, - VoiceChatPlayerSilenced = 1083, - VoiceChatParentalDisableAll = 1084, - VoiceChatDisabled = 1085, - NoPvpReward = 1086, - ClaimedPvpReward = 1087, - AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1088, - AzeriteEssenceSelectionFailedCantRemoveEssence = 1089, - AzeriteEssenceSelectionFailedConditionFailed = 1090, - AzeriteEssenceSelectionFailedRestArea = 1091, - AzeriteEssenceSelectionFailedSlotLocked = 1092, - AzeriteEssenceSelectionFailedNotAtForge = 1093, - AzeriteEssenceSelectionFailedHeartLevelTooLow = 1094, - AzeriteEssenceSelectionFailedNotEquipped = 1095, - SocketingRequiresPunchcardredGem = 1096, - SocketingPunchcardredGemOnlyInPunchcardredslot = 1097, - SocketingRequiresPunchcardyellowGem = 1098, - SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1099, - SocketingRequiresPunchcardblueGem = 1100, - SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1101, - SocketingRequiresDominationShard = 1102, - SocketingDominationShardOnlyInDominationslot = 1103, - SocketingRequiresCypherGem = 1104, - SocketingCypherGemOnlyInCypherslot = 1105, - SocketingRequiresTinkerGem = 1106, - SocketingTinkerGemOnlyInTinkerslot = 1107, - SocketingRequiresPrimordialGem = 1108, - SocketingPrimordialGemOnlyInPrimordialslot = 1109, - SocketingRequiresFragranceGem = 1110, - SocketingFragranceGemOnlyInFragranceslot = 1111, - SocketingRequiresSingingThunderGem = 1112, - SocketingSingingthunderGemOnlyInSingingthunderslot = 1113, - SocketingRequiresSingingSeaGem = 1114, - SocketingSingingseaGemOnlyInSingingseaslot = 1115, - SocketingRequiresSingingWindGem = 1116, - SocketingSingingwindGemOnlyInSingingwindslot = 1117, - LevelLinkingResultLinked = 1118, - LevelLinkingResultUnlinked = 1119, - ClubFinderErrorPostClub = 1120, - ClubFinderErrorApplyClub = 1121, - ClubFinderErrorRespondApplicant = 1122, - ClubFinderErrorCancelApplication = 1123, - ClubFinderErrorTypeAcceptApplication = 1124, - ClubFinderErrorTypeNoInvitePermissions = 1125, - ClubFinderErrorTypeNoPostingPermissions = 1126, - ClubFinderErrorTypeApplicantList = 1127, - ClubFinderErrorTypeApplicantListNoPerm = 1128, - ClubFinderErrorTypeFinderNotAvailable = 1129, - ClubFinderErrorTypeGetPostingIds = 1130, - ClubFinderErrorTypeJoinApplication = 1131, - ClubFinderErrorTypeRealmNotEligible = 1132, - ClubFinderErrorTypeFlaggedRename = 1133, - ClubFinderErrorTypeFlaggedDescriptionChange = 1134, - ItemInteractionNotEnoughGold = 1135, - ItemInteractionNotEnoughCurrency = 1136, - ItemInteractionNoConversionOutput = 1137, - PlayerChoiceErrorPendingChoice = 1138, - SoulbindInvalidConduit = 1139, - SoulbindInvalidConduitItem = 1140, - SoulbindInvalidTalent = 1141, - SoulbindDuplicateConduit = 1142, - ActivateSoulbindS = 1143, - ActivateSoulbindFailedRestArea = 1144, - CantUseProfanity = 1145, - NotInPetBattle = 1146, - NotInNpe = 1147, - NoSpec = 1148, - NoDominationshardOverwrite = 1149, - UseWeeklyRewardsDisabled = 1150, - CrossFactionGroupJoined = 1151, - CantTargetUnfriendlyInOverworld = 1152, - EquipablespellsSlotsFull = 1153, - ItemModAppearanceGroupAlreadyKnown = 1154, - CantBulkSellItemWithRefund = 1155, - NoSoulboundItemInAccountBank = 1156, - NoRefundableItemInAccountBank = 1157, - CantDeleteInAccountBank = 1158, - NoImmediateContainerInAccountBank = 1159, - NoOpenImmediateContainerInAccountBank = 1160, - CantTradeAccountItem = 1161, - NoAccountInventoryLock = 1162, - BankNotAccessible = 1163, - TooManyAccountBankTabs = 1164, - AccountBankTabNotUnlocked = 1165, - AccountMoneyLocked = 1166, - BankTabInvalidName = 1167, - BankTabInvalidText = 1168, - WowLabsPartyErrorTypePartyIsFull = 1169, - WowLabsPartyErrorTypeMaxInviteSent = 1170, - WowLabsPartyErrorTypePlayerAlreadyInvited = 1171, - WowLabsPartyErrorTypePartyInviteInvalid = 1172, - WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1173, - WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1174, - WowLabsSetWowLabsAreaIdFailed = 1175, - PlunderstormCannotQueue = 1176, - TargetIsSelfFoundCannotTrade = 1177, - PlayerIsSelfFoundCannotTrade = 1178, - MailRecepientIsSelfFoundCannotReceiveMail = 1179, - PlayerIsSelfFoundCannotSendMail = 1180, - PlayerIsSelfFoundCannotUseAuctionHouse = 1181, - MailTargetCannotReceiveMail = 1182, - RemixInvalidTransferRequest = 1183, - CurrencyTransferInvalidCharacter = 1184, - CurrencyTransferInvalidCurrency = 1185, - CurrencyTransferInsufficientCurrency = 1186, - CurrencyTransferMaxQuantity = 1187, - CurrencyTransferNoValidSource = 1188, - CurrencyTransferCharacterLoggedIn = 1189, - CurrencyTransferServerError = 1190, - CurrencyTransferUnmetRequirements = 1191, - CurrencyTransferTransactionInProgress = 1192, - CurrencyTransferDisabled = 1193, + SetLootNbg = 297, + SetLootThresholdS = 298, + NewLootMasterS = 299, + SpecifyMasterLooter = 300, + LootSpecChangedS = 301, + TameFailed = 302, + ChatWhileDead = 303, + ChatPlayerNotFoundS = 304, + Newtaxipath = 305, + NoPet = 306, + Notyourpet = 307, + PetNotRenameable = 308, + QuestObjectiveCompleteS = 309, + QuestUnknownComplete = 310, + QuestAddKillSii = 311, + QuestAddFoundSii = 312, + QuestAddItemSii = 313, + QuestAddPlayerKillSii = 314, + Cannotcreatedirectory = 315, + Cannotcreatefile = 316, + PlayerWrongFaction = 317, + PlayerIsNeutral = 318, + BankslotFailedTooMany = 319, + BankslotInsufficientFunds = 320, + BankslotNotbanker = 321, + FriendDbError = 322, + FriendListFull = 323, + FriendAddedS = 324, + BattletagFriendAddedS = 325, + FriendOnlineSs = 326, + FriendOfflineS = 327, + FriendNotFound = 328, + FriendWrongFaction = 329, + FriendRemovedS = 330, + BattletagFriendRemovedS = 331, + FriendError = 332, + FriendAlreadyS = 333, + FriendSelf = 334, + FriendDeleted = 335, + IgnoreFull = 336, + IgnoreSelf = 337, + IgnoreNotFound = 338, + IgnoreAlreadyS = 339, + IgnoreAddedS = 340, + IgnoreRemovedS = 341, + IgnoreAmbiguous = 342, + IgnoreDeleted = 343, + OnlyOneBolt = 344, + OnlyOneAmmo = 345, + SpellFailedEquippedSpecificItem = 346, + WrongBagTypeSubclass = 347, + CantWrapStackable = 348, + CantWrapEquipped = 349, + CantWrapWrapped = 350, + CantWrapBound = 351, + CantWrapUnique = 352, + CantWrapBags = 353, + OutOfMana = 354, + OutOfRage = 355, + OutOfFocus = 356, + OutOfEnergy = 357, + OutOfChi = 358, + OutOfHealth = 359, + OutOfRunes = 360, + OutOfRunicPower = 361, + OutOfSoulShards = 362, + OutOfLunarPower = 363, + OutOfHolyPower = 364, + OutOfMaelstrom = 365, + OutOfComboPoints = 366, + OutOfInsanity = 367, + OutOfEssence = 368, + OutOfArcaneCharges = 369, + OutOfFury = 370, + OutOfPain = 371, + OutOfPowerDisplay = 372, + OutOfRuneBlood = 373, + OutOfRuneFrost = 374, + OutOfRuneUnholy = 375, + OutOfAlternateQuest = 376, + OutOfAlternateEncounter = 377, + OutOfAlternateMount = 378, + OutOfBalance = 379, + OutOfHappiness = 380, + OutOfShadowOrbs = 381, + OutOfRuneChromatic = 382, + LootGone = 383, + MountForceddismount = 384, + AutofollowTooFar = 385, + UnitNotFound = 386, + InvalidFollowTarget = 387, + InvalidFollowPvpCombat = 388, + InvalidFollowTargetPvpCombat = 389, + InvalidInspectTarget = 390, + GuildemblemSuccess = 391, + GuildemblemInvalidTabardColors = 392, + GuildemblemNoguild = 393, + GuildemblemNotguildmaster = 394, + GuildemblemNotenoughmoney = 395, + GuildemblemInvalidvendor = 396, + EmblemerrorNotabardgeoset = 397, + SpellOutOfRange = 398, + CommandNeedsTarget = 399, + NoammoS = 400, + Toobusytofollow = 401, + DuelRequested = 402, + DuelCancelled = 403, + Deathbindalreadybound = 404, + DeathbindSuccessS = 405, + Noemotewhilerunning = 406, + ZoneExplored = 407, + ZoneExploredXp = 408, + InvalidItemTarget = 409, + InvalidQuestTarget = 410, + IgnoringYouS = 411, + FishNotHooked = 412, + FishEscaped = 413, + SpellFailedNotunsheathed = 414, + PetitionOfferedS = 415, + PetitionSigned = 416, + PetitionSignedS = 417, + PetitionDeclinedS = 418, + PetitionAlreadySigned = 419, + PetitionRestrictedAccountTrial = 420, + PetitionAlreadySignedOther = 421, + PetitionInGuild = 422, + PetitionCreator = 423, + PetitionNotEnoughSignatures = 424, + PetitionNotSameServer = 425, + PetitionFull = 426, + PetitionAlreadySignedByS = 427, + GuildNameInvalid = 428, + SpellUnlearnedS = 429, + PetSpellRooted = 430, + PetSpellAffectingCombat = 431, + PetSpellOutOfRange = 432, + PetSpellNotBehind = 433, + PetSpellTargetsDead = 434, + PetSpellDead = 435, + PetSpellNopath = 436, + ItemCantBeDestroyed = 437, + TicketAlreadyExists = 438, + TicketCreateError = 439, + TicketUpdateError = 440, + TicketDbError = 441, + TicketNoText = 442, + TicketTextTooLong = 443, + ObjectIsBusy = 444, + ExhaustionWellrested = 445, + ExhaustionRested = 446, + ExhaustionNormal = 447, + ExhaustionTired = 448, + ExhaustionExhausted = 449, + NoItemsWhileShapeshifted = 450, + CantInteractShapeshifted = 451, + RealmNotFound = 452, + MailQuestItem = 453, + MailBoundItem = 454, + MailConjuredItem = 455, + MailBag = 456, + MailToSelf = 457, + MailTargetNotFound = 458, + MailDatabaseError = 459, + MailDeleteItemError = 460, + MailWrappedCod = 461, + MailCantSendRealm = 462, + MailTempReturnOutage = 463, + MailRecepientCantReceiveMail = 464, + MailSent = 465, + MailTargetIsTrial = 466, + NotHappyEnough = 467, + UseCantImmune = 468, + CantBeDisenchanted = 469, + CantUseDisarmed = 470, + AuctionDatabaseError = 471, + AuctionHigherBid = 472, + AuctionAlreadyBid = 473, + AuctionOutbidS = 474, + AuctionWonS = 475, + AuctionRemovedS = 476, + AuctionBidPlaced = 477, + LogoutFailed = 478, + QuestPushSuccessS = 479, + QuestPushInvalidS = 480, + QuestPushInvalidToRecipientS = 481, + QuestPushAcceptedS = 482, + QuestPushDeclinedS = 483, + QuestPushBusyS = 484, + QuestPushDeadS = 485, + QuestPushDeadToRecipientS = 486, + QuestPushLogFullS = 487, + QuestPushLogFullToRecipientS = 488, + QuestPushOnquestS = 489, + QuestPushOnquestToRecipientS = 490, + QuestPushAlreadyDoneS = 491, + QuestPushAlreadyDoneToRecipientS = 492, + QuestPushNotDailyS = 493, + QuestPushTimerExpiredS = 494, + QuestPushNotInPartyS = 495, + QuestPushDifferentServerDailyS = 496, + QuestPushDifferentServerDailyToRecipientS = 497, + QuestPushNotAllowedS = 498, + QuestPushPrerequisiteS = 499, + QuestPushPrerequisiteToRecipientS = 500, + QuestPushLowLevelS = 501, + QuestPushLowLevelToRecipientS = 502, + QuestPushHighLevelS = 503, + QuestPushHighLevelToRecipientS = 504, + QuestPushClassS = 505, + QuestPushClassToRecipientS = 506, + QuestPushRaceS = 507, + QuestPushRaceToRecipientS = 508, + QuestPushLowFactionS = 509, + QuestPushLowFactionToRecipientS = 510, + QuestPushHighFactionS = 511, + QuestPushHighFactionToRecipientS = 512, + QuestPushExpansionS = 513, + QuestPushExpansionToRecipientS = 514, + QuestPushNotGarrisonOwnerS = 515, + QuestPushNotGarrisonOwnerToRecipientS = 516, + QuestPushWrongCovenantS = 517, + QuestPushWrongCovenantToRecipientS = 518, + QuestPushNewPlayerExperienceS = 519, + QuestPushNewPlayerExperienceToRecipientS = 520, + QuestPushWrongFactionS = 521, + QuestPushWrongFactionToRecipientS = 522, + QuestPushCrossFactionRestrictedS = 523, + RaidGroupLowlevel = 524, + RaidGroupOnly = 525, + RaidGroupFull = 526, + RaidGroupRequirementsUnmatch = 527, + CorpseIsNotInInstance = 528, + PvpKillHonorable = 529, + PvpKillDishonorable = 530, + SpellFailedAlreadyAtFullHealth = 531, + SpellFailedAlreadyAtFullMana = 532, + SpellFailedAlreadyAtFullPowerS = 533, + AutolootMoneyS = 534, + GenericStunned = 535, + GenericThrottle = 536, + ClubFinderSearchingTooFast = 537, + TargetStunned = 538, + MustRepairDurability = 539, + RaidYouJoined = 540, + RaidYouLeft = 541, + InstanceGroupJoinedWithParty = 542, + InstanceGroupJoinedWithRaid = 543, + RaidMemberAddedS = 544, + RaidMemberRemovedS = 545, + InstanceGroupAddedS = 546, + InstanceGroupRemovedS = 547, + ClickOnItemToFeed = 548, + TooManyChatChannels = 549, + LootRollPending = 550, + LootPlayerNotFound = 551, + NotInRaid = 552, + LoggingOut = 553, + TargetLoggingOut = 554, + NotWhileMounted = 555, + NotWhileShapeshifted = 556, + NotInCombat = 557, + NotWhileDisarmed = 558, + PetBroken = 559, + TalentWipeError = 560, + SpecWipeError = 561, + GlyphWipeError = 562, + PetSpecWipeError = 563, + FeignDeathResisted = 564, + MeetingStoneInQueueS = 565, + MeetingStoneLeftQueueS = 566, + MeetingStoneOtherMemberLeft = 567, + MeetingStonePartyKickedFromQueue = 568, + MeetingStoneMemberStillInQueue = 569, + MeetingStoneSuccess = 570, + MeetingStoneInProgress = 571, + MeetingStoneMemberAddedS = 572, + MeetingStoneGroupFull = 573, + MeetingStoneNotLeader = 574, + MeetingStoneInvalidLevel = 575, + MeetingStoneTargetNotInParty = 576, + MeetingStoneTargetInvalidLevel = 577, + MeetingStoneMustBeLeader = 578, + MeetingStoneNoRaidGroup = 579, + MeetingStoneNeedParty = 580, + MeetingStoneNotFound = 581, + MeetingStoneTargetInVehicle = 582, + GuildemblemSame = 583, + EquipTradeItem = 584, + PvpToggleOn = 585, + PvpToggleOff = 586, + GroupJoinBattlegroundDeserters = 587, + GroupJoinBattlegroundDead = 588, + GroupJoinBattlegroundS = 589, + GroupJoinBattlegroundFail = 590, + GroupJoinBattlegroundTooMany = 591, + SoloJoinBattlegroundS = 592, + JoinSingleScenarioS = 593, + BattlegroundTooManyQueues = 594, + BattlegroundCannotQueueForRated = 595, + BattledgroundQueuedForRated = 596, + BattlegroundTeamLeftQueue = 597, + BattlegroundNotInBattleground = 598, + AlreadyInArenaTeamS = 599, + InvalidPromotionCode = 600, + BgPlayerJoinedSs = 601, + BgPlayerLeftS = 602, + RestrictedAccount = 603, + RestrictedAccountTrial = 604, + NotEnoughPurchasedGameTime = 605, + PlayTimeExceeded = 606, + ApproachingPartialPlayTime = 607, + ApproachingPartialPlayTime2 = 608, + ApproachingNoPlayTime = 609, + ApproachingNoPlayTime2 = 610, + UnhealthyTime = 611, + ChatRestrictedTrial = 612, + ChatThrottled = 613, + MailReachedCap = 614, + InvalidRaidTarget = 615, + RaidLeaderReadyCheckStartS = 616, + ReadyCheckInProgress = 617, + ReadyCheckThrottled = 618, + VoteToAbandonNotYet = 619, + DungeonDifficultyFailed = 620, + DungeonDifficultyChangedS = 621, + TradeWrongRealm = 622, + TradeNotOnTaplist = 623, + ChatPlayerAmbiguousS = 624, + LootCantLootThatNow = 625, + LootMasterInvFull = 626, + LootMasterUniqueItem = 627, + LootMasterOther = 628, + FilteringYouS = 629, + UsePreventedByMechanicS = 630, + ItemUniqueEquippable = 631, + LfgLeaderIsLfmS = 632, + LfgPending = 633, + CantSpeakLangage = 634, + VendorMissingTurnins = 635, + BattlegroundNotInTeam = 636, + NotInBattleground = 637, + NotEnoughHonorPoints = 638, + NotEnoughArenaPoints = 639, + SocketingRequiresMetaGem = 640, + SocketingMetaGemOnlyInMetaslot = 641, + SocketingRequiresHydraulicGem = 642, + SocketingHydraulicGemOnlyInHydraulicslot = 643, + SocketingRequiresCogwheelGem = 644, + SocketingCogwheelGemOnlyInCogwheelslot = 645, + SocketingItemTooLowLevel = 646, + ItemMaxCountSocketed = 647, + SystemDisabled = 648, + QuestFailedTooManyDailyQuestsI = 649, + ItemMaxCountEquippedSocketed = 650, + ItemUniqueEquippableSocketed = 651, + UserSquelched = 652, + AccountSilenced = 653, + PartyMemberSilenced = 654, + PartyMemberSilencedLfgDelist = 655, + TooMuchGold = 656, + NotBarberSitting = 657, + QuestFailedCais = 658, + InviteRestrictedTrial = 659, + VoiceIgnoreFull = 660, + VoiceIgnoreSelf = 661, + VoiceIgnoreNotFound = 662, + VoiceIgnoreAlreadyS = 663, + VoiceIgnoreAddedS = 664, + VoiceIgnoreRemovedS = 665, + VoiceIgnoreAmbiguous = 666, + VoiceIgnoreDeleted = 667, + UnknownMacroOptionS = 668, + NotDuringArenaMatch = 669, + NotInRatedBattleground = 670, + PlayerSilenced = 671, + PlayerUnsilenced = 672, + ComsatDisconnect = 673, + ComsatReconnectAttempt = 674, + ComsatConnectFail = 675, + MailInvalidAttachmentSlot = 676, + MailTooManyAttachments = 677, + MailInvalidAttachment = 678, + MailAttachmentExpired = 679, + VoiceChatParentalDisableMic = 680, + ProfaneChatName = 681, + PlayerSilencedEcho = 682, + PlayerUnsilencedEcho = 683, + LootCantLootThat = 684, + ArenaExpiredCais = 685, + GroupActionThrottled = 686, + AlreadyPickpocketed = 687, + NameInvalid = 688, + NameNoName = 689, + NameTooShort = 690, + NameTooLong = 691, + NameMixedLanguages = 692, + NameProfane = 693, + NameReserved = 694, + NameThreeConsecutive = 695, + NameInvalidSpace = 696, + NameConsecutiveSpaces = 697, + NameRussianConsecutiveSilentCharacters = 698, + NameRussianSilentCharacterAtBeginningOrEnd = 699, + NameDeclensionDoesntMatchBaseName = 700, + RecruitAFriendNotLinked = 701, + RecruitAFriendNotNow = 702, + RecruitAFriendSummonLevelMax = 703, + RecruitAFriendSummonCooldown = 704, + RecruitAFriendSummonOffline = 705, + RecruitAFriendInsufExpanLvl = 706, + RecruitAFriendMapIncomingTransferNotAllowed = 707, + NotSameAccount = 708, + BadOnUseEnchant = 709, + TradeSelf = 710, + TooManySockets = 711, + ItemMaxLimitCategoryCountExceededIs = 712, + TradeTargetMaxLimitCategoryCountExceededIs = 713, + ItemMaxLimitCategorySocketedExceededIs = 714, + ItemMaxLimitCategoryEquippedExceededIs = 715, + ShapeshiftFormCannotEquip = 716, + ItemInventoryFullSatchel = 717, + ScalingStatItemLevelExceeded = 718, + ScalingStatItemLevelTooLow = 719, + PurchaseLevelTooLow = 720, + GroupSwapFailed = 721, + InviteInCombat = 722, + InvalidGlyphSlot = 723, + GenericNoValidTargets = 724, + CalendarEventAlertS = 725, + PetLearnSpellS = 726, + PetLearnAbilityS = 727, + PetSpellUnlearnedS = 728, + InviteUnknownRealm = 729, + InviteNoPartyServer = 730, + InvitePartyBusy = 731, + InvitePartyBusyPendingRequest = 732, + InvitePartyBusyPendingSuggest = 733, + PartyTargetAmbiguous = 734, + PartyLfgInviteRaidLocked = 735, + PartyLfgBootLimit = 736, + PartyLfgBootCooldownS = 737, + PartyLfgBootNotEligibleS = 738, + PartyLfgBootInpatientTimerS = 739, + PartyLfgBootInProgress = 740, + PartyLfgBootTooFewPlayers = 741, + PartyLfgBootVoteSucceeded = 742, + PartyLfgBootVoteFailed = 743, + PartyLfgBootDisallowedByMap = 744, + PartyLfgBootDungeonComplete = 745, + PartyLfgBootLootRolls = 746, + PartyLfgBootVoteRegistered = 747, + PartyPrivateGroupOnly = 748, + PartyLfgTeleportInCombat = 749, + PartyTimeRunningSeasonIdMustMatch = 750, + RaidDisallowedByLevel = 751, + RaidDisallowedByCrossRealm = 752, + PartyRoleNotAvailable = 753, + JoinLfgObjectFailed = 754, + LfgRemovedLevelup = 755, + LfgRemovedXpToggle = 756, + LfgRemovedFactionChange = 757, + BattlegroundInfoThrottled = 758, + BattlegroundAlreadyIn = 759, + ArenaTeamChangeFailedQueued = 760, + ArenaTeamPermissions = 761, + NotWhileFalling = 762, + NotWhileMoving = 763, + NotWhileFatigued = 764, + MaxSockets = 765, + MultiCastActionTotemS = 766, + BattlegroundJoinLevelup = 767, + RemoveFromPvpQueueXpGain = 768, + BattlegroundJoinXpGain = 769, + BattlegroundJoinMercenary = 770, + BattlegroundJoinTooManyHealers = 771, + BattlegroundJoinRatedTooManyHealers = 772, + BattlegroundJoinTooManyTanks = 773, + BattlegroundJoinTooManyDamage = 774, + RaidDifficultyFailed = 775, + RaidDifficultyChangedS = 776, + LegacyRaidDifficultyChangedS = 777, + RaidLockoutChangedS = 778, + RaidConvertedToParty = 779, + PartyConvertedToRaid = 780, + PlayerDifficultyChangedS = 781, + GmresponseDbError = 782, + BattlegroundJoinRangeIndex = 783, + ArenaJoinRangeIndex = 784, + RemoveFromPvpQueueFactionChange = 785, + BattlegroundJoinFailed = 786, + BattlegroundJoinNoValidSpecForRole = 787, + BattlegroundJoinRespec = 788, + BattlegroundInvitationDeclined = 789, + BattlegroundInvitationDeclinedBy = 790, + BattlegroundJoinTimedOut = 791, + BattlegroundDupeQueue = 792, + BattlegroundJoinMustCompleteQuest = 793, + InBattlegroundRespec = 794, + MailLimitedDurationItem = 795, + YellRestrictedTrial = 796, + ChatRaidRestrictedTrial = 797, + LfgRoleCheckFailed = 798, + LfgRoleCheckFailedTimeout = 799, + LfgRoleCheckFailedNotViable = 800, + LfgReadyCheckFailed = 801, + LfgReadyCheckFailedTimeout = 802, + LfgGroupFull = 803, + LfgNoLfgObject = 804, + LfgNoSlotsPlayer = 805, + LfgNoSlotsParty = 806, + LfgNoSpec = 807, + LfgMismatchedSlots = 808, + LfgMismatchedSlotsLocalXrealm = 809, + LfgPartyPlayersFromDifferentRealms = 810, + LfgMembersNotPresent = 811, + LfgGetInfoTimeout = 812, + LfgInvalidSlot = 813, + LfgDeserterPlayer = 814, + LfgDeserterParty = 815, + LfgDead = 816, + LfgRandomCooldownPlayer = 817, + LfgRandomCooldownParty = 818, + LfgTooManyMembers = 819, + LfgTooFewMembers = 820, + LfgProposalFailed = 821, + LfgProposalDeclinedSelf = 822, + LfgProposalDeclinedParty = 823, + LfgNoSlotsSelected = 824, + LfgNoRolesSelected = 825, + LfgRoleCheckInitiated = 826, + LfgReadyCheckInitiated = 827, + LfgPlayerDeclinedRoleCheck = 828, + LfgPlayerDeclinedReadyCheck = 829, + LfgLorewalking = 830, + LfgJoinedQueue = 831, + LfgJoinedFlexQueue = 832, + LfgJoinedRfQueue = 833, + LfgJoinedScenarioQueue = 834, + LfgJoinedWorldPvpQueue = 835, + LfgJoinedBattlefieldQueue = 836, + LfgJoinedList = 837, + QueuedPlunderstorm = 838, + LfgLeftQueue = 839, + LfgLeftList = 840, + LfgRoleCheckAborted = 841, + LfgReadyCheckAborted = 842, + LfgCantUseBattleground = 843, + LfgCantUseDungeons = 844, + LfgReasonTooManyLfg = 845, + LfgFarmLimit = 846, + LfgNoCrossFactionParties = 847, + InvalidTeleportLocation = 848, + TooFarToInteract = 849, + BattlegroundPlayersFromDifferentRealms = 850, + DifficultyChangeCooldownS = 851, + DifficultyChangeCombatCooldownS = 852, + DifficultyChangeWorldstate = 853, + DifficultyChangeEncounter = 854, + DifficultyChangeCombat = 855, + DifficultyChangePlayerBusy = 856, + DifficultyChangePlayerOnVehicle = 857, + DifficultyChangeAlreadyStarted = 858, + DifficultyChangeOtherHeroicS = 859, + DifficultyChangeHeroicInstanceAlreadyRunning = 860, + ArenaTeamPartySize = 861, + SoloShuffleWargameGroupSize = 862, + SoloShuffleWargameGroupComp = 863, + SoloRbgWargameGroupSize = 864, + SoloRbgWargameGroupComp = 865, + SoloMinItemLevel = 866, + PvpPlayerAbandoned = 867, + BattlegroundJoinGroupQueueWithoutHealer = 868, + QuestForceRemovedS = 869, + AttackNoActions = 870, + InRandomBg = 871, + InNonRandomBg = 872, + BnFriendSelf = 873, + BnFriendAlready = 874, + BnFriendBlocked = 875, + BnFriendListFull = 876, + BnFriendRequestSent = 877, + BnBroadcastThrottle = 878, + BgDeveloperOnly = 879, + CurrencySpellSlotMismatch = 880, + CurrencyNotTradable = 881, + RequiresExpansionS = 882, + QuestFailedSpell = 883, + TalentFailedUnspentTalentPoints = 884, + TalentFailedNotEnoughTalentsInPrimaryTree = 885, + TalentFailedNoPrimaryTreeSelected = 886, + TalentFailedCantRemoveTalent = 887, + TalentFailedUnknown = 888, + TalentFailedInCombat = 889, + TalentFailedInPvpMatch = 890, + TalentFailedInMythicPlus = 891, + WargameRequestFailure = 892, + RankRequiresAuthenticator = 893, + GuildBankVoucherFailed = 894, + WargameRequestSent = 895, + RequiresAchievementI = 896, + RefundResultExceedMaxCurrency = 897, + CantBuyQuantity = 898, + ItemIsBattlePayLocked = 899, + PartyAlreadyInBattlegroundQueue = 900, + PartyConfirmingBattlegroundQueue = 901, + BattlefieldTeamPartySize = 902, + InsuffTrackedCurrencyIs = 903, + NotOnTournamentRealm = 904, + GuildTrialAccountTrial = 905, + GuildTrialAccountVeteran = 906, + GuildUndeletableDueToLevel = 907, + CantDoThatInAGroup = 908, + GuildLeaderReplaced = 909, + TransmogrifyCantEquip = 910, + TransmogrifyInvalidItemType = 911, + TransmogrifyNotSoulbound = 912, + TransmogrifyInvalidSource = 913, + TransmogrifyInvalidDestination = 914, + TransmogrifyMismatch = 915, + TransmogrifyLegendary = 916, + TransmogrifySameItem = 917, + TransmogrifySameAppearance = 918, + TransmogrifyNotEquipped = 919, + VoidDepositFull = 920, + VoidWithdrawFull = 921, + VoidStorageWrapped = 922, + VoidStorageStackable = 923, + VoidStorageUnbound = 924, + VoidStorageRepair = 925, + VoidStorageCharges = 926, + VoidStorageQuest = 927, + VoidStorageConjured = 928, + VoidStorageMail = 929, + VoidStorageBag = 930, + VoidTransferStorageFull = 931, + VoidTransferInvFull = 932, + VoidTransferInternalError = 933, + VoidTransferItemInvalid = 934, + DifficultyDisabledInLfg = 935, + VoidStorageUnique = 936, + VoidStorageLoot = 937, + VoidStorageHoliday = 938, + VoidStorageDuration = 939, + VoidStorageLoadFailed = 940, + VoidStorageInvalidItem = 941, + VoidStorageAccountItem = 942, + ParentalControlsChatMuted = 943, + SorStartExperienceIncomplete = 944, + SorInvalidEmail = 945, + SorInvalidComment = 946, + ChallengeModeResetCooldownS = 947, + ChallengeModeResetKeystone = 948, + PetJournalAlreadyInLoadout = 949, + ReportSubmittedSuccessfully = 950, + ReportSubmissionFailed = 951, + SuggestionSubmittedSuccessfully = 952, + BugSubmittedSuccessfully = 953, + ChallengeModeEnabled = 954, + ChallengeModeDisabled = 955, + PetbattleCreateFailed = 956, + PetbattleNotHere = 957, + PetbattleNotHereOnTransport = 958, + PetbattleNotHereUnevenGround = 959, + PetbattleNotHereObstructed = 960, + PetbattleNotWhileInCombat = 961, + PetbattleNotWhileDead = 962, + PetbattleNotWhileFlying = 963, + PetbattleTargetInvalid = 964, + PetbattleTargetOutOfRange = 965, + PetbattleTargetNotCapturable = 966, + PetbattleNotATrainer = 967, + PetbattleDeclined = 968, + PetbattleInBattle = 969, + PetbattleInvalidLoadout = 970, + PetbattleAllPetsDead = 971, + PetbattleNoPetsInSlots = 972, + PetbattleNoAccountLock = 973, + PetbattleWildPetTapped = 974, + PetbattleRestrictedAccount = 975, + PetbattleOpponentNotAvailable = 976, + PetbattleNotWhileInMatchedBattle = 977, + CantHaveMorePetsOfThatType = 978, + CantHaveMorePets = 979, + PvpMapNotFound = 980, + PvpMapNotSet = 981, + PetbattleQueueQueued = 982, + PetbattleQueueAlreadyQueued = 983, + PetbattleQueueJoinFailed = 984, + PetbattleQueueJournalLock = 985, + PetbattleQueueRemoved = 986, + PetbattleQueueProposalDeclined = 987, + PetbattleQueueProposalTimeout = 988, + PetbattleQueueOpponentDeclined = 989, + PetbattleQueueRequeuedInternal = 990, + PetbattleQueueRequeuedRemoved = 991, + PetbattleQueueSlotLocked = 992, + PetbattleQueueSlotEmpty = 993, + PetbattleQueueSlotNoTracker = 994, + PetbattleQueueSlotNoSpecies = 995, + PetbattleQueueSlotCantBattle = 996, + PetbattleQueueSlotRevoked = 997, + PetbattleQueueSlotDead = 998, + PetbattleQueueSlotNoPet = 999, + PetbattleQueueNotWhileNeutral = 1000, + PetbattleGameTimeLimitWarning = 1001, + PetbattleGameRoundsLimitWarning = 1002, + HasRestriction = 1003, + ItemUpgradeItemTooLowLevel = 1004, + ItemUpgradeNoPath = 1005, + ItemUpgradeNoMoreUpgrades = 1006, + BonusRollEmpty = 1007, + ChallengeModeFull = 1008, + ChallengeModeInProgress = 1009, + ChallengeModeIncorrectKeystone = 1010, + StartRestrictedChallengeMode = 1011, + BattletagFriendNotFound = 1012, + BattletagFriendNotValid = 1013, + BattletagFriendNotAllowed = 1014, + BattletagFriendThrottled = 1015, + BattletagFriendSuccess = 1016, + PetTooHighLevelToUncage = 1017, + PetbattleInternal = 1018, + CantCagePetYet = 1019, + NoLootInChallengeMode = 1020, + QuestPetBattleVictoriesPvpIi = 1021, + RoleCheckAlreadyInProgress = 1022, + RecruitAFriendAccountLimit = 1023, + RecruitAFriendFailed = 1024, + SetLootPersonal = 1025, + SetLootMethodFailedCombat = 1026, + ReagentBankFull = 1027, + ReagentBankLocked = 1028, + GarrisonBuildingExists = 1029, + GarrisonInvalidPlot = 1030, + GarrisonInvalidBuildingid = 1031, + GarrisonInvalidPlotBuilding = 1032, + GarrisonRequiresBlueprint = 1033, + GarrisonNotEnoughCurrency = 1034, + GarrisonNotEnoughGold = 1035, + GarrisonCompleteMissionWrongFollowerType = 1036, + AlreadyUsingLfgList = 1037, + RestrictedAccountLfgListTrial = 1038, + ToyUseLimitReached = 1039, + ToyAlreadyKnown = 1040, + TransmogSetAlreadyKnown = 1041, + NotEnoughCurrency = 1042, + SpecIsDisabled = 1043, + FeatureRestrictedTrial = 1044, + CantBeObliterated = 1045, + CantBeScrapped = 1046, + CantBeRecrafted = 1047, + ArtifactRelicDoesNotMatchArtifact = 1048, + MustEquipArtifact = 1049, + CantDoThatRightNow = 1050, + AffectingCombat = 1051, + EquipmentManagerCombatSwapS = 1052, + EquipmentManagerBagsFull = 1053, + EquipmentManagerMissingItemS = 1054, + MovieRecordingWarningPerf = 1055, + MovieRecordingWarningDiskFull = 1056, + MovieRecordingWarningNoMovie = 1057, + MovieRecordingWarningRequirements = 1058, + MovieRecordingWarningCompressing = 1059, + NoChallengeModeReward = 1060, + ClaimedChallengeModeReward = 1061, + ChallengeModePeriodResetSs = 1062, + CantDoThatChallengeModeActive = 1063, + TalentFailedRestArea = 1064, + CannotAbandonLastPet = 1065, + TestCvarSetSss = 1066, + QuestTurnInFailReason = 1067, + ClaimedChallengeModeRewardOld = 1068, + TalentGrantedByAura = 1069, + ChallengeModeAlreadyComplete = 1070, + GlyphTargetNotAvailable = 1071, + PvpWarmodeToggleOn = 1072, + PvpWarmodeToggleOff = 1073, + SpellFailedLevelRequirement = 1074, + SpellFailedCantFlyHere = 1075, + BattlegroundJoinRequiresLevel = 1076, + BattlegroundJoinDisqualified = 1077, + BattlegroundJoinDisqualifiedNoName = 1078, + VoiceChatGenericUnableToConnect = 1079, + VoiceChatServiceLost = 1080, + VoiceChatChannelNameTooShort = 1081, + VoiceChatChannelNameTooLong = 1082, + VoiceChatChannelAlreadyExists = 1083, + VoiceChatTargetNotFound = 1084, + VoiceChatTooManyRequests = 1085, + VoiceChatPlayerSilenced = 1086, + VoiceChatParentalDisableAll = 1087, + VoiceChatDisabled = 1088, + NoPvpReward = 1089, + ClaimedPvpReward = 1090, + AzeriteEssenceSelectionFailedEssenceNotUnlocked = 1091, + AzeriteEssenceSelectionFailedCantRemoveEssence = 1092, + AzeriteEssenceSelectionFailedConditionFailed = 1093, + AzeriteEssenceSelectionFailedRestArea = 1094, + AzeriteEssenceSelectionFailedSlotLocked = 1095, + AzeriteEssenceSelectionFailedNotAtForge = 1096, + AzeriteEssenceSelectionFailedHeartLevelTooLow = 1097, + AzeriteEssenceSelectionFailedNotEquipped = 1098, + SocketingGenericFailure = 1099, + SocketingRequiresPunchcardredGem = 1100, + SocketingPunchcardredGemOnlyInPunchcardredslot = 1101, + SocketingRequiresPunchcardyellowGem = 1102, + SocketingPunchcardyellowGemOnlyInPunchcardyellowslot = 1103, + SocketingRequiresPunchcardblueGem = 1104, + SocketingPunchcardblueGemOnlyInPunchcardblueslot = 1105, + SocketingRequiresDominationShard = 1106, + SocketingDominationShardOnlyInDominationslot = 1107, + SocketingRequiresCypherGem = 1108, + SocketingCypherGemOnlyInCypherslot = 1109, + SocketingRequiresTinkerGem = 1110, + SocketingTinkerGemOnlyInTinkerslot = 1111, + SocketingRequiresPrimordialGem = 1112, + SocketingPrimordialGemOnlyInPrimordialslot = 1113, + SocketingRequiresFragranceGem = 1114, + SocketingFragranceGemOnlyInFragranceslot = 1115, + SocketingRequiresSingingThunderGem = 1116, + SocketingSingingthunderGemOnlyInSingingthunderslot = 1117, + SocketingRequiresSingingSeaGem = 1118, + SocketingSingingseaGemOnlyInSingingseaslot = 1119, + SocketingRequiresSingingWindGem = 1120, + SocketingSingingwindGemOnlyInSingingwindslot = 1121, + SocketingRequiresFiberGem = 1122, + SocketingFiberGemOnlyInFiberslot = 1123, + LevelLinkingResultLinked = 1124, + LevelLinkingResultUnlinked = 1125, + ClubFinderErrorPostClub = 1126, + ClubFinderErrorApplyClub = 1127, + ClubFinderErrorRespondApplicant = 1128, + ClubFinderErrorCancelApplication = 1129, + ClubFinderErrorTypeAcceptApplication = 1130, + ClubFinderErrorTypeNoInvitePermissions = 1131, + ClubFinderErrorTypeNoPostingPermissions = 1132, + ClubFinderErrorTypeApplicantList = 1133, + ClubFinderErrorTypeApplicantListNoPerm = 1134, + ClubFinderErrorTypeFinderNotAvailable = 1135, + ClubFinderErrorTypeGetPostingIds = 1136, + ClubFinderErrorTypeJoinApplication = 1137, + ClubFinderErrorTypeRealmNotEligible = 1138, + ClubFinderErrorTypeFlaggedRename = 1139, + ClubFinderErrorTypeFlaggedDescriptionChange = 1140, + ItemInteractionNotEnoughGold = 1141, + ItemInteractionNotEnoughCurrency = 1142, + ItemInteractionNoConversionOutput = 1143, + PlayerChoiceErrorPendingChoice = 1144, + SoulbindInvalidConduit = 1145, + SoulbindInvalidConduitItem = 1146, + SoulbindInvalidTalent = 1147, + SoulbindDuplicateConduit = 1148, + ActivateSoulbindS = 1149, + ActivateSoulbindFailedRestArea = 1150, + CantUseProfanity = 1151, + NotInPetBattle = 1152, + NotInNpe = 1153, + NoSpec = 1154, + NoDominationshardOverwrite = 1155, + UseWeeklyRewardsDisabled = 1156, + CrossFactionGroupJoined = 1157, + CantTargetUnfriendlyInOverworld = 1158, + EquipablespellsSlotsFull = 1159, + ItemModAppearanceGroupAlreadyKnown = 1160, + CantBulkSellItemWithRefund = 1161, + NoSoulboundItemInAccountBank = 1162, + NoRefundableItemInAccountBank = 1163, + CantDeleteInAccountBank = 1164, + NoImmediateContainerInAccountBank = 1165, + NoOpenImmediateContainerInAccountBank = 1166, + CantTradeAccountItem = 1167, + NoAccountInventoryLock = 1168, + BankNotAccessible = 1169, + TooManyAccountBankTabs = 1170, + BankTabNotUnlocked = 1171, + AccountMoneyLocked = 1172, + BankTabInvalidName = 1173, + BankTabInvalidText = 1174, + CharacterBankNotConverted = 1175, + WowLabsPartyErrorTypePartyIsFull = 1176, + WowLabsPartyErrorTypeMaxInviteSent = 1177, + WowLabsPartyErrorTypePlayerAlreadyInvited = 1178, + WowLabsPartyErrorTypePartyInviteInvalid = 1179, + WowLabsLobbyMatchmakerErrorEnterQueueFailed = 1180, + WowLabsLobbyMatchmakerErrorLeaveQueueFailed = 1181, + WowLabsSetWowLabsAreaIdFailed = 1182, + PlunderstormCannotQueue = 1183, + TargetIsSelfFoundCannotTrade = 1184, + PlayerIsSelfFoundCannotTrade = 1185, + MailRecepientIsSelfFoundCannotReceiveMail = 1186, + PlayerIsSelfFoundCannotSendMail = 1187, + PlayerIsSelfFoundCannotUseAuctionHouse = 1188, + MailTargetCannotReceiveMail = 1189, + RemixInvalidTransferRequest = 1190, + CurrencyTransferInvalidCharacter = 1191, + CurrencyTransferInvalidCurrency = 1192, + CurrencyTransferInsufficientCurrency = 1193, + CurrencyTransferMaxQuantity = 1194, + CurrencyTransferNoValidSource = 1195, + CurrencyTransferCharacterLoggedIn = 1196, + CurrencyTransferServerError = 1197, + CurrencyTransferUnmetRequirements = 1198, + CurrencyTransferTransactionInProgress = 1199, + CurrencyTransferDisabled = 1200, } public enum SceneFlags diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 52bb99daa..6c6d78c42 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -651,6 +651,9 @@ namespace Framework.Constants Unk641 = 641, Unk642 = 642, ModRangedAttackSpeedFlat = 643, + Unk644 = 644, + Unk645 = 645, + Total } diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs index 364419ad0..3d54acd81 100644 --- a/Source/Framework/Constants/Spells/SpellConst.cs +++ b/Source/Framework/Constants/Spells/SpellConst.cs @@ -2671,6 +2671,10 @@ namespace Framework.Constants UiAction = 339, Unk340 = 340, LearnWarbanScene = 341, + Unk342 = 342, + Unk343 = 343, + Unk344 = 344, // some kind of teleport + AssistAction = 345, // MiscValue[0] = AssistActionType, MiscValue[1] = ID, depends on type TotalSpellEffects } diff --git a/Source/Framework/Database/DatabaseUpdater.cs b/Source/Framework/Database/DatabaseUpdater.cs index ae5e28609..399a669fc 100644 --- a/Source/Framework/Database/DatabaseUpdater.cs +++ b/Source/Framework/Database/DatabaseUpdater.cs @@ -37,10 +37,10 @@ namespace Framework.Database fileName = @"/sql/base/characters_database.sql"; break; case "WorldDatabase": - fileName = @"/sql/TDB_full_world_1115.25051_2025_05_31.sql"; + fileName = @"/sql/TDB_full_world_1117.25071_2025_07_21.sql"; break; case "HotfixDatabase": - fileName = @"/sql/TDB_full_hotfixes_1115.25051_2025_05_31.sql"; + fileName = @"/sql/TDB_full_hotfixes_1117.25071_2025_07_21.sql"; break; } diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 059bacf5c..ac7e10482 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -73,7 +73,7 @@ namespace Framework.Database PrepareStatement(CharStatements.INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)"); PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " + - "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " + + "bankSlots, bankTabs, bankBagFlags, restState, playerFlags, playerFlagsEx, " + "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " + "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, summonedPetNumber, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + @@ -451,14 +451,14 @@ namespace Framework.Database // Player saving PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, inventoryBagFlags, bagSlotFlags1, bagSlotFlags2, bagSlotFlags3, bagSlotFlags4, bagSlotFlags5, " + - "bankSlots, bankBagFlags, bankBagSlotFlags1, bankBagSlotFlags2, bankBagSlotFlags3, bankBagSlotFlags4, bankBagSlotFlags5, bankBagSlotFlags6, bankBagSlotFlags7, restState, playerFlags, playerFlagsEx, " + + "bankSlots, bankTabs, bankBagFlags, restState, playerFlags, playerFlagsEx, " + "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " + "taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " + "extra_flags, summonedPetNumber, at_login, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " + "power4, power5, power6, power7, power8, power9, power10, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " + - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,inventoryBagFlags=?,bagSlotFlags1=?,bagSlotFlags2=?,bagSlotFlags3=?,bagSlotFlags4=?,bagSlotFlags5=?," + - "bankSlots=?,bankBagFlags=?,bankBagSlotFlags1=?,bankBagSlotFlags2=?,bankBagSlotFlags3=?,bankBagSlotFlags4=?,bankBagSlotFlags5=?,bankBagSlotFlags6=?,bankBagSlotFlags7=?,restState=?,playerFlags=?,playerFlagsEx=?," + + "bankSlots=?,bankTabs=?,bankBagFlags=?,restState=?,playerFlags=?,playerFlagsEx=?," + "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," + "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,summonedPetNumber=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," + @@ -654,12 +654,6 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHAR_TRAIT_CONFIGS, "DELETE FROM character_trait_config WHERE guid = ? AND traitConfigId = ?"); PrepareStatement(CharStatements.DEL_CHAR_TRAIT_CONFIGS_BY_CHAR, "DELETE FROM character_trait_config WHERE guid = ?"); - // Void Storage - PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?"); - PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?"); - PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?"); - // CompactUnitFrame profiles PrepareStatement(CharStatements.SEL_CHAR_CUF_PROFILES, "SELECT id, name, frameHeight, frameWidth, sortBy, healthText, boolOptions, topPoint, bottomPoint, leftPoint, topOffset, bottomOffset, leftOffset FROM character_cuf_profiles WHERE guid = ?"); PrepareStatement(CharStatements.REP_CHAR_CUF_PROFILES, "REPLACE INTO character_cuf_profiles (guid, id, name, frameHeight, frameWidth, sortBy, healthText, boolOptions, topPoint, bottomPoint, leftPoint, topOffset, bottomOffset, leftOffset) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); @@ -769,11 +763,17 @@ namespace Framework.Database PrepareStatement(CharStatements.INS_INSTANCE, "INSERT INTO instance (instanceId, data, completedEncountersMask, entranceWorldSafeLocId) VALUES (?, ?, ?, ?)"); PrepareStatement(CharStatements.SEL_PLAYER_DATA_ELEMENTS_CHARACTER, "SELECT playerDataElementCharacterId, floatValue, int64Value FROM character_player_data_element WHERE characterGuid = ?"); + PrepareStatement(CharStatements.DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID, "DELETE FROM character_player_data_element WHERE characterGuid = ?"); PrepareStatement(CharStatements.DEL_PLAYER_DATA_ELEMENTS_CHARACTER, "DELETE FROM character_player_data_element WHERE characterGuid = ? AND playerDataElementCharacterId = ?"); PrepareStatement(CharStatements.INS_PLAYER_DATA_ELEMENTS_CHARACTER, "INSERT INTO character_player_data_element (characterGuid, playerDataElementCharacterId, floatValue, int64Value) VALUES (?, ?, ?, ?)"); PrepareStatement(CharStatements.SEL_PLAYER_DATA_FLAGS_CHARACTER, "SELECT storageIndex, mask FROM character_player_data_flag WHERE characterGuid = ?"); + PrepareStatement(CharStatements.DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID, "DELETE FROM character_player_data_flag WHERE characterGuid = ?"); PrepareStatement(CharStatements.DEL_PLAYER_DATA_FLAGS_CHARACTER, "DELETE FROM character_player_data_flag WHERE characterGuid = ? AND storageIndex = ?"); PrepareStatement(CharStatements.INS_PLAYER_DATA_FLAGS_CHARACTER, "INSERT INTO character_player_data_flag (characterGuid, storageIndex, mask) VALUES (?, ?, ?)"); + + PrepareStatement(CharStatements.SEL_CHARACTER_BANK_TAB_SETTINGS, "SELECT tabId, name, icon, description, depositFlags FROM character_bank_tab_settings WHERE characterGuid = ?"); + PrepareStatement(CharStatements.DEL_CHARACTER_BANK_TAB_SETTINGS, "DELETE FROM character_bank_tab_settings WHERE characterGuid = ?"); + PrepareStatement(CharStatements.INS_CHARACTER_BANK_TAB_SETTINGS, "INSERT INTO character_bank_tab_settings (characterGuid, tabId, name, icon, description, depositFlags) VALUES (?, ?, ?, ?, ?, ?)"); } } @@ -1301,11 +1301,6 @@ namespace Framework.Database DEL_CHAR_TRAIT_CONFIGS, DEL_CHAR_TRAIT_CONFIGS_BY_CHAR, - SEL_CHAR_VOID_STORAGE, - REP_CHAR_VOID_STORAGE_ITEM, - DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, - DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, - SEL_CHAR_CUF_PROFILES, REP_CHAR_CUF_PROFILES, DEL_CHAR_CUF_PROFILES_BY_ID, @@ -1403,12 +1398,18 @@ namespace Framework.Database INS_INSTANCE, SEL_PLAYER_DATA_ELEMENTS_CHARACTER, + DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID, DEL_PLAYER_DATA_ELEMENTS_CHARACTER, INS_PLAYER_DATA_ELEMENTS_CHARACTER, SEL_PLAYER_DATA_FLAGS_CHARACTER, + DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID, DEL_PLAYER_DATA_FLAGS_CHARACTER, INS_PLAYER_DATA_FLAGS_CHARACTER, + SEL_CHARACTER_BANK_TAB_SETTINGS, + DEL_CHARACTER_BANK_TAB_SETTINGS, + INS_CHARACTER_BANK_TAB_SETTINGS, + MAX_CHARACTERDATABASE_STATEMENTS } } diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index 0961a0fa7..eb1759369 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -164,8 +164,9 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_AZERITE_UNLOCK_MAPPING, "SELECT ID, ItemLevel, ItemBonusListHead, ItemBonusListShoulders, ItemBonusListChest, " + "AzeriteUnlockMappingSetID FROM azerite_unlock_mapping WHERE (`VerifiedBuild` > 0) = ?"); - // BankBagSlotPrices.db2 - PrepareStatement(HotfixStatements.SEL_BANK_BAG_SLOT_PRICES, "SELECT ID, Cost FROM bank_bag_slot_prices WHERE (`VerifiedBuild` > 0) = ?"); + // BankTab.db2 + PrepareStatement(HotfixStatements.SEL_BANK_TAB, "SELECT ID, Cost, BankType, OrderIndex, PlayerConditionID, PurchasePromptTitle, PurchasePromptBody, " + + "PurchasePromptConfirmation, TabCleanupConfirmation, TabNameEditBoxHeader FROM bank_tab WHERE (`VerifiedBuild` > 0) = ?"); // BannedAddons.db2 PrepareStatement(HotfixStatements.SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons WHERE (`VerifiedBuild` > 0) = ?"); @@ -222,8 +223,8 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CFG_CATEGORIES_LOCALE, "SELECT ID, Name_lang FROM cfg_categories_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // CfgRegions.db2 - PrepareStatement(HotfixStatements.SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions" + - " WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin, TimeEventRegionGroupID" + + " FROM cfg_regions WHERE (`VerifiedBuild` > 0) = ?"); // ChallengeModeItemBonusOverride.db2 PrepareStatement(HotfixStatements.SEL_CHALLENGE_MODE_ITEM_BONUS_OVERRIDE, "SELECT ID, ItemBonusTreeGroupID, DstItemBonusTreeID, Value, " + @@ -259,12 +260,12 @@ namespace Framework.Database // ChrClasses.db2 PrepareStatement(HotfixStatements.SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, Description, RoleInfoString, DisabledString, " + "HyphenatedNameMale, HyphenatedNameFemale, CreateScreenFileDataID, SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, Flags, " + - "SpellTextureBlobFileDataID, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " + + "StartingLevel, SpellTextureBlobFileDataID, ArmorTypeMask, CharStartKitUnknown901, MaleCharacterCreationVisualFallback, " + "MaleCharacterCreationIdleVisualFallback, FemaleCharacterCreationVisualFallback, FemaleCharacterCreationIdleVisualFallback, " + "CharacterCreationIdleGroundVisualFallback, CharacterCreationGroundVisualFallback, AlteredFormCharacterCreationIdleVisualFallback, " + - "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, ID, PrimaryStatPriority, DisplayPower, " + - "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ClassColorR, ClassColorG, ClassColorB, RolesMask" + - " FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?"); + "CharacterCreationAnimLoopWaitTimeMsFallback, CinematicSequenceID, DefaultSpec, ID, HasStrengthBonus, PrimaryStatPriority, DisplayPower, " + + "RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet, ClassColorR, ClassColorG, ClassColorB, RolesMask, " + + "DamageBonusStat, HasRelicSlot FROM chr_classes WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_LOCALE, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang, Description_lang, RoleInfoString_lang, " + "DisabledString_lang, HyphenatedNameMale_lang, HyphenatedNameFemale_lang FROM chr_classes_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?"); @@ -391,7 +392,7 @@ namespace Framework.Database // CreatureFamily.db2 PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " + - "IconFileID, SkillLine1, SkillLine2 FROM creature_family WHERE (`VerifiedBuild` > 0) = ?"); + "CategoryEnumID, IconFileID, SkillLine1, SkillLine2 FROM creature_family WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_CREATURE_FAMILY_LOCALE, "SELECT ID, Name_lang FROM creature_family_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // CreatureLabel.db2 @@ -482,7 +483,7 @@ namespace Framework.Database // ExpectedStat.db2 PrepareStatement(HotfixStatements.SEL_EXPECTED_STAT, "SELECT ID, ExpansionID, CreatureHealth, PlayerHealth, CreatureAutoAttackDps, CreatureArmor, " + - "PlayerMana, PlayerPrimaryStat, PlayerSecondaryStat, ArmorConstant, CreatureSpellDamage, Lvl FROM expected_stat" + + "PlayerMana, PlayerPrimaryStat, PlayerSecondaryStat, ArmorConstant, CreatureSpellDamage, ContentSetID, Lvl FROM expected_stat" + " WHERE (`VerifiedBuild` > 0) = ?"); // ExpectedStatMod.db2 @@ -818,7 +819,7 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_ITEM_SET_LOCALE, "SELECT ID, Name_lang FROM item_set_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // ItemSetSpell.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, Threshold, ItemSetID FROM item_set_spell" + + PrepareStatement(HotfixStatements.SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, TraitSubTreeID, Threshold, ItemSetID FROM item_set_spell" + " WHERE (`VerifiedBuild` > 0) = ?"); // ItemSparse.db2 @@ -937,7 +938,9 @@ namespace Framework.Database // MapChallengeMode.db2 PrepareStatement(HotfixStatements.SEL_MAP_CHALLENGE_MODE, "SELECT Name, ID, MapID, Flags, ExpansionLevel, RequiredWorldStateID, CriteriaCount1, " + - "CriteriaCount2, CriteriaCount3 FROM map_challenge_mode WHERE (`VerifiedBuild` > 0) = ?"); + "CriteriaCount2, CriteriaCount3, FirstRewardQuestID1, FirstRewardQuestID2, FirstRewardQuestID3, FirstRewardQuestID4, FirstRewardQuestID5, " + + "FirstRewardQuestID6, RewardQuestID1, RewardQuestID2, RewardQuestID3, RewardQuestID4, RewardQuestID5, RewardQuestID6 FROM map_challenge_mode" + + " WHERE (`VerifiedBuild` > 0) = ?"); PrepareStatement(HotfixStatements.SEL_MAP_CHALLENGE_MODE_LOCALE, "SELECT ID, Name_lang FROM map_challenge_mode_locale WHERE (`VerifiedBuild` > 0) = ?" + " AND locale = ?"); @@ -1407,8 +1410,9 @@ namespace Framework.Database " FROM spell_visual_effect_name WHERE (`VerifiedBuild` > 0) = ?"); // SpellVisualKit.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_KIT, "SELECT ID, ClutterLevel, FallbackSpellVisualKitId, DelayMin, DelayMax, Flags1, Flags2" + - " FROM spell_visual_kit WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_KIT, "SELECT ID, ClutterLevel, FallbackSpellVisualKitId, DelayMin, DelayMax, " + + "MinimumSpellVisualDensityFilterType, MinimumSpellVisualDensityFilterParam, ReducedSpellVisualDensityFilterType, " + + "ReducedSpellVisualDensityFilterParam, Flags1, Flags2 FROM spell_visual_kit WHERE (`VerifiedBuild` > 0) = ?"); // SpellVisualMissile.db2 PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_MISSILE, "SELECT CastOffset1, CastOffset2, CastOffset3, ImpactOffset1, ImpactOffset2, ImpactOffset3, ID, " + @@ -1648,11 +1652,10 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_VIGNETTE_LOCALE, "SELECT ID, Name_lang FROM vignette_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); // WarbandScene.db2 - PrepareStatement(HotfixStatements.SEL_WARBAND_SCENE, "SELECT Name, Description, Source, PositionX, PositionY, PositionZ, LookAtX, LookAtY, LookAtZ, ID, " + - "MapID, Fov, TimeOfDay, Flags, SoundAmbienceID, Quality, TextureKit, DefaultScenePriority, SourceType FROM warband_scene" + - " WHERE (`VerifiedBuild` > 0) = ?"); - PrepareStatement(HotfixStatements.SEL_WARBAND_SCENE_LOCALE, "SELECT ID, Name_lang, Description_lang, Source_lang FROM warband_scene_locale" + - " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?"); + PrepareStatement(HotfixStatements.SEL_WARBAND_SCENE, "SELECT Name, Description, PositionX, PositionY, PositionZ, LookAtX, LookAtY, LookAtZ, ID, MapID, Fov, " + + "TimeOfDay, Flags, SoundAmbienceID, Quality, TextureKit, DefaultScenePriority FROM warband_scene WHERE (`VerifiedBuild` > 0) = ?"); + PrepareStatement(HotfixStatements.SEL_WARBAND_SCENE_LOCALE, "SELECT ID, Name_lang, Description_lang FROM warband_scene_locale WHERE (`VerifiedBuild` > 0) = ?" + + " AND locale = ?"); // WmoAreaTable.db2 PrepareStatement(HotfixStatements.SEL_WMO_AREA_TABLE, "SELECT AreaName, ID, WmoID, NameSetID, WmoGroupID, SoundProviderPref, SoundProviderPrefUnderwater, " + @@ -1759,7 +1762,7 @@ namespace Framework.Database SEL_AZERITE_UNLOCK_MAPPING, - SEL_BANK_BAG_SLOT_PRICES, + SEL_BANK_TAB, SEL_BANNED_ADDONS, diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index eceb055d9..950c737c4 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -379,6 +379,19 @@ namespace Game.Achievements case CriteriaType.GuildAttainedLevel: SetCriteriaProgress(criteria, miscValue1, referencePlayer); break; + case CriteriaType.BankTabPurchased: + switch ((BankType)criteria.Entry.Asset) + { + case BankType.Character: + SetCriteriaProgress(criteria, referencePlayer.GetCharacterBankTabCount(), referencePlayer); + break; + case BankType.Account: + SetCriteriaProgress(criteria, referencePlayer.GetAccountBankTabCount(), referencePlayer); + break; + default: + break; + } + break; // FIXME: not triggered in code as result, need to implement case CriteriaType.RunInstance: case CriteriaType.EarnTeamArenaRating: @@ -825,6 +838,7 @@ namespace Game.Achievements case CriteriaType.SellItemsToVendors: case CriteriaType.GainLevels: case CriteriaType.ReachRenownLevel: + case CriteriaType.BankTabPurchased: case CriteriaType.LearnTaxiNode: return progress.Counter >= requiredAmount; case CriteriaType.EarnAchievement: @@ -1246,6 +1260,10 @@ namespace Game.Achievements if (!referencePlayer.IsMaxLevel()) return false; break; + case CriteriaType.BankTabPurchased: + if (miscValue1 != 0 /*allow any at login*/ && miscValue1 != criteria.Entry.Asset) + return false; + break; case CriteriaType.LearnTaxiNode: if (miscValue1 != criteria.Entry.Asset) return false; @@ -4180,7 +4198,7 @@ namespace Game.Achievements //CriteriaType.MythicPlusRatingAttained, /*NYI*/ //CriteriaType.MythicPlusDisplaySeasonEnded, /*NYI*/ //CriteriaType.CompleteTrackingQuest, /*NYI*/ - //CriteriaType.WarbandBankTabPurchased, /*NYI*/ + CriteriaType.BankTabPurchased, CriteriaType.LearnTaxiNode, CriteriaType.EarnAchievementPoints, CriteriaType.BattlePetAchievementPointsEarned, diff --git a/Source/Game/Chat/Commands/ListCommands.cs b/Source/Game/Chat/Commands/ListCommands.cs index 01aaf964a..0109f5daa 100644 --- a/Source/Game/Chat/Commands/ListCommands.cs +++ b/Source/Game/Chat/Commands/ListCommands.cs @@ -126,8 +126,6 @@ namespace Game.Chat.Commands itemPos = "[equipped]"; else if (Player.IsInventoryPos((byte)itemBag, itemSlot)) itemPos = "[in inventory]"; - else if (Player.IsReagentBankPos((byte)itemBag, itemSlot)) - itemPos = "[in reagent bank]"; else if (Player.IsBankPos((byte)itemBag, itemSlot)) itemPos = "[in bank]"; else diff --git a/Source/Game/DataStorage/AreaTriggerDataStorage.cs b/Source/Game/DataStorage/AreaTriggerDataStorage.cs index 2087fb013..0005b9d80 100644 --- a/Source/Game/DataStorage/AreaTriggerDataStorage.cs +++ b/Source/Game/DataStorage/AreaTriggerDataStorage.cs @@ -226,8 +226,8 @@ namespace Game.DataStorage Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger create properties. DB table `areatrigger_create_properties` is empty."); } - // 0 1 2 3 4 5 6 7 8 - SQLResult circularMovementInfos = DB.World.Query("SELECT AreaTriggerCreatePropertiesId, IsCustom, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit`"); + // 0 1 2 3 4 5 6 7 8 + SQLResult circularMovementInfos = DB.World.Query("SELECT AreaTriggerCreatePropertiesId, IsCustom, ExtraTimeForBlending, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit`"); if (!circularMovementInfos.IsEmpty()) { do @@ -243,7 +243,7 @@ namespace Game.DataStorage AreaTriggerOrbitInfo orbitInfo = new(); - orbitInfo.StartDelay = circularMovementInfos.Read(2); + orbitInfo.ExtraTimeForBlending = circularMovementInfos.Read(2); float ValidateAndSetFloat(float value) { diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 7d07b12af..e431d5192 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -83,7 +83,7 @@ namespace Game.DataStorage AzeriteTierUnlockStorage = ReadDB2("AzeriteTierUnlock.db2", HotfixStatements.SEL_AZERITE_TIER_UNLOCK); AzeriteTierUnlockSetStorage = ReadDB2("AzeriteTierUnlockSet.db2", HotfixStatements.SEL_AZERITE_TIER_UNLOCK_SET); AzeriteUnlockMappingStorage = ReadDB2("AzeriteUnlockMapping.db2", HotfixStatements.SEL_AZERITE_UNLOCK_MAPPING); - BankBagSlotPricesStorage = ReadDB2("BankBagSlotPrices.db2", HotfixStatements.SEL_BANK_BAG_SLOT_PRICES); + BankTabStorage = ReadDB2("BankTab.db2", HotfixStatements.SEL_BANK_TAB); BannedAddOnsStorage = ReadDB2("BannedAddons.db2", HotfixStatements.SEL_BANNED_ADDONS); BarberShopStyleStorage = ReadDB2("BarberShopStyle.db2", HotfixStatements.SEL_BARBER_SHOP_STYLE, HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE); BattlePetBreedQualityStorage = ReadDB2("BattlePetBreedQuality.db2", HotfixStatements.SEL_BATTLE_PET_BREED_QUALITY); @@ -403,14 +403,16 @@ namespace Game.DataStorage WorldStateExpressionStorage = ReadDB2("WorldStateExpression.db2", HotfixStatements.SEL_WORLD_STATE_EXPRESSION); // Check loaded DB2 files proper version - if (!AreaTableStorage.ContainsKey(16108) || // last area added in 11.0.7 (58162) - !CharTitlesStorage.ContainsKey(876) || // last char title added in 11.0.7 (58162) + if (!AreaTableStorage.ContainsKey(16579) || // last area added in 11.2.0 (62213) + !CharTitlesStorage.ContainsKey(937) || // last char title added in 11.2.0 (62213) !FlightCapabilityStorage.ContainsKey(1) || // default flight capability (required) - !GemPropertiesStorage.ContainsKey(4266) || // last gem property added in 11.0.7 (58162) - !ItemStorage.ContainsKey(235551) || // last item added in 11.0.7 (58162) - !ItemExtendedCostStorage.ContainsKey(9918) || // last item extended cost added in 11.0.7 (58162) - !MapStorage.ContainsKey(2829) || // last map added in 11.0.7 (58162) - !SpellNameStorage.ContainsKey(1218101)) // last spell added in 11.0.7 (58162) + !GemPropertiesStorage.ContainsKey(4287) || // last gem property added in 11.2.0 (62213) + !ItemStorage.ContainsKey(252009) || // last item added in 11.2.0 (62213) + !ItemSparseStorage.ContainsKey(208392) || + !ItemSparseStorage.ContainsKey(242709) || + !ItemExtendedCostStorage.ContainsKey(10637) || // last item extended cost added in 11.2.0 (62213) + !MapStorage.ContainsKey(2951) || // last map added in 11.2.0 (62213) + !SpellNameStorage.ContainsKey(1254022)) // last spell added in 11.2.0 (62213) { Log.outFatal(LogFilter.ServerLoading, "You have _outdated_ DB2 files. Please extract correct versions from current using client."); Environment.Exit(1); @@ -487,7 +489,7 @@ namespace Game.DataStorage public static DB6Storage AzeriteTierUnlockStorage; public static DB6Storage AzeriteTierUnlockSetStorage; public static DB6Storage AzeriteUnlockMappingStorage; - public static DB6Storage BankBagSlotPricesStorage; + public static DB6Storage BankTabStorage; public static DB6Storage BannedAddOnsStorage; public static DB6Storage BarberShopStyleStorage; public static DB6Storage BattlePetBreedQualityStorage; diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs index 4704afdc8..158257225 100644 --- a/Source/Game/DataStorage/Structs/A_Records.cs +++ b/Source/Game/DataStorage/Structs/A_Records.cs @@ -84,7 +84,7 @@ namespace Game.DataStorage { public uint Id; public ushort Fallback; - public byte BehaviorTier; + public sbyte BehaviorTier; public short BehaviorID; public int[] Flags = new int[2]; } diff --git a/Source/Game/DataStorage/Structs/B_Records.cs b/Source/Game/DataStorage/Structs/B_Records.cs index 283b3704a..d515c691c 100644 --- a/Source/Game/DataStorage/Structs/B_Records.cs +++ b/Source/Game/DataStorage/Structs/B_Records.cs @@ -5,10 +5,18 @@ using Framework.Constants; namespace Game.DataStorage { - public sealed class BankBagSlotPricesRecord + public sealed class BankTabRecord { public uint Id; - public uint Cost; + public ulong Cost; + public byte BankType; + public sbyte OrderIndex; + public int PlayerConditionID; + public int PurchasePromptTitle; + public int PurchasePromptBody; + public int PurchasePromptConfirmation; + public int TabCleanupConfirmation; + public int TabNameEditBoxHeader; } public sealed class BannedAddonsRecord @@ -16,7 +24,7 @@ namespace Game.DataStorage public uint Id; public string Name; public string Version; - public byte Flags; + public int Flags; } public sealed class BarberShopStyleRecord @@ -63,7 +71,7 @@ namespace Game.DataStorage public int CovenantID; public bool HasFlag(BattlePetSpeciesFlags battlePetSpeciesFlags) { return (Flags & (int)battlePetSpeciesFlags) != 0; } -} + } public sealed class BattlePetSpeciesStateRecord { diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index 785d88929..23aa57eea 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -29,6 +29,7 @@ namespace Game.DataStorage public uint Raidorigin; // Date of first raid reset, all other resets are calculated as this date plus interval public byte RegionGroupMask; public uint ChallengeOrigin; + public int TimeEventRegionGroupID; } public sealed class ChallengeModeItemBonusOverrideRecord @@ -56,7 +57,7 @@ namespace Game.DataStorage public LocalizedString Name; public LocalizedString Name1; public ushort MaskID; - public sbyte Flags; + public int Flags; } public sealed class CharacterLoadoutRecord @@ -115,6 +116,7 @@ namespace Game.DataStorage public uint IconFileDataID; public uint LowResScreenFileDataID; public int Flags; + public int StartingLevel; public uint SpellTextureBlobFileDataID; public uint ArmorTypeMask; public int CharStartKitUnknown901; @@ -129,6 +131,7 @@ namespace Game.DataStorage public ushort CinematicSequenceID; public ushort DefaultSpec; public uint Id; + public byte HasStrengthBonus; public sbyte PrimaryStatPriority; public PowerType DisplayPower; public byte RangedAttackPowerPerAgility; @@ -139,6 +142,8 @@ namespace Game.DataStorage public byte ClassColorG; public byte ClassColorB; public byte RolesMask; + public byte DamageBonusStat; + public byte HasRelicSlot; } public sealed class ChrClassesXPowerTypesRecord @@ -506,6 +511,7 @@ namespace Game.DataStorage public sbyte MaxScaleLevel; public ushort PetFoodMask; public sbyte PetTalentType; + public int CategoryEnumID; public int IconFileID; public short[] SkillLine = new short[2]; } diff --git a/Source/Game/DataStorage/Structs/E_Records.cs b/Source/Game/DataStorage/Structs/E_Records.cs index 39fca53a7..7ad9707d2 100644 --- a/Source/Game/DataStorage/Structs/E_Records.cs +++ b/Source/Game/DataStorage/Structs/E_Records.cs @@ -47,6 +47,7 @@ namespace Game.DataStorage public float PlayerSecondaryStat; public float ArmorConstant; public float CreatureSpellDamage; + public int ContentSetID; public uint Lvl; } diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs index 84e21b32f..bc5988475 100644 --- a/Source/Game/DataStorage/Structs/I_Records.cs +++ b/Source/Game/DataStorage/Structs/I_Records.cs @@ -349,6 +349,7 @@ namespace Game.DataStorage public uint Id; public ushort ChrSpecID; public uint SpellID; + public ushort TraitSubTreeID; public byte Threshold; public uint ItemSetID; } diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs index 82981836d..9af7b9e3b 100644 --- a/Source/Game/DataStorage/Structs/M_Records.cs +++ b/Source/Game/DataStorage/Structs/M_Records.cs @@ -87,6 +87,7 @@ namespace Game.DataStorage case 1643: case 2222: case 2444: + case 2601: return true; default: return false; @@ -114,10 +115,12 @@ namespace Game.DataStorage public LocalizedString Name; public uint Id; public ushort MapID; - public byte Flags; + public int Flags; public uint ExpansionLevel; public int RequiredWorldStateID; // maybe? public short[] CriteriaCount = new short[3]; + public int[] FirstRewardQuestID = new int[6]; + public int[] RewardQuestID = new int[6]; } public sealed class MapDifficultyRecord diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs index 555de0d40..5e97690af 100644 --- a/Source/Game/DataStorage/Structs/S_Records.cs +++ b/Source/Game/DataStorage/Structs/S_Records.cs @@ -258,8 +258,8 @@ namespace Game.DataStorage public uint Id; public string Name; public int Flags; - public byte UsesPerWeek; - public byte MaxCharges; + public int UsesPerWeek; + public int MaxCharges; public int ChargeRecoveryTime; public int TypeMask; @@ -346,7 +346,7 @@ namespace Game.DataStorage { public uint Id; public uint SpellID; - public sbyte EquippedItemClass; + public int EquippedItemClass; public int EquippedItemInvTypes; public int EquippedItemSubclass; } @@ -658,6 +658,10 @@ namespace Game.DataStorage public int FallbackSpellVisualKitId; public ushort DelayMin; public ushort DelayMax; + public int MinimumSpellVisualDensityFilterType; + public int MinimumSpellVisualDensityFilterParam; + public int ReducedSpellVisualDensityFilterType; + public int ReducedSpellVisualDensityFilterParam; public int[] Flags = new int[2]; } diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs index 57405b3b1..ab9a42749 100644 --- a/Source/Game/DataStorage/Structs/U_Records.cs +++ b/Source/Game/DataStorage/Structs/U_Records.cs @@ -109,7 +109,7 @@ namespace Game.DataStorage public float RegenerationPeace; public float RegenerationCombat; public byte BarType; - public ushort Flags; + public int Flags; public float StartInset; public float EndInset; public uint[] FileDataID = new uint[6]; diff --git a/Source/Game/DataStorage/Structs/W_Records.cs b/Source/Game/DataStorage/Structs/W_Records.cs index 8a642b6b2..90dc15a00 100644 --- a/Source/Game/DataStorage/Structs/W_Records.cs +++ b/Source/Game/DataStorage/Structs/W_Records.cs @@ -10,7 +10,6 @@ namespace Game.DataStorage { public LocalizedString Name; public LocalizedString Description; - public LocalizedString Source; public Vector3 Position; public Vector3 LookAt; public uint Id; @@ -22,7 +21,6 @@ namespace Game.DataStorage public sbyte Quality; public int TextureKit; public int DefaultScenePriority; - public sbyte SourceType; public WarbandSceneFlags GetFlags() { return (WarbandSceneFlags)Flags; } } diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index c2c2165da..cfd332df6 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -26,7 +26,6 @@ namespace Game.Entities ObjectTypeId = TypeId.AreaTrigger; m_updateFlag.Stationary = true; - m_updateFlag.AreaTrigger = true; m_entityFragments.Add(EntityFragment.Tag_AreaTrigger, false); @@ -119,7 +118,7 @@ namespace Game.Entities SetObjectScale(1.0f); SetDuration(duration); - _shape = GetCreateProperties().Shape; + SetShape(GetCreateProperties().Shape); var areaTriggerData = m_values.ModifyValue(m_areaTriggerData); if (caster != null) @@ -176,6 +175,35 @@ namespace Game.Entities if (GetCreateProperties() != null && GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.VisualAnimIsDecay)) SetUpdateFieldValue(visualAnim.ModifyValue(visualAnim.IsDecay), true); + AreaTriggerFieldFlags fieldFlags() + { + var flags = GetCreateProperties().Flags; + AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags.None; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation)) + fieldFlags |= AreaTriggerFieldFlags.AbsoluteOrientation; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasDynamicShape)) + fieldFlags |= AreaTriggerFieldFlags.DynamicShape; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAttached)) + fieldFlags |= AreaTriggerFieldFlags.Attached; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasFaceMovementDir)) + fieldFlags |= AreaTriggerFieldFlags.FaceMovementDir; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasFollowsTerrain)) + fieldFlags |= AreaTriggerFieldFlags.FollowsTerrain; + if (flags.HasFlag(AreaTriggerCreatePropertiesFlag.AlwaysExterior)) + fieldFlags |= AreaTriggerFieldFlags.AlwaysExterior; + return fieldFlags; + } + ; + ReplaceAllAreaTriggerFlags(fieldFlags()); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.MovementStartTime), GameTime.GetGameTimeMS()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.CreationTime), GameTime.GetGameTimeMS()); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ScaleCurveId), GetCreateProperties().ScaleCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.FacingCurveId), GetCreateProperties().FacingCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.MorphCurveId), GetCreateProperties().MorphCurveId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.MoveCurveId), GetCreateProperties().MoveCurveId); + if (caster != null) PhasingHandler.InheritPhaseShift(this, caster); else if (IsStaticSpawn() && spawnData != null) @@ -184,7 +212,7 @@ namespace Game.Entities PhasingHandler.InitDbPhaseShift(GetPhaseShift(), spawnData.PhaseUseFlags, spawnData.PhaseId, spawnData.PhaseGroup); } - if (target != null && GetCreateProperties() != null && GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAttached)) + if (target != null && HasAreaTriggerFlag(AreaTriggerFieldFlags.Attached)) m_movementInfo.transport.guid = target.GetGUID(); if (!IsStaticSpawn()) @@ -195,7 +223,7 @@ namespace Game.Entities if (GetCreateProperties().OrbitInfo != null) { AreaTriggerOrbitInfo orbit = GetCreateProperties().OrbitInfo; - if (target != null && GetCreateProperties() != null && GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAttached)) + if (target != null && HasAreaTriggerFlag(AreaTriggerFieldFlags.Attached)) orbit.PathTarget = target.GetGUID(); else orbit.Center = new(pos.posX, pos.posY, pos.posZ); @@ -206,6 +234,10 @@ namespace Game.Entities { InitSplineOffsets(GetCreateProperties().SplinePoints); } + else + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)AreaTriggerPathType.None); + + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.Facing), _stationaryPosition.GetOrientation()); // movement on transport of areatriggers on unit is handled by themself ITransport transport = null; @@ -280,7 +312,6 @@ namespace Game.Entities public override void Update(uint diff) { base.Update(diff); - _timeSinceCreated += diff; if (!IsStaticSpawn()) { @@ -291,19 +322,18 @@ namespace Game.Entities } else if (HasOrbit()) { - UpdateOrbitPosition(diff); + UpdateOrbitPosition(); } - else if (GetCreateProperties() != null && GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAttached)) + else if (HasAreaTriggerFlag(AreaTriggerFieldFlags.Attached)) { Unit target = GetTarget(); if (target != null) { float orientation = 0.0f; - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.FacingCurveId != 0) - orientation = Global.DB2Mgr.GetCurveValueAt(createProperties.FacingCurveId, GetProgress()); + if (m_areaTriggerData.FacingCurveId != 0) + orientation = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.FacingCurveId, GetProgress()); - if (GetCreateProperties() == null || !GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.AbsoluteOrientation)) orientation += target.GetOrientation(); GetMap().AreaTriggerRelocation(this, target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), orientation); @@ -311,16 +341,15 @@ namespace Game.Entities } else if (HasSplines()) { - UpdateSplinePosition(diff); + UpdateSplinePosition(_spline); } else { - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.FacingCurveId != 0) + if (m_areaTriggerData.FacingCurveId != 0) { - float orientation = Global.DB2Mgr.GetCurveValueAt(createProperties.FacingCurveId, GetProgress()); - if (GetCreateProperties() == null || !GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation)) - orientation += _stationaryPosition.GetOrientation(); + float orientation = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.FacingCurveId, GetProgress()); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.AbsoluteOrientation)) + orientation += m_areaTriggerData.Facing; SetOrientation(orientation); } @@ -351,6 +380,14 @@ namespace Game.Entities AddObjectToRemoveList(); } + uint GetTimeSinceCreated() + { + uint now = GameTime.GetGameTimeMS(); + if (now >= m_areaTriggerData.CreationTime) + return now - m_areaTriggerData.CreationTime; + return 0; + } + void SetOverrideScaleCurve(float overrideScale) { SetScaleCurve(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.OverrideScaleCurve), overrideScale); @@ -435,12 +472,8 @@ namespace Game.Entities float scale = 1.0f; if (m_areaTriggerData.OverrideScaleCurve.GetValue().OverrideActive) scale *= Math.Max(GetScaleCurveValue(m_areaTriggerData.OverrideScaleCurve, m_areaTriggerData.TimeToTargetScale), 0.000001f); - else - { - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.ScaleCurveId != 0) - scale *= Math.Max(Global.DB2Mgr.GetCurveValueAt(createProperties.ScaleCurveId, GetScaleCurveProgress(m_areaTriggerData.OverrideScaleCurve, m_areaTriggerData.TimeToTargetScale)), 0.000001f); - } + else if (m_areaTriggerData.ScaleCurveId != 0) + scale *= Math.Max(Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.ScaleCurveId, GetScaleCurveProgress(m_areaTriggerData.OverrideScaleCurve, m_areaTriggerData.TimeToTargetScale)), 0.000001f); scale *= Math.Max(GetScaleCurveValue(m_areaTriggerData.ExtraScaleCurve, m_areaTriggerData.TimeToTargetExtraScale), 0.000001f); @@ -583,29 +616,21 @@ namespace Game.Entities { List targetList = new(); - switch (_shape.TriggerType) + m_areaTriggerData.ShapeData.Visit(shape => { - case AreaTriggerShapeType.Sphere: - SearchUnitInSphere(targetList); - break; - case AreaTriggerShapeType.Box: - SearchUnitInBox(targetList); - break; - case AreaTriggerShapeType.Polygon: - SearchUnitInPolygon(targetList); - break; - case AreaTriggerShapeType.Cylinder: - SearchUnitInCylinder(targetList); - break; - case AreaTriggerShapeType.Disk: - SearchUnitInDisk(targetList); - break; - case AreaTriggerShapeType.BoundedPlane: - SearchUnitInBoundedPlane(targetList); - break; - default: - break; - } + if (shape is AreaTriggerSphere) + SearchUnitInSphere(shape, targetList); + else if (shape is AreaTriggerBox) + SearchUnitInBox(shape, targetList); + else if (shape is AreaTriggerPolygon) + SearchUnitInPolygon(shape, targetList); + else if (shape is AreaTriggerCylinder) + SearchUnitInCylinder(shape, targetList); + else if (shape is AreaTriggerDisk) + SearchUnitInDisk(shape, targetList); + else if (shape is AreaTriggerBoundedPlane) + SearchUnitInBoundedPlane(shape, targetList); + }); if (GetTemplate() != null) { @@ -681,32 +706,30 @@ namespace Game.Entities } } - void SearchUnitInSphere(List targetList) + void SearchUnitInSphere(AreaTriggerSphere sphere, List targetList) { float progress = GetProgress(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); float scale = CalcCurrentScale(); - float radius = MathFunctions.Lerp(_shape.SphereDatas.Radius, _shape.SphereDatas.RadiusTarget, progress) * scale; + float radius = MathFunctions.Lerp(sphere.Radius, sphere.RadiusTarget, progress) * scale; SearchUnits(targetList, radius, true); } - void SearchUnitInBox(List targetList) + void SearchUnitInBox(AreaTriggerBox box, List targetList) { float progress = GetProgress(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); unsafe { float scale = CalcCurrentScale(); - float extentsX = MathFunctions.Lerp(_shape.BoxDatas.Extents[0], _shape.BoxDatas.ExtentsTarget[0], progress) * scale; - float extentsY = MathFunctions.Lerp(_shape.BoxDatas.Extents[1], _shape.BoxDatas.ExtentsTarget[1], progress) * scale; - float extentsZ = MathFunctions.Lerp(_shape.BoxDatas.Extents[2], _shape.BoxDatas.ExtentsTarget[2], progress) * scale; + float extentsX = MathFunctions.Lerp(box.Extents.GetValue().X, box.ExtentsTarget.GetValue().X, progress) * scale; + float extentsY = MathFunctions.Lerp(box.Extents.GetValue().Y, box.ExtentsTarget.GetValue().Y, progress) * scale; + float extentsZ = MathFunctions.Lerp(box.Extents.GetValue().Z, box.ExtentsTarget.GetValue().Z, progress) * scale; float radius = MathF.Sqrt(extentsX * extentsX + extentsY * extentsY); SearchUnits(targetList, radius, false); @@ -716,14 +739,13 @@ namespace Game.Entities } } - void SearchUnitInPolygon(List targetList) + void SearchUnitInPolygon(AreaTriggerPolygon polygon, List targetList) { float progress = GetProgress(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); - float height = MathFunctions.Lerp(_shape.PolygonDatas.Height, _shape.PolygonDatas.HeightTarget, progress); + float height = MathFunctions.Lerp(polygon.Height, polygon.HeightTarget, progress); float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -732,17 +754,16 @@ namespace Game.Entities targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ || !unit.IsInPolygon2D(this, _polygonVertices)); } - void SearchUnitInCylinder(List targetList) + void SearchUnitInCylinder(AreaTriggerCylinder cylinder, List targetList) { float progress = GetProgress(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); float scale = CalcCurrentScale(); - float radius = MathFunctions.Lerp(_shape.CylinderDatas.Radius, _shape.CylinderDatas.RadiusTarget, progress) * scale; - float height = MathFunctions.Lerp(_shape.CylinderDatas.Height, _shape.CylinderDatas.HeightTarget, progress); - if (!m_areaTriggerData.HeightIgnoresScale) + float radius = MathFunctions.Lerp(cylinder.Radius, cylinder.RadiusTarget, progress) * scale; + float height = MathFunctions.Lerp(cylinder.Height, cylinder.HeightTarget, progress); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.HeightIgnoresScale)) height *= scale; float minZ = GetPositionZ() - height; @@ -753,18 +774,17 @@ namespace Game.Entities targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ); } - void SearchUnitInDisk(List targetList) + void SearchUnitInDisk(AreaTriggerDisk disk, List targetList) { float progress = GetProgress(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); float scale = CalcCurrentScale(); - float innerRadius = MathFunctions.Lerp(_shape.DiskDatas.InnerRadius, _shape.DiskDatas.InnerRadiusTarget, progress) * scale; - float outerRadius = MathFunctions.Lerp(_shape.DiskDatas.OuterRadius, _shape.DiskDatas.OuterRadiusTarget, progress) * scale; - float height = MathFunctions.Lerp(_shape.DiskDatas.Height, _shape.DiskDatas.HeightTarget, progress); - if (!m_areaTriggerData.HeightIgnoresScale) + float innerRadius = MathFunctions.Lerp(disk.InnerRadius, disk.InnerRadiusTarget, progress) * scale; + float outerRadius = MathFunctions.Lerp(disk.OuterRadius, disk.OuterRadiusTarget, progress) * scale; + float height = MathFunctions.Lerp(disk.Height, disk.HeightTarget, progress); + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.HeightIgnoresScale)) height *= scale; float minZ = GetPositionZ() - height; @@ -775,18 +795,17 @@ namespace Game.Entities targetList.RemoveAll(unit => unit.IsInDist2d(this, innerRadius) || unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ); } - void SearchUnitInBoundedPlane(List targetList) + void SearchUnitInBoundedPlane(AreaTriggerBoundedPlane boundedPlane, List targetList) { float progress = GetProgress(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); unsafe { float scale = CalcCurrentScale(); - float extentsX = MathFunctions.Lerp(_shape.BoundedPlaneDatas.Extents[0], _shape.BoundedPlaneDatas.ExtentsTarget[0], progress) * scale; - float extentsY = MathFunctions.Lerp(_shape.BoundedPlaneDatas.Extents[1], _shape.BoundedPlaneDatas.ExtentsTarget[1], progress) * scale; + float extentsX = MathFunctions.Lerp(boundedPlane.Extents.GetValue().X, boundedPlane.ExtentsTarget.GetValue().X, progress) * scale; + float extentsY = MathFunctions.Lerp(boundedPlane.Extents.GetValue().Y, boundedPlane.ExtentsTarget.GetValue().Y, progress) * scale; float radius = MathF.Sqrt(extentsX * extentsX + extentsY * extentsY); SearchUnits(targetList, radius, false); @@ -854,8 +873,10 @@ namespace Game.Entities } } - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.NumUnitsInside), _insideUnits.Count); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.NumPlayersInside), _insideUnits.Count(guid => guid.IsPlayer())); + if (_insideUnits.Any(guid => guid.IsPlayer())) + SetAreaTriggerFlag(AreaTriggerFieldFlags.HasPlayers); + else + RemoveAreaTriggerFlag(AreaTriggerFieldFlags.HasPlayers); if (IsStaticSpawn()) SetActive(!_insideUnits.Empty()); @@ -902,6 +923,83 @@ namespace Game.Entities return 0; } + unsafe void SetShape(AreaTriggerShapeInfo shape) + { + var areaTriggerData = m_values.ModifyValue(m_areaTriggerData); + + switch (shape.TriggerType) + { + case AreaTriggerShapeType.Sphere: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)0); + var sphere = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); + SetUpdateFieldValue(sphere.ModifyValue(sphere.Radius), shape.SphereDatas.Radius); + SetUpdateFieldValue(sphere.ModifyValue(sphere.RadiusTarget), shape.SphereDatas.RadiusTarget); + break; + } + case AreaTriggerShapeType.Box: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)1); + var box = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); + SetUpdateFieldValue(box.ModifyValue(box.Extents), new Vector3(shape.BoxDatas.Extents[0], shape.BoxDatas.Extents[1], shape.BoxDatas.Extents[2])); + SetUpdateFieldValue(box.ModifyValue(box.ExtentsTarget), new Vector3(shape.BoxDatas.ExtentsTarget[0], shape.BoxDatas.ExtentsTarget[1], shape.BoxDatas.ExtentsTarget[2])); + break; + } + case AreaTriggerShapeType.Polygon: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)3); + var polygon = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); + var vertices = polygon.ModifyValue(polygon.Vertices); + ClearDynamicUpdateFieldValues(vertices); + foreach (Vector2 vertex in shape.PolygonVertices) + AddDynamicUpdateFieldValue(vertices, vertex); + var verticesTarget = polygon.ModifyValue(polygon.VerticesTarget); + ClearDynamicUpdateFieldValues(verticesTarget); + foreach (Vector2 vertex in shape.PolygonVerticesTarget) + AddDynamicUpdateFieldValue(verticesTarget, vertex); + SetUpdateFieldValue(polygon.ModifyValue(polygon.Height), shape.PolygonDatas.Height); + SetUpdateFieldValue(polygon.ModifyValue(polygon.HeightTarget), shape.PolygonDatas.HeightTarget); + break; + } + case AreaTriggerShapeType.Cylinder: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)4); + var cylinder = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); + SetUpdateFieldValue(cylinder.ModifyValue(cylinder.Radius), shape.CylinderDatas.Radius); + SetUpdateFieldValue(cylinder.ModifyValue(cylinder.RadiusTarget), shape.CylinderDatas.RadiusTarget); + SetUpdateFieldValue(cylinder.ModifyValue(cylinder.Height), shape.CylinderDatas.Height); + SetUpdateFieldValue(cylinder.ModifyValue(cylinder.HeightTarget), shape.CylinderDatas.HeightTarget); + SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffset), shape.CylinderDatas.LocationZOffset); + SetUpdateFieldValue(cylinder.ModifyValue(cylinder.LocationZOffsetTarget), shape.CylinderDatas.LocationZOffsetTarget); + break; + } + case AreaTriggerShapeType.Disk: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)7); + var disk = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); + SetUpdateFieldValue(disk.ModifyValue(disk.InnerRadius), shape.DiskDatas.InnerRadius); + SetUpdateFieldValue(disk.ModifyValue(disk.InnerRadiusTarget), shape.DiskDatas.InnerRadiusTarget); + SetUpdateFieldValue(disk.ModifyValue(disk.OuterRadius), shape.DiskDatas.OuterRadius); + SetUpdateFieldValue(disk.ModifyValue(disk.OuterRadiusTarget), shape.DiskDatas.OuterRadiusTarget); + SetUpdateFieldValue(disk.ModifyValue(disk.Height), shape.DiskDatas.Height); + SetUpdateFieldValue(disk.ModifyValue(disk.HeightTarget), shape.DiskDatas.HeightTarget); + SetUpdateFieldValue(disk.ModifyValue(disk.LocationZOffset), shape.DiskDatas.LocationZOffset); + SetUpdateFieldValue(disk.ModifyValue(disk.LocationZOffsetTarget), shape.DiskDatas.LocationZOffsetTarget); + break; + } + case AreaTriggerShapeType.BoundedPlane: + { + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ShapeType), (byte)8); + var boundedPlane = areaTriggerData.ModifyValue(m_areaTriggerData.ShapeData); + SetUpdateFieldValue(boundedPlane.ModifyValue(boundedPlane.Extents), new Vector2(shape.BoundedPlaneDatas.Extents[0], shape.BoundedPlaneDatas.Extents[1])); + SetUpdateFieldValue(boundedPlane.ModifyValue(boundedPlane.ExtentsTarget), new Vector2(shape.BoundedPlaneDatas.ExtentsTarget[0], shape.BoundedPlaneDatas.ExtentsTarget[1])); + break; + } + default: + break; + } + } + float GetMaxSearchRadius() { return m_areaTriggerData.BoundsRadius2D * CalcCurrentScale(); @@ -909,26 +1007,25 @@ namespace Game.Entities void UpdatePolygonVertices() { - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - AreaTriggerShapeInfo shape = GetShape(); + AreaTriggerPolygon shape = m_areaTriggerData.ShapeData.Get(); float newOrientation = GetOrientation(); // No need to recalculate, orientation didn't change - if (MathFunctions.fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape.PolygonVerticesTarget.Empty()) + if (MathFunctions.fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape.VerticesTarget.Empty()) return; - _polygonVertices.AddRange(shape.PolygonVertices.Select(p => new Position(p.X, p.Y))); + _polygonVertices.AddRange(shape.Vertices._values.Select(p => new Position(p.X, p.Y))); - if (!shape.PolygonVerticesTarget.Empty()) + if (!shape.Vertices.Empty()) { float progress = GetProgress(); - if (createProperties.MorphCurveId != 0) - progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MorphCurveId, progress); + if (m_areaTriggerData.MorphCurveId != 0) + progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MorphCurveId, progress); for (var i = 0; i < _polygonVertices.Count; ++i) { Vector2 vertex = _polygonVertices[i]; - Vector2 vertexTarget = shape.PolygonVerticesTarget[i]; + Vector2 vertexTarget = shape.VerticesTarget[i]; vertex.X = MathFunctions.Lerp(vertex.X, vertexTarget.X, progress); vertex.Y = MathFunctions.Lerp(vertex.Y, vertexTarget.Y, progress); @@ -959,7 +1056,7 @@ namespace Game.Entities public void UpdateShape() { - if (_shape.IsPolygon()) + if (m_areaTriggerData.ShapeData.Is()) UpdatePolygonVertices(); } @@ -1090,8 +1187,6 @@ namespace Game.Entities if (splinePoints.Length < 2) return; - _movementTime = 0; - _spline = new Spline(); _spline.InitSpline(splinePoints, splinePoints.Length, EvaluationMode.Linear, _stationaryPosition.GetOrientation()); _spline.InitLengths(); @@ -1101,29 +1196,30 @@ namespace Game.Entities speed = 1.0f; uint timeToTarget = _spline.Length() / speed * (float)Time.InMilliseconds; - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); - if (IsInWorld) - { - if (_reachedDestination) - { - AreaTriggerRePath reshapeDest = new(); - reshapeDest.TriggerGUID = GetGUID(); - SendMessageToSet(reshapeDest, true); - } + var areaTriggerData = m_values.ModifyValue(m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.MovementStartTime), GameTime.GetGameTimeMS()); - AreaTriggerRePath reshape = new(); - reshape.TriggerGUID = GetGUID(); - reshape.AreaTriggerSpline = new(); - reshape.AreaTriggerSpline.ElapsedTimeForMovement = GetElapsedTimeForMovement(); - reshape.AreaTriggerSpline.TimeToTarget = timeToTarget; - reshape.AreaTriggerSpline.Points = _spline; - SendMessageToSet(reshape, true); - } + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.PathType), (int)AreaTriggerPathType.Spline); + var pathData = areaTriggerData.ModifyValue(m_areaTriggerData.PathData); + SetUpdateFieldValue(pathData.ModifyValue(pathData.Catmullrom), splinePoints.Length >= 4); + var points = pathData.ModifyValue(pathData.Points); + ClearDynamicUpdateFieldValues(points); + foreach (Vector3 point in splinePoints) + AddDynamicUpdateFieldValue(points, point); _reachedDestination = false; } + uint GetElapsedTimeForMovement() + { + uint now = GameTime.GetGameTimeMS(); + if (now >= m_areaTriggerData.MovementStartTime) + return now - m_areaTriggerData.MovementStartTime; + return 0; + } + void InitOrbit(AreaTriggerOrbitInfo orbit, float? overrideSpeed = null) { // Circular movement requires either a center position or an attached unit @@ -1135,45 +1231,40 @@ namespace Game.Entities uint timeToTarget = (uint)(orbit.Radius * 2.0f * MathF.PI * (float)Time.InMilliseconds / speed); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.OrbitPathTarget), orbit.PathTarget.GetValueOrDefault(ObjectGuid.Empty)); + var areaTriggerData = m_values.ModifyValue(m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.MovementStartTime), GameTime.GetGameTimeMS()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.OrbitPathTarget), orbit.PathTarget.GetValueOrDefault(ObjectGuid.Empty)); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.ZOffset), orbit.ZOffset); + if (orbit.CanLoop) + SetAreaTriggerFlag(AreaTriggerFieldFlags.CanLoop); + else + RemoveAreaTriggerFlag(AreaTriggerFieldFlags.CanLoop); - _orbitInfo = new AreaTriggerOrbitInfo(); - - _orbitInfo.TimeToTarget = timeToTarget; - _orbitInfo.ElapsedTimeForMovement = 0; - - if (IsInWorld) - { - AreaTriggerRePath reshape = new(); - reshape.TriggerGUID = GetGUID(); - reshape.AreaTriggerOrbit = _orbitInfo; - - SendMessageToSet(reshape, true); - } - } - - public bool HasOrbit() - { - return _orbitInfo != null; + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.PathType), (int)AreaTriggerPathType.Orbit); + var pathData = areaTriggerData.ModifyValue(m_areaTriggerData.PathData); + SetUpdateFieldValue(pathData.ModifyValue(pathData.CounterClockwise), orbit.CounterClockwise); + SetUpdateFieldValue(pathData.ModifyValue(pathData.Center), orbit.Center.GetValueOrDefault(new Position())); + SetUpdateFieldValue(pathData.ModifyValue(pathData.Radius), orbit.Radius); + SetUpdateFieldValue(pathData.ModifyValue(pathData.InitialAngle), orbit.InitialAngle); + SetUpdateFieldValue(pathData.ModifyValue(pathData.BlendFromRadius), orbit.BlendFromRadius); + SetUpdateFieldValue(pathData.ModifyValue(pathData.ExtraTimeForBlending), orbit.ExtraTimeForBlending); } Position GetOrbitCenterPosition() { - if (!HasOrbit()) + AreaTriggerOrbit orbit = m_areaTriggerData.PathData.Get(); + if (orbit == null) return null; - if (_orbitInfo.PathTarget.HasValue) + if (!m_areaTriggerData.OrbitPathTarget.GetValue().IsEmpty()) { - WorldObject center = Global.ObjAccessor.GetWorldObject(this, _orbitInfo.PathTarget.Value); + WorldObject center = Global.ObjAccessor.GetWorldObject(this, m_areaTriggerData.OrbitPathTarget); if (center != null) return center; } - if (_orbitInfo.Center.HasValue) - return new Position(_orbitInfo.Center.Value); - - return null; + return new Position(orbit.Center); } Position CalculateOrbitPosition() @@ -1182,26 +1273,24 @@ namespace Game.Entities if (centerPos == null) return GetPosition(); - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - AreaTriggerOrbitInfo cmi = GetOrbit(); + AreaTriggerOrbit cmi = m_areaTriggerData.PathData.Get(); // AreaTrigger make exactly "Duration / TimeToTarget" loops during his life time - float pathProgress = (float)cmi.ElapsedTimeForMovement / cmi.TimeToTarget; - if (createProperties != null && createProperties.MoveCurveId != 0) - pathProgress = Global.DB2Mgr.GetCurveValueAt(createProperties.MoveCurveId, pathProgress); + float pathProgress = (float)(GetElapsedTimeForMovement() + cmi.ExtraTimeForBlending) / (float)GetTimeToTarget(); + if (m_areaTriggerData.MoveCurveId != 0) + pathProgress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MoveCurveId, pathProgress); // We already made one circle and can't loop - if (!cmi.CanLoop) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.CanLoop)) pathProgress = Math.Min(1.0f, pathProgress); float radius = cmi.Radius; - if (MathFunctions.fuzzyNe(cmi.BlendFromRadius, radius)) + if (pathProgress <= 1.0f && MathFunctions.fuzzyNe(cmi.BlendFromRadius, radius)) { float blendCurve = (cmi.BlendFromRadius - radius) / radius; - // 4.f Defines four quarters - blendCurve = MathFunctions.RoundToInterval(ref blendCurve, 1.0f, 4.0f) / 4.0f; - float blendProgress = Math.Min(1.0f, pathProgress / blendCurve); - radius = MathFunctions.Lerp(cmi.BlendFromRadius, cmi.Radius, blendProgress); + MathFunctions.RoundToInterval(ref blendCurve, 1.0f, 4.0f); + float blendProgress = Math.Min(1.0f, pathProgress / blendCurve * 0.63661975f); + radius = MathFunctions.Lerp(cmi.BlendFromRadius, radius, blendProgress); } // Adapt Path progress depending of circle direction @@ -1211,13 +1300,13 @@ namespace Game.Entities float angle = cmi.InitialAngle + 2.0f * (float)Math.PI * pathProgress; float x = centerPos.GetPositionX() + (radius * (float)Math.Cos(angle)); float y = centerPos.GetPositionY() + (radius * (float)Math.Sin(angle)); - float z = centerPos.GetPositionZ() + cmi.ZOffset; + float z = centerPos.GetPositionZ() + m_areaTriggerData.ZOffset; float orientation = 0.0f; - if (createProperties != null && createProperties.FacingCurveId != 0) - orientation = Global.DB2Mgr.GetCurveValueAt(createProperties.FacingCurveId, GetProgress()); + if (m_areaTriggerData.FacingCurveId != 0) + orientation = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.FacingCurveId, GetProgress()); - if (GetCreateProperties() == null || !GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.AbsoluteOrientation)) { orientation += angle; orientation += cmi.CounterClockwise ? MathFunctions.PiOver4 : -MathFunctions.PiOver4; @@ -1226,13 +1315,8 @@ namespace Game.Entities return new Position(x, y, z, orientation); } - void UpdateOrbitPosition(uint diff) + void UpdateOrbitPosition() { - if (_orbitInfo.StartDelay > GetElapsedTimeForMovement()) - return; - - _orbitInfo.ElapsedTimeForMovement = (int)(GetElapsedTimeForMovement() - _orbitInfo.StartDelay); - Position pos = CalculateOrbitPosition(); GetMap().AreaTriggerRelocation(this, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); @@ -1240,14 +1324,12 @@ namespace Game.Entities DebugVisualizePosition(); } - void UpdateSplinePosition(uint diff) + void UpdateSplinePosition(Spline spline) { if (_reachedDestination) return; - _movementTime += diff; - - if (_movementTime >= GetTimeToTarget()) + if (GetElapsedTimeForMovement() >= GetTimeToTarget()) { _reachedDestination = true; _lastSplineIndex = _spline.Last(); @@ -1262,18 +1344,18 @@ namespace Game.Entities return; } - float currentTimePercent = (float)_movementTime / GetTimeToTarget(); + float currentTimePercent = (float)GetElapsedTimeForMovement() / GetTimeToTarget(); if (currentTimePercent <= 0.0f) return; - AreaTriggerCreateProperties createProperties = GetCreateProperties(); - if (createProperties != null && createProperties.MoveCurveId != 0) + if (m_areaTriggerData.MoveCurveId != 0) { - float progress = Global.DB2Mgr.GetCurveValueAt(createProperties.MoveCurveId, currentTimePercent); + float progress = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.MoveCurveId, currentTimePercent); if (progress < 0.0f || progress > 1.0f) { - Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (Id: {GetEntry()}, AreaTriggerCreatePropertiesId: (Id: {createProperties.Id.Id}, IsCustom: {createProperties.Id.IsCustom})) has wrong progress ({progress}) caused by curve calculation (MoveCurveId: {createProperties.MoveCurveId})"); + AreaTriggerCreateProperties createProperties = GetCreateProperties(); + Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (Id: {GetEntry()}, AreaTriggerCreatePropertiesId: (Id: {createProperties.Id.Id}, IsCustom: {createProperties.Id.IsCustom})) has wrong progress ({progress}) caused by curve calculation (MoveCurveId: {m_areaTriggerData.MoveCurveId})"); } else currentTimePercent = progress; @@ -1287,10 +1369,10 @@ namespace Game.Entities _spline.Evaluate_Percent(lastPositionIndex, percentFromLastPoint, out currentPosition); float orientation = _stationaryPosition.GetOrientation(); - if (createProperties != null && createProperties.FacingCurveId != 0) - orientation += Global.DB2Mgr.GetCurveValueAt(createProperties.FacingCurveId, GetProgress()); + if (m_areaTriggerData.FacingCurveId != 0) + orientation += Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.FacingCurveId, GetProgress()); - if (GetCreateProperties() != null && !GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation) && GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasFaceMovementDir)) + if (!HasAreaTriggerFlag(AreaTriggerFieldFlags.AbsoluteOrientation) && HasAreaTriggerFlag(AreaTriggerFieldFlags.FaceMovementDir)) { _spline.Evaluate_Derivative(lastPositionIndex, percentFromLastPoint, out Vector3 derivative); if (derivative.X != 0.0f || derivative.Y != 0.0f) @@ -1317,11 +1399,11 @@ namespace Game.Entities float z = GetScaleCurveValueAtProgress(m_areaTriggerData.OverrideMoveCurveZ, progress); float orientation = GetOrientation(); - if (GetCreateProperties().FacingCurveId != 0) + if (m_areaTriggerData.FacingCurveId != 0) { - orientation = Global.DB2Mgr.GetCurveValueAt(GetCreateProperties().FacingCurveId, GetProgress()); - if (GetCreateProperties() == null || !GetCreateProperties().Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation)) - orientation += _stationaryPosition.GetOrientation(); + orientation = Global.DB2Mgr.GetCurveValueAt(m_areaTriggerData.FacingCurveId, GetProgress()); + if (HasAreaTriggerFlag(AreaTriggerFieldFlags.AbsoluteOrientation)) + orientation += m_areaTriggerData.Facing; } GetMap().AreaTriggerRelocation(this, x, y, z, orientation); @@ -1438,9 +1520,15 @@ namespace Game.Entities public bool IsRemoved() { return _isRemoved; } public uint GetSpellId() { return m_areaTriggerData.SpellID; } public AuraEffect GetAuraEffect() { return _aurEff; } - public uint GetTimeSinceCreated() { return _timeSinceCreated; } - public void SetHeightIgnoresScale(bool heightIgnoresScale) { SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.HeightIgnoresScale), heightIgnoresScale); } + public AreaTriggerFieldFlags GetAreaTriggerFlags() { return (AreaTriggerFieldFlags)m_areaTriggerData.Flags.GetValue(); } + public bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) + { + return GetAreaTriggerFlags().HasFlag(flag); + } + public void SetAreaTriggerFlag(AreaTriggerFieldFlags flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Flags), (uint)flag); } + public void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Flags), (uint)flag); } + public void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag) { SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Flags), (uint)flag); } public uint GetTimeToTarget() { return m_areaTriggerData.TimeToTarget; } public void SetTimeToTarget(uint timeToTarget) { SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTarget), timeToTarget); } @@ -1467,15 +1555,11 @@ namespace Game.Entities public override ObjectGuid GetOwnerGUID() { return GetCasterGuid(); } public ObjectGuid GetCasterGuid() { return m_areaTriggerData.Caster; } - public AreaTriggerShapeInfo GetShape() { return _shape; } - public Vector3 GetRollPitchYaw() { return _rollPitchYaw; } - public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; } - public bool HasSplines() { return !_spline.Empty(); } public Spline GetSpline() { return _spline; } - public uint GetElapsedTimeForMovement() { return GetTimeSinceCreated(); } // @todo: research the right value, in sniffs both timers are nearly identical - public AreaTriggerOrbitInfo GetOrbit() { return _orbitInfo; } + bool HasOrbit() { return m_areaTriggerData.PathData.Is(); } + public AreaTriggerOrbit GetOrbit() { return m_areaTriggerData.PathData.Get(); } public AreaTriggerFieldData m_areaTriggerData; @@ -1486,21 +1570,16 @@ namespace Game.Entities AuraEffect _aurEff; Position _stationaryPosition; - AreaTriggerShapeInfo _shape; int _duration; int _totalDuration; - uint _timeSinceCreated; float _verticesUpdatePreviousOrientation; bool _isRemoved; - Position _rollPitchYaw; - Position _targetRollPitchYaw; List _polygonVertices; Spline _spline; bool _reachedDestination; int _lastSplineIndex; - uint _movementTime; AreaTriggerOrbitInfo _orbitInfo; diff --git a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs index cb1affd65..0c71d7645 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs @@ -104,18 +104,6 @@ namespace Game.Entities public AreaTriggerScaleCurvePointsTemplate CurveTemplate; } - public struct AreaTriggerMovementScriptInfo - { - public uint SpellScriptID; - public Vector3 Center; - - public void Write(WorldPacket data) - { - data.WriteUInt32(SpellScriptID); - data.WriteVector3(Center); - } - } - public struct AreaTriggerId { public uint Id; @@ -204,35 +192,11 @@ namespace Game.Entities public class AreaTriggerOrbitInfo { - public void Write(WorldPacket data) - { - data.WriteBit(PathTarget.HasValue); - data.WriteBit(Center.HasValue); - data.WriteBit(CounterClockwise); - data.WriteBit(CanLoop); - - data.WriteUInt32(TimeToTarget); - data.WriteInt32(ElapsedTimeForMovement); - data.WriteUInt32(StartDelay); - data.WriteFloat(Radius); - data.WriteFloat(BlendFromRadius); - data.WriteFloat(InitialAngle); - data.WriteFloat(ZOffset); - - if (PathTarget.HasValue) - data.WritePackedGuid(PathTarget.Value); - - if (Center.HasValue) - data.WriteVector3(Center.Value); - } - public ObjectGuid? PathTarget; public Vector3? Center; public bool CounterClockwise; public bool CanLoop; - public uint TimeToTarget; - public int ElapsedTimeForMovement; - public uint StartDelay; + public int ExtraTimeForBlending; public float Radius; public float BlendFromRadius; public float InitialAngle; diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index cdd58a2d1..eddba938f 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -166,6 +166,7 @@ namespace Game.Entities stats.Flags[0] = (uint)creatureDifficulty.TypeFlags; stats.Flags[1] = creatureDifficulty.TypeFlags2; + stats.Flags[2] = creatureDifficulty.TypeFlags3; stats.CreatureType = (sbyte)CreatureType; stats.CreatureFamily = (int)Family; @@ -436,6 +437,7 @@ namespace Game.Entities public int CreatureDifficultyID; public CreatureTypeFlags TypeFlags; public uint TypeFlags2; + public uint TypeFlags3; public uint LootID; public uint PickPocketLootID; public uint SkinLootID; diff --git a/Source/Game/Entities/GameObject/GameObjectData.cs b/Source/Game/Entities/GameObject/GameObjectData.cs index 48818f578..03d558ca9 100644 --- a/Source/Game/Entities/GameObject/GameObjectData.cs +++ b/Source/Game/Entities/GameObject/GameObjectData.cs @@ -224,6 +224,12 @@ namespace Game.Entities [FieldOffset(80)] public craftingTable CraftingTable; + [FieldOffset(80)] + public futurePatchGameObject FuturePatchGameObject; + + [FieldOffset(80)] + public assistAction AssistAction; + [FieldOffset(80)] public raw Raw; @@ -539,6 +545,10 @@ namespace Game.Entities return QuestGiver.gossipID; case GameObjectTypes.Goober: return Goober.gossipID; + case GameObjectTypes.SpellFocus: + return SpellFocus.gossipID; + case GameObjectTypes.AssistAction: + return AssistAction.gossipID; default: return 0; } @@ -641,6 +651,8 @@ namespace Game.Entities return Trap.cooldown; case GameObjectTypes.Goober: return Goober.cooldown; + case GameObjectTypes.AssistAction: + return AssistAction.cooldown; default: return 0; } @@ -1483,7 +1495,7 @@ namespace Game.Entities public uint radius; // 4 radius, int, Min value: 0, Max value: 50, Default value: 10 public uint InteractRadiusOverride; // 5 Interact Radius Override (Yards * 100), int, Min value: 0, Max value: 2147483647, Default value: 0 public uint ItemInteractionID; // 6 Item Interaction ID, References: UiItemInteraction, NoValue = 0 - public uint PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, PlaceholderType77, }; Default: None + public uint PlayerInteractionType; // 7 Player Interaction Type, enum { None, TradePartner, Item, Gossip, QuestGiver, Merchant, TaxiNode, Trainer, Banker, AlliedRaceDetailsGiver, GuildBanker, Registrar, Vendor, PetitionVendor, GuildTabardVendor, TalentMaster, SpecializationMaster, MailInfo, SpiritHealer, AreaSpiritHealer, Binder, Auctioneer, StableMaster, BattleMaster, Transmogrifier, LFGDungeon, VoidStorageBanker, BlackMarketAuctioneer, AdventureMap, WorldMap, GarrArchitect, GarrTradeskill, GarrMission, ShipmentCrafter, GarrRecruitment, GarrTalent, Trophy, PlayerChoice, ArtifactForge, ObliterumForge, ScrappingMachine, ContributionCollector, AzeriteRespec, IslandQueue, ItemInteraction, ChromieTime, CovenantPreview, AnimaDiversion, LegendaryCrafting, WeeklyRewards, Soulbind, CovenantSanctum, NewPlayerGuide, ItemUpgrade, AdventureJournal, Renown, AzeriteForge, PerksProgramVendor, ProfessionsCraftingOrder, Professions, ProfessionsCustomerOrder, TraitSystem, BarbersChoice, JailersTowerBuffs, MajorFactionRenown, PersonalTabardVendor, ForgeMaster, CharacterBanker, AccountBanker, ProfessionRespec, PlaceholderType71, PlaceholderType72, PlaceholderType73, PlaceholderType74, PlaceholderType75, PlaceholderType76, GuildRename, PlaceholderType76, }; Default: None } public struct keystonereceptacle @@ -1614,6 +1626,19 @@ namespace Game.Entities public uint Script; // 0 Script, References: SpellScript, NoValue = 0 public uint autoClose; // 1 autoClose (ms), int, Min value: 0, Max value: 2147483647, Default value: 3000 } + + public struct futurePatchGameObject + { + } + + public struct assistAction + { + public uint AssistActionType; // 0 Assist Action Type, enum { None, Lounging Player, Grave Marker, Placed VO, Player Guardian, Player Slayer, Captured Buff, }; Default: None + public uint cooldown; // 1 cooldown, int, Min value: 0, Max value: 2147483647, Default value: 3000 + public uint gossipID; // 2 gossipID, References: Gossip, NoValue = 0 + public uint spell; // 3 spell, References: Spell, NoValue = 0 + public uint playerCast; // 4 playerCast, enum { false, true, }; Default: false + } #endregion } diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 07244487e..c109ebc6c 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -2551,9 +2551,15 @@ namespace Game.Entities } eff.SetBonuses.Add(itemSetSpell); + // spell cast only if fit form requirement, in other case will cast at form change - if (itemSetSpell.ChrSpecID == 0 || (ChrSpecialization)itemSetSpell.ChrSpecID == player.GetPrimarySpecialization()) - player.ApplyEquipSpell(spellInfo, null, true); + if (itemSetSpell.ChrSpecID != 0 && (ChrSpecialization)itemSetSpell.ChrSpecID != player.GetPrimarySpecialization()) + continue; + + if (itemSetSpell.TraitSubTreeID != 0 && itemSetSpell.TraitSubTreeID != player.m_playerData.CurrentCombatTraitConfigSubTreeID) + continue; + + player.ApplyEquipSpell(spellInfo, null, true); } } @@ -2592,11 +2598,10 @@ namespace Game.Entities if (itemSetSpell.Threshold <= eff.EquippedItems.Count) continue; - if (!eff.SetBonuses.Contains(itemSetSpell)) + if (!eff.SetBonuses.Remove(itemSetSpell)) continue; player.ApplyEquipSpell(Global.SpellMgr.GetSpellInfo(itemSetSpell.SpellID, Difficulty.None), null, false); - eff.SetBonuses.Remove(itemSetSpell); } if (eff.EquippedItems.Empty()) //all items of a set were removed @@ -2618,7 +2623,8 @@ namespace Game.Entities { SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(itemSetSpell.SpellID, Difficulty.None); - if (itemSetSpell.ChrSpecID != 0 && (ChrSpecialization)itemSetSpell.ChrSpecID != player.GetPrimarySpecialization()) + if ((itemSetSpell.ChrSpecID != 0 && itemSetSpell.ChrSpecID != (ushort)player.GetPrimarySpecialization()) + || (itemSetSpell.TraitSubTreeID != 0 && itemSetSpell.TraitSubTreeID != player.m_playerData.CurrentCombatTraitConfigSubTreeID)) player.ApplyEquipSpell(spellInfo, null, false, false); // item set aura is not for current spec else { diff --git a/Source/Game/Entities/Object/Update/UpdateField.cs b/Source/Game/Entities/Object/Update/UpdateField.cs index 5cd46b3c3..0dfe5604c 100644 --- a/Source/Game/Entities/Object/Update/UpdateField.cs +++ b/Source/Game/Entities/Object/Update/UpdateField.cs @@ -15,6 +15,12 @@ namespace Game.Entities T GetValue(); } + public interface IHasChangesMask + { + void ClearChangesMask(); + UpdateMask GetUpdateMask(); + } + public class UpdateFieldString : IUpdateField { public string _value; @@ -347,15 +353,39 @@ namespace Game.Entities } } - public interface IHasChangesMask + public class VariantUpdateField(int blockBit, int bit, params Type[] types) { - void ClearChangesMask(); - UpdateMask GetUpdateMask(); + public object _value; + Type[] _types = types; + + public int BlockBit = blockBit; + public int Bit = bit; + + public bool Is() { return _types.Contains(typeof(T)); } + + public T Get() where T : class, new() + { + if (Is()) + return _value as T; + + return null; + } + + public void Visit(Action visitor) + { + visitor(_value); + } + + public void ConstructValue() where T : class, new() + { + _value = new T(); + } } public abstract class HasChangesMask : IHasChangesMask { - public int _changeMask; + public static int ChangeMaskLength; + public UpdateMask _changesMask; public int _blockBit; public int Bit; @@ -364,12 +394,13 @@ namespace Game.Entities { _blockBit = blockBit; Bit = (int)bit; + ChangeMaskLength = changeMask; _changesMask = new UpdateMask(changeMask); - _changeMask = changeMask; } public HasChangesMask(int changeMask) { + ChangeMaskLength = changeMask; _changesMask = new UpdateMask(changeMask); } @@ -433,6 +464,19 @@ namespace Game.Entities } } + public void ClearChangesMask(VariantUpdateField field) + { + if (typeof(IHasChangesMask).IsAssignableFrom(field._value.GetType())) + ((IHasChangesMask)field._value).ClearChangesMask(); + } + + public dynamic ModifyValueOld(dynamic value, int bit, int blockBit) + { + _changesMask.Set(blockBit); + _changesMask.Set(bit); + return value; + } + public UpdateField ModifyValue(UpdateField updateField) where U : new() { MarkChanged(updateField); @@ -504,6 +548,18 @@ namespace Game.Entities return new DynamicUpdateFieldSetter(updateField[index], dynamicIndex); } + public V ModifyValue(VariantUpdateField field) where V : class, new() + { + if (!field.Is()) + field.ConstructValue(); + + if (field.BlockBit >= 0) + _changesMask.Set(field.BlockBit); + + _changesMask.Set(Bit); + return field.Get(); + } + public void MarkChanged(UpdateField updateField) where U : new() { _changesMask.Set(updateField.BlockBit); @@ -560,7 +616,7 @@ namespace Game.Entities public UpdateMask GetStaticUpdateMask() { - return new UpdateMask(_changeMask); + return new UpdateMask(ChangeMaskLength); } } diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index 4c907635b..153e729e8 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -2,7 +2,6 @@ // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. using Framework.Constants; -using Framework.Dynamic; using Game.DataStorage; using Game.Networking; using Game.Networking.Packets; @@ -14,14 +13,12 @@ using System.Numerics; namespace Game.Entities { - public class ObjectFieldData : HasChangesMask + public class ObjectFieldData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.Object, 4) { public UpdateField EntryId = new(0, 1); public UpdateField DynamicFlags = new(0, 2); public UpdateField Scale = new(0, 3); - public ObjectFieldData() : base((int)EntityFragment.CGObject, TypeId.Object, 4) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) { data.WriteUInt32(GetViewerDependentEntryId(this, owner, receiver)); @@ -180,15 +177,13 @@ namespace Game.Entities } } - public class ItemEnchantment : HasChangesMask + public class ItemEnchantment() : HasChangesMask(5) { public UpdateField ID = new(0, 1); public UpdateField Duration = new(0, 2); public UpdateField Charges = new(0, 3); public UpdateField Inactive = new(0, 4); - public ItemEnchantment() : base(5) { } - public void WriteCreate(WorldPacket data, Item owner, Player receiver) { data.WriteUInt32(ID); @@ -237,7 +232,7 @@ namespace Game.Entities } } - public class ItemMod + public class ItemMod : IEquatable { public byte Type; public uint Value; @@ -253,14 +248,18 @@ namespace Game.Entities data.WriteUInt8(Type); data.WriteUInt32(Value); } + + public bool Equals(ItemMod right) + { + return Type == right.Type + && Value == right.Value; + } } - public class ItemModList : HasChangesMask + public class ItemModList() : HasChangesMask(1) { public DynamicUpdateField Values = new(-1, 0); - public ItemModList() : base(1) { } - public void WriteCreate(WorldPacket data, Item owner, Player receiver) { data.WriteBits(Values.Size(), 6); @@ -307,7 +306,7 @@ namespace Game.Entities } } - public class ArtifactPower + public class ArtifactPower : IEquatable { public ushort ArtifactPowerId; public byte PurchasedRank; @@ -326,16 +325,21 @@ namespace Game.Entities data.WriteUInt8(PurchasedRank); data.WriteUInt8(CurrentRankWithBonus); } + + public bool Equals(ArtifactPower right) + { + return ArtifactPowerId == right.ArtifactPowerId + && PurchasedRank == right.PurchasedRank + && CurrentRankWithBonus == right.CurrentRankWithBonus; + } } - public class SocketedGem : HasChangesMask + public class SocketedGem() : HasChangesMask(20) { public UpdateField ItemId = new(0, 1); public UpdateField Context = new(0, 2); public UpdateFieldArray BonusListIDs = new(16, 3, 4); - public SocketedGem() : base(20) { } - public void WriteCreate(WorldPacket data, Item owner, Player receiver) { data.WriteUInt32(ItemId); @@ -388,7 +392,7 @@ namespace Game.Entities } } - public class ItemData : HasChangesMask + public class ItemData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.Item, 41) { public DynamicUpdateField ArtifactPowers = new(0, 1); public DynamicUpdateField Gems = new(0, 2); @@ -413,8 +417,6 @@ namespace Game.Entities public UpdateFieldArray SpellCharges = new(5, 21, 22); public UpdateFieldArray Enchantment = new(13, 27, 28); - public ItemData() : base((int)EntityFragment.CGObject, TypeId.Item, 41) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) { data.WritePackedGuid(Owner); @@ -480,7 +482,7 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget.OR(new UpdateMask(41, [0x07F58D80u, 0x00000000u])); + allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x07F58D80u, 0x00000000u])); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) @@ -660,13 +662,11 @@ namespace Game.Entities } } - public class ContainerData : HasChangesMask + public class ContainerData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.Container, 101) { public UpdateField NumSlots = new(0, 1); public UpdateFieldArray Slots = new(98, 2, 3); - public ContainerData() : base((int)EntityFragment.CGObject, TypeId.Container, 101) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Bag owner, Player receiver) { for (int i = 0; i < 98; ++i) @@ -716,12 +716,10 @@ namespace Game.Entities } } - public class AzeriteEmpoweredItemData : HasChangesMask + public class AzeriteEmpoweredItemData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.AzeriteEmpoweredItem, 6) { public UpdateFieldArray Selections = new(5, 0, 1); - public AzeriteEmpoweredItemData() : base((int)EntityFragment.CGObject, TypeId.AzeriteEmpoweredItem, 6) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Item owner, Player receiver) { for (int i = 0; i < 5; ++i) @@ -761,7 +759,7 @@ namespace Game.Entities } } - public class UnlockedAzeriteEssence + public class UnlockedAzeriteEssence : IEquatable { public uint AzeriteEssenceID; public uint Rank; @@ -777,16 +775,20 @@ namespace Game.Entities data.WriteUInt32(AzeriteEssenceID); data.WriteUInt32(Rank); } + + public bool Equals(UnlockedAzeriteEssence right) + { + return AzeriteEssenceID == right.AzeriteEssenceID + && Rank == right.Rank; + } } - public class SelectedAzeriteEssences : HasChangesMask + public class SelectedAzeriteEssences() : HasChangesMask(8) { public UpdateField Enabled = new(0, 1); public UpdateField SpecializationID = new(0, 2); public UpdateFieldArray AzeriteEssenceID = new(4, 3, 4); - public SelectedAzeriteEssences() : base(8) { } - public void WriteCreate(WorldPacket data, AzeriteItem owner, Player receiver) { for (int i = 0; i < 4; ++i) @@ -846,7 +848,7 @@ namespace Game.Entities } } - public class AzeriteItemData : HasChangesMask + public class AzeriteItemData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.AzeriteItem, 10) { public UpdateField Enabled = new(0, 1); public DynamicUpdateField UnlockedEssences = new(0, 2); @@ -858,8 +860,6 @@ namespace Game.Entities public UpdateField KnowledgeLevel = new(0, 8); public UpdateField DEBUGknowledgeWeek = new(0, 9); - public AzeriteItemData() : base((int)EntityFragment.CGObject, TypeId.AzeriteItem, 10) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AzeriteItem owner, Player receiver) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) @@ -902,7 +902,7 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget.OR(new UpdateMask(10, [0x000003E2u])); + allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x000003E2u])); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) @@ -1016,7 +1016,7 @@ namespace Game.Entities } } - public class SpellCastVisualField + public class SpellCastVisualField : IEquatable { public uint SpellXSpellVisualID; public uint ScriptVisualID; @@ -1032,27 +1032,47 @@ namespace Game.Entities data.WriteUInt32(SpellXSpellVisualID); data.WriteUInt32(ScriptVisualID); } + + public bool Equals(SpellCastVisual right) + { + return SpellXSpellVisualID == right.SpellXSpellVisualID + && ScriptVisualID == right.ScriptVisualID; + } } - public class UnitChannel + public class UnitChannel : IEquatable { public uint SpellID; public SpellCastVisualField SpellVisual = new(); + public uint StartTimeMs; + public uint Duration; public void WriteCreate(WorldPacket data, Unit owner, Player receiver) { data.WriteUInt32(SpellID); SpellVisual.WriteCreate(data, owner, receiver); + data.WriteUInt32(StartTimeMs); + data.WriteUInt32(Duration); } public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Unit owner, Player receiver) { data.WriteUInt32(SpellID); SpellVisual.WriteUpdate(data, ignoreChangesMask, owner, receiver); + data.WriteUInt32(StartTimeMs); + data.WriteUInt32(Duration); + } + + public bool Equals(UnitChannel right) + { + return SpellID == right.SpellID + && SpellVisual == right.SpellVisual + && StartTimeMs == right.StartTimeMs + && Duration == right.Duration; } } - public class VisibleItem : HasChangesMask + public class VisibleItem() : HasChangesMask(6) { public UpdateField ItemID = new(0, 1); public UpdateField SecondaryItemModifiedAppearanceID = new(0, 2); @@ -1060,8 +1080,6 @@ namespace Game.Entities public UpdateField ItemAppearanceModID = new(0, 4); public UpdateField ItemVisual = new(0, 5); - public VisibleItem() : base(6) { } - public void WriteCreate(WorldPacket data, Unit owner, Player receiver) { data.WriteUInt32(ItemID); @@ -1116,7 +1134,7 @@ namespace Game.Entities } } - public class PassiveSpellHistory + public class PassiveSpellHistory : IEquatable { public int SpellID; public int AuraSpellID; @@ -1132,12 +1150,68 @@ namespace Game.Entities data.WriteInt32(SpellID); data.WriteInt32(AuraSpellID); } + + public bool Equals(PassiveSpellHistory right) + { + return SpellID == right.SpellID + && AuraSpellID == right.AuraSpellID; + } } - public class UnitData : HasChangesMask + public class UnitAssistActionData() : HasChangesMask(4) { - static int ChangeMaskLength = 222; + public UpdateField Type = new(0, 1); + public UpdateFieldString PlayerName = new(0, 2); + public UpdateField VirtualRealmAddress = new(0, 3); + public void WriteCreate(WorldPacket data, Unit owner, Player receiver) + { + data.WriteUInt8(Type); + data.WriteUInt32(VirtualRealmAddress); + data.WriteBits(PlayerName.Size(), 6); + data.FlushBits(); + data.WriteString(PlayerName); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Unit owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteUInt8(Type); + } + if (changesMask[3]) + { + data.WriteUInt32(VirtualRealmAddress); + } + if (changesMask[2]) + { + data.WriteBits(PlayerName.Size(), 6); + data.FlushBits(); + data.WriteString(PlayerName); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Type); + ClearChangesMask(PlayerName); + ClearChangesMask(VirtualRealmAddress); + _changesMask.ResetAll(); + } + } + + public class UnitData() : HasChangesMask(223) + { public UpdateField Field_314 = new(0, 1); public UpdateField> StateWorldEffectIDs = new(0, 2); public DynamicUpdateField PassiveSpells = new(0, 3); @@ -1268,21 +1342,20 @@ namespace Game.Entities public UpdateField Field_31C = new(128, 132); public UpdateField Field_320 = new(128, 133); // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount public UpdateField NameplateAttachToGUID = new(128, 134); // When set, nameplate of this unit will instead appear on that object - public UpdateFieldArray Power = new(10, 135, 136); - public UpdateFieldArray MaxPower = new(10, 135, 146); - public UpdateFieldArray PowerRegenFlatModifier = new(10, 135, 156); - public UpdateFieldArray PowerRegenInterruptedFlatModifier = new(10, 135, 166); - public UpdateFieldArray VirtualItems = new(3, 176, 177); - public UpdateFieldArray AttackRoundBaseTime = new(2, 180, 181); - public UpdateFieldArray Stats = new(4, 183, 184); - public UpdateFieldArray StatPosBuff = new(4, 183, 188); - public UpdateFieldArray StatNegBuff = new(4, 183, 192); - public UpdateFieldArray StatSupportBuff = new(4, 183, 196); - public UpdateFieldArray Resistances = new(7, 200, 201); - public UpdateFieldArray BonusResistanceMods = new(7, 200, 208); - public UpdateFieldArray ManaCostModifier = new(7, 200, 215); - - public UnitData() : base((int)EntityFragment.CGObject, TypeId.Unit, ChangeMaskLength) { } + public OptionalUpdateField AssistActionData = new(128, 135); + public UpdateFieldArray Power = new(10, 136, 137); + public UpdateFieldArray MaxPower = new(10, 136, 147); + public UpdateFieldArray PowerRegenFlatModifier = new(10, 136, 157); + public UpdateFieldArray PowerRegenInterruptedFlatModifier = new(10, 136, 167); + public UpdateFieldArray VirtualItems = new(3, 177, 178); + public UpdateFieldArray AttackRoundBaseTime = new(2, 181, 182); + public UpdateFieldArray Stats = new(4, 184, 185); + public UpdateFieldArray StatPosBuff = new(4, 184, 189); + public UpdateFieldArray StatNegBuff = new(4, 184, 193); + public UpdateFieldArray StatSupportBuff = new(4, 184, 197); + public UpdateFieldArray Resistances = new(7, 201, 202); + public UpdateFieldArray BonusResistanceMods = new(7, 201, 209); + public UpdateFieldArray ManaCostModifier = new(7, 201, 216); public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { @@ -1487,34 +1560,45 @@ namespace Game.Entities for (int i = 0; i < ChannelObjects.Size(); ++i) data.WritePackedGuid(ChannelObjects[i]); + data.FlushBits(); data.WriteBit(Field_314); + data.WriteBits(AssistActionData.HasValue(), 1); + if (AssistActionData.HasValue()) + { + AssistActionData.GetValue().WriteCreate(data, owner, receiver); + } data.FlushBits(); } - public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + public void UnitDataAppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(ChangeMaskLength, [0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u]); - AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); - WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) + allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xE0000100u, 0xFF01FFFFu, 0x7FFFFFFFu])); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) + allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xE0000100u, 0x0001FFFFu, 0x00000000u])); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) + allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0001FE00u])); } public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xF0000080u, 0xFF80FFFFu, 0x3FFFFFFFu])); - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) - allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF0000080u, 0x0000FFFFu, 0x00000000u])); - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) - allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u])); + UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(ChangeMaskLength, [0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u]); + UpdateMask allowedMaskForTarget = new(ChangeMaskLength, [0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u]); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask.AND(allowedMaskForTarget); } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) + { + UpdateMask allowedMaskForTarget = new(ChangeMaskLength, [0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u]); + AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); + } + public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Unit owner, Player receiver) { data.WriteBits(changesMask.GetBlocksMask(0), 7); @@ -2110,84 +2194,93 @@ namespace Game.Entities { data.WritePackedGuid(NameplateAttachToGUID); } + data.WriteBits(AssistActionData.HasValue(), 1); + data.FlushBits(); + if (changesMask[135]) + { + if (AssistActionData.HasValue()) + { + AssistActionData.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } - if (changesMask[135]) + if (changesMask[136]) { for (int i = 0; i < 10; ++i) { - if (changesMask[136 + i]) + if (changesMask[137 + i]) { data.WriteInt32(Power[i]); } - if (changesMask[146 + i]) + if (changesMask[147 + i]) { data.WriteUInt32(MaxPower[i]); } - if (changesMask[156 + i]) + if (changesMask[157 + i]) { data.WriteFloat(PowerRegenFlatModifier[i]); } - if (changesMask[166 + i]) + if (changesMask[167 + i]) { data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[176]) + if (changesMask[177]) { for (int i = 0; i < 3; ++i) { - if (changesMask[177 + i]) + if (changesMask[178 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[180]) + if (changesMask[181]) { for (int i = 0; i < 2; ++i) { - if (changesMask[181 + i]) + if (changesMask[182 + i]) { data.WriteUInt32(AttackRoundBaseTime[i]); } } } - if (changesMask[183]) + if (changesMask[184]) { for (int i = 0; i < 4; ++i) { - if (changesMask[184 + i]) + if (changesMask[185 + i]) { data.WriteInt32(Stats[i]); } - if (changesMask[188 + i]) + if (changesMask[189 + i]) { data.WriteInt32(StatPosBuff[i]); } - if (changesMask[192 + i]) + if (changesMask[193 + i]) { data.WriteInt32(StatNegBuff[i]); } - if (changesMask[196 + i]) + if (changesMask[197 + i]) { data.WriteInt32(StatSupportBuff[i]); } } } - if (changesMask[200]) + if (changesMask[201]) { for (int i = 0; i < 7; ++i) { - if (changesMask[201 + i]) + if (changesMask[202 + i]) { data.WriteInt32(Resistances[i]); } - if (changesMask[208 + i]) + if (changesMask[209 + i]) { data.WriteInt32(BonusResistanceMods[i]); } - if (changesMask[215 + i]) + if (changesMask[216 + i]) { data.WriteInt32(ManaCostModifier[i]); } @@ -2328,6 +2421,7 @@ namespace Game.Entities ClearChangesMask(Field_31C); ClearChangesMask(Field_320); ClearChangesMask(NameplateAttachToGUID); + ClearChangesMask(AssistActionData); ClearChangesMask(Power); ClearChangesMask(MaxPower); ClearChangesMask(PowerRegenFlatModifier); @@ -2607,7 +2701,7 @@ namespace Game.Entities } } - public class ChrCustomizationChoice : IComparable + public class ChrCustomizationChoice : IEquatable { public uint ChrCustomizationOptionID; public uint ChrCustomizationChoiceID; @@ -2624,24 +2718,21 @@ namespace Game.Entities data.WriteUInt32(ChrCustomizationChoiceID); } - public int CompareTo(ChrCustomizationChoice other) + public bool Equals(ChrCustomizationChoice right) { - return ChrCustomizationOptionID.CompareTo(other.ChrCustomizationOptionID); + return ChrCustomizationOptionID == right.ChrCustomizationOptionID + && ChrCustomizationChoiceID == right.ChrCustomizationChoiceID; } } - public class QuestLog : HasChangesMask + public class QuestLog() : HasChangesMask(30) { - static int changeMaskLength = 30; - public UpdateField EndTime = new(0, 1); public UpdateField QuestID = new(0, 2); public UpdateField StateFlags = new(0, 3); public UpdateField ObjectiveFlags = new(0, 4); public UpdateFieldArray ObjectiveProgress = new(24, 5, 6); - public QuestLog() : base(changeMaskLength) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt64(EndTime); @@ -2707,7 +2798,7 @@ namespace Game.Entities } } - public class ArenaCooldown : HasChangesMask + public class ArenaCooldown() : HasChangesMask(8) { public UpdateField SpellID = new(0, 1); public UpdateField Charges = new(0, 2); @@ -2717,8 +2808,6 @@ namespace Game.Entities public UpdateField NextChargeTime = new(0, 6); public UpdateField MaxCharges = new(0, 7); - public ArenaCooldown() : base(8) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(SpellID); @@ -2785,13 +2874,11 @@ namespace Game.Entities } } - public class ZonePlayerForcedReaction : HasChangesMask + public class ZonePlayerForcedReaction() : HasChangesMask(3) { public UpdateField FactionID = new(0, 1); public UpdateField Reaction = new(0, 2); - public ZonePlayerForcedReaction() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(FactionID); @@ -2828,13 +2915,11 @@ namespace Game.Entities } } - public class PetCreatureName : HasChangesMask + public class PetCreatureName() : HasChangesMask(3) { public UpdateField CreatureID = new(0, 1); public UpdateFieldString Name = new(0, 2); - public PetCreatureName() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteUInt32(CreatureID); @@ -2875,7 +2960,7 @@ namespace Game.Entities } } - public class CTROptions + public class CTROptions : IEquatable { public uint ConditionalFlags; public byte FactionGroup; @@ -2894,14 +2979,77 @@ namespace Game.Entities data.WriteUInt8(FactionGroup); data.WriteUInt32(ChromieTimeExpansionMask); } + + public bool Equals(CTROptions right) + { + return ConditionalFlags == right.ConditionalFlags + && FactionGroup == right.FactionGroup + && ChromieTimeExpansionMask == right.ChromieTimeExpansionMask; + } } - public class DeclinedNames : HasChangesMask + public struct LeaverInfo : IEquatable + { + public ObjectGuid BnetAccountGUID; + public float LeaveScore; + public uint SeasonID; + public uint TotalLeaves; + public uint TotalSuccesses; + public int ConsecutiveSuccesses; + public long LastPenaltyTime; + public long LeaverExpirationTime; + public int Unknown_1120; + public uint LeaverStatus; + + public void WriteCreate(WorldPacket data, Player owner, Player receiver) + { + data.WritePackedGuid(BnetAccountGUID); + data.WriteFloat(LeaveScore); + data.WriteUInt32(SeasonID); + data.WriteUInt32(TotalLeaves); + data.WriteUInt32(TotalSuccesses); + data.WriteInt32(ConsecutiveSuccesses); + data.WriteInt64(LastPenaltyTime); + data.WriteInt64(LeaverExpirationTime); + data.WriteInt32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) + { + data.WritePackedGuid(BnetAccountGUID); + data.WriteFloat(LeaveScore); + data.WriteUInt32(SeasonID); + data.WriteUInt32(TotalLeaves); + data.WriteUInt32(TotalSuccesses); + data.WriteInt32(ConsecutiveSuccesses); + data.WriteInt64(LastPenaltyTime); + data.WriteInt64(LeaverExpirationTime); + data.WriteInt32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); + } + + public bool Equals(LeaverInfo right) + { + return BnetAccountGUID == right.BnetAccountGUID + && LeaveScore == right.LeaveScore + && SeasonID == right.SeasonID + && TotalLeaves == right.TotalLeaves + && TotalSuccesses == right.TotalSuccesses + && ConsecutiveSuccesses == right.ConsecutiveSuccesses + && LastPenaltyTime == right.LastPenaltyTime + && LeaverExpirationTime == right.LeaverExpirationTime + && Unknown_1120 == right.Unknown_1120 + && LeaverStatus == right.LeaverStatus; + } + } + + public class DeclinedNames() : HasChangesMask(6) { 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) @@ -2956,7 +3104,7 @@ namespace Game.Entities } } - public class CustomTabardInfo : HasChangesMask + public class CustomTabardInfo() : HasChangesMask(6) { public UpdateField EmblemStyle = new(0, 1); public UpdateField EmblemColor = new(0, 2); @@ -2964,8 +3112,6 @@ namespace Game.Entities 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); @@ -3020,7 +3166,7 @@ namespace Game.Entities } } - public class PlayerData : HasChangesMask + public class PlayerData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.Player, 324) { public UpdateField HasQuestSession = new(0, 1); public UpdateField HasLevelLink = new(0, 2); @@ -3050,31 +3196,31 @@ namespace Game.Entities public UpdateField FakeInebriation = new(0, 26); public UpdateField VirtualPlayerRealm = new(0, 27); public UpdateField CurrentSpecID = new(0, 28); - public UpdateField TaxiMountAnimKitID = new(0, 29); - public UpdateField CurrentBattlePetBreedQuality = new(0, 30); - public UpdateField HonorLevel = new(0, 31); - public UpdateField LogoutTime = new(32, 33); - public UpdateFieldString Name = new(32, 34); - public UpdateField Field_1AC = new(32, 35); - public UpdateField Field_1B0 = new(32, 36); - public UpdateField CurrentBattlePetSpeciesID = new(32, 37); - public UpdateField CtrOptions = new(32, 38); - public UpdateField CovenantID = new(32, 39); - public UpdateField SoulbindID = new(32, 40); - public UpdateField DungeonScore = new(32, 41); - public UpdateField SpectateTarget = new(32, 42); - public UpdateField Field_200 = new(32, 43); - public OptionalUpdateField DeclinedNames = new(32, 44); - public UpdateField PersonalTabard = new(32, 45); - public UpdateFieldArray PartyType = new(2, 46, 47); - public UpdateFieldArray QuestLog = new(175, 49, 50); - public UpdateFieldArray VisibleItems = new(19, 225, 226); - public UpdateFieldArray AvgItemLevel = new(6, 245, 246); - public UpdateFieldArray ForcedReactions = new(32, 252, 253); - public UpdateFieldArray VisibleEquipableSpells = new(16, 285, 286); - public UpdateFieldArray Field_3120 = new(19, 302, 303); - - public PlayerData() : base((int)EntityFragment.CGObject, TypeId.Player, 322) { } + public UpdateField CurrentCombatTraitConfigSubTreeID = new(0, 29); + public UpdateField TaxiMountAnimKitID = new(0, 30); + public UpdateField CurrentBattlePetBreedQuality = new(0, 31); + public UpdateField HonorLevel = new(32, 33); + public UpdateField LogoutTime = new(32, 34); + public UpdateFieldString Name = new(32, 35); + public UpdateField Field_1AC = new(32, 36); + public UpdateField Field_1B0 = new(32, 37); + public UpdateField CurrentBattlePetSpeciesID = new(32, 38); + public UpdateField CtrOptions = new(32, 39); + public UpdateField CovenantID = new(32, 40); + public UpdateField SoulbindID = new(32, 41); + public UpdateField DungeonScore = new(32, 42); + public UpdateField LeaverInfo = new(32, 43); + public UpdateField SpectateTarget = new(32, 44); + public UpdateField Field_200 = new(32, 45); + public OptionalUpdateField DeclinedNames = new(32, 46); + public UpdateField PersonalTabard = new(32, 47); + public UpdateFieldArray PartyType = new(2, 48, 49); + public UpdateFieldArray QuestLog = new(175, 51, 52); + public UpdateFieldArray VisibleItems = new(19, 227, 228); + public UpdateFieldArray AvgItemLevel = new(6, 247, 248); + public UpdateFieldArray ForcedReactions = new(32, 254, 255); + public UpdateFieldArray VisibleEquipableSpells = new(16, 287, 288); + public UpdateFieldArray Field_3120 = new(19, 304, 305); public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { @@ -3115,6 +3261,7 @@ namespace Game.Entities data.WriteInt32(FakeInebriation); data.WriteUInt32(VirtualPlayerRealm); data.WriteUInt32(CurrentSpecID); + data.WriteInt32(CurrentCombatTraitConfigSubTreeID); data.WriteInt32(TaxiMountAnimKitID); for (int i = 0; i < 6; ++i) { @@ -3176,6 +3323,7 @@ namespace Game.Entities data.WriteBits(DeclinedNames.HasValue(), 1); DungeonScore.GetValue().Write(data); data.WriteString(Name); + LeaverInfo.GetValue().WriteCreate(data, owner, receiver); for (int i = 0; i < 16; ++i) { VisibleEquipableSpells[i].Write(data); @@ -3191,26 +3339,31 @@ namespace Game.Entities data.FlushBits(); } - public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + public void PlayerDataAppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(322, [0xFFFFFFDDu, 0x0001FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFEu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000003u]); - AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); - WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); + if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) + allowedMaskForTarget.OR(new UpdateMask(ChangeMaskLength, [0x00000022u, 0xFFF80000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u])); } public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { - if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember)) - allowedMaskForTarget.OR(new UpdateMask(322, [0x00000022u, 0xFFFE0000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u, 0x00000000u, 0x00000000u, 0x00000000u])); + PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(322, [0xFFFFFFDDu, 0x0001FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFFEu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000003u]); - AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + UpdateMask allowedMaskForTarget = new(324, [0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu]); + PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask.AND(allowedMaskForTarget); } + public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) + { + UpdateMask allowedMaskForTarget = new(324, [0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu]); + PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); + WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); + } + public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Player owner, Player receiver) { data.WriteBits(changesMask.GetBlocksMask(0), 11); @@ -3420,74 +3573,82 @@ namespace Game.Entities } if (changesMask[29]) { - data.WriteInt32(TaxiMountAnimKitID); + data.WriteInt32(CurrentCombatTraitConfigSubTreeID); } if (changesMask[30]) { - data.WriteUInt8(CurrentBattlePetBreedQuality); + data.WriteInt32(TaxiMountAnimKitID); } if (changesMask[31]) { - data.WriteUInt32(HonorLevel); + data.WriteUInt8(CurrentBattlePetBreedQuality); } } if (changesMask[32]) { if (changesMask[33]) { - data.WriteInt64(LogoutTime); + data.WriteUInt32(HonorLevel); } - if (changesMask[35]) + if (changesMask[34]) { - data.WriteInt32(Field_1AC); + data.WriteInt64(LogoutTime); } if (changesMask[36]) { - data.WriteInt32(Field_1B0); + data.WriteInt32(Field_1AC); } if (changesMask[37]) { - data.WriteInt32(CurrentBattlePetSpeciesID); + data.WriteInt32(Field_1B0); } if (changesMask[38]) { - ((CTROptions)CtrOptions).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data.WriteInt32(CurrentBattlePetSpeciesID); } if (changesMask[39]) { - data.WriteInt32(CovenantID); + ((CTROptions)CtrOptions).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[40]) + { + data.WriteInt32(CovenantID); + } + if (changesMask[41]) { data.WriteInt32(SoulbindID); } - if (changesMask[42]) + if (changesMask[44]) { data.WritePackedGuid(SpectateTarget); } - if (changesMask[43]) + if (changesMask[45]) { data.WriteInt32(Field_200); } - if (changesMask[45]) + if (changesMask[47]) { PersonalTabard.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[34]) + if (changesMask[35]) { data.WriteBits(Name.Size(), 6); } data.WriteBits(DeclinedNames.HasValue(), 1); data.FlushBits(); - if (changesMask[41]) + if (changesMask[42]) { DungeonScore.GetValue().Write(data); } - if (changesMask[34]) + if (changesMask[35]) { data.WriteString(Name); } - if (changesMask[44]) + if (changesMask[43]) + { + LeaverInfo.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[46]) { if (DeclinedNames.HasValue()) { @@ -3495,21 +3656,21 @@ namespace Game.Entities } } } - if (changesMask[46]) + if (changesMask[48]) { for (int i = 0; i < 2; ++i) { - if (changesMask[47 + i]) + if (changesMask[49 + i]) { data.WriteUInt8(PartyType[i]); } } } - if (changesMask[49]) + if (changesMask[51]) { for (int i = 0; i < 175; ++i) { - if (changesMask[50 + i]) + if (changesMask[52 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -3518,51 +3679,51 @@ namespace Game.Entities } } } - if (changesMask[225]) + if (changesMask[227]) { for (int i = 0; i < 19; ++i) { - if (changesMask[226 + i]) + if (changesMask[228 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[245]) + if (changesMask[247]) { for (int i = 0; i < 6; ++i) { - if (changesMask[246 + i]) + if (changesMask[248 + i]) { data.WriteFloat(AvgItemLevel[i]); } } } - if (changesMask[252]) + if (changesMask[254]) { for (int i = 0; i < 32; ++i) { - if (changesMask[253 + i]) + if (changesMask[255 + i]) { ForcedReactions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[302]) + if (changesMask[304]) { for (int i = 0; i < 19; ++i) { - if (changesMask[303 + i]) + if (changesMask[305 + i]) { data.WriteUInt32(Field_3120[i]); } } } - if (changesMask[285]) + if (changesMask[287]) { for (int i = 0; i < 16; ++i) { - if (changesMask[286 + i]) + if (changesMask[288 + i]) { VisibleEquipableSpells[i].Write(data); } @@ -3601,6 +3762,7 @@ namespace Game.Entities ClearChangesMask(FakeInebriation); ClearChangesMask(VirtualPlayerRealm); ClearChangesMask(CurrentSpecID); + ClearChangesMask(CurrentCombatTraitConfigSubTreeID); ClearChangesMask(TaxiMountAnimKitID); ClearChangesMask(CurrentBattlePetBreedQuality); ClearChangesMask(HonorLevel); @@ -3613,6 +3775,7 @@ namespace Game.Entities ClearChangesMask(CovenantID); ClearChangesMask(SoulbindID); ClearChangesMask(DungeonScore); + ClearChangesMask(LeaverInfo); ClearChangesMask(SpectateTarget); ClearChangesMask(Field_200); ClearChangesMask(DeclinedNames); @@ -3630,7 +3793,7 @@ namespace Game.Entities bool IsQuestLogChangesMaskSkipped() { return false; } // bandwidth savings aren't worth the cpu time } - public class SkillInfo : HasChangesMask + public class SkillInfo() : HasChangesMask(1793) { public UpdateFieldArray SkillLineID = new(256, 0, 1); public UpdateFieldArray SkillStep = new(256, 0, 257); @@ -3640,8 +3803,6 @@ namespace Game.Entities public UpdateFieldArray SkillTempBonus = new(256, 0, 1281); public UpdateFieldArray SkillPermBonus = new(256, 0, 1537); - public SkillInfo() : base(1793) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { for (int i = 0; i < 256; ++i) @@ -3719,12 +3880,10 @@ namespace Game.Entities } } - public class BitVector : HasChangesMask + public class BitVector() : HasChangesMask(2) { public DynamicUpdateField Values = new(0, 1); - public BitVector() : base(2) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(Values.Size()); @@ -3773,12 +3932,10 @@ namespace Game.Entities } } - public class BitVectors : HasChangesMask + public class BitVectors() : HasChangesMask(14) { public UpdateFieldArray Values = new(13, 0, 1); - public BitVectors() : base(1) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { for (int i = 0; i < 13; ++i) @@ -3815,7 +3972,7 @@ namespace Game.Entities } } - public class PlayerDataElement + public class PlayerDataElement : IEquatable { public uint Type; public float FloatValue; @@ -3846,15 +4003,20 @@ namespace Game.Entities data.WriteInt64(Int64Value); } } + + public bool Equals(PlayerDataElement right) + { + return Type == right.Type + && FloatValue == right.FloatValue + && Int64Value == right.Int64Value; + } } - public class RestInfo : HasChangesMask + public class RestInfo() : HasChangesMask(3) { public UpdateField Threshold = new(0, 1); public UpdateField StateID = new(0, 2); - public RestInfo() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteUInt32(Threshold); @@ -3891,7 +4053,7 @@ namespace Game.Entities } } - public class PVPInfo : HasChangesMask + public class PVPInfo() : HasChangesMask(19) { public UpdateField Disqualified = new(0, 1); public UpdateField Bracket = new(0, 2); @@ -3912,8 +4074,6 @@ namespace Game.Entities public UpdateField SeasonRoundsPlayed = new(0, 17); public UpdateField SeasonRoundsWon = new(0, 18); - public PVPInfo() : base(19) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt8(Bracket); @@ -4051,7 +4211,7 @@ namespace Game.Entities } } - public class CharacterRestriction + public class CharacterRestriction : IEquatable { public int Field_0; public int Field_4; @@ -4075,9 +4235,17 @@ namespace Game.Entities data.WriteBits(Type, 5); data.FlushBits(); } + + public bool Equals(CharacterRestriction right) + { + return Field_0 == right.Field_0 + && Field_4 == right.Field_4 + && Field_8 == right.Field_8 + && Type == right.Type; + } } - public class SpellPctModByLabel + public class SpellPctModByLabel : IEquatable { public int ModIndex; public float ModifierValue; @@ -4096,9 +4264,16 @@ namespace Game.Entities data.WriteFloat(ModifierValue); data.WriteInt32(LabelID); } + + public bool Equals(SpellPctModByLabel right) + { + return ModIndex == right.ModIndex + && ModifierValue == right.ModifierValue + && LabelID == right.LabelID; + } } - public class SpellFlatModByLabel + public class SpellFlatModByLabel : IEquatable { public int ModIndex; public int ModifierValue; @@ -4117,16 +4292,21 @@ namespace Game.Entities data.WriteInt32(ModifierValue); data.WriteInt32(LabelID); } + + public bool Equals(SpellFlatModByLabel right) + { + return ModIndex == right.ModIndex + && ModifierValue == right.ModifierValue + && LabelID == right.LabelID; + } } - public class CompletedProject : HasChangesMask + public class CompletedProject() : HasChangesMask(4) { public UpdateField ProjectID = new(0, 1); public UpdateField FirstCompleted = new(0, 2); public UpdateField CompletionCount = new(0, 3); - public CompletedProject() : base(4) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteUInt32(ProjectID); @@ -4169,12 +4349,10 @@ namespace Game.Entities } } - public class ResearchHistory : HasChangesMask + public class ResearchHistory() : HasChangesMask(2) { public DynamicUpdateField CompletedProjects = new(0, 1); - public ResearchHistory() : base(2) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(CompletedProjects.Size()); @@ -4225,7 +4403,7 @@ namespace Game.Entities } } - public class MawPower + public class MawPower : IEquatable { public int SpellID; public int MawPowerID; @@ -4244,9 +4422,16 @@ namespace Game.Entities data.WriteInt32(MawPowerID); data.WriteInt32(Stacks); } + + public bool Equals(MawPower right) + { + return SpellID == right.SpellID + && MawPowerID == right.MawPowerID + && Stacks == right.Stacks; + } } - public class MultiFloorExplore + public class MultiFloorExplore : IEquatable { public List WorldMapOverlayIDs = new(); @@ -4268,9 +4453,14 @@ namespace Game.Entities } data.FlushBits(); } + + public bool Equals(MultiFloorExplore right) + { + return WorldMapOverlayIDs == right.WorldMapOverlayIDs; + } } - public class RecipeProgressionInfo + public class RecipeProgressionInfo : IEquatable { public ushort RecipeProgressionGroupID; public ushort Experience; @@ -4286,15 +4476,19 @@ namespace Game.Entities data.WriteUInt16(RecipeProgressionGroupID); data.WriteUInt16(Experience); } + + public bool Equals(RecipeProgressionInfo right) + { + return RecipeProgressionGroupID == right.RecipeProgressionGroupID + && Experience == right.Experience; + } } - public class ActivePlayerUnk901 : HasChangesMask + public class ActivePlayerUnk901() : HasChangesMask(3) { public UpdateField Field_0 = new(0, 1); public UpdateField Field_10 = new(0, 2); - public ActivePlayerUnk901() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WritePackedGuid(Field_0); @@ -4331,13 +4525,11 @@ namespace Game.Entities } } - public class QuestSession : HasChangesMask + public class QuestSession() : HasChangesMask(3) { public UpdateField Owner = new(0, 1); public UpdateField QuestCompleted = new(0, 2); - public QuestSession() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WritePackedGuid(Owner); @@ -4375,13 +4567,11 @@ namespace Game.Entities } } - public class ReplayedQuest : HasChangesMask + public class ReplayedQuest() : HasChangesMask(3) { public UpdateField QuestID = new(0, 1); public UpdateField ReplayTime = new(0, 2); - public ReplayedQuest() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(QuestID); @@ -4424,6 +4614,7 @@ namespace Game.Entities public int TraitNodeEntryID; public int Rank; public int GrantedRanks; + public int BonusRanks; public void WriteCreate(WorldPacket data, Player owner, Player receiver) { @@ -4431,6 +4622,7 @@ namespace Game.Entities data.WriteInt32(TraitNodeEntryID); data.WriteInt32(Rank); data.WriteInt32(GrantedRanks); + data.WriteInt32(BonusRanks); } public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) @@ -4439,6 +4631,7 @@ namespace Game.Entities data.WriteInt32(TraitNodeEntryID); data.WriteInt32(Rank); data.WriteInt32(GrantedRanks); + data.WriteInt32(BonusRanks); } public bool Equals(TraitEntry right) @@ -4446,11 +4639,12 @@ namespace Game.Entities return TraitNodeID == right.TraitNodeID && TraitNodeEntryID == right.TraitNodeEntryID && Rank == right.Rank - && GrantedRanks == right.GrantedRanks; + && GrantedRanks == right.GrantedRanks + && BonusRanks == right.BonusRanks; } } - public class TraitSubTreeCache + public class TraitSubTreeCache : IEquatable { public List Entries = new(); public int TraitSubTreeID; @@ -4480,9 +4674,16 @@ namespace Game.Entities data.WriteBits(Active, 1); data.FlushBits(); } + + public bool Equals(TraitSubTreeCache right) + { + return Entries == right.Entries + && TraitSubTreeID == right.TraitSubTreeID + && Active == right.Active; + } } - public class TraitConfig : HasChangesMask + public class TraitConfig() : HasChangesMask(14) { public DynamicUpdateField Entries = new(0, 1); public DynamicUpdateField SubTrees = new(0, 2); @@ -4495,8 +4696,6 @@ namespace Game.Entities public UpdateField LocalIdentifier = new(8, 11); public UpdateField TraitSystemID = new(12, 13); - public TraitConfig() : base(14) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(ID); @@ -4658,7 +4857,7 @@ namespace Game.Entities } } - public class CraftingOrderItem : HasChangesMask + public class CraftingOrderItem() : HasChangesMask(7) { public UpdateField Field_0 = new(-1, 0); public UpdateField ItemGUID = new(-1, 1); @@ -4668,8 +4867,6 @@ namespace Game.Entities public UpdateField ReagentQuality = new(-1, 5); public OptionalUpdateField DataSlotIndex = new(-1, 6); - public CraftingOrderItem() : base(7) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteUInt64(Field_0); @@ -4743,13 +4940,11 @@ namespace Game.Entities } } - public class CraftingOrderCustomer : HasChangesMask + public class CraftingOrderCustomer() : HasChangesMask(2) { public UpdateField CustomerGUID = new(-1, 0); public UpdateField CustomerAccountGUID = new(-1, 1); - public CraftingOrderCustomer() : base(2) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WritePackedGuid(CustomerGUID); @@ -4783,13 +4978,11 @@ namespace Game.Entities } } - public class CraftingOrderNpcCustomer : HasChangesMask + public class CraftingOrderNpcCustomer() : HasChangesMask(2) { public UpdateField NpcCraftingOrderCustomerID = new(-1, 0); public UpdateField Field_8 = new(-1, 1); - public CraftingOrderNpcCustomer() : base(2) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt64(NpcCraftingOrderCustomerID); @@ -4823,7 +5016,7 @@ namespace Game.Entities } } - public class CraftingOrderData : HasChangesMask + public class CraftingOrderData() : HasChangesMask(26) { public DynamicUpdateField Reagents = new(0, 1); public UpdateField Field_0 = new(0, 2); @@ -4847,8 +5040,6 @@ namespace Game.Entities public OptionalUpdateField OutputItem = new(18, 23); public OptionalUpdateField OutputItemData = new(24, 25); - public CraftingOrderData() : base(26) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(Field_0); @@ -5077,15 +5268,13 @@ namespace Game.Entities } } - public class CraftingOrder : HasChangesMask + public class CraftingOrder() : HasChangesMask(4) { public DynamicUpdateField Enchantments = new(-1, 0); public DynamicUpdateField Gems = new(-1, 1); public UpdateField Data = new(-1, 2); public OptionalUpdateField RecraftItemInfo = new(-1, 3); - public CraftingOrder() : base(4) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { Data.GetValue().WriteCreate(data, owner, receiver); @@ -5178,13 +5367,11 @@ namespace Game.Entities } } - public class PersonalCraftingOrderCount : HasChangesMask + public class PersonalCraftingOrderCount() : HasChangesMask(2) { public UpdateField ProfessionID = new(-1, 0); public UpdateField Count = new(-1, 1); - public PersonalCraftingOrderCount() : base(2) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(ProfessionID); @@ -5218,15 +5405,13 @@ namespace Game.Entities } } - public class NPCCraftingOrderInfo : HasChangesMask + public class NPCCraftingOrderInfo() : HasChangesMask(4) { public UpdateField OrderID = new(-1, 0); public UpdateField NpcCraftingOrderSetID = new(-1, 1); public UpdateField NpcTreasureID = new(-1, 2); public UpdateField NpcCraftingOrderCustomerID = new(-1, 3); - public NPCCraftingOrderInfo() : base(4) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteUInt64(OrderID); @@ -5272,7 +5457,7 @@ namespace Game.Entities } } - public struct CategoryCooldownMod + public struct CategoryCooldownMod : IEquatable { public int SpellCategoryID; public int ModCooldown; @@ -5288,9 +5473,15 @@ namespace Game.Entities data.WriteInt32(SpellCategoryID); data.WriteInt32(ModCooldown); } + + public bool Equals(CategoryCooldownMod right) + { + return SpellCategoryID == right.SpellCategoryID + && ModCooldown == right.ModCooldown; + } } - public struct WeeklySpellUse + public struct WeeklySpellUse : IEquatable { public int SpellCategoryID; public byte Uses; @@ -5306,9 +5497,15 @@ namespace Game.Entities data.WriteInt32(SpellCategoryID); data.WriteUInt8(Uses); } + + public bool Equals(WeeklySpellUse right) + { + return SpellCategoryID == right.SpellCategoryID + && Uses == right.Uses; + } } - public class StablePetInfo : HasChangesMask + public class StablePetInfo() : HasChangesMask(9) { public UpdateField PetSlot = new(0, 1); public UpdateField PetNumber = new(0, 2); @@ -5319,8 +5516,6 @@ namespace Game.Entities public UpdateField PetFlags = new(0, 7); public UpdateField Specialization = new(0, 8); - public StablePetInfo() : base(9) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteUInt32(PetSlot); @@ -5397,13 +5592,11 @@ namespace Game.Entities } } - public class StableInfo : HasChangesMask + public class StableInfo() : HasChangesMask(3) { public DynamicUpdateField Pets = new(0, 1); public UpdateField StableMaster = new(0, 2); - public StableInfo() : base(3) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(Pets.Size()); @@ -5460,14 +5653,12 @@ namespace Game.Entities } } - public class CollectableSourceTrackedData : HasChangesMask + public class CollectableSourceTrackedData() : HasChangesMask(4) { public UpdateField TargetType = new(0, 1); public UpdateField TargetID = new(0, 2); public UpdateField CollectableSourceInfoID = new(0, 3); - public CollectableSourceTrackedData() : base(4) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteInt32(TargetType); @@ -5510,15 +5701,13 @@ namespace Game.Entities } } - public class BankTabSettings : HasChangesMask + public class BankTabSettings() : HasChangesMask(4) { public UpdateFieldString Name = new(-1, 0); public UpdateFieldString Icon = new(-1, 1); public UpdateFieldString Description = new(-1, 2); public UpdateField DepositFlags = new(-1, 3); - public BankTabSettings() : base(4) { } - public void WriteCreate(WorldPacket data, Player owner, Player receiver) { data.WriteBits(Name.Size(), 7); @@ -5581,7 +5770,7 @@ namespace Game.Entities } } - public struct WalkInData + public struct WalkInData : IEquatable { public int MapID; public long Field_8; @@ -5605,9 +5794,17 @@ namespace Game.Entities data.WriteBits(Type, 1); data.FlushBits(); } + + public bool Equals(WalkInData right) + { + return MapID == right.MapID + && Field_8 == right.Field_8 + && Type == right.Type + && Field_18 == right.Field_18; + } } - public class DelveData + public class DelveData : IEquatable { public List Owners = new(); public int Field_0; @@ -5646,9 +5843,73 @@ namespace Game.Entities data.WriteBits(Started, 1); data.FlushBits(); } + + public bool Equals(DelveData right) + { + return Owners == right.Owners + && Field_0 == right.Field_0 + && Field_8 == right.Field_8 + && Field_10 == right.Field_10 + && SpellID == right.SpellID + && Started == right.Started; + } } - public struct Research + public struct ChallengeModeData : IEquatable + { + public int Unknown_1120_1; + public int Unknown_1120_2; + public ulong Unknown_1120_3; + public long Unknown_1120_4; + public ObjectGuid KeystoneOwnerGUID; + public ObjectGuid LeaverGUID; + public uint IsActive; + public uint HasRestrictions; + public uint CanVoteAbandon; + + public void WriteCreate(WorldPacket data, Player owner, Player receiver) + { + data.WriteInt32(Unknown_1120_1); + data.WriteInt32(Unknown_1120_2); + data.WriteUInt64(Unknown_1120_3); + data.WriteInt64(Unknown_1120_4); + data.WritePackedGuid(KeystoneOwnerGUID); + data.WritePackedGuid(LeaverGUID); + data.WriteBits(IsActive, 1); + data.WriteBits(HasRestrictions, 1); + data.WriteBits(CanVoteAbandon, 1); + data.FlushBits(); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, Player owner, Player receiver) + { + data.WriteInt32(Unknown_1120_1); + data.WriteInt32(Unknown_1120_2); + data.WriteUInt64(Unknown_1120_3); + data.WriteInt64(Unknown_1120_4); + data.WritePackedGuid(KeystoneOwnerGUID); + data.WritePackedGuid(LeaverGUID); + data.WriteBits(IsActive, 1); + data.WriteBits(HasRestrictions, 1); + data.WriteBits(CanVoteAbandon, 1); + data.FlushBits(); + } + + public bool Equals(ChallengeModeData right) + { + return Unknown_1120_1 == right.Unknown_1120_1 + && Unknown_1120_2 == right.Unknown_1120_2 + && Unknown_1120_3 == right.Unknown_1120_3 + && Unknown_1120_4 == right.Unknown_1120_4 + && KeystoneOwnerGUID == right.KeystoneOwnerGUID + && LeaverGUID == right.LeaverGUID + && IsActive == right.IsActive + && HasRestrictions == right.HasRestrictions + && CanVoteAbandon == right.CanVoteAbandon; + } + } + + public struct Research : IEquatable { public short ResearchProjectID; @@ -5661,13 +5922,16 @@ namespace Game.Entities { data.WriteInt16(ResearchProjectID); } + + public bool Equals(Research right) + { + return ResearchProjectID == right.ResearchProjectID; + } } - public class ActivePlayerData : HasChangesMask + public class ActivePlayerData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.ActivePlayer, 385) { - public static int QuestCompletedBitsPerBlock; - - static int changeMaskLength = 517; + public static int QuestCompletedBitsPerBlock = sizeof(ulong) * 8; public UpdateField BackpackAutoSortDisabled = new(0, 1); public UpdateField BackpackSellJunkDisabled = new(0, 2); @@ -5675,9 +5939,9 @@ namespace Game.Entities public UpdateField SortBagsRightToLeft = new(0, 4); public UpdateField InsertItemsLeftToRight = new(0, 5); public UpdateField HasPerksProgramPendingReward = new(0, 6); - public UpdateFieldArray> ResearchSites = new(1, 42, 43); - public UpdateFieldArray> ResearchSiteProgress = new(1, 44, 45); - public UpdateFieldArray> Research = new(1, 46, 47); + public UpdateFieldArray> ResearchSites = new(1, 43, 44); + public UpdateFieldArray> ResearchSiteProgress = new(1, 45, 46); + public UpdateFieldArray> Research = new(1, 47, 48); public DynamicUpdateField KnownTitles = new(0, 7); public DynamicUpdateField CharacterDataElements = new(0, 8); public DynamicUpdateField AccountDataElements = new(0, 9); @@ -5711,128 +5975,125 @@ namespace Game.Entities public DynamicUpdateField CharacterRestrictions = new(0, 24); public DynamicUpdateField TraitConfigs = new(32, 34); public DynamicUpdateField CraftingOrders = new(32, 35); - public DynamicUpdateField AccountBankTabSettings = new(32, 41); - public UpdateField FarsightObject = new(32, 48); - public UpdateField SummonedBattlePetGUID = new(32, 49); - public UpdateField Coinage = new(32, 50); - public UpdateField AccountBankCoinage = new(32, 51); - public UpdateField XP = new(32, 52); - public UpdateField NextLevelXP = new(32, 53); - public UpdateField TrialXP = new(32, 54); - public UpdateField Skill = new(32, 55); - public UpdateField CharacterPoints = new(32, 56); - public UpdateField MaxTalentTiers = new(32, 57); - public UpdateField TrackCreatureMask = new(32, 58); - public UpdateField MainhandExpertise = new(32, 59); - public UpdateField OffhandExpertise = new(32, 60); - public UpdateField RangedExpertise = new(32, 61); - public UpdateField CombatRatingExpertise = new(32, 62); - public UpdateField BlockPercentage = new(32, 63); - public UpdateField DodgePercentage = new(32, 64); - public UpdateField DodgePercentageFromAttribute = new(32, 65); - public UpdateField ParryPercentage = new(32, 66); - public UpdateField ParryPercentageFromAttribute = new(32, 67); - public UpdateField CritPercentage = new(32, 68); - public UpdateField RangedCritPercentage = new(32, 69); - public UpdateField OffhandCritPercentage = new(70, 71); - public UpdateField SpellCritPercentage = new(70, 72); - public UpdateField ShieldBlock = new(70, 73); - public UpdateField ShieldBlockCritPercentage = new(70, 74); - public UpdateField Mastery = new(70, 75); - public UpdateField Speed = new(70, 76); - public UpdateField Avoidance = new(70, 77); - public UpdateField Sturdiness = new(70, 78); - public UpdateField Versatility = new(70, 79); - public UpdateField VersatilityBonus = new(70, 80); - public UpdateField PvpPowerDamage = new(70, 81); - public UpdateField PvpPowerHealing = new(70, 82); - public UpdateField BitVectors = new(70, 83); - public UpdateField ModHealingDonePos = new(70, 84); - public UpdateField ModHealingPercent = new(70, 85); - public UpdateField ModPeriodicHealingDonePercent = new(70, 86); - public UpdateField ModSpellPowerPercent = new(70, 87); - public UpdateField ModResiliencePercent = new(70, 88); - public UpdateField OverrideSpellPowerByAPPercent = new(70, 89); - public UpdateField OverrideAPBySpellPowerPercent = new(70, 90); - public UpdateField ModTargetResistance = new(70, 91); - public UpdateField ModTargetPhysicalResistance = new(70, 92); - public UpdateField LocalFlags = new(70, 93); - public UpdateField GrantableLevels = new(70, 94); - public UpdateField MultiActionBars = new(70, 95); - public UpdateField LifetimeMaxRank = new(70, 96); - public UpdateField NumRespecs = new(70, 97); - public UpdateField PvpMedals = new(70, 98); - public UpdateField TodayHonorableKills = new(70, 99); - public UpdateField YesterdayHonorableKills = new(70, 100); - public UpdateField LifetimeHonorableKills = new(70, 101); - public UpdateField WatchedFactionIndex = new(102, 103); - public UpdateField MaxLevel = new(102, 104); - public UpdateField ScalingPlayerLevelDelta = new(102, 105); - public UpdateField MaxCreatureScalingLevel = new(102, 106); - public UpdateField PetSpellPower = new(102, 107); - public UpdateField UiHitModifier = new(102, 108); - public UpdateField UiSpellHitModifier = new(102, 109); - public UpdateField HomeRealmTimeOffset = new(102, 110); - public UpdateField ModPetHaste = new(102, 111); - public UpdateField JailersTowerLevelMax = new(102, 112); - public UpdateField JailersTowerLevel = new(102, 113); - public UpdateField LocalRegenFlags = new(102, 114); - public UpdateField AuraVision = new(102, 115); - public UpdateField NumBackpackSlots = new(102, 116); - public UpdateField OverrideSpellsID = new(102, 117); - public UpdateField LootSpecID = new(102, 118); - public UpdateField OverrideZonePVPType = new(102, 119); - public UpdateField Honor = new(102, 120); - public UpdateField HonorNextLevel = new(102, 121); - public UpdateField PerksProgramCurrency = new(102, 122); - public UpdateField NumBankSlots = new(102, 123); - public UpdateField NumAccountBankTabs = new(102, 124); - public UpdateField ResearchHistory = new(102, 125); - public UpdateField FrozenPerksVendorItem = new(102, 126); - public UpdateField Field_1410 = new(102, 128); - public OptionalUpdateField QuestSession = new(102, 127); - public UpdateField UiChromieTimeExpansionID = new(102, 129); - public UpdateField TimerunningSeasonID = new(102, 130); - public UpdateField TransportServerTime = new(102, 131); - public UpdateField WeeklyRewardsPeriodSinceOrigin = new(102, 132); // week count since Cfg_RegionsEntry::ChallengeOrigin - public UpdateField DEBUGSoulbindConduitRank = new(102, 133); - public UpdateField DungeonScore = new(134, 135); - public UpdateField ActiveCombatTraitConfigID = new(134, 136); - public UpdateField ItemUpgradeHighOnehandWeaponItemID = new(134, 137); - public UpdateField ItemUpgradeHighFingerItemID = new(134, 138); - public UpdateField ItemUpgradeHighFingerWatermark = new(134, 139); - public UpdateField ItemUpgradeHighTrinketItemID = new(134, 140); - public UpdateField ItemUpgradeHighTrinketWatermark = new(134, 141); - public UpdateField LootHistoryInstanceID = new(134, 142); - public OptionalUpdateField PetStable = new(134, 143); - public UpdateField RequiredMountCapabilityFlags = new(134, 144); - public OptionalUpdateField WalkInData = new(134, 145); - public OptionalUpdateField DelveData = new(134, 146); - public UpdateFieldArray InvSlots = new(232, 147, 148); - public UpdateFieldArray RestInfo = new(2, 380, 381); - public UpdateFieldArray ModDamageDonePos = new(7, 383, 384); - public UpdateFieldArray ModDamageDoneNeg = new(7, 383, 391); - public UpdateFieldArray ModDamageDonePercent = new(7, 383, 398); - public UpdateFieldArray ModHealingDonePercent = new(7, 383, 405); - public UpdateFieldArray WeaponDmgMultipliers = new(3, 412, 413); - public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 412, 416); - public UpdateFieldArray BuybackPrice = new(12, 419, 420); - public UpdateFieldArray BuybackTimestamp = new(12, 419, 432); - public UpdateFieldArray CombatRatings = new(32, 444, 445); - public UpdateFieldArray NoReagentCostMask = new(4, 477, 478); - public UpdateFieldArray ProfessionSkillLine = new(2, 482, 483); - public UpdateFieldArray BagSlotFlags = new(5, 485, 486); - public UpdateFieldArray BankBagSlotFlags = new(7, 491, 492); - public UpdateFieldArray ItemUpgradeHighWatermark = new(17, 499, 500); - - public ActivePlayerData() : base((int)EntityFragment.CGObject, TypeId.ActivePlayer, changeMaskLength) - { - QuestCompletedBitsPerBlock = sizeof(ulong) * 8; - } + public DynamicUpdateField CharacterBankTabSettings = new(32, 41); + public DynamicUpdateField AccountBankTabSettings = new(32, 42); + public UpdateField FarsightObject = new(32, 49); + public UpdateField SummonedBattlePetGUID = new(32, 50); + public UpdateField Coinage = new(32, 51); + public UpdateField AccountBankCoinage = new(32, 52); + public UpdateField XP = new(32, 53); + public UpdateField NextLevelXP = new(32, 54); + public UpdateField TrialXP = new(32, 55); + public UpdateField Skill = new(32, 56); + public UpdateField CharacterPoints = new(32, 57); + public UpdateField MaxTalentTiers = new(32, 58); + public UpdateField TrackCreatureMask = new(32, 59); + public UpdateField MainhandExpertise = new(32, 60); + public UpdateField OffhandExpertise = new(32, 61); + public UpdateField RangedExpertise = new(32, 62); + public UpdateField CombatRatingExpertise = new(32, 63); + public UpdateField BlockPercentage = new(32, 64); + public UpdateField DodgePercentage = new(32, 65); + public UpdateField DodgePercentageFromAttribute = new(32, 66); + public UpdateField ParryPercentage = new(32, 67); + public UpdateField ParryPercentageFromAttribute = new(32, 68); + public UpdateField CritPercentage = new(32, 69); + public UpdateField RangedCritPercentage = new(70, 71); + public UpdateField OffhandCritPercentage = new(70, 72); + public UpdateField SpellCritPercentage = new(70, 73); + public UpdateField ShieldBlock = new(70, 74); + public UpdateField ShieldBlockCritPercentage = new(70, 75); + public UpdateField Mastery = new(70, 76); + public UpdateField Speed = new(70, 77); + public UpdateField Avoidance = new(70, 78); + public UpdateField Sturdiness = new(70, 79); + public UpdateField Versatility = new(70, 80); + public UpdateField VersatilityBonus = new(70, 81); + public UpdateField PvpPowerDamage = new(70, 82); + public UpdateField PvpPowerHealing = new(70, 83); + public UpdateField BitVectors = new(70, 84); + public UpdateField ModHealingDonePos = new(70, 85); + public UpdateField ModHealingPercent = new(70, 86); + public UpdateField ModPeriodicHealingDonePercent = new(70, 87); + public UpdateField ModSpellPowerPercent = new(70, 88); + public UpdateField ModResiliencePercent = new(70, 89); + public UpdateField OverrideSpellPowerByAPPercent = new(70, 90); + public UpdateField OverrideAPBySpellPowerPercent = new(70, 91); + public UpdateField ModTargetResistance = new(70, 92); + public UpdateField ModTargetPhysicalResistance = new(70, 93); + public UpdateField LocalFlags = new(70, 94); + public UpdateField GrantableLevels = new(70, 95); + public UpdateField MultiActionBars = new(70, 96); + public UpdateField LifetimeMaxRank = new(70, 97); + public UpdateField NumRespecs = new(70, 98); + public UpdateField PvpMedals = new(70, 99); + public UpdateField TodayHonorableKills = new(70, 100); + public UpdateField YesterdayHonorableKills = new(70, 101); + public UpdateField LifetimeHonorableKills = new(102, 103); + public UpdateField WatchedFactionIndex = new(102, 104); + public UpdateField MaxLevel = new(102, 105); + public UpdateField ScalingPlayerLevelDelta = new(102, 106); + public UpdateField MaxCreatureScalingLevel = new(102, 107); + public UpdateField PetSpellPower = new(102, 108); + public UpdateField UiHitModifier = new(102, 109); + public UpdateField UiSpellHitModifier = new(102, 110); + public UpdateField HomeRealmTimeOffset = new(102, 111); + public UpdateField ModPetHaste = new(102, 112); + public UpdateField JailersTowerLevelMax = new(102, 113); + public UpdateField JailersTowerLevel = new(102, 114); + public UpdateField LocalRegenFlags = new(102, 115); + public UpdateField AuraVision = new(102, 116); + public UpdateField NumBackpackSlots = new(102, 117); + public UpdateField OverrideSpellsID = new(102, 118); + public UpdateField LootSpecID = new(102, 119); + public UpdateField OverrideZonePVPType = new(102, 120); + public UpdateField Honor = new(102, 121); + public UpdateField HonorNextLevel = new(102, 122); + public UpdateField PerksProgramCurrency = new(102, 123); + public UpdateField NumBankSlots = new(102, 124); + public UpdateField NumCharacterBankTabs = new(102, 125); + public UpdateField NumAccountBankTabs = new(102, 126); + public UpdateField ResearchHistory = new(102, 127); + public UpdateField FrozenPerksVendorItem = new(102, 128); + public UpdateField Field_1410 = new(102, 130); + public OptionalUpdateField QuestSession = new(102, 129); + public UpdateField UiChromieTimeExpansionID = new(102, 131); + public UpdateField TimerunningSeasonID = new(102, 132); + public UpdateField TransportServerTime = new(102, 133); + public UpdateField WeeklyRewardsPeriodSinceOrigin = new(134, 135); // week count since Cfg_RegionsEntry::ChallengeOrigin + public UpdateField DEBUGSoulbindConduitRank = new(134, 136); + public UpdateField DungeonScore = new(134, 137); + public UpdateField ActiveCombatTraitConfigID = new(134, 138); + public UpdateField ItemUpgradeHighOnehandWeaponItemID = new(134, 139); + public UpdateField ItemUpgradeHighFingerItemID = new(134, 140); + public UpdateField ItemUpgradeHighFingerWatermark = new(134, 141); + public UpdateField ItemUpgradeHighTrinketItemID = new(134, 142); + public UpdateField ItemUpgradeHighTrinketWatermark = new(134, 143); + public UpdateField LootHistoryInstanceID = new(134, 144); + public OptionalUpdateField PetStable = new(134, 145); + public UpdateField RequiredMountCapabilityFlags = new(134, 146); + public OptionalUpdateField WalkInData = new(134, 147); + public OptionalUpdateField DelveData = new(134, 148); + public OptionalUpdateField ChallengeModeData = new(134, 149); + public UpdateFieldArray InvSlots = new(105, 150, 151); + public UpdateFieldArray RestInfo = new(2, 256, 257); + public UpdateFieldArray ModDamageDonePos = new(7, 259, 260); + public UpdateFieldArray ModDamageDoneNeg = new(7, 259, 267); + public UpdateFieldArray ModDamageDonePercent = new(7, 259, 274); + public UpdateFieldArray ModHealingDonePercent = new(7, 259, 281); + public UpdateFieldArray WeaponDmgMultipliers = new(3, 288, 289); + public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 288, 292); + public UpdateFieldArray BuybackPrice = new(12, 295, 296); + public UpdateFieldArray BuybackTimestamp = new(12, 295, 308); + public UpdateFieldArray CombatRatings = new(32, 320, 321); + public UpdateFieldArray NoReagentCostMask = new(4, 353, 354); + public UpdateFieldArray ProfessionSkillLine = new(2, 358, 359); + public UpdateFieldArray BagSlotFlags = new(5, 361, 362); + public UpdateFieldArray ItemUpgradeHighWatermark = new(17, 367, 368); public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { - for (int i = 0; i < 232; ++i) + for (int i = 0; i < 105; ++i) { data.WritePackedGuid(InvSlots[i]); } @@ -5947,14 +6208,11 @@ namespace Game.Entities { data.WriteUInt32(BagSlotFlags[i]); } - for (int i = 0; i < 7; ++i) - { - data.WriteUInt32(BankBagSlotFlags[i]); - } data.WriteUInt32(Honor); data.WriteUInt32(HonorNextLevel); data.WriteInt32(PerksProgramCurrency); data.WriteUInt8(NumBankSlots); + data.WriteUInt8(NumCharacterBankTabs); data.WriteUInt8(NumAccountBankTabs); for (int i = 0; i < 1; ++i) { @@ -6145,9 +6403,11 @@ namespace Game.Entities data.WriteBit(HasPerksProgramPendingReward); data.WriteBits(QuestSession.HasValue(), 1); data.WriteBits(PetStable.HasValue(), 1); + data.WriteBits(CharacterBankTabSettings.Size(), 3); data.WriteBits(AccountBankTabSettings.Size(), 3); data.WriteBits(WalkInData.HasValue(), 1); data.WriteBits(DelveData.HasValue(), 1); + data.WriteBits(ChallengeModeData.HasValue(), 1); data.FlushBits(); ResearchHistory.GetValue().WriteCreate(data, owner, receiver); if (QuestSession.HasValue()) @@ -6177,6 +6437,10 @@ namespace Game.Entities { PetStable.GetValue().WriteCreate(data, owner, receiver); } + for (int i = 0; i < CharacterBankTabSettings.Size(); ++i) + { + CharacterBankTabSettings[i].WriteCreate(data, owner, receiver); + } for (int i = 0; i < AccountBankTabSettings.Size(); ++i) { AccountBankTabSettings[i].WriteCreate(data, owner, receiver); @@ -6189,6 +6453,10 @@ namespace Game.Entities { DelveData.GetValue().WriteCreate(data, owner, receiver); } + if (ChallengeModeData.HasValue()) + { + ChallengeModeData.GetValue().WriteCreate(data, owner, receiver); + } data.FlushBits(); } @@ -6199,8 +6467,8 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Player owner, Player receiver) { - data.WriteBits(changesMask.GetBlocksMask(0), 17); - for (uint i = 0; i < 17; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 13); + for (uint i = 0; i < 13; ++i) if (changesMask.GetBlock(i) != 0) data.WriteBits(changesMask.GetBlock(i), 32); @@ -6259,11 +6527,11 @@ namespace Game.Entities WriteCompleteDynamicFieldUpdateMask(PvpInfo.Size(), data); } } - if (changesMask[42]) + if (changesMask[43]) { for (int i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { if (!ignoreNestedChangesMask) ResearchSites[i].WriteUpdateMask(data); @@ -6272,11 +6540,11 @@ namespace Game.Entities } } } - if (changesMask[44]) + if (changesMask[45]) { for (int i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { if (!ignoreNestedChangesMask) ResearchSiteProgress[i].WriteUpdateMask(data); @@ -6285,11 +6553,11 @@ namespace Game.Entities } } } - if (changesMask[46]) + if (changesMask[47]) { for (int i = 0; i < 1; ++i) { - if (changesMask[47]) + if (changesMask[48]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -6298,11 +6566,11 @@ namespace Game.Entities } } } - if (changesMask[42]) + if (changesMask[43]) { for (int i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { for (int j = 0; j < ResearchSites[i].Size(); ++j) { @@ -6314,11 +6582,11 @@ namespace Game.Entities } } } - if (changesMask[44]) + if (changesMask[45]) { for (int i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { for (int j = 0; j < ResearchSiteProgress[i].Size(); ++j) { @@ -6330,11 +6598,11 @@ namespace Game.Entities } } } - if (changesMask[46]) + if (changesMask[47]) { for (int i = 0; i < 1; ++i) { - if (changesMask[47]) + if (changesMask[48]) { for (int j = 0; j < Research[i].Size(); ++j) { @@ -6857,6 +7125,13 @@ namespace Game.Entities if (changesMask[32]) { if (changesMask[41]) + { + if (!ignoreNestedChangesMask) + CharacterBankTabSettings.WriteUpdateMask(data, 3); + else + WriteCompleteDynamicFieldUpdateMask(CharacterBankTabSettings.Size(), data, 3); + } + if (changesMask[42]) { if (!ignoreNestedChangesMask) AccountBankTabSettings.WriteUpdateMask(data, 3); @@ -6911,6 +7186,16 @@ namespace Game.Entities } } if (changesMask[41]) + { + for (int i = 0; i < CharacterBankTabSettings.Size(); ++i) + { + if (CharacterBankTabSettings.HasChanged(i) || ignoreNestedChangesMask) + { + CharacterBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[42]) { for (int i = 0; i < AccountBankTabSettings.Size(); ++i) { @@ -6920,364 +7205,368 @@ namespace Game.Entities } } } - if (changesMask[48]) + if (changesMask[49]) { data.WritePackedGuid(FarsightObject); } - if (changesMask[49]) + if (changesMask[50]) { data.WritePackedGuid(SummonedBattlePetGUID); } - if (changesMask[50]) + if (changesMask[51]) { data.WriteUInt64(Coinage); } - if (changesMask[51]) + if (changesMask[52]) { data.WriteUInt64(AccountBankCoinage); } - if (changesMask[52]) + if (changesMask[53]) { data.WriteUInt32(XP); } - if (changesMask[53]) + if (changesMask[54]) { data.WriteUInt32(NextLevelXP); } - if (changesMask[54]) + if (changesMask[55]) { data.WriteInt32(TrialXP); } - if (changesMask[55]) + if (changesMask[56]) { Skill.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[56]) + if (changesMask[57]) { data.WriteUInt32(CharacterPoints); } - if (changesMask[57]) + if (changesMask[58]) { data.WriteUInt32(MaxTalentTiers); } - if (changesMask[58]) + if (changesMask[59]) { data.WriteUInt32(TrackCreatureMask); } - if (changesMask[59]) + if (changesMask[60]) { data.WriteFloat(MainhandExpertise); } - if (changesMask[60]) + if (changesMask[61]) { data.WriteFloat(OffhandExpertise); } - if (changesMask[61]) + if (changesMask[62]) { data.WriteFloat(RangedExpertise); } - if (changesMask[62]) + if (changesMask[63]) { data.WriteFloat(CombatRatingExpertise); } - if (changesMask[63]) + if (changesMask[64]) { data.WriteFloat(BlockPercentage); } - if (changesMask[64]) + if (changesMask[65]) { data.WriteFloat(DodgePercentage); } - if (changesMask[65]) + if (changesMask[66]) { data.WriteFloat(DodgePercentageFromAttribute); } - if (changesMask[66]) + if (changesMask[67]) { data.WriteFloat(ParryPercentage); } - if (changesMask[67]) + if (changesMask[68]) { data.WriteFloat(ParryPercentageFromAttribute); } - if (changesMask[68]) - { - data.WriteFloat(CritPercentage); - } if (changesMask[69]) { - data.WriteFloat(RangedCritPercentage); + data.WriteFloat(CritPercentage); } } if (changesMask[70]) { if (changesMask[71]) { - data.WriteFloat(OffhandCritPercentage); + data.WriteFloat(RangedCritPercentage); } if (changesMask[72]) { - data.WriteFloat(SpellCritPercentage); + data.WriteFloat(OffhandCritPercentage); } if (changesMask[73]) { - data.WriteUInt32(ShieldBlock); + data.WriteFloat(SpellCritPercentage); } if (changesMask[74]) { - data.WriteFloat(ShieldBlockCritPercentage); + data.WriteUInt32(ShieldBlock); } if (changesMask[75]) { - data.WriteFloat(Mastery); + data.WriteFloat(ShieldBlockCritPercentage); } if (changesMask[76]) { - data.WriteFloat(Speed); + data.WriteFloat(Mastery); } if (changesMask[77]) { - data.WriteFloat(Avoidance); + data.WriteFloat(Speed); } if (changesMask[78]) { - data.WriteFloat(Sturdiness); + data.WriteFloat(Avoidance); } if (changesMask[79]) { - data.WriteInt32(Versatility); + data.WriteFloat(Sturdiness); } if (changesMask[80]) { - data.WriteFloat(VersatilityBonus); + data.WriteInt32(Versatility); } if (changesMask[81]) { - data.WriteFloat(PvpPowerDamage); + data.WriteFloat(VersatilityBonus); } if (changesMask[82]) { - data.WriteFloat(PvpPowerHealing); + data.WriteFloat(PvpPowerDamage); } if (changesMask[83]) { - BitVectors.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data.WriteFloat(PvpPowerHealing); } if (changesMask[84]) { - data.WriteInt32(ModHealingDonePos); + BitVectors.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[85]) { - data.WriteFloat(ModHealingPercent); + data.WriteInt32(ModHealingDonePos); } if (changesMask[86]) { - data.WriteFloat(ModPeriodicHealingDonePercent); + data.WriteFloat(ModHealingPercent); } if (changesMask[87]) { - data.WriteFloat(ModSpellPowerPercent); + data.WriteFloat(ModPeriodicHealingDonePercent); } if (changesMask[88]) { - data.WriteFloat(ModResiliencePercent); + data.WriteFloat(ModSpellPowerPercent); } if (changesMask[89]) { - data.WriteFloat(OverrideSpellPowerByAPPercent); + data.WriteFloat(ModResiliencePercent); } if (changesMask[90]) { - data.WriteFloat(OverrideAPBySpellPowerPercent); + data.WriteFloat(OverrideSpellPowerByAPPercent); } if (changesMask[91]) { - data.WriteInt32(ModTargetResistance); + data.WriteFloat(OverrideAPBySpellPowerPercent); } if (changesMask[92]) { - data.WriteInt32(ModTargetPhysicalResistance); + data.WriteInt32(ModTargetResistance); } if (changesMask[93]) { - data.WriteUInt32(LocalFlags); + data.WriteInt32(ModTargetPhysicalResistance); } if (changesMask[94]) { - data.WriteUInt8(GrantableLevels); + data.WriteUInt32(LocalFlags); } if (changesMask[95]) { - data.WriteUInt8(MultiActionBars); + data.WriteUInt8(GrantableLevels); } if (changesMask[96]) { - data.WriteUInt8(LifetimeMaxRank); + data.WriteUInt8(MultiActionBars); } if (changesMask[97]) { - data.WriteUInt8(NumRespecs); + data.WriteUInt8(LifetimeMaxRank); } if (changesMask[98]) { - data.WriteUInt32(PvpMedals); + data.WriteUInt8(NumRespecs); } if (changesMask[99]) { - data.WriteUInt16(TodayHonorableKills); + data.WriteUInt32(PvpMedals); } if (changesMask[100]) { - data.WriteUInt16(YesterdayHonorableKills); + data.WriteUInt16(TodayHonorableKills); } if (changesMask[101]) { - data.WriteUInt32(LifetimeHonorableKills); + data.WriteUInt16(YesterdayHonorableKills); } } if (changesMask[102]) { if (changesMask[103]) { - data.WriteUInt32(WatchedFactionIndex); + data.WriteUInt32(LifetimeHonorableKills); } if (changesMask[104]) { - data.WriteUInt32(MaxLevel); + data.WriteUInt32(WatchedFactionIndex); } if (changesMask[105]) { - data.WriteInt32(ScalingPlayerLevelDelta); + data.WriteUInt32(MaxLevel); } if (changesMask[106]) { - data.WriteInt32(MaxCreatureScalingLevel); + data.WriteInt32(ScalingPlayerLevelDelta); } if (changesMask[107]) { - data.WriteUInt32(PetSpellPower); + data.WriteInt32(MaxCreatureScalingLevel); } if (changesMask[108]) { - data.WriteFloat(UiHitModifier); + data.WriteUInt32(PetSpellPower); } if (changesMask[109]) { - data.WriteFloat(UiSpellHitModifier); + data.WriteFloat(UiHitModifier); } if (changesMask[110]) { - data.WriteInt32(HomeRealmTimeOffset); + data.WriteFloat(UiSpellHitModifier); } if (changesMask[111]) { - data.WriteFloat(ModPetHaste); + data.WriteInt32(HomeRealmTimeOffset); } if (changesMask[112]) { - data.WriteInt8(JailersTowerLevelMax); + data.WriteFloat(ModPetHaste); } if (changesMask[113]) { - data.WriteInt8(JailersTowerLevel); + data.WriteInt8(JailersTowerLevelMax); } if (changesMask[114]) { - data.WriteUInt8(LocalRegenFlags); + data.WriteInt8(JailersTowerLevel); } if (changesMask[115]) { - data.WriteUInt8(AuraVision); + data.WriteUInt8(LocalRegenFlags); } if (changesMask[116]) { - data.WriteUInt8(NumBackpackSlots); + data.WriteUInt8(AuraVision); } if (changesMask[117]) { - data.WriteUInt32(OverrideSpellsID); + data.WriteUInt8(NumBackpackSlots); } if (changesMask[118]) { - data.WriteUInt16(LootSpecID); + data.WriteUInt32(OverrideSpellsID); } if (changesMask[119]) { - data.WriteUInt32(OverrideZonePVPType); + data.WriteUInt16(LootSpecID); } if (changesMask[120]) { - data.WriteUInt32(Honor); + data.WriteUInt32(OverrideZonePVPType); } if (changesMask[121]) { - data.WriteUInt32(HonorNextLevel); + data.WriteUInt32(Honor); } if (changesMask[122]) { - data.WriteInt32(PerksProgramCurrency); + data.WriteUInt32(HonorNextLevel); } if (changesMask[123]) { - data.WriteUInt8(NumBankSlots); + data.WriteInt32(PerksProgramCurrency); } if (changesMask[124]) + { + data.WriteUInt8(NumBankSlots); + } + if (changesMask[125]) + { + data.WriteUInt8(NumCharacterBankTabs); + } + if (changesMask[126]) { data.WriteUInt8(NumAccountBankTabs); } - if (changesMask[129]) - { - data.WriteInt32(UiChromieTimeExpansionID); - } - if (changesMask[130]) - { - data.WriteInt32(TimerunningSeasonID); - } if (changesMask[131]) { - data.WriteInt32(TransportServerTime); + data.WriteInt32(UiChromieTimeExpansionID); } if (changesMask[132]) { - data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); + data.WriteInt32(TimerunningSeasonID); } if (changesMask[133]) { - data.WriteInt16(DEBUGSoulbindConduitRank); + data.WriteInt32(TransportServerTime); } } if (changesMask[134]) { + if (changesMask[135]) + { + data.WriteUInt32(WeeklyRewardsPeriodSinceOrigin); + } if (changesMask[136]) { - data.WriteUInt32(ActiveCombatTraitConfigID); - } - if (changesMask[137]) - { - data.WriteInt32(ItemUpgradeHighOnehandWeaponItemID); + data.WriteInt16(DEBUGSoulbindConduitRank); } if (changesMask[138]) { - data.WriteInt32(ItemUpgradeHighFingerItemID); + data.WriteUInt32(ActiveCombatTraitConfigID); } if (changesMask[139]) { - data.WriteFloat(ItemUpgradeHighFingerWatermark); + data.WriteInt32(ItemUpgradeHighOnehandWeaponItemID); } if (changesMask[140]) { - data.WriteInt32(ItemUpgradeHighTrinketItemID); + data.WriteInt32(ItemUpgradeHighFingerItemID); } if (changesMask[141]) { - data.WriteFloat(ItemUpgradeHighTrinketWatermark); + data.WriteFloat(ItemUpgradeHighFingerWatermark); } if (changesMask[142]) { - data.WriteUInt64(LootHistoryInstanceID); + data.WriteInt32(ItemUpgradeHighTrinketItemID); + } + if (changesMask[143]) + { + data.WriteFloat(ItemUpgradeHighTrinketWatermark); } if (changesMask[144]) + { + data.WriteUInt64(LootHistoryInstanceID); + } + if (changesMask[146]) { data.WriteUInt8(RequiredMountCapabilityFlags); } @@ -7291,183 +7580,181 @@ namespace Game.Entities data.WriteBits(PetStable.HasValue(), 1); data.WriteBits(WalkInData.HasValue(), 1); data.WriteBits(DelveData.HasValue(), 1); + data.WriteBits(ChallengeModeData.HasValue(), 1); } data.FlushBits(); if (changesMask[102]) { - if (changesMask[125]) + if (changesMask[127]) { ResearchHistory.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[127]) + if (changesMask[129]) { if (QuestSession.HasValue()) { QuestSession.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[126]) + if (changesMask[128]) { FrozenPerksVendorItem.GetValue().Write(data); } - if (changesMask[128]) + if (changesMask[130]) { Field_1410.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } if (changesMask[134]) { - if (changesMask[135]) + if (changesMask[137]) { DungeonScore.GetValue().Write(data); } - if (changesMask[143]) + if (changesMask[145]) { if (PetStable.HasValue()) { PetStable.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[145]) + if (changesMask[147]) { if (WalkInData.HasValue()) { WalkInData.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[146]) + if (changesMask[148]) { if (DelveData.HasValue()) { DelveData.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - } - if (changesMask[147]) - { - for (int i = 0; i < 232; ++i) + if (changesMask[149]) { - if (changesMask[148 + i]) + if (ChallengeModeData.HasValue()) + { + ChallengeModeData.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[150]) + { + for (int i = 0; i < 105; ++i) + { + if (changesMask[151 + i]) { data.WritePackedGuid(InvSlots[i]); } } } - if (changesMask[380]) + if (changesMask[256]) { for (int i = 0; i < 2; ++i) { - if (changesMask[381 + i]) + if (changesMask[257 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[383]) + if (changesMask[259]) { for (int i = 0; i < 7; ++i) { - if (changesMask[384 + i]) + if (changesMask[260 + i]) { data.WriteInt32(ModDamageDonePos[i]); } - if (changesMask[391 + i]) + if (changesMask[267 + i]) { data.WriteInt32(ModDamageDoneNeg[i]); } - if (changesMask[398 + i]) + if (changesMask[274 + i]) { data.WriteFloat(ModDamageDonePercent[i]); } - if (changesMask[405 + i]) + if (changesMask[281 + i]) { data.WriteFloat(ModHealingDonePercent[i]); } } } - if (changesMask[412]) + if (changesMask[288]) { for (int i = 0; i < 3; ++i) { - if (changesMask[413 + i]) + if (changesMask[289 + i]) { data.WriteFloat(WeaponDmgMultipliers[i]); } - if (changesMask[416 + i]) + if (changesMask[292 + i]) { data.WriteFloat(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[419]) + if (changesMask[295]) { for (int i = 0; i < 12; ++i) { - if (changesMask[420 + i]) + if (changesMask[296 + i]) { data.WriteUInt32(BuybackPrice[i]); } - if (changesMask[432 + i]) + if (changesMask[308 + i]) { data.WriteInt64(BuybackTimestamp[i]); } } } - if (changesMask[444]) + if (changesMask[320]) { for (int i = 0; i < 32; ++i) { - if (changesMask[445 + i]) + if (changesMask[321 + i]) { data.WriteUInt32(CombatRatings[i]); } } } - if (changesMask[477]) + if (changesMask[353]) { for (int i = 0; i < 4; ++i) { - if (changesMask[478 + i]) + if (changesMask[354 + i]) { data.WriteUInt32(NoReagentCostMask[i]); } } } - if (changesMask[482]) + if (changesMask[358]) { for (int i = 0; i < 2; ++i) { - if (changesMask[483 + i]) + if (changesMask[359 + i]) { data.WriteUInt32(ProfessionSkillLine[i]); } } } - if (changesMask[485]) + if (changesMask[361]) { for (int i = 0; i < 5; ++i) { - if (changesMask[486 + i]) + if (changesMask[362 + i]) { data.WriteUInt32(BagSlotFlags[i]); } } } - if (changesMask[491]) - { - for (int i = 0; i < 7; ++i) - { - if (changesMask[492 + i]) - { - data.WriteUInt32(BankBagSlotFlags[i]); - } - } - } - if (changesMask[499]) + if (changesMask[367]) { for (int i = 0; i < 17; ++i) { - if (changesMask[500 + i]) + if (changesMask[368 + i]) { data.WriteFloat(ItemUpgradeHighWatermark[i]); } @@ -7519,6 +7806,7 @@ namespace Game.Entities ClearChangesMask(CharacterRestrictions); ClearChangesMask(TraitConfigs); ClearChangesMask(CraftingOrders); + ClearChangesMask(CharacterBankTabSettings); ClearChangesMask(AccountBankTabSettings); ClearChangesMask(FarsightObject); ClearChangesMask(SummonedBattlePetGUID); @@ -7594,6 +7882,7 @@ namespace Game.Entities ClearChangesMask(HonorNextLevel); ClearChangesMask(PerksProgramCurrency); ClearChangesMask(NumBankSlots); + ClearChangesMask(NumCharacterBankTabs); ClearChangesMask(NumAccountBankTabs); ClearChangesMask(ResearchHistory); ClearChangesMask(FrozenPerksVendorItem); @@ -7616,6 +7905,7 @@ namespace Game.Entities ClearChangesMask(RequiredMountCapabilityFlags); ClearChangesMask(WalkInData); ClearChangesMask(DelveData); + ClearChangesMask(ChallengeModeData); ClearChangesMask(InvSlots); ClearChangesMask(RestInfo); ClearChangesMask(ModDamageDonePos); @@ -7630,13 +7920,56 @@ namespace Game.Entities ClearChangesMask(NoReagentCostMask); ClearChangesMask(ProfessionSkillLine); ClearChangesMask(BagSlotFlags); - ClearChangesMask(BankBagSlotFlags); ClearChangesMask(ItemUpgradeHighWatermark); _changesMask.ResetAll(); } } - public class GameObjectFieldData : HasChangesMask + public struct GameObjectAssistActionData : IEquatable + { + public string PlayerName; + public string MonsterName; + public uint VirtualRealmAddress; + public byte Sex; + public long Time; + public int DelveTier; + + public void WriteCreate(WorldPacket data, GameObject owner, Player receiver) + { + data.WriteBits(PlayerName.GetByteCount(), 6); + data.WriteBits(MonsterName.GetByteCount() + 1, 11); + data.WriteUInt32(VirtualRealmAddress); + data.WriteUInt8(Sex); + data.WriteInt64(Time); + data.WriteInt32(DelveTier); + data.WriteString(PlayerName); + data.WriteCString(MonsterName); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, GameObject owner, Player receiver) + { + data.WriteBits(PlayerName.GetByteCount(), 6); + data.WriteBits(MonsterName.GetByteCount() + 1, 11); + data.WriteUInt32(VirtualRealmAddress); + data.WriteUInt8(Sex); + data.WriteInt64(Time); + data.WriteInt32(DelveTier); + data.WriteString(PlayerName); + data.WriteCString(MonsterName); + } + + public bool Equals(GameObjectAssistActionData right) + { + return PlayerName == right.PlayerName + && MonsterName == right.MonsterName + && VirtualRealmAddress == right.VirtualRealmAddress + && Sex == right.Sex + && Time == right.Time + && DelveTier == right.DelveTier; + } + } + + public class GameObjectFieldData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.GameObject, 26) { public UpdateField> StateWorldEffectIDs = new(0, 1); public DynamicUpdateField EnableDoodadSets = new(0, 2); @@ -7662,8 +7995,7 @@ namespace Game.Entities public UpdateField UiWidgetItemID = new(0, 22); public UpdateField UiWidgetItemQuality = new(0, 23); public UpdateField UiWidgetItemUnknown1000 = new(0, 24); - - public GameObjectFieldData() : base((int)EntityFragment.CGObject, TypeId.GameObject, 25) { } + public OptionalUpdateField AssistActionData = new(0, 25); public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, GameObject owner, Player receiver) { @@ -7708,6 +8040,12 @@ namespace Game.Entities { data.WriteInt32(WorldEffects[i]); } + data.WriteBits(AssistActionData.HasValue(), 1); + data.FlushBits(); + if (AssistActionData.HasValue()) + { + AssistActionData.GetValue().WriteCreate(data, owner, receiver); + } } public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, GameObject owner, Player receiver) @@ -7717,7 +8055,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, GameObject owner, Player receiver) { - data.WriteBits(changesMask.GetBlock(0), 25); + data.WriteBits(changesMask.GetBlock(0), 26); List stateWorldEffectIDs; @@ -7861,6 +8199,15 @@ namespace Game.Entities { data.WriteUInt32(UiWidgetItemUnknown1000); } + data.WriteBits(AssistActionData.HasValue(), 1); + data.FlushBits(); + if (changesMask[25]) + { + if (AssistActionData.HasValue()) + { + AssistActionData.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } } } @@ -7890,6 +8237,7 @@ namespace Game.Entities ClearChangesMask(UiWidgetItemID); ClearChangesMask(UiWidgetItemQuality); ClearChangesMask(UiWidgetItemUnknown1000); + ClearChangesMask(AssistActionData); _changesMask.ResetAll(); } @@ -7984,7 +8332,7 @@ namespace Game.Entities } } - public class DynamicObjectData : HasChangesMask + public class DynamicObjectData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.DynamicObject, 7) { public UpdateField Caster = new(0, 1); public UpdateField Type = new(0, 2); @@ -7993,8 +8341,6 @@ namespace Game.Entities public UpdateField Radius = new(0, 5); public UpdateField CastTime = new(0, 6); - public DynamicObjectData() : base((int)EntityFragment.CGObject, TypeId.DynamicObject, 7) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver) { data.WritePackedGuid(Caster); @@ -8056,7 +8402,7 @@ namespace Game.Entities } } - public class CorpseData : HasChangesMask + public class CorpseData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.Corpse, 33) { public DynamicUpdateField Customizations = new(0, 1); public UpdateField DynamicFlags = new(0, 2); @@ -8072,8 +8418,6 @@ namespace Game.Entities public UpdateField StateSpellVisualKitID = new(0, 12); public UpdateFieldArray Items = new(19, 13, 14); - public CorpseData() : base((int)EntityFragment.CGObject, TypeId.Corpse, 33) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Corpse owner, Player receiver) { data.WriteUInt32(DynamicFlags); @@ -8209,15 +8553,13 @@ namespace Game.Entities } } - public class ScaleCurve : HasChangesMask + public class ScaleCurve() : HasChangesMask(7) { public UpdateField OverrideActive = new(0, 1); public UpdateField StartTimeOffset = new(0, 2); public UpdateField ParameterCurve = new(0, 3); public UpdateFieldArray Points = new(2, 4, 5); - public ScaleCurve() : base(7) { } - public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) { data.WriteUInt32(StartTimeOffset); @@ -8281,15 +8623,13 @@ namespace Game.Entities } } - public class VisualAnim : HasChangesMask + public class VisualAnim() : HasChangesMask(0, TypeId.AreaTrigger, 5) { public UpdateField IsDecay = new(0, 1); public UpdateField AnimationDataID = new(0, 2); public UpdateField AnimKitID = new(0, 3); public UpdateField AnimProgress = new(0, 4); - public VisualAnim() : base(0, TypeId.AreaTrigger, 5) { } - public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) { data.WriteInt32(AnimationDataID); @@ -8343,35 +8683,630 @@ namespace Game.Entities } } - public class AreaTriggerFieldData : HasChangesMask + public struct ForceSetAreaTriggerPositionAndRotation : IEquatable { - public UpdateField HeightIgnoresScale = new(0, 1); - public UpdateField Field_261 = new(0, 2); - public UpdateField OverrideScaleCurve = new(0, 3); - public UpdateField ExtraScaleCurve = new(0, 4); - public UpdateField OverrideMoveCurveX = new(0, 5); - public UpdateField OverrideMoveCurveY = new(0, 6); - public UpdateField OverrideMoveCurveZ = new(0, 7); - public UpdateField Caster = new(0, 8); - public UpdateField Duration = new(0, 9); - public UpdateField TimeToTarget = new(0, 10); - public UpdateField TimeToTargetScale = new(0, 11); - public UpdateField TimeToTargetExtraScale = new(0, 12); - public UpdateField TimeToTargetPos = new(0, 13); // Linked to m_overrideMoveCurve - public UpdateField SpellID = new(0, 14); - public UpdateField SpellForVisuals = new(0, 15); - public UpdateField SpellVisual = new(0, 16); - public UpdateField BoundsRadius2D = new(0, 17); - public UpdateField DecalPropertiesID = new(0, 18); - public UpdateField CreatingEffectGUID = new(0, 19); - public UpdateField NumUnitsInside = new(0, 20); - public UpdateField NumPlayersInside = new(0, 21); // When not 0 this causes SpellVisualEvent 14 to trigger, playing alternate visuals, typically used by "SOAK THIS" areatriggers - public UpdateField OrbitPathTarget = new(0, 22); - public UpdateField RollPitchYaw = new(0, 23); - public UpdateField PositionalSoundKitID = new(0, 24); - public UpdateField VisualAnim = new(0, 25); + public ObjectGuid TriggerGUID; + public Vector3 Position; + public Quaternion Rotation; - public AreaTriggerFieldData() : base((int)EntityFragment.CGObject, TypeId.AreaTrigger, 26) { } + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WritePackedGuid(TriggerGUID); + data.WriteVector3(Position); + data.WriteFloat(Rotation.X); + data.WriteFloat(Rotation.Y); + data.WriteFloat(Rotation.Z); + data.WriteFloat(Rotation.W); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + data.WritePackedGuid(TriggerGUID); + data.WriteVector3(Position); + data.WriteFloat(Rotation.X); + data.WriteFloat(Rotation.Y); + data.WriteFloat(Rotation.Z); + data.WriteFloat(Rotation.W); + } + + public bool Equals(ForceSetAreaTriggerPositionAndRotation right) + { + return TriggerGUID == right.TriggerGUID + && Position == right.Position + && Rotation == right.Rotation; + } + } + + public class AreaTriggerSplineCalculator() : HasChangesMask(3) + { + public UpdateField Catmullrom = new(0, 1); + public DynamicUpdateField Points = new(0, 2); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteBits(Points.Size(), 16); + data.WriteBit(Catmullrom); + for (int i = 0; i < Points.Size(); ++i) + { + data.WriteVector3(Points[i]); + } + data.FlushBits(); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(Catmullrom); + } + if (changesMask[2]) + { + if (!ignoreChangesMask) + Points.WriteUpdateMask(data, 16); + else + WriteCompleteDynamicFieldUpdateMask(Points.Size(), data, 16); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[2]) + { + for (int i = 0; i < Points.Size(); ++i) + { + if (Points.HasChanged(i) || ignoreChangesMask) + { + data.WriteVector3(Points[i]); + } + } + } + } + data.FlushBits(); + } + + public override void ClearChangesMask() + { + ClearChangesMask(Catmullrom); + ClearChangesMask(Points); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerOrbit() : HasChangesMask(7) + { + public UpdateField CounterClockwise = new(0, 1); + public UpdateField Center = new(0, 2); + public UpdateField Radius = new(0, 3); + public UpdateField InitialAngle = new(0, 4); + public UpdateField BlendFromRadius = new(0, 5); + public UpdateField ExtraTimeForBlending = new(0, 6); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteVector3(Center); + data.WriteFloat(Radius); + data.WriteFloat(InitialAngle); + data.WriteFloat(BlendFromRadius); + data.WriteInt32(ExtraTimeForBlending); + data.WriteBit(CounterClockwise); + data.FlushBits(); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(CounterClockwise); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[2]) + { + data.WriteVector3(Center); + } + if (changesMask[3]) + { + data.WriteFloat(Radius); + } + if (changesMask[4]) + { + data.WriteFloat(InitialAngle); + } + if (changesMask[5]) + { + data.WriteFloat(BlendFromRadius); + } + if (changesMask[6]) + { + data.WriteInt32(ExtraTimeForBlending); + } + } + data.FlushBits(); + } + + public override void ClearChangesMask() + { + ClearChangesMask(CounterClockwise); + ClearChangesMask(Center); + ClearChangesMask(Radius); + ClearChangesMask(InitialAngle); + ClearChangesMask(BlendFromRadius); + ClearChangesMask(ExtraTimeForBlending); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerMovementScript() : HasChangesMask(4) + { + public UpdateField SpellScriptID = new(0, 1); + public UpdateField Center = new(0, 2); + public UpdateField CreationTime = new(0, 3); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteInt32(SpellScriptID); + data.WriteVector3(Center); + data.WriteUInt32(CreationTime); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 4); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteInt32(SpellScriptID); + } + if (changesMask[2]) + { + data.WriteVector3(Center); + } + if (changesMask[3]) + { + data.WriteUInt32(CreationTime); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(SpellScriptID); + ClearChangesMask(Center); + ClearChangesMask(CreationTime); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerSphere() : HasChangesMask(3) + { + public UpdateField Radius = new(0, 1); + public UpdateField RadiusTarget = new(0, 2); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteFloat(Radius); + data.WriteFloat(RadiusTarget); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteFloat(Radius); + } + if (changesMask[2]) + { + data.WriteFloat(RadiusTarget); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Radius); + ClearChangesMask(RadiusTarget); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerBox() : HasChangesMask(3) + { + public UpdateField Extents = new(0, 1); + public UpdateField ExtentsTarget = new(0, 2); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteVector3(Extents); + data.WriteVector3(ExtentsTarget); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteVector3(Extents); + } + if (changesMask[2]) + { + data.WriteVector3(ExtentsTarget); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Extents); + ClearChangesMask(ExtentsTarget); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerPolygon() : HasChangesMask(5) + { + public DynamicUpdateField Vertices = new(0, 1); + public DynamicUpdateField VerticesTarget = new(0, 2); + public UpdateField Height = new(0, 3); + public UpdateField HeightTarget = new(0, 4); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteInt32(Vertices.Size()); + data.WriteInt32(VerticesTarget.Size()); + data.WriteFloat(Height); + data.WriteFloat(HeightTarget); + for (int i = 0; i < Vertices.Size(); ++i) + { + data.WriteVector2(Vertices[i]); + } + for (int i = 0; i < VerticesTarget.Size(); ++i) + { + data.WriteVector2(VerticesTarget[i]); + } + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 5); + + if (changesMask[0]) + { + if (changesMask[1]) + { + if (!ignoreChangesMask) + Vertices.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(Vertices.Size(), data); + } + if (changesMask[2]) + { + if (!ignoreChangesMask) + VerticesTarget.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(VerticesTarget.Size(), data); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + for (int i = 0; i < Vertices.Size(); ++i) + { + if (Vertices.HasChanged(i) || ignoreChangesMask) + { + data.WriteVector2(Vertices[i]); + } + } + } + if (changesMask[2]) + { + for (int i = 0; i < VerticesTarget.Size(); ++i) + { + if (VerticesTarget.HasChanged(i) || ignoreChangesMask) + { + data.WriteVector2(VerticesTarget[i]); + } + } + } + if (changesMask[3]) + { + data.WriteFloat(Height); + } + if (changesMask[4]) + { + data.WriteFloat(HeightTarget); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Vertices); + ClearChangesMask(VerticesTarget); + ClearChangesMask(Height); + ClearChangesMask(HeightTarget); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerCylinder() : HasChangesMask(7) + { + public UpdateField Radius = new(0, 1); + public UpdateField RadiusTarget = new(0, 2); + public UpdateField Height = new(0, 3); + public UpdateField HeightTarget = new(0, 4); + public UpdateField LocationZOffset = new(0, 5); + public UpdateField LocationZOffsetTarget = new(0, 6); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteFloat(Radius); + data.WriteFloat(RadiusTarget); + data.WriteFloat(Height); + data.WriteFloat(HeightTarget); + data.WriteFloat(LocationZOffset); + data.WriteFloat(LocationZOffsetTarget); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 7); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteFloat(Radius); + } + if (changesMask[2]) + { + data.WriteFloat(RadiusTarget); + } + if (changesMask[3]) + { + data.WriteFloat(Height); + } + if (changesMask[4]) + { + data.WriteFloat(HeightTarget); + } + if (changesMask[5]) + { + data.WriteFloat(LocationZOffset); + } + if (changesMask[6]) + { + data.WriteFloat(LocationZOffsetTarget); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Radius); + ClearChangesMask(RadiusTarget); + ClearChangesMask(Height); + ClearChangesMask(HeightTarget); + ClearChangesMask(LocationZOffset); + ClearChangesMask(LocationZOffsetTarget); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerDisk() : HasChangesMask(9) + { + public UpdateField InnerRadius = new(0, 1); + public UpdateField InnerRadiusTarget = new(0, 2); + public UpdateField OuterRadius = new(0, 3); + public UpdateField OuterRadiusTarget = new(0, 4); + public UpdateField Height = new(0, 5); + public UpdateField HeightTarget = new(0, 6); + public UpdateField LocationZOffset = new(0, 7); + public UpdateField LocationZOffsetTarget = new(0, 8); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteFloat(InnerRadius); + data.WriteFloat(InnerRadiusTarget); + data.WriteFloat(OuterRadius); + data.WriteFloat(OuterRadiusTarget); + data.WriteFloat(Height); + data.WriteFloat(HeightTarget); + data.WriteFloat(LocationZOffset); + data.WriteFloat(LocationZOffsetTarget); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 9); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteFloat(InnerRadius); + } + if (changesMask[2]) + { + data.WriteFloat(InnerRadiusTarget); + } + if (changesMask[3]) + { + data.WriteFloat(OuterRadius); + } + if (changesMask[4]) + { + data.WriteFloat(OuterRadiusTarget); + } + if (changesMask[5]) + { + data.WriteFloat(Height); + } + if (changesMask[6]) + { + data.WriteFloat(HeightTarget); + } + if (changesMask[7]) + { + data.WriteFloat(LocationZOffset); + } + if (changesMask[8]) + { + data.WriteFloat(LocationZOffsetTarget); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(InnerRadius); + ClearChangesMask(InnerRadiusTarget); + ClearChangesMask(OuterRadius); + ClearChangesMask(OuterRadiusTarget); + ClearChangesMask(Height); + ClearChangesMask(HeightTarget); + ClearChangesMask(LocationZOffset); + ClearChangesMask(LocationZOffsetTarget); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerBoundedPlane() : HasChangesMask(3) + { + public UpdateField Extents = new(0, 1); + public UpdateField ExtentsTarget = new(0, 2); + + public void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + data.WriteVector2(Extents); + data.WriteVector2(ExtentsTarget); + } + + public void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + UpdateMask changesMask = _changesMask; + if (ignoreChangesMask) + changesMask.SetAll(); + + data.WriteBits(changesMask.GetBlock(0), 3); + + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteVector2(Extents); + } + if (changesMask[2]) + { + data.WriteVector2(ExtentsTarget); + } + } + } + + public override void ClearChangesMask() + { + ClearChangesMask(Extents); + ClearChangesMask(ExtentsTarget); + _changesMask.ResetAll(); + } + } + + public class AreaTriggerFieldData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.AreaTrigger, 36) + { + public UpdateField OverrideScaleCurve = new(0, 1); + public UpdateField ExtraScaleCurve = new(0, 2); + public UpdateField OverrideMoveCurveX = new(0, 3); + public UpdateField OverrideMoveCurveY = new(0, 4); + public UpdateField OverrideMoveCurveZ = new(0, 5); + public UpdateField Caster = new(0, 6); + public UpdateField Duration = new(0, 7); + public UpdateField TimeToTarget = new(0, 8); + public UpdateField TimeToTargetScale = new(0, 9); + public UpdateField TimeToTargetExtraScale = new(0, 10); + public UpdateField TimeToTargetPos = new(0, 11); // Linked to m_overrideMoveCurve + public UpdateField SpellID = new(0, 12); + public UpdateField SpellForVisuals = new(0, 13); + public UpdateField SpellVisual = new(0, 14); + public UpdateField BoundsRadius2D = new(0, 15); + public UpdateField DecalPropertiesID = new(0, 16); + public UpdateField CreatingEffectGUID = new(0, 17); + public UpdateField OrbitPathTarget = new(0, 18); + public UpdateField RollPitchYaw = new(0, 19); + public UpdateField PositionalSoundKitID = new(0, 20); + public UpdateField MovementStartTime = new(0, 21); + public UpdateField CreationTime = new(0, 22); + public UpdateField ZOffset = new(0, 23); + public OptionalUpdateField TargetRollPitchYaw = new(0, 24); + public UpdateField Flags = new(0, 25); + public UpdateField VisualAnim = new(0, 26); + public UpdateField ScaleCurveId = new(0, 27); + public UpdateField FacingCurveId = new(0, 28); + public UpdateField MorphCurveId = new(0, 29); + public UpdateField MoveCurveId = new(0, 30); + public UpdateField Facing = new(0, 31); + public OptionalUpdateField ForcedPositionAndRotation = new(32, 33); + public UpdateField PathType = new(32, 34); + public UpdateField ShapeType = new(32, 35); + public VariantUpdateField PathData = new(32, 34);//, AreaTriggerSplineCalculator, AreaTriggerOrbit, AreaTriggerMovementScript); + public VariantUpdateField ShapeData = new(32, 35);//, AreaTriggerSphere, AreaTriggerBox, AreaTriggerPolygon, AreaTriggerCylinder, AreaTriggerDisk, AreaTriggerBoundedPlane); public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) { @@ -8384,25 +9319,76 @@ namespace Game.Entities data.WriteUInt32(TimeToTargetPos); data.WriteUInt32(SpellID); data.WriteUInt32(SpellForVisuals); - SpellVisual.GetValue().WriteCreate(data, owner, receiver); - data.WriteFloat(BoundsRadius2D); data.WriteUInt32(DecalPropertiesID); data.WritePackedGuid(CreatingEffectGUID); - data.WriteInt32(NumUnitsInside); - data.WriteInt32(NumPlayersInside); data.WritePackedGuid(OrbitPathTarget); data.WriteVector3(RollPitchYaw); + data.WriteInt32(PositionalSoundKitID); + data.WriteUInt32(MovementStartTime); + data.WriteUInt32(CreationTime); + data.WriteFloat(ZOffset); + data.WriteUInt32(Flags); + data.WriteUInt32(ScaleCurveId); + data.WriteUInt32(FacingCurveId); + data.WriteUInt32(MorphCurveId); + data.WriteUInt32(MoveCurveId); + data.WriteFloat(Facing); + data.WriteInt32(PathType); + data.WriteUInt8(ShapeType); + if (PathType == 3) + { + PathData.Get().WriteCreate(data, owner, receiver); + } + if (ShapeType == 0) + { + ShapeData.Get().WriteCreate(data, owner, receiver); + } + if (ShapeType == 1) + { + ShapeData.Get().WriteCreate(data, owner, receiver); + } + if (ShapeType == 3) + { + ShapeData.Get().WriteCreate(data, owner, receiver); + } + if (ShapeType == 4) + { + ShapeData.Get().WriteCreate(data, owner, receiver); + } + if (ShapeType == 7) + { + ShapeData.Get().WriteCreate(data, owner, receiver); + } + if (ShapeType == 8) + { + ShapeData.Get().WriteCreate(data, owner, receiver); + } ExtraScaleCurve.GetValue().WriteCreate(data, owner, receiver); data.FlushBits(); - data.WriteBit(HeightIgnoresScale); - data.WriteBit(Field_261); + data.WriteBits(TargetRollPitchYaw.HasValue(), 1); + data.WriteBits(ForcedPositionAndRotation.HasValue(), 1); OverrideMoveCurveX.GetValue().WriteCreate(data, owner, receiver); + if (TargetRollPitchYaw.HasValue()) + { + data.WriteVector3(TargetRollPitchYaw); + } + if (ForcedPositionAndRotation.HasValue()) + { + ForcedPositionAndRotation.GetValue().WriteCreate(data, owner, receiver); + } OverrideMoveCurveY.GetValue().WriteCreate(data, owner, receiver); OverrideMoveCurveZ.GetValue().WriteCreate(data, owner, receiver); VisualAnim.GetValue().WriteCreate(data, owner, receiver); - data.FlushBits(); + if (PathType == 0) + { + PathData.Get().WriteCreate(data, owner, receiver); + } + if (PathType == 1) + { + PathData.Get().WriteCreate(data, owner, receiver); + } } public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) @@ -8412,122 +9398,232 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, AreaTrigger owner, Player receiver) { - data.WriteBits(_changesMask.GetBlock(0), 26); + data.WriteUInt32(changesMask.GetBlock(0)); + data.WriteBits(changesMask.GetBlock(1), 4); - if (_changesMask[0]) + data.FlushBits(); + if (changesMask[0]) { - if (_changesMask[1]) + if (changesMask[1]) { - data.WriteBit(HeightIgnoresScale); + OverrideScaleCurve.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } + if (changesMask[6]) + { + data.WritePackedGuid(Caster); + } + if (changesMask[7]) + { + data.WriteUInt32(Duration); + } + if (changesMask[8]) + { + data.WriteUInt32(TimeToTarget); + } + if (changesMask[9]) + { + data.WriteUInt32(TimeToTargetScale); + } + if (changesMask[10]) + { + data.WriteUInt32(TimeToTargetExtraScale); + } + if (changesMask[11]) + { + data.WriteUInt32(TimeToTargetPos); + } + if (changesMask[12]) + { + data.WriteUInt32(SpellID); + } + if (changesMask[13]) + { + data.WriteUInt32(SpellForVisuals); + } + if (changesMask[14]) + { + SpellVisual.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (changesMask[15]) + { + data.WriteFloat(BoundsRadius2D); + } + if (changesMask[16]) + { + data.WriteUInt32(DecalPropertiesID); + } + if (changesMask[17]) + { + data.WritePackedGuid(CreatingEffectGUID); + } + if (changesMask[18]) + { + data.WritePackedGuid(OrbitPathTarget); + } + if (changesMask[19]) + { + data.WriteVector3(RollPitchYaw); + } + if (changesMask[20]) + { + data.WriteInt32(PositionalSoundKitID); + } + if (changesMask[21]) + { + data.WriteUInt32(MovementStartTime); + } + if (changesMask[22]) + { + data.WriteUInt32(CreationTime); + } + if (changesMask[23]) + { + data.WriteFloat(ZOffset); + } + if (changesMask[25]) + { + data.WriteUInt32(Flags); + } + if (changesMask[27]) + { + data.WriteUInt32(ScaleCurveId); + } + if (changesMask[28]) + { + data.WriteUInt32(FacingCurveId); + } + if (changesMask[29]) + { + data.WriteUInt32(MorphCurveId); + } + if (changesMask[30]) + { + data.WriteUInt32(MoveCurveId); + } + if (changesMask[31]) + { + data.WriteFloat(Facing); + } + } + if (changesMask[32]) + { + if (changesMask[34]) + { + data.WriteInt32(PathType); + } + if (changesMask[35]) + { + data.WriteUInt8(ShapeType); + } + if (changesMask[34]) + { + if (PathType == 3) + { + PathData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + if (changesMask[35]) + { + if (ShapeType == 0) + { + ShapeData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 1) + { + ShapeData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 3) + { + ShapeData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 4) + { + ShapeData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 7) + { + ShapeData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (ShapeType == 8) + { + ShapeData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[0]) + { if (changesMask[2]) { - data.WriteBit(Field_261); + ExtraScaleCurve.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } data.FlushBits(); if (changesMask[0]) + { + data.WriteBits(TargetRollPitchYaw.HasValue(), 1); + } + if (changesMask[32]) + { + data.WriteBits(ForcedPositionAndRotation.HasValue(), 1); + } + data.FlushBits(); + if (changesMask[0]) { if (changesMask[3]) { - OverrideScaleCurve.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - if (_changesMask[8]) - { - data.WritePackedGuid(Caster); - } - if (_changesMask[9]) - { - data.WriteUInt32(Duration); - } - if (_changesMask[10]) - { - data.WriteUInt32(TimeToTarget); - } - if (_changesMask[11]) - { - data.WriteUInt32(TimeToTargetScale); - } - if (_changesMask[12]) - { - data.WriteUInt32(TimeToTargetExtraScale); - } - if (_changesMask[13]) - { - data.WriteUInt32(TimeToTargetPos); - } - if (changesMask[14]) - { - data.WriteUInt32(SpellID); - } - if (_changesMask[15]) - { - data.WriteUInt32(SpellForVisuals); - } - if (_changesMask[16]) - { - SpellVisual.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - if (_changesMask[17]) - { - data.WriteFloat(BoundsRadius2D); - } - if (_changesMask[18]) - { - data.WriteUInt32(DecalPropertiesID); - } - if (_changesMask[19]) - { - data.WritePackedGuid(CreatingEffectGUID); - } - if (changesMask[20]) - { - data.WriteInt32(NumUnitsInside); - } - if (changesMask[21]) - { - data.WriteInt32(NumPlayersInside); - } - if (changesMask[22]) - { - data.WritePackedGuid(OrbitPathTarget); - } - if (changesMask[23]) - { - data.WriteVector3(RollPitchYaw); + OverrideMoveCurveX.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[24]) { - data.WriteInt32(PositionalSoundKitID); + if (TargetRollPitchYaw.HasValue()) + { + data.WriteVector3(TargetRollPitchYaw); + } } - if (_changesMask[4]) + } + if (changesMask[32]) + { + if (changesMask[33]) { - ExtraScaleCurve.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + if (ForcedPositionAndRotation.HasValue()) + { + ForcedPositionAndRotation.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } } - if (changesMask[5]) - { - OverrideMoveCurveX.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); - } - if (changesMask[6]) + } + if (changesMask[0]) + { + if (changesMask[4]) { OverrideMoveCurveY.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[7]) + if (changesMask[5]) { OverrideMoveCurveZ.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[25]) + if (changesMask[26]) { VisualAnim.GetValue().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - data.FlushBits(); + if (changesMask[32]) + { + if (changesMask[34]) + { + if (PathType == 0) + { + PathData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + if (PathType == 1) + { + PathData.Get().WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } } public override void ClearChangesMask() { - ClearChangesMask(HeightIgnoresScale); - ClearChangesMask(Field_261); ClearChangesMask(OverrideScaleCurve); ClearChangesMask(ExtraScaleCurve); ClearChangesMask(OverrideMoveCurveX); @@ -8545,25 +9641,36 @@ namespace Game.Entities ClearChangesMask(BoundsRadius2D); ClearChangesMask(DecalPropertiesID); ClearChangesMask(CreatingEffectGUID); - ClearChangesMask(NumUnitsInside); - ClearChangesMask(NumPlayersInside); ClearChangesMask(OrbitPathTarget); ClearChangesMask(RollPitchYaw); ClearChangesMask(PositionalSoundKitID); + ClearChangesMask(MovementStartTime); + ClearChangesMask(CreationTime); + ClearChangesMask(ZOffset); + ClearChangesMask(TargetRollPitchYaw); + ClearChangesMask(Flags); ClearChangesMask(VisualAnim); + ClearChangesMask(ScaleCurveId); + ClearChangesMask(FacingCurveId); + ClearChangesMask(MorphCurveId); + ClearChangesMask(MoveCurveId); + ClearChangesMask(Facing); + ClearChangesMask(ForcedPositionAndRotation); + ClearChangesMask(PathType); + ClearChangesMask(ShapeType); + ClearChangesMask(PathData); + ClearChangesMask(ShapeData); _changesMask.ResetAll(); } } - public class SceneObjectData : HasChangesMask + public class SceneObjectData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.SceneObject, 5) { public UpdateField ScriptPackageID = new(0, 1); public UpdateField RndSeedVal = new(0, 2); public UpdateField CreatedBy = new(0, 3); public UpdateField SceneType = new(0, 4); - public SceneObjectData() : base((int)EntityFragment.CGObject, TypeId.SceneObject, 5) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, WorldObject owner, Player receiver) { data.WriteInt32(ScriptPackageID); @@ -8613,7 +9720,7 @@ namespace Game.Entities } } - public class ConversationLine + public class ConversationLine : IEquatable { public uint ConversationLineID; public uint BroadcastTextID; @@ -8656,9 +9763,20 @@ namespace Game.Entities return startTime; } + + public bool Equals(ConversationLine right) + { + return ConversationLineID == right.ConversationLineID + && BroadcastTextID == right.BroadcastTextID + && StartTime == right.StartTime + && UiCameraID == right.UiCameraID + && ActorIndex == right.ActorIndex + && Flags == right.Flags + && ChatType == right.ChatType; + } } - public class ConversationActorField + public class ConversationActorField : IEquatable { public uint CreatureID; public uint CreatureDisplayInfoID; @@ -8688,9 +9806,19 @@ namespace Game.Entities data.WriteBits(NoActorObject, 1); data.FlushBits(); } + + public bool Equals(ConversationActorField right) + { + return CreatureID == right.CreatureID + && CreatureDisplayInfoID == right.CreatureDisplayInfoID + && ActorGUID == right.ActorGUID + && Id == right.Id + && Type == right.Type + && NoActorObject == right.NoActorObject; + } } - public class ConversationData : HasChangesMask + public class ConversationData() : HasChangesMask((int)EntityFragment.CGObject, TypeId.Conversation, 7) { public UpdateField DontPlayBroadcastTextSounds = new(0, 1); public UpdateField> Lines = new(0, 2); @@ -8699,8 +9827,6 @@ namespace Game.Entities public UpdateField Progress = new(0, 5); public UpdateField Flags = new(0, 6); - public ConversationData() : base((int)EntityFragment.CGObject, TypeId.Conversation, 7) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) { data.WriteInt32(Lines.GetValue().Count); @@ -8802,12 +9928,10 @@ namespace Game.Entities } } - public class VendorData : HasChangesMask + public class VendorData() : HasChangesMask(2) { public UpdateField Flags = new(0, 1); - public VendorData() : base(2) { } - public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Creature owner, Player receiver) { data.WriteInt32(Flags); diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 6d7d24d4f..ecd4d9866 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -299,6 +299,7 @@ namespace Game.Entities data.WriteBit(flags.NoBirthAnim); data.WriteBit(flags.EnablePortals); data.WriteBit(flags.PlayHoverAnim); + data.WriteBit(flags.ThisIsYou); data.WriteBit(flags.MovementUpdate); data.WriteBit(flags.MovementTransport); data.WriteBit(flags.Stationary); @@ -307,10 +308,8 @@ namespace Game.Entities data.WriteBit(flags.Vehicle); data.WriteBit(flags.AnimKit); data.WriteBit(flags.Rotation); - data.WriteBit(flags.AreaTrigger); data.WriteBit(flags.GameObject); data.WriteBit(flags.SmoothPhasing); - data.WriteBit(flags.ThisIsYou); data.WriteBit(flags.SceneObject); data.WriteBit(flags.ActivePlayer); data.WriteBit(flags.Conversation); @@ -461,7 +460,10 @@ namespace Game.Entities } if (flags.CombatVictim) - data.WritePackedGuid(ToUnit().GetVictim().GetGUID()); // CombatVictim + { + Unit unit = ToUnit(); + data.WritePackedGuid(unit.GetVictim().GetGUID()); // CombatVictim + } if (flags.ServerTime) data.WriteUInt32(GameTime.GetGameTimeMS()); @@ -481,7 +483,10 @@ namespace Game.Entities } if (flags.Rotation) - data.WriteInt64(ToGameObject().GetPackedLocalRotation()); // Rotation + { + GameObject gameObject = ToGameObject(); + data.WriteInt64(gameObject.GetPackedLocalRotation()); // Rotation + } if (PauseTimes != null && !PauseTimes.Empty()) foreach (var stopFrame in PauseTimes) @@ -493,138 +498,6 @@ namespace Game.Entities MovementExtensions.WriteTransportInfo(data, self.m_movementInfo.transport); } - if (flags.AreaTrigger) - { - AreaTrigger areaTrigger = ToAreaTrigger(); - AreaTriggerCreateProperties createProperties = areaTrigger.GetCreateProperties(); - AreaTriggerShapeInfo shape = areaTrigger.GetShape(); - - data.WriteUInt32(areaTrigger.GetTimeSinceCreated()); - - data.WriteVector3(areaTrigger.GetRollPitchYaw()); - - switch (shape.TriggerType) - { - case AreaTriggerShapeType.Sphere: - data.WriteInt8(0); - data.WriteFloat(shape.SphereDatas.Radius); - data.WriteFloat(shape.SphereDatas.RadiusTarget); - break; - case AreaTriggerShapeType.Box: - data.WriteInt8(1); - data.WriteFloat(shape.BoxDatas.Extents[0]); - data.WriteFloat(shape.BoxDatas.Extents[1]); - data.WriteFloat(shape.BoxDatas.Extents[2]); - data.WriteFloat(shape.BoxDatas.ExtentsTarget[0]); - data.WriteFloat(shape.BoxDatas.ExtentsTarget[1]); - data.WriteFloat(shape.BoxDatas.ExtentsTarget[2]); - break; - case AreaTriggerShapeType.Polygon: - data.WriteInt8(3); - data.WriteInt32(shape.PolygonVertices.Count); - data.WriteInt32(shape.PolygonVerticesTarget.Count); - data.WriteFloat(shape.PolygonDatas.Height); - data.WriteFloat(shape.PolygonDatas.HeightTarget); - - foreach (var vertice in shape.PolygonVertices) - data.WriteVector2(vertice); - - foreach (var vertice in shape.PolygonVerticesTarget) - data.WriteVector2(vertice); - break; - case AreaTriggerShapeType.Cylinder: - data.WriteInt8(4); - data.WriteFloat(shape.CylinderDatas.Radius); - data.WriteFloat(shape.CylinderDatas.RadiusTarget); - data.WriteFloat(shape.CylinderDatas.Height); - data.WriteFloat(shape.CylinderDatas.HeightTarget); - data.WriteFloat(shape.CylinderDatas.LocationZOffset); - data.WriteFloat(shape.CylinderDatas.LocationZOffsetTarget); - break; - case AreaTriggerShapeType.Disk: - data.WriteInt8(7); - data.WriteFloat(shape.DiskDatas.InnerRadius); - data.WriteFloat(shape.DiskDatas.InnerRadiusTarget); - data.WriteFloat(shape.DiskDatas.OuterRadius); - data.WriteFloat(shape.DiskDatas.OuterRadiusTarget); - data.WriteFloat(shape.DiskDatas.Height); - data.WriteFloat(shape.DiskDatas.HeightTarget); - data.WriteFloat(shape.DiskDatas.LocationZOffset); - data.WriteFloat(shape.DiskDatas.LocationZOffsetTarget); - break; - case AreaTriggerShapeType.BoundedPlane: - data.WriteInt8(8); - data.WriteFloat(shape.BoundedPlaneDatas.Extents[0]); - data.WriteFloat(shape.BoundedPlaneDatas.Extents[1]); - data.WriteFloat(shape.BoundedPlaneDatas.ExtentsTarget[0]); - data.WriteFloat(shape.BoundedPlaneDatas.ExtentsTarget[1]); - break; - default: - break; - } - - bool hasAbsoluteOrientation = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAbsoluteOrientation); - bool hasDynamicShape = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasDynamicShape); - bool hasAttached = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasAttached); - bool hasFaceMovementDir = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasFaceMovementDir); - bool hasFollowsTerrain = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasFollowsTerrain); - bool hasAlwaysExterior = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.AlwaysExterior); - bool hasUnknown1025 = false; - bool hasTargetRollPitchYaw = createProperties != null && createProperties.Flags.HasFlag(AreaTriggerCreatePropertiesFlag.HasTargetRollPitchYaw); - bool hasScaleCurveID = createProperties != null && createProperties.ScaleCurveId != 0; - bool hasMorphCurveID = createProperties != null && createProperties.MorphCurveId != 0; - bool hasFacingCurveID = createProperties != null && createProperties.FacingCurveId != 0; - bool hasMoveCurveID = createProperties != null && createProperties.MoveCurveId != 0; - bool hasMovementScript = false; - bool hasPositionalSoundKitID = false; - - data.WriteBit(hasAbsoluteOrientation); - data.WriteBit(hasDynamicShape); - data.WriteBit(hasAttached); - data.WriteBit(hasFaceMovementDir); - data.WriteBit(hasFollowsTerrain); - data.WriteBit(hasAlwaysExterior); - data.WriteBit(hasUnknown1025); - data.WriteBit(hasTargetRollPitchYaw); - data.WriteBit(hasScaleCurveID); - data.WriteBit(hasMorphCurveID); - data.WriteBit(hasFacingCurveID); - data.WriteBit(hasMoveCurveID); - data.WriteBit(hasPositionalSoundKitID); - data.WriteBit(areaTrigger.HasSplines()); - data.WriteBit(areaTrigger.HasOrbit()); - data.WriteBit(hasMovementScript); - - data.FlushBits(); - - if (areaTrigger.HasSplines()) - AreaTriggerSplineInfo.WriteAreaTriggerSpline(data, areaTrigger.GetTimeToTarget(), areaTrigger.GetElapsedTimeForMovement(), areaTrigger.GetSpline()); - - if (hasTargetRollPitchYaw) - data.WriteVector3(areaTrigger.GetTargetRollPitchYaw()); - - if (hasScaleCurveID) - data.WriteUInt32(createProperties.ScaleCurveId); - - if (hasMorphCurveID) - data.WriteUInt32(createProperties.MorphCurveId); - - if (hasFacingCurveID) - data.WriteUInt32(createProperties.FacingCurveId); - - if (hasMoveCurveID) - data.WriteUInt32(createProperties.MoveCurveId); - - if (hasPositionalSoundKitID) - data.WriteUInt32(0); - - //if (hasMovementScript) - // *data << *areaTrigger.GetMovementScript(); // AreaTriggerMovementScriptInfo - - if (areaTrigger.HasOrbit()) - areaTrigger.GetOrbit().Write(data); - } - if (flags.GameObject) { GameObject gameObject = ToGameObject(); @@ -785,7 +658,7 @@ namespace Game.Entities Player player = ToPlayer(); bool HasSceneInstanceIDs = !player.GetSceneMgr().GetSceneTemplateByInstanceMap().Empty(); - bool HasRuneState = ToUnit().GetPowerIndex(PowerType.Runes) != (int)PowerType.Max; + bool HasRuneState = player.GetPowerIndex(PowerType.Runes) != (int)PowerType.Max; data.WriteBit(HasSceneInstanceIDs); data.WriteBit(HasRuneState); @@ -794,8 +667,8 @@ namespace Game.Entities if (HasSceneInstanceIDs) { data.WriteInt32(player.GetSceneMgr().GetSceneTemplateByInstanceMap().Count); - foreach (var pair in player.GetSceneMgr().GetSceneTemplateByInstanceMap()) - data.WriteUInt32(pair.Key); + foreach (var (sceneInstanceId, _) in player.GetSceneMgr().GetSceneTemplateByInstanceMap()) + data.WriteUInt32(sceneInstanceId); } if (HasRuneState) @@ -4157,7 +4030,6 @@ namespace Game.Entities public bool Vehicle; public bool AnimKit; public bool Rotation; - public bool AreaTrigger; public bool GameObject; public bool SmoothPhasing; public bool ThisIsYou; @@ -4178,7 +4050,6 @@ namespace Game.Entities Vehicle = false; AnimKit = false; Rotation = false; - AreaTrigger = false; GameObject = false; SmoothPhasing = false; ThisIsYou = false; diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index d31a9bfd9..568e34816 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -725,6 +725,25 @@ namespace Game.Entities } } + void _LoadCharacterBankTabSettings(SQLResult result) + { + if (!result.IsEmpty()) + { + do + { + if (result.Read(0) >= (InventorySlots.BankBagEnd - InventorySlots.BankBagStart)) + continue; + + SetCharacterBankTabSettings(result.Read(0), result.Read(1), result.Read(2), + result.Read(3), (BagSlotFlags)result.Read(4)); + + } while (result.NextRow()); + } + + while (m_activePlayerData.CharacterBankTabSettings.Size() < m_activePlayerData.NumCharacterBankTabs) + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CharacterBankTabSettings), new BankTabSettings()); + } + void _LoadCurrency(SQLResult result) { if (result.IsEmpty()) @@ -1272,7 +1291,13 @@ namespace Game.Entities }); if (activeConfig >= 0) - SetActiveCombatTraitConfigID(m_activePlayerData.TraitConfigs[activeConfig].ID); + { + TraitConfig activeTraitConfig = m_activePlayerData.TraitConfigs[activeConfig]; + SetActiveCombatTraitConfigID(activeTraitConfig.ID); + int activeSubTree = activeTraitConfig.SubTrees.FindIndexIf(subTree => subTree.Active != 0); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); + } foreach (TraitConfig traitConfig in m_activePlayerData.TraitConfigs) { @@ -1340,55 +1365,6 @@ namespace Game.Entities RemoveAtLoginFlag(AtLoginFlags.Resurrect); } - void _LoadVoidStorage(SQLResult result) - { - if (result.IsEmpty()) - return; - - do - { - // SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ? - ulong itemId = result.Read(0); - uint itemEntry = result.Read(1); - byte slot = result.Read(2); - ObjectGuid creatorGuid = result.Read(3) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read(3)) : ObjectGuid.Empty; - uint randomBonusListId = result.Read(4); - uint fixedScalingLevel = result.Read(5); - uint artifactKnowledgeLevel = result.Read(6); - ItemContext context = (ItemContext)result.Read(7); - List bonusListIDs = new(); - var bonusListIdTokens = new StringArray(result.Read(8), ' '); - for (var i = 0; i < bonusListIdTokens.Length; ++i) - { - if (uint.TryParse(bonusListIdTokens[i], out uint id)) - bonusListIDs.Add(id); - } - - if (itemId == 0) - { - Log.outError(LogFilter.Player, "Player:_LoadVoidStorage - Player (GUID: {0}, name: {1}) has an item with an invalid id (item id: item id: {2}, entry: {3}).", GetGUID().ToString(), GetName(), itemId, itemEntry); - continue; - } - - if (Global.ObjectMgr.GetItemTemplate(itemEntry) == null) - { - Log.outError(LogFilter.Player, "Player:_LoadVoidStorage - Player (GUID: {0}, name: {1}) has an item with an invalid entry (item id: item id: {2}, entry: {3}).", GetGUID().ToString(), GetName(), itemId, itemEntry); - continue; - } - - if (slot >= SharedConst.VoidStorageMaxSlot) - { - Log.outError(LogFilter.Player, "Player:_LoadVoidStorage - Player (GUID: {0}, name: {1}) has an item with an invalid slot (item id: item id: {2}, entry: {3}, slot: {4}).", GetGUID().ToString(), GetName(), itemId, itemEntry, slot); - continue; - } - - _voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs); - - BonusData bonus = new(new ItemInstance(_voidStorageItems[slot])); - GetSession().GetCollectionMgr().AddItemAppearance(itemEntry, bonus.AppearanceModID); - } - while (result.NextRow()); - } public void _LoadMail(SQLResult mailsResult, SQLResult mailItemsResult, SQLResult artifactResult, SQLResult azeriteItemResult, SQLResult azeriteItemMilestonePowersResult, SQLResult azeriteItemUnlockedEssencesResult, SQLResult azeriteEmpoweredItemResult) { @@ -2762,6 +2738,26 @@ namespace Game.Entities _playerDataFlagsNeedSave.Clear(); } + void _SaveCharacterBankTabSettings(SQLTransaction trans) + { + PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_CHARACTER_BANK_TAB_SETTINGS); + stmt.AddValue(0, GetGUID().GetCounter()); + trans.Append(stmt); + + for (int i = 0; i < m_activePlayerData.CharacterBankTabSettings.Size(); ++i) + { + BankTabSettings tabSetting = m_activePlayerData.CharacterBankTabSettings[i]; + stmt = CharacterDatabase.GetPreparedStatement(CharStatements.INS_CHARACTER_BANK_TAB_SETTINGS); + stmt.AddValue(0, GetGUID().GetCounter()); + stmt.AddValue(1, i); + stmt.AddValue(2, tabSetting.Name); + stmt.AddValue(3, tabSetting.Icon); + stmt.AddValue(4, tabSetting.Description); + stmt.AddValue(5, tabSetting.DepositFlags); + trans.Append(stmt); + } + } + public void SaveInventoryAndGoldToDB(SQLTransaction trans) { _SaveInventory(trans); @@ -2867,42 +2863,7 @@ namespace Game.Entities } } } - void _SaveVoidStorage(SQLTransaction trans) - { - PreparedStatement stmt; - for (byte i = 0; i < SharedConst.VoidStorageMaxSlot; ++i) - { - if (_voidStorageItems[i] == null) // unused item - { - // DELETE FROM void_storage WHERE slot = ? AND playerGuid = ? - stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT); - stmt.AddValue(0, i); - stmt.AddValue(1, GetGUID().GetCounter()); - } - else - { - // REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomPropertyType, randomProperty, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - stmt = CharacterDatabase.GetPreparedStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM); - stmt.AddValue(0, _voidStorageItems[i].ItemId); - stmt.AddValue(1, GetGUID().GetCounter()); - stmt.AddValue(2, _voidStorageItems[i].ItemEntry); - stmt.AddValue(3, i); - stmt.AddValue(4, _voidStorageItems[i].CreatorGuid.GetCounter()); - stmt.AddValue(5, (byte)_voidStorageItems[i].RandomBonusListId); - stmt.AddValue(6, _voidStorageItems[i].FixedScalingLevel); - stmt.AddValue(7, _voidStorageItems[i].ArtifactKnowledgeLevel); - stmt.AddValue(8, (byte)_voidStorageItems[i].Context); - - StringBuilder bonusListIDs = new(); - foreach (uint bonusListID in _voidStorageItems[i].BonusListIDs) - bonusListIDs.AppendFormat("{0} ", bonusListID); - stmt.AddValue(9, bonusListIDs.ToString()); - } - - trans.Append(stmt); - } - } void _SaveCUFProfiles(SQLTransaction trans) { PreparedStatement stmt; @@ -3006,10 +2967,8 @@ namespace Game.Entities bagSlotFlags[i] = (BagSlotFlags)result.Read(fieldIndex++); byte bankSlots = result.Read(fieldIndex++); - BagSlotFlags[] bankBagSlotFlags = new BagSlotFlags[7]; + byte bankTabs = result.Read(fieldIndex++); BagSlotFlags bankBagFlags = (BagSlotFlags)result.Read(fieldIndex++); - for (var i = 0; i < bankBagSlotFlags.Length; ++i) - bankBagSlotFlags[i] = (BagSlotFlags)result.Read(fieldIndex++); PlayerRestState restState = (PlayerRestState)result.Read(fieldIndex++); PlayerFlags playerFlags = (PlayerFlags)result.Read(fieldIndex++); @@ -3179,9 +3138,8 @@ namespace Game.Entities ReplaceAllBagSlotFlags(bagIndex, bagSlotFlags[bagIndex]); SetBankBagSlotCount(bankSlots); + SetCharacterBankTabCount(bankTabs); SetBankAutoSortDisabled(bankBagFlags.HasFlag(BagSlotFlags.DisableAutoSort)); - for (int bagIndex = 0; bagIndex < bankBagSlotFlags.Length; ++bagIndex) - ReplaceAllBankBagSlotFlags(bagIndex, bankBagSlotFlags[bagIndex]); SetNativeGender(gender); SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.Inebriation), drunk); @@ -3608,12 +3566,11 @@ namespace Game.Entities // must be before inventory (some items required reputation check) reputationMgr.LoadFromDB(holder.GetResult(PlayerLoginQueryLoad.Reputation)); + _LoadCharacterBankTabSettings(holder.GetResult(PlayerLoginQueryLoad.BankTabSettings)); + _LoadInventory(holder.GetResult(PlayerLoginQueryLoad.Inventory), holder.GetResult(PlayerLoginQueryLoad.Artifacts), holder.GetResult(PlayerLoginQueryLoad.Azerite), holder.GetResult(PlayerLoginQueryLoad.AzeriteMilestonePowers), holder.GetResult(PlayerLoginQueryLoad.AzeriteUnlockedEssences), holder.GetResult(PlayerLoginQueryLoad.AzeriteEmpowered), time_diff); - if (IsVoidStorageUnlocked()) - _LoadVoidStorage(holder.GetResult(PlayerLoginQueryLoad.VoidStorage)); - // update items with duration and realtime UpdateItemDuration(time_diff, true); @@ -3884,13 +3841,12 @@ namespace Game.Entities foreach (uint bagSlotFlag in m_activePlayerData.BagSlotFlags) stmt.AddValue(index++, bagSlotFlag); stmt.AddValue(index++, GetBankBagSlotCount()); + stmt.AddValue(index++, GetCharacterBankTabCount()); inventoryFlags = BagSlotFlags.None; if (m_activePlayerData.BankAutoSortDisabled) inventoryFlags |= BagSlotFlags.DisableAutoSort; stmt.AddValue(index++, (uint)inventoryFlags); - foreach (uint bankBagSlotFlag in m_activePlayerData.BankBagSlotFlags) - stmt.AddValue(index++, bankBagSlotFlag); stmt.AddValue(index++, m_activePlayerData.RestInfo[(int)RestTypes.XP].StateID); stmt.AddValue(index++, m_playerData.PlayerFlags); @@ -4019,13 +3975,12 @@ namespace Game.Entities foreach (uint bagSlotFlag in m_activePlayerData.BagSlotFlags) stmt.AddValue(index++, bagSlotFlag); stmt.AddValue(index++, GetBankBagSlotCount()); + stmt.AddValue(index++, GetCharacterBankTabCount()); inventoryFlags = BagSlotFlags.None; if (m_activePlayerData.BankAutoSortDisabled) inventoryFlags |= BagSlotFlags.DisableAutoSort; stmt.AddValue(index++, (uint)inventoryFlags); - foreach (uint bankBagSlotFlag in m_activePlayerData.BankBagSlotFlags) - stmt.AddValue(index++, bankBagSlotFlag); stmt.AddValue(index++, m_activePlayerData.RestInfo[(int)RestTypes.XP].StateID); stmt.AddValue(index++, m_playerData.PlayerFlags); @@ -4179,7 +4134,6 @@ namespace Game.Entities _SaveCustomizations(characterTransaction); _SaveBGData(characterTransaction); _SaveInventory(characterTransaction); - _SaveVoidStorage(characterTransaction); _SaveQuestStatus(characterTransaction); _SaveDailyQuestStatus(characterTransaction); _SaveWeeklyQuestStatus(characterTransaction); @@ -4203,6 +4157,7 @@ namespace Game.Entities _SaveCurrency(characterTransaction); _SaveCUFProfiles(characterTransaction); _SavePlayerData(characterTransaction); + _SaveCharacterBankTabSettings(characterTransaction); if (_garrison != null) _garrison.SaveToDB(characterTransaction); @@ -4717,10 +4672,6 @@ namespace Game.Entities stmt.AddValue(0, guid); trans.Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID); - stmt.AddValue(0, guid); - trans.Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_CHAR_FISHINGSTEPS); stmt.AddValue(0, guid); trans.Append(stmt); @@ -4755,6 +4706,18 @@ namespace Game.Entities stmt.AddValue(0, guid); trans.Append(stmt); + stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_PLAYER_DATA_ELEMENTS_CHARACTER_BY_GUID); + stmt.AddValue(0, guid); + trans.Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_PLAYER_DATA_FLAGS_CHARACTER_BY_GUID); + stmt.AddValue(0, guid); + trans.Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CharStatements.DEL_CHARACTER_BANK_TAB_SETTINGS); + stmt.AddValue(0, guid); + trans.Append(stmt); + Global.CharacterCacheStorage.DeleteCharacterCacheEntry(playerGuid, name); break; } diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 57e964266..6eae8910d 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -41,7 +41,6 @@ namespace Game.Entities List m_itemSoulboundTradeable = new(); List m_refundableItems = new(); public List ItemUpdateQueue = new(); - VoidStorageItem[] _voidStorageItems = new VoidStorageItem[SharedConst.VoidStorageMaxSlot]; Item[] m_items = new Item[(int)PlayerSlots.Count]; uint m_WeaponProficiency; uint m_ArmorProficiency; @@ -490,32 +489,6 @@ namespace Game.Entities public uint leftduration; } - public class VoidStorageItem - { - public VoidStorageItem(ulong id, uint entry, ObjectGuid creator, uint randomBonusListId, uint fixedScalingLevel, uint artifactKnowledgeLevel, ItemContext context, List bonuses) - { - ItemId = id; - ItemEntry = entry; - CreatorGuid = creator; - RandomBonusListId = randomBonusListId; - FixedScalingLevel = fixedScalingLevel; - ArtifactKnowledgeLevel = artifactKnowledgeLevel; - Context = context; - - foreach (var value in bonuses) - BonusListIDs.Add(value); - } - - public ulong ItemId; - public uint ItemEntry; - public ObjectGuid CreatorGuid; - public uint RandomBonusListId; - public uint FixedScalingLevel; - public uint ArtifactKnowledgeLevel; - public ItemContext Context; - public List BonusListIDs = new(); - } - public class EquipmentSetInfo { public EquipmentSetInfo() diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 5abdbcf70..8fa85b5bd 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -1449,7 +1449,7 @@ namespace Game.Entities return res; // return latest error if any } - Item EquipNewItem(ushort pos, uint item, ItemContext context, bool update) + public Item EquipNewItem(ushort pos, uint item, ItemContext context, bool update) { Item pItem = Item.CreateItem(item, 1, context, this); if (pItem != null) @@ -2055,12 +2055,6 @@ namespace Game.Entities } } - if (IsReagentBankPos(dst) && !IsReagentBankUnlocked()) - { - SendEquipError(InventoryResult.ReagentBankLocked, pSrcItem, pDstItem); - return; - } - // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions) // or swap empty bag with another empty or not empty bag (with items exchange) @@ -2094,8 +2088,7 @@ namespace Game.Entities RemoveItem(srcbag, srcslot, true); BankItem(dest, pSrcItem, true); - if (!IsReagentBankPos(dst)) - ItemRemovedQuestCheck(pSrcItem.GetEntry(), pSrcItem.GetCount()); + ItemRemovedQuestCheck(pSrcItem.GetEntry(), pSrcItem.GetCount()); } else if (IsEquipmentPos(dst)) { @@ -2738,18 +2731,10 @@ namespace Game.Entities if (slot >= InventorySlots.ItemStart && slot < InventorySlots.ItemStart + GetInventorySlotCount()) return true; - // bank main slots - if (slot >= InventorySlots.BankItemStart && slot < InventorySlots.BankItemEnd) - return true; - // bank bag slots if (slot >= InventorySlots.BankBagStart && slot < InventorySlots.BankBagEnd) return true; - // reagent bank bag slots - if (slot >= InventorySlots.ReagentStart && slot < InventorySlots.ReagentEnd) - return true; - return false; } @@ -4080,8 +4065,6 @@ namespace Game.Entities return true; if (bag >= InventorySlots.ReagentBagStart && bag < InventorySlots.ReagentBagEnd) return true; - if (bag == InventorySlots.Bag0 && (slot >= InventorySlots.ReagentStart && slot < InventorySlots.ReagentEnd)) - return true; if (bag == InventorySlots.Bag0 && (slot >= InventorySlots.ChildEquipmentStart && slot < InventorySlots.ChildEquipmentEnd)) return true; return false; @@ -4168,10 +4151,6 @@ namespace Game.Entities // prevent cheating if ((slot >= InventorySlots.BuyBackStart && slot < InventorySlots.BuyBackEnd) || slot >= (byte)PlayerSlots.End) return InventoryResult.WrongBagType; - - // can't store anything else than crafting reagents in Reagent Bank - if (IsReagentBankPos(bag, slot) && (!IsReagentBankUnlocked() || !pProto.IsCraftingReagent())) - return InventoryResult.WrongBagType; } else { @@ -4271,14 +4250,10 @@ namespace Game.Entities public static bool IsBankPos(byte bag, byte slot) { - if (bag == InventorySlots.Bag0 && (slot >= InventorySlots.BankItemStart && slot < InventorySlots.BankItemEnd)) - return true; if (bag == InventorySlots.Bag0 && (slot >= InventorySlots.BankBagStart && slot < InventorySlots.BankBagEnd)) return true; if (bag >= InventorySlots.BankBagStart && bag < InventorySlots.BankBagEnd) return true; - if (bag == InventorySlots.Bag0 && (slot >= InventorySlots.ReagentStart && slot < InventorySlots.ReagentEnd)) - return true; return false; } @@ -4293,12 +4268,6 @@ namespace Game.Entities Cypher.Assert(bag == ItemConst.NullBag && slot == ItemConst.NullSlot); // when reagentBankOnly is true then bag & slot must be hardcoded constants, not client input } - if ((IsReagentBankPos(bag, slot) || reagentBankOnly) && !IsReagentBankUnlocked()) - return InventoryResult.ReagentBankLocked; - - byte slotStart = reagentBankOnly ? InventorySlots.ReagentStart : InventorySlots.BankItemStart; - byte slotEnd = reagentBankOnly ? InventorySlots.ReagentEnd : InventorySlots.BankItemEnd; - uint count = pItem.GetCount(); Log.outDebug(LogFilter.Player, "STORAGE: CanBankItem bag = {0}, slot = {1}, item = {2}, count = {3}", bag, slot, pItem.GetEntry(), count); @@ -4334,7 +4303,7 @@ namespace Game.Entities if (!pItem.IsBag()) return InventoryResult.WrongSlot; - if (slot - InventorySlots.BagStart >= GetBankBagSlotCount()) + if (slot - InventorySlots.BagStart >= GetCharacterBankTabCount()) return InventoryResult.NoBankSlot; res = CanUseItem(pItem, not_loading); @@ -4363,12 +4332,7 @@ namespace Game.Entities { if (bag == InventorySlots.Bag0) { - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, ref count, true, pItem, bag, slot); - if (res != InventoryResult.Ok) - return res; - - if (count == 0) - return InventoryResult.Ok; + return InventoryResult.WrongSlot; // TODO: check if INVENTORY_SLOT_BAG_0 condition is neccessary } else { @@ -4387,12 +4351,7 @@ namespace Game.Entities // search free slot in bag if (bag == InventorySlots.Bag0) { - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, ref count, false, pItem, bag, slot); - if (res != InventoryResult.Ok) - return res; - - if (count == 0) - return InventoryResult.Ok; + return InventoryResult.WrongSlot; // TODO: check if INVENTORY_SLOT_BAG_0 condition is neccessary } else { @@ -4413,79 +4372,37 @@ namespace Game.Entities // search stack for merge to if (pProto.GetMaxStackSize() != 1) { - // in slots - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, ref count, true, pItem, bag, slot); + // in regular bags + for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) + { + // only consider tabs marked as reagents if requested + if (reagentBankOnly && (m_activePlayerData.CharacterBankTabSettings[i - InventorySlots.BankBagStart].DepositFlags & (int)BagSlotFlags.PriorityReagents) == 0) + continue; + + res = CanStoreItem_InBag(i, dest, pProto, ref count, true, true, pItem, bag, slot); + if (res != InventoryResult.Ok) + continue; + + if (count == 0) + return InventoryResult.Ok; + } + } + + // search free space in regular bags + for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) + { + // only consider tabs marked as reagents if requested + if (reagentBankOnly && (m_activePlayerData.CharacterBankTabSettings[i - InventorySlots.BankBagStart].DepositFlags & (int)BagSlotFlags.PriorityReagents) == 0) + continue; + + res = CanStoreItem_InBag(i, dest, pProto, ref count, false, true, pItem, bag, slot); if (res != InventoryResult.Ok) - return res; + continue; if (count == 0) return InventoryResult.Ok; - - // don't try to store reagents anywhere else than in Reagent Bank if we're on it - if (!reagentBankOnly) - { - // in special bags - if (pProto.GetBagFamily() != BagFamilyMask.None) - { - for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, ref count, true, false, pItem, bag, slot); - if (res != InventoryResult.Ok) - continue; - - if (count == 0) - return InventoryResult.Ok; - } - } - - // in regular bags - for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, ref count, true, true, pItem, bag, slot); - if (res != InventoryResult.Ok) - continue; - - if (count == 0) - return InventoryResult.Ok; - } - } } - // search free place in special bag - if (!reagentBankOnly && pProto.GetBagFamily() != BagFamilyMask.None) - { - for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, ref count, false, false, pItem, bag, slot); - if (res != InventoryResult.Ok) - continue; - - if (count == 0) - return InventoryResult.Ok; - } - } - - // search free space - res = CanStoreItem_InInventorySlots(slotStart, slotEnd, dest, pProto, ref count, false, pItem, bag, slot); - if (res != InventoryResult.Ok) - return res; - - if (count == 0) - return InventoryResult.Ok; - - // search free space in regular bags (don't try to store reagents anywhere else than in Reagent Bank if we're on it) - if (!reagentBankOnly) - { - for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) - { - res = CanStoreItem_InBag(i, dest, pProto, ref count, false, true, pItem, bag, slot); - if (res != InventoryResult.Ok) - continue; - - if (count == 0) - return InventoryResult.Ok; - } - } return reagentBankOnly ? InventoryResult.ReagentBankFull : InventoryResult.BankFull; } @@ -4530,10 +4447,6 @@ namespace Game.Entities if (location.HasFlag(ItemSearchLocation.Bank)) { - for (byte i = InventorySlots.BankItemStart; i < InventorySlots.BankItemEnd; ++i) - if (GetItemByPos(InventorySlots.Bag0, i) == null) - ++freeSlotCount; - for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; ++i) { Bag bag = GetBagByPos(i); @@ -4556,25 +4469,11 @@ namespace Game.Entities if (bag.GetItemByPos(j) == null) ++freeSlotCount; } - - for (byte i = InventorySlots.ReagentStart; i < InventorySlots.ReagentEnd; ++i) - if (GetItemByPos(InventorySlots.Bag0, i) == null) - ++freeSlotCount; } return freeSlotCount; } - //Reagent - public static bool IsReagentBankPos(ushort pos) { return IsReagentBankPos((byte)(pos >> 8), (byte)(pos & 255)); } - - public static bool IsReagentBankPos(byte bag, byte slot) - { - if (bag == InventorySlots.Bag0 && (slot >= InventorySlots.ReagentStart && slot < InventorySlots.ReagentEnd)) - return true; - return false; - } - //Bags public Bag GetBagByPos(byte bag) { @@ -4898,7 +4797,7 @@ namespace Game.Entities return ItemConst.NullSlot; } - InventoryResult CanEquipNewItem(byte slot, out ushort dest, uint item, bool swap) + public InventoryResult CanEquipNewItem(byte slot, out ushort dest, uint item, bool swap) { dest = 0; Item pItem = Item.CreateItem(item, 1, ItemContext.None, this); @@ -5253,6 +5152,14 @@ namespace Game.Entities //Child public static bool IsChildEquipmentPos(ushort pos) { return IsChildEquipmentPos((byte)(pos >> 8), (byte)(pos & 255)); } + public static bool IsAccountBankPos(ushort pos) { return IsBankPos((byte)(pos >> 8), (byte)(pos & 255)); } + public static bool IsAccountBankPos(byte bag, byte slot) + { + if (bag >= (int)AccountBankBagSlots.Start && bag < (int)AccountBankBagSlots.End) + return true; + return false; + } + //Artifact void ApplyArtifactPowers(Item item, bool apply) { @@ -5776,34 +5683,6 @@ namespace Game.Entities } } - // in bank - for (byte i = InventorySlots.BankItemStart; i < InventorySlots.BankItemEnd; i++) - { - Item item = GetItemByPos(InventorySlots.Bag0, i); - if (item != null) - { - if (item.GetEntry() == itemEntry && !item.IsInTrade()) - { - if (item.GetCount() + remcount <= count) - { - remcount += item.GetCount(); - DestroyItem(InventorySlots.Bag0, i, update); - if (remcount >= count) - return remcount; - } - else - { - item.SetCount(item.GetCount() - count + remcount); - ItemRemovedQuestCheck(item.GetEntry(), count - remcount); - if (IsInWorld && update) - item.SendUpdateToPlayer(this); - item.SetState(ItemUpdateState.Changed, this); - return count; - } - } - } - } - // in bank bags for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; i++) { @@ -5872,35 +5751,6 @@ namespace Game.Entities } } - for (byte i = InventorySlots.ReagentStart; i < InventorySlots.ReagentEnd; ++i) - { - Item item = GetItemByPos(InventorySlots.Bag0, i); - if (item != null) - { - if (item.GetEntry() == itemEntry && !item.IsInTrade()) - { - if (item.GetCount() + remcount <= count) - { - // all keys can be unequipped - remcount += item.GetCount(); - DestroyItem(InventorySlots.Bag0, i, update); - - if (remcount >= count) - return remcount; - } - else - { - item.SetCount(item.GetCount() - count + remcount); - ItemRemovedQuestCheck(item.GetEntry(), count - remcount); - if (IsInWorld && update) - item.SendUpdateToPlayer(this); - item.SetState(ItemUpdateState.Changed, this); - return count; - } - } - } - } - for (byte i = InventorySlots.ChildEquipmentStart; i < InventorySlots.ChildEquipmentEnd; ++i) { Item item = GetItemByPos(InventorySlots.Bag0, i); @@ -6014,6 +5864,27 @@ namespace Game.Entities public byte GetBankBagSlotCount() { return m_activePlayerData.NumBankSlots; } public void SetBankBagSlotCount(byte count) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NumBankSlots), count); } + public byte GetCharacterBankTabCount() { return m_activePlayerData.NumCharacterBankTabs; } + public void SetCharacterBankTabCount(byte count) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NumCharacterBankTabs), count); } + public byte GetAccountBankTabCount() { return m_activePlayerData.NumAccountBankTabs; } + public void SetAccountBankTabCount(byte count) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.NumAccountBankTabs), count); } + public void SetCharacterBankTabSettings(uint tabId, string name, string icon, string description, BagSlotFlags depositFlags) + { + var setter = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CharacterBankTabSettings, (int)tabId); + SetBankTabSettings(setter, name, icon, description, depositFlags); + } + public void SetAccountBankTabSettings(uint tabId, string name, string icon, string description, BagSlotFlags depositFlags) + { + var setter = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AccountBankTabSettings, (int)tabId); + SetBankTabSettings(setter, name, icon, description, depositFlags); + } + public void SetBankTabSettings(BankTabSettings bantTabSettings, string name, string icon, string description, BagSlotFlags depositFlags) + { + SetUpdateFieldValue(bantTabSettings.ModifyValue(bantTabSettings.Name), name); + SetUpdateFieldValue(bantTabSettings.ModifyValue(bantTabSettings.Icon), icon); + SetUpdateFieldValue(bantTabSettings.ModifyValue(bantTabSettings.Description), description); + SetUpdateFieldValue(bantTabSettings.ModifyValue(bantTabSettings.DepositFlags), (int)depositFlags); + } public bool IsBackpackAutoSortDisabled() { return m_activePlayerData.BackpackAutoSortDisabled; } public void SetBackpackAutoSortDisabled(bool disabled) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BackpackAutoSortDisabled), disabled); } @@ -6025,10 +5896,6 @@ namespace Game.Entities public void SetBagSlotFlag(int bagIndex, BagSlotFlags flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BagSlotFlags, bagIndex), (uint)flags); } public void RemoveBagSlotFlag(int bagIndex, BagSlotFlags flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BagSlotFlags, bagIndex), (uint)flags); } public void ReplaceAllBagSlotFlags(int bagIndex, BagSlotFlags flags) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BagSlotFlags, bagIndex), (uint)flags); } - public BagSlotFlags GetBankBagSlotFlags(int bagIndex) { return (BagSlotFlags)m_activePlayerData.BankBagSlotFlags[bagIndex]; } - public void SetBankBagSlotFlag(int bagIndex, BagSlotFlags flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BankBagSlotFlags, bagIndex), (uint)flags); } - public void RemoveBankBagSlotFlag(int bagIndex, BagSlotFlags flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BankBagSlotFlags, bagIndex), (uint)flags); } - public void ReplaceAllBankBagSlotFlags(int bagIndex, BagSlotFlags flags) { SetUpdateFieldValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BankBagSlotFlags, bagIndex), (uint)flags); } //Loot public ObjectGuid GetLootGUID() { return m_playerData.LootTargetGUID; } @@ -6308,91 +6175,6 @@ namespace Game.Entities } } - //Void Storage - public bool IsVoidStorageUnlocked() { return HasPlayerFlag(PlayerFlags.VoidUnlocked); } - public void UnlockVoidStorage() { SetPlayerFlag(PlayerFlags.VoidUnlocked); } - public void LockVoidStorage() { RemovePlayerFlag(PlayerFlags.VoidUnlocked); } - - public byte GetNextVoidStorageFreeSlot() - { - for (byte i = 0; i < SharedConst.VoidStorageMaxSlot; ++i) - if (_voidStorageItems[i] == null) // unused item - return i; - - return SharedConst.VoidStorageMaxSlot; - } - - public byte GetNumOfVoidStorageFreeSlots() - { - byte count = 0; - - for (byte i = 0; i < SharedConst.VoidStorageMaxSlot; ++i) - if (_voidStorageItems[i] == null) - count++; - - return count; - } - - public byte AddVoidStorageItem(VoidStorageItem item) - { - byte slot = GetNextVoidStorageFreeSlot(); - - if (slot >= SharedConst.VoidStorageMaxSlot) - { - GetSession().SendVoidStorageTransferResult(VoidTransferError.Full); - return 255; - } - - _voidStorageItems[slot] = item; - return slot; - } - - public void DeleteVoidStorageItem(byte slot) - { - if (slot >= SharedConst.VoidStorageMaxSlot) - { - GetSession().SendVoidStorageTransferResult(VoidTransferError.InternalError1); - return; - } - - _voidStorageItems[slot] = null; - } - - public bool SwapVoidStorageItem(byte oldSlot, byte newSlot) - { - if (oldSlot >= SharedConst.VoidStorageMaxSlot || newSlot >= SharedConst.VoidStorageMaxSlot || oldSlot == newSlot) - return false; - - _voidStorageItems.Swap(newSlot, oldSlot); - return true; - } - - public VoidStorageItem GetVoidStorageItem(byte slot) - { - if (slot >= SharedConst.VoidStorageMaxSlot) - { - GetSession().SendVoidStorageTransferResult(VoidTransferError.InternalError1); - return null; - } - - return _voidStorageItems[slot]; - } - - public VoidStorageItem GetVoidStorageItem(ulong id, out byte slot) - { - slot = 0; - for (byte i = 0; i < SharedConst.VoidStorageMaxSlot; ++i) - { - if (_voidStorageItems[i] != null && _voidStorageItems[i].ItemId == id) - { - slot = i; - return _voidStorageItems[i]; - } - } - - return null; - } - //Misc void UpdateItemLevelAreaBasedScaling() { @@ -6469,14 +6251,6 @@ namespace Game.Entities if (location.HasAnyFlag(ItemSearchLocation.Bank)) { - for (byte i = InventorySlots.BankItemStart; i < InventorySlots.BankItemEnd; ++i) - { - Item item = GetItemByPos(InventorySlots.Bag0, i); - if (item != null) - if (!callback(item)) - return false; - } - for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; ++i) { Bag bag = GetBagByPos(i); @@ -6509,14 +6283,6 @@ namespace Game.Entities } } } - - for (byte i = InventorySlots.ReagentStart; i < InventorySlots.ReagentEnd; ++i) - { - Item item = GetItemByPos(InventorySlots.Bag0, i); - if (item != null) - if (!callback(item)) - return false; - } } return true; diff --git a/Source/Game/Entities/Player/Player.Talents.cs b/Source/Game/Entities/Player/Player.Talents.cs index 50cd11d72..e07a6c7a3 100644 --- a/Source/Game/Entities/Player/Player.Talents.cs +++ b/Source/Game/Entities/Player/Player.Talents.cs @@ -365,9 +365,20 @@ namespace Game.Entities && ((TraitCombatConfigFlags)(int)traitConfig.CombatConfigFlags & TraitCombatConfigFlags.ActiveForSpec) != TraitCombatConfigFlags.None; }); if (specTraitConfigIndex >= 0) - SetActiveCombatTraitConfigID(m_activePlayerData.TraitConfigs[specTraitConfigIndex].ID); + { + TraitConfig activeTraitConfig = m_activePlayerData.TraitConfigs[specTraitConfigIndex]; + SetActiveCombatTraitConfigID(activeTraitConfig.ID); + int activeSubTree = activeTraitConfig.SubTrees.FindIndexIf(subTree => subTree.Active != 0); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(activeTraitConfig.SubTrees[activeSubTree].TraitSubTreeID); + else + SetCurrentCombatTraitConfigSubTreeID(0); + } else + { SetActiveCombatTraitConfigID(0); + SetCurrentCombatTraitConfigSubTreeID(0); + } foreach (var talentInfo in CliDB.TalentStorage.Values) { @@ -1136,6 +1147,17 @@ namespace Game.Entities } } + if (applyTraits) + { + int activeSubTree = editedConfig.SubTrees.FindIndexIf(subTree => subTree.Active != 0); + if (activeSubTree >= 0) + SetCurrentCombatTraitConfigSubTreeID(editedConfig.SubTrees[activeSubTree].TraitSubTreeID); + else + SetCurrentCombatTraitConfigSubTreeID(0); + + Item.UpdateItemSetAuras(this, false); + } + m_traitConfigStates[editedConfigId] = PlayerSpellState.Changed; } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index c8f9c7c76..129201e8d 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -143,9 +143,6 @@ namespace Game.Entities _cinematicMgr.Dispose(); - for (byte i = 0; i < SharedConst.VoidStorageMaxSlot; ++i) - _voidStorageItems[i] = null; - ClearResurrectRequestData(); WorldMgr.DecreasePlayerCount(); @@ -599,21 +596,8 @@ namespace Game.Entities if (target == this) { - for (byte i = EquipmentSlot.Start; i < InventorySlots.BankBagEnd; ++i) - { - if (m_items[i] == null) - continue; - - m_items[i].DestroyForPlayer(target); - } - - for (byte i = InventorySlots.ReagentStart; i < InventorySlots.ChildEquipmentEnd; ++i) - { - if (m_items[i] == null) - continue; - - m_items[i].DestroyForPlayer(target); - } + foreach (Item item in m_items) + item?.DestroyForPlayer(target); } } public override void CleanupsBeforeDelete(bool finalCleanup = true) @@ -7697,6 +7681,7 @@ namespace Game.Entities } void SetActiveCombatTraitConfigID(int traitConfigId) { SetUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.ActiveCombatTraitConfigID), (uint)traitConfigId); } + void SetCurrentCombatTraitConfigSubTreeID(int traitSubTreeId) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.CurrentCombatTraitConfigSubTreeID), traitSubTreeId); } void InitPrimaryProfessions() { diff --git a/Source/Game/Entities/Unit/Unit.Fields.cs b/Source/Game/Entities/Unit/Unit.Fields.cs index 6674c0f6f..34fe80e43 100644 --- a/Source/Game/Entities/Unit/Unit.Fields.cs +++ b/Source/Game/Entities/Unit/Unit.Fields.cs @@ -458,6 +458,8 @@ namespace Game.Entities public ObjectGuid castId; public SpellInfo Spell; public SpellCastVisual SpellVisual; + public uint StartTimeMs; + public uint Duration; public uint damage; public uint originalDamage; public SpellSchoolMask schoolMask; diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 452b1431b..2e8714b6f 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -2458,7 +2458,7 @@ namespace Game.Entities { SetAnimTier setAnimTier = new(); setAnimTier.Unit = GetGUID(); - setAnimTier.Tier = (int)animTier; + setAnimTier.Tier = (byte)animTier; SendMessageToSet(setAnimTier, true); } } @@ -2486,6 +2486,13 @@ namespace Game.Entities RemoveDynamicUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelObjects), index); } + public void SetChannelSpellData(uint startTimeMs, uint durationMs) + { + UnitChannel channelData = m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.ChannelData); + SetUpdateFieldValue(ref channelData.StartTimeMs, startTimeMs); + SetUpdateFieldValue(ref channelData.Duration, durationMs); + } + public sbyte GetSpellEmpowerStage() { return m_unitData.SpellEmpowerStage; } public void SetSpellEmpowerStage(sbyte stage) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.SpellEmpowerStage), stage); } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index e0508b6cc..17918d794 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -2722,11 +2722,11 @@ namespace Game // 0 1 2 3 4 5 SQLResult result = DB.World.Query("SELECT Entry, DifficultyID, LevelScalingDeltaMin, LevelScalingDeltaMax, ContentTuningID, HealthScalingExpansion, " + - //6 7 8 9 10 11 12 - "HealthModifier, ManaModifier, ArmorModifier, DamageModifier, CreatureDifficultyID, TypeFlags, TypeFlags2, " + - //13 14 15 16 17 + // 6 7 8 9 10 11 12 13 + "HealthModifier, ManaModifier, ArmorModifier, DamageModifier, CreatureDifficultyID, TypeFlags, TypeFlags2, TypeFlags3, " + + // 14 15 16 17 18 "LootID, PickPocketLootID, SkinLootID, GoldMin, GoldMax," + - //18 19 20 21 22 23 24 25 + // 19 20 21 22 23 24 25 26 "StaticFlags1, StaticFlags2, StaticFlags3, StaticFlags4, StaticFlags5, StaticFlags6, StaticFlags7, StaticFlags8 " + "FROM creature_template_difficulty ORDER BY Entry"); if (result.IsEmpty()) @@ -2760,12 +2760,13 @@ namespace Game creatureDifficulty.CreatureDifficultyID = result.Read(10); creatureDifficulty.TypeFlags = (CreatureTypeFlags)result.Read(11); creatureDifficulty.TypeFlags2 = result.Read(12); - creatureDifficulty.LootID = result.Read(13); - creatureDifficulty.PickPocketLootID = result.Read(14); - creatureDifficulty.SkinLootID = result.Read(15); - creatureDifficulty.GoldMin = result.Read(16); - creatureDifficulty.GoldMax = result.Read(17); - creatureDifficulty.StaticFlags = new(result.Read(18), result.Read(19), result.Read(20), result.Read(21), result.Read(22), result.Read(23), result.Read(24), result.Read(25)); + creatureDifficulty.TypeFlags3 = result.Read(13); + creatureDifficulty.LootID = result.Read(14); + creatureDifficulty.PickPocketLootID = result.Read(15); + creatureDifficulty.SkinLootID = result.Read(16); + creatureDifficulty.GoldMin = result.Read(17); + creatureDifficulty.GoldMax = result.Read(18); + creatureDifficulty.StaticFlags = new(result.Read(19), result.Read(20), result.Read(21), result.Read(22), result.Read(23), result.Read(24), result.Read(25), result.Read(26)); // TODO: Check if this still applies creatureDifficulty.DamageModifier *= Creature.GetDamageMod(template.Classification); @@ -10997,10 +10998,6 @@ namespace Game if (!result.IsEmpty()) Global.GuildMgr.SetNextGuildId(result.Read(0) + 1); - result = DB.Characters.Query("SELECT MAX(itemId) from character_void_storage"); - if (!result.IsEmpty()) - _voidItemId = result.Read(0) + 1; - result = DB.World.Query("SELECT MAX(guid) FROM creature"); if (!result.IsEmpty()) _creatureSpawnId = result.Read(0) + 1; @@ -11036,15 +11033,6 @@ namespace Game } return _mailId++; } - public ulong GenerateVoidStorageItemId() - { - if (_voidItemId >= 0xFFFFFFFFFFFFFFFE) - { - Log.outError(LogFilter.Misc, "_voidItemId overflow!! Can't continue, shutting down server. "); - Global.WorldMgr.StopNow(ShutdownExitCode.Error); - } - return _voidItemId++; - } public ulong GenerateCreatureSpawnId() { if (_creatureSpawnId >= 0xFFFFFFFFFFFFFFFE) @@ -11789,7 +11777,6 @@ namespace Game uint _hiPetNumber; ulong _creatureSpawnId; ulong _gameObjectSpawnId; - ulong _voidItemId; uint[] _playerXPperLevel; Dictionary _baseXPTable = new(); #endregion diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index ff72eb452..70c4034e4 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -520,7 +520,7 @@ namespace Game.Guilds SQLTransaction trans = new SQLTransaction(); // Remove money from bank - ulong tabCost = GetGuildBankTabPrice(tabId) * MoneyConstants.Gold; + ulong tabCost = GetGuildBankTabPrice(tabId); if (tabCost != 0 && !_ModifyBankMoney(trans, tabCost, false)) // Should not happen, this is checked by client return; @@ -2538,17 +2538,11 @@ namespace Game.Guilds ulong GetGuildBankTabPrice(byte tabId) { - // these prices are in gold units, not copper - switch (tabId) - { - case 0: return 100; - case 1: return 250; - case 2: return 500; - case 3: return 1000; - case 4: return 2500; - case 5: return 5000; - default: return 0; - } + var bankTab = CliDB.BankTabStorage.FirstOrDefault(bankTab => bankTab.Value.BankType == (int)BankType.Guild && bankTab.Value.OrderIndex == tabId).Value; + if (bankTab != null) + return bankTab.Cost; + + return 0; } public static void SendCommandResult(WorldSession session, GuildCommandType type, GuildCommandError errCode, string param = "") diff --git a/Source/Game/Handlers/AuthenticationHandler.cs b/Source/Game/Handlers/AuthenticationHandler.cs index 46aabb302..7490a5d3a 100644 --- a/Source/Game/Handlers/AuthenticationHandler.cs +++ b/Source/Game/Handlers/AuthenticationHandler.cs @@ -90,7 +90,6 @@ namespace Game features.BpayStoreAvailable = false; features.BpayStoreDisabledByParentalControls = false; features.CharUndeleteEnabled = WorldConfig.GetBoolValue(WorldCfg.FeatureSystemCharacterUndeleteEnabled); - features.BpayStoreEnabled = WorldConfig.GetBoolValue(WorldCfg.FeatureSystemBpayStoreEnabled); features.MaxCharactersOnThisRealm = WorldConfig.GetIntValue(WorldCfg.CharactersPerRealm); features.MinimumExpansionLevel = (int)Expansion.Classic; features.MaximumExpansionLevel = WorldConfig.GetIntValue(WorldCfg.Expansion); diff --git a/Source/Game/Handlers/BankHandler.cs b/Source/Game/Handlers/BankHandler.cs index 0bc314c30..7821f01a0 100644 --- a/Source/Game/Handlers/BankHandler.cs +++ b/Source/Game/Handlers/BankHandler.cs @@ -7,6 +7,7 @@ using Game.Entities; using Game.Networking; using Game.Networking.Packets; using System.Collections.Generic; +using System.Linq; namespace Game { @@ -127,65 +128,121 @@ namespace Game } } - [WorldPacketHandler(ClientOpcodes.BuyBankSlot, Processing = PacketProcessing.Inplace)] - void HandleBuyBankSlot(BuyBankSlot packet) + [WorldPacketHandler(ClientOpcodes.BuyAccountBankTab)] + void HandleBuyBankTab(BuyBankTab buyBankTab) { - if (!CanUseBank(packet.Guid)) + if (!CanUseBank(buyBankTab.Banker)) { - Log.outDebug(LogFilter.Network, "WORLD: HandleBuyBankSlot - {0} not found or you can't interact with him.", packet.Guid.ToString()); + Log.outDebug(LogFilter.Network, $"WorldSession::HandleBuyBankTab {_player.GetGUID()} - Banker {buyBankTab.Banker} not found or can't interact with him."); return; } - uint slot = GetPlayer().GetBankBagSlotCount(); + if (buyBankTab.BankType != BankType.Character) + { + Log.outDebug(LogFilter.Network, $"WorldSession::HandleBuyBankTab {_player.GetGUID()} - Bank type {buyBankTab.BankType} is not supported."); + return; + } + + uint itemId = 0; + byte slot = 0; + byte inventorySlot = 0; + + switch (buyBankTab.BankType) + { + case BankType.Character: + itemId = 242709; + slot = _player.GetCharacterBankTabCount(); + inventorySlot = InventorySlots.BankBagStart; + break; + case BankType.Account: + itemId = 208392; + slot = _player.GetAccountBankTabCount(); + inventorySlot = (byte)AccountBankBagSlots.Start; + break; + default: + Log.outDebug(LogFilter.Network, $"WorldSession::HandleBuyBankTab {_player.GetGUID()} - Bank type {buyBankTab.BankType} is not supported."); + return; + } // next slot ++slot; - BankBagSlotPricesRecord slotEntry = CliDB.BankBagSlotPricesStorage.LookupByKey(slot); - if (slotEntry == null) + var bankTab = CliDB.BankTabStorage.FirstOrDefault(record => record.Value.BankType == (byte)buyBankTab.BankType && record.Value.OrderIndex == slot).Value; + if (bankTab == null) return; - uint price = slotEntry.Cost; - if (!GetPlayer().HasEnoughMoney(price)) - return; - - GetPlayer().SetBankBagSlotCount((byte)slot); - GetPlayer().ModifyMoney(-price); - GetPlayer().UpdateCriteria(CriteriaType.BankSlotsPurchased); - } - - [WorldPacketHandler(ClientOpcodes.BuyReagentBank)] - void HandleBuyReagentBank(ReagentBank reagentBank) - { - if (!CanUseBank(reagentBank.Banker)) - { - Log.outDebug(LogFilter.Network, $"WORLD: HandleBuyReagentBankOpcode - {reagentBank.Banker} not found or you can't interact with him."); - return; - } - - if (_player.IsReagentBankUnlocked()) - { - Log.outDebug(LogFilter.Network, $"WORLD: HandleBuyReagentBankOpcode - Player ({_player.GetGUID()}, name: {_player.GetName()}) tried to unlock reagent bank a 2nd time."); - return; - } - - long price = 100 * MoneyConstants.Gold; - + ulong price = bankTab.Cost; if (!_player.HasEnoughMoney(price)) + return; + + InventoryResult msg = _player.CanEquipNewItem(inventorySlot, out ushort inventoryPos, itemId, false); + if (msg != InventoryResult.Ok) { - Log.outDebug(LogFilter.Network, $"WORLD: HandleBuyReagentBankOpcode - Player ({_player.GetGUID()}, name: {_player.GetName()}) without enough gold."); + _player.SendEquipError(msg, null, null, itemId); return; } - _player.ModifyMoney(-price); - _player.UnlockReagentBank(); + Item bag = _player.EquipNewItem(inventoryPos, itemId, ItemContext.None, true); + if (bag == null) + return; + + switch (buyBankTab.BankType) + { + case BankType.Character: + _player.SetCharacterBankTabCount(slot); + break; + case BankType.Account: + _player.SetAccountBankTabCount(slot); + break; + default: + break; + } + + _player.ModifyMoney(-(long)price); + + _player.UpdateCriteria(CriteriaType.BankTabPurchased, (ulong)buyBankTab.BankType); } - [WorldPacketHandler(ClientOpcodes.DepositReagentBank)] - void HandleReagentBankDeposit(ReagentBank reagentBank) + [WorldPacketHandler(ClientOpcodes.UpdateAccountBankTabSettings)] + void HandleUpdateBankTabSettings(UpdateBankTabSettings updateBankTabSettings) { - if (!CanUseBank(reagentBank.Banker)) + if (!CanUseBank(updateBankTabSettings.Banker)) { - Log.outDebug(LogFilter.Network, $"WORLD: HandleReagentBankDepositOpcode - {reagentBank.Banker} not found or you can't interact with him."); + Log.outDebug(LogFilter.Network, $"WorldSession::HandleUpdateBankTabSettings {_player.GetGUID()} - Banker {updateBankTabSettings.Banker} not found or can't interact with him."); + return; + } + + switch (updateBankTabSettings.BankType) + { + case BankType.Character: + if (updateBankTabSettings.Tab >= _player.m_activePlayerData.CharacterBankTabSettings.Size()) + { + Log.outDebug(LogFilter.Network, $"WorldSession::HandleUpdateBankTabSettings {_player.GetGUID()} doesn't have bank tab {updateBankTabSettings.Tab} in bank type {updateBankTabSettings.BankType}."); + return; + } + _player.SetCharacterBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name, + updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags); + break; + case BankType.Account: + if (updateBankTabSettings.Tab >= _player.m_activePlayerData.AccountBankTabSettings.Size()) + { + Log.outDebug(LogFilter.Network, $"WorldSession::HandleUpdateBankTabSettings {_player.GetGUID()} doesn't have bank tab {updateBankTabSettings.Tab} in bank type {updateBankTabSettings.BankType}."); + return; + } + _player.SetAccountBankTabSettings(updateBankTabSettings.Tab, updateBankTabSettings.Settings.Name, + updateBankTabSettings.Settings.Icon, updateBankTabSettings.Settings.Description, updateBankTabSettings.Settings.DepositFlags); + break; + default: + Log.outDebug(LogFilter.Network, $"WorldSession::HandleUpdateBankTabSettings {_player.GetGUID()} - Bank type {updateBankTabSettings.BankType} is not supported."); + break; + } + } + + [WorldPacketHandler(ClientOpcodes.AutoDepositCharacterBank)] + void HandleAutoDepositCharacterBank(AutoDepositCharacterBank autoDepositCharacterBank) + { + if (!CanUseBank(autoDepositCharacterBank.Banker)) + { + Log.outDebug(LogFilter.Network, $"WORLD: HandleAutoDepositCharacterBank - {autoDepositCharacterBank.Banker} not found or you can't interact with him."); return; } @@ -204,13 +261,13 @@ namespace Game if (msg != InventoryResult.Ok) { if (msg != InventoryResult.ReagentBankFull || !anyDeposited) - _player.SendEquipError(msg, item); + _player.SendEquipError(msg, item, null); break; } if (dest.Count == 1 && dest[0].pos == item.GetPos()) { - _player.SendEquipError(InventoryResult.CantSwap, item); + _player.SendEquipError(InventoryResult.CantSwap, item, null); continue; } @@ -219,90 +276,7 @@ namespace Game _player.BankItem(dest, item, true); anyDeposited = true; } - } - [WorldPacketHandler(ClientOpcodes.AutobankReagent)] - void HandleAutoBankReagent(AutoBankReagent autoBankReagent) - { - if (!CanUseBank()) - { - Log.outDebug(LogFilter.Network, $"WORLD: HandleAutoBankReagentOpcode - {_player.PlayerTalkClass.GetInteractionData().SourceGuid} not found or you can't interact with him."); - return; - } - - if (!_player.IsReagentBankUnlocked()) - { - _player.SendEquipError(InventoryResult.ReagentBankLocked); - return; - } - - Item item = _player.GetItemByPos(autoBankReagent.PackSlot, autoBankReagent.Slot); - if (item == null) - return; - - List dest = new(); - InventoryResult msg = _player.CanBankItem(ItemConst.NullBag, ItemConst.NullSlot, dest, item, false, true, true); - if (msg != InventoryResult.Ok) - { - _player.SendEquipError(msg, item); - return; - } - - if (dest.Count == 1 && dest[0].pos == item.GetPos()) - { - _player.SendEquipError(InventoryResult.CantSwap, item); - return; - } - - _player.RemoveItem(autoBankReagent.PackSlot, autoBankReagent.Slot, true); - _player.BankItem(dest, item, true); - } - - [WorldPacketHandler(ClientOpcodes.AutostoreBankReagent)] - void HandleAutoStoreBankReagent(AutoStoreBankReagent autoStoreBankReagent) - { - if (!CanUseBank()) - { - Log.outDebug(LogFilter.Network, $"WORLD: HandleAutoBankReagentOpcode - {_player.PlayerTalkClass.GetInteractionData().SourceGuid} not found or you can't interact with him."); - return; - } - - if (!_player.IsReagentBankUnlocked()) - { - _player.SendEquipError(InventoryResult.ReagentBankLocked); - return; - } - - Item pItem = _player.GetItemByPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot); - if (pItem == null) - return; - - if (Player.IsReagentBankPos(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot)) - { - List dest = new(); - InventoryResult msg = _player.CanStoreItem(ItemConst.NullBag, ItemConst.NullSlot, dest, pItem, false); - if (msg != InventoryResult.Ok) - { - _player.SendEquipError(msg, pItem); - return; - } - - _player.RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true); - _player.StoreItem(dest, pItem, true); - } - else - { - List dest = new(); - InventoryResult msg = _player.CanBankItem(ItemConst.NullBag, ItemConst.NullSlot, dest, pItem, false, true, true); - if (msg != InventoryResult.Ok) - { - _player.SendEquipError(msg, pItem); - return; - } - - _player.RemoveItem(autoStoreBankReagent.Slot, autoStoreBankReagent.PackSlot, true); - _player.BankItem(dest, pItem, true); - } } public void SendShowBank(ObjectGuid guid, PlayerInteractionType interactionType) diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 2963ce042..e048078ba 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -1144,7 +1144,6 @@ namespace Game features.CfgRealmRecID = 0; features.CommercePricePollTimeSeconds = 300; features.VoiceEnabled = false; - features.BrowserEnabled = false; // Has to be false, otherwise client will crash if "Customer Support" is opened EuropaTicketConfig europaTicketSystemStatus = new(); europaTicketSystemStatus.ThrottleState.MaxTries = 10; @@ -1163,7 +1162,6 @@ namespace Game features.EuropaTicketSystemStatus = europaTicketSystemStatus; features.CharUndeleteEnabled = WorldConfig.GetBoolValue(WorldCfg.FeatureSystemCharacterUndeleteEnabled); - features.BpayStoreEnabled = WorldConfig.GetBoolValue(WorldCfg.FeatureSystemBpayStoreEnabled); features.WarModeEnabled = WorldConfig.GetBoolValue(WorldCfg.FeatureSystemWarModeEnabled); features.IsChatMuted = !CanSpeak(); @@ -2796,10 +2794,6 @@ namespace Game stmt.AddValue(0, lowGuid); SetQuery(PlayerLoginQueryLoad.AzeriteEmpowered, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHAR_VOID_STORAGE); - stmt.AddValue(0, lowGuid); - SetQuery(PlayerLoginQueryLoad.VoidStorage, stmt); - stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_MAIL); stmt.AddValue(0, lowGuid); SetQuery(PlayerLoginQueryLoad.Mails, stmt); @@ -2966,6 +2960,10 @@ namespace Game stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_PLAYER_DATA_FLAGS_CHARACTER); stmt.AddValue(0, lowGuid); SetQuery(PlayerLoginQueryLoad.DataFlags, stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHARACTER_BANK_TAB_SETTINGS); + stmt.AddValue(0, lowGuid); + SetQuery(PlayerLoginQueryLoad.BankTabSettings, stmt); } public ObjectGuid GetGuid() { return m_guid; } @@ -3060,7 +3058,6 @@ namespace Game InstanceLockTimes, SeasonalQuestStatus, MonthlyQuestStatus, - VoidStorage, Currency, CufProfiles, CorpseLocation, @@ -3074,6 +3071,7 @@ namespace Game TraitConfigs, DataElements, DataFlags, + BankTabSettings, Max } diff --git a/Source/Game/Handlers/ItemHandler.cs b/Source/Game/Handlers/ItemHandler.cs index 5362a2ae7..bb39b33c7 100644 --- a/Source/Game/Handlers/ItemHandler.cs +++ b/Source/Game/Handlers/ItemHandler.cs @@ -1097,14 +1097,6 @@ namespace Game SendPacket(new BagCleanupFinished()); } - [WorldPacketHandler(ClientOpcodes.SortReagentBankBags, Processing = PacketProcessing.Inplace)] - void HandleSortReagentBankBags(SortReagentBankBags sortReagentBankBags) - { - // TODO: Implement sorting - // Placeholder to prevent completely locking out bags clientside - SendPacket(new BagCleanupFinished()); - } - [WorldPacketHandler(ClientOpcodes.RemoveNewItem, Processing = PacketProcessing.Inplace)] void HandleRemoveNewItem(RemoveNewItem removeNewItem) { @@ -1134,18 +1126,6 @@ namespace Game _player.RemoveBagSlotFlag(changeBagSlotFlag.BagIndex, changeBagSlotFlag.FlagToChange); } - [WorldPacketHandler(ClientOpcodes.ChangeBankBagSlotFlag, Processing = PacketProcessing.Inplace)] - void HandleChangeBankBagSlotFlag(ChangeBankBagSlotFlag changeBankBagSlotFlag) - { - if (changeBankBagSlotFlag.BagIndex >= _player.m_activePlayerData.BankBagSlotFlags.GetSize()) - return; - - if (changeBankBagSlotFlag.On) - _player.SetBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); - else - _player.RemoveBankBagSlotFlag(changeBankBagSlotFlag.BagIndex, changeBankBagSlotFlag.FlagToChange); - } - [WorldPacketHandler(ClientOpcodes.SetBackpackAutosortDisabled, Processing = PacketProcessing.Inplace)] void HandleSetBackpackAutosortDisabled(SetBackpackAutosortDisabled setBackpackAutosortDisabled) { diff --git a/Source/Game/Handlers/TradeHandler.cs b/Source/Game/Handlers/TradeHandler.cs index c815d0739..c5eae30a7 100644 --- a/Source/Game/Handlers/TradeHandler.cs +++ b/Source/Game/Handlers/TradeHandler.cs @@ -301,7 +301,16 @@ namespace Game SendTradeStatus(info); return; } + + if (Player.IsAccountBankPos(item.GetSlot(), item.GetBagSlot())) + { + info.Status = TradeStatus.Failed; + info.BagResult = InventoryResult.CantTradeAccountItem; + SendTradeStatus(info); + return; + } } + item = his_trade.GetItem((TradeSlots)i); if (item != null) { @@ -312,6 +321,14 @@ namespace Game return; } } + + if (Player.IsAccountBankPos(item.GetSlot(), item.GetBagSlot())) + { + info.Status = TradeStatus.Failed; + info.BagResult = InventoryResult.CantTradeAccountItem; + SendTradeStatus(info); + return; + } } if (his_trade.IsAccepted()) diff --git a/Source/Game/Handlers/VoidStorageHandler.cs b/Source/Game/Handlers/VoidStorageHandler.cs deleted file mode 100644 index 8cc1b5b2f..000000000 --- a/Source/Game/Handlers/VoidStorageHandler.cs +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (c) CypherCore All rights reserved. -// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. - -using Framework.Constants; -using Game.Entities; -using Game.Networking; -using Game.Networking.Packets; -using System.Collections.Generic; - -namespace Game -{ - public partial class WorldSession - { - public void SendVoidStorageTransferResult(VoidTransferError result) - { - SendPacket(new VoidTransferResult(result)); - } - - [WorldPacketHandler(ClientOpcodes.UnlockVoidStorage, Processing = PacketProcessing.Inplace)] - void HandleVoidStorageUnlock(UnlockVoidStorage unlockVoidStorage) - { - Creature unit = GetPlayer().GetNPCIfCanInteractWith(unlockVoidStorage.Npc, NPCFlags.VaultKeeper, NPCFlags2.None); - if (unit == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageUnlock - {0} not found or player can't interact with it.", unlockVoidStorage.Npc.ToString()); - return; - } - - if (GetPlayer().IsVoidStorageUnlocked()) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageUnlock - Player({0}, name: {1}) tried to unlock void storage a 2nd time.", GetPlayer().GetGUID().ToString(), GetPlayer().GetName()); - return; - } - - GetPlayer().ModifyMoney(-SharedConst.VoidStorageUnlockCost); - GetPlayer().UnlockVoidStorage(); - } - - [WorldPacketHandler(ClientOpcodes.QueryVoidStorage, Processing = PacketProcessing.Inplace)] - void HandleVoidStorageQuery(QueryVoidStorage queryVoidStorage) - { - Player player = GetPlayer(); - - Creature unit = player.GetNPCIfCanInteractWith(queryVoidStorage.Npc, NPCFlags.Transmogrifier | NPCFlags.VaultKeeper, NPCFlags2.None); - if (unit == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageQuery - {0} not found or player can't interact with it.", queryVoidStorage.Npc.ToString()); - SendPacket(new VoidStorageFailed()); - return; - } - - if (!GetPlayer().IsVoidStorageUnlocked()) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageQuery - {0} name: {1} queried void storage without unlocking it.", player.GetGUID().ToString(), player.GetName()); - SendPacket(new VoidStorageFailed()); - return; - } - - VoidStorageContents voidStorageContents = new(); - for (byte i = 0; i < SharedConst.VoidStorageMaxSlot; ++i) - { - VoidStorageItem item = player.GetVoidStorageItem(i); - if (item == null) - continue; - - VoidItem voidItem = new(); - voidItem.Guid = ObjectGuid.Create(HighGuid.Item, item.ItemId); - voidItem.Creator = item.CreatorGuid; - voidItem.Slot = i; - voidItem.Item = new ItemInstance(item); - - voidStorageContents.Items.Add(voidItem); - } - - SendPacket(voidStorageContents); - } - - [WorldPacketHandler(ClientOpcodes.VoidStorageTransfer)] - void HandleVoidStorageTransfer(VoidStorageTransfer voidStorageTransfer) - { - Player player = GetPlayer(); - - Creature unit = player.GetNPCIfCanInteractWith(voidStorageTransfer.Npc, NPCFlags.VaultKeeper, NPCFlags2.None); - if (unit == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageTransfer - {0} not found or player can't interact with it.", voidStorageTransfer.Npc.ToString()); - return; - } - - if (!player.IsVoidStorageUnlocked()) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageTransfer - Player ({0}, name: {1}) queried void storage without unlocking it.", player.GetGUID().ToString(), player.GetName()); - return; - } - - if (voidStorageTransfer.Deposits.Length > player.GetNumOfVoidStorageFreeSlots()) - { - SendVoidStorageTransferResult(VoidTransferError.Full); - return; - } - - if (!voidStorageTransfer.Withdrawals.Empty() && voidStorageTransfer.Withdrawals.Length > _player.GetFreeInventorySlotCount(ItemSearchLocation.Inventory)) - { - SendVoidStorageTransferResult(VoidTransferError.InventoryFull); - return; - } - - if (!player.HasEnoughMoney((voidStorageTransfer.Deposits.Length * SharedConst.VoidStorageStoreItemCost))) - { - SendVoidStorageTransferResult(VoidTransferError.NotEnoughMoney); - return; - } - - VoidStorageTransferChanges voidStorageTransferChanges = new(); - - byte depositCount = 0; - for (int i = 0; i < voidStorageTransfer.Deposits.Length; ++i) - { - Item item = player.GetItemByGuid(voidStorageTransfer.Deposits[i]); - if (item == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageTransfer - {0} {1} wants to deposit an invalid item ({2}).", player.GetGUID().ToString(), player.GetName(), voidStorageTransfer.Deposits[i].ToString()); - continue; - } - - VoidStorageItem itemVS = new(Global.ObjectMgr.GenerateVoidStorageItemId(), item.GetEntry(), item.GetCreator(), - item.GetItemRandomBonusListId(), item.GetModifier(ItemModifier.TimewalkerLevel), item.GetModifier(ItemModifier.ArtifactKnowledgeLevel), - item.GetContext(), item.GetBonusListIDs()); - - VoidItem voidItem; - voidItem.Guid = ObjectGuid.Create(HighGuid.Item, itemVS.ItemId); - voidItem.Creator = item.GetCreator(); - voidItem.Item = new ItemInstance(itemVS); - voidItem.Slot = _player.AddVoidStorageItem(itemVS); - - voidStorageTransferChanges.AddedItems.Add(voidItem); - - player.DestroyItem(item.GetBagSlot(), item.GetSlot(), true); - ++depositCount; - } - - long cost = depositCount * SharedConst.VoidStorageStoreItemCost; - - player.ModifyMoney(-cost); - - for (int i = 0; i < voidStorageTransfer.Withdrawals.Length; ++i) - { - byte slot; - VoidStorageItem itemVS = player.GetVoidStorageItem(voidStorageTransfer.Withdrawals[i].GetCounter(), out slot); - if (itemVS == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageTransfer - {0} {1} tried to withdraw an invalid item ({2})", player.GetGUID().ToString(), player.GetName(), voidStorageTransfer.Withdrawals[i].ToString()); - continue; - } - - List dest = new(); - InventoryResult msg = player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemVS.ItemEntry, 1); - if (msg != InventoryResult.Ok) - { - SendVoidStorageTransferResult(VoidTransferError.InventoryFull); - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidStorageTransfer - {0} {1} couldn't withdraw {2} because inventory was full.", player.GetGUID().ToString(), player.GetName(), voidStorageTransfer.Withdrawals[i].ToString()); - return; - } - - Item item = player.StoreNewItem(dest, itemVS.ItemEntry, true, itemVS.RandomBonusListId, null, itemVS.Context, itemVS.BonusListIDs); - if (item != null) - { - item.SetCreator(itemVS.CreatorGuid); - item.SetBinding(true); - GetCollectionMgr().AddItemAppearance(item); - } - - voidStorageTransferChanges.RemovedItems.Add(ObjectGuid.Create(HighGuid.Item, itemVS.ItemId)); - - player.DeleteVoidStorageItem(slot); - } - - SendPacket(voidStorageTransferChanges); - SendVoidStorageTransferResult(VoidTransferError.Ok); - } - - [WorldPacketHandler(ClientOpcodes.SwapVoidItem, Processing = PacketProcessing.Inplace)] - void HandleVoidSwapItem(SwapVoidItem swapVoidItem) - { - Player player = GetPlayer(); - - Creature unit = player.GetNPCIfCanInteractWith(swapVoidItem.Npc, NPCFlags.VaultKeeper, NPCFlags2.None); - if (unit == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidSwapItem - {0} not found or player can't interact with it.", swapVoidItem.Npc.ToString()); - return; - } - - if (!player.IsVoidStorageUnlocked()) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidSwapItem - Player ({0}, name: {1}) queried void storage without unlocking it.", player.GetGUID().ToString(), player.GetName()); - return; - } - - byte oldSlot; - if (player.GetVoidStorageItem(swapVoidItem.VoidItemGuid.GetCounter(), out oldSlot) == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleVoidSwapItem - Player (GUID: {0}, name: {1}) requested swapping an invalid item (slot: {2}, itemid: {3}).", player.GetGUID().ToString(), player.GetName(), swapVoidItem.DstSlot, swapVoidItem.VoidItemGuid.ToString()); - return; - } - - bool usedDestSlot = player.GetVoidStorageItem((byte)swapVoidItem.DstSlot) != null; - ObjectGuid itemIdDest = ObjectGuid.Empty; - if (usedDestSlot) - itemIdDest = ObjectGuid.Create(HighGuid.Item, player.GetVoidStorageItem((byte)swapVoidItem.DstSlot).ItemId); - - if (!player.SwapVoidStorageItem(oldSlot, (byte)swapVoidItem.DstSlot)) - { - SendVoidStorageTransferResult(VoidTransferError.InternalError1); - return; - } - - VoidItemSwapResponse voidItemSwapResponse = new(); - voidItemSwapResponse.VoidItemA = swapVoidItem.VoidItemGuid; - voidItemSwapResponse.VoidItemSlotA = swapVoidItem.DstSlot; - if (usedDestSlot) - { - voidItemSwapResponse.VoidItemB = itemIdDest; - voidItemSwapResponse.VoidItemSlotB = oldSlot; - } - - SendPacket(voidItemSwapResponse); - } - } -} diff --git a/Source/Game/Networking/Packets/AreaTriggerPackets.cs b/Source/Game/Networking/Packets/AreaTriggerPackets.cs index bc8a7385a..80ccc18be 100644 --- a/Source/Game/Networking/Packets/AreaTriggerPackets.cs +++ b/Source/Game/Networking/Packets/AreaTriggerPackets.cs @@ -48,37 +48,6 @@ namespace Game.Networking.Packets public override void Write() { } } - class AreaTriggerRePath : ServerPacket - { - public AreaTriggerRePath() : base(ServerOpcodes.AreaTriggerRePath) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(TriggerGUID); - _worldPacket.WritePackedGuid(Unused_1100); - - _worldPacket.WriteBit(AreaTriggerSpline != null); - _worldPacket.WriteBit(AreaTriggerOrbit != null); - _worldPacket.WriteBit(AreaTriggerMovementScript.HasValue); - _worldPacket.FlushBits(); - - if (AreaTriggerSpline != null) - AreaTriggerSpline.Write(_worldPacket); - - if (AreaTriggerMovementScript.HasValue) - AreaTriggerMovementScript.Value.Write(_worldPacket); - - if (AreaTriggerOrbit != null) - AreaTriggerOrbit.Write(_worldPacket); - } - - public AreaTriggerSplineInfo AreaTriggerSpline; - public AreaTriggerOrbitInfo AreaTriggerOrbit; - public AreaTriggerMovementScriptInfo? AreaTriggerMovementScript; - public ObjectGuid TriggerGUID; - public ObjectGuid Unused_1100; - } - class AreaTriggerPlaySpellVisual : ServerPacket { public ObjectGuid AreaTriggerGUID; @@ -108,31 +77,4 @@ namespace Game.Networking.Packets TargetGUID = _worldPacket.ReadPackedGuid(); } } - - - //Structs - class AreaTriggerSplineInfo - { - public static void WriteAreaTriggerSpline(WorldPacket data, uint timeToTarget, uint elapsedTimeForMovement, Spline areaTriggerSpline) - { - data.WriteUInt32(timeToTarget); - data.WriteUInt32(elapsedTimeForMovement); - - var points = areaTriggerSpline.GetPoints(); - data.WriteBits(points.Length, 16); - data.FlushBits(); - - foreach (Vector3 point in points) - data.WriteVector3(point); - } - - public void Write(WorldPacket data) - { - WriteAreaTriggerSpline(data, TimeToTarget, ElapsedTimeForMovement, Points); - } - - public uint TimeToTarget; - public uint ElapsedTimeForMovement; - public Spline Points; - } } diff --git a/Source/Game/Networking/Packets/BankPackets.cs b/Source/Game/Networking/Packets/BankPackets.cs index aeb8f354b..86c38c18f 100644 --- a/Source/Game/Networking/Packets/BankPackets.cs +++ b/Source/Game/Networking/Packets/BankPackets.cs @@ -40,62 +40,30 @@ namespace Game.Networking.Packets } } - public class BuyBankSlot : ClientPacket + public class BuyBankTab : ClientPacket { - public BuyBankSlot(WorldPacket packet) : base(packet) { } + public ObjectGuid Banker; + public BankType BankType; + + public BuyBankTab(WorldPacket packet) : base(packet) { } public override void Read() { - Guid = _worldPacket.ReadPackedGuid(); + Banker = _worldPacket.ReadPackedGuid(); + BankType = (BankType)_worldPacket.ReadInt8(); } - - public ObjectGuid Guid; } - class AutoBankReagent : ClientPacket + class AutoDepositCharacterBank : ClientPacket { - public AutoBankReagent(WorldPacket packet) : base(packet) { } + public ObjectGuid Banker; - public override void Read() - { - Inv = new(_worldPacket); - PackSlot = _worldPacket.ReadUInt8(); - Slot = _worldPacket.ReadUInt8(); - } - - public InvUpdate Inv; - public byte Slot; - public byte PackSlot; - } - - class AutoStoreBankReagent : ClientPacket - { - public AutoStoreBankReagent(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Inv = new(_worldPacket); - Slot = _worldPacket.ReadUInt8(); - PackSlot = _worldPacket.ReadUInt8(); - } - - public InvUpdate Inv; - public byte Slot; - public byte PackSlot; - } - - // CMSG_BUY_REAGENT_BANK - // CMSG_REAGENT_BANK_DEPOSIT - class ReagentBank : ClientPacket - { - public ReagentBank(WorldPacket packet) : base(packet) { } + public AutoDepositCharacterBank(WorldPacket packet) : base(packet) { } public override void Read() { Banker = _worldPacket.ReadPackedGuid(); } - - public ObjectGuid Banker; } class BankerActivate : ClientPacket @@ -111,4 +79,43 @@ namespace Game.Networking.Packets InteractionType = (PlayerInteractionType)_worldPacket.ReadInt32(); } } + + class UpdateBankTabSettings : ClientPacket + { + public ObjectGuid Banker; + public BankType BankType; + public byte Tab; + public BankTabSettings Settings; + + public UpdateBankTabSettings(WorldPacket packet) : base(packet) { } + + public override void Read() + { + Banker = _worldPacket.ReadPackedGuid(); + BankType = (BankType)_worldPacket.ReadInt8(); + Tab = _worldPacket.ReadUInt8(); + Settings.Read(_worldPacket); + } + } + + public struct BankTabSettings + { + public string Name; + public string Icon; + public string Description; + public BagSlotFlags DepositFlags; + + public void Read(WorldPacket data) + { + data.ResetBitPos(); + var nameLength = data.ReadBits(7); + var iconLength = data.ReadBits(9); + var descriptionLength = data.ReadBits(14); + DepositFlags = (BagSlotFlags)data.ReadInt32(); + + Name = data.ReadString(nameLength); + Icon = data.ReadString(iconLength); + Description = data.ReadString(descriptionLength); + } + } } diff --git a/Source/Game/Networking/Packets/InspectPackets.cs b/Source/Game/Networking/Packets/InspectPackets.cs index 4a83ddce7..9e5cb5d36 100644 --- a/Source/Game/Networking/Packets/InspectPackets.cs +++ b/Source/Game/Networking/Packets/InspectPackets.cs @@ -50,6 +50,8 @@ namespace Game.Networking.Packets for (int i = 0; i < PvpTalents.Count; ++i) _worldPacket.WriteUInt16(PvpTalents[i]); + TalentInfo.Write(_worldPacket); + _worldPacket.WriteBit(GuildData.HasValue); _worldPacket.WriteBit(AzeriteLevel.HasValue); _worldPacket.FlushBits(); @@ -79,6 +81,7 @@ namespace Game.Networking.Packets public ushort TodayHK; public ushort YesterdayHK; public byte LifetimeMaxRank; + public ClassicTalentInfoUpdate TalentInfo; public TraitInspectInfo TraitsInfo = new(); } diff --git a/Source/Game/Networking/Packets/ItemPackets.cs b/Source/Game/Networking/Packets/ItemPackets.cs index dafa3419e..1889992a5 100644 --- a/Source/Game/Networking/Packets/ItemPackets.cs +++ b/Source/Game/Networking/Packets/ItemPackets.cs @@ -657,13 +657,6 @@ namespace Game.Networking.Packets public override void Read() { } } - class SortReagentBankBags : ClientPacket - { - public SortReagentBankBags(WorldPacket packet) : base(packet) { } - - public override void Read() { } - } - class BagCleanupFinished : ServerPacket { public BagCleanupFinished() : base(ServerOpcodes.BagCleanupFinished, ConnectionType.Instance) { } @@ -1006,24 +999,6 @@ namespace Game.Networking.Packets } } - public ItemInstance(VoidStorageItem voidItem) - { - ItemID = voidItem.ItemEntry; - - if (voidItem.FixedScalingLevel != 0) - Modifications.Values.Add(new ItemMod(voidItem.FixedScalingLevel, ItemModifier.TimewalkerLevel)); - - if (voidItem.ArtifactKnowledgeLevel != 0) - Modifications.Values.Add(new ItemMod(voidItem.ArtifactKnowledgeLevel, ItemModifier.ArtifactKnowledgeLevel)); - - if (!voidItem.BonusListIDs.Empty()) - { - ItemBonus = new(); - ItemBonus.Context = voidItem.Context; - ItemBonus.BonusListIDs = voidItem.BonusListIDs; - } - } - public ItemInstance(SocketedGem gem) { ItemID = gem.ItemId; diff --git a/Source/Game/Networking/Packets/MovementPackets.cs b/Source/Game/Networking/Packets/MovementPackets.cs index 7d9fef056..fdcc4aeea 100644 --- a/Source/Game/Networking/Packets/MovementPackets.cs +++ b/Source/Game/Networking/Packets/MovementPackets.cs @@ -333,9 +333,9 @@ namespace Game.Networking.Packets if (moveSpline.anim_tier != null) { data.WriteUInt32(moveSpline.anim_tier.TierTransitionId); + data.WriteUInt8(moveSpline.anim_tier.AnimTier); data.WriteInt32(moveSpline.effect_start_time); data.WriteUInt32(0); - data.WriteUInt8(moveSpline.anim_tier.AnimTier); } //if (HasUnknown901) @@ -1473,9 +1473,9 @@ namespace Game.Networking.Packets public void Write(WorldPacket data) { data.WriteInt32(TierTransitionID); + data.WriteUInt8(AnimTier); data.WriteUInt32(StartTime); data.WriteUInt32(EndTime); - data.WriteUInt8(AnimTier); } } diff --git a/Source/Game/Networking/Packets/PartyPackets.cs b/Source/Game/Networking/Packets/PartyPackets.cs index ab6e7c353..b367e49c7 100644 --- a/Source/Game/Networking/Packets/PartyPackets.cs +++ b/Source/Game/Networking/Packets/PartyPackets.cs @@ -782,6 +782,7 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt8(LeaderFactionGroup); _worldPacket.WriteInt32((int)PingRestriction); _worldPacket.WriteInt32(PlayerList.Count); + _worldPacket.WriteBit(ChallengeMode.HasValue); _worldPacket.WriteBit(LfgInfos.HasValue); _worldPacket.WriteBit(LootSettings.HasValue); _worldPacket.WriteBit(DifficultySettings.HasValue); @@ -796,6 +797,9 @@ namespace Game.Networking.Packets if (DifficultySettings.HasValue) DifficultySettings.Value.Write(_worldPacket); + if (ChallengeMode.HasValue) + ChallengeMode.Value.Write(_worldPacket); + if (LfgInfos.HasValue) LfgInfos.Value.Write(_worldPacket); } @@ -815,6 +819,7 @@ namespace Game.Networking.Packets public List PlayerList = new(); + public ChallengeModeData? ChallengeMode; public PartyLFGInfo? LfgInfos; public PartyLootSettings? LootSettings; public PartyDifficultySettings? DifficultySettings; @@ -1253,8 +1258,50 @@ namespace Game.Networking.Packets public DungeonScoreSummary DungeonScore = new(); } + public struct LeaverInfo + { + public ObjectGuid BnetAccountGUID; + public float LeaveScore; + public uint SeasonID; + public uint TotalLeaves; + public uint TotalSuccesses; + public int ConsecutiveSuccesses; + public long LastPenaltyTime; + public long LeaverExpirationTime; + public int Unknown_1120; + public bool LeaverStatus; + + public void Write(WorldPacket data) + { + data.WritePackedGuid(BnetAccountGUID); + data.WriteFloat(LeaveScore); + data.WriteUInt32(SeasonID); + data.WriteUInt32(TotalLeaves); + data.WriteUInt32(TotalSuccesses); + data.WriteInt32(ConsecutiveSuccesses); + data.WriteInt64(LastPenaltyTime); + data.WriteInt64(LeaverExpirationTime); + data.WriteInt32(Unknown_1120); + data.WriteBits(LeaverStatus, 1); + data.FlushBits(); + } + } + struct PartyPlayerInfo { + public ObjectGuid GUID; + public string Name; + public string VoiceStateID; // same as bgs.protocol.club.v1.MemberVoiceState.id + public LeaverInfo Leaver; + public byte Class; + public byte Subgroup; + public byte Flags; + public byte RolesAssigned; + public byte FactionGroup; + public bool FromSocialQueue; + public bool VoiceChatSilenced; + public bool Connected; + public void Write(WorldPacket data) { data.WriteBits(Name.GetByteCount(), 6); @@ -1262,6 +1309,7 @@ namespace Game.Networking.Packets data.WriteBit(Connected); data.WriteBit(VoiceChatSilenced); data.WriteBit(FromSocialQueue); + Leaver.Write(data); data.WritePackedGuid(GUID); data.WriteUInt8(Subgroup); data.WriteUInt8(Flags); @@ -1272,22 +1320,21 @@ namespace Game.Networking.Packets if (!VoiceStateID.IsEmpty()) data.WriteString(VoiceStateID); } - - public ObjectGuid GUID; - public string Name; - public string VoiceStateID; // same as bgs.protocol.club.v1.MemberVoiceState.id - public byte Class; - public byte Subgroup; - public byte Flags; - public byte RolesAssigned; - public byte FactionGroup; - public bool FromSocialQueue; - public bool VoiceChatSilenced; - public bool Connected; } struct PartyLFGInfo { + public uint Slot; + public byte MyFlags; + public uint MyRandomSlot; + public byte MyPartialClear; + public float MyGearDiff; + public byte MyStrangerCount; + public byte MyKickVoteCount; + public byte BootCount; + public bool Aborted; + public bool MyFirstReward; + public void Write(WorldPacket data) { data.WriteUInt32(Slot); @@ -1302,44 +1349,60 @@ namespace Game.Networking.Packets data.WriteBit(MyFirstReward); data.FlushBits(); } - - public uint Slot; - public byte MyFlags; - public uint MyRandomSlot; - public byte MyPartialClear; - public float MyGearDiff; - public byte MyStrangerCount; - public byte MyKickVoteCount; - public byte BootCount; - public bool Aborted; - public bool MyFirstReward; } struct PartyLootSettings { + public byte Method; + public ObjectGuid LootMaster; + public byte Threshold; + public void Write(WorldPacket data) { data.WriteUInt8(Method); data.WritePackedGuid(LootMaster); data.WriteUInt8(Threshold); } - - public byte Method; - public ObjectGuid LootMaster; - public byte Threshold; } struct PartyDifficultySettings { + public uint DungeonDifficultyID; + public uint RaidDifficultyID; + public uint LegacyRaidDifficultyID; + public void Write(WorldPacket data) { data.WriteUInt32(DungeonDifficultyID); data.WriteUInt32(RaidDifficultyID); data.WriteUInt32(LegacyRaidDifficultyID); } + } - public uint DungeonDifficultyID; - public uint RaidDifficultyID; - public uint LegacyRaidDifficultyID; + struct ChallengeModeData + { + public int Unknown_1120_1; + public int Unknown_1120_2; + public ulong Unknown_1120_3; + public long Unknown_1120_4; + public ObjectGuid KeystoneOwnerGUID; + public ObjectGuid LeaverGUID; + public bool IsActive; + public bool HasRestrictions; + public bool CanVoteAbandon; + + public void Write(WorldPacket data) + { + data.WriteInt32(Unknown_1120_1); + data.WriteInt32(Unknown_1120_2); + data.WriteUInt64(Unknown_1120_3); + data.WriteInt64(Unknown_1120_4); + data.WritePackedGuid(KeystoneOwnerGUID); + data.WritePackedGuid(LeaverGUID); + data.WriteBit(IsActive); + data.WriteBit(HasRestrictions); + data.WriteBit(CanVoteAbandon); + data.FlushBits(); + } } } \ No newline at end of file diff --git a/Source/Game/Networking/Packets/QueryPackets.cs b/Source/Game/Networking/Packets/QueryPackets.cs index 1805775ea..1f4019a37 100644 --- a/Source/Game/Networking/Packets/QueryPackets.cs +++ b/Source/Game/Networking/Packets/QueryPackets.cs @@ -767,7 +767,7 @@ namespace Game.Networking.Packets public int CreatureDifficultyID; public int WidgetSetID; public int WidgetSetUnitConditionID; - public uint[] Flags = new uint[2]; + public uint[] Flags = new uint[3]; public uint[] ProxyCreatureID = new uint[SharedConst.MaxCreatureKillCredit]; public StringArray Name = new(SharedConst.MaxCreatureNames); public StringArray NameAlt = new(SharedConst.MaxCreatureNames); diff --git a/Source/Game/Networking/Packets/SystemPackets.cs b/Source/Game/Networking/Packets/SystemPackets.cs index 99b895aba..584e7b669 100644 --- a/Source/Game/Networking/Packets/SystemPackets.cs +++ b/Source/Game/Networking/Packets/SystemPackets.cs @@ -29,7 +29,6 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(KioskSessionDurationMinutes); _worldPacket.WriteInt64(RedeemForBalanceAmount); - _worldPacket.WriteUInt32(BpayStorePurchaseTimeout); _worldPacket.WriteUInt32(ClubsPresenceDelay); _worldPacket.WriteUInt32(ClubPresenceUnsubscribeDelay); @@ -57,60 +56,58 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(VoiceEnabled); _worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue); - _worldPacket.WriteBit(BpayStoreEnabled); _worldPacket.WriteBit(BpayStoreAvailable); _worldPacket.WriteBit(BpayStoreDisabledByParentalControls); _worldPacket.WriteBit(ItemRestorationButtonEnabled); - _worldPacket.WriteBit(BrowserEnabled); - _worldPacket.WriteBit(SessionAlert.HasValue); _worldPacket.WriteBit(RAFSystem.Enabled); _worldPacket.WriteBit(RAFSystem.RecruitingEnabled); + _worldPacket.WriteBit(CharUndeleteEnabled); _worldPacket.WriteBit(RestrictedAccount); _worldPacket.WriteBit(CommerceServerEnabled); _worldPacket.WriteBit(TutorialEnabled); - _worldPacket.WriteBit(VeteranTokenRedeemWillKick); _worldPacket.WriteBit(WorldTokenRedeemWillKick); _worldPacket.WriteBit(KioskModeEnabled); _worldPacket.WriteBit(CompetitiveModeEnabled); + _worldPacket.WriteBit(RedeemForBalanceAvailable); _worldPacket.WriteBit(WarModeEnabled); _worldPacket.WriteBit(CommunitiesEnabled); _worldPacket.WriteBit(BnetGroupsEnabled); - _worldPacket.WriteBit(CharacterCommunitiesEnabled); _worldPacket.WriteBit(ClubPresenceAllowSubscribeAll); _worldPacket.WriteBit(VoiceChatParentalDisabled); _worldPacket.WriteBit(VoiceChatParentalMuted); + _worldPacket.WriteBit(QuestSessionEnabled); _worldPacket.WriteBit(IsChatMuted); _worldPacket.WriteBit(ClubFinderEnabled); _worldPacket.WriteBit(CommunityFinderEnabled); _worldPacket.WriteBit(BrowserCrashReporterEnabled); _worldPacket.WriteBit(SpeakForMeAllowed); - _worldPacket.WriteBit(DoesAccountNeedAADCPrompt); _worldPacket.WriteBit(IsAccountOptedInToAADC); + _worldPacket.WriteBit(LfgRequireAuthenticatorEnabled); _worldPacket.WriteBit(ScriptsDisallowedForBeta); _worldPacket.WriteBit(TimerunningEnabled); _worldPacket.WriteBit(WarGamesEnabled); _worldPacket.WriteBit(IsPlayerContentTrackingEnabled); _worldPacket.WriteBit(SellAllJunkEnabled); - _worldPacket.WriteBit(GroupFinderEnabled); _worldPacket.WriteBit(IsPremadeGroupEnabled); + _worldPacket.WriteBit(false); // unused 10.2.7 _worldPacket.WriteBit(GuildEventsEditsEnabled); _worldPacket.WriteBit(GuildTradeSkillsEnabled); - _worldPacket.WriteBits(Unknown1027.GetByteCount(), 7); + _worldPacket.WriteBits(Unknown1027.GetByteCount(), 10); _worldPacket.WriteBit(BNSendWhisperUseV2Services); _worldPacket.WriteBit(BNSendGameDataUseV2Services); _worldPacket.WriteBit(IsAccountCurrencyTransferEnabled); - _worldPacket.WriteBit(false); // unused 11.0.7 + _worldPacket.WriteBit(false); // unused 11.0.7 _worldPacket.WriteBit(LobbyMatchmakerQueueFromMainlineEnabled); _worldPacket.WriteBit(CanSendLobbyMatchmakerPartyCustomizations); _worldPacket.WriteBit(AddonProfilerEnabled); @@ -139,9 +136,7 @@ namespace Game.Networking.Packets } public bool VoiceEnabled; - public bool BrowserEnabled; public bool BpayStoreAvailable; - public bool BpayStoreEnabled; public SessionAlertConfig? SessionAlert; public EuropaTicketConfig? EuropaTicketSystemStatus; public uint CfgRealmID; @@ -149,7 +144,6 @@ namespace Game.Networking.Packets public int CfgRealmRecID; public uint CommercePricePollTimeSeconds; public long RedeemForBalanceAmount; - public uint BpayStorePurchaseTimeout; public uint ClubsPresenceDelay; public uint ClubPresenceUnsubscribeDelay; // Timer for updating club presence when communities ui frame is hidden public uint KioskSessionDurationMinutes; @@ -308,7 +302,6 @@ namespace Game.Networking.Packets public override void Write() { - _worldPacket.WriteBit(BpayStoreEnabled); _worldPacket.WriteBit(BpayStoreAvailable); _worldPacket.WriteBit(BpayStoreDisabledByParentalControls); _worldPacket.WriteBit(CharUndeleteEnabled); @@ -316,8 +309,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(VeteranTokenRedeemWillKick); _worldPacket.WriteBit(WorldTokenRedeemWillKick); _worldPacket.WriteBit(ExpansionPreorderInStore); - _worldPacket.WriteBit(KioskModeEnabled); + _worldPacket.WriteBit(CompetitiveModeEnabled); _worldPacket.WriteBit(BoostEnabled); _worldPacket.WriteBit(TrialBoostEnabled); @@ -325,8 +318,8 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(PaidCharacterTransfersBetweenBnetAccountsEnabled); _worldPacket.WriteBit(LiveRegionCharacterListEnabled); _worldPacket.WriteBit(LiveRegionCharacterCopyEnabled); - _worldPacket.WriteBit(LiveRegionAccountCopyEnabled); + _worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled); _worldPacket.WriteBit(BrowserCrashReporterEnabled); _worldPacket.WriteBit(IsEmployeeAccount); @@ -334,16 +327,16 @@ namespace Game.Networking.Packets _worldPacket.WriteBit(NameReservationOnly); _worldPacket.WriteBit(LaunchDurationETA.HasValue); _worldPacket.WriteBit(TimerunningEnabled); - _worldPacket.WriteBit(ScriptsDisallowedForBeta); + _worldPacket.WriteBit(PlayerIdentityOptionsEnabled); _worldPacket.WriteBit(AccountExportEnabled); _worldPacket.WriteBit(AccountLockedPostExport); _worldPacket.WriteBits(RealmHiddenAlert.GetByteCount() + 1, 11); _worldPacket.WriteBit(BNSendWhisperUseV2Services); - _worldPacket.WriteBit(BNSendGameDataUseV2Services); + _worldPacket.WriteBit(CharacterSelectListModeRealmless); _worldPacket.WriteBit(WowTokenLimitedMode); _worldPacket.WriteBit(false); // unused 11.1.7 @@ -360,7 +353,6 @@ namespace Game.Networking.Packets _worldPacket.WriteInt64(RedeemForBalanceAmount); _worldPacket.WriteInt32(MaxCharactersOnThisRealm); _worldPacket.WriteInt32(LiveRegionCharacterCopySourceRegions.Count); - _worldPacket.WriteUInt32(BpayStorePurchaseTimeout); _worldPacket.WriteInt32(ActiveBoostType); _worldPacket.WriteInt32(TrialBoostType); _worldPacket.WriteInt32(MinimumExpansionLevel); @@ -395,7 +387,6 @@ namespace Game.Networking.Packets public bool BpayStoreAvailable; // NYI public bool BpayStoreDisabledByParentalControls; // NYI public bool CharUndeleteEnabled; - public bool BpayStoreEnabled; // NYI public bool CommerceServerEnabled; // NYI public bool VeteranTokenRedeemWillKick; // NYI public bool WorldTokenRedeemWillKick; // NYI @@ -428,7 +419,6 @@ namespace Game.Networking.Packets public uint CommercePricePollTimeSeconds; // NYI public long RedeemForBalanceAmount; // NYI public int MaxCharactersOnThisRealm; - public uint BpayStorePurchaseTimeout; // NYI public int ActiveBoostType; // NYI public int TrialBoostType; // NYI public int MinimumExpansionLevel; diff --git a/Source/Game/Networking/Packets/TalentPackets.cs b/Source/Game/Networking/Packets/TalentPackets.cs index 620f93e2c..dfc64e939 100644 --- a/Source/Game/Networking/Packets/TalentPackets.cs +++ b/Source/Game/Networking/Packets/TalentPackets.cs @@ -22,12 +22,16 @@ namespace Game.Networking.Packets _worldPacket.WriteUInt32(talentGroupInfo.SpecID); _worldPacket.WriteInt32(talentGroupInfo.TalentIDs.Count); _worldPacket.WriteInt32(talentGroupInfo.PvPTalents.Count); + _worldPacket.WriteInt32(talentGroupInfo.GlyphIDs.Count); foreach (var talentID in talentGroupInfo.TalentIDs) _worldPacket.WriteUInt16(talentID); foreach (PvPTalent talent in talentGroupInfo.PvPTalents) talent.Write(_worldPacket); + + foreach (uint talent in talentGroupInfo.GlyphIDs) + _worldPacket.WriteUInt16((ushort)talent); } } @@ -38,6 +42,7 @@ namespace Game.Networking.Packets public uint SpecID; public List TalentIDs = new(); public List PvPTalents = new(); + public List GlyphIDs = new(); } public class TalentInfoUpdate @@ -183,6 +188,9 @@ namespace Game.Networking.Packets struct GlyphBinding { + uint SpellID; + ushort GlyphID; + public GlyphBinding(uint spellId, ushort glyphId) { SpellID = spellId; @@ -194,8 +202,66 @@ namespace Game.Networking.Packets data.WriteUInt32(SpellID); data.WriteUInt16(GlyphID); } + } - uint SpellID; - ushort GlyphID; + public struct ClassicTalentEntry + { + public int TalentID; + public int Rank; + + public void Write(WorldPacket data) + { + data.WriteInt32(TalentID); + data.WriteInt32(Rank); + } + } + + public class ClassicTalentGroupInfo + { + public byte NumTalents; + public List Talents = new(); + public byte NumGlyphs; + public List GlyphIDs = new(); + public sbyte Role; + public int PrimarySpecialization; + + public void Write(WorldPacket data) + { + data.WriteUInt8(NumTalents); + data.WriteInt32(Talents.Count); + + data.WriteUInt8(NumGlyphs); + data.WriteInt32(GlyphIDs.Count); + + data.WriteInt8(Role); + data.WriteInt32(PrimarySpecialization); + + foreach (ClassicTalentEntry talentEntry in Talents) + talentEntry.Write(data); + + foreach (ushort id in GlyphIDs) + data.WriteUInt16(id); + } + } + + public class ClassicTalentInfoUpdate + { + public int UnspentTalentPoints; + public byte ActiveGroup; + public bool IsPetTalents; + public List Talents = new(); + + public void Write(WorldPacket data) + { + data.WriteInt32(UnspentTalentPoints); + data.WriteUInt8(ActiveGroup); + data.WriteInt32(Talents.Count); + + foreach (ClassicTalentGroupInfo talents in Talents) + talents.Write(data); + + data.WriteBit(IsPetTalents); + data.FlushBits(); + } } } diff --git a/Source/Game/Networking/Packets/TraitPackets.cs b/Source/Game/Networking/Packets/TraitPackets.cs index 04a4f0c07..f921af854 100644 --- a/Source/Game/Networking/Packets/TraitPackets.cs +++ b/Source/Game/Networking/Packets/TraitPackets.cs @@ -121,6 +121,7 @@ namespace Game.Networking.Packets public int TraitNodeEntryID; public int Rank; public int GrantedRanks; + public int BonusRanks; public TraitEntryPacket() { } public TraitEntryPacket(TraitEntry ufEntry) @@ -137,6 +138,7 @@ namespace Game.Networking.Packets TraitNodeEntryID = data.ReadInt32(); Rank = data.ReadInt32(); GrantedRanks = data.ReadInt32(); + BonusRanks = data.ReadInt32(); } public void Write(WorldPacket data) @@ -145,6 +147,7 @@ namespace Game.Networking.Packets data.WriteInt32(TraitNodeEntryID); data.WriteInt32(Rank); data.WriteInt32(GrantedRanks); + data.WriteInt32(BonusRanks); } } diff --git a/Source/Game/Networking/Packets/VoidStoragePackets.cs b/Source/Game/Networking/Packets/VoidStoragePackets.cs deleted file mode 100644 index 15cb959c1..000000000 --- a/Source/Game/Networking/Packets/VoidStoragePackets.cs +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (c) CypherCore All rights reserved. -// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information. - -using Framework.Constants; -using Game.Entities; -using System.Collections.Generic; - -namespace Game.Networking.Packets -{ - class VoidTransferResult : ServerPacket - { - public VoidTransferResult(VoidTransferError result) : base(ServerOpcodes.VoidTransferResult, ConnectionType.Instance) - { - Result = result; - } - - public override void Write() - { - _worldPacket.WriteInt32((int)Result); - } - - public VoidTransferError Result; - } - - class UnlockVoidStorage : ClientPacket - { - public UnlockVoidStorage(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Npc = _worldPacket.ReadPackedGuid(); - } - - public ObjectGuid Npc; - } - - class QueryVoidStorage : ClientPacket - { - public QueryVoidStorage(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Npc = _worldPacket.ReadPackedGuid(); - } - - public ObjectGuid Npc; - } - - class VoidStorageFailed : ServerPacket - { - public VoidStorageFailed() : base(ServerOpcodes.VoidStorageFailed, ConnectionType.Instance) { } - - public override void Write() - { - _worldPacket.WriteUInt8(Reason); - } - - public byte Reason = 0; - } - - class VoidStorageContents : ServerPacket - { - public VoidStorageContents() : base(ServerOpcodes.VoidStorageContents, ConnectionType.Instance) { } - - public override void Write() - { - _worldPacket.WriteBits(Items.Count, 8); - _worldPacket.FlushBits(); - - foreach (VoidItem voidItem in Items) - voidItem.Write(_worldPacket); - } - - public List Items = new(); - } - - class VoidStorageTransfer : ClientPacket - { - public VoidStorageTransfer(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Npc = _worldPacket.ReadPackedGuid(); - var DepositCount = _worldPacket.ReadInt32(); - var WithdrawalCount = _worldPacket.ReadInt32(); - - for (uint i = 0; i < DepositCount; ++i) - Deposits[i] = _worldPacket.ReadPackedGuid(); - - for (uint i = 0; i < WithdrawalCount; ++i) - Withdrawals[i] = _worldPacket.ReadPackedGuid(); - } - - public ObjectGuid[] Withdrawals = new ObjectGuid[(int)SharedConst.VoidStorageMaxWithdraw]; - public ObjectGuid[] Deposits = new ObjectGuid[(int)SharedConst.VoidStorageMaxDeposit]; - public ObjectGuid Npc; - } - - class VoidStorageTransferChanges : ServerPacket - { - public VoidStorageTransferChanges() : base(ServerOpcodes.VoidStorageTransferChanges, ConnectionType.Instance) { } - - public override void Write() - { - _worldPacket.WriteBits(AddedItems.Count, 4); - _worldPacket.WriteBits(RemovedItems.Count, 4); - _worldPacket.FlushBits(); - - foreach (VoidItem addedItem in AddedItems) - addedItem.Write(_worldPacket); - - foreach (ObjectGuid removedItem in RemovedItems) - _worldPacket.WritePackedGuid(removedItem); - } - - public List RemovedItems = new(); - public List AddedItems = new(); - } - - class SwapVoidItem : ClientPacket - { - public SwapVoidItem(WorldPacket packet) : base(packet) { } - - public override void Read() - { - Npc = _worldPacket.ReadPackedGuid(); - VoidItemGuid = _worldPacket.ReadPackedGuid(); - DstSlot = _worldPacket.ReadUInt32(); - } - - public ObjectGuid Npc; - public ObjectGuid VoidItemGuid; - public uint DstSlot; - } - - class VoidItemSwapResponse : ServerPacket - { - public VoidItemSwapResponse() : base(ServerOpcodes.VoidItemSwapResponse, ConnectionType.Instance) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(VoidItemA); - _worldPacket.WriteUInt32(VoidItemSlotA); - _worldPacket.WritePackedGuid(VoidItemB); - _worldPacket.WriteUInt32(VoidItemSlotB); - } - - public ObjectGuid VoidItemA; - public ObjectGuid VoidItemB; - public uint VoidItemSlotA; - public uint VoidItemSlotB; - } - - struct VoidItem - { - public void Write(WorldPacket data) - { - data .WritePackedGuid(Guid); - data .WritePackedGuid(Creator); - data .WriteUInt32(Slot); - Item.Write(data); - } - - public ObjectGuid Guid; - public ObjectGuid Creator; - public uint Slot; - public ItemInstance Item; - } -} diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 12c3237e2..0b4a8fde7 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -4471,6 +4471,7 @@ namespace Game.Spells unitCaster.ClearChannelObjects(); unitCaster.SetChannelSpellId(0); unitCaster.SetChannelVisual(new SpellCastVisualField()); + unitCaster.SetChannelSpellData(0, 0); unitCaster.SetSpellEmpowerStage(-1); } @@ -4550,6 +4551,7 @@ namespace Game.Spells unitCaster.SetChannelSpellId(m_spellInfo.Id); unitCaster.SetChannelVisual(m_SpellVisual); + unitCaster.SetChannelSpellData(GameTime.GetGameTimeMS(), duration); void setImmunitiesAndHealPrediction(ref SpellChannelStartInterruptImmunities? interruptImmunities, ref SpellTargetedHealPrediction? healPrediction) { diff --git a/Source/Game/Spells/SpellHistory.cs b/Source/Game/Spells/SpellHistory.cs index 9bc6c054a..0e1a2c2fe 100644 --- a/Source/Game/Spells/SpellHistory.cs +++ b/Source/Game/Spells/SpellHistory.cs @@ -992,9 +992,9 @@ namespace Game.Spells if (chargeCategoryEntry == null) return 0; - uint charges = chargeCategoryEntry.MaxCharges; - charges += (uint)_owner.GetTotalAuraModifierByMiscValue(AuraType.ModMaxCharges, (int)chargeCategoryId); - return (int)charges; + int charges = chargeCategoryEntry.MaxCharges; + charges += _owner.GetTotalAuraModifierByMiscValue(AuraType.ModMaxCharges, (int)chargeCategoryId); + return charges; } public int GetChargeRecoveryTime(uint chargeCategoryId) diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index 7ad68ec66..9836ada55 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -4898,6 +4898,10 @@ namespace Game.Spells new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 339 SPELL_EFFECT_UI_ACTION new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 340 SPELL_EFFECT_340 new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 341 SPELL_EFFECT_LEARN_WARBAND_SCENE + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 342 SPELL_EFFECT_342 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 343 SPELL_EFFECT_343 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 344 SPELL_EFFECT_344 + new StaticData(SpellEffectImplicitTargetTypes.None, SpellTargetObjectTypes.None), // 345 SPELL_EFFECT_ASSIST_ACTION }; #region Fields diff --git a/Source/Game/Spells/SpellManager.cs b/Source/Game/Spells/SpellManager.cs index 6ac1ab9cf..6695ee945 100644 --- a/Source/Game/Spells/SpellManager.cs +++ b/Source/Game/Spells/SpellManager.cs @@ -3716,6 +3716,15 @@ namespace Game.Entities }); }); + // Summon Faol in Tirisfal + ApplySpellFix([202112], spellInfo => + { + ApplySpellEffectFix(spellInfo, 0, spellEffectInfo => + { + spellEffectInfo.TargetA = new SpellImplicitTargetInfo(Targets.DestDb); + }); + }); + // // VIOLET HOLD SPELLS // @@ -4385,7 +4394,7 @@ namespace Game.Entities }); // Flame Spout - ApplySpellFix([ 114685 ], spellInfo => + ApplySpellFix([114685], spellInfo => { spellInfo.AttributesEx |= SpellAttr1.NoThreat; spellInfo.AttributesEx8 |= SpellAttr8.CanAttackImmunePC; @@ -4692,17 +4701,23 @@ namespace Game.Entities }); // Keg Smash - ApplySpellFix([ 121253 ], spellInfo => + ApplySpellFix([121253], spellInfo => { spellInfo._LoadSqrtTargetLimit(5, 0, null, 6, null, null); }); // Odyn's Fury - ApplySpellFix([ 385060, 385061, 385062 ], spellInfo => + ApplySpellFix([385060, 385061, 385062], spellInfo => { spellInfo._LoadSqrtTargetLimit(5, 0, 385059, 5, null, null); }); + // Flamestrike + ApplySpellFix([ 2120 ], spellInfo => + { + spellInfo._LoadSqrtTargetLimit(8, 0, null, 2, null, null); + }); + Log.outInfo(LogFilter.ServerLoading, $"Loaded SpellInfo target caps in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); }