From 0a3dfaba37540d4e753e34ae98e3f10292a81891 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 19 Feb 2018 10:32:16 -0500 Subject: [PATCH] Updated to 7.3.5.25996 (Db2 files not updated) --- .../Constants/Authentication/AuthConst.cs | 88 +- Source/Framework/Constants/ItemConst.cs | 24 +- Source/Framework/Constants/MapConst.cs | 2 + Source/Framework/Constants/Network/Opcodes.cs | 1523 +++++++++-------- Source/Framework/Constants/PlayerConst.cs | 16 +- Source/Framework/Constants/SharedConst.cs | 10 +- .../Framework/Constants/Spells/SpellConst.cs | 13 + .../Constants/Update/UpdateFieldFlags.cs | 37 +- .../Constants/Update/UpdateFields.cs | 349 ++-- .../Database/Databases/CharacterDatabase.cs | 20 +- Source/Framework/Logging/Appender.cs | 2 +- Source/Game/Entities/Creature/Gossip.cs | 3 + Source/Game/Entities/Player/Player.DB.cs | 93 +- Source/Game/Entities/Player/Player.Items.cs | 109 +- Source/Game/Entities/Player/Player.Quest.cs | 10 +- Source/Game/Entities/Player/Player.Spells.cs | 36 +- Source/Game/Entities/Player/Player.cs | 42 +- Source/Game/Entities/Transport.cs | 4 +- Source/Game/Globals/ObjectManager.cs | 104 +- Source/Game/Guilds/GuildManager.cs | 4 +- Source/Game/Handlers/AuthenticationHandler.cs | 3 +- Source/Game/Handlers/CharacterHandler.cs | 43 +- Source/Game/Handlers/QueryHandler.cs | 1 + Source/Game/Handlers/SpellHandler.cs | 17 +- Source/Game/Handlers/VoidStorageHandler.cs | 3 +- .../Network/Packets/AuthenticationPackets.cs | 8 - .../Game/Network/Packets/CharacterPackets.cs | 147 +- Source/Game/Network/Packets/GuildPackets.cs | 4 +- .../Game/Network/Packets/InstancePackets.cs | 3 + Source/Game/Network/Packets/ItemPackets.cs | 7 + Source/Game/Network/Packets/NPCPackets.cs | 2 + Source/Game/Network/Packets/QueryPackets.cs | 4 + Source/Game/Network/Packets/QuestPackets.cs | 15 +- Source/Game/Network/Packets/SpellPackets.cs | 9 +- Source/Game/Network/Packets/TicketPackets.cs | 4 + Source/Game/Network/Packets/WhoPackets.cs | 4 +- Source/Game/Network/WorldSocket.cs | 17 +- Source/Game/Network/WorldSocketManager.cs | 9 - Source/Game/Quest/Quest.cs | 128 +- Source/Game/Server/WorldSession.cs | 5 +- Source/Game/Spells/Spell.cs | 2 +- .../IcecrownCitadel/IcecrownCitadel.cs | 6 +- Source/WorldServer/WorldServer.conf.dist | 79 +- 43 files changed, 1584 insertions(+), 1425 deletions(-) diff --git a/Source/Framework/Constants/Authentication/AuthConst.cs b/Source/Framework/Constants/Authentication/AuthConst.cs index 4a9803ce1..76f02c6c5 100644 --- a/Source/Framework/Constants/Authentication/AuthConst.cs +++ b/Source/Framework/Constants/Authentication/AuthConst.cs @@ -75,50 +75,54 @@ namespace Framework.Constants CharCreateTimeout = 48, CharCreateThrottle = 49, - CharDeleteInProgress = 50, - CharDeleteSuccess = 51, - CharDeleteFailed = 52, - CharDeleteFailedLockedForTransfer = 53, - CharDeleteFailedGuildLeader = 54, - CharDeleteFailedArenaCaptain = 55, - CharDeleteFailedHasHeirloomOrMail = 56, - CharDeleteFailedUpgradeInProgress = 57, - CharDeleteFailedHasWowToken = 58, - CharDeleteFailedVasTransactionInProgress = 59, + CharCreateAlliedRaceAchievement = 50, + CharCreateLevelRequirementDemonHunter = 51, - CharLoginInProgress = 60, - CharLoginSuccess = 61, - CharLoginNoWorld = 62, - CharLoginDuplicateCharacter = 63, - CharLoginNoInstances = 64, - CharLoginFailed = 65, - CharLoginDisabled = 66, - CharLoginNoCharacter = 67, - CharLoginLockedForTransfer = 68, - CharLoginLockedByBilling = 69, - CharLoginLockedByMobileAh = 70, - CharLoginTemporaryGmLock = 71, - CharLoginLockedByCharacterUpgrade = 72, - CharLoginLockedByRevokedCharacterUpgrade = 73, - CharLoginLockedByRevokedVasTransaction = 74, + CharDeleteInProgress = 52, + CharDeleteSuccess = 53, + CharDeleteFailed = 54, + CharDeleteFailedLockedForTransfer = 55, + CharDeleteFailedGuildLeader = 56, + CharDeleteFailedArenaCaptain = 57, + CharDeleteFailedHasHeirloomOrMail = 58, + CharDeleteFailedUpgradeInProgress = 59, + CharDeleteFailedHasWowToken = 60, + CharDeleteFailedVasTransactionInProgress = 61, - CharNameSuccess = 75, - CharNameFailure = 76, - CharNameNoName = 77, - CharNameTooShort = 78, - CharNameTooLong = 79, - CharNameInvalidCharacter = 80, - CharNameMixedLanguages = 81, - CharNameProfane = 82, - CharNameReserved = 83, - CharNameInvalidApostrophe = 84, - CharNameMultipleApostrophes = 85, - CharNameThreeConsecutive = 86, - CharNameInvalidSpace = 87, - CharNameConsecutiveSpaces = 88, - CharNameRussianConsecutiveSilentCharacters = 89, - CharNameRussianSilentCharacterAtBeginningOrEnd = 90, - CharNameDeclensionDoesntMatchBaseName = 91 + CharLoginInProgress = 62, + CharLoginSuccess = 63, + CharLoginNoWorld = 64, + CharLoginDuplicateCharacter = 65, + CharLoginNoInstances = 66, + CharLoginFailed = 67, + CharLoginDisabled = 68, + CharLoginNoCharacter = 69, + CharLoginLockedForTransfer = 70, + CharLoginLockedByBilling = 71, + CharLoginLockedByMobileAh = 72, + CharLoginTemporaryGmLock = 73, + CharLoginLockedByCharacterUpgrade = 74, + CharLoginLockedByRevokedCharacterUpgrade = 75, + CharLoginLockedByRevokedVasTransaction = 76, + CharLoginLockedByRestriction = 77, + + CharNameSuccess = 78, + CharNameFailure = 79, + CharNameNoName = 80, + CharNameTooShort = 81, + CharNameTooLong = 82, + CharNameInvalidCharacter = 83, + CharNameMixedLanguages = 84, + CharNameProfane = 85, + CharNameReserved = 86, + CharNameInvalidApostrophe = 87, + CharNameMultipleApostrophes = 88, + CharNameThreeConsecutive = 89, + CharNameInvalidSpace = 90, + CharNameConsecutiveSpaces = 91, + CharNameRussianConsecutiveSilentCharacters = 92, + CharNameRussianSilentCharacterAtBeginningOrEnd = 93, + CharNameDeclensionDoesntMatchBaseName = 94 } public enum CharacterUndeleteResult diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index 463d996a8..277fe4737 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -108,21 +108,22 @@ namespace Framework.Constants public const byte BagStart = 19; public const byte BagEnd = 23; public const byte ItemStart = 23; - public const byte ItemEnd = 39; + public const byte ItemEnd = 47; - public const byte BankItemStart = 39; - public const byte BankItemEnd = 67; - public const byte BankBagStart = 67; - public const byte BankBagEnd = 74; + public const byte BankItemStart = 47; + public const byte BankItemEnd = 75; + public const byte BankBagStart = 75; + public const byte BankBagEnd = 82; - public const byte BuyBackStart = 74; - public const byte BuyBackEnd = 86; - public const byte ReagentStart = 87; - public const byte ReagentEnd = 184; - public const byte ChildEquipmentStart = 184; - public const byte ChildEquipmentEnd = 187; + public const byte BuyBackStart = 82; + public const byte BuyBackEnd = 94; + public const byte ReagentStart = 94; + public const byte ReagentEnd = 192; + public const byte ChildEquipmentStart = 192; + public const byte ChildEquipmentEnd = 195; public const byte Bag0 = 255; + public const byte DefaultSize = 16; } public struct EquipmentSlot @@ -975,6 +976,7 @@ namespace Framework.Constants CantUseItem = 98, // You can't use that item. CantBeObliterated = 99, // You can't obliterate that item GuildBankConjuredItem = 100,// You cannot store conjured items in the guild bank + CantDoThatRightNow = 101,// You can't do that right now. } public enum BuyResult diff --git a/Source/Framework/Constants/MapConst.cs b/Source/Framework/Constants/MapConst.cs index 82d23b844..0e2adaa70 100644 --- a/Source/Framework/Constants/MapConst.cs +++ b/Source/Framework/Constants/MapConst.cs @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +using System; namespace Framework.Constants { @@ -99,6 +100,7 @@ namespace Framework.Constants RespawnDelay } + [Flags] public enum GridMapTypeMask { None = 0x00, diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index 4c5bbe597..8dc307c83 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -25,24 +25,24 @@ namespace Framework.Constants AcceptWargameInvite = 0x35e0, ActivateTaxi = 0x34ae, AddonList = 0x35d8, - AddBattlenetFriend = 0x365c, - AddFriend = 0x36d1, - AddIgnore = 0x36d5, - AddToy = 0x3287, - AdventureJournalOpenQuest = 0x31f7, - AdventureJournalStartQuest = 0x332b, + AddBattlenetFriend = 0x365a, + AddFriend = 0x36cf, + AddIgnore = 0x36d3, + AddToy = 0x328b, + AdventureJournalOpenQuest = 0x31f9, + AdventureJournalStartQuest = 0x332e, AlterAppearance = 0x34f9, AreaSpiritHealerQuery = 0x34b3, AreaSpiritHealerQueue = 0x34b4, - AreaTrigger = 0x31cc, + AreaTrigger = 0x31cd, ArtifactAddPower = 0x31a5, ArtifactAddRelicTalent = 0x31a8, ArtifactAttunePreviewRelic = 0x31a9, ArtifactAttuneSocketedRelic = 0x31aa, ArtifactSetAppearance = 0x31a7, - AssignEquipmentSetSpec = 0x31fe, - AttackStop = 0x3249, - AttackSwing = 0x3248, + AssignEquipmentSetSpec = 0x3200, + AttackStop = 0x324d, + AttackSwing = 0x324c, AuctionHelloRequest = 0x34cf, AuctionListBidderItems = 0x34d5, AuctionListItems = 0x34d2, @@ -65,90 +65,91 @@ namespace Framework.Constants BattlefieldLeave = 0x3171, BattlefieldList = 0x317d, BattlefieldPort = 0x3529, - BattlemasterHello = 0x329d, + BattlemasterHello = 0x32a1, BattlemasterJoin = 0x3524, BattlemasterJoinArena = 0x3525, BattlemasterJoinBrawl = 0x3527, BattlemasterJoinSkirmish = 0x3526, - BattlenetChallengeResponse = 0x36d4, - BattlenetRequest = 0x36f8, - BattlenetRequestRealmListTicket = 0x36f9, - BattlePayAckFailedResponse = 0x36cc, - BattlePayConfirmPurchaseResponse = 0x36cb, - BattlePayDistributionAssignToTarget = 0x36c2, - BattlePayGetProductList = 0x36bc, - BattlePayGetPurchaseList = 0x36bd, - BattlePayQueryClassTrialBoostResult = 0x36c5, - BattlePayRequestCharacterBoostUnrevoke = 0x36c3, - BattlePayRequestCurrentVasTransferQueues = 0x370a, - BattlePayRequestPriceInfo = 0x3709, - BattlePayRequestVasCharacterQueueTime = 0x370b, - BattlePayStartPurchase = 0x36f4, - BattlePayStartVasPurchase = 0x36f5, - BattlePayTrialBoostCharacter = 0x36c4, - BattlePayValidateBnetVasTransfer = 0x370c, + BattlenetChallengeResponse = 0x36d2, + BattlenetRequest = 0x36f6, + BattlenetRequestRealmListTicket = 0x36f7, + BattlePayAckFailedResponse = 0x36ca, + BattlePayConfirmPurchaseResponse = 0x36c9, + BattlePayDistributionAssignToTarget = 0x36c0, + BattlePayGetProductList = 0x36ba, + BattlePayGetPurchaseList = 0x36bb, + BattlePayQueryClassTrialBoostResult = 0x36c3, + BattlePayRequestCharacterBoostUnrevoke = 0x36c1, + BattlePayRequestCurrentVasTransferQueues = 0x3708, + BattlePayRequestPriceInfo = 0x3707, + BattlePayRequestVasCharacterQueueTime = 0x3709, + BattlePayStartPurchase = 0x36f2, + BattlePayStartVasPurchase = 0x36f3, + BattlePayTrialBoostCharacter = 0x36c2, + BattlePayValidateBnetVasTransfer = 0x370a, BattlePetClearFanfare = 0x312c, - BattlePetDeletePet = 0x3626, - BattlePetDeletePetCheat = 0x3627, - BattlePetModifyName = 0x3629, - BattlePetRequestJournal = 0x3625, - BattlePetRequestJournalLock = 0x3624, - BattlePetSetBattleSlot = 0x362d, - BattlePetSetFlags = 0x3631, - BattlePetSummon = 0x362a, - BattlePetUpdateNotify = 0x31d5, + BattlePetDeletePet = 0x3624, + BattlePetDeletePetCheat = 0x3625, + BattlePetModifyName = 0x3627, + BattlePetRequestJournal = 0x3623, + BattlePetRequestJournalLock = 0x3622, + BattlePetSetBattleSlot = 0x362b, + BattlePetSetFlags = 0x362f, + BattlePetSummon = 0x3628, + BattlePetUpdateDisplayNotify = 0x31d7, + BattlePetUpdateNotify = 0x31d6, BeginTrade = 0x3157, BinderActivate = 0x34b5, BlackMarketBidOnItem = 0x3531, BlackMarketOpen = 0x352f, BlackMarketRequestItems = 0x3530, - BugReport = 0x3688, + BugReport = 0x3686, BusyTrade = 0x3158, BuyBackItem = 0x34a7, BuyBankSlot = 0x34b7, BuyItem = 0x34a6, BuyReagentBank = 0x34b8, - BuyWowTokenConfirm = 0x36ed, - BuyWowTokenStart = 0x36ec, - CageBattlePet = 0x31e6, - CalendarAddEvent = 0x367f, - CalendarComplain = 0x367b, - CalendarCopyEvent = 0x367a, - CalendarEventInvite = 0x3674, - CalendarEventModeratorStatus = 0x3678, - CalendarEventRsvp = 0x3676, - CalendarEventSignUp = 0x367d, - CalendarEventStatus = 0x3677, - CalendarGet = 0x3671, - CalendarGetEvent = 0x3672, - CalendarGetNumPending = 0x367c, - CalendarGuildFilter = 0x3673, - CalendarRemoveEvent = 0x3679, - CalendarRemoveInvite = 0x3675, - CalendarUpdateEvent = 0x3680, + BuyWowTokenConfirm = 0x36eb, + BuyWowTokenStart = 0x36ea, + CageBattlePet = 0x31e8, + CalendarAddEvent = 0x367d, + CalendarComplain = 0x3679, + CalendarCopyEvent = 0x3678, + CalendarEventInvite = 0x3672, + CalendarEventModeratorStatus = 0x3676, + CalendarEventRsvp = 0x3674, + CalendarEventSignUp = 0x367b, + CalendarEventStatus = 0x3675, + CalendarGet = 0x366f, + CalendarGetEvent = 0x3670, + CalendarGetNumPending = 0x367a, + CalendarGuildFilter = 0x3671, + CalendarRemoveEvent = 0x3677, + CalendarRemoveInvite = 0x3673, + CalendarUpdateEvent = 0x367e, CancelAura = 0x31ac, CancelAutoRepeatSpell = 0x34eb, - CancelCast = 0x328d, - CancelChannelling = 0x3258, - CancelGrowthAura = 0x325d, - CancelMasterLootRoll = 0x3206, + CancelCast = 0x3291, + CancelChannelling = 0x325c, + CancelGrowthAura = 0x3261, + CancelMasterLootRoll = 0x3208, CancelModSpeedNoControlAuras = 0x31ab, - CancelMountAura = 0x326e, + CancelMountAura = 0x3272, CancelQueuedSpell = 0x317e, CancelTempEnchantment = 0x34f6, CancelTrade = 0x315c, - CanDuel = 0x3664, - CanRedeemWowTokenForBalance = 0x3708, - CastSpell = 0x328a, + CanDuel = 0x3662, + CanRedeemWowTokenForBalance = 0x3706, + CastSpell = 0x328e, ChallengeModeRequestLeaders = 0x308f, ChallengeModeRequestMapStats = 0x308e, - ChangeBagSlotFlag = 0x330e, - ChangeMonumentAppearance = 0x32f0, - ChangeSubGroup = 0x364e, - CharacterRenameRequest = 0x36c0, - CharCustomize = 0x3690, - CharDelete = 0x369d, - CharRaceOrFactionChange = 0x3696, + ChangeBagSlotFlag = 0x3312, + ChangeMonumentAppearance = 0x32f4, + ChangeSubGroup = 0x364c, + CharacterRenameRequest = 0x36be, + CharCustomize = 0x368e, + CharDelete = 0x369b, + CharRaceOrFactionChange = 0x3694, ChatAddonMessageChannel = 0x37d0, ChatAddonMessageGuild = 0x37d4, ChatAddonMessageInstanceChat = 0x37f3, @@ -193,14 +194,14 @@ namespace Framework.Constants ChatReportFiltered = 0x37cc, ChatReportIgnored = 0x37cb, ChatUnregisterAllAddonPrefixes = 0x37ce, - CheckRafEmailEnabled = 0x36cd, - CheckWowTokenVeteranEligibility = 0x36eb, - ChoiceResponse = 0x328f, + CheckRafEmailEnabled = 0x36cb, + CheckWowTokenVeteranEligibility = 0x36e9, + ChoiceResponse = 0x3293, ClearRaidMarker = 0x31a1, ClearTradeItem = 0x315e, ClientPortGraveyard = 0x352b, CloseInteraction = 0x3496, - CollectionItemSetFavorite = 0x3634, + CollectionItemSetFavorite = 0x3632, CommentatorEnable = 0x35f0, CommentatorEnterInstance = 0x35f4, CommentatorExitInstance = 0x35f5, @@ -208,87 +209,87 @@ namespace Framework.Constants CommentatorGetPlayerCooldowns = 0x35f3, CommentatorGetPlayerInfo = 0x35f2, CommentatorStartWargame = 0x35ef, - Complaint = 0x366e, + Complaint = 0x366c, CompleteCinematic = 0x3549, CompleteMovie = 0x34e1, ConfirmArtifactRespec = 0x31a6, - ConfirmRespecWipe = 0x3200, + ConfirmRespecWipe = 0x3202, ConnectToFailed = 0x35d4, ContributionContribute = 0x3558, ContributionGetState = 0x3559, - ConvertConsumptionTime = 0x36fb, - ConvertRaid = 0x3650, - CreateCharacter = 0x3645, - CreateShipment = 0x32dc, + ConvertConsumptionTime = 0x36f9, + ConvertRaid = 0x364e, + CreateCharacter = 0x3643, + CreateShipment = 0x32e0, DbQueryBulk = 0x35e4, DeclineGuildInvites = 0x3522, DeclinePetition = 0x3538, DeleteEquipmentSet = 0x3510, - DelFriend = 0x36d2, - DelIgnore = 0x36d6, - DepositReagentBank = 0x3317, - DestroyItem = 0x3281, - DfBootPlayerVote = 0x3617, - DfGetJoinStatus = 0x3615, - DfGetSystemInfo = 0x3614, + DelFriend = 0x36d0, + DelIgnore = 0x36d4, + DepositReagentBank = 0x331b, + DestroyItem = 0x3285, + DfBootPlayerVote = 0x3615, + DfGetJoinStatus = 0x3613, + DfGetSystemInfo = 0x3612, DfJoin = 0x3608, - DfLeave = 0x3613, + DfLeave = 0x3611, DfProposalResponse = 0x3607, - DfReadyCheckResponse = 0x361a, - DfSetRoles = 0x3616, - DfTeleport = 0x3618, + DfReadyCheckResponse = 0x3618, + DfSetRoles = 0x3614, + DfTeleport = 0x3616, DiscardedTimeSyncAcks = 0x3a3c, DismissCritter = 0x34ff, - DoMasterLootRoll = 0x3205, - DoReadyCheck = 0x3635, + DoMasterLootRoll = 0x3207, + DoReadyCheck = 0x3633, DuelResponse = 0x34e6, - EjectPassenger = 0x322e, + EjectPassenger = 0x3230, Emote = 0x3545, EnableEncryptionAck = 0x3767, EnableNagle = 0x376b, EnableTaxiNode = 0x34ac, - EngineSurvey = 0x36e5, + EngineSurvey = 0x36e3, EnumCharacters = 0x35e8, - EnumCharactersDeletedByClient = 0x36df, + EnumCharactersDeletedByClient = 0x36dd, FarSight = 0x34ec, GameObjReportUse = 0x34f3, GameObjUse = 0x34f2, - GarrisonAssignFollowerToBuilding = 0x32c7, - GarrisonCancelConstruction = 0x32b8, - GarrisonCheckUpgradeable = 0x330a, - GarrisonCompleteMission = 0x32fd, - GarrisonGenerateRecruits = 0x32ca, - GarrisonGetBuildingLandmarks = 0x32d8, - GarrisonGetMissionReward = 0x3331, - GarrisonMissionBonusRoll = 0x32ff, - GarrisonPurchaseBuilding = 0x32b4, - GarrisonRecruitFollower = 0x32cc, - GarrisonRemoveFollower = 0x32f4, - GarrisonRemoveFollowerFromBuilding = 0x32c8, - GarrisonRenameFollower = 0x32c9, - GarrisonRequestBlueprintAndSpecializationData = 0x32b3, - GarrisonRequestClassSpecCategoryInfo = 0x32d1, - GarrisonRequestLandingPageShipmentInfo = 0x32db, - GarrisonRequestShipmentInfo = 0x32da, - GarrisonResearchTalent = 0x32cd, - GarrisonSetBuildingActive = 0x32b5, - GarrisonSetFollowerFavorite = 0x32c5, - GarrisonSetFollowerInactive = 0x32c1, - GarrisonSetRecruitmentPreferences = 0x32cb, - GarrisonStartMission = 0x32fc, - GarrisonSwapBuildings = 0x32b9, + GarrisonAssignFollowerToBuilding = 0x32cb, + GarrisonCancelConstruction = 0x32bc, + GarrisonCheckUpgradeable = 0x330e, + GarrisonCompleteMission = 0x3301, + GarrisonGenerateRecruits = 0x32ce, + GarrisonGetBuildingLandmarks = 0x32dc, + GarrisonGetMissionReward = 0x3334, + GarrisonMissionBonusRoll = 0x3303, + GarrisonPurchaseBuilding = 0x32b8, + GarrisonRecruitFollower = 0x32d0, + GarrisonRemoveFollower = 0x32f8, + GarrisonRemoveFollowerFromBuilding = 0x32cc, + GarrisonRenameFollower = 0x32cd, + GarrisonRequestBlueprintAndSpecializationData = 0x32b7, + GarrisonRequestClassSpecCategoryInfo = 0x32d5, + GarrisonRequestLandingPageShipmentInfo = 0x32df, + GarrisonRequestShipmentInfo = 0x32de, + GarrisonResearchTalent = 0x32d1, + GarrisonSetBuildingActive = 0x32b9, + GarrisonSetFollowerFavorite = 0x32c9, + GarrisonSetFollowerInactive = 0x32c5, + GarrisonSetRecruitmentPreferences = 0x32cf, + GarrisonStartMission = 0x3300, + GarrisonSwapBuildings = 0x32bd, GenerateRandomCharacterName = 0x35e7, - GetChallengeModeRewards = 0x3685, - GetGarrisonInfo = 0x32ae, + GetChallengeModeRewards = 0x3683, + GetGarrisonInfo = 0x32b2, GetItemPurchaseData = 0x3533, - GetMirrorImageData = 0x3285, + GetMirrorImageData = 0x3289, GetPvpOptionsEnabled = 0x35ee, - GetRemainingGameTime = 0x36ee, - GetTrophyList = 0x32ed, - GetUndeleteCharacterCooldownStatus = 0x36e1, - GmTicketAcknowledgeSurvey = 0x3694, - GmTicketGetCaseStatus = 0x3693, - GmTicketGetSystemStatus = 0x3692, + GetRemainingGameTime = 0x36ec, + GetTrophyList = 0x32f1, + GetUndeleteCharacterCooldownStatus = 0x36df, + GmTicketAcknowledgeSurvey = 0x3692, + GmTicketGetCaseStatus = 0x3691, + GmTicketGetSystemStatus = 0x3690, GossipSelectOption = 0x3497, GrantLevel = 0x34fb, GuildAddBattlenetFriend = 0x308d, @@ -330,7 +331,7 @@ namespace Framework.Constants GuildReplaceGuildMaster = 0x3088, GuildSetAchievementTracking = 0x306f, GuildSetFocusedAchievement = 0x3070, - GuildSetGuildMaster = 0x36c7, + GuildSetGuildMaster = 0x36c5, GuildSetMemberNote = 0x3072, GuildSetRankPermissions = 0x3067, GuildShiftRank = 0x3066, @@ -342,67 +343,67 @@ namespace Framework.Constants InitiateRolePoll = 0x35da, InitiateTrade = 0x3156, Inspect = 0x352d, - InspectPvp = 0x36a3, + InspectPvp = 0x36a1, InstanceLockResponse = 0x3511, ItemPurchaseRefund = 0x3534, - ItemTextQuery = 0x330b, - JoinPetBattleQueue = 0x31d3, + ItemTextQuery = 0x330f, + JoinPetBattleQueue = 0x31d4, JoinRatedBattleground = 0x3176, - KeepAlive = 0x3681, - KeyboundOverride = 0x3217, + KeepAlive = 0x367f, + KeyboundOverride = 0x3219, LearnPvpTalents = 0x3557, LearnTalents = 0x3556, - LeaveGroup = 0x364b, - LeavePetBattleQueue = 0x31d4, - LfgListApplyToGroup = 0x360e, - LfgListCancelApplication = 0x360f, - LfgListDeclineApplicant = 0x3610, - LfgListGetStatus = 0x360c, - LfgListInviteApplicant = 0x3611, - LfgListInviteResponse = 0x3612, - LfgListJoin = 0x3609, - LfgListLeave = 0x360b, - LfgListSearch = 0x360d, - LfgListUpdateRequest = 0x360a, - LfGuildAddRecruit = 0x361d, - LfGuildBrowse = 0x361f, + LeaveGroup = 0x3649, + LeavePetBattleQueue = 0x31d5, + LfgListApplyToGroup = 0x360c, + LfgListCancelApplication = 0x360d, + LfgListDeclineApplicant = 0x360e, + LfgListGetStatus = 0x360a, + LfgListInviteApplicant = 0x360f, + LfgListInviteResponse = 0x3610, + LfgListJoin = 0x3345, + LfgListLeave = 0x3609, + LfgListSearch = 0x360b, + LfgListUpdateRequest = 0x3346, + LfGuildAddRecruit = 0x361b, + LfGuildBrowse = 0x361d, LfGuildDeclineRecruit = 0x3078, LfGuildGetApplications = 0x3079, LfGuildGetGuildPost = 0x3076, LfGuildGetRecruits = 0x3077, LfGuildRemoveRecruit = 0x307a, - LfGuildSetGuildPost = 0x361e, + LfGuildSetGuildPost = 0x361c, ListInventory = 0x34a4, - LiveRegionAccountRestore = 0x36bb, - LiveRegionCharacterCopy = 0x36ba, - LiveRegionGetAccountCharacterList = 0x36b9, + LiveRegionAccountRestore = 0x36b9, + LiveRegionCharacterCopy = 0x36b8, + LiveRegionGetAccountCharacterList = 0x36b7, LoadingScreenNotify = 0x35f8, - LoadSelectedTrophy = 0x32ee, + LoadSelectedTrophy = 0x32f2, LogoutCancel = 0x34dc, LogoutInstant = 0x34dd, LogoutRequest = 0x34db, LogDisconnect = 0x3769, LogStreamingError = 0x376d, - LootItem = 0x3203, - LootMoney = 0x3202, - LootRelease = 0x3207, - LootRoll = 0x3208, - LootUnit = 0x3201, - LowLevelRaid1 = 0x36a1, + LootItem = 0x3205, + LootMoney = 0x3204, + LootRelease = 0x3209, + LootRoll = 0x320a, + LootUnit = 0x3203, + LowLevelRaid1 = 0x369f, LowLevelRaid2 = 0x3518, MailCreateTextItem = 0x353f, - MailDelete = 0x3219, + MailDelete = 0x321b, MailGetList = 0x353a, MailMarkAsRead = 0x353e, - MailReturnToSender = 0x3657, + MailReturnToSender = 0x3655, MailTakeItem = 0x353c, MailTakeMoney = 0x353b, - MasterLootItem = 0x3204, - MinimapPing = 0x364d, + MasterLootItem = 0x3206, + MinimapPing = 0x364b, MissileTrajectoryCollision = 0x3189, MountClearFanfare = 0x312d, - MountSetFavorite = 0x3633, - MountSpecialAnim = 0x326f, + MountSetFavorite = 0x3631, + MountSpecialAnim = 0x3273, MoveApplyMovementForceAck = 0x3a12, MoveChangeTransport = 0x3a2c, MoveChangeVehicleSeats = 0x3a31, @@ -464,39 +465,39 @@ namespace Framework.Constants MoveTimeSkipped = 0x3a18, MoveToggleCollisionCheat = 0x3a05, MoveWaterWalkAck = 0x3a1a, - NeutralPlayerSelectFaction = 0x31c9, + NeutralPlayerSelectFaction = 0x31ca, NextCinematicCamera = 0x3548, ObjectUpdateFailed = 0x317f, ObjectUpdateRescued = 0x3180, - OfferPetition = 0x36b1, + OfferPetition = 0x36af, OpeningCinematic = 0x3547, - OpenItem = 0x330c, - OpenMissionNpc = 0x32d3, - OpenShipmentNpc = 0x32d9, - OpenTradeskillNpc = 0x32e4, + OpenItem = 0x3310, + OpenMissionNpc = 0x32d7, + OpenShipmentNpc = 0x32dd, + OpenTradeskillNpc = 0x32e8, OptOutOfLoot = 0x34fa, PartyInvite = 0x3602, PartyInviteResponse = 0x3603, - PartyUninvite = 0x3649, + PartyUninvite = 0x3647, PetitionBuy = 0x34cd, - PetitionRenameGuild = 0x36c8, + PetitionRenameGuild = 0x36c6, PetitionShowList = 0x34cc, PetitionShowSignatures = 0x34ce, PetAbandon = 0x3490, PetAction = 0x348e, - PetBattleFinalNotify = 0x31d7, - PetBattleInput = 0x3642, - PetBattleQueueProposeMatchResult = 0x3218, - PetBattleQuitNotify = 0x31d6, - PetBattleReplaceFrontPet = 0x3643, - PetBattleRequestPvp = 0x31d1, - PetBattleRequestUpdate = 0x31d2, - PetBattleRequestWild = 0x31cf, - PetBattleScriptErrorNotify = 0x31d8, - PetBattleWildLocationFail = 0x31d0, + PetBattleFinalNotify = 0x31d9, + PetBattleInput = 0x3640, + PetBattleQueueProposeMatchResult = 0x321a, + PetBattleQuitNotify = 0x31d8, + PetBattleReplaceFrontPet = 0x3641, + PetBattleRequestPvp = 0x31d2, + PetBattleRequestUpdate = 0x31d3, + PetBattleRequestWild = 0x31d0, + PetBattleScriptErrorNotify = 0x31da, + PetBattleWildLocationFail = 0x31d1, PetCancelAura = 0x3491, - PetCastSpell = 0x3289, - PetRename = 0x3687, + PetCastSpell = 0x328d, + PetRename = 0x3685, PetSetAction = 0x348d, PetSpellAutocast = 0x3492, PetStopAttack = 0x348f, @@ -505,27 +506,27 @@ namespace Framework.Constants ProtocolMismatch = 0x376e, PushQuestToParty = 0x34a2, PvpLogData = 0x317a, - PvpPrestigeRankUp = 0x332f, - QueryBattlePetName = 0x3264, - QueryCorpseLocationFromClient = 0x3662, - QueryCorpseTransport = 0x3663, + PvpPrestigeRankUp = 0x3332, + QueryBattlePetName = 0x3268, + QueryCorpseLocationFromClient = 0x3660, + QueryCorpseTransport = 0x3661, QueryCountdownTimer = 0x31a4, - QueryCreature = 0x325e, - QueryGameObject = 0x325f, - QueryGarrisonCreatureName = 0x3265, - QueryGuildInfo = 0x368f, + QueryCreature = 0x3262, + QueryGameObject = 0x3263, + QueryGarrisonCreatureName = 0x3269, + QueryGuildInfo = 0x368d, QueryInspectAchievements = 0x3506, QueryNextMailTime = 0x353d, - QueryNpcText = 0x3260, - QueryPageText = 0x3262, - QueryPetition = 0x3266, - QueryPetName = 0x3263, - QueryPlayerName = 0x368d, + QueryNpcText = 0x3264, + QueryPageText = 0x3266, + QueryPetition = 0x326a, + QueryPetName = 0x3267, + QueryPlayerName = 0x368b, QueryQuestCompletionNpcs = 0x3173, - QueryQuestInfo = 0x3261, - QueryQuestRewards = 0x3333, - QueryRealmName = 0x368e, - QueryScenarioPoi = 0x3658, + QueryQuestInfo = 0x3265, + QueryQuestRewards = 0x3336, + QueryRealmName = 0x368c, + QueryScenarioPoi = 0x3656, QueryTime = 0x34da, QueryVoidStorage = 0x319d, QuestConfirmAccept = 0x34a1, @@ -538,126 +539,126 @@ namespace Framework.Constants QuestGiverStatusMultipleQuery = 0x34a0, QuestGiverStatusQuery = 0x349f, QuestLogRemoveQuest = 0x3532, - QuestPoiQuery = 0x36b2, + QuestPoiQuery = 0x36b0, QuestPushResult = 0x34a3, QueuedMessagesEnd = 0x376c, - QuickJoinAutoAcceptRequests = 0x3707, - QuickJoinRequestInvite = 0x3706, - QuickJoinRespondToInvite = 0x3705, - QuickJoinSignalToastDisplayed = 0x3704, - RaidOrBattlegroundEngineSurvey = 0x36e6, - RandomRoll = 0x3656, - ReadyCheckResponse = 0x3636, - ReadItem = 0x330d, + QuickJoinAutoAcceptRequests = 0x3705, + QuickJoinRequestInvite = 0x3704, + QuickJoinRespondToInvite = 0x3703, + QuickJoinSignalToastDisplayed = 0x3702, + RaidOrBattlegroundEngineSurvey = 0x36e4, + RandomRoll = 0x3654, + ReadyCheckResponse = 0x3634, + ReadItem = 0x3311, ReclaimCorpse = 0x34df, - RecruitAFriend = 0x36ce, - RedeemWowTokenConfirm = 0x36f0, - RedeemWowTokenStart = 0x36ef, - RemoveNewItem = 0x3336, + RecruitAFriend = 0x36cc, + RedeemWowTokenConfirm = 0x36ee, + RedeemWowTokenStart = 0x36ed, + RemoveNewItem = 0x3339, ReorderCharacters = 0x35e9, RepairItem = 0x34f0, - ReplaceTrophy = 0x32ef, + ReplaceTrophy = 0x32f3, RepopRequest = 0x352a, - ReportClientVariables = 0x3701, - ReportEnabledAddons = 0x3700, - ReportKeybindingExecutionCounts = 0x3702, + ReportClientVariables = 0x36ff, + ReportEnabledAddons = 0x36fe, + ReportKeybindingExecutionCounts = 0x3700, ReportPvpPlayerAfk = 0x34f8, - RequestAccountData = 0x3697, - RequestAreaPoiUpdate = 0x3335, + RequestAccountData = 0x3695, + RequestAreaPoiUpdate = 0x3338, RequestBattlefieldStatus = 0x35dc, RequestCategoryCooldowns = 0x317c, RequestCemeteryList = 0x3174, - RequestConquestFormulaConstants = 0x32a0, - RequestConsumptionConversionInfo = 0x36fa, + RequestConquestFormulaConstants = 0x32a4, + RequestConsumptionConversionInfo = 0x36f8, RequestCrowdControlSpell = 0x352e, - RequestForcedReactions = 0x31fc, + RequestForcedReactions = 0x31fe, RequestGuildPartyState = 0x31a3, RequestGuildRewardsList = 0x31a2, RequestHonorStats = 0x3179, - RequestLfgListBlacklist = 0x3291, + RequestLfgListBlacklist = 0x3295, RequestPartyJoinUpdates = 0x35f7, - RequestPartyMemberStats = 0x3655, + RequestPartyMemberStats = 0x3653, RequestPetInfo = 0x3493, - RequestPlayedTime = 0x3269, + RequestPlayedTime = 0x326d, RequestPvpBrawlInfo = 0x3191, RequestPvpRewards = 0x3190, - RequestRaidInfo = 0x36c9, + RequestRaidInfo = 0x36c7, RequestRatedBattlefieldInfo = 0x35e3, RequestResearchHistory = 0x3167, RequestStabledPets = 0x3494, - RequestVehicleExit = 0x3229, - RequestVehicleNextSeat = 0x322b, - RequestVehiclePrevSeat = 0x322a, - RequestVehicleSwitchSeat = 0x322c, - RequestWorldQuestUpdate = 0x3334, - RequestWowTokenMarketPrice = 0x36e8, - ResetChallengeMode = 0x31f9, - ResetChallengeModeCheat = 0x31fa, - ResetInstances = 0x366a, - ResurrectResponse = 0x3686, - RevertMonumentAppearance = 0x32f1, - RideVehicleInteract = 0x322d, + RequestVehicleExit = 0x322b, + RequestVehicleNextSeat = 0x322d, + RequestVehiclePrevSeat = 0x322c, + RequestVehicleSwitchSeat = 0x322e, + RequestWorldQuestUpdate = 0x3337, + RequestWowTokenMarketPrice = 0x36e6, + ResetChallengeMode = 0x31fb, + ResetChallengeModeCheat = 0x31fc, + ResetInstances = 0x3668, + ResurrectResponse = 0x3684, + RevertMonumentAppearance = 0x32f5, + RideVehicleInteract = 0x322f, SaveCufProfiles = 0x318a, SaveEquipmentSet = 0x350f, - SaveGuildEmblem = 0x3295, - ScenePlaybackCanceled = 0x3214, - ScenePlaybackComplete = 0x3213, - SceneTriggerEvent = 0x3215, + SaveGuildEmblem = 0x3299, + ScenePlaybackCanceled = 0x3216, + ScenePlaybackComplete = 0x3215, + SceneTriggerEvent = 0x3217, SelfRes = 0x3535, SellItem = 0x34a5, - SellWowTokenConfirm = 0x36ea, - SellWowTokenStart = 0x36e9, - SendContactList = 0x36d0, + SellWowTokenConfirm = 0x36e8, + SellWowTokenStart = 0x36e7, + SendContactList = 0x36ce, SendMail = 0x35fa, - SendSorRequestViaAddress = 0x3622, + SendSorRequestViaAddress = 0x3620, SendTextEmote = 0x348a, - SetAchievementsHidden = 0x321a, + SetAchievementsHidden = 0x321c, SetActionBarToggles = 0x3536, - SetActionButton = 0x3637, + SetActionButton = 0x3635, SetActiveMover = 0x3a37, - SetAdvancedCombatLogging = 0x32a1, - SetAssistantLeader = 0x3651, - SetBackpackAutosortDisabled = 0x3310, - SetBankAutosortDisabled = 0x3311, - SetBankBagSlotFlag = 0x330f, - SetContactNotes = 0x36d3, + SetAdvancedCombatLogging = 0x32a5, + SetAssistantLeader = 0x364f, + SetBackpackAutosortDisabled = 0x3314, + SetBankAutosortDisabled = 0x3315, + SetBankBagSlotFlag = 0x3313, + SetContactNotes = 0x36d1, SetCurrencyFlags = 0x3169, - SetDifficultyId = 0x3216, - SetDungeonDifficulty = 0x3684, - SetEveryoneIsAssistant = 0x3619, + SetDifficultyId = 0x3218, + SetDungeonDifficulty = 0x3682, + SetEveryoneIsAssistant = 0x3617, SetFactionAtWar = 0x34e2, SetFactionInactive = 0x34e4, SetFactionNotAtWar = 0x34e3, - SetInsertItemsLeftToRight = 0x3313, - SetLfgBonusFactionId = 0x3290, - SetLootMethod = 0x364a, + SetInsertItemsLeftToRight = 0x3317, + SetLfgBonusFactionId = 0x3294, + SetLootMethod = 0x3648, SetLootSpecialization = 0x3543, - SetPartyAssignment = 0x3653, - SetPartyLeader = 0x364c, + SetPartyAssignment = 0x3651, + SetPartyLeader = 0x364a, SetPetSlot = 0x3168, - SetPlayerDeclinedNames = 0x368c, + SetPlayerDeclinedNames = 0x368a, SetPreferredCemetery = 0x3175, - SetPvp = 0x3299, - SetRaidDifficulty = 0x36dd, + SetPvp = 0x329d, + SetRaidDifficulty = 0x36db, SetRole = 0x35d9, - SetSavedInstanceExtend = 0x368a, + SetSavedInstanceExtend = 0x3688, SetSelection = 0x352c, SetSheathed = 0x348b, - SetSortBagsRightToLeft = 0x3312, + SetSortBagsRightToLeft = 0x3316, SetTaxiBenchmarkMode = 0x34f7, - SetTitle = 0x326d, + SetTitle = 0x3271, SetTradeCurrency = 0x3160, SetTradeGold = 0x315f, SetTradeItem = 0x315d, - SetUsingPartyGarrison = 0x32d5, + SetUsingPartyGarrison = 0x32d9, SetWatchedFaction = 0x34e5, - ShowTradeSkill = 0x36c1, + ShowTradeSkill = 0x36bf, SignPetition = 0x3537, - SilencePartyTalker = 0x3654, + SilencePartyTalker = 0x3652, SocketGems = 0x34ef, - SortBags = 0x3314, - SortBankBags = 0x3315, - SortReagentBankBags = 0x3316, + SortBags = 0x3318, + SortBankBags = 0x3319, + SortReagentBankBags = 0x331a, SpellClick = 0x3498, SpiritHealerActivate = 0x34b2, SplitItem = 0x399e, @@ -665,18 +666,18 @@ namespace Framework.Constants StartChallengeMode = 0x354e, StartSpectatorWarGame = 0x35df, StartWarGame = 0x35de, - SummonResponse = 0x366c, - SupportTicketSubmitBug = 0x3647, - SupportTicketSubmitComplaint = 0x3646, - SupportTicketSubmitSuggestion = 0x3648, + SummonResponse = 0x366a, + SupportTicketSubmitBug = 0x3645, + SupportTicketSubmitComplaint = 0x3644, + SupportTicketSubmitSuggestion = 0x3646, SurrenderArena = 0x3172, SuspendCommsAck = 0x3764, SuspendTokenResponse = 0x376a, SwapInvItem = 0x399d, SwapItem = 0x399c, - SwapSubGroups = 0x364f, + SwapSubGroups = 0x364d, SwapVoidItem = 0x319f, - TabardVendorActivate = 0x3296, + TabardVendorActivate = 0x329a, TalkToGossip = 0x3495, TaxiNodeStatusQuery = 0x34ab, TaxiQueryAvailableNodes = 0x34ad, @@ -685,46 +686,46 @@ namespace Framework.Constants TimeSyncResponse = 0x3a38, TimeSyncResponseDropped = 0x3a3a, TimeSyncResponseFailed = 0x3a39, - ToggleDifficulty = 0x3659, - TogglePvp = 0x3298, + ToggleDifficulty = 0x3657, + TogglePvp = 0x329c, TotemDestroyed = 0x34fe, - TradeSkillSetFavorite = 0x3332, + TradeSkillSetFavorite = 0x3335, TrainerBuySpell = 0x34b1, TrainerList = 0x34b0, TransmogrifyItems = 0x3192, TurnInPetition = 0x3539, - Tutorial = 0x36de, + Tutorial = 0x36dc, TwitterCheckStatus = 0x312a, TwitterConnect = 0x3127, TwitterDisconnect = 0x312b, - TwitterPost = 0x3318, - UiTimeRequest = 0x369c, + TwitterPost = 0x331c, + UiTimeRequest = 0x369a, UnacceptTrade = 0x315b, - UndeleteCharacter = 0x36e0, + UndeleteCharacter = 0x36de, UnlearnSkill = 0x34e9, UnlearnSpecialization = 0x31a0, UnlockVoidStorage = 0x319c, - UpdateAccountData = 0x3698, - UpdateAreaTriggerVisual = 0x328c, - UpdateClientSettings = 0x3666, + UpdateAccountData = 0x3696, + UpdateAreaTriggerVisual = 0x3290, + UpdateClientSettings = 0x3664, UpdateMissileTrajectory = 0x3a3e, - UpdateRaidTarget = 0x3652, - UpdateSpellVisual = 0x328b, - UpdateVasPurchaseStates = 0x36f6, - UpdateWowTokenAuctionableList = 0x36f1, - UpdateWowTokenCount = 0x36e7, - UpgradeGarrison = 0x32a9, - UpgradeItem = 0x321b, + UpdateRaidTarget = 0x3650, + UpdateSpellVisual = 0x328f, + UpdateVasPurchaseStates = 0x36f4, + UpdateWowTokenAuctionableList = 0x36ef, + UpdateWowTokenCount = 0x36e5, + UpgradeGarrison = 0x32ad, + UpgradeItem = 0x321d, UsedFollow = 0x3185, - UseCritterItem = 0x3234, + UseCritterItem = 0x3235, UseEquipmentSet = 0x3995, - UseItem = 0x3286, - UseToy = 0x3288, + UseItem = 0x328a, + UseToy = 0x328c, ViolenceLevel = 0x3183, VoidStorageTransfer = 0x319e, WardenData = 0x35ec, - Who = 0x3683, - WhoIs = 0x3682, + Who = 0x3681, + WhoIs = 0x3680, WorldPortResponse = 0x35f9, WrapItem = 0x3994, @@ -735,63 +736,63 @@ namespace Framework.Constants public enum ServerOpcodes : uint { AbortNewWorld = 0x25ad, - AccountCriteriaUpdate = 0x2653, - AccountDataTimes = 0x274a, + AccountCriteriaUpdate = 0x2652, + AccountDataTimes = 0x2749, AccountMountUpdate = 0x25c3, AccountToysUpdate = 0x25c4, - AchievementDeleted = 0x271f, - AchievementEarned = 0x2661, - ActivateTaxiReply = 0x26a7, - ActiveGlyphs = 0x2c52, - AddBattlenetFriendResponse = 0x265b, + AchievementDeleted = 0x271e, + AchievementEarned = 0x2660, + ActivateTaxiReply = 0x26a6, + ActiveGlyphs = 0x2c53, + AddBattlenetFriendResponse = 0x265a, AddItemPassive = 0x25bf, - AddLossOfControl = 0x2697, - AddRunePower = 0x26e3, + AddLossOfControl = 0x2696, + AddRunePower = 0x26e2, AdjustSplineDuration = 0x25e8, AeLootTargets = 0x262c, AeLootTargetAck = 0x262d, - AiReaction = 0x26e0, + AiReaction = 0x26df, AllAccountCriteria = 0x2570, AllAchievementData = 0x256f, AllGuildAchievements = 0x29b8, ArchaeologySurveryCast = 0x2586, AreaPoiUpdate = 0x2848, - AreaSpiritHealerTime = 0x2783, - AreaTriggerDenied = 0x269e, - AreaTriggerNoCorpse = 0x2756, - AreaTriggerRePath = 0x2640, - AreaTriggerReShape = 0x263d, - ArenaCrowdControlSpells = 0x264f, - ArenaError = 0x2712, - ArenaPrepOpponentSpecializations = 0x2666, - ArtifactForgeOpened = 0x27e3, - ArtifactKnowledge = 0x27eb, - ArtifactRespecConfirm = 0x27e6, - ArtifactTraitsRefunded = 0x27e7, - ArtifactXpGain = 0x282e, - AttackerStateUpdate = 0x27d0, - AttackStart = 0x266e, - AttackStop = 0x266f, - AttackSwingError = 0x2734, - AttackSwingLandedLog = 0x2735, - AuctionClosedNotification = 0x2729, - AuctionCommandResult = 0x2726, - AuctionHelloResponse = 0x2724, - AuctionListBidderItemsResult = 0x272d, - AuctionListItemsResult = 0x272b, - AuctionListOwnerItemsResult = 0x272c, - AuctionListPendingSalesResult = 0x272e, - AuctionOutbidNotification = 0x2728, - AuctionOwnerBidNotification = 0x272a, - AuctionReplicateResponse = 0x2725, - AuctionWonNotification = 0x2727, + AreaSpiritHealerTime = 0x2782, + AreaTriggerDenied = 0x269d, + AreaTriggerNoCorpse = 0x2755, + AreaTriggerRePath = 0x263f, + AreaTriggerReShape = 0x263c, + ArenaCrowdControlSpells = 0x264e, + ArenaError = 0x2711, + ArenaPrepOpponentSpecializations = 0x2665, + ArtifactForgeOpened = 0x27e2, + ArtifactKnowledge = 0x27ea, + ArtifactRespecConfirm = 0x27e5, + ArtifactTraitsRefunded = 0x27e6, + ArtifactXpGain = 0x282d, + AttackerStateUpdate = 0x27cf, + AttackStart = 0x266d, + AttackStop = 0x266e, + AttackSwingError = 0x2733, + AttackSwingLandedLog = 0x2734, + AuctionClosedNotification = 0x2728, + AuctionCommandResult = 0x2725, + AuctionHelloResponse = 0x2723, + AuctionListBidderItemsResult = 0x272c, + AuctionListItemsResult = 0x272a, + AuctionListOwnerItemsResult = 0x272b, + AuctionListPendingSalesResult = 0x272d, + AuctionOutbidNotification = 0x2727, + AuctionOwnerBidNotification = 0x2729, + AuctionReplicateResponse = 0x2724, + AuctionWonNotification = 0x2726, AuraPointsDepleted = 0x2c23, AuraUpdate = 0x2c22, AuthChallenge = 0x3048, AuthResponse = 0x256c, AvailableHotfixes = 0x25a1, - BanReason = 0x26b3, - BarberShopResult = 0x26e9, + BanReason = 0x26b2, + BarberShopResult = 0x26e8, BattlefieldList = 0x2594, BattlefieldPortDenied = 0x259a, BattlefieldStatusActive = 0x2590, @@ -801,43 +802,44 @@ namespace Framework.Constants BattlefieldStatusQueued = 0x2591, BattlefieldStatusWaitForGroups = 0x25a5, BattlegroundInfoThrottled = 0x259b, - BattlegroundInit = 0x27a1, + BattlegroundInit = 0x27a0, BattlegroundPlayerJoined = 0x2598, BattlegroundPlayerLeft = 0x2599, BattlegroundPlayerPositions = 0x2595, - BattlegroundPoints = 0x27a0, - BattlenetChallengeAbort = 0x27cf, - BattlenetChallengeStart = 0x27ce, + BattlegroundPoints = 0x279f, + BattlenetChallengeAbort = 0x27ce, + BattlenetChallengeStart = 0x27cd, BattlenetNotification = 0x2843, BattlenetRealmListTicket = 0x2845, BattlenetResponse = 0x2842, BattlenetSetSessionState = 0x2844, - BattlePayAckFailed = 0x27c7, - BattlePayBattlePetDelivered = 0x27bc, - BattlePayConfirmPurchase = 0x27c6, - BattlePayDeliveryEnded = 0x27ba, - BattlePayDeliveryStarted = 0x27b9, - BattlePayDistributionUpdate = 0x27b8, - BattlePayGetDistributionListResponse = 0x27b6, - BattlePayGetProductListResponse = 0x27b4, - BattlePayGetPurchaseListResponse = 0x27b5, - BattlePayMountDelivered = 0x27bb, - BattlePayPurchaseUpdate = 0x27c5, - BattlePayStartDistributionAssignToTargetResponse = 0x27c3, - BattlePayStartPurchaseResponse = 0x27c2, + BattlePayAckFailed = 0x27c6, + BattlePayBattlePetDelivered = 0x27bb, + BattlePayConfirmPurchase = 0x27c5, + BattlePayDeliveryEnded = 0x27b9, + BattlePayDeliveryStarted = 0x27b8, + BattlePayDistributionUpdate = 0x27b7, + BattlePayGetDistributionListResponse = 0x27b5, + BattlePayGetProductListResponse = 0x27b3, + BattlePayGetPurchaseListResponse = 0x27b4, + BattlePayMountDelivered = 0x27ba, + BattlePayPurchaseUpdate = 0x27c4, + BattlePayStartDistributionAssignToTargetResponse = 0x27c2, + BattlePayStartPurchaseResponse = 0x27c1, + BattlePaySubscriptionChanged = 0x2864, BattlePayVasBnetTransferValidationResult = 0x285b, - BattlePayVasBoostConsumed = 0x27b7, - BattlePayVasCharacterList = 0x2831, + BattlePayVasBoostConsumed = 0x27b6, + BattlePayVasCharacterList = 0x2830, BattlePayVasCharacterQueueStatus = 0x2859, - BattlePayVasPurchaseComplete = 0x2834, - BattlePayVasPurchaseList = 0x2835, - BattlePayVasPurchaseStarted = 0x2833, - BattlePayVasRealmList = 0x2832, + BattlePayVasPurchaseComplete = 0x2833, + BattlePayVasPurchaseList = 0x2834, + BattlePayVasPurchaseStarted = 0x2832, + BattlePayVasRealmList = 0x2831, BattlePayVasTransferQueueStatus = 0x2858, BattlePetsHealed = 0x2609, - BattlePetCageDateError = 0x26a1, + BattlePetCageDateError = 0x26a0, BattlePetDeleted = 0x2606, - BattlePetError = 0x2656, + BattlePetError = 0x2655, BattlePetJournal = 0x2605, BattlePetJournalLockAcquired = 0x2603, BattlePetJournalLockDenied = 0x2604, @@ -847,49 +849,49 @@ namespace Framework.Constants BattlePetRevoked = 0x2607, BattlePetTrapLevel = 0x2600, BattlePetUpdates = 0x25ff, - BinderConfirm = 0x273a, + BinderConfirm = 0x2739, BindPointUpdate = 0x257c, - BlackMarketBidOnItemResult = 0x2645, - BlackMarketOpenResult = 0x2643, - BlackMarketOutbid = 0x2646, - BlackMarketRequestItemsResult = 0x2644, - BlackMarketWon = 0x2647, - BonusRollEmpty = 0x2663, - BossKillCredit = 0x27c1, - BreakTarget = 0x266d, - BuyFailed = 0x26f2, - BuySucceeded = 0x26f1, - CacheInfo = 0x2744, - CacheVersion = 0x2743, - CalendarClearPendingAction = 0x26c7, - CalendarCommandResult = 0x26c8, - CalendarEventInitialInvites = 0x26b7, - CalendarEventInvite = 0x26b8, - CalendarEventInviteAlert = 0x26b9, - CalendarEventInviteModeratorStatus = 0x26bc, - CalendarEventInviteNotes = 0x26c1, - CalendarEventInviteNotesAlert = 0x26c2, - CalendarEventInviteRemoved = 0x26bd, - CalendarEventInviteRemovedAlert = 0x26be, - CalendarEventInviteStatus = 0x26ba, - CalendarEventInviteStatusAlert = 0x26bb, - CalendarEventRemovedAlert = 0x26bf, - CalendarEventUpdatedAlert = 0x26c0, - CalendarRaidLockoutAdded = 0x26c3, - CalendarRaidLockoutRemoved = 0x26c4, - CalendarRaidLockoutUpdated = 0x26c5, - CalendarSendCalendar = 0x26b5, - CalendarSendEvent = 0x26b6, - CalendarSendNumPending = 0x26c6, - CameraEffect = 0x2768, - CancelAutoRepeat = 0x2713, - CancelCombat = 0x2732, - CancelOrphanSpellVisual = 0x2c45, - CancelScene = 0x2655, - CancelSpellVisual = 0x2c43, - CancelSpellVisualKit = 0x2c47, - CanDuelResult = 0x2677, - CastFailed = 0x2c55, + BlackMarketBidOnItemResult = 0x2644, + BlackMarketOpenResult = 0x2642, + BlackMarketOutbid = 0x2645, + BlackMarketRequestItemsResult = 0x2643, + BlackMarketWon = 0x2646, + BonusRollEmpty = 0x2662, + BossKillCredit = 0x27c0, + BreakTarget = 0x266c, + BuyFailed = 0x26f1, + BuySucceeded = 0x26f0, + CacheInfo = 0x2743, + CacheVersion = 0x2742, + CalendarClearPendingAction = 0x26c6, + CalendarCommandResult = 0x26c7, + CalendarEventInitialInvites = 0x26b6, + CalendarEventInvite = 0x26b7, + CalendarEventInviteAlert = 0x26b8, + CalendarEventInviteModeratorStatus = 0x26bb, + CalendarEventInviteNotes = 0x26c0, + CalendarEventInviteNotesAlert = 0x26c1, + CalendarEventInviteRemoved = 0x26bc, + CalendarEventInviteRemovedAlert = 0x26bd, + CalendarEventInviteStatus = 0x26b9, + CalendarEventInviteStatusAlert = 0x26ba, + CalendarEventRemovedAlert = 0x26be, + CalendarEventUpdatedAlert = 0x26bf, + CalendarRaidLockoutAdded = 0x26c2, + CalendarRaidLockoutRemoved = 0x26c3, + CalendarRaidLockoutUpdated = 0x26c4, + CalendarSendCalendar = 0x26b4, + CalendarSendEvent = 0x26b5, + CalendarSendNumPending = 0x26c5, + CameraEffect = 0x2767, + CancelAutoRepeat = 0x2712, + CancelCombat = 0x2731, + CancelOrphanSpellVisual = 0x2c46, + CancelScene = 0x2654, + CancelSpellVisual = 0x2c44, + CancelSpellVisualKit = 0x2c48, + CanDuelResult = 0x2676, + CastFailed = 0x2c56, CategoryCooldown = 0x2c16, ChallengeModeAllMapStats = 0x2622, ChallengeModeComplete = 0x2620, @@ -900,24 +902,25 @@ namespace Framework.Constants ChallengeModeRewards = 0x2621, ChallengeModeStart = 0x261d, ChallengeModeUpdateDeathCount = 0x261e, - ChangePlayerDifficultyResult = 0x2736, + ChangePlayerDifficultyResult = 0x2735, ChannelList = 0x2bc3, ChannelNotify = 0x2bc0, ChannelNotifyJoined = 0x2bc1, ChannelNotifyLeft = 0x2bc2, - CharacterClassTrialCreate = 0x2805, + CharacterClassTrialCreate = 0x2804, + CharacterInventoryOverflowWarning = 0x2863, CharacterItemFixup = 0x2854, - CharacterLoginFailed = 0x2745, - CharacterObjectTestResponse = 0x27cd, - CharacterRenameResult = 0x27a6, - CharacterUpgradeComplete = 0x2804, - CharacterUpgradeQueued = 0x2803, + CharacterLoginFailed = 0x2744, + CharacterObjectTestResponse = 0x27cc, + CharacterRenameResult = 0x27a5, + CharacterUpgradeComplete = 0x2803, + CharacterUpgradeQueued = 0x2802, CharacterUpgradeSpellTierSet = 0x25f4, - CharacterUpgradeStarted = 0x2802, - CharacterUpgradeUnrevokeResult = 0x2806, - CharCustomize = 0x271a, - CharCustomizeFailed = 0x2719, - CharFactionChangeResult = 0x27ef, + CharacterUpgradeStarted = 0x2801, + CharacterUpgradeUnrevokeResult = 0x2805, + CharCustomize = 0x2719, + CharCustomizeFailed = 0x2718, + CharFactionChangeResult = 0x27ee, Chat = 0x2bad, ChatAutoResponded = 0x2bb8, ChatDown = 0x2bbd, @@ -933,97 +936,97 @@ namespace Framework.Constants CheckWargameEntry = 0x259e, ClearAllSpellCharges = 0x2c27, ClearBossEmotes = 0x25cd, - ClearCooldown = 0x26e5, + ClearCooldown = 0x26e4, ClearCooldowns = 0x2c26, - ClearLossOfControl = 0x2699, + ClearLossOfControl = 0x2698, ClearSpellCharges = 0x2c28, - ClearTarget = 0x26dc, + ClearTarget = 0x26db, CoinRemoved = 0x262b, - CombatEventFailed = 0x2670, - CommentatorMapInfo = 0x2747, - CommentatorPlayerInfo = 0x2748, - CommentatorStateChanged = 0x2746, - ComplaintResult = 0x26d4, - CompleteShipmentResponse = 0x27df, + CombatEventFailed = 0x266f, + CommentatorMapInfo = 0x2746, + CommentatorPlayerInfo = 0x2747, + CommentatorStateChanged = 0x2745, + ComplaintResult = 0x26d3, + CompleteShipmentResponse = 0x27de, ConnectTo = 0x304d, - ConquestFormulaConstants = 0x27c8, - ConsoleWrite = 0x2652, + ConquestFormulaConstants = 0x27c7, + ConsoleWrite = 0x2651, ConsumptionConversionInfoResponse = 0x2849, ConsumptionConversionResult = 0x284a, - ContactList = 0x27cb, - ControlUpdate = 0x2665, - CooldownCheat = 0x277c, - CooldownEvent = 0x26e4, - CorpseLocation = 0x266c, - CorpseReclaimDelay = 0x278f, - CorpseTransportQuery = 0x2752, - CreateChar = 0x273f, - CreateShipmentResponse = 0x27de, - CriteriaDeleted = 0x271e, - CriteriaUpdate = 0x2718, - CrossedInebriationThreshold = 0x26ed, + ContactList = 0x27ca, + ControlUpdate = 0x2664, + CooldownCheat = 0x277b, + CooldownEvent = 0x26e3, + CorpseLocation = 0x266b, + CorpseReclaimDelay = 0x278e, + CorpseTransportQuery = 0x2751, + CreateChar = 0x273e, + CreateShipmentResponse = 0x27dd, + CriteriaDeleted = 0x271d, + CriteriaUpdate = 0x2717, + CrossedInebriationThreshold = 0x26ec, CustomLoadScreen = 0x25e3, DailyQuestsReset = 0x2a80, - DamageCalcLog = 0x280d, + DamageCalcLog = 0x280c, DbReply = 0x25a0, - DeathReleaseLoc = 0x2706, + DeathReleaseLoc = 0x2705, DefenseMessage = 0x2bb6, - DeleteChar = 0x2740, - DestroyArenaUnit = 0x2785, - DestructibleBuildingDamage = 0x2733, + DeleteChar = 0x273f, + DestroyArenaUnit = 0x2784, + DestructibleBuildingDamage = 0x2732, DifferentInstanceFromParty = 0x258a, DisenchantCredit = 0x25bc, - Dismount = 0x26db, + Dismount = 0x26da, DismountResult = 0x257b, DispelFailed = 0x2c30, DisplayGameError = 0x25b5, - DisplayPlayerChoice = 0x26a2, - DisplayPromotion = 0x2669, + DisplayPlayerChoice = 0x26a1, + DisplayPromotion = 0x2668, DisplayQuestPopup = 0x2a9d, - DisplayToast = 0x2639, + DisplayToast = 0x2638, DontAutoPushSpellsToActionBar = 0x25f6, DropNewConnection = 0x304c, - DuelComplete = 0x2675, - DuelCountdown = 0x2674, - DuelInBounds = 0x2673, - DuelOutOfBounds = 0x2672, - DuelRequested = 0x2671, - DuelWinner = 0x2676, - DurabilityDamageDeath = 0x278b, - Emote = 0x280e, - EnableBarberShop = 0x26e8, + DuelComplete = 0x2674, + DuelCountdown = 0x2673, + DuelInBounds = 0x2672, + DuelOutOfBounds = 0x2671, + DuelRequested = 0x2670, + DuelWinner = 0x2675, + DurabilityDamageDeath = 0x278a, + Emote = 0x280d, + EnableBarberShop = 0x26e7, EnableEncryption = 0x3049, - EnchantmentLog = 0x2753, - EncounterEnd = 0x27c0, - EncounterStart = 0x27bf, + EnchantmentLog = 0x2752, + EncounterEnd = 0x27bf, + EncounterStart = 0x27be, EnumCharactersResult = 0x2582, EnvironmentalDamageLog = 0x2c21, - EquipmentSetId = 0x26dd, + EquipmentSetId = 0x26dc, ExpectedSpamRecords = 0x2bb1, - ExplorationExperience = 0x27a3, - FactionBonusInfo = 0x2767, + ExplorationExperience = 0x27a2, + FactionBonusInfo = 0x2766, FailedPlayerCondition = 0x25e2, FeatureSystemStatus = 0x25d1, FeatureSystemStatusGlueScreen = 0x25d2, - FeignDeathResisted = 0x2788, - FishEscaped = 0x26fa, - FishNotHooked = 0x26f9, + FeignDeathResisted = 0x2787, + FishEscaped = 0x26f9, + FishNotHooked = 0x26f8, FlightSplineSync = 0x2df7, - ForcedDeathUpdate = 0x2707, - ForceAnim = 0x2795, - ForceObjectRelink = 0x2668, - FriendStatus = 0x27cc, + ForcedDeathUpdate = 0x2706, + ForceAnim = 0x2794, + ForceObjectRelink = 0x2667, + FriendStatus = 0x27cb, GameObjectActivateAnimKit = 0x25d6, GameObjectCustomAnim = 0x25d7, GameObjectDespawn = 0x25d8, - GameObjectPlaySpellVisual = 0x2c4a, - GameObjectPlaySpellVisualKit = 0x2c49, - GameObjectResetState = 0x275e, + GameObjectPlaySpellVisual = 0x2c4b, + GameObjectPlaySpellVisualKit = 0x2c4a, + GameObjectResetState = 0x275d, GameObjectSetState = 0x2841, - GameObjectUiAction = 0x275b, - GameSpeedSet = 0x26ab, - GameTimeSet = 0x274c, - GameTimeUpdate = 0x274b, + GameObjectUiAction = 0x275a, + GameSpeedSet = 0x26aa, + GameTimeSet = 0x274b, + GameTimeUpdate = 0x274a, GarrisonAddFollowerResult = 0x2902, GarrisonAddMissionResult = 0x2906, GarrisonAssignFollowerToBuildingResult = 0x2918, @@ -1041,7 +1044,7 @@ namespace Framework.Constants GarrisonFollowerChangedStatus = 0x2915, GarrisonFollowerChangedXp = 0x2912, GarrisonIsUpgradeableResult = 0x2929, - GarrisonLandingPageShipmentInfo = 0x27e1, + GarrisonLandingPageShipmentInfo = 0x27e0, GarrisonLearnBlueprintResult = 0x28f7, GarrisonLearnSpecializationResult = 0x28f5, GarrisonListFollowersCheatResult = 0x2905, @@ -1071,26 +1074,26 @@ namespace Framework.Constants GarrisonUnlearnBlueprintResult = 0x28f8, GarrisonUpgradeResult = 0x28fd, GenerateRandomCharacterNameResult = 0x2583, - GetAccountCharacterListResult = 0x27a4, + GetAccountCharacterListResult = 0x27a3, GetDisplayedTrophyListResponse = 0x2928, GetGarrisonInfoResult = 0x28f0, - GetShipmentsOfTypeResponse = 0x27e0, - GetShipmentInfoResponse = 0x27dc, - GetTrophyListResponse = 0x2809, - GmPlayerInfo = 0x277b, + GetShipmentsOfTypeResponse = 0x27df, + GetShipmentInfoResponse = 0x27db, + GetTrophyListResponse = 0x2808, + GmPlayerInfo = 0x277a, GmRequestPlayerInfo = 0x25ed, - GmTicketCaseStatus = 0x26cd, - GmTicketSystemStatus = 0x26cc, - GodMode = 0x2739, + GmTicketCaseStatus = 0x26cc, + GmTicketSystemStatus = 0x26cb, + GodMode = 0x2738, GossipComplete = 0x2a96, GossipMessage = 0x2a97, - GossipPoi = 0x27d9, + GossipPoi = 0x27d8, GroupActionThrottled = 0x259c, - GroupDecline = 0x27d4, - GroupDestroyed = 0x27d6, + GroupDecline = 0x27d3, + GroupDestroyed = 0x27d5, GroupInviteConfirmation = 0x2855, - GroupNewLeader = 0x264a, - GroupUninvite = 0x27d5, + GroupNewLeader = 0x2649, + GroupUninvite = 0x27d4, GuildAchievementDeleted = 0x29c5, GuildAchievementEarned = 0x29c4, GuildAchievementMembers = 0x29c7, @@ -1143,55 +1146,55 @@ namespace Framework.Constants GuildRoster = 0x29bb, GuildRosterUpdate = 0x29bc, GuildSendRankChange = 0x29b9, - HealthUpdate = 0x26fd, - HighestThreatUpdate = 0x270d, + HealthUpdate = 0x26fc, + HighestThreatUpdate = 0x270c, HotfixMessage = 0x25a2, HotfixResponse = 0x25a3, - InitializeFactions = 0x2766, + InitializeFactions = 0x2765, InitialSetup = 0x257f, - InitWorldStates = 0x278c, + InitWorldStates = 0x278b, InspectHonorStats = 0x25b2, - InspectPvp = 0x2762, - InspectResult = 0x264e, - InstanceEncounterChangePriority = 0x27f5, - InstanceEncounterDisengageUnit = 0x27f4, - InstanceEncounterEnd = 0x27fd, - InstanceEncounterEngageUnit = 0x27f3, - InstanceEncounterGainCombatResurrectionCharge = 0x27ff, - InstanceEncounterInCombatResurrection = 0x27fe, - InstanceEncounterObjectiveComplete = 0x27f8, - InstanceEncounterObjectiveStart = 0x27f7, - InstanceEncounterObjectiveUpdate = 0x27fc, - InstanceEncounterPhaseShiftChanged = 0x2800, - InstanceEncounterSetAllowingRelease = 0x27fb, - InstanceEncounterSetSuppressingRelease = 0x27fa, - InstanceEncounterStart = 0x27f9, - InstanceEncounterTimerStart = 0x27f6, - InstanceGroupSizeChanged = 0x2737, - InstanceInfo = 0x2651, - InstanceReset = 0x26b0, - InstanceResetFailed = 0x26b1, - InstanceSaveCreated = 0x27be, - InvalidatePageText = 0x2702, - InvalidatePlayer = 0x26d3, - InvalidPromotionCode = 0x2796, - InventoryChangeFailure = 0x2764, + InspectPvp = 0x2761, + InspectResult = 0x264d, + InstanceEncounterChangePriority = 0x27f4, + InstanceEncounterDisengageUnit = 0x27f3, + InstanceEncounterEnd = 0x27fc, + InstanceEncounterEngageUnit = 0x27f2, + InstanceEncounterGainCombatResurrectionCharge = 0x27fe, + InstanceEncounterInCombatResurrection = 0x27fd, + InstanceEncounterObjectiveComplete = 0x27f7, + InstanceEncounterObjectiveStart = 0x27f6, + InstanceEncounterObjectiveUpdate = 0x27fb, + InstanceEncounterPhaseShiftChanged = 0x27ff, + InstanceEncounterSetAllowingRelease = 0x27fa, + InstanceEncounterSetSuppressingRelease = 0x27f9, + InstanceEncounterStart = 0x27f8, + InstanceEncounterTimerStart = 0x27f5, + InstanceGroupSizeChanged = 0x2736, + InstanceInfo = 0x2650, + InstanceReset = 0x26af, + InstanceResetFailed = 0x26b0, + InstanceSaveCreated = 0x27bd, + InvalidatePageText = 0x2701, + InvalidatePlayer = 0x26d2, + InvalidPromotionCode = 0x2795, + InventoryChangeFailure = 0x2763, IsQuestCompleteResponse = 0x2a83, - ItemChanged = 0x2721, - ItemCooldown = 0x280c, - ItemEnchantTimeUpdate = 0x2798, + ItemChanged = 0x2720, + ItemCooldown = 0x280b, + ItemEnchantTimeUpdate = 0x2797, ItemExpirePurchaseRefund = 0x25b1, ItemPurchaseRefundResult = 0x25af, - ItemPushResult = 0x2638, - ItemTimeUpdate = 0x2797, - KickReason = 0x2830, - LearnedSpells = 0x2c4c, + ItemPushResult = 0x2637, + ItemTimeUpdate = 0x2796, + KickReason = 0x282f, + LearnedSpells = 0x2c4d, LearnPvpTalentsFailed = 0x25ea, LearnTalentsFailed = 0x25e9, LevelUpdate = 0x2587, - LevelUpInfo = 0x2720, - LfgBootPlayer = 0x2a36, - LfgDisabled = 0x2a34, + LevelUpInfo = 0x271f, + LfgBootPlayer = 0x2a35, + LfgDisabled = 0x2a33, LfgInstanceShutdownCountdown = 0x2a25, LfgJoinResult = 0x2a1c, LfgListJoinResult = 0x2a1d, @@ -1199,17 +1202,17 @@ namespace Framework.Constants LfgListSearchStatus = 0x2a1f, LfgListUpdateBlacklist = 0x2a2a, LfgListUpdateStatus = 0x2a26, - LfgOfferContinue = 0x2a35, - LfgPartyInfo = 0x2a37, - LfgPlayerInfo = 0x2a38, - LfgPlayerReward = 0x2a39, + LfgOfferContinue = 0x2a34, + LfgPartyInfo = 0x2a36, + LfgPlayerInfo = 0x2a37, + LfgPlayerReward = 0x2a38, LfgProposalUpdate = 0x2a2d, LfgQueueStatus = 0x2a20, - LfgReadyCheckResult = 0x2a3b, + LfgReadyCheckResult = 0x2a3a, LfgReadyCheckUpdate = 0x2a22, LfgRoleCheckUpdate = 0x2a21, LfgSlotInvalid = 0x2a30, - LfgTeleportDenied = 0x2a33, + LfgTeleportDenied = 0x2a32, LfgUpdateStatus = 0x2a24, LfGuildApplicantListChanged = 0x29d5, LfGuildApplications = 0x29d1, @@ -1218,45 +1221,44 @@ namespace Framework.Constants LfGuildCommandResult = 0x29d0, LfGuildPost = 0x29cd, LfGuildRecruits = 0x29cf, - LiveRegionAccountRestoreResult = 0x27b2, - LiveRegionCharacterCopyResult = 0x27b0, - LiveRegionGetAccountCharacterListResult = 0x27a5, + LiveRegionAccountRestoreResult = 0x27b1, + LiveRegionCharacterCopyResult = 0x27af, + LiveRegionGetAccountCharacterListResult = 0x27a4, LoadCufProfiles = 0x25ce, - LoadEquipmentSet = 0x274e, - LoadSelectedTrophyResult = 0x280a, - LoginSetTimeSpeed = 0x274d, + LoadEquipmentSet = 0x274d, + LoadSelectedTrophyResult = 0x2809, + LoginSetTimeSpeed = 0x274c, LoginVerifyWorld = 0x25ac, - LogoutCancelAck = 0x26af, - LogoutComplete = 0x26ae, - LogoutResponse = 0x26ad, - LogXpGain = 0x271c, - LootAllPassed = 0x2636, - LootItemList = 0x2634, - LootList = 0x2784, + LogoutCancelAck = 0x26ae, + LogoutComplete = 0x26ad, + LogoutResponse = 0x26ac, + LogXpGain = 0x271b, + LootAllPassed = 0x2635, + LootList = 0x2783, LootMoneyNotify = 0x2630, LootRelease = 0x262f, LootReleaseAll = 0x262e, LootRemoved = 0x2629, LootResponse = 0x2628, LootRoll = 0x2632, - LootRollsComplete = 0x2635, - LootRollWon = 0x2637, - LossOfControlAuraUpdate = 0x2696, - MailCommandResult = 0x2659, - MailListResult = 0x2799, - MailQueryNextTimeResult = 0x279a, - MapObjectivesInit = 0x27a2, + LootRollsComplete = 0x2634, + LootRollWon = 0x2636, + LossOfControlAuraUpdate = 0x2695, + MailCommandResult = 0x2658, + MailListResult = 0x2798, + MailQueryNextTimeResult = 0x2799, + MapObjectivesInit = 0x27a1, MapObjEvents = 0x25d9, MasterLootCandidateList = 0x2633, MessageBox = 0x2575, - MinimapPing = 0x26f8, + MinimapPing = 0x26f7, MirrorImageComponentedData = 0x2c14, MirrorImageCreatureData = 0x2c13, MissileCancel = 0x25da, - ModifyChargeRecoverySpeed = 0x27a9, - ModifyCooldown = 0x27a7, - ModifyCooldownRecoverySpeed = 0x27a8, - ModifyPartyRange = 0x2787, + ModifyChargeRecoverySpeed = 0x27a8, + ModifyCooldown = 0x27a6, + ModifyCooldownRecoverySpeed = 0x27a7, + ModifyPartyRange = 0x2786, Motd = 0x2baf, MountResult = 0x257a, MoveApplyMovementForce = 0x2de1, @@ -1342,40 +1344,41 @@ namespace Framework.Constants MoveUpdateTurnRate = 0x2dab, MoveUpdateWalkSpeed = 0x2da6, NeutralPlayerFactionSelectResult = 0x25f1, - NewTaxiPath = 0x26a8, + NewTaxiPath = 0x26a7, NewWorld = 0x25ab, - NotifyDestLocSpellCast = 0x2c42, - NotifyMissileTrajectoryCollision = 0x26d2, + NotifyDestLocSpellCast = 0x2c43, + NotifyMissileTrajectoryCollision = 0x26d1, NotifyMoney = 0x25ae, - NotifyReceivedMail = 0x265a, - OfferPetitionError = 0x26e1, - OnCancelExpectedRideVehicleAura = 0x271d, + NotifyReceivedMail = 0x2659, + OfferPetitionError = 0x26e0, + OnCancelExpectedRideVehicleAura = 0x271c, OnMonsterMove = 0x2da2, - OpenContainer = 0x2765, - OpenLfgDungeonFinder = 0x2a32, - OpenShipmentNpcFromGossip = 0x27db, - OpenShipmentNpcResult = 0x27dd, - OpenTransmogrifier = 0x2837, - OverrideLight = 0x26e7, - PageText = 0x275a, - PartyCommandResult = 0x27d8, + OpenAlliedRaceDetailsGiver = 0x2837, + OpenContainer = 0x2764, + OpenLfgDungeonFinder = 0x2a31, + OpenShipmentNpcFromGossip = 0x27da, + OpenShipmentNpcResult = 0x27dc, + OpenTransmogrifier = 0x2836, + OverrideLight = 0x26e6, + PageText = 0x2759, + PartyCommandResult = 0x27d7, PartyInvite = 0x25cf, - PartyKillLog = 0x279e, - PartyMemberState = 0x279c, - PartyMemberStateUpdate = 0x279b, + PartyKillLog = 0x279d, + PartyMemberState = 0x279b, + PartyMemberStateUpdate = 0x279a, PartyUpdate = 0x260b, - PauseMirrorTimer = 0x2750, - PendingRaidLock = 0x2731, + PauseMirrorTimer = 0x274f, + PendingRaidLock = 0x2730, PetitionAlreadySigned = 0x25b8, PetitionRenameGuildResponse = 0x29f7, - PetitionShowList = 0x26ea, - PetitionShowSignatures = 0x26eb, - PetitionSignResults = 0x2790, - PetActionFeedback = 0x278e, - PetActionSound = 0x26ca, + PetitionShowList = 0x26e9, + PetitionShowSignatures = 0x26ea, + PetitionSignResults = 0x278f, + PetActionFeedback = 0x278d, + PetActionSound = 0x26c9, PetAdded = 0x25a8, PetBattleChatRestricted = 0x2618, - PetBattleDebugQueueDumpResponse = 0x269d, + PetBattleDebugQueueDumpResponse = 0x269c, PetBattleFinalizeLocation = 0x2611, PetBattleFinalRound = 0x2616, PetBattleFinished = 0x2617, @@ -1383,68 +1386,68 @@ namespace Framework.Constants PetBattleInitialUpdate = 0x2612, PetBattleMaxGameLengthWarning = 0x2619, PetBattlePvpChallenge = 0x2610, - PetBattleQueueProposeMatch = 0x2657, - PetBattleQueueStatus = 0x2658, + PetBattleQueueProposeMatch = 0x2656, + PetBattleQueueStatus = 0x2657, PetBattleReplacementsMade = 0x2615, PetBattleRequestFailed = 0x260f, PetBattleRoundResult = 0x2614, PetBattleSlotUpdates = 0x2602, - PetCastFailed = 0x2c56, + PetCastFailed = 0x2c57, PetClearSpells = 0x2c24, - PetDismissSound = 0x26cb, - PetGodMode = 0x26a5, - PetGuids = 0x2742, - PetLearnedSpells = 0x2c4e, + PetDismissSound = 0x26ca, + PetGodMode = 0x26a4, + PetGuids = 0x2741, + PetLearnedSpells = 0x2c4f, PetMode = 0x2589, - PetNameInvalid = 0x26ef, + PetNameInvalid = 0x26ee, PetSlotUpdated = 0x2588, PetSpellsMessage = 0x2c25, PetStableList = 0x25a9, PetStableResult = 0x25aa, - PetTameFailure = 0x26de, - PetUnlearnedSpells = 0x2c4f, + PetTameFailure = 0x26dd, + PetUnlearnedSpells = 0x2c50, PhaseShiftChange = 0x2577, - PlayedTime = 0x2709, + PlayedTime = 0x2708, PlayerBound = 0x257d, PlayerSaveGuildEmblem = 0x29f6, - PlayerSkinned = 0x2789, - PlayerTabardVendorActivate = 0x279d, - PlayMusic = 0x27ac, - PlayObjectSound = 0x27ad, - PlayOneShotAnimKit = 0x2773, - PlayOrphanSpellVisual = 0x2c46, - PlayScene = 0x2654, - PlaySound = 0x27ab, - PlaySpeakerbotSound = 0x27ae, - PlaySpellVisual = 0x2c44, - PlaySpellVisualKit = 0x2c48, - PlayTimeWarning = 0x273b, + PlayerSkinned = 0x2788, + PlayerTabardVendorActivate = 0x279c, + PlayMusic = 0x27ab, + PlayObjectSound = 0x27ac, + PlayOneShotAnimKit = 0x2772, + PlayOrphanSpellVisual = 0x2c47, + PlayScene = 0x2653, + PlaySound = 0x27aa, + PlaySpeakerbotSound = 0x27ad, + PlaySpellVisual = 0x2c45, + PlaySpellVisualKit = 0x2c49, + PlayTimeWarning = 0x273a, Pong = 0x304e, - PowerUpdate = 0x26fe, - PrestigeAndHonorInvoluntarilyChanged = 0x2759, - PreRessurect = 0x27aa, + PowerUpdate = 0x26fd, + PrestigeAndHonorInvoluntarilyChanged = 0x2758, + PreRessurect = 0x27a9, PrintNotification = 0x25e1, - ProcResist = 0x279f, - ProposeLevelGrant = 0x2711, - PushSpellToActionBar = 0x2c50, - PvpCredit = 0x2717, + ProcResist = 0x279e, + ProposeLevelGrant = 0x2710, + PushSpellToActionBar = 0x2c51, + PvpCredit = 0x2716, PvpLogData = 0x25b3, PvpOptionsEnabled = 0x25b6, PvpSeason = 0x25d3, - QueryBattlePetNameResponse = 0x2704, - QueryCreatureResponse = 0x26fb, - QueryGameObjectResponse = 0x26fc, + QueryBattlePetNameResponse = 0x2703, + QueryCreatureResponse = 0x26fa, + QueryGameObjectResponse = 0x26fb, QueryGarrisonCreatureNameResponse = 0x292b, QueryGuildInfoResponse = 0x29e5, - QueryItemTextResponse = 0x280b, - QueryNpcTextResponse = 0x26ff, - QueryPageTextResponse = 0x2701, - QueryPetitionResponse = 0x2705, - QueryPetNameResponse = 0x2703, - QueryPlayerNameResponse = 0x2700, + QueryItemTextResponse = 0x280a, + QueryNpcTextResponse = 0x26fe, + QueryPageTextResponse = 0x2700, + QueryPetitionResponse = 0x2704, + QueryPetNameResponse = 0x2702, + QueryPlayerNameResponse = 0x26ff, QueryQuestInfoResponse = 0x2a95, QueryQuestRewardResponse = 0x2846, - QueryTimeResponse = 0x271b, + QueryTimeResponse = 0x271a, QuestCompletionNpcResponse = 0x2a81, QuestConfirmAccept = 0x2a8e, QuestForceRemoved = 0x2a9b, @@ -1470,56 +1473,57 @@ namespace Framework.Constants QuestUpdateCompleteBySpell = 0x2a87, QuestUpdateFailed = 0x2a89, QuestUpdateFailedTimer = 0x2a8a, - RafEmailEnabledResponse = 0x27c9, - RaidDifficultySet = 0x27f0, - RaidGroupOnly = 0x27f2, + RafEmailEnabledResponse = 0x27c8, + RaidDifficultySet = 0x27ef, + RaidGroupOnly = 0x27f1, RaidInstanceMessage = 0x2bb4, RaidMarkersChanged = 0x25b9, - RandomRoll = 0x264d, + RandomRoll = 0x264c, RatedBattlefieldInfo = 0x25a6, ReadyCheckCompleted = 0x260e, ReadyCheckResponse = 0x260d, ReadyCheckStarted = 0x260c, - ReadItemResultFailed = 0x27ec, - ReadItemResultOk = 0x27e2, - RealmQueryResponse = 0x26e6, - RecruitAFriendResponse = 0x27ca, - ReferAFriendExpired = 0x2763, - ReferAFriendFailure = 0x26ec, - RefreshComponent = 0x2679, + ReadItemResultFailed = 0x27eb, + ReadItemResultOk = 0x27e1, + RealmLookupInformation = 0x2810, + RealmQueryResponse = 0x26e5, + RecruitAFriendResponse = 0x27c9, + ReferAFriendExpired = 0x2762, + ReferAFriendFailure = 0x26eb, + RefreshComponent = 0x2678, RefreshSpellHistory = 0x2c2c, RemoveItemPassive = 0x25c0, - RemoveLossOfControl = 0x2698, - ReplaceTrophyResponse = 0x2808, - ReportPvpPlayerAfkResult = 0x26da, - RequestAddonList = 0x2660, + RemoveLossOfControl = 0x2697, + ReplaceTrophyResponse = 0x2807, + ReportPvpPlayerAfkResult = 0x26d9, + RequestAddonList = 0x265f, RequestCemeteryListResponse = 0x259d, RequestPvpBrawlInfoResponse = 0x25d5, RequestPvpRewardsResponse = 0x25d4, ResearchComplete = 0x2585, - ResetAreaTrigger = 0x2641, + ResetAreaTrigger = 0x2640, ResetCompressionContext = 0x304f, - ResetFailedNotify = 0x26e2, - ResetRangedCombatTimer = 0x2714, + ResetFailedNotify = 0x26e1, + ResetRangedCombatTimer = 0x2713, ResetWeeklyCurrency = 0x2574, RespecWipeConfirm = 0x2626, RespondInspectAchievements = 0x2571, - ResumeCastBar = 0x2c3d, + ResumeCastBar = 0x2c3e, ResumeComms = 0x304b, ResumeToken = 0x25be, ResurrectRequest = 0x257e, - ResyncRunes = 0x273e, + ResyncRunes = 0x273d, RoleChangedInform = 0x258c, - RoleChosen = 0x2a3a, + RoleChosen = 0x2a39, RolePollInform = 0x258d, RuneRegenDebug = 0x25c8, - ScenarioBoot = 0x27ed, - ScenarioCompleted = 0x282d, - ScenarioPois = 0x2650, - ScenarioProgressUpdate = 0x2649, + ScenarioBoot = 0x27ec, + ScenarioCompleted = 0x282c, + ScenarioPois = 0x264f, + ScenarioProgressUpdate = 0x2648, ScenarioSetShouldShowCriteria = 0x283a, ScenarioSpellUpdate = 0x2839, - ScenarioState = 0x2648, + ScenarioState = 0x2647, SceneObjectEvent = 0x25f7, SceneObjectPetBattleFinalRound = 0x25fc, SceneObjectPetBattleFinished = 0x25fd, @@ -1527,149 +1531,150 @@ namespace Framework.Constants SceneObjectPetBattleInitialUpdate = 0x25f8, SceneObjectPetBattleReplacementsMade = 0x25fb, SceneObjectPetBattleRoundResult = 0x25fa, - ScriptCast = 0x2c54, - SellResponse = 0x26f0, + ScriptCast = 0x2c55, + SellResponse = 0x26ef, SendItemPassives = 0x25c1, SendKnownSpells = 0x2c2a, - SendRaidTargetUpdateAll = 0x264b, - SendRaidTargetUpdateSingle = 0x264c, + SendRaidTargetUpdateAll = 0x264a, + SendRaidTargetUpdateSingle = 0x264b, SendSpellCharges = 0x2c2d, SendSpellHistory = 0x2c2b, SendUnlearnSpells = 0x2c2e, ServerFirstAchievement = 0x2bbc, - ServerFirstAchievements = 0x266b, - ServerTime = 0x26ac, + ServerFirstAchievements = 0x266a, + ServerTime = 0x26ab, SetupCurrency = 0x2572, SetupResearchHistory = 0x2584, - SetAiAnimKit = 0x2772, - SetAllTaskProgress = 0x27d2, - SetAnimTier = 0x2776, + SetAiAnimKit = 0x2771, + SetAllTaskProgress = 0x27d1, + SetAnimTier = 0x2775, SetCurrency = 0x2573, SetDfFastLaunchResult = 0x2a2e, - SetDungeonDifficulty = 0x26ce, - SetFactionAtWar = 0x273d, - SetFactionNotVisible = 0x276d, - SetFactionStanding = 0x276e, - SetFactionVisible = 0x276c, + SetDungeonDifficulty = 0x26cd, + SetFactionAtWar = 0x273c, + SetFactionNotVisible = 0x276c, + SetFactionStanding = 0x276d, + SetFactionVisible = 0x276b, SetFlatSpellModifier = 0x2c36, - SetForcedReactions = 0x275d, + SetForcedReactions = 0x275c, SetItemPurchaseData = 0x25b0, - SetLootMethodFailed = 0x2817, + SetLootMethodFailed = 0x2816, SetMaxWeeklyQuantity = 0x25b7, - SetMeleeAnimKit = 0x2775, - SetMovementAnimKit = 0x2774, + SetMeleeAnimKit = 0x2774, + SetMovementAnimKit = 0x2773, SetPctSpellModifier = 0x2c37, - SetPetSpecialization = 0x2642, - SetPlayerDeclinedNamesResult = 0x2708, + SetPetSpecialization = 0x2641, + SetPlayerDeclinedNamesResult = 0x2707, SetPlayHoverAnim = 0x25cc, - SetProficiency = 0x2777, + SetProficiency = 0x2776, SetSpellCharges = 0x2c29, - SetTaskComplete = 0x27d3, - SetTimeZoneInformation = 0x26a0, - SetVehicleRecId = 0x2730, - ShowAdventureMap = 0x2836, - ShowBank = 0x26a9, - ShowMailbox = 0x27ee, + SetTaskComplete = 0x27d2, + SetTimeZoneInformation = 0x269f, + SetVehicleRecId = 0x272f, + ShowAdventureMap = 0x2835, + ShowBank = 0x26a8, + ShowMailbox = 0x27ed, ShowNeutralPlayerFactionSelectUi = 0x25f0, - ShowTaxiNodes = 0x26f7, - ShowTradeSkillResponse = 0x27b3, - SocketGems = 0x2769, - SocketGemsFailure = 0x276a, - SortBagsResult = 0x2825, + ShowTaxiNodes = 0x26f6, + ShowTradeSkillResponse = 0x27b2, + SocketGems = 0x2768, + SocketGemsFailure = 0x2769, + SortBagsResult = 0x2824, SorStartExperienceIncomplete = 0x25f2, SpecializationChanged = 0x25ec, - SpecialMountAnim = 0x26c9, - SpecInvoluntarilyChanged = 0x2758, + SpecialMountAnim = 0x26c8, + SpecInvoluntarilyChanged = 0x2757, SpellAbsorbLog = 0x2c1f, SpellCategoryCooldown = 0x2c17, SpellChannelStart = 0x2c34, SpellChannelUpdate = 0x2c35, SpellCooldown = 0x2c15, SpellDamageShield = 0x2c31, - SpellDelayed = 0x2c3e, + SpellDelayed = 0x2c3f, SpellDispellLog = 0x2c1a, SpellEnergizeLog = 0x2c1c, - SpellExecuteLog = 0x2c3f, - SpellFailedOther = 0x2c53, - SpellFailure = 0x2c51, - SpellFailureMessage = 0x2c58, + SpellExecuteLog = 0x2c40, + SpellFailedOther = 0x2c54, + SpellFailure = 0x2c52, + SpellFailureMessage = 0x2c59, SpellGo = 0x2c39, SpellHealAbsorbLog = 0x2c1e, SpellHealLog = 0x2c1d, SpellInstakillLog = 0x2c33, SpellInterruptLog = 0x2c20, - SpellMissLog = 0x2c40, + SpellMissLog = 0x2c41, SpellNonMeleeDamageLog = 0x2c32, SpellOrDamageImmune = 0x2c2f, SpellPeriodicAuraLog = 0x2c1b, SpellPrepare = 0x2c38, SpellStart = 0x2c3a, - SpiritHealerConfirm = 0x2755, - StandStateUpdate = 0x275c, + SpiritHealerConfirm = 0x2754, + StandStateUpdate = 0x275b, StartElapsedTimer = 0x261a, StartElapsedTimers = 0x261c, StartLootRoll = 0x2631, - StartMirrorTimer = 0x274f, + StartMirrorTimer = 0x274e, StartTimer = 0x25bb, StopElapsedTimer = 0x261b, - StopMirrorTimer = 0x2751, - StopSpeakerbotSound = 0x27af, + StopMirrorTimer = 0x2750, + StopSpeakerbotSound = 0x27ae, StreamingMovies = 0x25ba, - SummonCancel = 0x26d9, + SummonCancel = 0x26d8, SummonRaidMemberValidateFailed = 0x258e, - SummonRequest = 0x2761, - SupercededSpells = 0x2c4b, + SummonRequest = 0x2760, + SupercededSpells = 0x2c4c, SuspendComms = 0x304a, SuspendToken = 0x25bd, - TalentsInvoluntarilyReset = 0x2757, - TaxiNodeStatus = 0x26a6, - TextEmote = 0x26a4, - ThreatClear = 0x2710, - ThreatRemove = 0x270f, - ThreatUpdate = 0x270e, + TalentsInvoluntarilyReset = 0x2756, + TaxiNodeStatus = 0x26a5, + TextEmote = 0x26a3, + ThreatClear = 0x270f, + ThreatRemove = 0x270e, + ThreatUpdate = 0x270d, TimeAdjustment = 0x2da1, TimeSyncRequest = 0x2da0, - TitleEarned = 0x270b, - TitleLost = 0x270c, - TotemCreated = 0x26f3, - TotemMoved = 0x26f4, + TitleEarned = 0x270a, + TitleLost = 0x270b, + TotemCreated = 0x26f2, + TotemMoved = 0x26f3, TradeStatus = 0x2581, TradeUpdated = 0x2580, - TrainerBuyFailed = 0x2716, - TrainerList = 0x2715, - TransferAborted = 0x2741, + TrainerBuyFailed = 0x2715, + TrainerList = 0x2714, + TransferAborted = 0x2740, TransferPending = 0x25e5, TransmogCollectionUpdate = 0x25c6, TransmogSetCollectionUpdate = 0x25c7, - TriggerCinematic = 0x280f, - TriggerMovie = 0x26f5, - TurnInPetitionResult = 0x2792, - TutorialFlags = 0x2801, + TriggerCinematic = 0x280e, + TriggerMovie = 0x26f4, + TurnInPetitionResult = 0x2791, + TutorialFlags = 0x2800, TutorialHighlightSpell = 0x2840, TutorialUnhighlightSpell = 0x283f, TwitterStatus = 0x2ffd, - UiTime = 0x2754, - UndeleteCharacterResponse = 0x2812, - UndeleteCooldownStatusResponse = 0x2813, - UnlearnedSpells = 0x2c4d, - UpdateAccountData = 0x2749, + UiTime = 0x2753, + UndeleteCharacterResponse = 0x2811, + UndeleteCooldownStatusResponse = 0x2812, + UnlearnedSpells = 0x2c4e, + UpdateAccountData = 0x2748, UpdateActionButtons = 0x25f5, - UpdateCharacterFlags = 0x2807, - UpdateDungeonEncounterForLoot = 0x2a31, - UpdateExpansionLevel = 0x2664, - UpdateInstanceOwnership = 0x26d1, - UpdateLastInstance = 0x26b2, - UpdateObject = 0x2810, + UpdateCelestialBody = 0x285e, + UpdateCharacterFlags = 0x2806, + UpdateExpansionLevel = 0x2663, + UpdateGameTimeState = 0x2865, + UpdateInstanceOwnership = 0x26d0, + UpdateLastInstance = 0x26b1, + UpdateObject = 0x280f, UpdateTalentData = 0x25eb, - UpdateTaskProgress = 0x27d1, + UpdateTaskProgress = 0x27d0, UpdateWeeklySpellUsage = 0x2c19, - UpdateWorldState = 0x278d, + UpdateWorldState = 0x278c, UserlistAdd = 0x2bb9, UserlistRemove = 0x2bba, UserlistUpdate = 0x2bbb, - UseEquipmentSetResult = 0x2793, + UseEquipmentSetResult = 0x2792, VendorInventory = 0x25ca, - VignetteUpdate = 0x27b1, + VignetteUpdate = 0x27b0, VoidItemSwapResponse = 0x25df, VoidStorageContents = 0x25dc, VoidStorageFailed = 0x25db, @@ -1679,29 +1684,29 @@ namespace Framework.Constants WaitQueueUpdate = 0x256d, WardenData = 0x2576, WargameRequestSuccessfullySentToOpponent = 0x25b4, - Weather = 0x26d0, + Weather = 0x26cf, WeeklySpellUsage = 0x2c18, Who = 0x2bae, - WhoIs = 0x26cf, + WhoIs = 0x26ce, WorldQuestUpdate = 0x2847, WorldServerInfo = 0x25c2, - WorldText = 0x282f, - WowTokenAuctionSold = 0x281d, - WowTokenBuyRequestConfirmation = 0x281f, - WowTokenBuyResultConfirmation = 0x2820, + WorldText = 0x282e, + WowTokenAuctionSold = 0x281c, + WowTokenBuyRequestConfirmation = 0x281e, + WowTokenBuyResultConfirmation = 0x281f, WowTokenCanRedeemForBalanceResult = 0x2856, - WowTokenCanVeteranBuyResult = 0x281e, - WowTokenDistributionGlueUpdate = 0x2818, - WowTokenDistributionUpdate = 0x2819, - WowTokenMarketPriceResponse = 0x281a, - WowTokenRedeemGameTimeUpdated = 0x2821, - WowTokenRedeemRequestConfirmation = 0x2822, - WowTokenRedeemResult = 0x2823, - WowTokenSellRequestConfirmation = 0x281b, - WowTokenSellResultConfirmation = 0x281c, - WowTokenUpdateAuctionableListResponse = 0x2824, + WowTokenCanVeteranBuyResult = 0x281d, + WowTokenDistributionGlueUpdate = 0x2817, + WowTokenDistributionUpdate = 0x2818, + WowTokenMarketPriceResponse = 0x2819, + WowTokenRedeemGameTimeUpdated = 0x2820, + WowTokenRedeemRequestConfirmation = 0x2821, + WowTokenRedeemResult = 0x2822, + WowTokenSellRequestConfirmation = 0x281a, + WowTokenSellResultConfirmation = 0x281b, + WowTokenUpdateAuctionableListResponse = 0x2823, XpGainAborted = 0x25e0, - XpGainEnabled = 0x27f1, + XpGainEnabled = 0x27f0, ZoneUnderAttack = 0x2bb5, // Opcodes that are not generated automatically diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index af004a457..4a87b6083 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -101,6 +101,7 @@ namespace Framework.Constants public const byte FieldBytes2OffsetIgnorePowerRegenPredictionMask = 0; public const byte FieldBytes2OffsetAuraVision = 1; + public const byte FieldBytes2OffsetNumBackpackSlots = 2; public const byte FieldBytes3OffsetOverrideSpellsId = 2; // Uint16! public const byte FieldBytes3OffsetOverrideSpellsIdUint16Offset = FieldBytes3OffsetOverrideSpellsId / 2; @@ -485,14 +486,17 @@ namespace Framework.Constants public enum PlayerLocalFlags { + ControllingPet = 0x01, // Displays "You have an active summon already" when trying to tame new pet TrackStealthed = 0x02, ReleaseTimer = 0x08, // Display time till auto release spirit NoReleaseWindow = 0x10, // Display no "release spirit" window at all - NoPetBar = 0x00000020, // CGPetInfo::IsPetBarUsed - OverrideCameraMinHeight = 0x00000040, - UsingPartGarrison = 0x00000100, - CanUseObjectsMounted = 0x00000200, - CanVisitPartyGarrison = 0x00000400 + NoPetBar = 0x20, // CGPetInfo::IsPetBarUsed + OverrideCameraMinHeight = 0x40, + NewlyBosstedCharacter = 0x80, + UsingPartGarrison = 0x100, + CanUseObjectsMounted = 0x200, + CanVisitPartyGarrison = 0x400, + AccountSecured = 0x1000 // Script_IsAccountSecured } public enum PlayerFieldByte2Flags @@ -572,7 +576,7 @@ 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 = 187, + End = 195, Count = (End - Start) } diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 112d97cc4..e0321caea 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -526,7 +526,12 @@ namespace Framework.Constants MistsOfPandaria = 4, WarlordsOfDraenor = 5, Legion = 6, - Max + Max, + + // future expansion + BattleForAzeroth = 7, + + MaxAccountExpansions } public enum PowerType : byte { @@ -2302,7 +2307,8 @@ namespace Framework.Constants QuestTurnInFailReason = 983, ClaimedChallengeModeRewardOld = 984, TalentGrantedByAura = 985, - ChallengeModeAlreadyComplete = 986 + ChallengeModeAlreadyComplete = 986, + GlyphTargetNotAvailable = 987 } public enum SceneFlags diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs index 1651bab39..9081038f7 100644 --- a/Source/Framework/Constants/Spells/SpellConst.cs +++ b/Source/Framework/Constants/Spells/SpellConst.cs @@ -1051,6 +1051,19 @@ namespace Framework.Constants MustBeStandingNearInjuredChromieInMountHyjal = 340, // Must Be Standing Near The Injured Chromie In Mount Hyjal. RemoveCannonsHeavyIronPlatingFirst = 342, // You Should Remove The Cannon'S Heavy Iron Plating First. RemoveCannonsElectrokineticDefenseGridFirst = 343, // You Should Remove The Cannon'S Electrokinetic Defense Grid First. + RequiresTheArmoryKeyAndDendriteClusters = 344, // You Are Missing Pieces Of The Armory Key Or Do Not Have Enough Dendrite Clusters. + ThisItemRequiresBasicObliterumToUpgrade = 345, // This Item Requires Basic Obliterum To Upgrade. + ThisItemRequiresPrimalObliterumToUpgrade = 346, // This Item Requires Primal Obliterum To Upgrade. + ThisItemRequiresFlightMastersWhistle = 347, // This Item Requires A Flight Master'S Whistle. + RequiresPowerThatEchoesThatOfTheAugari = 349, // Will Only Open To One Wielding The Power That Echoes That Of The Augari. + ThatPlayerHasAPendingTotemicRevival = 350, // That Player Has A Pending Totemic Revival. + YouHaveNoFireMinesDeployed = 351, // You Have No Fire Mines Deployed. + YouAreBlockedByAStructureAboveYou = 353, // You Are Blocked By A Structure Above You. + Requires100ImpMeat = 354, // Requires 100 Imp Meat. + YouHaveNotObtainedAnyBackgroundFilters = 355, // You Have Not Obtained Any Background Filters. + NothingInterestingPostedHereRightNow = 356, // There Is Nothing Interesting Posted Here Right Now. + ParagonReputationRequiresHigherLevel = 357, // Paragon Reputation Is Not Available Until A Higher Level. + UunaIsMissing = 358, // Uuna Is Missing. } public enum SpellMissInfo diff --git a/Source/Framework/Constants/Update/UpdateFieldFlags.cs b/Source/Framework/Constants/Update/UpdateFieldFlags.cs index 87bc4d0c4..7984c883b 100644 --- a/Source/Framework/Constants/Update/UpdateFieldFlags.cs +++ b/Source/Framework/Constants/Update/UpdateFieldFlags.cs @@ -363,6 +363,7 @@ namespace Framework.Constants Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+5 Public, // UNIT_FIELD_LEVEL Public, // UNIT_FIELD_EFFECTIVE_LEVEL + Public, // UNIT_FIELD_SANDBOX_SCALING_ID Public, // UNIT_FIELD_SCALING_LEVEL_MIN Public, // UNIT_FIELD_SCALING_LEVEL_MAX Public, // UNIT_FIELD_SCALING_LEVEL_DELTA @@ -2110,6 +2111,39 @@ namespace Framework.Constants Private, // PLAYER_FIELD_INV_SLOT_HEAD+745 Private, // PLAYER_FIELD_INV_SLOT_HEAD+746 Private, // PLAYER_FIELD_INV_SLOT_HEAD+747 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+748 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+749 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+750 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+751 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+752 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+753 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+754 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+755 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+756 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+757 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+758 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+759 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+760 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+761 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+762 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+763 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+764 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+765 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+766 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+767 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+768 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+769 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+770 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+771 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+772 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+773 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+774 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+775 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+776 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+777 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+778 + Private, // PLAYER_FIELD_INV_SLOT_HEAD+779 + Private, // PLAYER_FARSIGHT Private, // PLAYER_FARSIGHT+1 Private, // PLAYER_FARSIGHT+2 @@ -2134,6 +2168,7 @@ namespace Framework.Constants Private, // PLAYER_FIELD_COINAGE+1 Private, // PLAYER_XP Private, // PLAYER_NEXT_LEVEL_XP + Private, // PLAYER_TRIAL_XP Private, // PLAYER_SKILL_LINEID Private, // PLAYER_SKILL_LINEID+1 Private, // PLAYER_SKILL_LINEID+2 @@ -2973,7 +3008,6 @@ namespace Framework.Constants Private, // PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE Private, // PLAYER_FIELD_LOCAL_FLAGS Private, // PLAYER_FIELD_BYTES - Private, // PLAYER_SELF_RES_SPELL Private, // PLAYER_FIELD_PVP_MEDALS Private, // PLAYER_FIELD_BUYBACK_PRICE_1 Private, // PLAYER_FIELD_BUYBACK_PRICE_1+1 @@ -4885,6 +4919,7 @@ namespace Framework.Constants Private, // PLAYER_DYNAMIC_FIELD_TOYS Private, // PLAYER_DYNAMIC_FIELD_TRANSMOG Private, // PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG + Private, // PLAYER_DYNAMIC_FIELD_SELF_RES_SPELLS Private, // PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS Private, // PLAYER_DYNAMIC_FIELD_SPELL_PCT_MOD_BY_LABEL Private, // PLAYER_DYNAMIC_FIELD_SPELL_FLAT_MOD_BY_LABEL diff --git a/Source/Framework/Constants/Update/UpdateFields.cs b/Source/Framework/Constants/Update/UpdateFields.cs index a85ece4b0..aa7ecb316 100644 --- a/Source/Framework/Constants/Update/UpdateFields.cs +++ b/Source/Framework/Constants/Update/UpdateFields.cs @@ -93,81 +93,83 @@ namespace Framework.Constants PowerRegenInterruptedFlatModifier = ObjectFields.End + 0x042, // Size: 6, Flags: Private, Owner, UnitAll Level = ObjectFields.End + 0x048, // Size: 1, Flags: Public EffectiveLevel = ObjectFields.End + 0x049, // Size: 1, Flags: Public - ScalingLevelMin = ObjectFields.End + 0x04a, // Size: 1, Flags: Public - ScalingLevelMax = ObjectFields.End + 0x04b, // Size: 1, Flags: Public - ScalingLevelDelta = ObjectFields.End + 0x04c, // Size: 1, Flags: Public - FactionTemplate = ObjectFields.End + 0x04d, // Size: 1, Flags: Public - VirtualItemSlotId = ObjectFields.End + 0x04e, // Size: 6, Flags: Public - Flags = ObjectFields.End + 0x054, // Size: 1, Flags: Public, Urgent - Flags2 = ObjectFields.End + 0x055, // Size: 1, Flags: Public, Urgent - Flags3 = ObjectFields.End + 0x056, // Size: 1, Flags: Public, Urgent - AuraState = ObjectFields.End + 0x057, // Size: 1, Flags: Public - BaseAttackTime = ObjectFields.End + 0x058, // Size: 2, Flags: Public - RangedAttackTime = ObjectFields.End + 0x05a, // Size: 1, Flags: Private - BoundingRadius = ObjectFields.End + 0x05b, // Size: 1, Flags: Public - CombatReach = ObjectFields.End + 0x05c, // Size: 1, Flags: Public - DisplayId = ObjectFields.End + 0x05d, // Size: 1, Flags: Dynamic, Urgent - NativeDisplayId = ObjectFields.End + 0x05e, // Size: 1, Flags: Public, Urgent - MountDisplayId = ObjectFields.End + 0x05f, // Size: 1, Flags: Public, Urgent - MinDamage = ObjectFields.End + 0x060, // Size: 1, Flags: Private, Owner, SpecialInfo - MaxDamage = ObjectFields.End + 0x061, // Size: 1, Flags: Private, Owner, SpecialInfo - MinOffHandDamage = ObjectFields.End + 0x062, // Size: 1, Flags: Private, Owner, SpecialInfo - MaxOffHandDamage = ObjectFields.End + 0x063, // Size: 1, Flags: Private, Owner, SpecialInfo - Bytes1 = ObjectFields.End + 0x064, // Size: 1, Flags: Public - PetNumber = ObjectFields.End + 0x065, // Size: 1, Flags: Public - PetNameTimestamp = ObjectFields.End + 0x066, // Size: 1, Flags: Public - PetExperience = ObjectFields.End + 0x067, // Size: 1, Flags: Owner - PetNextLevelExp = ObjectFields.End + 0x068, // Size: 1, Flags: Owner - ModCastSpeed = ObjectFields.End + 0x069, // Size: 1, Flags: Public - ModCastHaste = ObjectFields.End + 0x06a, // Size: 1, Flags: Public - ModHaste = ObjectFields.End + 0x06b, // Size: 1, Flags: Public - ModRangedHaste = ObjectFields.End + 0x06c, // Size: 1, Flags: Public - ModHasteRegen = ObjectFields.End + 0x06d, // Size: 1, Flags: Public - ModTimeRate = ObjectFields.End + 0x06e, // Size: 1, Flags: Public - CreatedBySpell = ObjectFields.End + 0x06f, // Size: 1, Flags: Public - NpcFlags = ObjectFields.End + 0x070, // Size: 2, Flags: Public, Dynamic - NpcEmotestate = ObjectFields.End + 0x072, // Size: 1, Flags: Public - Stat = ObjectFields.End + 0x073, // Size: 4, Flags: Private, Owner - PosStat = ObjectFields.End + 0x077, // Size: 4, Flags: Private, Owner - NegStat = ObjectFields.End + 0x07b, // Size: 4, Flags: Private, Owner - Resistances = ObjectFields.End + 0x07f, // Size: 7, Flags: Private, Owner, SpecialInfo - ResistanceBuffModsPositive = ObjectFields.End + 0x086, // Size: 7, Flags: Private, Owner - ResistanceBuffModsNegative = ObjectFields.End + 0x08d, // Size: 7, Flags: Private, Owner - ModBonusArmor = ObjectFields.End + 0x094, // Size: 1, Flags: Private, Owner - BaseMana = ObjectFields.End + 0x095, // Size: 1, Flags: Public - BaseHealth = ObjectFields.End + 0x096, // Size: 1, Flags: Private, Owner - Bytes2 = ObjectFields.End + 0x097, // Size: 1, Flags: Public - AttackPower = ObjectFields.End + 0x098, // Size: 1, Flags: Private, Owner - AttackPowerModPos = ObjectFields.End + 0x099, // Size: 1, Flags: Private, Owner - AttackPowerModNeg = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner - AttackPowerMultiplier = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner - RangedAttackPower = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner - RangedAttackPowerModPos = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner - RangedAttackPowerModNeg = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner - RangedAttackPowerMultiplier = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner - AttackSpeedAura = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner - MinRangedDamage = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner - MaxRangedDamage = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner - PowerCostModifier = ObjectFields.End + 0x0a3, // Size: 7, Flags: Private, Owner - PowerCostMultiplier = ObjectFields.End + 0x0aa, // Size: 7, Flags: Private, Owner - Maxhealthmodifier = ObjectFields.End + 0x0b1, // Size: 1, Flags: Private, Owner - HoverHeight = ObjectFields.End + 0x0b2, // Size: 1, Flags: Public - MinItemLevelCutoff = ObjectFields.End + 0x0b3, // Size: 1, Flags: Public - MinItemLevel = ObjectFields.End + 0x0b4, // Size: 1, Flags: Public - Maxitemlevel = ObjectFields.End + 0x0b5, // Size: 1, Flags: Public - WildBattlepetLevel = ObjectFields.End + 0x0b6, // Size: 1, Flags: Public - BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0b7, // Size: 1, Flags: Public - InteractSpellid = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public - StateSpellVisualId = ObjectFields.End + 0x0b9, // Size: 1, Flags: Dynamic, Urgent - StateAnimId = ObjectFields.End + 0x0ba, // Size: 1, Flags: Dynamic, Urgent - StateAnimKitId = ObjectFields.End + 0x0bb, // Size: 1, Flags: Dynamic, Urgent - StateWorldEffectId = ObjectFields.End + 0x0bc, // Size: 4, Flags: Dynamic, Urgent - ScaleDuration = ObjectFields.End + 0x0c0, // Size: 1, Flags: Public - LooksLikeMountId = ObjectFields.End + 0x0c1, // Size: 1, Flags: Public - LooksLikeCreatureId = ObjectFields.End + 0x0c2, // Size: 1, Flags: Public - LookAtControllerId = ObjectFields.End + 0x0c3, // Size: 1, Flags: Public - LookAtControllerTarget = ObjectFields.End + 0x0c4, // Size: 4, Flags: Public - End = ObjectFields.End + 0x0c8 + + SandboxScalingId = ObjectFields.End + 0x04a, // Size: 1, Flags: Public + ScalingLevelMin = ObjectFields.End + 0x04b, // Size: 1, Flags: Public + ScalingLevelMax = ObjectFields.End + 0x04c, // Size: 1, Flags: Public + ScalingLevelDelta = ObjectFields.End + 0x04d, // Size: 1, Flags: Public + FactionTemplate = ObjectFields.End + 0x04e, // Size: 1, Flags: Public + VirtualItemSlotId = ObjectFields.End + 0x04f, // Size: 6, Flags: Public + Flags = ObjectFields.End + 0x055, // Size: 1, Flags: Public, Urgent + Flags2 = ObjectFields.End + 0x056, // Size: 1, Flags: Public, Urgent + Flags3 = ObjectFields.End + 0x057, // Size: 1, Flags: Public, Urgent + AuraState = ObjectFields.End + 0x058, // Size: 1, Flags: Public + BaseAttackTime = ObjectFields.End + 0x059, // Size: 2, Flags: Public + RangedAttackTime = ObjectFields.End + 0x05b, // Size: 1, Flags: Private + BoundingRadius = ObjectFields.End + 0x05c, // Size: 1, Flags: Public + CombatReach = ObjectFields.End + 0x05d, // Size: 1, Flags: Public + DisplayId = ObjectFields.End + 0x05e, // Size: 1, Flags: Dynamic, Urgent + NativeDisplayId = ObjectFields.End + 0x05f, // Size: 1, Flags: Public, Urgent + MountDisplayId = ObjectFields.End + 0x060, // Size: 1, Flags: Public, Urgent + MinDamage = ObjectFields.End + 0x061, // Size: 1, Flags: Private, Owner, SpecialInfo + MaxDamage = ObjectFields.End + 0x062, // Size: 1, Flags: Private, Owner, SpecialInfo + MinOffHandDamage = ObjectFields.End + 0x063, // Size: 1, Flags: Private, Owner, SpecialInfo + MaxOffHandDamage = ObjectFields.End + 0x064, // Size: 1, Flags: Private, Owner, SpecialInfo + Bytes1 = ObjectFields.End + 0x065, // Size: 1, Flags: Public + PetNumber = ObjectFields.End + 0x066, // Size: 1, Flags: Public + PetNameTimestamp = ObjectFields.End + 0x067, // Size: 1, Flags: Public + PetExperience = ObjectFields.End + 0x068, // Size: 1, Flags: Owner + PetNextLevelExp = ObjectFields.End + 0x069, // Size: 1, Flags: Owner + ModCastSpeed = ObjectFields.End + 0x06a, // Size: 1, Flags: Public + ModCastHaste = ObjectFields.End + 0x06b, // Size: 1, Flags: Public + ModHaste = ObjectFields.End + 0x06c, // Size: 1, Flags: Public + ModRangedHaste = ObjectFields.End + 0x06d, // Size: 1, Flags: Public + ModHasteRegen = ObjectFields.End + 0x06e, // Size: 1, Flags: Public + ModTimeRate = ObjectFields.End + 0x06f, // Size: 1, Flags: Public + CreatedBySpell = ObjectFields.End + 0x070, // Size: 1, Flags: Public + NpcFlags = ObjectFields.End + 0x071, // Size: 2, Flags: Public, Dynamic + NpcEmotestate = ObjectFields.End + 0x073, // Size: 1, Flags: Public + Stat = ObjectFields.End + 0x074, // Size: 4, Flags: Private, Owner + PosStat = ObjectFields.End + 0x078, // Size: 4, Flags: Private, Owner + NegStat = ObjectFields.End + 0x07c, // Size: 4, Flags: Private, Owner + Resistances = ObjectFields.End + 0x080, // Size: 7, Flags: Private, Owner, SpecialInfo + ResistanceBuffModsPositive = ObjectFields.End + 0x087, // Size: 7, Flags: Private, Owner + ResistanceBuffModsNegative = ObjectFields.End + 0x08e, // Size: 7, Flags: Private, Owner + ModBonusArmor = ObjectFields.End + 0x095, // Size: 1, Flags: Private, Owner + BaseMana = ObjectFields.End + 0x096, // Size: 1, Flags: Public + BaseHealth = ObjectFields.End + 0x097, // Size: 1, Flags: Private, Owner + Bytes2 = ObjectFields.End + 0x098, // Size: 1, Flags: Public + AttackPower = ObjectFields.End + 0x099, // Size: 1, Flags: Private, Owner + AttackPowerModPos = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner + AttackPowerModNeg = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner + AttackPowerMultiplier = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner + RangedAttackPower = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner + RangedAttackPowerModPos = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner + RangedAttackPowerModNeg = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner + RangedAttackPowerMultiplier = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner + AttackSpeedAura = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner + MinRangedDamage = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner + MaxRangedDamage = ObjectFields.End + 0x0a3, // Size: 1, Flags: Private, Owner + PowerCostModifier = ObjectFields.End + 0x0a4, // Size: 7, Flags: Private, Owner + PowerCostMultiplier = ObjectFields.End + 0x0ab, // Size: 7, Flags: Private, Owner + MaxHealthModifier = ObjectFields.End + 0x0b2, // Size: 1, Flags: Private, Owner + HoverHeight = ObjectFields.End + 0x0b3, // Size: 1, Flags: Public + MinItemLevelCutoff = ObjectFields.End + 0x0b4, // Size: 1, Flags: Public + MinItemLevel = ObjectFields.End + 0x0b5, // Size: 1, Flags: Public + Maxitemlevel = ObjectFields.End + 0x0b6, // Size: 1, Flags: Public + WildBattlepetLevel = ObjectFields.End + 0x0b7, // Size: 1, Flags: Public + BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public + InteractSpellid = ObjectFields.End + 0x0b9, // Size: 1, Flags: Public + StateSpellVisualId = ObjectFields.End + 0x0ba, // Size: 1, Flags: Dynamic, Urgent + StateAnimId = ObjectFields.End + 0x0bb, // Size: 1, Flags: Dynamic, Urgent + StateAnimKitId = ObjectFields.End + 0x0bc, // Size: 1, Flags: Dynamic, Urgent + StateWorldEffectId = ObjectFields.End + 0x0bd, // Size: 4, Flags: Dynamic, Urgent + ScaleDuration = ObjectFields.End + 0x0c1, // Size: 1, Flags: Public + LooksLikeMountId = ObjectFields.End + 0x0c2, // Size: 1, Flags: Public + LooksLikeCreatureId = ObjectFields.End + 0x0c3, // Size: 1, Flags: Public + LookAtControllerId = ObjectFields.End + 0x0c4, // Size: 1, Flags: Public + LookAtControllerTarget = ObjectFields.End + 0x0c5, // Size: 4, Flags: Public + End = ObjectFields.End + 0x0c9 } public enum UnitDynamicFields @@ -205,101 +207,101 @@ namespace Framework.Constants CurrentBattlePetBreedQuality = UnitFields.End + 0x366, // Size: 1, Flags: Public Prestige = UnitFields.End + 0x367, // Size: 1, Flags: Public HonorLevel = UnitFields.End + 0x368, // Size: 1, Flags: Public - InvSlotHead = UnitFields.End + 0x369, // Size: 748, Flags: Private + InvSlotHead = UnitFields.End + 0x369, // Size: 780, Flags: Private EndNotSelf = UnitFields.End + 0x369, - Farsight = UnitFields.End + 0x655, // Size: 4, Flags: Private - SummonedBattlePetId = UnitFields.End + 0x659, // Size: 4, Flags: Private - KnownTitles = UnitFields.End + 0x65d, // Size: 12, Flags: Private - Coinage = UnitFields.End + 0x669, // Size: 2, Flags: Private - Xp = UnitFields.End + 0x66b, // Size: 1, Flags: Private - NextLevelXp = UnitFields.End + 0x66c, // Size: 1, Flags: Private - SkillLineId = UnitFields.End + 0x66d, // Size: 448, Flags: Private - SkillLineStep = UnitFields.End + 0x6AD, - SkillLineRank = UnitFields.End + 0x6ED, - SkillLineSubStartRank = UnitFields.End + 0x72D, - SkillLineMaxRank = UnitFields.End + 0x76D, - SkillLineTempBonus = UnitFields.End + 0x7AD, - SkillLinePermBonus = UnitFields.End + 0x7ED, - CharacterPoints = UnitFields.End + 0x82d, // Size: 1, Flags: Private - MaxTalentTiers = UnitFields.End + 0x82e, // Size: 1, Flags: Private - TrackCreatures = UnitFields.End + 0x82f, // Size: 1, Flags: Private - TrackResources = UnitFields.End + 0x830, // Size: 1, Flags: Private - Expertise = UnitFields.End + 0x831, // Size: 1, Flags: Private - OffhandExpertise = UnitFields.End + 0x832, // Size: 1, Flags: Private - RangedExpertise = UnitFields.End + 0x833, // Size: 1, Flags: Private - CombatRatingExpertise = UnitFields.End + 0x834, // Size: 1, Flags: Private - BlockPercentage = UnitFields.End + 0x835, // Size: 1, Flags: Private - DodgePercentage = UnitFields.End + 0x836, // Size: 1, Flags: Private - DodgePercentageFromAttribute = UnitFields.End + 0x837, // Size: 1, Flags: Private - ParryPercentage = UnitFields.End + 0x838, // Size: 1, Flags: Private - ParryPercentageFromAttribute = UnitFields.End + 0x839, // Size: 1, Flags: Private - CritPercentage = UnitFields.End + 0x83a, // Size: 1, Flags: Private - RangedCritPercentage = UnitFields.End + 0x83b, // Size: 1, Flags: Private - OffhandCritPercentage = UnitFields.End + 0x83c, // Size: 1, Flags: Private - SpellCritPercentage1 = UnitFields.End + 0x83d, // Size: 1, Flags: Private - ShieldBlock = UnitFields.End + 0x83e, // Size: 1, Flags: Private - ShieldBlockCritPercentage = UnitFields.End + 0x83f, // Size: 1, Flags: Private - Mastery = UnitFields.End + 0x840, // Size: 1, Flags: Private - Speed = UnitFields.End + 0x841, // Size: 1, Flags: Private - Lifesteal = UnitFields.End + 0x842, // Size: 1, Flags: Private - Avoidance = UnitFields.End + 0x843, // Size: 1, Flags: Private - Sturdiness = UnitFields.End + 0x844, // Size: 1, Flags: Private - Versatility = UnitFields.End + 0x845, // Size: 1, Flags: Private - VersatilityBonus = UnitFields.End + 0x846, // Size: 1, Flags: Private - FieldPvpPowerDamage = UnitFields.End + 0x847, // Size: 1, Flags: Private - FieldPvpPowerHealing = UnitFields.End + 0x848, // Size: 1, Flags: Private - ExploredZones1 = UnitFields.End + 0x849, // Size: 320, Flags: PRIVATE - RestInfo = UnitFields.End + 0x989, // Size: 4, Flags: Private - ModDamageDonePos = UnitFields.End + 0x98d, // Size: 7, Flags: Private - ModDamageDoneNeg = UnitFields.End + 0x994, // Size: 7, Flags: Private - ModDamageDonePct = UnitFields.End + 0x99b, // Size: 7, Flags: Private - ModHealingDonePos = UnitFields.End + 0x9a2, // Size: 1, Flags: Private - ModHealingPct = UnitFields.End + 0x9a3, // Size: 1, Flags: Private - ModHealingDonePct = UnitFields.End + 0x9a4, // Size: 1, Flags: Private - ModPeriodicHealingDonePercent = UnitFields.End + 0x9a5, // Size: 1, Flags: Private - WeaponDmgMultipliers = UnitFields.End + 0x9a6, // Size: 3, Flags: Private - WeaponAtkSpeedMultipliers = UnitFields.End + 0x9a9, // Size: 3, Flags: Private - ModSpellPowerPct = UnitFields.End + 0x9ac, // Size: 1, Flags: Private - ModResiliencePercent = UnitFields.End + 0x9ad, // Size: 1, Flags: Private - OverrideSpellPowerByApPct = UnitFields.End + 0x9ae, // Size: 1, Flags: Private - OverrideApBySpellPowerPercent = UnitFields.End + 0x9af, // Size: 1, Flags: Private - ModTargetResistance = UnitFields.End + 0x9b0, // Size: 1, Flags: Private - ModTargetPhysicalResistance = UnitFields.End + 0x9b1, // Size: 1, Flags: Private - LocalFlags = UnitFields.End + 0x9b2, // Size: 1, Flags: Private - FieldBytes = UnitFields.End + 0x9b3, // Size: 1, Flags: Private - SelfResSpell = UnitFields.End + 0x9b4, // Size: 1, Flags: Private - PvpMedals = UnitFields.End + 0x9b5, // Size: 1, Flags: Private - BuyBackPrice1 = UnitFields.End + 0x9b6, // Size: 12, Flags: Private - BuyBackTimestamp1 = UnitFields.End + 0x9c2, // Size: 12, Flags: Private - Kills = UnitFields.End + 0x9ce, // Size: 1, Flags: Private - LifetimeHonorableKills = UnitFields.End + 0x9cf, // Size: 1, Flags: Private - WatchedFactionIndex = UnitFields.End + 0x9d0, // Size: 1, Flags: Private - CombatRating1 = UnitFields.End + 0x9d1, // Size: 32, Flags: Private - ArenaTeamInfo11 = UnitFields.End + 0x9f1, // Size: 42, Flags: Private - MaxLevel = UnitFields.End + 0xa1b, // Size: 1, Flags: Private - ScalingLevelDelta = UnitFields.End + 0xa1c, // Size: 1, Flags: Private - MaxCreatureScalingLevel = UnitFields.End + 0xa1d, // Size: 1, Flags: Private - NoReagentCost1 = UnitFields.End + 0xa1e, // Size: 4, Flags: Private - PetSpellPower = UnitFields.End + 0xa22, // Size: 1, Flags: Private - Researching1 = UnitFields.End + 0xa23, // Size: 10, Flags: Private - ProfessionSkillLine1 = UnitFields.End + 0xa2d, // Size: 2, Flags: Private - UiHitModifier = UnitFields.End + 0xa2f, // Size: 1, Flags: Private - UiSpellHitModifier = UnitFields.End + 0xa30, // Size: 1, Flags: Private - HomeRealmTimeOffset = UnitFields.End + 0xa31, // Size: 1, Flags: Private - ModPetHaste = UnitFields.End + 0xa32, // Size: 1, Flags: Private - FieldBytes2 = UnitFields.End + 0xa33, // Size: 1, Flags: Private - FieldBytes3 = UnitFields.End + 0xa34, // Size: 1, Flags: Private, UrgentSelfOnly - LfgBonusFactionId = UnitFields.End + 0xa35, // Size: 1, Flags: Private - LootSpecId = UnitFields.End + 0xa36, // Size: 1, Flags: Private - OverrideZonePvpType = UnitFields.End + 0xa37, // Size: 1, Flags: Private, UrgentSelfOnly - BagSlotFlags = UnitFields.End + 0xa38, // Size: 4, Flags: Private - BankBagSlotFlags = UnitFields.End + 0xa3c, // Size: 7, Flags: Private - InsertItemsLeftToRight = UnitFields.End + 0xa43, // Size: 1, Flags: Private - QuestCompleted = UnitFields.End + 0xa44, // Size: 1750, Flags: Private - Honor = UnitFields.End + 0x111a, // Size: 1, Flags: Private - HonorNextLevel = UnitFields.End + 0x111b, // Size: 1, Flags: Private - End = UnitFields.End + 0x111C + Farsight = UnitFields.End + 0x675, // Size: 4, Flags: Private + SummonedBattlePetId = UnitFields.End + 0x679, // Size: 4, Flags: Private + KnownTitles = UnitFields.End + 0x67d, // Size: 12, Flags: Private + Coinage = UnitFields.End + 0x689, // Size: 2, Flags: Private + Xp = UnitFields.End + 0x68b, // Size: 1, Flags: Private + NextLevelXp = UnitFields.End + 0x68c, // Size: 1, Flags: Private + TrialXp = UnitFields.End + 0x68d, // Size: 1, Flags: Private + SkillLineId = UnitFields.End + 0x68e, // Size: 448, Flags: Private + SkillLineStep = UnitFields.End + 0x6ce, + SkillLineRank = UnitFields.End + 0x70e, + SkillLineSubRank = UnitFields.End + 0x74e, + SkillLineMaxRank = UnitFields.End + 0x78c, + SkillLineTempBonus = UnitFields.End + 0x7ce, + SkillLinePermBonus = UnitFields.End + 0x80e, + CharacterPoints = UnitFields.End + 0x84e, // Size: 1, Flags: Private + MaxTalentTiers = UnitFields.End + 0x84f, // Size: 1, Flags: Private + TrackCreatures = UnitFields.End + 0x850, // Size: 1, Flags: Private + TrackResources = UnitFields.End + 0x851, // Size: 1, Flags: Private + Expertise = UnitFields.End + 0x852, // Size: 1, Flags: Private + OffhandExpertise = UnitFields.End + 0x853, // Size: 1, Flags: Private + RangedExpertise = UnitFields.End + 0x854, // Size: 1, Flags: Private + CombatRatingExpertise = UnitFields.End + 0x855, // Size: 1, Flags: Private + BlockPercentage = UnitFields.End + 0x856, // Size: 1, Flags: Private + DodgePercentage = UnitFields.End + 0x857, // Size: 1, Flags: Private + DodgePercentageFromAttribute = UnitFields.End + 0x858, // Size: 1, Flags: Private + ParryPercentage = UnitFields.End + 0x859, // Size: 1, Flags: Private + ParryPercentageFromAttribute = UnitFields.End + 0x85a, // Size: 1, Flags: Private + CritPercentage = UnitFields.End + 0x85b, // Size: 1, Flags: Private + RangedCritPercentage = UnitFields.End + 0x85c, // Size: 1, Flags: Private + OffhandCritPercentage = UnitFields.End + 0x85d, // Size: 1, Flags: Private + SpellCritPercentage1 = UnitFields.End + 0x85e, // Size: 1, Flags: Private + ShieldBlock = UnitFields.End + 0x85f, // Size: 1, Flags: Private + ShieldBlockCritPercentage = UnitFields.End + 0x860, // Size: 1, Flags: Private + Mastery = UnitFields.End + 0x861, // Size: 1, Flags: Private + Speed = UnitFields.End + 0x862, // Size: 1, Flags: Private + Lifesteal = UnitFields.End + 0x863, // Size: 1, Flags: Private + Avoidance = UnitFields.End + 0x864, // Size: 1, Flags: Private + Sturdiness = UnitFields.End + 0x865, // Size: 1, Flags: Private + Versatility = UnitFields.End + 0x866, // Size: 1, Flags: Private + VersatilityBonus = UnitFields.End + 0x867, // Size: 1, Flags: Private + PvpPowerDamage = UnitFields.End + 0x868, // Size: 1, Flags: Private + PvpPowerHealing = UnitFields.End + 0x869, // Size: 1, Flags: Private + ExploredZones1 = UnitFields.End + 0x86a, // Size: 320, Flags: Private + RestInfo = UnitFields.End + 0x9aa, // Size: 4, Flags: Private + ModDamageDonePos = UnitFields.End + 0x9ae, // Size: 7, Flags: Private + ModDamageDoneNeg = UnitFields.End + 0x9b5, // Size: 7, Flags: Private + ModDamageDonePct = UnitFields.End + 0x9bc, // Size: 7, Flags: Private + ModHealingDonePos = UnitFields.End + 0x9c3, // Size: 1, Flags: Private + ModHealingPct = UnitFields.End + 0x9c4, // Size: 1, Flags: Private + ModHealingDonePct = UnitFields.End + 0x9c5, // Size: 1, Flags: Private + ModPeriodicHealingDonePercent = UnitFields.End + 0x9c6, // Size: 1, Flags: Private + WeaponDmgMultipliers = UnitFields.End + 0x9c7, // Size: 3, Flags: Private + WeaponAtkSpeedMultipliers = UnitFields.End + 0x9ca, // Size: 3, Flags: Private + ModSpellPowerPct = UnitFields.End + 0x9cd, // Size: 1, Flags: Private + ModResiliencePercent = UnitFields.End + 0x9ce, // Size: 1, Flags: Private + OverrideSpellPowerByApPct = UnitFields.End + 0x9cf, // Size: 1, Flags: Private + OverrideApBySpellPowerPercent = UnitFields.End + 0x9d0, // Size: 1, Flags: Private + ModTargetResistance = UnitFields.End + 0x9d1, // Size: 1, Flags: Private + ModTargetPhysicalResistance = UnitFields.End + 0x9d2, // Size: 1, Flags: Private + LocalFlags = UnitFields.End + 0x9d3, // Size: 1, Flags: Private + FieldBytes = UnitFields.End + 0x9d4, // Size: 1, Flags: Private + PvpMedals = UnitFields.End + 0x9d5, // Size: 1, Flags: Private + BuyBackPrice1 = UnitFields.End + 0x9d6, // Size: 12, Flags: Private + BuyBackTimestamp1 = UnitFields.End + 0x9e2, // Size: 12, Flags: Private + Kills = UnitFields.End + 0x9ee, // Size: 1, Flags: Private + LifetimeHonorableKills = UnitFields.End + 0x9ef, // Size: 1, Flags: Private + WatchedFactionIndex = UnitFields.End + 0x9f0, // Size: 1, Flags: Private + CombatRating1 = UnitFields.End + 0x9f1, // Size: 32, Flags: Private + ArenaTeamInfo11 = UnitFields.End + 0xa11, // Size: 42, Flags: Private + MaxLevel = UnitFields.End + 0xa3b, // Size: 1, Flags: Private + ScalingLevelDelta = UnitFields.End + 0xa3c, // Size: 1, Flags: Private + MaxCreatureScalingLevel = UnitFields.End + 0xa3d, // Size: 1, Flags: Private + NoReagentCost1 = UnitFields.End + 0xa3e, // Size: 4, Flags: Private + PetSpellPower = UnitFields.End + 0xa42, // Size: 1, Flags: Private + Researching1 = UnitFields.End + 0xa43, // Size: 10, Flags: Private + ProfessionSkillLine1 = UnitFields.End + 0xa4d, // Size: 2, Flags: Private + UiHitModifier = UnitFields.End + 0xa4f, // Size: 1, Flags: Private + UiSpellHitModifier = UnitFields.End + 0xa50, // Size: 1, Flags: Private + HomeRealmTimeOffset = UnitFields.End + 0xa51, // Size: 1, Flags: Private + ModPetHaste = UnitFields.End + 0xa52, // Size: 1, Flags: Private + FieldBytes2 = UnitFields.End + 0xa53, // Size: 1, Flags: Private + FieldBytes3 = UnitFields.End + 0xa54, // Size: 1, Flags: Private, UrgentSelfOnly + LfgBonusFactionId = UnitFields.End + 0xa55, // Size: 1, Flags: Private + LootSpecId = UnitFields.End + 0xa56, // Size: 1, Flags: Private + OverrideZonePvpType = UnitFields.End + 0xa57, // Size: 1, Flags: Private, UrgentSelfOnly + BagSlotFlags = UnitFields.End + 0xa58, // Size: 4, Flags: Private + BankBagSlotFlags = UnitFields.End + 0xa5c, // Size: 7, Flags: Private + InsertItemsLeftToRight = UnitFields.End + 0xa63, // Size: 1, Flags: Private + QuestCompleted = UnitFields.End + 0xa64, // Size: 1750, Flags: Private + Honor = UnitFields.End + 0x113a, // Size: 1, Flags: Private + HonorNextLevel = UnitFields.End + 0x113b, // Size: 1, Flags: Private + End = UnitFields.End + 0x113c, } public enum PlayerDynamicFields @@ -313,11 +315,12 @@ namespace Framework.Constants Toys = UnitDynamicFields.End + 0x006, // Flags: Private Transmog = UnitDynamicFields.End + 0x007, // Flags: PRIVATE ConditionalTransmog = UnitDynamicFields.End + 0x008, // Flags: PRIVATE - CharacterRestrictions = UnitDynamicFields.End + 0x009, // Flags: PRIVATE - SpellPctModByLabel = UnitDynamicFields.End + 0x00A, // Flags: PRIVATE - SpellFlatModByLabel = UnitDynamicFields.End + 0x00B, // Flags: PRIVATE - ArenaCooldowns = UnitDynamicFields.End + 0x00C, // Flags: PUBLIC - End = UnitDynamicFields.End + 0x00D + SelfResSpells = UnitDynamicFields.End + 0x009, // Flags: Private + CharacterRestrictions = UnitDynamicFields.End + 0x00a, // Flags: Private + SpellPctModByLabel = UnitDynamicFields.End + 0x00b, // Flags: Private + SpellFlatModByLabel = UnitDynamicFields.End + 0x00c, // Flags: Private + ArenaCooldowns = UnitDynamicFields.End + 0x00d, // Flags: Public + End = UnitDynamicFields.End + 0x00e, } public enum GameObjectFields diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index c0b2bfd0d..434d7c45c 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -49,21 +49,21 @@ namespace Framework.Database "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? "); PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?"); PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " + + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " + "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " + + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " + "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); PrepareStatement(CharStatements.SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)"); @@ -77,7 +77,7 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?"); 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, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, playerFlagsEx, " + + PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + "position_x, position_y, position_z, map, orientation, taximask, 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, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + @@ -418,18 +418,18 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?"); // Player saving - PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, playerFlagsEx, " + + PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, 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, primarySpecialization, " + "extra_flags, stable_slots, at_login, zone, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " + - "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " + - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); - PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + + "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, lastLoginBuild) VALUES " + + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,inventorySlots=?,bankSlots=?,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=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + - "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=?,honor=?,honorLevel=?,prestigeLevel=?,honorRestState=?,honorRestBonus=? WHERE guid=?"); + "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=?,honor=?,honorLevel=?,prestigeLevel=?,honorRestState=?,honorRestBonus=?,lastLoginBuild=? WHERE guid=?"); PrepareStatement(CharStatements.UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?"); PrepareStatement(CharStatements.UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?"); diff --git a/Source/Framework/Logging/Appender.cs b/Source/Framework/Logging/Appender.cs index 96e7726b1..7229caf5b 100644 --- a/Source/Framework/Logging/Appender.cs +++ b/Source/Framework/Logging/Appender.cs @@ -174,7 +174,7 @@ abstract class Appender public void Write(LogMessage message) { - if (_level == LogLevel.Disabled || _level > message.level) + if (_level == LogLevel.Disabled || (_level != LogLevel.Fatal && _level > message.level)) return; StringBuilder ss = new StringBuilder(); diff --git a/Source/Game/Entities/Creature/Gossip.cs b/Source/Game/Entities/Creature/Gossip.cs index cf11565ae..a4e6225cb 100644 --- a/Source/Game/Entities/Creature/Gossip.cs +++ b/Source/Game/Entities/Creature/Gossip.cs @@ -282,6 +282,7 @@ namespace Game.Misc text.QuestID = (int)questID; text.QuestType = item.QuestIcon; text.QuestLevel = quest.Level; + text.QuestMaxScalingLevel = quest.MaxScalingLevel; text.QuestFlags = (int)quest.Flags; text.QuestFlagsEx = (int)quest.FlagsEx; text.Repeatable = quest.IsRepeatable(); @@ -375,6 +376,7 @@ namespace Game.Misc text.QuestID = questID; text.QuestType = questMenuItem.QuestIcon; text.QuestLevel = (uint)quest.Level; + text.QuestMaxScalingLevel = (uint)quest.MaxScalingLevel; text.QuestFlags = (uint)quest.Flags; text.QuestFlagsEx = (uint)quest.FlagsEx; text.Repeatable = false; // NYI @@ -497,6 +499,7 @@ namespace Game.Misc packet.Info.QuestID = quest.Id; packet.Info.QuestType = (int)quest.Type; packet.Info.QuestLevel = quest.Level; + packet.Info.QuestMaxScalingLevel = quest.MaxScalingLevel; packet.Info.QuestPackageID = quest.PackageID; packet.Info.QuestMinLevel = quest.MinLevel; packet.Info.QuestSortID = quest.QuestSortID; diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 95a63e585..a1fa16fa4 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -2370,8 +2370,8 @@ namespace Game.Entities SetUInt32Value(UnitFields.Level, result.Read(6)); SetXP(result.Read(7)); - _LoadIntoDataField(result.Read(65), (int)PlayerFields.ExploredZones1, PlayerConst.ExploredZonesSize); - _LoadIntoDataField(result.Read(66), (int)PlayerFields.KnownTitles, PlayerConst.KnowTitlesSize * 2); + _LoadIntoDataField(result.Read(66), (int)PlayerFields.ExploredZones1, PlayerConst.ExploredZonesSize); + _LoadIntoDataField(result.Read(67), (int)PlayerFields.KnownTitles, PlayerConst.KnowTitlesSize * 2); SetObjectScale(1.0f); SetFloatValue(UnitFields.HoverHeight, 1.0f); @@ -2397,12 +2397,13 @@ namespace Game.Entities SetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle, result.Read(13)); for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i) SetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i), customDisplay[i]); - SetBankBagSlotCount(result.Read(17)); + SetInventorySlotCount(result.Read(17)); + SetBankBagSlotCount(result.Read(18)); SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)gender); - SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation, result.Read(54)); - SetUInt32Value(PlayerFields.Flags, result.Read(19)); - SetUInt32Value(PlayerFields.FlagsEx, result.Read(20)); - SetInt32Value(PlayerFields.WatchedFactionIndex, (int)result.Read(53)); + SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation, result.Read(55)); + SetUInt32Value(PlayerFields.Flags, result.Read(20)); + SetUInt32Value(PlayerFields.FlagsEx, result.Read(21)); + SetInt32Value(PlayerFields.WatchedFactionIndex, (int)result.Read(54)); if (!ValidateAppearance((Race)result.Read(3), (Class)result.Read(4), (Gender)gender, GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId), @@ -2416,9 +2417,9 @@ namespace Game.Entities } // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles, result.Read(67)); + SetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles, result.Read(68)); - m_fishingSteps = result.Read(71); + m_fishingSteps = result.Read(72); InitDisplayIds(); @@ -2442,20 +2443,20 @@ namespace Game.Entities InitPrimaryProfessions(); // to max set before any spell loaded // init saved position, and fix it later if problematic - ulong transLowGUID = result.Read(40); + ulong transLowGUID = result.Read(41); - Relocate(result.Read(21), result.Read(22), result.Read(23), result.Read(25)); + Relocate(result.Read(22), result.Read(23), result.Read(24), result.Read(26)); - uint mapId = result.Read(24); - uint instanceId = result.Read(62); + uint mapId = result.Read(25); + uint instanceId = result.Read(63); var RelocateToHomebind = new Action(() => { mapId = homebind.GetMapId(); instanceId = 0; Relocate(homebind); }); - SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID((Difficulty)result.Read(48))); - SetRaidDifficultyID(CheckLoadedRaidDifficultyID((Difficulty)result.Read(69))); - SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID((Difficulty)result.Read(70))); + SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID((Difficulty)result.Read(49))); + SetRaidDifficultyID(CheckLoadedRaidDifficultyID((Difficulty)result.Read(70))); + SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID((Difficulty)result.Read(71))); - string taxi_nodes = result.Read(47); + string taxi_nodes = result.Read(48); _LoadGroup(holder.GetResult(PlayerLoginQueryLoad.Group)); @@ -2479,9 +2480,9 @@ namespace Game.Entities } _LoadCurrency(holder.GetResult(PlayerLoginQueryLoad.Currency)); - SetUInt32Value(PlayerFields.LifetimeHonorableKills, result.Read(49)); - SetUInt16Value(PlayerFields.Kills, 0, result.Read(50)); - SetUInt16Value(PlayerFields.Kills, 1, result.Read(51)); + SetUInt32Value(PlayerFields.LifetimeHonorableKills, result.Read(50)); + SetUInt16Value(PlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetTodayKills, result.Read(51)); + SetUInt16Value(PlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetYesterdayKills, result.Read(52)); _LoadBoundInstances(holder.GetResult(PlayerLoginQueryLoad.BoundInstances)); _LoadInstanceTimeRestrictions(holder.GetResult(PlayerLoginQueryLoad.InstanceLockTimes)); @@ -2559,10 +2560,10 @@ namespace Game.Entities if (transport) { - float x = result.Read(36); - float y = result.Read(37); - float z = result.Read(38); - float o = result.Read(39); + float x = result.Read(37); + float y = result.Read(38); + float z = result.Read(39); + float o = result.Read(40); m_movementInfo.transport.pos = new Position(x, y, z, o); transport.CalculatePassengerPosition(ref x, ref y, ref z, ref o); @@ -2757,7 +2758,7 @@ namespace Game.Entities SaveRecallPosition(); long now = Time.UnixTime; - long logoutTime = result.Read(31); + long logoutTime = result.Read(32); // since last logout (in seconds) uint time_diff = (uint)(now - logoutTime); @@ -2770,32 +2771,32 @@ namespace Game.Entities SetDrunkValue(newDrunkValue); - m_cinematic = result.Read(27); - m_PlayedTimeTotal = result.Read(28); - m_PlayedTimeLevel = result.Read(29); + m_cinematic = result.Read(28); + m_PlayedTimeTotal = result.Read(29); + m_PlayedTimeLevel = result.Read(30); - SetTalentResetCost(result.Read(33)); - SetTalentResetTime(result.Read(34)); + SetTalentResetCost(result.Read(34)); + SetTalentResetTime(result.Read(35)); - m_taxi.LoadTaxiMask(result.Read(26)); // must be before InitTaxiNodesForLevel + m_taxi.LoadTaxiMask(result.Read(27)); // must be before InitTaxiNodesForLevel - PlayerExtraFlags extraflags = (PlayerExtraFlags)result.Read(41); + PlayerExtraFlags extraflags = (PlayerExtraFlags)result.Read(42); - m_stableSlots = result.Read(42); + m_stableSlots = result.Read(43); if (m_stableSlots > 4) { Log.outError(LogFilter.Player, "Player can have not more {0} stable slots, but have in DB {1}", 4, m_stableSlots); m_stableSlots = 4; } - atLoginFlags = (AtLoginFlags)result.Read(43); + atLoginFlags = (AtLoginFlags)result.Read(44); // Honor system // Update Honor kills data m_lastHonorUpdateTime = logoutTime; UpdateHonorFields(); - m_deathExpireTime = result.Read(46); + m_deathExpireTime = result.Read(47); if (m_deathExpireTime > now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep) m_deathExpireTime = now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep - 1; @@ -2826,19 +2827,19 @@ namespace Game.Entities InitRunes(); // rest bonus can only be calculated after InitStatsForLevel() - _restMgr.LoadRestBonus(RestTypes.XP, (PlayerRestState)result.Read(18), result.Read(30)); + _restMgr.LoadRestBonus(RestTypes.XP, (PlayerRestState)result.Read(19), result.Read(31)); // load skills after InitStatsForLevel because it triggering aura apply also _LoadSkills(holder.GetResult(PlayerLoginQueryLoad.Skills)); UpdateSkillsForLevel(); - SetPrimarySpecialization(result.Read(35)); - SetActiveTalentGroup(result.Read(63)); + SetPrimarySpecialization(result.Read(36)); + SetActiveTalentGroup(result.Read(64)); ChrSpecializationRecord primarySpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization()); if (primarySpec == null || primarySpec.ClassID != (byte)GetClass() || GetActiveTalentGroup() >= PlayerConst.MaxSpecializations) ResetTalentSpecialization(); - uint lootSpecId = result.Read(64); + uint lootSpecId = result.Read(65); ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(lootSpecId); if (chrSpec != null) { @@ -2900,7 +2901,7 @@ namespace Game.Entities // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded - uint curTitle = result.Read(52); + uint curTitle = result.Read(53); if (curTitle != 0 && !HasTitle(curTitle)) curTitle = 0; @@ -2923,7 +2924,7 @@ namespace Game.Entities UpdateAllStats(); // restore remembered power/health values (but not more max values) - uint savedHealth = result.Read(55); + uint savedHealth = result.Read(56); SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); int loadedPowers = 0; for (PowerType i = 0; i < PowerType.Max; ++i) @@ -3014,7 +3015,7 @@ namespace Game.Entities } // RaF stuff. - m_grantableLevels = result.Read(68); + m_grantableLevels = result.Read(69); if (GetSession().IsARecruiter() || (GetSession().GetRecruiterId() != 0)) SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.ReferAFriend); @@ -3036,9 +3037,9 @@ namespace Game.Entities holder.GetResult(PlayerLoginQueryLoad.GarrisonFollowerAbilities))) _garrison = garrison; - _InitHonorLevelOnLoadFromDB(result.Read(72), result.Read(73), result.Read(74)); + _InitHonorLevelOnLoadFromDB(result.Read(73), result.Read(74), result.Read(75)); - _restMgr.LoadRestBonus(RestTypes.Honor, (PlayerRestState)result.Read(75), result.Read(76)); + _restMgr.LoadRestBonus(RestTypes.Honor, (PlayerRestState)result.Read(76), result.Read(77)); if (time_diff > 0) { //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour) @@ -3100,6 +3101,7 @@ namespace Game.Entities stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle)); for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i))); + stmt.AddValue(index++, GetInventorySlotCount()); stmt.AddValue(index++, GetBankBagSlotCount()); stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp)); stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags)); @@ -3211,6 +3213,7 @@ namespace Game.Entities stmt.AddValue(index++, GetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles)); stmt.AddValue(index++, m_grantableLevels); + stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build); } else { @@ -3231,6 +3234,7 @@ namespace Game.Entities for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)( PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i))); + stmt.AddValue(index++, GetInventorySlotCount()); stmt.AddValue(index++, GetBankBagSlotCount()); stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp)); stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags)); @@ -3365,6 +3369,7 @@ namespace Game.Entities stmt.AddValue(index++, GetPrestigeLevel()); stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor)); stmt.AddValue(index++, _restMgr.GetRestBonus(RestTypes.Honor)); + stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build); // Index stmt.AddValue(index, GetGUID().GetCounter()); diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 823fd2f92..94c35ca0b 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -274,7 +274,8 @@ namespace Game.Entities if (inventory) { - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -326,7 +327,8 @@ namespace Game.Entities if (inventory) { - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -388,7 +390,8 @@ namespace Game.Entities { uint TotalCost = 0; // equipped, backpack, bags itself - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; i++) TotalCost += DurabilityRepair((ushort)((InventorySlots.Bag0 << 8) | i), cost, discountMod, guildBank); // items in inventory bags @@ -556,6 +559,7 @@ namespace Game.Entities } // not specific slot or have space for partly store only in specific slot + byte inventoryEnd = (byte)(InventorySlots.ItemStart + GetInventorySlotCount()); // in specific bag if (bag != ItemConst.NullBag) @@ -597,7 +601,7 @@ namespace Game.Entities return InventoryResult.ItemMaxCount; } - res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, InventorySlots.ItemEnd, dest, pProto, ref count, true, pItem, bag, slot); + res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, inventoryEnd, dest, pProto, ref count, true, pItem, bag, slot); if (res != InventoryResult.Ok) { no_space_count = count + no_similar_count; @@ -678,7 +682,7 @@ namespace Game.Entities } } - res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, InventorySlots.ItemEnd, dest, pProto, ref count, false, pItem, bag, slot); + res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, inventoryEnd, dest, pProto, ref count, false, pItem, bag, slot); if (res != InventoryResult.Ok) { no_space_count = count + no_similar_count; @@ -754,7 +758,7 @@ namespace Game.Entities return InventoryResult.ItemMaxCount; } - res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, InventorySlots.ItemEnd, dest, pProto, ref count, true, pItem, bag, slot); + res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, inventoryEnd, dest, pProto, ref count, true, pItem, bag, slot); if (res != InventoryResult.Ok) { no_space_count = count + no_similar_count; @@ -917,7 +921,8 @@ namespace Game.Entities uint[] inventoryCounts = new uint[InventorySlots.ItemEnd - InventorySlots.ItemStart]; uint[][] bagCounts = new uint[InventorySlots.BagEnd - InventorySlots.BagStart][]; - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { item2 = GetItemByPos(InventorySlots.Bag0, i); if (item2 && !item2.IsInTrade()) @@ -974,7 +979,7 @@ namespace Game.Entities // search stack for merge to if (pProto.GetMaxStackSize() != 1) { - for (byte t = InventorySlots.ItemStart; t < InventorySlots.ItemEnd; ++t) + for (byte t = InventorySlots.ItemStart; t < inventoryEnd; ++t) { item2 = GetItemByPos(InventorySlots.Bag0, t); if (item2 && item2.CanBeMergedPartlyWith(pProto) == InventoryResult.Ok && inventoryCounts[t - InventorySlots.ItemStart] + item.GetCount() <= pProto.GetMaxStackSize()) @@ -1043,7 +1048,7 @@ namespace Game.Entities // search free slot b_found = false; - for (int t = InventorySlots.ItemStart; t < InventorySlots.ItemEnd; ++t) + for (int t = InventorySlots.ItemStart; t < inventoryEnd; ++t) { if (inventoryCounts[t - InventorySlots.ItemStart] == 0) { @@ -1538,7 +1543,8 @@ namespace Game.Entities } } - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -2682,7 +2688,8 @@ namespace Game.Entities } public Item GetItemByGuid(ObjectGuid guid) { - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -2744,7 +2751,8 @@ namespace Game.Entities public uint GetItemCount(uint item, bool inBankAlso = false, Item skipItem = null) { uint count = 0; - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -2761,7 +2769,7 @@ namespace Game.Entities if (skipItem != null && skipItem.GetTemplate().GetGemProperties() != 0) { - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) + for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -2874,7 +2882,8 @@ namespace Game.Entities public Item GetItemByEntry(uint entry) { // in inventory - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -2919,7 +2928,8 @@ namespace Game.Entities { List itemList = new List(); - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) { Item item = GetItemByPos(InventorySlots.Bag0, i); if (item != null) @@ -2974,7 +2984,8 @@ namespace Game.Entities public bool HasItemCount(uint item, uint count = 1, bool inBankAlso = false) { uint tempcount = 0; - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null && pItem.GetEntry() == item && !pItem.IsInTrade()) @@ -3083,7 +3094,7 @@ namespace Game.Entities return true; // backpack slots - if (slot >= InventorySlots.ItemStart && slot < InventorySlots.ItemEnd) + if (slot >= InventorySlots.ItemStart && slot < InventorySlots.ItemStart + GetInventorySlotCount()) return true; // bank main slots @@ -3115,7 +3126,8 @@ namespace Game.Entities public Item GetChildItemByGuid(ObjectGuid guid) { - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem) @@ -3136,7 +3148,8 @@ namespace Game.Entities uint GetItemCountWithLimitCategory(uint limitCategory, Item skipItem) { uint count = 0; - for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem) @@ -3220,7 +3233,8 @@ namespace Game.Entities Log.outDebug(LogFilter.Player, "STORAGE: DestroyConjuredItems"); // in inventory - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem) @@ -3260,7 +3274,8 @@ namespace Game.Entities Log.outDebug(LogFilter.Player, "STORAGE: DestroyZoneLimitedItem in map {0} and area {1}", GetMapId(), new_zone); // in inventory - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem) @@ -3873,7 +3888,8 @@ namespace Game.Entities public bool HasItemTotemCategory(uint TotemCategory) { - for (byte i = EquipmentSlot.Start; i < EquipmentSlot.End; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i) { Item item = GetUseableItemByPos(InventorySlots.Bag0, i); if (item && Global.DB2Mgr.IsTotemCategoryCompatibleWith(item.GetTemplate().GetTotemCategory(), TotemCategory)) @@ -5701,7 +5717,8 @@ namespace Game.Entities uint remcount = 0; // in inventory - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) { Item item = GetItemByPos(InventorySlots.Bag0, i); if (item != null) @@ -5973,6 +5990,52 @@ namespace Game.Entities } } + public byte GetInventorySlotCount() { return GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetNumBackpackSlots); } + public void SetInventorySlotCount(byte slots) + { + //ASSERT(slots <= (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START)); + + if (slots < GetInventorySlotCount()) + { + List unstorableItems = new List(); + + for (byte slot = (byte)(InventorySlots.ItemStart + slots); slot < InventorySlots.ItemEnd; ++slot) + { + Item unstorableItem = GetItemByPos(InventorySlots.Bag0, slot); + if (unstorableItem) + unstorableItems.Add(unstorableItem); + } + + if (!unstorableItems.Empty()) + { + int fullBatches = unstorableItems.Count / SharedConst.MaxMailItems; + int remainder = unstorableItems.Count % SharedConst.MaxMailItems; + SQLTransaction trans = new SQLTransaction(); + + var sendItemsBatch = new Action((batchNumber, batchSize) => + { + MailDraft draft = new MailDraft(Global.ObjectMgr.GetCypherString(CypherStrings.NotEquippedItem), "There were problems with equipping item(s)."); + for (int j = 0; j < batchSize; ++j) + draft.AddItem(unstorableItems[batchNumber * SharedConst.MaxMailItems + j]); + + draft.SendMailTo(trans, this, new MailSender(this, MailStationery.Gm), MailCheckMask.Copied); + }); + + for (int batch = 0; batch < fullBatches; ++batch) + sendItemsBatch(batch, SharedConst.MaxMailItems); + + if (remainder != 0) + sendItemsBatch(fullBatches, remainder); + + DB.Characters.CommitTransaction(trans); + + SendPacket(new CharacterInventoryOverflowWarning()); + } + } + + SetByteValue(PlayerFields.FieldBytes2, PlayerFieldOffsets.FieldBytes2OffsetNumBackpackSlots, slots); + } + public byte GetBankBagSlotCount() { return GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots); } public void SetBankBagSlotCount(byte count) { SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots, count); } diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 00b5752e4..99ee49481 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -211,7 +211,13 @@ namespace Game.Entities return false; } - public int GetQuestLevel(Quest quest) { return quest != null && (quest.Level > 0) ? quest.Level : (int)getLevel(); } + public uint GetQuestLevel(Quest quest) + { + if (quest == null) + return getLevel(); + + return (uint)(quest.Level > 0 ? quest.Level : Math.Min((int)getLevel(), quest.MaxScalingLevel)); + } public bool IsQuestRewarded(uint quest_id) { @@ -1372,7 +1378,7 @@ namespace Game.Entities public bool SatisfyQuestRace(Quest qInfo, bool msg) { - int reqraces = qInfo.AllowableRaces; + long reqraces = qInfo.AllowableRaces; if (reqraces == -1) return true; diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index e58f5051d..b652ae536 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -224,33 +224,30 @@ namespace Game.Entities return GetUInt16Value(PlayerFields.SkillLineTempBonus + field, offset); } - public uint GetResurrectionSpellId() + void InitializeSelfResurrectionSpells() { - // search priceless resurrection possibilities - uint prio = 0; - uint spell_id = 0; + ClearDynamicValue(PlayerDynamicFields.SelfResSpells); + + uint[] spells = new uint[3]; + var dummyAuras = GetAuraEffectsByType(AuraType.Dummy); - foreach (var eff in dummyAuras) + foreach (var auraEffect in dummyAuras) { // Soulstone Resurrection // prio: 3 (max, non death persistent) - if (prio < 2 && eff.GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && eff.GetSpellInfo().SpellFamilyFlags[1].HasAnyFlag(0x1000000u)) - { - spell_id = 3026; - prio = 3; - } + if (auraEffect.GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && auraEffect.GetSpellInfo().SpellFamilyFlags[1].HasAnyFlag(0x1000000u)) + spells[0] = 3026; // Twisting Nether // prio: 2 (max) - else if (eff.GetId() == 23701 && RandomHelper.randChance(10)) - { - prio = 2; - spell_id = 23700; - } + else if (auraEffect.GetId() == 23701 && RandomHelper.randChance(10)) + spells[1] = 23700; } // Reincarnation (passive spell) // prio: 1 - if (prio < 1 && HasSpell(20608) && !GetSpellHistory().HasCooldown(21169)) - spell_id = 21169; + if (HasSpell(20608) && !GetSpellHistory().HasCooldown(21169)) + spells[2] = 21169; - return spell_id; + foreach (uint selfResSpell in spells) + if (selfResSpell != 0) + AddDynamicValue(PlayerDynamicFields.SelfResSpells, selfResSpell); } public void PetSpellInitialize() @@ -1027,7 +1024,8 @@ namespace Game.Entities // remove enchants from inventory items // NOTE: no need to remove these from stats, since these aren't equipped // in inventory - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem) diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index e90e38d93..a7b096fb1 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -231,6 +231,7 @@ namespace Game.Entities SetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor, (uint)PlayerRestState.NotRAFLinked); SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)createInfo.Sex); SetByteValue(PlayerFields.Bytes4, PlayerFieldOffsets.Bytes4OffsetArenaFaction, 0); + SetInventorySlotCount(InventorySlots.DefaultSize); SetGuidValue(ObjectFields.Data, ObjectGuid.Empty); SetUInt32Value(PlayerFields.GuildRank, 0); @@ -409,7 +410,8 @@ namespace Game.Entities // bags and main-hand weapon must equipped at this moment // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon) - for (var i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { Item pItem = GetItemByPos(InventorySlots.Bag0, i); if (pItem != null) @@ -744,13 +746,11 @@ namespace Game.Entities public override void setDeathState(DeathState s) { - uint ressSpellId = 0; - - bool cur = IsAlive(); + bool oldIsAlive = IsAlive(); if (s == DeathState.JustDied) { - if (!cur) + if (!oldIsAlive) { Log.outError(LogFilter.Player, "Player.setDeathState: Attempted to kill a dead player '{0}' ({1})", GetName(), GetGUID().ToString()); return; @@ -766,12 +766,8 @@ namespace Game.Entities //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD) RemovePet(null, PetSaveMode.NotInSlot, true); - // save value before aura remove in Unit::setDeathState - ressSpellId = GetUInt32Value(PlayerFields.SelfResSpell); + InitializeSelfResurrectionSpells(); - // passive spell - if (ressSpellId == 0) - ressSpellId = GetResurrectionSpellId(); UpdateCriteria(CriteriaTypes.DeathAtMap, 1); UpdateCriteria(CriteriaTypes.Death, 1); UpdateCriteria(CriteriaTypes.DeathInDungeon, 1); @@ -782,13 +778,9 @@ namespace Game.Entities base.setDeathState(s); - // restore resurrection spell id for player after aura remove - if (s == DeathState.JustDied && cur && ressSpellId != 0) - SetUInt32Value(PlayerFields.SelfResSpell, ressSpellId); - - if (IsAlive() && !cur) + if (IsAlive() && !oldIsAlive) //clear aura case after resurrection by another way (spells will be applied before next death) - SetUInt32Value(PlayerFields.SelfResSpell, 0); + ClearDynamicValue(PlayerDynamicFields.SelfResSpells); } public override void DestroyForPlayer(Player target) @@ -1667,15 +1659,15 @@ namespace Game.Entities continue; if (quest.IsDaily()) - rep = CalculateReputationGain(ReputationSource.DailyQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(ReputationSource.DailyQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); else if (quest.IsWeekly()) - rep = CalculateReputationGain(ReputationSource.WeeklyQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(ReputationSource.WeeklyQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); else if (quest.IsMonthly()) - rep = CalculateReputationGain(ReputationSource.MonthlyQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(ReputationSource.MonthlyQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); else if (quest.IsRepeatable()) - rep = CalculateReputationGain(ReputationSource.RepeatableQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(ReputationSource.RepeatableQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); else - rep = CalculateReputationGain(ReputationSource.Quest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(ReputationSource.Quest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); bool noSpillover = Convert.ToBoolean(quest.RewardReputationMask & (1 << i)); GetReputationMgr().ModifyReputation(factionEntry, rep, noSpillover); @@ -5003,11 +4995,13 @@ namespace Game.Entities DisplayPlayerChoice displayPlayerChoice = new DisplayPlayerChoice(); displayPlayerChoice.SenderGUID = sender; displayPlayerChoice.ChoiceID = choiceId; + displayPlayerChoice.UiTextureKitID = playerChoice.UiTextureKitId; displayPlayerChoice.Question = playerChoice.Question; if (playerChoiceLocale != null) ObjectManager.GetLocaleString(playerChoiceLocale.Question, locale, ref displayPlayerChoice.Question); displayPlayerChoice.CloseChoiceFrame = false; + displayPlayerChoice.HideWarboardHeader = playerChoice.HideWarboardHeader; for (var i = 0; i < playerChoice.Responses.Count; ++i) { @@ -5900,7 +5894,9 @@ namespace Game.Entities RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (UnitBytes2Flags.FFAPvp | UnitBytes2Flags.Sanctuary)); // restore if need some important flags - SetUInt32Value(PlayerFields.FieldBytes2, 0); // flags empty by default + SetByteValue(PlayerFields.FieldBytes2, PlayerFieldOffsets.FieldBytes2OffsetIgnorePowerRegenPredictionMask, 0); + SetByteValue(PlayerFields.FieldBytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, 0); + SetByteValue(PlayerFields.FieldBytes2, 3, 0); if (reapplyMods) // reapply stats values only on .reset stats (level) command _ApplyAllStatBonuses(); @@ -6512,7 +6508,7 @@ namespace Game.Entities packet.Reason = victim ? PlayerLogXPReason.Kill : PlayerLogXPReason.NoKill; packet.Amount = (int)xp; packet.GroupBonus = group_rate; - packet.ReferAFriend = recruitAFriend; + packet.ReferAFriendBonusType = (byte)(recruitAFriend ? 1 : 0); SendPacket(packet); uint curXP = GetUInt32Value(PlayerFields.Xp); diff --git a/Source/Game/Entities/Transport.cs b/Source/Game/Entities/Transport.cs index 83cdae569..a7bbb43b3 100644 --- a/Source/Game/Entities/Transport.cs +++ b/Source/Game/Entities/Transport.cs @@ -673,8 +673,10 @@ namespace Game.Entities z = nextFrame.Node.Loc.Z, o = nextFrame.InitialOrientation; - foreach (var obj in _passengers) + for (var i =0; i < _passengers.Count; ++i) { + WorldObject obj = _passengers[i]; + float destX, destY, destZ, destO; obj.m_movementInfo.transport.pos.GetPosition(out destX, out destY, out destZ, out destO); TransportPosHelper.CalculatePassengerPosition(ref destX, ref destY, ref destZ, ref destO, x, y, z, o); diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index cd7edf552..3a915ff2d 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -441,10 +441,10 @@ namespace Game public void LoadRaceAndClassExpansionRequirements() { uint oldMSTime = Time.GetMSTime(); - _raceExpansionRequirementStorage.Clear(); + _raceUnlockRequirementStorage.Clear(); - // 0 1 - SQLResult result = DB.World.Query("SELECT raceID, expansion FROM `race_expansion_requirement`"); + // 0 1 2 + SQLResult result = DB.World.Query("SELECT raceID, expansion, achievementId FROM `race_expansion_requirement`"); if (!result.IsEmpty()) { uint count = 0; @@ -452,21 +452,32 @@ namespace Game { byte raceID = result.Read(0); byte expansion = result.Read(1); + uint achievementId = result.Read(2); ChrRacesRecord raceEntry = CliDB.ChrRacesStorage.LookupByKey(raceID); if (raceEntry == null) { - Log.outError(LogFilter.Sql, "Race {0} defined in `race_expansion_requirement` does not exists, skipped.", raceID); + Log.outError(LogFilter.Sql, "Race {0} defined in `race_unlock_requirement` does not exists, skipped.", raceID); continue; } - if (expansion >= (int)Expansion.Max) + if (expansion >= (int)Expansion.MaxAccountExpansions) { - Log.outError(LogFilter.Sql, "Race {0} defined in `race_expansion_requirement` has incorrect expansion {1}, skipped.", raceID, expansion); + Log.outError(LogFilter.Sql, "Race {0} defined in `race_unlock_requirement` has incorrect expansion {1}, skipped.", raceID, expansion); continue; } - _raceExpansionRequirementStorage[raceID] = expansion; + if (achievementId != 0 && !CliDB.AchievementStorage.ContainsKey(achievementId)) + { + Log.outError(LogFilter.Sql, $"Race {raceID} defined in `race_unlock_requirement` has incorrect achievement {achievementId}, skipped."); + continue; + } + + RaceUnlockRequirement raceUnlockRequirement = new RaceUnlockRequirement(); + raceUnlockRequirement.Expansion = expansion; + raceUnlockRequirement.AchievementId = achievementId; + + _raceUnlockRequirementStorage[raceID] = raceUnlockRequirement; ++count; } @@ -573,13 +584,8 @@ namespace Game } return false; } - public Dictionary GetRaceExpansionRequirements() { return _raceExpansionRequirementStorage; } - public Expansion GetRaceExpansionRequirement(Race race) - { - if (_raceExpansionRequirementStorage.ContainsKey((byte)race)) - return (Expansion)_raceExpansionRequirementStorage[(byte)race]; - return Expansion.Classic; - } + public Dictionary GetRaceUnlockRequirements() { return _raceUnlockRequirementStorage; } + public RaceUnlockRequirement GetRaceUnlockRequirement(Race race) { return _raceUnlockRequirementStorage.LookupByKey((byte)race); } public Dictionary GetClassExpansionRequirements() { return _classExpansionRequirementStorage; } public Expansion GetClassExpansionRequirement(Class class_) { @@ -4854,7 +4860,7 @@ namespace Game if (id == -1) return equip[RandomHelper.IRand(0, equip.Count - 1)].Item2; else - return equip.Find(p => p.Item1 == id).Item2; + return equip.Find(p => p.Item1 == id)?.Item2; } //Maps @@ -6187,35 +6193,35 @@ namespace Game _exclusiveQuestGroups.Clear(); SQLResult result = DB.World.Query("SELECT " + - //0 1 2 3 4 5 6 7 8 9 10 - "ID, QuestType, QuestLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " + - //11 12 13 14 15 16 17 18 19 20 21 + //0 1 2 3 4 5 6 7 8 9 10 11 + "ID, QuestType, QuestLevel, MaxScalingLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " + + //12 13 14 15 16 17 18 19 20 21 22 "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, " + - //22 23 24 25 26 + //23 24 25 26 27 "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, " + - //27 28 29 30 31 32 33 34 + //28 29 30 31 32 33 34 35 "RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " + - //35 36 37 38 39 40 41 42 + //36 37 38 39 40 41 42 43 "RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, " + - //43 44 45 46 47 48 + //44 45 46 47 48 49 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, " + - //49 50 51 52 53 54 + //50 51 52 53 54 55 "RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, " + - //55 56 57 58 59 60 + //56 57 58 59 60 61 "RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, " + - //61 62 63 64 65 66 67 68 69 70 + //62 63 64 65 66 67 68 69 70 71 "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, " + - //71 72 73 74 75 76 77 78 + //72 73 74 75 76 77 78 79 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, " + - //79 80 81 82 83 84 85 86 + //80 81 82 83 84 85 86 87 "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, " + - //87 88 89 90 91 + //88 89 90 91 92 "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " + - //92 93 94 95 96 97 98 99 + //93 94 95 96 97 98 99 100 "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " + - //100 101 102 103 104 105 106 + //101 102 103 104 105 106 107 "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, Expansion, " + - //107 108 109 110 111 112 113 114 115 + //108 109 110 111 112 113 114 115 116 "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" + " FROM quest_template"); @@ -6506,7 +6512,7 @@ namespace Game // AllowableRaces, can be -1/RACEMASK_ALL_PLAYABLE to allow any race if (qinfo.AllowableRaces != -1) { - if (!Convert.ToBoolean(qinfo.AllowableRaces & (uint)Race.RaceMaskAllPlayable)) + if (qinfo.AllowableRaces > 0 && !Convert.ToBoolean(qinfo.AllowableRaces & (long)Race.RaceMaskAllPlayable)) { Log.outError(LogFilter.Sql, "Quest {0} does not contain any playable races in `RequiredRaces` ({1}), value set to 0 (all races).", qinfo.Id, qinfo.AllowableRaces); qinfo.AllowableRaces = -1; @@ -7137,8 +7143,8 @@ namespace Game uint count = 0; - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - SQLResult result = DB.World.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1 FROM quest_poi order by QuestID, Idx1"); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + SQLResult result = DB.World.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs FROM quest_poi order by QuestID, Idx1"); if (result.IsEmpty()) { Log.outError(LogFilter.ServerLoading, "Loaded 0 quest POI definitions. DB table `quest_poi` is empty."); @@ -7182,11 +7188,12 @@ namespace Game int WorldEffectID = result.Read(11); int PlayerConditionID = result.Read(12); int WoDUnk1 = result.Read(13); + bool AlwaysAllowMergingBlobs = result.Read(14); if (Global.ObjectMgr.GetQuestTemplate(QuestID) == null) Log.outError(LogFilter.Sql, "`quest_poi` quest id ({0}) Idx1 ({1}) does not exist in `quest_template`", QuestID, Idx1); - QuestPOI POI = new QuestPOI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1); + QuestPOI POI = new QuestPOI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs); if (!POIs.ContainsKey(QuestID) || !POIs[QuestID].ContainsKey(Idx1)) { Log.outError(LogFilter.Sql, "Table quest_poi references unknown quest points for quest {0} POI id {1}", QuestID, BlobIndex); @@ -8640,7 +8647,7 @@ namespace Game uint oldMSTime = Time.GetMSTime(); _playerChoices.Clear(); - SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, Question FROM playerchoice"); + SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader FROM playerchoice"); if (choiceResult.IsEmpty()) { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 player choices. DB table `playerchoice` is empty."); @@ -8655,12 +8662,13 @@ namespace Game do { - int choiceId = choiceResult.Read(0); - PlayerChoice choice = new PlayerChoice(); - choice.ChoiceId = choiceId; - choice.Question = choiceResult.Read(1); - _playerChoices[choiceId] = choice; + choice.ChoiceId = choiceResult.Read(0); + choice.UiTextureKitId = choiceResult.Read(1); + choice.Question = choiceResult.Read(2); + choice.HideWarboardHeader = choiceResult.Read(3); + + _playerChoices[choice.ChoiceId] = choice; } while (choiceResult.NextRow()); @@ -9466,7 +9474,7 @@ namespace Game List _reservedNamesStorage = new List(); Dictionary _sceneTemplateStorage = new Dictionary(); - Dictionary _raceExpansionRequirementStorage = new Dictionary(); + Dictionary _raceUnlockRequirementStorage = new Dictionary(); Dictionary _classExpansionRequirementStorage = new Dictionary(); Dictionary _realmNameStorage = new Dictionary(); @@ -9963,7 +9971,7 @@ namespace Game public class QuestPOI { public QuestPOI(int _BlobIndex, int _ObjectiveIndex, int _QuestObjectiveID, int _QuestObjectID, int _MapID, int _WorldMapAreaID, int _Foor, int _Priority, int _Flags, - int _WorldEffectID, int _PlayerConditionID, int _UnkWoD1) + int _WorldEffectID, int _PlayerConditionID, int _UnkWoD1, bool _AlwaysAllowMergingBlobs) { BlobIndex = _BlobIndex; ObjectiveIndex = _ObjectiveIndex; @@ -9977,6 +9985,7 @@ namespace Game WorldEffectID = _WorldEffectID; PlayerConditionID = _PlayerConditionID; UnkWoD1 = _UnkWoD1; + AlwaysAllowMergingBlobs = _AlwaysAllowMergingBlobs; } public int BlobIndex; @@ -9992,6 +10001,7 @@ namespace Game public int PlayerConditionID; public int UnkWoD1; public List points = new List(); + public bool AlwaysAllowMergingBlobs; } public class QuestPOIPoint @@ -10425,7 +10435,15 @@ namespace Game } public int ChoiceId; + public int UiTextureKitId; public string Question; public List Responses = new List(); + public bool HideWarboardHeader; + } + + public class RaceUnlockRequirement + { + public byte Expansion; + public uint AchievementId; } } diff --git a/Source/Game/Guilds/GuildManager.cs b/Source/Game/Guilds/GuildManager.cs index 325a2a6c9..4728c8d61 100644 --- a/Source/Game/Guilds/GuildManager.cs +++ b/Source/Game/Guilds/GuildManager.cs @@ -462,7 +462,7 @@ namespace Game reward.ItemID = result.Read(0); reward.MinGuildRep = result.Read(1); - reward.RaceMask = result.Read(2); + reward.RaceMask = result.Read(2); reward.Cost = result.Read(3); if (Global.ObjectMgr.GetItemTemplate(reward.ItemID) == null) @@ -524,7 +524,7 @@ namespace Game { public uint ItemID; public byte MinGuildRep; - public int RaceMask; + public ulong RaceMask; public ulong Cost; public List AchievementsRequired = new List(); } diff --git a/Source/Game/Handlers/AuthenticationHandler.cs b/Source/Game/Handlers/AuthenticationHandler.cs index 89d488a3d..55f88e7db 100644 --- a/Source/Game/Handlers/AuthenticationHandler.cs +++ b/Source/Game/Handlers/AuthenticationHandler.cs @@ -32,7 +32,7 @@ namespace Game response.SuccessInfo.HasValue = true; response.SuccessInfo.Value = new AuthResponse.AuthSuccessInfo(); - response.SuccessInfo.Value.AccountExpansionLevel = (byte)GetExpansion(); + response.SuccessInfo.Value.AccountExpansionLevel = (byte)GetAccountExpansion(); response.SuccessInfo.Value.ActiveExpansionLevel = (byte)GetExpansion(); response.SuccessInfo.Value.VirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress(); response.SuccessInfo.Value.Time = (uint)Time.UnixTime; @@ -47,7 +47,6 @@ namespace Game response.SuccessInfo.Value.Templates.Add(templ); response.SuccessInfo.Value.AvailableClasses = Global.ObjectMgr.GetClassExpansionRequirements(); - response.SuccessInfo.Value.AvailableRaces = Global.ObjectMgr.GetRaceExpansionRequirements(); } if (queued) diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index da478cfe7..42d7ae405 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -108,15 +108,23 @@ namespace Game else charResult.HasDemonHunterOnRealm = false; - if (charInfo.Level >= WorldConfig.GetIntValue(WorldCfg.CharacterCreatingMinLevelForDemonHunter) || canAlwaysCreateDemonHunter) - charResult.HasLevel70OnRealm = true; + charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.Level); charResult.Characters.Add(charInfo); } while (result.NextRow()); } - charResult.IsDemonHunterCreationAllowed = (!charResult.HasDemonHunterOnRealm && charResult.HasLevel70OnRealm) || canAlwaysCreateDemonHunter; + charResult.IsDemonHunterCreationAllowed = GetAccountExpansion() >= Expansion.Legion || canAlwaysCreateDemonHunter; + charResult.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= Expansion.BattleForAzeroth; + + foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) + { + EnumCharactersResult.RaceUnlock raceUnlock = new EnumCharactersResult.RaceUnlock(); + raceUnlock.RaceID = requirement.Key; + raceUnlock.HasExpansion = (byte)GetAccountExpansion() >= requirement.Value.Expansion; + charResult.RaceUnlockData.Add(raceUnlock); + } SendPacket(charResult); } @@ -212,19 +220,34 @@ namespace Game } // prevent character creating Expansion race without Expansion account - var raceExpansionRequirement = Global.ObjectMgr.GetRaceExpansionRequirement(charCreate.CreateInfo.RaceId); - if (raceExpansionRequirement > GetExpansion()) + RaceUnlockRequirement raceExpansionRequirement = Global.ObjectMgr.GetRaceUnlockRequirement(charCreate.CreateInfo.RaceId); + if (raceExpansionRequirement == null) { - Log.outError(LogFilter.Network, "Expansion {0} account:[{1}] tried to Create character with expansion {2} race ({3})", GetExpansion(), GetAccountId(), raceExpansionRequirement, charCreate.CreateInfo.RaceId); + Log.outError(LogFilter.Player, "Account {GetAccountId()} tried to create character with unavailable race {charCreate.CreateInfo.RaceId}"); + SendCharCreate(ResponseCodes.AccountCreateFailed); + return; + } + + if (raceExpansionRequirement.Expansion > (byte)GetAccountExpansion()) + { + Log.outError(LogFilter.Player, $"Expansion {GetAccountExpansion()} account:[{GetAccountId()}] tried to Create character with expansion {raceExpansionRequirement.Expansion} race ({charCreate.CreateInfo.RaceId})"); SendCharCreate(ResponseCodes.CharCreateExpansion); return; } + //if (raceExpansionRequirement->AchievementId && !) + //{ + // TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character without achievement %u race (%u)", + // GetAccountExpansion(), GetAccountId(), raceExpansionRequirement->AchievementId, charCreate.CreateInfo->Race); + // SendCharCreate(CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT); + // return; + //} + // prevent character creating Expansion class without Expansion account var classExpansionRequirement = Global.ObjectMgr.GetClassExpansionRequirement(charCreate.CreateInfo.ClassId); - if (classExpansionRequirement > GetExpansion()) + if (classExpansionRequirement > GetAccountExpansion()) { - Log.outError(LogFilter.Network, "Expansion {0} account:[{1}] tried to Create character with expansion {2} class ({3})", GetExpansion(), GetAccountId(), classExpansionRequirement, charCreate.CreateInfo.ClassId); + Log.outError(LogFilter.Network, $"Expansion {GetAccountExpansion()} account:[{GetAccountId()}] tried to Create character with expansion {classExpansionRequirement} class ({charCreate.CreateInfo.ClassId})"); SendCharCreate(ResponseCodes.CharCreateExpansionClass); return; } @@ -409,7 +432,7 @@ namespace Game if (checkDemonHunterReqs && !hasDemonHunterReqLevel) { - SendCharCreate(ResponseCodes.CharCreateFailed); + SendCharCreate(ResponseCodes.CharCreateLevelRequirementDemonHunter); return; } @@ -1818,7 +1841,7 @@ namespace Game var questTemplates = Global.ObjectMgr.GetQuestTemplates(); foreach (Quest quest in questTemplates.Values) { - uint newRaceMask = (uint)(newTeamId == TeamId.Alliance ? Race.RaceMaskAlliance : Race.RaceMaskHorde); + long newRaceMask = (long)(newTeamId == TeamId.Alliance ? Race.RaceMaskAlliance : Race.RaceMaskHorde); if (quest.AllowableRaces != -1 && !Convert.ToBoolean(quest.AllowableRaces & newRaceMask)) { stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST); diff --git a/Source/Game/Handlers/QueryHandler.cs b/Source/Game/Handlers/QueryHandler.cs index 59a26ac33..0009daf18 100644 --- a/Source/Game/Handlers/QueryHandler.cs +++ b/Source/Game/Handlers/QueryHandler.cs @@ -396,6 +396,7 @@ namespace Game questPOIBlobData.WorldEffectID = data.WorldEffectID; questPOIBlobData.PlayerConditionID = data.PlayerConditionID; questPOIBlobData.UnkWoD1 = data.UnkWoD1; + questPOIBlobData.AlwaysAllowMergingBlobs = data.AlwaysAllowMergingBlobs; foreach (var point in data.points) questPOIBlobData.QuestPOIBlobPointStats.Add(new QuestPOIBlobPoint(point.X, point.Y)); diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index 51edced3b..641e8a85f 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -445,19 +445,20 @@ namespace Game } [WorldPacketHandler(ClientOpcodes.SelfRes)] - void HandleSelfRes(SelfRes packet) + void HandleSelfRes(SelfRes selfRes) { if (_player.HasAuraType(AuraType.PreventResurrection)) return; // silent return, client should display error by itself and not send this opcode - if (_player.GetUInt32Value(PlayerFields.SelfResSpell) != 0) - { - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(_player.GetUInt32Value(PlayerFields.SelfResSpell)); - if (spellInfo != null) - _player.CastSpell(_player, spellInfo, false, null); + var selfResSpells = _player.GetDynamicValues(PlayerDynamicFields.SelfResSpells); + if (!selfResSpells.Contains(selfRes.SpellId)) + return; - _player.SetUInt32Value(PlayerFields.SelfResSpell, 0); - } + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(selfRes.SpellId); + if (spellInfo != null) + _player.CastSpell(_player, spellInfo, false, null); + + _player.RemoveDynamicValue(PlayerDynamicFields.SelfResSpells, selfRes.SpellId); } [WorldPacketHandler(ClientOpcodes.SpellClick)] diff --git a/Source/Game/Handlers/VoidStorageHandler.cs b/Source/Game/Handlers/VoidStorageHandler.cs index 0f8eab2af..0f540f75c 100644 --- a/Source/Game/Handlers/VoidStorageHandler.cs +++ b/Source/Game/Handlers/VoidStorageHandler.cs @@ -128,7 +128,8 @@ namespace Game if (bag) freeBagSlots += bag.GetFreeSlots(); } - for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) + int inventoryEnd = InventorySlots.ItemStart + _player.GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++) { if (!player.GetItemByPos(InventorySlots.Bag0, i)) ++freeBagSlots; diff --git a/Source/Game/Network/Packets/AuthenticationPackets.cs b/Source/Game/Network/Packets/AuthenticationPackets.cs index 72726c0aa..f50e3bd66 100644 --- a/Source/Game/Network/Packets/AuthenticationPackets.cs +++ b/Source/Game/Network/Packets/AuthenticationPackets.cs @@ -132,18 +132,11 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(SuccessInfo.Value.ActiveExpansionLevel); _worldPacket.WriteUInt8(SuccessInfo.Value.AccountExpansionLevel); _worldPacket.WriteUInt32(SuccessInfo.Value.TimeSecondsUntilPCKick); - _worldPacket.WriteUInt32(SuccessInfo.Value.AvailableRaces.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.AvailableClasses.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.Templates.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.CurrencyID); _worldPacket.WriteUInt32(SuccessInfo.Value.Time); - foreach (var race in SuccessInfo.Value.AvailableRaces) - { - _worldPacket.WriteUInt8(race.Key); /// the current race - _worldPacket.WriteUInt8(race.Value); /// the required Expansion - } - foreach (var klass in SuccessInfo.Value.AvailableClasses) { _worldPacket.WriteUInt8(klass.Key); /// the current class @@ -219,7 +212,6 @@ namespace Game.Network.Packets public List Templates = new List(); // list of pre-made character templates. @todo implement public Dictionary AvailableClasses; // the minimum AccountExpansion required to select the classes - public Dictionary AvailableRaces; // the minimum AccountExpansion required to select the races public bool IsExpansionTrial; public bool ForceCharacterTemplate; // forces the client to always use a character template when creating a new character. @see Templates. @todo implement diff --git a/Source/Game/Network/Packets/CharacterPackets.cs b/Source/Game/Network/Packets/CharacterPackets.cs index affa32c6b..af8b11afb 100644 --- a/Source/Game/Network/Packets/CharacterPackets.cs +++ b/Source/Game/Network/Packets/CharacterPackets.cs @@ -44,79 +44,35 @@ namespace Game.Network.Packets _worldPacket.WriteBit(IsDeletedCharacters); _worldPacket.WriteBit(IsDemonHunterCreationAllowed); _worldPacket.WriteBit(HasDemonHunterOnRealm); - _worldPacket.WriteBit(HasLevel70OnRealm); _worldPacket.WriteBit(Unknown7x); _worldPacket.WriteBit(DisabledClassesMask.HasValue); + _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket.WriteUInt32(Characters.Count); - _worldPacket.WriteUInt32(FactionChangeRestrictions.Count); + _worldPacket.WriteInt32(MaxCharacterLevel); + _worldPacket.WriteUInt32(RaceUnlockData.Count); if (DisabledClassesMask.HasValue) _worldPacket.WriteUInt32(DisabledClassesMask.Value); - foreach (RestrictedFactionChangeRuleInfo rule in FactionChangeRestrictions) - { - _worldPacket.WriteUInt32(rule.Mask); - _worldPacket.WriteUInt8(rule.Race); - } - foreach (CharacterInfo charInfo in Characters) - { - _worldPacket.WritePackedGuid(charInfo.Guid); - _worldPacket.WriteUInt8(charInfo.ListPosition); - _worldPacket.WriteUInt8(charInfo.RaceId); - _worldPacket.WriteUInt8(charInfo.ClassId); - _worldPacket.WriteUInt8(charInfo.Sex); - _worldPacket.WriteUInt8(charInfo.Skin); - _worldPacket.WriteUInt8(charInfo.Face); - _worldPacket.WriteUInt8(charInfo.HairStyle); - _worldPacket.WriteUInt8(charInfo.HairColor); - _worldPacket.WriteUInt8(charInfo.FacialHair); - charInfo.CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id)); - _worldPacket.WriteUInt8(charInfo.Level); - _worldPacket.WriteUInt32(charInfo.ZoneId); - _worldPacket.WriteUInt32(charInfo.MapId); - _worldPacket.WriteVector3(charInfo.PreLoadPosition); - _worldPacket.WritePackedGuid(charInfo.GuildGuid); - _worldPacket.WriteUInt32(charInfo.Flags); - _worldPacket.WriteUInt32(charInfo.CustomizationFlag); - _worldPacket.WriteUInt32(charInfo.Flags3); - _worldPacket.WriteUInt32(charInfo.Pet.CreatureDisplayId); - _worldPacket.WriteUInt32(charInfo.Pet.Level); - _worldPacket.WriteUInt32(charInfo.Pet.CreatureFamily); + charInfo.Write(_worldPacket); - _worldPacket.WriteUInt32(charInfo.ProfessionIds[0]); - _worldPacket.WriteUInt32(charInfo.ProfessionIds[1]); - - foreach (var visualItem in charInfo.VisualItems) - { - _worldPacket.WriteUInt32(visualItem.DisplayId); - _worldPacket.WriteUInt32(visualItem.DisplayEnchantId); - _worldPacket.WriteUInt8(visualItem.InventoryType); - } - - _worldPacket.WriteUInt32(charInfo.LastPlayedTime); - _worldPacket.WriteUInt16(charInfo.SpecID); - _worldPacket.WriteUInt32(charInfo.Unknown703); - _worldPacket.WriteUInt32(charInfo.Flags4); - _worldPacket.WriteBits(charInfo.Name.GetByteCount(), 6); - _worldPacket.WriteBit(charInfo.FirstLogin); - _worldPacket.WriteBit(charInfo.BoostInProgress); - _worldPacket.WriteBits(charInfo.unkWod61x, 5); - _worldPacket.WriteString(charInfo.Name); - } + foreach (RaceUnlock raceUnlock in RaceUnlockData) + raceUnlock.Write(_worldPacket); } public bool Success; public bool IsDeletedCharacters; // used for character undelete list public bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access public bool HasDemonHunterOnRealm = false; - public bool HasLevel70OnRealm = false; public bool Unknown7x = false; + public bool IsAlliedRacesCreationAllowed = false; + public int MaxCharacterLevel = 1; public Optional DisabledClassesMask = new Optional(); public List Characters = new List(); // all characters on the list - public List FactionChangeRestrictions = new List(); // @todo: research + public List RaceUnlockData = new List(); ///< public class CharacterInfo { @@ -130,8 +86,8 @@ namespace Game.Network.Packets // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " // 19 20 21 22 23 24 25 // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " - // 26 27 28 29 30 - // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, character_declinedname.genitive" + // 26 27 28 29 30 31 + // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, character_declinedname.genitive" Guid = ObjectGuid.Create(HighGuid.Player, fields.Read(0)); Name = fields.Read(1); @@ -176,7 +132,7 @@ namespace Game.Network.Packets if (fields.Read(26) != 0) Flags |= CharacterFlags.LockedByBilling; - if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read(30))) + if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read(31))) Flags |= CharacterFlags.Declined; if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize)) @@ -214,6 +170,8 @@ namespace Game.Network.Packets if (spec != null) SpecID = (ushort)spec.Id; + LastLoginBuild = fields.Read(30); + for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot) { VisualItems[slot].InventoryType = (byte)equipment.NextUInt32(); @@ -222,6 +180,53 @@ namespace Game.Network.Packets } } + public void Write(WorldPacket data) + { + data.WritePackedGuid(Guid); + data.WriteUInt8(ListPosition); + data.WriteUInt8(RaceId); + data.WriteUInt8(ClassId); + data.WriteUInt8(Sex); + data.WriteUInt8(Skin); + data.WriteUInt8(Face); + data.WriteUInt8(HairStyle); + data.WriteUInt8(HairColor); + data.WriteUInt8(FacialHair); + + foreach (var display in CustomDisplay) + data.WriteUInt8(display); + + data.WriteUInt8(Level); + data.WriteUInt32(ZoneId); + data.WriteUInt32(MapId); + data.WriteVector3(PreLoadPosition); + data.WritePackedGuid(GuildGuid); + data.WriteUInt32(Flags); + data.WriteUInt32(CustomizationFlag); + data.WriteUInt32(Flags3); + data.WriteUInt32(Pet.CreatureDisplayId); + data.WriteUInt32(Pet.Level); + data.WriteUInt32(Pet.CreatureFamily); + + data.WriteUInt32(ProfessionIds[0]); + data.WriteUInt32(ProfessionIds[1]); + + foreach (var visualItem in VisualItems) + visualItem.Write(data); + + data.WriteUInt32(LastPlayedTime); + data.WriteUInt16(SpecID); + data.WriteUInt32(Unknown703); + data.WriteUInt32(Flags4); + data.WriteBits(Name.GetByteCount(), 6); + data.WriteBit(FirstLogin); + data.WriteBit(BoostInProgress); + data.WriteBits(unkWod61x, 5); + data.FlushBits(); + + data.WriteString(Name); + } + public ObjectGuid Guid; public string Name; public byte ListPosition; // Order of the characters in list @@ -248,6 +253,7 @@ namespace Game.Network.Packets public uint LastPlayedTime; public ushort SpecID; public uint Unknown703; + public uint LastLoginBuild; public PetInfo Pet = new PetInfo(); public bool BoostInProgress; // @todo public uint[] ProfessionIds = new uint[2]; // @todo @@ -255,6 +261,13 @@ namespace Game.Network.Packets public struct VisualItemInfo { + public void Write(WorldPacket data) + { + data.WriteUInt32(DisplayId); + data.WriteUInt32(DisplayEnchantId); + data.WriteUInt8(InventoryType); + } + public uint DisplayId; public uint DisplayEnchantId; public byte InventoryType; @@ -267,16 +280,21 @@ namespace Game.Network.Packets } } - public struct RestrictedFactionChangeRuleInfo + public struct RaceUnlock { - public RestrictedFactionChangeRuleInfo(uint mask, byte race) + public void Write(WorldPacket data) { - Mask = mask; - Race = race; + data.WriteInt32(RaceID); + data.WriteBit(HasExpansion); + data.WriteBit(HasAchievement); + data.WriteBit(HasHeritageArmor); + data.FlushBits(); } - public uint Mask; - public byte Race; + public int RaceID; + public bool HasExpansion; + public bool HasAchievement; + public bool HasHeritageArmor; } } @@ -832,8 +850,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt8(Reason); _worldPacket.WriteInt32(Amount); _worldPacket.WriteFloat(GroupBonus); - _worldPacket.WriteBit(ReferAFriend); - _worldPacket.FlushBits(); + _worldPacket.WriteUInt8(ReferAFriendBonusType); } public ObjectGuid Victim; @@ -841,7 +858,7 @@ namespace Game.Network.Packets public PlayerLogXPReason Reason; public int Amount; public float GroupBonus; - public bool ReferAFriend; + public byte ReferAFriendBonusType; // 1 - 300% of normal XP; 2 - 150% of normal XP } class TitleEarned : ServerPacket diff --git a/Source/Game/Network/Packets/GuildPackets.cs b/Source/Game/Network/Packets/GuildPackets.cs index 0b9071490..3ca83f9eb 100644 --- a/Source/Game/Network/Packets/GuildPackets.cs +++ b/Source/Game/Network/Packets/GuildPackets.cs @@ -1467,7 +1467,7 @@ namespace Game.Network.Packets data.WriteUInt32(ItemID); data.WriteUInt32(Unk4); data.WriteUInt32(AchievementsRequired.Count); - data.WriteUInt32(RaceMask); + data.WriteUInt64(RaceMask); data.WriteUInt32(MinGuildLevel); data.WriteUInt32(MinGuildRep); data.WriteUInt64(Cost); @@ -1479,7 +1479,7 @@ namespace Game.Network.Packets public uint ItemID; public uint Unk4; public List AchievementsRequired = new List(); - public uint RaceMask; + public ulong RaceMask; public int MinGuildLevel; public int MinGuildRep; public ulong Cost; diff --git a/Source/Game/Network/Packets/InstancePackets.cs b/Source/Game/Network/Packets/InstancePackets.cs index da28dd949..469650d5a 100644 --- a/Source/Game/Network/Packets/InstancePackets.cs +++ b/Source/Game/Network/Packets/InstancePackets.cs @@ -218,12 +218,15 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(MaxInCombatResCount); _worldPacket.WriteUInt32(CombatResChargeRecovery); _worldPacket.WriteUInt32(NextCombatResChargeTime); + _worldPacket.WriteBit(InProgress); + _worldPacket.FlushBits(); } public uint InCombatResCount; // amount of usable battle ressurections public uint MaxInCombatResCount; public uint CombatResChargeRecovery; public uint NextCombatResChargeTime; + public bool InProgress = true; } class InstanceEncounterEnd : ServerPacket diff --git a/Source/Game/Network/Packets/ItemPackets.cs b/Source/Game/Network/Packets/ItemPackets.cs index a4f6d836a..14c033ccb 100644 --- a/Source/Game/Network/Packets/ItemPackets.cs +++ b/Source/Game/Network/Packets/ItemPackets.cs @@ -703,6 +703,13 @@ namespace Game.Network.Packets public ObjectGuid ItemGuid { get; set; } } + class CharacterInventoryOverflowWarning : ServerPacket + { + public CharacterInventoryOverflowWarning() : base(ServerOpcodes.CharacterInventoryOverflowWarning) { } + + public override void Write() { } + } + //Structs public class ItemBonusInstanceData { diff --git a/Source/Game/Network/Packets/NPCPackets.cs b/Source/Game/Network/Packets/NPCPackets.cs index fdffac94f..9a70517c8 100644 --- a/Source/Game/Network/Packets/NPCPackets.cs +++ b/Source/Game/Network/Packets/NPCPackets.cs @@ -76,6 +76,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(text.QuestID); _worldPacket.WriteInt32(text.QuestType); _worldPacket.WriteInt32(text.QuestLevel); + _worldPacket.WriteInt32(text.QuestMaxScalingLevel); _worldPacket.WriteInt32(text.QuestFlags); _worldPacket.WriteInt32(text.QuestFlagsEx); @@ -308,6 +309,7 @@ namespace Game.Network.Packets public int QuestID; public int QuestType; public int QuestLevel; + public int QuestMaxScalingLevel; public bool Repeatable; public string QuestTitle; public int QuestFlags; diff --git a/Source/Game/Network/Packets/QueryPackets.cs b/Source/Game/Network/Packets/QueryPackets.cs index 15f18524a..ff591ee8f 100644 --- a/Source/Game/Network/Packets/QueryPackets.cs +++ b/Source/Game/Network/Packets/QueryPackets.cs @@ -437,6 +437,9 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(questPOIBlobPoint.X); _worldPacket.WriteInt32(questPOIBlobPoint.Y); } + + _worldPacket.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs); + _worldPacket.FlushBits(); } } } @@ -759,6 +762,7 @@ namespace Game.Network.Packets public int PlayerConditionID; public int UnkWoD1; public List QuestPOIBlobPointStats = new List(); + public bool AlwaysAllowMergingBlobs; } public class QuestPOIData diff --git a/Source/Game/Network/Packets/QuestPackets.cs b/Source/Game/Network/Packets/QuestPackets.cs index 42ddc8715..a03452429 100644 --- a/Source/Game/Network/Packets/QuestPackets.cs +++ b/Source/Game/Network/Packets/QuestPackets.cs @@ -117,6 +117,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(Info.QuestID); _worldPacket.WriteInt32(Info.QuestType); _worldPacket.WriteInt32(Info.QuestLevel); + _worldPacket.WriteInt32(Info.QuestMaxScalingLevel); _worldPacket.WriteInt32(Info.QuestPackageID); _worldPacket.WriteInt32(Info.QuestMinLevel); _worldPacket.WriteInt32(Info.QuestSortID); @@ -194,7 +195,7 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(Info.TimeAllowed); _worldPacket.WriteUInt32(Info.Objectives.Count); - _worldPacket.WriteInt32(Info.AllowableRaces); + _worldPacket.WriteInt64(Info.AllowableRaces); _worldPacket.WriteInt32(Info.QuestRewardID); _worldPacket.WriteInt32(Info.Expansion); @@ -619,6 +620,7 @@ namespace Game.Network.Packets _worldPacket.WriteUInt32(gossip.QuestID); _worldPacket.WriteUInt32(gossip.QuestType); _worldPacket.WriteUInt32(gossip.QuestLevel); + _worldPacket.WriteUInt32(gossip.QuestMaxScalingLevel); _worldPacket.WriteUInt32(gossip.QuestFlags); _worldPacket.WriteUInt32(gossip.QuestFlagsEx); @@ -827,8 +829,10 @@ namespace Game.Network.Packets _worldPacket.WriteInt32(ChoiceID); _worldPacket.WriteUInt32(Responses.Count); _worldPacket.WritePackedGuid(SenderGUID); + _worldPacket.WriteInt32(UiTextureKitID); _worldPacket.WriteBits(Question.GetByteCount(), 8); _worldPacket.WriteBit(CloseChoiceFrame); + _worldPacket.WriteBit(HideWarboardHeader); _worldPacket.FlushBits(); foreach (PlayerChoiceResponse response in Responses) @@ -839,9 +843,11 @@ namespace Game.Network.Packets public ObjectGuid SenderGUID; public int ChoiceID; + public int UiTextureKitID; public string Question; public List Responses = new List(); public bool CloseChoiceFrame; + public bool HideWarboardHeader; } class ChoiceResponse : ClientPacket @@ -897,6 +903,7 @@ namespace Game.Network.Packets public uint QuestID; public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) public int QuestLevel; // may be -1, static data, in other cases must be used dynamic level: Player.GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) + public int QuestMaxScalingLevel = 255; public uint QuestPackageID; public int QuestMinLevel; public int QuestSortID; // zone or sort to display in quest log @@ -923,7 +930,7 @@ namespace Game.Network.Packets public float POIx; public float POIy; public uint POIPriority; - public int AllowableRaces = -1; + public long AllowableRaces = -1; public string LogTitle; public string LogDescription; public string QuestDescription; @@ -1129,11 +1136,12 @@ namespace Game.Network.Packets public struct GossipText { - public GossipText(uint questID, uint questType, uint questLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle) + public GossipText(uint questID, uint questType, uint questLevel, uint questMaxScalingLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle) { QuestID = questID; QuestType = questType; QuestLevel = questLevel; + QuestMaxScalingLevel = questMaxScalingLevel; QuestFlags = questFlags; QuestFlagsEx = questFlagsEx; Repeatable = repeatable; @@ -1143,6 +1151,7 @@ namespace Game.Network.Packets public uint QuestID; public uint QuestType; public uint QuestLevel; + public uint QuestMaxScalingLevel; public uint QuestFlags; public uint QuestFlagsEx; public bool Repeatable; diff --git a/Source/Game/Network/Packets/SpellPackets.cs b/Source/Game/Network/Packets/SpellPackets.cs index 38ddd9516..a5f15d8d4 100644 --- a/Source/Game/Network/Packets/SpellPackets.cs +++ b/Source/Game/Network/Packets/SpellPackets.cs @@ -864,7 +864,12 @@ namespace Game.Network.Packets { public SelfRes(WorldPacket packet) : base(packet) { } - public override void Read() { } + public override void Read() + { + SpellId = _worldPacket.ReadUInt32(); + } + + public uint SpellId; } class GetMirrorImageData : ClientPacket @@ -1236,7 +1241,7 @@ namespace Game.Network.Packets public void Write(WorldPacket data) { - data.WriteBits(Type, 3); + data.WriteBits(Type, 4); data.WriteInt16(PlayerLevelDelta); data.WriteUInt16(PlayerItemLevel); data.WriteUInt8(TargetLevel); diff --git a/Source/Game/Network/Packets/TicketPackets.cs b/Source/Game/Network/Packets/TicketPackets.cs index b0aae1060..5ea34e3c8 100644 --- a/Source/Game/Network/Packets/TicketPackets.cs +++ b/Source/Game/Network/Packets/TicketPackets.cs @@ -315,6 +315,8 @@ namespace Game.Network.Packets LastTitleAuthorGuid = data.ReadPackedGuid(); LastDescriptionAuthorGuid = data.ReadPackedGuid(); LastVoiceChatAuthorGuid = data.ReadPackedGuid(); + ListingCreatorGuid = data.ReadPackedGuid(); + Unknown735 = data.ReadPackedGuid(); byte titleLength = data.ReadBits(8); byte descriptionLength = data.ReadBits(11); @@ -330,6 +332,8 @@ namespace Game.Network.Packets ObjectGuid LastTitleAuthorGuid; ObjectGuid LastDescriptionAuthorGuid; ObjectGuid LastVoiceChatAuthorGuid; + ObjectGuid ListingCreatorGuid; + ObjectGuid Unknown735; string Title; string Description; string VoiceChat; diff --git a/Source/Game/Network/Packets/WhoPackets.cs b/Source/Game/Network/Packets/WhoPackets.cs index bb58e31be..8c16fba2b 100644 --- a/Source/Game/Network/Packets/WhoPackets.cs +++ b/Source/Game/Network/Packets/WhoPackets.cs @@ -101,7 +101,7 @@ namespace Game.Network.Packets { MinLevel = data.ReadInt32(); MaxLevel = data.ReadInt32(); - RaceFilter = data.ReadInt32(); + RaceFilter = data.ReadInt64(); ClassFilter = data.ReadInt32(); uint nameLength = data.ReadBits(6); @@ -137,7 +137,7 @@ namespace Game.Network.Packets public string VirtualRealmName; public string Guild; public string GuildVirtualRealmName; - public int RaceFilter = -1; + public long RaceFilter = 0; public int ClassFilter = -1; public List Words = new List(); public bool ShowEnemies; diff --git a/Source/Game/Network/WorldSocket.cs b/Source/Game/Network/WorldSocket.cs index c25da6f1c..133b185e0 100644 --- a/Source/Game/Network/WorldSocket.cs +++ b/Source/Game/Network/WorldSocket.cs @@ -36,9 +36,9 @@ namespace Game.Network static byte[] SessionKeySeed = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B }; static byte[] ContinuedSessionSeed = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F }; - static uint[] ClientTypeSeed_Win = { 0xC34F59FE, 0xFF9A7F5E, 0x8A9DD986, 0x97B24A36 }; - static uint[] ClientTypeSeed_Wn64 = { 0x4E625212, 0xFAD6CBD8, 0x5D3FD3C7, 0xF335A567 }; - static uint[] ClientTypeSeed_Mc64 = { 0x95EFC66, 0x266170B8, 0x3145F79, 0xD8C1C808 }; + static byte[] ClientTypeSeed_Win = { 0x23, 0xC5, 0x9C, 0x59, 0x63, 0xCB, 0xEF, 0x5B, 0x72, 0x8D, 0x13, 0xA5, 0x08, 0x78, 0xDF, 0xCB }; + static byte[] ClientTypeSeed_Wn64 = { 0xC7, 0xFF, 0x93, 0x2D, 0x6A, 0x21, 0x74, 0xA3, 0xD5, 0x38, 0xCA, 0x72, 0x12, 0x13, 0x6D, 0x2B }; + static byte[] ClientTypeSeed_Mc64 = { 0x21, 0x0B, 0x97, 0x01, 0x49, 0xD6, 0xF5, 0x6C, 0xAC, 0x9B, 0xAD, 0xF2, 0xAA, 0xC9, 0x1E, 0x8E }; public WorldSocket(Socket socket) : base(socket) { @@ -383,18 +383,15 @@ namespace Game.Network // For hook purposes, we get Remoteaddress at this point. string address = GetRemoteIpAddress().ToString(); - uint[] clientSeed = ClientTypeSeed_Win; + byte[] clientSeed = ClientTypeSeed_Win; if (account.game.OS == "Wn64") clientSeed = ClientTypeSeed_Wn64; else if (account.game.OS == "Mc64") clientSeed = ClientTypeSeed_Mc64; - byte[] byteArray = new byte[clientSeed.Length * 4]; - Buffer.BlockCopy(clientSeed, 0, byteArray, 0, clientSeed.Length * 4); - Sha256 digestKeyHash = new Sha256(); digestKeyHash.Process(account.game.SessionKey, account.game.SessionKey.Length); - digestKeyHash.Finish(byteArray, byteArray.Length); + digestKeyHash.Finish(clientSeed, clientSeed.Length); HmacSha256 hmac = new HmacSha256(digestKeyHash.Digest); hmac.Process(authSession.LocalChallenge, authSession.LocalChallenge.Count); @@ -744,10 +741,6 @@ namespace Game.Network game.IsBanned = fields.Read(13) != 0; game.IsRectuiter = fields.Read(14) != 0; - uint world_expansion = WorldConfig.GetUIntValue(WorldCfg.Expansion); - if (game.Expansion > world_expansion) - game.Expansion = (byte)world_expansion; - if (battleNet.Locale >= LocaleConstant.Total) battleNet.Locale = LocaleConstant.enUS; } diff --git a/Source/Game/Network/WorldSocketManager.cs b/Source/Game/Network/WorldSocketManager.cs index d3b648324..c6e686944 100644 --- a/Source/Game/Network/WorldSocketManager.cs +++ b/Source/Game/Network/WorldSocketManager.cs @@ -33,14 +33,6 @@ namespace Game.Network // -1 means use default _socketSendBufferSize = ConfigMgr.GetDefaultValue("Network.OutKBuff", -1); - m_SockOutUBuff = ConfigMgr.GetDefaultValue("Network.OutUBuff", 65536); - - if (m_SockOutUBuff <= 0) - { - Log.outError(LogFilter.Network, "Network.OutUBuff is wrong in your config file"); - return false; - } - if (!base.StartNetwork(bindIp, port, threadCount)) return false; @@ -82,7 +74,6 @@ namespace Game.Network AsyncAcceptor _instanceAcceptor; int _socketSendBufferSize; - int m_SockOutUBuff; bool _tcpNoDelay; } } diff --git a/Source/Game/Quest/Quest.cs b/Source/Game/Quest/Quest.cs index 3dc423d80..dcc7edd6a 100644 --- a/Source/Game/Quest/Quest.cs +++ b/Source/Game/Quest/Quest.cs @@ -33,38 +33,39 @@ namespace Game Id = fields.Read(0); Type = (QuestType)fields.Read(1); Level = fields.Read(2); - PackageID = fields.Read(3); - MinLevel = fields.Read(4); - QuestSortID = fields.Read(5); - QuestInfoID = fields.Read(6); - SuggestedPlayers = fields.Read(7); - NextQuestInChain = fields.Read(8); - RewardXPDifficulty = fields.Read(9); - RewardXPMultiplier = fields.Read(10); - RewardMoney = fields.Read(11); - RewardMoneyDifficulty = fields.Read(12); - RewardMoneyMultiplier = fields.Read(13); - RewardBonusMoney = fields.Read(14); + MaxScalingLevel = fields.Read(3); + PackageID = fields.Read(4); + MinLevel = fields.Read(5); + QuestSortID = fields.Read(6); + QuestInfoID = fields.Read(7); + SuggestedPlayers = fields.Read(8); + NextQuestInChain = fields.Read(9); + RewardXPDifficulty = fields.Read(10); + RewardXPMultiplier = fields.Read(11); + RewardMoney = fields.Read(12); + RewardMoneyDifficulty = fields.Read(13); + RewardMoneyMultiplier = fields.Read(14); + RewardBonusMoney = fields.Read(15); for (int i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i) - RewardDisplaySpell[i] = fields.Read(15 + i); + RewardDisplaySpell[i] = fields.Read(16 + i); - RewardSpell = fields.Read(18); - RewardHonor = fields.Read(19); - RewardKillHonor = fields.Read(20); - SourceItemId = fields.Read(21); - RewardArtifactXPDifficulty = fields.Read(22); - RewardArtifactXPMultiplier = fields.Read(23); - RewardArtifactCategoryID = fields.Read(24); - Flags = (QuestFlags)fields.Read(25); - FlagsEx = (QuestFlagsEx)fields.Read(26); + RewardSpell = fields.Read(19); + RewardHonor = fields.Read(20); + RewardKillHonor = fields.Read(21); + SourceItemId = fields.Read(22); + RewardArtifactXPDifficulty = fields.Read(23); + RewardArtifactXPMultiplier = fields.Read(24); + RewardArtifactCategoryID = fields.Read(25); + Flags = (QuestFlags)fields.Read(26); + FlagsEx = (QuestFlagsEx)fields.Read(27); for (int i = 0; i < SharedConst.QuestItemDropCount; ++i) { - RewardItemId[i] = fields.Read(27 + i * 4); - RewardItemCount[i] = fields.Read(28 + i * 4); - ItemDrop[i] = fields.Read(29 + i * 4); - ItemDropQuantity[i] = fields.Read(30 + i * 4); + RewardItemId[i] = fields.Read(28 + i * 4); + RewardItemCount[i] = fields.Read(29 + i * 4); + ItemDrop[i] = fields.Read(30 + i * 4); + ItemDropQuantity[i] = fields.Read(31 + i * 4); if (RewardItemId[i] != 0) ++_rewItemsCount; @@ -72,63 +73,63 @@ namespace Game for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) { - RewardChoiceItemId[i] = fields.Read(43 + i * 3); - RewardChoiceItemCount[i] = fields.Read(44 + i * 3); - RewardChoiceItemDisplayId[i] = fields.Read(45 + i * 3); + RewardChoiceItemId[i] = fields.Read(44 + i * 3); + RewardChoiceItemCount[i] = fields.Read(45 + i * 3); + RewardChoiceItemDisplayId[i] = fields.Read(46 + i * 3); if (RewardChoiceItemId[i] != 0) ++_rewChoiceItemsCount; } - POIContinent = fields.Read(61); - POIx = fields.Read(62); - POIy = fields.Read(63); - POIPriority = fields.Read(64); + POIContinent = fields.Read(62); + POIx = fields.Read(63); + POIy = fields.Read(64); + POIPriority = fields.Read(65); - RewardTitleId = fields.Read(65); - RewardArenaPoints = fields.Read(66); - RewardSkillId = fields.Read(67); - RewardSkillPoints = fields.Read(68); + RewardTitleId = fields.Read(66); + RewardArenaPoints = fields.Read(67); + RewardSkillId = fields.Read(68); + RewardSkillPoints = fields.Read(69); - QuestGiverPortrait = fields.Read(69); - QuestTurnInPortrait = fields.Read(70); + QuestGiverPortrait = fields.Read(70); + QuestTurnInPortrait = fields.Read(71); for (int i = 0; i < SharedConst.QuestRewardReputationsCount; ++i) { - RewardFactionId[i] = fields.Read(71 + i * 4); - RewardFactionValue[i] = fields.Read(72 + i * 4); - RewardFactionOverride[i] = fields.Read(73 + i * 4); - RewardFactionCapIn[i] = fields.Read(74 + i * 4); + RewardFactionId[i] = fields.Read(72 + i * 4); + RewardFactionValue[i] = fields.Read(73 + i * 4); + RewardFactionOverride[i] = fields.Read(74 + i * 4); + RewardFactionCapIn[i] = fields.Read(75 + i * 4); } - RewardReputationMask = fields.Read(91); + RewardReputationMask = fields.Read(92); for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i) { - RewardCurrencyId[i] = fields.Read(92 + i * 2); - RewardCurrencyCount[i] = fields.Read(93 + i * 2); + RewardCurrencyId[i] = fields.Read(93 + i * 2); + RewardCurrencyCount[i] = fields.Read(94 + i * 2); if (RewardCurrencyId[i] != 0) ++_rewCurrencyCount; } - SoundAccept = fields.Read(100); - SoundTurnIn = fields.Read(101); - AreaGroupID = fields.Read(102); - LimitTime = fields.Read(103); - AllowableRaces = fields.Read(104); - QuestRewardID = fields.Read(105); - Expansion = fields.Read(106); + SoundAccept = fields.Read(101); + SoundTurnIn = fields.Read(102); + AreaGroupID = fields.Read(103); + LimitTime = fields.Read(104); + AllowableRaces = fields.Read(105); + QuestRewardID = fields.Read(106); + Expansion = fields.Read(107); - LogTitle = fields.Read(107); - LogDescription = fields.Read(108); - QuestDescription = fields.Read(109); - AreaDescription = fields.Read(110); - PortraitGiverText = fields.Read(111); - PortraitGiverName = fields.Read(112); - PortraitTurnInText = fields.Read(113); - PortraitTurnInName = fields.Read(114); - QuestCompletionLog = fields.Read(115); + LogTitle = fields.Read(108); + LogDescription = fields.Read(109); + QuestDescription = fields.Read(110); + AreaDescription = fields.Read(111); + PortraitGiverText = fields.Read(112); + PortraitGiverName = fields.Read(113); + PortraitTurnInText = fields.Read(114); + PortraitTurnInName = fields.Read(115); + QuestCompletionLog = fields.Read(116); } public void LoadQuestDetails(SQLFields fields) @@ -427,6 +428,7 @@ namespace Game public uint Id; public QuestType Type; public int Level; + public int MaxScalingLevel; public uint PackageID; public int MinLevel; public int QuestSortID; @@ -477,7 +479,7 @@ namespace Game public uint SoundTurnIn { get; set; } public uint AreaGroupID; public uint LimitTime; - public int AllowableRaces { get; set; } + public long AllowableRaces { get; set; } public uint QuestRewardID; public int Expansion; public List Objectives = new List(); diff --git a/Source/Game/Server/WorldSession.cs b/Source/Game/Server/WorldSession.cs index fdaa5b7e5..4033b8c81 100644 --- a/Source/Game/Server/WorldSession.cs +++ b/Source/Game/Server/WorldSession.cs @@ -46,7 +46,8 @@ namespace Game _accountId = id; _accountName = name; _battlenetAccountId = battlenetAccountId; - m_expansion = expansion; + m_accountExpansion = expansion; + m_expansion = (Expansion)Math.Min((byte)expansion, WorldConfig.GetIntValue(WorldCfg.Expansion)); _os = os; m_sessionDbcLocale = Global.WorldMgr.GetAvailableDbcLocale(locale); m_sessionDbLocaleIndex = locale; @@ -602,6 +603,7 @@ namespace Game public string GetRemoteAddress() { return m_Address; } + public Expansion GetAccountExpansion() { return m_accountExpansion; } public Expansion GetExpansion() { return m_expansion; } public string GetOS() { return _os; } public void SetInQueue(bool state) { m_inQueue = state; } @@ -820,6 +822,7 @@ namespace Game uint _accountId; string _accountName; uint _battlenetAccountId; + Expansion m_accountExpansion; Expansion m_expansion; string _os; diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index ed18337b0..ded2825db 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -1484,7 +1484,7 @@ namespace Game.Spells while (chainTargets != 0) { // try to get unit for next chain jump - var found = tempTargets.LastOrDefault(); + WorldObject found = null; // get unit with highest hp deficit in dist if (isChainHeal) { diff --git a/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs b/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs index cc636fa7b..204e33eea 100644 --- a/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs +++ b/Source/Scripts/Northrend/IcecrownCitadel/IcecrownCitadel.cs @@ -1566,7 +1566,11 @@ namespace Scripts.Northrend.IcecrownCitadel return true; }); - targets = targets.SelectRandom(2).ToList(); + + var newTargets = targets.SelectRandom(2); + targets.Clear(); + + targets.AddRange(newTargets); } void Land(uint effIndex) diff --git a/Source/WorldServer/WorldServer.conf.dist b/Source/WorldServer/WorldServer.conf.dist index 03f3508ed..4c4be00a9 100644 --- a/Source/WorldServer/WorldServer.conf.dist +++ b/Source/WorldServer/WorldServer.conf.dist @@ -212,15 +212,7 @@ Logger.Network = 1,Console Server #Logger.Warden=3,Console Server # -# Log.Async.Enable -# Description: Enables asyncronous message logging. -# Default: 0 - (Disabled) -# 1 - (Enabled) - -Log.Async.Enable = 0 - -# -# Allow.IP.Based.Action.Logging +# Allow.IP.Based.Action.Logging (NYI) # Description: Logs actions, e.g. account login and logout to name a few, based on IP of # current session. # Default: 0 - (Disabled) @@ -2624,28 +2616,20 @@ ArenaLog.ExtendedInfo = 0 ################################################################################################### # NETWORK CONFIG # -# Network.Threads (NYI) +# Network.Threads # Description: Number of threads for network. # Default: 1 - (Recommended 1 thread per 1000 connections) Network.Threads = 1 # -# Network.OutKBuff (NYI) -# Description: Amount of memory (in bytes) used for the output kernel buffer (see SO_SNDBUF -# socket option, TCP manual). +# Network.OutKBuff +# Description: Specifies the total per-socket buffer space reserved for sends. This is unrelated +# to the maximum message size or the size of a TCP window. # Default: -1 - (Use system default setting) Network.OutKBuff = -1 -# -# Network.OutUBuff (NYI) -# Description: Amount of memory (in bytes) reserved in the user space per connection for -# output buffering. -# Default: 65536 - -Network.OutUBuff = 65536 - # # Network.TcpNoDelay: # Description: TCP Nagle algorithm setting. @@ -2658,7 +2642,7 @@ Network.TcpNodelay = 1 ################################################################################################### ################################################################################################### -# CONSOLE AND REMOTE ACCESS +# CONSOLE # # Console.Enable (NYI) # Description: Enable console. @@ -2667,57 +2651,6 @@ Network.TcpNodelay = 1 Console.Enable = 1 -# -# Ra.Enable (NYI) -# Description: Enable remote console (telnet). -# Default: 0 - (Disabled) -# 1 - (Enabled) - -Ra.Enable = 0 - -# -# Ra.IP (NYI) -# Description: Bind remote access to IP/hostname. -# Default: "0.0.0.0" - (Bind to all IPs on the system) - -Ra.IP = "0.0.0.0" - -# -# Ra.Port (NYI) -# Description: TCP port to reach the remote console. -# Default: 3443 - -Ra.Port = 3443 - -# -# Ra.MinLevel (NYI) -# Description: Required security level to use the remote console. -# Default: 3 - -Ra.MinLevel = 3 - -# -# SOAP.Enable (NYI) -# Description: Enable soap service. -# Default: 0 - (Disabled) -# 1 - (Enabled) - -SOAP.Enabled = 0 - -# -# SOAP.IP (NYI) -# Description: Bind SOAP service to IP/hostname. -# Default: "127.0.0.1" - (Bind to localhost) - -SOAP.IP = "127.0.0.1" - -# -# SOAP.Port (NYI) -# Description: TCP port to reach the SOAP service. -# Default: 7878 - -SOAP.Port = 7878 - # ###################################################################################################